feat(autoconfigure): Support both FunctionCallback and ToolCallback in ToolCallingAutoConfiguration

- Extends the ToolCallingAutoConfiguration to support both FunctionCallback and ToolCallback types.
- The toolCallbackResolver bean now handles both callback types through ObjectProvider injection.
- Added comprehensive tests to verify the resolution of multiple function and tool callbacks.
- Introduce new StaticToolCallbackProvider implementation
- Update ToolCallbackProvider to return FunctionCallback[]
- Migrate from List to ToolCallbackProvider in configurations
- Update tests to use new provider pattern
- Enhance tool callback providers to support multiple clients
  - Refactor AsyncMcpToolCallbackProvider and SyncMcpToolCallbackProvider to handle multiple MCP clients
  - Add ToolCallbackProvider support to ChatClient API
  - Deprecate direct tool callback list methods in favor of providers
  - Fix typos in Closeable class names
  - Update MCP documentation with new examples and usage patterns

Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
This commit is contained in:
Christian Tzolov
2025-02-13 13:11:09 +01:00
parent 68ad742f4a
commit 1fdda61db8
16 changed files with 486 additions and 108 deletions

View File

@@ -38,7 +38,7 @@ import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisor;
import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisorChain;
import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.ai.model.tool.ToolCallingManager;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.ToolCallbacks;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.execution.DefaultToolExecutionExceptionProcessor;
@@ -183,9 +183,8 @@ public class VertexAiGeminiPaymentTransactionMethodIT {
public static class TestConfiguration {
@Bean
public List<ToolCallback> paymentServiceTools() {
var tools = List.of(ToolCallbacks.from(new PaymentService()));
return tools;
public ToolCallbackProvider paymentServiceTools() {
return ToolCallbackProvider.from(List.of(ToolCallbacks.from(new PaymentService())));
}
@Bean
@@ -221,11 +220,11 @@ public class VertexAiGeminiPaymentTransactionMethodIT {
@Bean
ToolCallingManager toolCallingManager(GenericApplicationContext applicationContext,
List<ToolCallback> toolCallbacks, List<FunctionCallback> functionCallbacks,
List<ToolCallbackProvider> tcps, List<FunctionCallback> functionCallbacks,
ObjectProvider<ObservationRegistry> observationRegistry) {
List<FunctionCallback> allFunctionCallbacks = new ArrayList(functionCallbacks);
allFunctionCallbacks.addAll(toolCallbacks.stream().map(tc -> (FunctionCallback) tc).toList());
tcps.stream().map(pr -> List.of(pr.getToolCallbacks())).forEach(allFunctionCallbacks::addAll);
var staticToolCallbackResolver = new StaticToolCallbackResolver(allFunctionCallbacks);