diff --git a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java index fc4da3e8bd6..ec1cbff0b11 100644 --- a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java +++ b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java @@ -60,7 +60,7 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; import org.springframework.http.ResponseEntity; @@ -154,13 +154,13 @@ public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaul * @param anthropicApi the lower-level API for the Anthropic service. * @param defaultOptions the default options used for the chat completion requests. * @param retryTemplate the retry template used to retry the Anthropic API calls. - * @param functionCallbackContext the function callback context used to store the - * state of the function calls. + * @param functionCallbackResolver the function callback resolver used to resolve the + * function by bean name */ public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaultOptions, - RetryTemplate retryTemplate, FunctionCallbackContext functionCallbackContext) { + RetryTemplate retryTemplate, FunctionCallbackResolver functionCallbackResolver) { - this(anthropicApi, defaultOptions, retryTemplate, functionCallbackContext, List.of()); + this(anthropicApi, defaultOptions, retryTemplate, functionCallbackResolver, List.of()); } /** @@ -168,15 +168,15 @@ public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaul * @param anthropicApi the lower-level API for the Anthropic service. * @param defaultOptions the default options used for the chat completion requests. * @param retryTemplate the retry template used to retry the Anthropic API calls. - * @param functionCallbackContext the function callback context used to store the - * state of the function calls. + * @param functionCallbackResolver the function callback resolver used to resolve the + * function by bean name. * @param toolFunctionCallbacks the tool function callbacks used to handle the tool * calls. */ public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaultOptions, - RetryTemplate retryTemplate, FunctionCallbackContext functionCallbackContext, + RetryTemplate retryTemplate, FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks) { - this(anthropicApi, defaultOptions, retryTemplate, functionCallbackContext, toolFunctionCallbacks, + this(anthropicApi, defaultOptions, retryTemplate, functionCallbackResolver, toolFunctionCallbacks, ObservationRegistry.NOOP); } @@ -185,16 +185,16 @@ public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaul * @param anthropicApi the lower-level API for the Anthropic service. * @param defaultOptions the default options used for the chat completion requests. * @param retryTemplate the retry template used to retry the Anthropic API calls. - * @param functionCallbackContext the function callback context used to store the - * state of the function calls. + * @param functionCallbackResolver the function callback resolver used to resolve the + * function by bean name. * @param toolFunctionCallbacks the tool function callbacks used to handle the tool * calls. */ public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaultOptions, - RetryTemplate retryTemplate, FunctionCallbackContext functionCallbackContext, + RetryTemplate retryTemplate, FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, ObservationRegistry observationRegistry) { - super(functionCallbackContext, defaultOptions, toolFunctionCallbacks); + super(functionCallbackResolver, defaultOptions, toolFunctionCallbacks); Assert.notNull(anthropicApi, "AnthropicApi must not be null"); Assert.notNull(defaultOptions, "DefaultOptions must not be null"); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java index 968e0c6a113..4eec3d349f4 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java @@ -33,7 +33,7 @@ import org.springframework.ai.chat.observation.ChatModelObservationDocumentation.LowCardinalityKeyNames; import org.springframework.ai.chat.observation.DefaultChatModelObservationConvention; import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.observation.conventions.AiOperationType; import org.springframework.ai.observation.conventions.AiProvider; import org.springframework.beans.factory.annotation.Autowired; @@ -170,7 +170,8 @@ public AnthropicApi anthropicApi() { public AnthropicChatModel anthropicChatModel(AnthropicApi anthropicApi, TestObservationRegistry observationRegistry) { return new AnthropicChatModel(anthropicApi, AnthropicChatOptions.builder().build(), - RetryTemplate.defaultInstance(), new FunctionCallbackContext(), List.of(), observationRegistry); + RetryTemplate.defaultInstance(), new DefaultFunctionCallbackResolver(), List.of(), + observationRegistry); } } diff --git a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java index e670d538293..48f01696a68 100644 --- a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java +++ b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java @@ -83,7 +83,7 @@ import org.springframework.ai.model.Media; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.observation.conventions.AiProvider; import org.springframework.util.Assert; @@ -154,19 +154,19 @@ public AzureOpenAiChatModel(OpenAIClientBuilder openAIClientBuilder, AzureOpenAi } public AzureOpenAiChatModel(OpenAIClientBuilder openAIClientBuilder, AzureOpenAiChatOptions options, - FunctionCallbackContext functionCallbackContext) { - this(openAIClientBuilder, options, functionCallbackContext, List.of()); + FunctionCallbackResolver functionCallbackResolver) { + this(openAIClientBuilder, options, functionCallbackResolver, List.of()); } public AzureOpenAiChatModel(OpenAIClientBuilder openAIClientBuilder, AzureOpenAiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks) { - this(openAIClientBuilder, options, functionCallbackContext, toolFunctionCallbacks, ObservationRegistry.NOOP); + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks) { + this(openAIClientBuilder, options, functionCallbackResolver, toolFunctionCallbacks, ObservationRegistry.NOOP); } public AzureOpenAiChatModel(OpenAIClientBuilder openAIClientBuilder, AzureOpenAiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, ObservationRegistry observationRegistry) { - super(functionCallbackContext, options, toolFunctionCallbacks); + super(functionCallbackResolver, options, toolFunctionCallbacks); Assert.notNull(openAIClientBuilder, "com.azure.ai.openai.OpenAIClient must not be null"); Assert.notNull(options, "AzureOpenAiChatOptions must not be null"); this.openAIClient = openAIClientBuilder.buildClient(); diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelTests.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelTests.java index 7305d230b3b..6b2ddbd9e73 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelTests.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelTests.java @@ -25,7 +25,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; /** * @author Jihoon Kim @@ -37,7 +37,7 @@ public class AzureOpenAiChatModelTests { OpenAIClientBuilder mockClient; @Mock - FunctionCallbackContext functionCallbackContext; + FunctionCallbackResolver functionCallbackResolver; @Test public void createAzureOpenAiChatModelTest() { @@ -51,7 +51,7 @@ public void createAzureOpenAiChatModelTest() { List functionCallbacks = List.of(new TestFunctionCallback(callbackFromConstructorParam)); AzureOpenAiChatModel openAiChatModel = new AzureOpenAiChatModel(this.mockClient, chatOptions, - this.functionCallbackContext, functionCallbacks); + this.functionCallbackResolver, functionCallbacks); assert 2 == openAiChatModel.getFunctionCallbackRegister().size(); diff --git a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java index d2f200c5035..68fb7879a10 100644 --- a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java +++ b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java @@ -88,7 +88,7 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.model.function.FunctionCallingOptionsBuilder; import org.springframework.ai.model.function.FunctionCallingOptionsBuilder.PortableFunctionCallingOptions; @@ -146,10 +146,10 @@ public class BedrockProxyChatModel extends AbstractToolCallSupport implements Ch public BedrockProxyChatModel(BedrockRuntimeClient bedrockRuntimeClient, BedrockRuntimeAsyncClient bedrockRuntimeAsyncClient, FunctionCallingOptions defaultOptions, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, ObservationRegistry observationRegistry) { - super(functionCallbackContext, defaultOptions, toolFunctionCallbacks); + super(functionCallbackResolver, defaultOptions, toolFunctionCallbacks); Assert.notNull(bedrockRuntimeClient, "bedrockRuntimeClient must not be null"); Assert.notNull(bedrockRuntimeAsyncClient, "bedrockRuntimeAsyncClient must not be null"); @@ -609,7 +609,7 @@ public static final class Builder { private FunctionCallingOptions defaultOptions = new FunctionCallingOptionsBuilder().build(); - private FunctionCallbackContext functionCallbackContext; + private FunctionCallbackResolver functionCallbackResolver; private List toolFunctionCallbacks; @@ -648,8 +648,18 @@ public Builder withDefaultOptions(FunctionCallingOptions defaultOptions) { return this; } - public Builder withFunctionCallbackContext(FunctionCallbackContext functionCallbackContext) { - this.functionCallbackContext = functionCallbackContext; + /** + * @deprecated Use {@link #functionCallbackResolver(FunctionCallbackResolver)} + * instead. + */ + @Deprecated + public Builder withFunctionCallbackContext(FunctionCallbackResolver functionCallbackResolver) { + this.functionCallbackResolver = functionCallbackResolver; + return this; + } + + public Builder functionCallbackResolver(FunctionCallbackResolver functionCallbackResolver) { + this.functionCallbackResolver = functionCallbackResolver; return this; } @@ -708,7 +718,7 @@ public BedrockProxyChatModel build() { } var bedrockProxyChatModel = new BedrockProxyChatModel(this.bedrockRuntimeClient, - this.bedrockRuntimeAsyncClient, this.defaultOptions, this.functionCallbackContext, + this.bedrockRuntimeAsyncClient, this.defaultOptions, this.functionCallbackResolver, this.toolFunctionCallbacks, this.observationRegistry); if (this.customObservationConvention != null) { diff --git a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java index f32fe5d3c5a..0dd0700a474 100644 --- a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java +++ b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java @@ -64,7 +64,7 @@ import org.springframework.ai.minimax.metadata.MiniMaxUsage; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; import org.springframework.http.ResponseEntity; @@ -139,12 +139,13 @@ public MiniMaxChatModel(MiniMaxApi miniMaxApi, MiniMaxChatOptions options) { * @param miniMaxApi The MiniMaxApi instance to be used for interacting with the * MiniMax Chat API. * @param options The MiniMaxChatOptions to configure the chat model. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver to resolve the + * function callback from the application context. * @param retryTemplate The retry template. */ public MiniMaxChatModel(MiniMaxApi miniMaxApi, MiniMaxChatOptions options, - FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) { - this(miniMaxApi, options, functionCallbackContext, List.of(), retryTemplate, ObservationRegistry.NOOP); + FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate) { + this(miniMaxApi, options, functionCallbackResolver, List.of(), retryTemplate, ObservationRegistry.NOOP); } /** @@ -152,15 +153,16 @@ public MiniMaxChatModel(MiniMaxApi miniMaxApi, MiniMaxChatOptions options, * @param miniMaxApi The MiniMaxApi instance to be used for interacting with the * MiniMax Chat API. * @param options The MiniMaxChatOptions to configure the chat model. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver to resolve the + * function callback from the application context. * @param toolFunctionCallbacks The tool function callbacks. * @param retryTemplate The retry template. * @param observationRegistry The ObservationRegistry used for instrumentation. */ public MiniMaxChatModel(MiniMaxApi miniMaxApi, MiniMaxChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { - super(functionCallbackContext, options, toolFunctionCallbacks); + super(functionCallbackResolver, options, toolFunctionCallbacks); Assert.notNull(miniMaxApi, "MiniMaxApi must not be null"); Assert.notNull(options, "Options must not be null"); Assert.notNull(retryTemplate, "RetryTemplate must not be null"); diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java index bd18fe5a38c..e5cd810b82c 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java @@ -33,7 +33,7 @@ import org.springframework.ai.minimax.MiniMaxChatModel; import org.springframework.ai.minimax.MiniMaxChatOptions; import org.springframework.ai.minimax.api.MiniMaxApi; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.observation.conventions.AiOperationType; import org.springframework.ai.observation.conventions.AiProvider; import org.springframework.beans.factory.annotation.Autowired; @@ -170,8 +170,9 @@ public MiniMaxApi minimaxApi() { @Bean public MiniMaxChatModel minimaxChatModel(MiniMaxApi minimaxApi, TestObservationRegistry observationRegistry) { - return new MiniMaxChatModel(minimaxApi, MiniMaxChatOptions.builder().build(), new FunctionCallbackContext(), - List.of(), RetryTemplate.defaultInstance(), observationRegistry); + return new MiniMaxChatModel(minimaxApi, MiniMaxChatOptions.builder().build(), + new DefaultFunctionCallbackResolver(), List.of(), RetryTemplate.defaultInstance(), + observationRegistry); } } diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java index 25657ec39b1..bc19777cd16 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java @@ -59,7 +59,7 @@ import org.springframework.ai.mistralai.metadata.MistralAiUsage; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; import org.springframework.http.ResponseEntity; @@ -120,21 +120,21 @@ public MistralAiChatModel(MistralAiApi mistralAiApi, MistralAiChatOptions option } public MistralAiChatModel(MistralAiApi mistralAiApi, MistralAiChatOptions options, - FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) { - this(mistralAiApi, options, functionCallbackContext, List.of(), retryTemplate); + FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate) { + this(mistralAiApi, options, functionCallbackResolver, List.of(), retryTemplate); } public MistralAiChatModel(MistralAiApi mistralAiApi, MistralAiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate) { - this(mistralAiApi, options, functionCallbackContext, toolFunctionCallbacks, retryTemplate, + this(mistralAiApi, options, functionCallbackResolver, toolFunctionCallbacks, retryTemplate, ObservationRegistry.NOOP); } public MistralAiChatModel(MistralAiApi mistralAiApi, MistralAiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { - super(functionCallbackContext, options, toolFunctionCallbacks); + super(functionCallbackResolver, options, toolFunctionCallbacks); Assert.notNull(mistralAiApi, "mistralAiApi must not be null"); Assert.notNull(options, "options must not be null"); Assert.notNull(retryTemplate, "retryTemplate must not be null"); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java index a6a42311d55..3e95903e6a1 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java @@ -32,7 +32,7 @@ import org.springframework.ai.chat.observation.DefaultChatModelObservationConvention; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.mistralai.api.MistralAiApi; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.observation.conventions.AiOperationType; import org.springframework.ai.observation.conventions.AiProvider; import org.springframework.beans.factory.annotation.Autowired; @@ -181,7 +181,8 @@ public MistralAiApi mistralAiApi() { public MistralAiChatModel openAiChatModel(MistralAiApi mistralAiApi, TestObservationRegistry observationRegistry) { return new MistralAiChatModel(mistralAiApi, MistralAiChatOptions.builder().build(), - new FunctionCallbackContext(), List.of(), RetryTemplate.defaultInstance(), observationRegistry); + new DefaultFunctionCallbackResolver(), List.of(), RetryTemplate.defaultInstance(), + observationRegistry); } } diff --git a/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java b/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java index 09c18bdd54b..77cf0a563ad 100644 --- a/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java +++ b/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java @@ -51,7 +51,7 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.moonshot.api.MoonshotApi; import org.springframework.ai.moonshot.api.MoonshotApi.ChatCompletion; @@ -128,12 +128,13 @@ public MoonshotChatModel(MoonshotApi moonshotApi, MoonshotChatOptions options) { * @param moonshotApi The Moonshot instance to be used for interacting with the * Moonshot Chat API. * @param options The MoonshotChatOptions to configure the chat client. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver to resolve the + * function callbacks from the application context. * @param retryTemplate The retry template. */ public MoonshotChatModel(MoonshotApi moonshotApi, MoonshotChatOptions options, - FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) { - this(moonshotApi, options, functionCallbackContext, List.of(), retryTemplate, ObservationRegistry.NOOP); + FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate) { + this(moonshotApi, options, functionCallbackResolver, List.of(), retryTemplate, ObservationRegistry.NOOP); } /** @@ -141,15 +142,16 @@ public MoonshotChatModel(MoonshotApi moonshotApi, MoonshotChatOptions options, * @param moonshotApi The Moonshot instance to be used for interacting with the * Moonshot Chat API. * @param options The MoonshotChatOptions to configure the chat client. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver resolves the function callback from the application + * context. * @param toolFunctionCallbacks The tool function callbacks. * @param retryTemplate The retry template. * @param observationRegistry The ObservationRegistry used for instrumentation. */ public MoonshotChatModel(MoonshotApi moonshotApi, MoonshotChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { - super(functionCallbackContext, options, toolFunctionCallbacks); + super(functionCallbackResolver, options, toolFunctionCallbacks); Assert.notNull(moonshotApi, "MoonshotApi must not be null"); Assert.notNull(options, "Options must not be null"); Assert.notNull(retryTemplate, "RetryTemplate must not be null"); diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java index f13a46f4ad1..f345c1c5fce 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java @@ -30,7 +30,7 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.observation.DefaultChatModelObservationConvention; import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.moonshot.MoonshotChatModel; import org.springframework.ai.moonshot.MoonshotChatOptions; import org.springframework.ai.moonshot.api.MoonshotApi; @@ -173,7 +173,8 @@ public MoonshotApi moonshotApi() { public MoonshotChatModel moonshotChatModel(MoonshotApi moonshotApi, TestObservationRegistry observationRegistry) { return new MoonshotChatModel(moonshotApi, MoonshotChatOptions.builder().build(), - new FunctionCallbackContext(), List.of(), RetryTemplate.defaultInstance(), observationRegistry); + new DefaultFunctionCallbackResolver(), List.of(), RetryTemplate.defaultInstance(), + observationRegistry); } } diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java index eae56f6206c..a8f6e928a03 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java @@ -47,7 +47,7 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaApi.ChatRequest; @@ -92,9 +92,9 @@ public class OllamaChatModel extends AbstractToolCallSupport implements ChatMode private ChatModelObservationConvention observationConvention = DEFAULT_OBSERVATION_CONVENTION; public OllamaChatModel(OllamaApi ollamaApi, OllamaOptions defaultOptions, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, ObservationRegistry observationRegistry, ModelManagementOptions modelManagementOptions) { - super(functionCallbackContext, defaultOptions, toolFunctionCallbacks); + super(functionCallbackResolver, defaultOptions, toolFunctionCallbacks); Assert.notNull(ollamaApi, "ollamaApi must not be null"); Assert.notNull(defaultOptions, "defaultOptions must not be null"); Assert.notNull(observationRegistry, "observationRegistry must not be null"); @@ -399,7 +399,7 @@ public static final class Builder { private OllamaOptions defaultOptions = OllamaOptions.create().withModel(OllamaModel.MISTRAL.id()); - private FunctionCallbackContext functionCallbackContext; + private FunctionCallbackResolver functionCallbackResolver; private List toolFunctionCallbacks = List.of(); @@ -420,8 +420,18 @@ public Builder withDefaultOptions(OllamaOptions defaultOptions) { return this; } - public Builder withFunctionCallbackContext(FunctionCallbackContext functionCallbackContext) { - this.functionCallbackContext = functionCallbackContext; + /** + * @deprecated use the {@link functionCallbackResolver(FunctionCallbackResolver)} + * instead + */ + @Deprecated + public Builder withFunctionCallbackContext(FunctionCallbackResolver functionCallbackContext) { + this.functionCallbackResolver = functionCallbackContext; + return this; + } + + public Builder functionCallbackResolver(FunctionCallbackResolver functionCallbackResolver) { + this.functionCallbackResolver = functionCallbackResolver; return this; } @@ -441,7 +451,7 @@ public Builder withModelManagementOptions(ModelManagementOptions modelManagement } public OllamaChatModel build() { - return new OllamaChatModel(this.ollamaApi, this.defaultOptions, this.functionCallbackContext, + return new OllamaChatModel(this.ollamaApi, this.defaultOptions, this.functionCallbackResolver, this.toolFunctionCallbacks, this.observationRegistry, this.modelManagementOptions); } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java index f21a064ee6b..06125d72db6 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java @@ -57,7 +57,7 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.ai.openai.api.OpenAiApi.ChatCompletion; @@ -155,12 +155,12 @@ public OpenAiChatModel(OpenAiApi openAiApi, OpenAiChatOptions options) { * @param openAiApi The OpenAiApi instance to be used for interacting with the OpenAI * Chat API. * @param options The OpenAiChatOptions to configure the chat model. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver. * @param retryTemplate The retry template. */ public OpenAiChatModel(OpenAiApi openAiApi, OpenAiChatOptions options, - FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) { - this(openAiApi, options, functionCallbackContext, List.of(), retryTemplate); + FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate) { + this(openAiApi, options, functionCallbackResolver, List.of(), retryTemplate); } /** @@ -168,14 +168,14 @@ public OpenAiChatModel(OpenAiApi openAiApi, OpenAiChatOptions options, * @param openAiApi The OpenAiApi instance to be used for interacting with the OpenAI * Chat API. * @param options The OpenAiChatOptions to configure the chat model. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver. * @param toolFunctionCallbacks The tool function callbacks. * @param retryTemplate The retry template. */ public OpenAiChatModel(OpenAiApi openAiApi, OpenAiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate) { - this(openAiApi, options, functionCallbackContext, toolFunctionCallbacks, retryTemplate, + this(openAiApi, options, functionCallbackResolver, toolFunctionCallbacks, retryTemplate, ObservationRegistry.NOOP); } @@ -184,16 +184,16 @@ public OpenAiChatModel(OpenAiApi openAiApi, OpenAiChatOptions options, * @param openAiApi The OpenAiApi instance to be used for interacting with the OpenAI * Chat API. * @param options The OpenAiChatOptions to configure the chat model. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver. * @param toolFunctionCallbacks The tool function callbacks. * @param retryTemplate The retry template. * @param observationRegistry The ObservationRegistry used for instrumentation. */ public OpenAiChatModel(OpenAiApi openAiApi, OpenAiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { - super(functionCallbackContext, options, toolFunctionCallbacks); + super(functionCallbackResolver, options, toolFunctionCallbacks); Assert.notNull(openAiApi, "OpenAiApi must not be null"); Assert.notNull(options, "Options must not be null"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java index 03bbc1c7e7c..54b33b47262 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java @@ -30,7 +30,7 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.observation.DefaultChatModelObservationConvention; import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.observation.conventions.AiOperationType; import org.springframework.ai.observation.conventions.AiProvider; import org.springframework.ai.openai.OpenAiChatModel; @@ -174,8 +174,9 @@ public OpenAiApi openAiApi() { @Bean public OpenAiChatModel openAiChatModel(OpenAiApi openAiApi, TestObservationRegistry observationRegistry) { - return new OpenAiChatModel(openAiApi, OpenAiChatOptions.builder().build(), new FunctionCallbackContext(), - List.of(), RetryTemplate.defaultInstance(), observationRegistry); + return new OpenAiChatModel(openAiApi, OpenAiChatOptions.builder().build(), + new DefaultFunctionCallbackResolver(), List.of(), RetryTemplate.defaultInstance(), + observationRegistry); } } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java index 98a2892d182..2e90d5fa927 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiPaymentTransactionIT.java @@ -34,7 +34,8 @@ import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisor; import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisorChain; import org.springframework.ai.converter.BeanOutputConverter; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.ai.openai.OpenAiChatOptions; import org.springframework.ai.openai.api.OpenAiApi; @@ -220,22 +221,22 @@ public OpenAiApi chatCompletionApi() { } @Bean - public OpenAiChatModel openAiClient(OpenAiApi openAiApi, FunctionCallbackContext functionCallbackContext) { + public OpenAiChatModel openAiClient(OpenAiApi openAiApi, FunctionCallbackResolver functionCallbackResolver) { return new OpenAiChatModel(openAiApi, OpenAiChatOptions.builder() .withModel(ChatModel.GPT_4_O_MINI.getName()) .withTemperature(0.1) .build(), - functionCallbackContext, RetryUtils.DEFAULT_RETRY_TEMPLATE); + functionCallbackResolver, RetryUtils.DEFAULT_RETRY_TEMPLATE); } /** - * Because of the OPEN_API_SCHEMA type, the FunctionCallbackContext instance must + * Because of the OPEN_API_SCHEMA type, the FunctionCallbackResolver instance must * different from the other JSON schema types. */ @Bean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java index 30f030c3737..5741e4c9b64 100644 --- a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java +++ b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java @@ -71,7 +71,7 @@ import org.springframework.ai.model.Media; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.vertexai.gemini.common.VertexAiGeminiConstants; @@ -130,27 +130,27 @@ public VertexAiGeminiChatModel(VertexAI vertexAI, VertexAiGeminiChatOptions opti } public VertexAiGeminiChatModel(VertexAI vertexAI, VertexAiGeminiChatOptions options, - FunctionCallbackContext functionCallbackContext) { - this(vertexAI, options, functionCallbackContext, List.of()); + FunctionCallbackResolver functionCallbackResolver) { + this(vertexAI, options, functionCallbackResolver, List.of()); } public VertexAiGeminiChatModel(VertexAI vertexAI, VertexAiGeminiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks) { - this(vertexAI, options, functionCallbackContext, toolFunctionCallbacks, RetryUtils.DEFAULT_RETRY_TEMPLATE); + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks) { + this(vertexAI, options, functionCallbackResolver, toolFunctionCallbacks, RetryUtils.DEFAULT_RETRY_TEMPLATE); } public VertexAiGeminiChatModel(VertexAI vertexAI, VertexAiGeminiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate) { - this(vertexAI, options, functionCallbackContext, toolFunctionCallbacks, retryTemplate, + this(vertexAI, options, functionCallbackResolver, toolFunctionCallbacks, retryTemplate, ObservationRegistry.NOOP); } public VertexAiGeminiChatModel(VertexAI vertexAI, VertexAiGeminiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { - super(functionCallbackContext, options, toolFunctionCallbacks); + super(functionCallbackResolver, options, toolFunctionCallbacks); Assert.notNull(vertexAI, "VertexAI must not be null"); Assert.notNull(options, "VertexAiGeminiChatOptions must not be null"); diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/TestVertexAiGeminiChatModel.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/TestVertexAiGeminiChatModel.java index d304d44105b..73c498831fa 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/TestVertexAiGeminiChatModel.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/TestVertexAiGeminiChatModel.java @@ -24,7 +24,7 @@ import com.google.cloud.vertexai.generativeai.GenerativeModel; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.retry.support.RetryTemplate; /** @@ -35,9 +35,9 @@ public class TestVertexAiGeminiChatModel extends VertexAiGeminiChatModel { private GenerativeModel mockGenerativeModel; public TestVertexAiGeminiChatModel(VertexAI vertexAI, VertexAiGeminiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate) { - super(vertexAI, options, functionCallbackContext, toolFunctionCallbacks, retryTemplate); + super(vertexAI, options, functionCallbackResolver, toolFunctionCallbacks, retryTemplate); } @Override diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java index e8b650c3a53..638e7e7d877 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java @@ -36,7 +36,7 @@ import org.springframework.ai.chat.model.Generation; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; +import org.springframework.ai.model.function.FunctionCallback.SchemaType; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions; import org.springframework.beans.factory.annotation.Autowired; diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java index 12a8bb30dc7..329139de19b 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiPaymentTransactionIT.java @@ -35,8 +35,9 @@ import org.springframework.ai.chat.client.advisor.api.AdvisedResponse; import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisor; import org.springframework.ai.chat.client.advisor.api.CallAroundAdvisorChain; -import org.springframework.ai.model.function.FunctionCallbackContext; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; +import org.springframework.ai.model.function.FunctionCallbackResolver; +import org.springframework.ai.model.function.FunctionCallback.SchemaType; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions; import org.springframework.beans.factory.annotation.Autowired; @@ -207,23 +208,23 @@ public VertexAI vertexAiApi() { @Bean public VertexAiGeminiChatModel vertexAiChatModel(VertexAI vertexAi, ApplicationContext context) { - FunctionCallbackContext functionCallbackContext = springAiFunctionManager(context); + FunctionCallbackResolver functionCallbackResolver = springAiFunctionManager(context); return new VertexAiGeminiChatModel(vertexAi, VertexAiGeminiChatOptions.builder() .withModel(VertexAiGeminiChatModel.ChatModel.GEMINI_1_5_FLASH) .withTemperature(0.1) .build(), - functionCallbackContext); + functionCallbackResolver); } /** - * Because of the OPEN_API_SCHEMA type, the FunctionCallbackContext instance + * Because of the OPEN_API_SCHEMA type, the FunctionCallbackResolver instance * must * different from the other JSON schema types. */ - private FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + private FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setSchemaType(SchemaType.OPEN_API_SCHEMA); manager.setApplicationContext(context); return manager; diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java index 7da150c62e7..977a48cc5da 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java @@ -54,7 +54,7 @@ import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.ModelOptionsUtils; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.zhipuai.api.ZhiPuAiApi; @@ -143,12 +143,12 @@ public ZhiPuAiChatModel(ZhiPuAiApi zhiPuAiApi, ZhiPuAiChatOptions options) { * @param zhiPuAiApi The ZhiPuAiApi instance to be used for interacting with the * ZhiPuAI Chat API. * @param options The ZhiPuAiChatOptions to configure the chat model. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver. * @param retryTemplate The retry template. */ public ZhiPuAiChatModel(ZhiPuAiApi zhiPuAiApi, ZhiPuAiChatOptions options, - FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) { - this(zhiPuAiApi, options, functionCallbackContext, List.of(), retryTemplate, ObservationRegistry.NOOP); + FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate) { + this(zhiPuAiApi, options, functionCallbackResolver, List.of(), retryTemplate, ObservationRegistry.NOOP); } /** @@ -156,15 +156,15 @@ public ZhiPuAiChatModel(ZhiPuAiApi zhiPuAiApi, ZhiPuAiChatOptions options, * @param zhiPuAiApi The ZhiPuAiApi instance to be used for interacting with the * ZhiPuAI Chat API. * @param options The ZhiPuAiChatOptions to configure the chat model. - * @param functionCallbackContext The function callback context. + * @param functionCallbackResolver The function callback resolver. * @param toolFunctionCallbacks The tool function callbacks. * @param retryTemplate The retry template. * @param observationRegistry The ObservationRegistry used for instrumentation. */ public ZhiPuAiChatModel(ZhiPuAiApi zhiPuAiApi, ZhiPuAiChatOptions options, - FunctionCallbackContext functionCallbackContext, List toolFunctionCallbacks, + FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { - super(functionCallbackContext, options, toolFunctionCallbacks); + super(functionCallbackResolver, options, toolFunctionCallbacks); Assert.notNull(zhiPuAiApi, "ZhiPuAiApi must not be null"); Assert.notNull(options, "Options must not be null"); Assert.notNull(retryTemplate, "RetryTemplate must not be null"); diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java index 69fad096353..65c88d8b47f 100644 --- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java +++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java @@ -30,7 +30,7 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.observation.DefaultChatModelObservationConvention; import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.observation.conventions.AiOperationType; import org.springframework.ai.observation.conventions.AiProvider; import org.springframework.ai.zhipuai.ZhiPuAiChatModel; @@ -165,8 +165,9 @@ public ZhiPuAiApi zhiPuAiApi() { @Bean public ZhiPuAiChatModel zhiPuAiChatModel(ZhiPuAiApi zhiPuAiApi, TestObservationRegistry observationRegistry) { - return new ZhiPuAiChatModel(zhiPuAiApi, ZhiPuAiChatOptions.builder().build(), new FunctionCallbackContext(), - List.of(), RetryTemplate.defaultInstance(), observationRegistry); + return new ZhiPuAiChatModel(zhiPuAiApi, ZhiPuAiChatOptions.builder().build(), + new DefaultFunctionCallbackResolver(), List.of(), RetryTemplate.defaultInstance(), + observationRegistry); } } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/aot/SpringAiCoreRuntimeHints.java b/spring-ai-core/src/main/java/org/springframework/ai/aot/SpringAiCoreRuntimeHints.java index 2ee283a69c4..147bb233c09 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/aot/SpringAiCoreRuntimeHints.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/aot/SpringAiCoreRuntimeHints.java @@ -27,7 +27,7 @@ import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallbackWrapper; import org.springframework.aot.hint.ExecutableMode; import org.springframework.aot.hint.RuntimeHints; @@ -43,7 +43,7 @@ public class SpringAiCoreRuntimeHints implements RuntimeHintsRegistrar { public void registerHints(@NonNull RuntimeHints hints, @Nullable ClassLoader classLoader) { var chatTypes = Set.of(AbstractMessage.class, AssistantMessage.class, ToolResponseMessage.class, Message.class, - MessageType.class, UserMessage.class, SystemMessage.class, FunctionCallbackContext.class, + MessageType.class, UserMessage.class, SystemMessage.class, DefaultFunctionCallbackResolver.class, FunctionCallback.class, FunctionCallbackWrapper.class); for (var c : chatTypes) { hints.reflection().registerType(c); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java index 255444944a9..c462a37ca8b 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java @@ -30,7 +30,7 @@ import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -55,20 +55,20 @@ public abstract class AbstractToolCallSupport { protected final Map functionCallbackRegister = new ConcurrentHashMap<>(); /** - * The function callback context is used to resolve the function callbacks by name + * The function callback resolver is used to resolve the function callbacks by name * from the Spring context. It is optional and usually used with Spring * auto-configuration. */ - protected final FunctionCallbackContext functionCallbackContext; + protected final FunctionCallbackResolver functionCallbackResolver; - protected AbstractToolCallSupport(FunctionCallbackContext functionCallbackContext) { - this(functionCallbackContext, FunctionCallingOptions.builder().build(), List.of()); + protected AbstractToolCallSupport(FunctionCallbackResolver functionCallbackResolver) { + this(functionCallbackResolver, FunctionCallingOptions.builder().build(), List.of()); } - protected AbstractToolCallSupport(FunctionCallbackContext functionCallbackContext, + protected AbstractToolCallSupport(FunctionCallbackResolver functionCallbackResolver, FunctionCallingOptions functionCallingOptions, List toolFunctionCallbacks) { - this.functionCallbackContext = functionCallbackContext; + this.functionCallbackResolver = functionCallbackResolver; List defaultFunctionCallbacks = merge(functionCallingOptions, toolFunctionCallbacks); @@ -183,15 +183,14 @@ protected List resolveFunctionCallbacks(Set functionNa for (String functionName : functionNames) { if (!this.functionCallbackRegister.containsKey(functionName)) { - if (this.functionCallbackContext != null) { - FunctionCallback functionCallback = this.functionCallbackContext.getFunctionCallback(functionName, - null); + if (this.functionCallbackResolver != null) { + FunctionCallback functionCallback = this.functionCallbackResolver.resolve(functionName); if (functionCallback != null) { this.functionCallbackRegister.put(functionName, functionCallback); } else { throw new IllegalStateException( - "No function callback [" + functionName + "] fund in tht FunctionCallbackContext"); + "No function callback [" + functionName + "] found in tht FunctionCallbackRegister"); } } else { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java index 7e56c8fd8db..1399758da6f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java @@ -36,7 +36,7 @@ import org.springframework.ai.model.function.FunctionCallback.Builder; import org.springframework.ai.model.function.FunctionCallback.FunctionInvokingSpec; import org.springframework.ai.model.function.FunctionCallback.MethodInvokingSpec; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; +import org.springframework.ai.model.function.FunctionCallback.SchemaType; import org.springframework.ai.util.JacksonUtils; import org.springframework.ai.util.ParsingUtils; import org.springframework.core.ParameterizedTypeReference; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackContext.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java similarity index 93% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackContext.java rename to spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java index 5bac4250357..52b11744b91 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackContext.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java @@ -27,6 +27,7 @@ import kotlin.jvm.functions.Function2; import org.springframework.ai.chat.model.ToolContext; +import org.springframework.ai.model.function.FunctionCallback.SchemaType; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -56,7 +57,7 @@ * @author Christopher Smith * @author Sebastien Deleuze */ -public class FunctionCallbackContext implements ApplicationContextAware { +public class DefaultFunctionCallbackResolver implements ApplicationContextAware, FunctionCallbackResolver { private GenericApplicationContext applicationContext; @@ -71,21 +72,20 @@ public void setApplicationContext(@NonNull ApplicationContext applicationContext this.applicationContext = (GenericApplicationContext) applicationContext; } - @SuppressWarnings({ "unchecked" }) - public FunctionCallback getFunctionCallback(@NonNull String beanName, @Nullable String defaultDescription) { + @Override + public FunctionCallback resolve(@NonNull String beanName) { ResolvableType functionType = TypeResolverHelper.resolveBeanType(this.applicationContext, beanName); ResolvableType functionInputType = (ResolvableType.forType(Supplier.class).isAssignableFrom(functionType)) ? ResolvableType.forType(Void.class) : TypeResolverHelper.getFunctionArgumentType(functionType, 0); - String functionDescription = resolveFunctionDescription(beanName, defaultDescription, - functionInputType.toClass()); + String functionDescription = resolveFunctionDescription(beanName, functionInputType.toClass()); Object bean = this.applicationContext.getBean(beanName); return buildFunctionCallback(beanName, functionType, functionInputType, functionDescription, bean); } - private String resolveFunctionDescription(String beanName, String defaultDescription, Class functionInputClass) { - String functionDescription = defaultDescription; + private String resolveFunctionDescription(String beanName, Class functionInputClass) { + String functionDescription = ""; if (!StringUtils.hasText(functionDescription)) { Description descriptionAnnotation = this.applicationContext.findAnnotationOnBean(beanName, @@ -178,12 +178,6 @@ private FunctionCallback buildFunctionCallback(String beanName, ResolvableType f throw new IllegalStateException("Unsupported function type"); } - public enum SchemaType { - - JSON_SCHEMA, OPEN_API_SCHEMA - - } - private static final class KotlinDelegate { public static boolean isKotlinSupplier(Class clazz) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallback.java index b7432753565..dfec93c7cb4 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallback.java @@ -24,7 +24,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.ai.chat.model.ToolContext; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; import org.springframework.core.ParameterizedTypeReference; /** @@ -91,6 +90,23 @@ static FunctionCallback.Builder builder() { return new DefaultFunctionCallbackBuilder(); } + /** + * Describes the type of the schema used to describe the input parameters of the + * function. + */ + public enum SchemaType { + + /** + * JSON schema + */ + JSON_SCHEMA, + /** + * Open API schema + */ + OPEN_API_SCHEMA + + } + /** * Builder for creating a {@link FunctionCallback} instance. This is a hierarchical * builder with the following structure: diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java new file mode 100644 index 00000000000..8654ea25d7b --- /dev/null +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java @@ -0,0 +1,35 @@ +/* +* Copyright 2024 - 2024 the original author or authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* https://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package org.springframework.ai.model.function; + +import org.springframework.lang.NonNull; + +/** + * Strategy interface for resolving {@link FunctionCallback} instances. + * + * @author Christian Tzolov + * @since 1.0.0 + */ +public interface FunctionCallbackResolver { + + /** + * Resolve the {@link FunctionCallback} instance by its bean name. + * @param name the name of the function to resolve + * @return the {@link FunctionCallback} instance + */ + FunctionCallback resolve(@NonNull String name); + +} diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackWrapper.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackWrapper.java index ba2f88f3be5..e7d1f244c67 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackWrapper.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackWrapper.java @@ -27,7 +27,6 @@ import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; import org.springframework.ai.util.JacksonUtils; import org.springframework.util.Assert; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java index 42db38485b4..7da7e87314d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java @@ -48,9 +48,9 @@ public FunctionCallingHelper() { this(null, PortableFunctionCallingOptions.builder().build(), List.of()); } - public FunctionCallingHelper(FunctionCallbackContext functionCallbackContext, + public FunctionCallingHelper(FunctionCallbackResolver functionCallbackResolver, FunctionCallingOptions functionCallingOptions, List toolFunctionCallbacks) { - super(functionCallbackContext, functionCallingOptions, toolFunctionCallbacks); + super(functionCallbackResolver, functionCallingOptions, toolFunctionCallbacks); } @Override diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfiguration.java index 7f32d027e35..dedc16046f9 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfiguration.java @@ -24,8 +24,9 @@ import org.springframework.ai.anthropic.api.AnthropicApi; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; import org.springframework.ai.chat.observation.ChatModelObservationConvention; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -73,12 +74,12 @@ public AnthropicApi anthropicApi(AnthropicConnectionProperties connectionPropert @Bean @ConditionalOnMissingBean public AnthropicChatModel anthropicChatModel(AnthropicApi anthropicApi, AnthropicChatProperties chatProperties, - RetryTemplate retryTemplate, FunctionCallbackContext functionCallbackContext, + RetryTemplate retryTemplate, DefaultFunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, ObjectProvider observationRegistry, ObjectProvider observationConvention) { var chatModel = new AnthropicChatModel(anthropicApi, chatProperties.getOptions(), retryTemplate, - functionCallbackContext, toolFunctionCallbacks, + functionCallbackResolver, toolFunctionCallbacks, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); @@ -88,8 +89,8 @@ public AnthropicChatModel anthropicChatModel(AnthropicApi anthropicApi, Anthropi @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/azure/openai/AzureOpenAiAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/azure/openai/AzureOpenAiAutoConfiguration.java index 99083cd8d68..a662667995b 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/azure/openai/AzureOpenAiAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/azure/openai/AzureOpenAiAutoConfiguration.java @@ -34,8 +34,9 @@ import org.springframework.ai.azure.openai.AzureOpenAiImageModel; import org.springframework.ai.chat.observation.ChatModelObservationConvention; import org.springframework.ai.embedding.observation.EmbeddingModelObservationConvention; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -112,11 +113,11 @@ public OpenAIClientBuilder openAIClientWithTokenCredential(AzureOpenAiConnection matchIfMissing = true) public AzureOpenAiChatModel azureOpenAiChatModel(OpenAIClientBuilder openAIClientBuilder, AzureOpenAiChatProperties chatProperties, List toolFunctionCallbacks, - FunctionCallbackContext functionCallbackContext, ObjectProvider observationRegistry, + FunctionCallbackResolver functionCallbackResolver, ObjectProvider observationRegistry, ObjectProvider observationConvention) { var chatModel = new AzureOpenAiChatModel(openAIClientBuilder, chatProperties.getOptions(), - functionCallbackContext, toolFunctionCallbacks, + functionCallbackResolver, toolFunctionCallbacks, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); @@ -143,8 +144,8 @@ public AzureOpenAiEmbeddingModel azureOpenAiEmbeddingModel(OpenAIClientBuilder o @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfiguration.java index cb5bfd4c706..2f6b21dbc72 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfiguration.java @@ -28,8 +28,9 @@ import org.springframework.ai.autoconfigure.bedrock.BedrockAwsConnectionProperties; import org.springframework.ai.bedrock.converse.BedrockProxyChatModel; import org.springframework.ai.chat.observation.ChatModelObservationConvention; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -62,7 +63,7 @@ public class BedrockConverseProxyChatAutoConfiguration { @ConditionalOnBean({ AwsCredentialsProvider.class, AwsRegionProvider.class }) public BedrockProxyChatModel bedrockProxyChatModel(AwsCredentialsProvider credentialsProvider, AwsRegionProvider regionProvider, BedrockAwsConnectionProperties connectionProperties, - BedrockConverseProxyChatProperties chatProperties, FunctionCallbackContext functionCallbackContext, + BedrockConverseProxyChatProperties chatProperties, FunctionCallbackResolver functionCallbackResolver, List toolFunctionCallbacks, ObjectProvider observationRegistry, ObjectProvider observationConvention, ObjectProvider bedrockRuntimeClient, @@ -74,7 +75,7 @@ public BedrockProxyChatModel bedrockProxyChatModel(AwsCredentialsProvider creden .withTimeout(connectionProperties.getTimeout()) .withDefaultOptions(chatProperties.getOptions()) .withObservationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)) - .withFunctionCallbackContext(functionCallbackContext) + .functionCallbackResolver(functionCallbackResolver) .withToolFunctionCallbacks(toolFunctionCallbacks) .withBedrockRuntimeClient(bedrockRuntimeClient.getIfAvailable()) .withBedrockRuntimeAsyncClient(bedrockRuntimeAsyncClient.getIfAvailable()) @@ -87,8 +88,8 @@ public BedrockProxyChatModel bedrockProxyChatModel(AwsCredentialsProvider creden @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfiguration.java index d60e8481590..8178476195f 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfiguration.java @@ -27,7 +27,8 @@ import org.springframework.ai.minimax.MiniMaxEmbeddingModel; import org.springframework.ai.minimax.api.MiniMaxApi; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -60,7 +61,7 @@ public class MiniMaxAutoConfiguration { matchIfMissing = true) public MiniMaxChatModel miniMaxChatModel(MiniMaxConnectionProperties commonProperties, MiniMaxChatProperties chatProperties, ObjectProvider restClientBuilderProvider, - List toolFunctionCallbacks, FunctionCallbackContext functionCallbackContext, + List toolFunctionCallbacks, FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler, ObjectProvider observationRegistry, ObjectProvider observationConvention) { @@ -69,7 +70,7 @@ public MiniMaxChatModel miniMaxChatModel(MiniMaxConnectionProperties commonPrope chatProperties.getApiKey(), commonProperties.getApiKey(), restClientBuilderProvider.getIfAvailable(RestClient::builder), responseErrorHandler); - var chatModel = new MiniMaxChatModel(miniMaxApi, chatProperties.getOptions(), functionCallbackContext, + var chatModel = new MiniMaxChatModel(miniMaxApi, chatProperties.getOptions(), functionCallbackResolver, toolFunctionCallbacks, retryTemplate, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); @@ -113,8 +114,8 @@ private MiniMaxApi miniMaxApi(String baseUrl, String commonBaseUrl, String apiKe @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfiguration.java index 5a50e1ab9bf..e380e897cc6 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfiguration.java @@ -26,8 +26,9 @@ import org.springframework.ai.mistralai.MistralAiChatModel; import org.springframework.ai.mistralai.MistralAiEmbeddingModel; import org.springframework.ai.mistralai.api.MistralAiApi; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -90,7 +91,7 @@ public MistralAiEmbeddingModel mistralAiEmbeddingModel(MistralAiCommonProperties matchIfMissing = true) public MistralAiChatModel mistralAiChatModel(MistralAiCommonProperties commonProperties, MistralAiChatProperties chatProperties, ObjectProvider restClientBuilderProvider, - List toolFunctionCallbacks, FunctionCallbackContext functionCallbackContext, + List toolFunctionCallbacks, FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler, ObjectProvider observationRegistry, ObjectProvider observationConvention) { @@ -99,7 +100,7 @@ public MistralAiChatModel mistralAiChatModel(MistralAiCommonProperties commonPro chatProperties.getBaseUrl(), commonProperties.getBaseUrl(), restClientBuilderProvider.getIfAvailable(RestClient::builder), responseErrorHandler); - var chatModel = new MistralAiChatModel(mistralAiApi, chatProperties.getOptions(), functionCallbackContext, + var chatModel = new MistralAiChatModel(mistralAiApi, chatProperties.getOptions(), functionCallbackResolver, toolFunctionCallbacks, retryTemplate, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); @@ -121,8 +122,8 @@ private MistralAiApi mistralAiApi(String apiKey, String commonApiKey, String bas @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfiguration.java index c9af8af7201..12cdc8cf25a 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfiguration.java @@ -22,8 +22,9 @@ import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; import org.springframework.ai.chat.observation.ChatModelObservationConvention; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.moonshot.MoonshotChatModel; import org.springframework.ai.moonshot.api.MoonshotApi; import org.springframework.beans.factory.ObjectProvider; @@ -57,7 +58,7 @@ public class MoonshotAutoConfiguration { matchIfMissing = true) public MoonshotChatModel moonshotChatModel(MoonshotCommonProperties commonProperties, MoonshotChatProperties chatProperties, ObjectProvider restClientBuilderProvider, - List toolFunctionCallbacks, FunctionCallbackContext functionCallbackContext, + List toolFunctionCallbacks, FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler, ObjectProvider observationRegistry, ObjectProvider observationConvention) { @@ -66,7 +67,7 @@ public MoonshotChatModel moonshotChatModel(MoonshotCommonProperties commonProper chatProperties.getBaseUrl(), commonProperties.getBaseUrl(), restClientBuilderProvider.getIfAvailable(RestClient::builder), responseErrorHandler); - var chatModel = new MoonshotChatModel(moonshotApi, chatProperties.getOptions(), functionCallbackContext, + var chatModel = new MoonshotChatModel(moonshotApi, chatProperties.getOptions(), functionCallbackResolver, toolFunctionCallbacks, retryTemplate, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); @@ -75,8 +76,8 @@ public MoonshotChatModel moonshotChatModel(MoonshotCommonProperties commonProper @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/ollama/OllamaAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/ollama/OllamaAutoConfiguration.java index 9b86be15097..39342ef6229 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/ollama/OllamaAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/ollama/OllamaAutoConfiguration.java @@ -22,8 +22,9 @@ import org.springframework.ai.chat.observation.ChatModelObservationConvention; import org.springframework.ai.embedding.observation.EmbeddingModelObservationConvention; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.ollama.OllamaEmbeddingModel; import org.springframework.ai.ollama.api.OllamaApi; @@ -80,7 +81,7 @@ public OllamaApi ollamaApi(OllamaConnectionDetails connectionDetails, matchIfMissing = true) public OllamaChatModel ollamaChatModel(OllamaApi ollamaApi, OllamaChatProperties properties, OllamaInitializationProperties initProperties, List toolFunctionCallbacks, - FunctionCallbackContext functionCallbackContext, ObjectProvider observationRegistry, + FunctionCallbackResolver functionCallbackResolver, ObjectProvider observationRegistry, ObjectProvider observationConvention) { var chatModelPullStrategy = initProperties.getChat().isInclude() ? initProperties.getPullModelStrategy() : PullModelStrategy.NEVER; @@ -88,7 +89,7 @@ public OllamaChatModel ollamaChatModel(OllamaApi ollamaApi, OllamaChatProperties var chatModel = OllamaChatModel.builder() .withOllamaApi(ollamaApi) .withDefaultOptions(properties.getOptions()) - .withFunctionCallbackContext(functionCallbackContext) + .functionCallbackResolver(functionCallbackResolver) .withToolFunctionCallbacks(toolFunctionCallbacks) .withObservationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)) .withModelManagementOptions( @@ -127,8 +128,8 @@ public OllamaEmbeddingModel ollamaEmbeddingModel(OllamaApi ollamaApi, OllamaEmbe @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java index b4efac409e1..7ce9ca291e2 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java @@ -27,8 +27,9 @@ import org.springframework.ai.chat.observation.ChatModelObservationConvention; import org.springframework.ai.embedding.observation.EmbeddingModelObservationConvention; import org.springframework.ai.image.observation.ImageModelObservationConvention; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.openai.OpenAiAudioSpeechModel; import org.springframework.ai.openai.OpenAiAudioTranscriptionModel; import org.springframework.ai.openai.OpenAiChatModel; @@ -113,7 +114,7 @@ public class OpenAiAutoConfiguration { public OpenAiChatModel openAiChatModel(OpenAiConnectionProperties commonProperties, OpenAiChatProperties chatProperties, ObjectProvider restClientBuilderProvider, ObjectProvider webClientBuilderProvider, List toolFunctionCallbacks, - FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate, + FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler, ObjectProvider observationRegistry, ObjectProvider observationConvention) { @@ -121,7 +122,7 @@ public OpenAiChatModel openAiChatModel(OpenAiConnectionProperties commonProperti restClientBuilderProvider.getIfAvailable(RestClient::builder), webClientBuilderProvider.getIfAvailable(WebClient::builder), responseErrorHandler, "chat"); - var chatModel = new OpenAiChatModel(openAiApi, chatProperties.getOptions(), functionCallbackContext, + var chatModel = new OpenAiChatModel(openAiApi, chatProperties.getOptions(), functionCallbackResolver, toolFunctionCallbacks, retryTemplate, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); @@ -256,8 +257,8 @@ public OpenAiAudioSpeechModel openAiAudioSpeechClient(OpenAiConnectionProperties @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfiguration.java index c34745565d5..7af2dc19913 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfiguration.java @@ -22,7 +22,8 @@ import org.springframework.ai.chat.observation.ChatModelObservationConvention; import org.springframework.ai.embedding.observation.EmbeddingModelObservationConvention; import org.springframework.ai.image.observation.ImageModelObservationConvention; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.qianfan.QianFanChatModel; import org.springframework.ai.qianfan.QianFanEmbeddingModel; import org.springframework.ai.qianfan.QianFanImageModel; @@ -155,8 +156,8 @@ private QianFanApi qianFanApi(String baseUrl, String commonBaseUrl, String apiKe @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfiguration.java index b73332e8170..883015c5769 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfiguration.java @@ -26,8 +26,9 @@ import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; import org.springframework.ai.chat.observation.ChatModelObservationConvention; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; +import org.springframework.ai.model.function.FunctionCallback.SchemaType; +import org.springframework.ai.model.function.FunctionCallbackResolver; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -94,21 +95,21 @@ public VertexAiGeminiChatModel vertexAiGeminiChat(VertexAI vertexAi, VertexAiGem ObjectProvider observationRegistry, ObjectProvider observationConvention) { - FunctionCallbackContext functionCallbackContext = springAiFunctionManager(context); + FunctionCallbackResolver functionCallbackResolver = springAiFunctionManager(context); VertexAiGeminiChatModel chatModel = new VertexAiGeminiChatModel(vertexAi, chatProperties.getOptions(), - functionCallbackContext, toolFunctionCallbacks, retryTemplate, + functionCallbackResolver, toolFunctionCallbacks, retryTemplate, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); return chatModel; } /** - * Because of the OPEN_API_SCHEMA type, the FunctionCallbackContext instance must + * Because of the OPEN_API_SCHEMA type, the FunctionCallbackResolver instance must * different from the other JSON schema types. */ - private FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + private FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setSchemaType(SchemaType.OPEN_API_SCHEMA); manager.setApplicationContext(context); return manager; diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfiguration.java index 00c1407e163..4ff96a55525 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfiguration.java @@ -23,8 +23,9 @@ import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; import org.springframework.ai.chat.observation.ChatModelObservationConvention; import org.springframework.ai.embedding.observation.EmbeddingModelObservationConvention; +import org.springframework.ai.model.function.DefaultFunctionCallbackResolver; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext; +import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.zhipuai.ZhiPuAiChatModel; import org.springframework.ai.zhipuai.ZhiPuAiEmbeddingModel; import org.springframework.ai.zhipuai.ZhiPuAiImageModel; @@ -62,7 +63,7 @@ public class ZhiPuAiAutoConfiguration { matchIfMissing = true) public ZhiPuAiChatModel zhiPuAiChatModel(ZhiPuAiConnectionProperties commonProperties, ZhiPuAiChatProperties chatProperties, ObjectProvider restClientBuilderProvider, - List toolFunctionCallbacks, FunctionCallbackContext functionCallbackContext, + List toolFunctionCallbacks, FunctionCallbackResolver functionCallbackResolver, RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler, ObjectProvider observationRegistry, ObjectProvider observationConvention) { @@ -71,7 +72,7 @@ public ZhiPuAiChatModel zhiPuAiChatModel(ZhiPuAiConnectionProperties commonPrope chatProperties.getApiKey(), commonProperties.getApiKey(), restClientBuilderProvider.getIfAvailable(RestClient::builder), responseErrorHandler); - var chatModel = new ZhiPuAiChatModel(zhiPuAiApi, chatProperties.getOptions(), functionCallbackContext, + var chatModel = new ZhiPuAiChatModel(zhiPuAiApi, chatProperties.getOptions(), functionCallbackResolver, toolFunctionCallbacks, retryTemplate, observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)); observationConvention.ifAvailable(chatModel::setObservationConvention); @@ -137,8 +138,8 @@ public ZhiPuAiImageModel zhiPuAiImageModel(ZhiPuAiConnectionProperties commonPro @Bean @ConditionalOnMissingBean - public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { - FunctionCallbackContext manager = new FunctionCallbackContext(); + public FunctionCallbackResolver springAiFunctionManager(ApplicationContext context) { + DefaultFunctionCallbackResolver manager = new DefaultFunctionCallbackResolver(); manager.setApplicationContext(context); return manager; } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java index 8a3de8549d3..f617efdcb84 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java @@ -28,7 +28,7 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; +import org.springframework.ai.model.function.FunctionCallback.SchemaType; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions; import org.springframework.boot.autoconfigure.AutoConfigurations; diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java index 4465df6a441..3de7c0faf23 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java @@ -28,7 +28,7 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.model.function.FunctionCallbackContext.SchemaType; +import org.springframework.ai.model.function.FunctionCallback.SchemaType; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions; import org.springframework.boot.autoconfigure.AutoConfigurations; diff --git a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt index b70ec707193..3e1d45ec9f8 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt +++ b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt @@ -35,7 +35,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Description -class FunctionCallbackContextKotlinIT : BaseOllamaIT() { +class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { companion object { @@ -48,7 +48,7 @@ class FunctionCallbackContextKotlinIT : BaseOllamaIT() { } } - private val logger = LoggerFactory.getLogger(FunctionCallbackContextKotlinIT::class.java) + private val logger = LoggerFactory.getLogger(FunctionCallbackResolverKotlinIT::class.java) private val contextRunner = ApplicationContextRunner() .withPropertyValues(