From 12077ab387025a6ec1c4b23bee35e21aeccc834e 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 81061861596..72e327ed623 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 @@ Prompt buildRequestPrompt(Prompt prompt) { 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 @@ Prompt buildRequestPrompt(Prompt prompt) { } 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 5dde0cd3527..2292041ee5d 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 static AnthropicChatOptions fromOptions(AnthropicChatOptions fromOptions) .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 void setToolNames(Set toolNames) { @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 a70780436a1..e85f9e03342 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 @@ Prompt buildRequestPrompt(Prompt prompt) { // 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 @@ Prompt buildRequestPrompt(Prompt prompt) { 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 0cc1177c6d0..c301bdd1d4f 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 void setToolNames(Set toolNames) { @Override @Nullable @JsonIgnore - public Boolean isInternalToolExecutionEnabled() { + public Boolean getInternalToolExecutionEnabled() { return this.internalToolExecutionEnabled; } @@ -265,7 +265,7 @@ public static AzureOpenAiChatOptions fromOptions(AzureOpenAiChatOptions fromOpti .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 cac64dbb954..1cb4b2e547f 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 @@ Prompt buildRequestPrompt(Prompt prompt) { : 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 930f0de079c..65eee34aa94 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 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionCallingOp // 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 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionCallingOp 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 44ab76b6347..212f43caa19 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 static MistralAiChatOptions fromOptions(MistralAiChatOptions fromOptions) .toolChoice(fromOptions.getToolChoice()) .toolCallbacks(fromOptions.getToolCallbacks()) .toolNames(fromOptions.getToolNames()) - .internalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()) + .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) .toolContext(fromOptions.getToolContext()) .build(); } @@ -287,8 +287,8 @@ public void setToolNames(Set toolNames) { @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 6ef0bf541a6..379132ce361 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 @@ void whenToolRuntimeOptionsThenMergeWithDefaults() { 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 398b7457647..bc886108fc8 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 @@ Prompt buildRequestPrompt(Prompt prompt) { // 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 @@ Prompt buildRequestPrompt(Prompt prompt) { 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 f78caad5e3a..cde30b6190d 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 static OllamaOptions fromOptions(OllamaOptions fromOptions) { .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 void setToolNames(Set toolNames) { @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 76a07de9223..c6d8e61c04b 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 @@ void whenToolRuntimeOptionsThenMergeWithDefaults() { 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 7c036c67d3d..d6ea170e979 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 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionCallingOp 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 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionCallingOp } 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 36460af4d98..27ce5326c36 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 static OpenAiChatOptions fromOptions(OpenAiChatOptions fromOptions) { 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 void setToolChoice(Object toolChoice) { @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 void setToolNames(Set toolNames) { @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 928691dbaf1..7d85cd3fe4f 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 @@ void whenToolRuntimeOptionsThenMergeWithDefaults() { 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 268cbf3ae94..8d9a4278b21 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 @@ Prompt buildRequestPrompt(Prompt prompt) { // 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 @@ Prompt buildRequestPrompt(Prompt prompt) { 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 c262d31410b..8b5f8619ccf 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 static VertexAiGeminiChatOptions fromOptions(VertexAiGeminiChatOptions fr 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 void setToolNames(Set toolNames) { @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 dce2f920848..f5eca5496c0 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 void setToolContext(Map toolContext) { @Override @Nullable - public Boolean isInternalToolExecutionEnabled() { + public Boolean getInternalToolExecutionEnabled() { return this.internalToolExecutionEnabled; } @@ -141,7 +141,7 @@ public void setFunctions(Set functions) { @Override @Nullable public Boolean getProxyToolCalls() { - return isInternalToolExecutionEnabled() != null ? !isInternalToolExecutionEnabled() : null; + return getInternalToolExecutionEnabled() != null ? !getInternalToolExecutionEnabled() : null; } @Override @@ -236,7 +236,7 @@ public T copy() { 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 7651861c649..4ade97a9c87 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 @@ * 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 2376bc2e1b2..031522883e8 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 @@ default boolean isInternalToolExecutionEnabled(ChatOptions chatOptions) { Assert.notNull(chatOptions, "chatOptions cannot be null"); boolean internalToolExecutionEnabled; if (chatOptions instanceof ToolCallingChatOptions toolCallingChatOptions - && toolCallingChatOptions.isInternalToolExecutionEnabled() != null) { - internalToolExecutionEnabled = Boolean.TRUE.equals(toolCallingChatOptions.isInternalToolExecutionEnabled()); + && toolCallingChatOptions.getInternalToolExecutionEnabled() != null) { + internalToolExecutionEnabled = Boolean.TRUE + .equals(toolCallingChatOptions.getInternalToolExecutionEnabled()); } else if (chatOptions instanceof FunctionCallingOptions functionCallingOptions && functionCallingOptions.getProxyToolCalls() != null) { diff --git a/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java index e121d95b96a..0f42925b553 100644 --- a/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java @@ -150,7 +150,7 @@ void copyShouldCreateNewInstanceWithSameValues() { assertThat(c.getToolCallbacks()).isEqualTo(original.getToolCallbacks()); assertThat(c.getToolNames()).isEqualTo(original.getToolNames()); assertThat(c.getToolContext()).isEqualTo(original.getToolContext()); - assertThat(c.isInternalToolExecutionEnabled()).isEqualTo(original.isInternalToolExecutionEnabled()); + assertThat(c.getInternalToolExecutionEnabled()).isEqualTo(original.getInternalToolExecutionEnabled()); assertThat(c.getModel()).isEqualTo(original.getModel()); assertThat(c.getTemperature()).isEqualTo(original.getTemperature()); }); @@ -195,7 +195,7 @@ void builderShouldCreateOptionsWithAllProperties() { assertThat(o.getToolCallbacks()).containsExactly(callback); assertThat(o.getToolNames()).containsExactly("tool1"); assertThat(o.getToolContext()).isEqualTo(context); - assertThat(o.isInternalToolExecutionEnabled()).isTrue(); + assertThat(o.getInternalToolExecutionEnabled()).isTrue(); assertThat(o.getModel()).isEqualTo("gpt-4"); assertThat(o.getTemperature()).isEqualTo(0.7); assertThat(o.getMaxTokens()).isEqualTo(100); @@ -236,7 +236,7 @@ void deprecatedMethodsShouldWorkCorrectly() { assertThat(options.getProxyToolCalls()).isFalse(); options.setProxyToolCalls(true); - assertThat(options.isInternalToolExecutionEnabled()).isFalse(); + assertThat(options.getInternalToolExecutionEnabled()).isFalse(); } }