From 1c84c9febe26ec6a2692caecd2adfc0f93a5fc73 Mon Sep 17 00:00:00 2001 From: finyu <18664388610@msn.cn> Date: Thu, 17 Apr 2025 15:04:41 +0800 Subject: [PATCH] fix method tool call throws same method name Signed-off-by: finyu Signed-off-by: finyu <18664388610@msn.cn> --- .../method/MethodToolCallbackProvider.java | 1 + .../MethodToolCallbackProviderTest.java | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTest.java diff --git a/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java index 91b8eb5cc6d..20349ad515c 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java @@ -66,6 +66,7 @@ public ToolCallback[] getToolCallbacks() { AopUtils.isAopProxy(toolObject) ? AopUtils.getTargetClass(toolObject) : toolObject.getClass())) .filter(toolMethod -> toolMethod.isAnnotationPresent(Tool.class)) .filter(toolMethod -> !isFunctionalType(toolMethod)) + .filter(ReflectionUtils.USER_DECLARED_METHODS::matches) .map(toolMethod -> MethodToolCallback.builder() .toolDefinition(ToolDefinition.from(toolMethod)) .toolMetadata(ToolMetadata.from(toolMethod)) diff --git a/spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTest.java b/spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTest.java new file mode 100644 index 00000000000..24430354cb6 --- /dev/null +++ b/spring-ai-model/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTest.java @@ -0,0 +1,32 @@ +package org.springframework.ai.tool.method; + +import org.junit.jupiter.api.Test; +import org.springframework.ai.tool.ToolCallback; +import org.springframework.ai.tool.annotation.Tool; + +import static org.junit.jupiter.api.Assertions.*; + +class MethodToolCallbackProviderTest { + + abstract class TestObjectClass { + + public abstract String test(T input); + } + + class TestObjectSuperClass extends TestObjectClass { + + @Tool + public String test(String input) { + return input; + } + } + + @Test + public void buildToolsWithBridgeMethodReturnOnlyUserDeclaredMethods() { + MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(new TestObjectSuperClass()).build(); + ToolCallback[] toolCallbacks = provider.getToolCallbacks(); + assertEquals(1, toolCallbacks.length); + assertInstanceOf(MethodToolCallback.class, toolCallbacks[0]); + } + +}