From 76a1dbe747f9cdc13df13ef17cfb8967bfba8ea8 Mon Sep 17 00:00:00 2001 From: Ilayaperumal Gopinathan Date: Mon, 14 Apr 2025 12:38:09 +0100 Subject: [PATCH] Fix ToolCallingChatOptions isInternalToolExecutionEnabled - The ModelOptionsUtils merges the ToolCallingChatOptions with the provider chat options - The underlying beanwrapper implementation expects the boolean option to have the getter method starting with "get" instad of "is" which makes the current `isInternalToolExecutionEnabled` not used by the merge operation at all. To fix this, rename the `isInternalToolExecutionEnabled` method to `getInternalToolExecutionEnabled` and deprecate the existing `isInternalToolExecutionEnabled` method. Signed-off-by: Ilayaperumal Gopinathan --- .../ai/anthropic/AnthropicChatModel.java | 6 +++--- .../ai/anthropic/AnthropicChatOptions.java | 4 ++-- .../ai/azure/openai/AzureOpenAiChatModel.java | 6 +++--- .../ai/azure/openai/AzureOpenAiChatOptions.java | 4 ++-- .../ai/bedrock/converse/BedrockProxyChatModel.java | 6 +++--- .../ai/mistralai/MistralAiChatModel.java | 6 +++--- .../ai/mistralai/MistralAiChatOptions.java | 6 +++--- .../MistralAiChatCompletionRequestTest.java | 2 +- .../springframework/ai/ollama/OllamaChatModel.java | 6 +++--- .../ai/ollama/api/OllamaOptions.java | 6 +++--- .../ai/ollama/OllamaChatRequestTests.java | 2 +- .../springframework/ai/openai/OpenAiChatModel.java | 6 +++--- .../ai/openai/OpenAiChatOptions.java | 12 ++++++++---- .../ai/openai/ChatCompletionRequestTests.java | 2 +- .../ai/vertexai/gemini/VertexAiGeminiChatModel.java | 6 +++--- .../vertexai/gemini/VertexAiGeminiChatOptions.java | 4 ++-- .../model/tool/DefaultToolCallingChatOptions.java | 6 +++--- .../ai/model/tool/ToolCallingChatOptions.java | 13 ++++++++++++- .../model/tool/ToolExecutionEligibilityChecker.java | 5 +++-- .../tool/DefaultToolCallingChatOptionsTests.java | 6 +++--- 20 files changed, 65 insertions(+), 49 deletions(-) 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 810618615..72e327ed6 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 @@ -416,8 +416,8 @@ public class AnthropicChatModel implements ChatModel { requestOptions.setHttpHeaders( mergeHttpHeaders(runtimeOptions.getHttpHeaders(), this.defaultOptions.getHttpHeaders())); requestOptions.setInternalToolExecutionEnabled( - ModelOptionsUtils.mergeOption(runtimeOptions.isInternalToolExecutionEnabled(), - this.defaultOptions.isInternalToolExecutionEnabled())); + ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(), + this.defaultOptions.getInternalToolExecutionEnabled())); requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(), this.defaultOptions.getToolNames())); requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(), @@ -427,7 +427,7 @@ public class AnthropicChatModel implements ChatModel { } else { requestOptions.setHttpHeaders(this.defaultOptions.getHttpHeaders()); - requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.isInternalToolExecutionEnabled()); + requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled()); requestOptions.setToolNames(this.defaultOptions.getToolNames()); requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks()); requestOptions.setToolContext(this.defaultOptions.getToolContext()); diff --git a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatOptions.java b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatOptions.java index 5dde0cd35..2292041ee 100644 --- a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatOptions.java +++ b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatOptions.java @@ -108,7 +108,7 @@ public class AnthropicChatOptions implements ToolCallingChatOptions { .toolCallbacks( fromOptions.getToolCallbacks() != null ? new ArrayList<>(fromOptions.getToolCallbacks()) : null) .toolNames(fromOptions.getToolNames() != null ? new HashSet<>(fromOptions.getToolNames()) : null) - .internalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()) + .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) .toolContext(fromOptions.getToolContext() != null ? new HashMap<>(fromOptions.getToolContext()) : null) .httpHeaders(fromOptions.getHttpHeaders() != null ? new HashMap<>(fromOptions.getHttpHeaders()) : null) .build(); @@ -216,7 +216,7 @@ public class AnthropicChatOptions implements ToolCallingChatOptions { @Override @Nullable @JsonIgnore - public Boolean isInternalToolExecutionEnabled() { + public Boolean getInternalToolExecutionEnabled() { return this.internalToolExecutionEnabled; } 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 a70780436..e85f9e033 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 @@ -642,8 +642,8 @@ public class AzureOpenAiChatModel implements ChatModel { // Jackson, used by ModelOptionsUtils. if (runtimeOptions != null) { requestOptions.setInternalToolExecutionEnabled( - ModelOptionsUtils.mergeOption(runtimeOptions.isInternalToolExecutionEnabled(), - this.defaultOptions.isInternalToolExecutionEnabled())); + ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(), + this.defaultOptions.getInternalToolExecutionEnabled())); requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(), this.defaultOptions.getToolNames())); requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(), @@ -652,7 +652,7 @@ public class AzureOpenAiChatModel implements ChatModel { this.defaultOptions.getToolContext())); } else { - requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.isInternalToolExecutionEnabled()); + requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled()); requestOptions.setToolNames(this.defaultOptions.getToolNames()); requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks()); requestOptions.setToolContext(this.defaultOptions.getToolContext()); diff --git a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatOptions.java b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatOptions.java index 0cc1177c6..c301bdd1d 100644 --- a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatOptions.java +++ b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatOptions.java @@ -231,7 +231,7 @@ public class AzureOpenAiChatOptions implements ToolCallingChatOptions { @Override @Nullable @JsonIgnore - public Boolean isInternalToolExecutionEnabled() { + public Boolean getInternalToolExecutionEnabled() { return this.internalToolExecutionEnabled; } @@ -265,7 +265,7 @@ public class AzureOpenAiChatOptions implements ToolCallingChatOptions { .topLogprobs(fromOptions.getTopLogProbs()) .enhancements(fromOptions.getEnhancements()) .toolContext(fromOptions.getToolContext() != null ? new HashMap<>(fromOptions.getToolContext()) : null) - .internalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()) + .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) .streamOptions(fromOptions.getStreamOptions()) .toolCallbacks( fromOptions.getToolCallbacks() != null ? new ArrayList<>(fromOptions.getToolCallbacks()) : null) 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 cac64dbb9..1cb4b2e54 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 @@ -301,9 +301,9 @@ public class BedrockProxyChatModel implements ChatModel { : this.defaultOptions.getToolNames()) .toolContext(runtimeOptions.getToolContext() != null ? runtimeOptions.getToolContext() : this.defaultOptions.getToolContext()) - .internalToolExecutionEnabled(runtimeOptions.isInternalToolExecutionEnabled() != null - ? runtimeOptions.isInternalToolExecutionEnabled() - : this.defaultOptions.isInternalToolExecutionEnabled()) + .internalToolExecutionEnabled(runtimeOptions.getInternalToolExecutionEnabled() != null + ? runtimeOptions.getInternalToolExecutionEnabled() + : this.defaultOptions.getInternalToolExecutionEnabled()) .build(); } 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 930f0de07..65eee34aa 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 @@ -399,8 +399,8 @@ public class MistralAiChatModel implements ChatModel { // Jackson, used by ModelOptionsUtils. if (runtimeOptions != null) { requestOptions.setInternalToolExecutionEnabled( - ModelOptionsUtils.mergeOption(runtimeOptions.isInternalToolExecutionEnabled(), - this.defaultOptions.isInternalToolExecutionEnabled())); + ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(), + this.defaultOptions.getInternalToolExecutionEnabled())); requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(), this.defaultOptions.getToolNames())); requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(), @@ -409,7 +409,7 @@ public class MistralAiChatModel implements ChatModel { this.defaultOptions.getToolContext())); } else { - requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.isInternalToolExecutionEnabled()); + requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled()); requestOptions.setToolNames(this.defaultOptions.getToolNames()); requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks()); requestOptions.setToolContext(this.defaultOptions.getToolContext()); diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatOptions.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatOptions.java index 44ab76b63..212f43caa 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatOptions.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatOptions.java @@ -155,7 +155,7 @@ public class MistralAiChatOptions implements ToolCallingChatOptions { .toolChoice(fromOptions.getToolChoice()) .toolCallbacks(fromOptions.getToolCallbacks()) .toolNames(fromOptions.getToolNames()) - .internalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()) + .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) .toolContext(fromOptions.getToolContext()) .build(); } @@ -287,8 +287,8 @@ public class MistralAiChatOptions implements ToolCallingChatOptions { @Override @Nullable @JsonIgnore - public Boolean isInternalToolExecutionEnabled() { - return this.internalToolExecutionEnabled; + public Boolean getInternalToolExecutionEnabled() { + return internalToolExecutionEnabled; } @Override diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTest.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTest.java index 6ef0bf541..379132ce3 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTest.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTest.java @@ -92,7 +92,7 @@ public class MistralAiChatCompletionRequestTest { Prompt prompt = chatModel.buildRequestPrompt(new Prompt("Test message content", runtimeOptions)); assertThat(((ToolCallingChatOptions) prompt.getOptions())).isNotNull(); - assertThat(((ToolCallingChatOptions) prompt.getOptions()).isInternalToolExecutionEnabled()).isFalse(); + assertThat(((ToolCallingChatOptions) prompt.getOptions()).getInternalToolExecutionEnabled()).isFalse(); assertThat(((ToolCallingChatOptions) prompt.getOptions()).getToolCallbacks()).hasSize(2); assertThat(((ToolCallingChatOptions) prompt.getOptions()).getToolCallbacks() .stream() 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 398b74576..bc886108f 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 @@ -389,8 +389,8 @@ public class OllamaChatModel implements ChatModel { // Jackson, used by ModelOptionsUtils. if (runtimeOptions != null) { requestOptions.setInternalToolExecutionEnabled( - ModelOptionsUtils.mergeOption(runtimeOptions.isInternalToolExecutionEnabled(), - this.defaultOptions.isInternalToolExecutionEnabled())); + ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(), + this.defaultOptions.getInternalToolExecutionEnabled())); requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(), this.defaultOptions.getToolNames())); requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(), @@ -399,7 +399,7 @@ public class OllamaChatModel implements ChatModel { this.defaultOptions.getToolContext())); } else { - requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.isInternalToolExecutionEnabled()); + requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled()); requestOptions.setToolNames(this.defaultOptions.getToolNames()); requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks()); requestOptions.setToolContext(this.defaultOptions.getToolContext()); diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaOptions.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaOptions.java index f78caad5e..cde30b619 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaOptions.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaOptions.java @@ -396,7 +396,7 @@ public class OllamaOptions implements ToolCallingChatOptions, EmbeddingOptions { .penalizeNewline(fromOptions.getPenalizeNewline()) .stop(fromOptions.getStop()) .toolNames(fromOptions.getToolNames()) - .internalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()) + .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) .toolCallbacks(fromOptions.getToolCallbacks()) .toolContext(fromOptions.getToolContext()).build(); } @@ -736,9 +736,9 @@ public class OllamaOptions implements ToolCallingChatOptions, EmbeddingOptions { @Override @Nullable @JsonIgnore - public Boolean isInternalToolExecutionEnabled() { + public Boolean getInternalToolExecutionEnabled() { return this.internalToolExecutionEnabled; - } + } @Override @JsonIgnore diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java index 76a07de92..c6d8e61c0 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java @@ -65,7 +65,7 @@ class OllamaChatRequestTests { Prompt prompt = chatModel.buildRequestPrompt(new Prompt("Test message content", runtimeOptions)); assertThat(((ToolCallingChatOptions) prompt.getOptions())).isNotNull(); - assertThat(((ToolCallingChatOptions) prompt.getOptions()).isInternalToolExecutionEnabled()).isFalse(); + assertThat(((ToolCallingChatOptions) prompt.getOptions()).getInternalToolExecutionEnabled()).isFalse(); assertThat(((ToolCallingChatOptions) prompt.getOptions()).getToolCallbacks()).hasSize(2); assertThat(((ToolCallingChatOptions) prompt.getOptions()).getToolCallbacks() .stream() 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 7c036c67d..d6ea170e9 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 @@ -513,8 +513,8 @@ public class OpenAiChatModel implements ChatModel { requestOptions.setHttpHeaders( mergeHttpHeaders(runtimeOptions.getHttpHeaders(), this.defaultOptions.getHttpHeaders())); requestOptions.setInternalToolExecutionEnabled( - ModelOptionsUtils.mergeOption(runtimeOptions.isInternalToolExecutionEnabled(), - this.defaultOptions.isInternalToolExecutionEnabled())); + ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(), + this.defaultOptions.getInternalToolExecutionEnabled())); requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(), this.defaultOptions.getToolNames())); requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(), @@ -524,7 +524,7 @@ public class OpenAiChatModel implements ChatModel { } else { requestOptions.setHttpHeaders(this.defaultOptions.getHttpHeaders()); - requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.isInternalToolExecutionEnabled()); + requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled()); requestOptions.setToolNames(this.defaultOptions.getToolNames()); requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks()); requestOptions.setToolContext(this.defaultOptions.getToolContext()); diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java index 36460af4d..27ce5326c 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatOptions.java @@ -255,7 +255,7 @@ public class OpenAiChatOptions implements ToolCallingChatOptions { fromOptions.getToolCallbacks() != null ? new ArrayList<>(fromOptions.getToolCallbacks()) : null) .toolNames(fromOptions.getToolNames() != null ? new HashSet<>(fromOptions.getToolNames()) : null) .httpHeaders(fromOptions.getHttpHeaders() != null ? new HashMap<>(fromOptions.getHttpHeaders()) : null) - .internalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()) + .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) .toolContext(fromOptions.getToolContext() != null ? new HashMap<>(fromOptions.getToolContext()) : null) .store(fromOptions.getStore()) .metadata(fromOptions.getMetadata()) @@ -444,7 +444,11 @@ public class OpenAiChatOptions implements ToolCallingChatOptions { @Deprecated @JsonIgnore public Boolean getProxyToolCalls() { - return this.internalToolExecutionEnabled != null ? !this.internalToolExecutionEnabled : null; + return this.getToolExecutionEnabled() != null ? !this.internalToolExecutionEnabled : null; + } + + private Boolean getToolExecutionEnabled() { + return this.internalToolExecutionEnabled; } @Deprecated @@ -501,8 +505,8 @@ public class OpenAiChatOptions implements ToolCallingChatOptions { @Override @Nullable @JsonIgnore - public Boolean isInternalToolExecutionEnabled() { - return this.internalToolExecutionEnabled; + public Boolean getInternalToolExecutionEnabled() { + return internalToolExecutionEnabled; } @Override diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java index 928691dba..7d85cd3fe 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/ChatCompletionRequestTests.java @@ -62,7 +62,7 @@ class ChatCompletionRequestTests { Prompt prompt = chatModel.buildRequestPrompt(new Prompt("Test message content", runtimeOptions)); assertThat(((ToolCallingChatOptions) prompt.getOptions())).isNotNull(); - assertThat(((ToolCallingChatOptions) prompt.getOptions()).isInternalToolExecutionEnabled()).isFalse(); + assertThat(((ToolCallingChatOptions) prompt.getOptions()).getInternalToolExecutionEnabled()).isFalse(); assertThat(((ToolCallingChatOptions) prompt.getOptions()).getToolCallbacks()).hasSize(2); assertThat(((ToolCallingChatOptions) prompt.getOptions()).getToolCallbacks() .stream() 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 268cbf3ae..8d9a4278b 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 @@ -503,8 +503,8 @@ public class VertexAiGeminiChatModel implements ChatModel, DisposableBean { // Jackson, used by ModelOptionsUtils. if (runtimeOptions != null) { requestOptions.setInternalToolExecutionEnabled( - ModelOptionsUtils.mergeOption(runtimeOptions.isInternalToolExecutionEnabled(), - this.defaultOptions.isInternalToolExecutionEnabled())); + ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(), + this.defaultOptions.getInternalToolExecutionEnabled())); requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(), this.defaultOptions.getToolNames())); requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(), @@ -518,7 +518,7 @@ public class VertexAiGeminiChatModel implements ChatModel, DisposableBean { this.defaultOptions.getSafetySettings())); } else { - requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.isInternalToolExecutionEnabled()); + requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled()); requestOptions.setToolNames(this.defaultOptions.getToolNames()); requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks()); requestOptions.setToolContext(this.defaultOptions.getToolContext()); diff --git a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatOptions.java b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatOptions.java index c262d3141..8b5f8619c 100644 --- a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatOptions.java +++ b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatOptions.java @@ -148,7 +148,7 @@ public class VertexAiGeminiChatOptions implements ToolCallingChatOptions { options.setResponseMimeType(fromOptions.getResponseMimeType()); options.setGoogleSearchRetrieval(fromOptions.getGoogleSearchRetrieval()); options.setSafetySettings(fromOptions.getSafetySettings()); - options.setInternalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()); + options.setInternalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()); options.setToolContext(fromOptions.getToolContext()); return options; } @@ -287,7 +287,7 @@ public class VertexAiGeminiChatOptions implements ToolCallingChatOptions { @Override @Nullable - public Boolean isInternalToolExecutionEnabled() { + public Boolean getInternalToolExecutionEnabled() { return this.internalToolExecutionEnabled; } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java index dce2f9208..f5eca5496 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java @@ -109,7 +109,7 @@ public class DefaultToolCallingChatOptions implements ToolCallingChatOptions { @Override @Nullable - public Boolean isInternalToolExecutionEnabled() { + public Boolean getInternalToolExecutionEnabled() { return this.internalToolExecutionEnabled; } @@ -141,7 +141,7 @@ public class DefaultToolCallingChatOptions implements ToolCallingChatOptions { @Override @Nullable public Boolean getProxyToolCalls() { - return isInternalToolExecutionEnabled() != null ? !isInternalToolExecutionEnabled() : null; + return getInternalToolExecutionEnabled() != null ? !getInternalToolExecutionEnabled() : null; } @Override @@ -236,7 +236,7 @@ public class DefaultToolCallingChatOptions implements ToolCallingChatOptions { options.setToolCallbacks(getToolCallbacks()); options.setToolNames(getToolNames()); options.setToolContext(getToolContext()); - options.setInternalToolExecutionEnabled(isInternalToolExecutionEnabled()); + options.setInternalToolExecutionEnabled(getInternalToolExecutionEnabled()); options.setModel(getModel()); options.setFrequencyPenalty(getFrequencyPenalty()); options.setMaxTokens(getMaxTokens()); diff --git a/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java index 7651861c6..4ade97a9c 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java @@ -37,6 +37,7 @@ import org.springframework.util.CollectionUtils; * including tool calling. * * @author Thomas Vitale + * @author Ilayaperumal Gopinathan * @since 1.0.0 */ public interface ToolCallingChatOptions extends FunctionCallingOptions { @@ -68,7 +69,17 @@ public interface ToolCallingChatOptions extends FunctionCallingOptions { * the model or if the tools should be executed directly by the caller. */ @Nullable - Boolean isInternalToolExecutionEnabled(); + Boolean getInternalToolExecutionEnabled(); + + /** + * Whether the {@link ChatModel} is responsible for executing the tools requested by + * the model or if the tools should be executed directly by the caller. + */ + @Nullable + @Deprecated + default Boolean isInternalToolExecutionEnabled() { + return getInternalToolExecutionEnabled(); + } /** * Set whether the {@link ChatModel} is responsible for executing the tools requested diff --git a/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolExecutionEligibilityChecker.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolExecutionEligibilityChecker.java index 2376bc2e1..031522883 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolExecutionEligibilityChecker.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolExecutionEligibilityChecker.java @@ -65,8 +65,9 @@ public interface ToolExecutionEligibilityChecker extends Function