从 FunctionCallback 迁移到 ToolCallback API
本指南帮助您将 Spring AI 中已弃用的 FunctionCallback
API 迁移到新的 ToolCallback
API。有关新 API 的更多信息,请查阅 工具调用 文档。
变更概览
这些变更是 Spring AI 中改进和扩展工具调用能力的广泛工作的一部分。在新 API 中,我们将术语从“functions”改为“tools”,以便更好地与行业惯例保持一致。这涉及多项 API 变更,同时通过弃用方法保持了向后兼容性。
主要变更
-
FunctionCallback
→ToolCallback
-
FunctionCallback.builder().function()
→FunctionToolCallback.builder()
-
FunctionCallback.builder().method()
→MethodToolCallback.builder()
-
FunctionCallingOptions
→ToolCallingChatOptions
-
ChatClient.builder().defaultFunctions()
→ChatClient.builder().defaultTools()
-
ChatClient.functions()
→ChatClient.tools()
-
FunctionCallingOptions.builder().functions()
→ToolCallingChatOptions.builder().toolNames()
-
FunctionCallingOptions.builder().functionCallbacks()
→ToolCallingChatOptions.builder().toolCallbacks()
迁移示例
1. 基本 Function Callback
之前
FunctionCallback.builder()
.function("getCurrentWeather", new MockWeatherService())
.description("Get the weather in location")
.inputType(MockWeatherService.Request.class)
.build()
之后
FunctionToolCallback.builder("getCurrentWeather", new MockWeatherService())
.description("Get the weather in location")
.inputType(MockWeatherService.Request.class)
.build()
2. ChatClient 用法
之前
String response = ChatClient.create(chatModel)
.prompt()
.user("What's the weather like in San Francisco?")
.functions(FunctionCallback.builder()
.function("getCurrentWeather", new MockWeatherService())
.description("Get the weather in location")
.inputType(MockWeatherService.Request.class)
.build())
.call()
.content();
之后
String response = ChatClient.create(chatModel)
.prompt()
.user("What's the weather like in San Francisco?")
.tools(FunctionToolCallback.builder("getCurrentWeather", new MockWeatherService())
.description("Get the weather in location")
.inputType(MockWeatherService.Request.class)
.build())
.call()
.content();
3. 基于方法(Method-Based)的 Function Callbacks
之前
FunctionCallback.builder()
.method("getWeatherInLocation", String.class, Unit.class)
.description("Get the weather in location")
.targetClass(TestFunctionClass.class)
.build()
之后
var toolMethod = ReflectionUtils.findMethod(TestFunctionClass.class, "getWeatherInLocation");
MethodToolCallback.builder()
.toolDefinition(ToolDefinition.builder(toolMethod)
.description("Get the weather in location")
.build())
.toolMethod(toolMethod)
.build()
或使用声明式方法
class WeatherTools {
@Tool(description = "Get the weather in location")
public void getWeatherInLocation(String location, Unit unit) {
// ...
}
}
您可以使用相同的 ChatClient#tools()
API 来注册基于方法的 Tool Callbacks
String response = ChatClient.create(chatModel)
.prompt()
.user("What's the weather like in San Francisco?")
.tools(MethodToolCallback.builder()
.toolDefinition(ToolDefinition.builder(toolMethod)
.description("Get the weather in location")
.build())
.toolMethod(toolMethod)
.build())
.call()
.content();
或使用声明式方法
String response = ChatClient.create(chatModel)
.prompt()
.user("What's the weather like in San Francisco?")
.tools(new WeatherTools())
.call()
.content();
4. 选项配置
之前
FunctionCallingOptions.builder()
.model(modelName)
.function("weatherFunction")
.build()
之后
ToolCallingChatOptions.builder()
.model(modelName)
.toolNames("weatherFunction")
.build()
5. ChatClient Builder 中的默认 Functions
之前
ChatClient.builder(chatModel)
.defaultFunctions(FunctionCallback.builder()
.function("getCurrentWeather", new MockWeatherService())
.description("Get the weather in location")
.inputType(MockWeatherService.Request.class)
.build())
.build()
之后
ChatClient.builder(chatModel)
.defaultTools(FunctionToolCallback.builder("getCurrentWeather", new MockWeatherService())
.description("Get the weather in location")
.inputType(MockWeatherService.Request.class)
.build())
.build()
6. Spring Bean 配置
之前
@Bean
public FunctionCallback weatherFunctionInfo() {
return FunctionCallback.builder()
.function("WeatherInfo", new MockWeatherService())
.description("Get the current weather")
.inputType(MockWeatherService.Request.class)
.build();
}
之后
@Bean
public ToolCallback weatherFunctionInfo() {
return FunctionToolCallback.builder("WeatherInfo", new MockWeatherService())
.description("Get the current weather")
.inputType(MockWeatherService.Request.class)
.build();
}
破坏性变更
-
Function callbacks 中的
method()
配置已被替换为使用ToolDefinition
和MethodToolCallback
的更显式的方法工具配置。 -
使用基于方法的回调时,您现在需要使用
ReflectionUtils
显式查找方法并将其提供给 Builder。或者,您可以使用带有@Tool
注解的声明式方法。 -
对于非静态方法,您现在必须同时提供方法和目标对象。
MethodToolCallback.builder() .toolDefinition(ToolDefinition.builder(toolMethod) .description("Description") .build()) .toolMethod(toolMethod) .toolObject(targetObject) .build()
已弃用方法
以下方法已弃用,并将在未来版本中移除:
-
ChatClient.Builder.defaultFunctions(String…)
-
ChatClient.Builder.defaultFunctions(FunctionCallback…)
-
ChatClient.RequestSpec.functions()
请改用其对应的 tools
方法。
使用 @Tool 进行声明式规范
现在,您可以使用方法级别的注解 (@Tool
) 向 Spring AI 注册工具
class Home {
@Tool(description = "Turn light On or Off in a room.")
void turnLight(String roomName, boolean on) {
// ...
logger.info("Turn light in room: {} to: {}", roomName, on);
}
}
String response = ChatClient.create(this.chatModel).prompt()
.user("Turn the light in the living room On.")
.tools(new Home())
.call()
.content();