From 4007334f5798037c8fd249a49d32d8b5e426271e Mon Sep 17 00:00:00 2001 From: dengliming Date: Sat, 19 Sep 2026 11:55:54 +0800 Subject: [PATCH] fix(ai): evict transformer clients by rule id --- .../handler/AiRequestTransformerPluginHandler.java | 3 +-- .../handler/AiRequestTransformerPluginHandlerTest.java | 4 ++++ .../handler/AiResponseTransformerPluginHandler.java | 10 +--------- .../AiResponseTransformerPluginHandlerTest.java | 3 +++ 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandler.java b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandler.java index 3b59020fdef8..fc50a6f3a62c 100644 --- a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandler.java +++ b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandler.java @@ -76,8 +76,7 @@ public void handlerRule(final RuleData ruleData) { @Override public void removeRule(final RuleData ruleData) { Optional.ofNullable(ruleData.getHandle()).ifPresent(s -> CACHED_HANDLE.get().removeHandle(CacheKeyUtils.INST.getKey(ruleData))); - AiRequestTransformerHandle aiRequestTransformerHandle = GsonUtils.getInstance().fromJson(ruleData.getHandle(), AiRequestTransformerHandle.class); - ChatClientCache.getInstance().destroyClient(ruleData.getId() + aiRequestTransformerHandle.getProvider()); + ChatClientCache.getInstance().destroyClient(ruleData.getId()); } @Override diff --git a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandlerTest.java b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandlerTest.java index 7888a7b3dac6..d58c39f0146e 100644 --- a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandlerTest.java +++ b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/request/handler/AiRequestTransformerPluginHandlerTest.java @@ -28,6 +28,7 @@ import org.apache.shenyu.plugin.base.utils.CacheKeyUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.ai.chat.model.ChatModel; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -85,11 +86,14 @@ void testRemoveRule() { AiRequestTransformerHandle handle = new AiRequestTransformerHandle(); handle.setProvider("TEST_PROVIDER"); ruleData.setHandle(GsonUtils.getInstance().toJson(handle)); + chatClientCache.init(ruleData.getId(), mock(ChatModel.class)); + assertNotNull(chatClientCache.getClient(ruleData.getId())); pluginHandler.removeRule(ruleData); CommonHandleCache cache = AiRequestTransformerPluginHandler.CACHED_HANDLE.get(); assertNull(cache.obtainHandle(CacheKeyUtils.INST.getKey(ruleData))); + assertNull(chatClientCache.getClient(ruleData.getId())); } @Test diff --git a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandler.java b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandler.java index 483c9042166c..a0acc3bef5e8 100644 --- a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandler.java +++ b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandler.java @@ -91,15 +91,7 @@ public void handlerRule(final RuleData ruleData) { @Override public void removeRule(final RuleData ruleData) { Optional.ofNullable(ruleData.getHandle()).ifPresent(s -> CACHED_HANDLE.get().removeHandle(CacheKeyUtils.INST.getKey(ruleData))); - try { - AiResponseTransformerHandle aiResponseTransformerHandle = GsonUtils.getInstance().fromJson(ruleData.getHandle(), AiResponseTransformerHandle.class); - if (Objects.nonNull(aiResponseTransformerHandle) && Objects.nonNull(aiResponseTransformerHandle.getProvider())) { - ChatClientCache.getInstance().destroyClient(ruleData.getId() + aiResponseTransformerHandle.getProvider()); - } - } catch (Exception e) { - LOG.error("AiResponseTransformerPluginHandler remove rule error", e); - return; - } + ChatClientCache.getInstance().destroyClient(ruleData.getId()); } @Override diff --git a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandlerTest.java b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandlerTest.java index 02f009ef5540..c0114191b7d5 100644 --- a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandlerTest.java +++ b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/test/java/org/apache/shenyu/plugin/ai/transformer/response/handler/AiResponseTransformerPluginHandlerTest.java @@ -176,12 +176,15 @@ void testRemoveRule() { // First add the rule handler.handlerRule(ruleData); + ChatClientCache.getInstance().init(ruleData.getId(), chatModel); + assertNotNull(ChatClientCache.getInstance().getClient(ruleData.getId())); // Then remove the rule handler.removeRule(ruleData); // Verify rule is properly removed assertNull(AiResponseTransformerPluginHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(ruleData))); + assertNull(ChatClientCache.getInstance().getClient(ruleData.getId())); } @Test