From e06d20fea52c3487f68ce1cab34dcd7f89e1bf9a Mon Sep 17 00:00:00 2001 From: Thomas Vitale Date: Sun, 2 Feb 2025 22:04:59 +0100 Subject: [PATCH] Advancing Tool Support - Part 5 * Introduced new ToolParam annotation for defining a description for tool parameters and marking them as (non)required. * Improved the JSON Schema generation for tools, solving inconsistencies between methods and functions, and ensuring a predictable outcome. * Added support for returning tool results directly to the user instead of passing them back to the model. Introduced new ToolExecutionResult API to propagate this information. * Consolidated naming of tool-related options in ToolCallingChatOptions. * Fixed varargs issue in ChatClient when passing ToolCallback[]. * Introduced new documentation for the tool calling capabilities in Spring AI, and deprecated the old one. * Bumped jsonschema dependency to 4.37.0. Relates to gh-2049 Signed-off-by: Thomas Vitale --- .../ai/ollama/OllamaChatModel.java | 39 +- .../ai/ollama/api/OllamaOptions.java | 20 +- ...texAiGeminiChatModelFunctionCallingIT.java | 4 +- pom.xml | 2 +- .../ai/chat/client/ChatClient.java | 6 +- .../ai/chat/client/DefaultChatClient.java | 36 +- .../chat/client/DefaultChatClientBuilder.java | 13 +- .../tool/DefaultToolCallingChatOptions.java | 38 +- .../model/tool/DefaultToolCallingManager.java | 32 +- .../tool/DefaultToolExecutionResult.java | 67 +++ .../model/tool/LegacyToolCallingManager.java | 10 +- .../ai/model/tool/ToolCallingChatOptions.java | 8 +- .../ai/model/tool/ToolCallingManager.java | 3 +- .../ai/model/tool/ToolExecutionResult.java | 86 ++++ .../ai/tool/annotation/ToolParam.java | 46 +++ .../ai/tool/definition/ToolDefinition.java | 2 +- .../tool/function/FunctionToolCallback.java | 2 +- .../SpringBeanToolCallbackResolver.java | 4 +- .../ai/util/json/JsonSchemaGenerator.java | 192 --------- .../util/json/schema/JsonSchemaGenerator.java | 268 ++++++++++++ .../ai/util/json/{ => schema}/SchemaType.java | 2 +- .../json/schema/SpringAiSchemaModule.java | 127 ++++++ .../ai/util/json/schema/package-info.java | 22 + .../chat/client/DefaultChatClientTests.java | 2 +- .../DefaultToolCallingChatOptionsTests.java | 56 +-- .../tool/DefaultToolCallingManagerTests.java | 108 ++++- .../tool/DefaultToolExecutionResultTests.java | 61 +++ .../tool/LegacyToolCallingManagerTests.java | 20 +- .../model/tool/ToolExecutionResultTests.java | 82 ++++ .../function/FunctionToolCallbackTests.java | 2 +- .../SpringBeanToolCallbackResolverTests.java | 2 +- .../util/json/JsonSchemaGeneratorTests.java | 388 +++++++++++++++++- ...ringBeanToolCallbackResolverKotlinTests.kt | 6 +- .../ROOT/images/tools/tool-calling-01.png | Bin 0 -> 387269 bytes .../src/main/antora/modules/ROOT/nav.adoc | 3 +- .../antora/modules/ROOT/pages/api/tools.adoc | 318 ++++++++++++++ .../tests/tool/ToolCallingManagerTests.java | 21 +- .../tool/FunctionCallWithFunctionBeanIT.java | 4 +- .../tool/FunctionCallWithFunctionBeanIT.java | 8 +- .../ollama/tool/OllamaFunctionCallbackIT.java | 4 +- .../ollama/tool/OllamaFunctionToolBeanIT.java | 4 +- ...nctionCallbackWithPlainFunctionBeanIT.java | 10 +- 42 files changed, 1746 insertions(+), 382 deletions(-) create mode 100644 spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java create mode 100644 spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java create mode 100644 spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java delete mode 100644 spring-ai-core/src/main/java/org/springframework/ai/util/json/JsonSchemaGenerator.java create mode 100644 spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java rename spring-ai-core/src/main/java/org/springframework/ai/util/json/{ => schema}/SchemaType.java (94%) create mode 100644 spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java create mode 100644 spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/package-info.java create mode 100644 spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java create mode 100644 spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java create mode 100644 spring-ai-docs/src/main/antora/modules/ROOT/images/tools/tool-calling-01.png create mode 100644 spring-ai-docs/src/main/antora/modules/ROOT/pages/api/tools.adoc 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 12eef975255..f970249ab7e 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 @@ -31,6 +31,7 @@ import org.springframework.ai.model.tool.LegacyToolCallingManager; import org.springframework.ai.model.tool.ToolCallingChatOptions; import org.springframework.ai.model.tool.ToolCallingManager; +import org.springframework.ai.model.tool.ToolExecutionResult; import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.util.json.JsonParser; import reactor.core.publisher.Flux; @@ -271,10 +272,19 @@ private ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespon if (ToolCallingChatOptions.isInternalToolExecutionEnabled(prompt.getOptions()) && response != null && response.hasToolCalls()) { - var toolCallConversation = this.toolCallingManager.executeToolCalls(prompt, response); - // Recursively call the call method with the tool call message - // conversation that contains the call responses. - return this.internalCall(new Prompt(toolCallConversation, prompt.getOptions()), response); + var toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, response); + if (toolExecutionResult.returnDirect()) { + // Return tool execution result directly to the client. + return ChatResponse.builder() + .from(response) + .generations(ToolExecutionResult.buildGenerations(toolExecutionResult)) + .build(); + } + else { + // Send the tool execution result back to the model. + return this.internalCall(new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()), + response); + } } return response; @@ -335,10 +345,17 @@ private Flux internalStream(Prompt prompt, ChatResponse previousCh // @formatter:off Flux chatResponseFlux = chatResponse.flatMap(response -> { if (ToolCallingChatOptions.isInternalToolExecutionEnabled(prompt.getOptions()) && response.hasToolCalls()) { - var toolCallConversation = this.toolCallingManager.executeToolCalls(prompt, response); - // Recursively call the stream method with the tool call message - // conversation that contains the call responses. - return this.internalStream(new Prompt(toolCallConversation, prompt.getOptions()), response); + var toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, response); + if (toolExecutionResult.returnDirect()) { + // Return tool execution result directly to the client. + return Flux.just(ChatResponse.builder().from(response) + .generations(ToolExecutionResult.buildGenerations(toolExecutionResult)) + .build()); + } else { + // Send the tool execution result back to the model. + return this.internalStream(new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()), + response); + } } else { return Flux.just(response); @@ -379,13 +396,13 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionCallingOp // Merge tool names and tool callbacks explicitly since they are ignored by // Jackson, used by ModelOptionsUtils. if (runtimeOptions != null) { - requestOptions.setTools( - ToolCallingChatOptions.mergeToolNames(runtimeOptions.getTools(), this.defaultOptions.getTools())); + requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(), + this.defaultOptions.getToolNames())); requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(), this.defaultOptions.getToolCallbacks())); } else { - requestOptions.setTools(this.defaultOptions.getTools()); + requestOptions.setToolNames(this.defaultOptions.getToolNames()); requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks()); } 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 af36cd39412..fc815202b3f 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 @@ -383,7 +383,7 @@ public static OllamaOptions fromOptions(OllamaOptions fromOptions) { .mirostatEta(fromOptions.getMirostatEta()) .penalizeNewline(fromOptions.getPenalizeNewline()) .stop(fromOptions.getStop()) - .tools(fromOptions.getTools()) + .toolNames(fromOptions.getToolNames()) .internalToolExecutionEnabled(fromOptions.isInternalToolExecutionEnabled()) .toolCallbacks(fromOptions.getToolCallbacks()) .toolContext(fromOptions.getToolContext()).build(); @@ -700,13 +700,13 @@ public void setToolCallbacks(List toolCallbacks) { @Override @JsonIgnore - public Set getTools() { + public Set getToolNames() { return this.toolNames; } @Override @JsonIgnore - public void setTools(Set toolNames) { + public void setToolNames(Set toolNames) { Assert.notNull(toolNames, "toolNames cannot be null"); Assert.noNullElements(toolNames, "toolNames cannot contain null elements"); toolNames.forEach(tool -> Assert.hasText(tool, "toolNames cannot contain empty elements")); @@ -744,14 +744,14 @@ public void setFunctionCallbacks(List functionCallbacks) { @Deprecated @JsonIgnore public Set getFunctions() { - return this.getTools(); + return this.getToolNames(); } @Override @Deprecated @JsonIgnore public void setFunctions(Set functions) { - this.setTools(functions); + this.setToolNames(functions); } @Override @@ -1028,12 +1028,12 @@ public Builder toolCallbacks(FunctionCallback... toolCallbacks) { return this; } - public Builder tools(Set toolNames) { - this.options.setTools(toolNames); + public Builder toolNames(Set toolNames) { + this.options.setToolNames(toolNames); return this; } - public Builder tools(String... toolNames) { + public Builder toolNames(String... toolNames) { Assert.notNull(toolNames, "toolNames cannot be null"); this.options.toolNames.addAll(Set.of(toolNames)); return this; @@ -1051,12 +1051,12 @@ public Builder functionCallbacks(List functionCallbacks) { @Deprecated public Builder functions(Set functions) { - return tools(functions); + return toolNames(functions); } @Deprecated public Builder function(String functionName) { - return tools(functionName); + return toolNames(functionName); } @Deprecated 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 0e61e6d85f8..a5e83fa1552 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 @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 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. @@ -34,7 +34,7 @@ import org.springframework.ai.chat.model.Generation; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.function.FunctionToolCallback; -import org.springframework.ai.util.json.JsonSchemaGenerator; +import org.springframework.ai.util.json.schema.JsonSchemaGenerator; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel; import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatOptions; import org.springframework.beans.factory.annotation.Autowired; diff --git a/pom.xml b/pom.xml index 591b4981062..5f6beed1ddb 100644 --- a/pom.xml +++ b/pom.xml @@ -189,7 +189,7 @@ 26.48.0 1.9.1 9.20.0 - 4.35.0 + 4.37.0 2.2.25 2.0.3 diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java index 7fd359b10a6..fad1ff7c521 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java @@ -216,9 +216,9 @@ interface ChatClientRequestSpec { ChatClientRequestSpec tools(String... toolNames); - ChatClientRequestSpec tools(Object... toolObjects); + ChatClientRequestSpec tools(FunctionCallback... toolCallbacks); - // ChatClientRequestSpec toolCallbacks(FunctionCallback... toolCallbacks); + ChatClientRequestSpec tools(Object... toolObjects); @Deprecated ChatClientRequestSpec functions(FunctionCallback... functionCallbacks); @@ -281,6 +281,8 @@ interface Builder { Builder defaultTools(String... toolNames); + Builder defaultTools(FunctionCallback... toolCallbacks); + Builder defaultTools(Object... toolObjects); /** diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java index c06452c5aaa..d6086ad9121 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java @@ -845,42 +845,28 @@ public ChatClientRequestSpec tools(String... toolNames) { return this; } + @Override + public ChatClientRequestSpec tools(FunctionCallback... toolCallbacks) { + Assert.notNull(toolCallbacks, "toolCallbacks cannot be null"); + Assert.noNullElements(toolCallbacks, "toolCallbacks cannot contain null elements"); + this.functionCallbacks.addAll(List.of(toolCallbacks)); + return this; + } + @Override public ChatClientRequestSpec tools(Object... toolObjects) { Assert.notNull(toolObjects, "toolObjects cannot be null"); Assert.noNullElements(toolObjects, "toolObjects cannot contain null elements"); - - List functionCallbacks = new ArrayList<>(); - List nonFunctinCallbacks = new ArrayList<>(); - for (Object toolObject : toolObjects) { - if (toolObject instanceof FunctionCallback) { - functionCallbacks.add((FunctionCallback) toolObject); - } - else { - nonFunctinCallbacks.add(toolObject); - } - } - this.functionCallbacks.addAll(functionCallbacks); - this.functionCallbacks.addAll(Arrays - .asList(ToolCallbacks.from(nonFunctinCallbacks.toArray(new Object[nonFunctinCallbacks.size()])))); + this.functionCallbacks.addAll(Arrays.asList(ToolCallbacks.from(toolObjects))); return this; } - // @Override - // public ChatClientRequestSpec toolCallbacks(FunctionCallback... toolCallbacks) { - // Assert.notNull(toolCallbacks, "toolCallbacks cannot be null"); - // Assert.noNullElements(toolCallbacks, "toolCallbacks cannot contain null - // elements"); - // this.functionCallbacks.addAll(Arrays.asList(toolCallbacks)); - // return this; - // } - - @Deprecated + @Deprecated // Use tools() public ChatClientRequestSpec functions(String... functionBeanNames) { return tools(functionBeanNames); } - @Deprecated + @Deprecated // Use tools() public ChatClientRequestSpec functions(FunctionCallback... functionCallbacks) { Assert.notNull(functionCallbacks, "functionCallbacks cannot be null"); Assert.noNullElements(functionCallbacks, "functionCallbacks cannot contain null elements"); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java index d5a56599026..676e8f2243e 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java @@ -35,7 +35,6 @@ import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.tool.ToolCallbacks; import org.springframework.core.io.Resource; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -151,7 +150,13 @@ public Builder defaultSystem(Consumer systemSpecConsumer) { @Override public Builder defaultTools(String... toolNames) { - this.defaultRequest.functions(toolNames); + this.defaultRequest.tools(toolNames); + return this; + } + + @Override + public Builder defaultTools(FunctionCallback... toolCallbacks) { + this.defaultRequest.tools(toolCallbacks); return this; } @@ -161,12 +166,14 @@ public Builder defaultTools(Object... toolObjects) { return this; } + @Deprecated // Use defaultTools() public Builder defaultFunction(String name, String description, java.util.function.Function function) { this.defaultRequest .functions(FunctionCallback.builder().function(name, function).description(description).build()); return this; } + @Deprecated // Use defaultTools() public Builder defaultFunction(String name, String description, java.util.function.BiFunction biFunction) { this.defaultRequest @@ -174,11 +181,13 @@ public Builder defaultFunction(String name, String description, return this; } + @Deprecated // Use defaultTools() public Builder defaultFunctions(String... functionNames) { this.defaultRequest.functions(functionNames); return this; } + @Deprecated // Use defaultTools() public Builder defaultFunctions(FunctionCallback... functionCallbacks) { this.defaultRequest.functions(functionCallbacks); return this; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java index 61b3d52ac22..327435a5800 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java @@ -39,7 +39,7 @@ public class DefaultToolCallingChatOptions implements ToolCallingChatOptions { private List toolCallbacks = new ArrayList<>(); - private Set tools = new HashSet<>(); + private Set toolNames = new HashSet<>(); private Map toolContext = new HashMap<>(); @@ -83,16 +83,16 @@ public void setToolCallbacks(List toolCallbacks) { } @Override - public Set getTools() { - return Set.copyOf(this.tools); + public Set getToolNames() { + return Set.copyOf(this.toolNames); } @Override - public void setTools(Set tools) { - Assert.notNull(tools, "tools cannot be null"); - Assert.noNullElements(tools, "tools cannot contain null elements"); - tools.forEach(tool -> Assert.hasText(tool, "tools cannot contain empty elements")); - this.tools = new HashSet<>(tools); + public void setToolNames(Set toolNames) { + Assert.notNull(toolNames, "toolNames cannot be null"); + Assert.noNullElements(toolNames, "toolNames cannot contain null elements"); + toolNames.forEach(toolName -> Assert.hasText(toolName, "toolNames cannot contain empty elements")); + this.toolNames = new HashSet<>(toolNames); } @Override @@ -130,12 +130,12 @@ public void setFunctionCallbacks(List functionCallbacks) { @Override public Set getFunctions() { - return getTools(); + return getToolNames(); } @Override public void setFunctions(Set functions) { - setTools(functions); + setToolNames(functions); } @Override @@ -234,7 +234,7 @@ public void setTopP(@Nullable Double topP) { public T copy() { DefaultToolCallingChatOptions options = new DefaultToolCallingChatOptions(); options.setToolCallbacks(getToolCallbacks()); - options.setTools(getTools()); + options.setToolNames(getToolNames()); options.setToolContext(getToolContext()); options.setInternalToolExecutionEnabled(isInternalToolExecutionEnabled()); options.setModel(getModel()); @@ -273,15 +273,15 @@ public ToolCallingChatOptions.Builder toolCallbacks(FunctionCallback... toolCall } @Override - public ToolCallingChatOptions.Builder tools(Set toolNames) { - this.options.setTools(toolNames); + public ToolCallingChatOptions.Builder toolNames(Set toolNames) { + this.options.setToolNames(toolNames); return this; } @Override - public ToolCallingChatOptions.Builder tools(String... toolNames) { + public ToolCallingChatOptions.Builder toolNames(String... toolNames) { Assert.notNull(toolNames, "toolNames cannot be null"); - this.options.setTools(Set.of(toolNames)); + this.options.setToolNames(Set.of(toolNames)); return this; } @@ -322,15 +322,15 @@ public ToolCallingChatOptions.Builder functionCallbacks(FunctionCallback... func } @Override - @Deprecated // Use tools() instead + @Deprecated // Use toolNames() instead public ToolCallingChatOptions.Builder functions(Set functions) { - return tools(functions); + return toolNames(functions); } @Override - @Deprecated // Use tools() instead + @Deprecated // Use toolNames() instead public ToolCallingChatOptions.Builder function(String function) { - return tools(function); + return toolNames(function); } @Override diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java index a266f376f97..56cdfc8f8b2 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java @@ -89,7 +89,7 @@ public List resolveToolDefinitions(ToolCallingChatOptions chatOp Assert.notNull(chatOptions, "chatOptions cannot be null"); List toolCallbacks = new ArrayList<>(chatOptions.getToolCallbacks()); - for (String toolName : chatOptions.getTools()) { + for (String toolName : chatOptions.getToolNames()) { FunctionCallback toolCallback = toolCallbackResolver.resolve(toolName); if (toolCallback == null) { throw new IllegalStateException("No ToolCallback found for tool name: " + toolName); @@ -112,7 +112,7 @@ public List resolveToolDefinitions(ToolCallingChatOptions chatOp } @Override - public List executeToolCalls(Prompt prompt, ChatResponse chatResponse) { + public ToolExecutionResult executeToolCalls(Prompt prompt, ChatResponse chatResponse) { Assert.notNull(prompt, "prompt cannot be null"); Assert.notNull(chatResponse, "chatResponse cannot be null"); @@ -129,10 +129,16 @@ public List executeToolCalls(Prompt prompt, ChatResponse chatResponse) ToolContext toolContext = buildToolContext(prompt, assistantMessage); - ToolResponseMessage toolMessageResponse = executeToolCall(prompt, assistantMessage, toolContext); + InternalToolExecutionResult internalToolExecutionResult = executeToolCall(prompt, assistantMessage, + toolContext); - return buildConversationHistoryAfterToolExecution(prompt.getInstructions(), assistantMessage, - toolMessageResponse); + List conversationHistory = buildConversationHistoryAfterToolExecution(prompt.getInstructions(), + assistantMessage, internalToolExecutionResult.toolResponseMessage()); + + return ToolExecutionResult.builder() + .conversationHistory(conversationHistory) + .returnDirect(internalToolExecutionResult.returnDirect()) + .build(); } private static ToolContext buildToolContext(Prompt prompt, AssistantMessage assistantMessage) { @@ -166,7 +172,7 @@ private static List buildConversationHistoryBeforeToolExecution(Prompt * compatibility, both {@link ToolCallback} and {@link FunctionCallback} are * supported. */ - private ToolResponseMessage executeToolCall(Prompt prompt, AssistantMessage assistantMessage, + private InternalToolExecutionResult executeToolCall(Prompt prompt, AssistantMessage assistantMessage, ToolContext toolContext) { List toolCallbacks = List.of(); if (prompt.getOptions() instanceof ToolCallingChatOptions toolCallingChatOptions) { @@ -178,6 +184,8 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionOptions) List toolResponses = new ArrayList<>(); + Boolean returnDirect = null; + for (AssistantMessage.ToolCall toolCall : assistantMessage.getToolCalls()) { logger.debug("Executing tool call: {}", toolCall.name()); @@ -194,6 +202,13 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionOptions) throw new IllegalStateException("No ToolCallback found for tool name: " + toolName); } + if (returnDirect == null && toolCallback instanceof ToolCallback callback) { + returnDirect = callback.getToolMetadata().returnDirect(); + } + else if (toolCallback instanceof ToolCallback callback) { + returnDirect = returnDirect && callback.getToolMetadata().returnDirect(); + } + String toolResult; try { toolResult = toolCallback.call(toolInputArguments, toolContext); @@ -205,7 +220,7 @@ else if (prompt.getOptions() instanceof FunctionCallingOptions functionOptions) toolResponses.add(new ToolResponseMessage.ToolResponse(toolCall.id(), toolName, toolResult)); } - return new ToolResponseMessage(toolResponses, Map.of()); + return new InternalToolExecutionResult(new ToolResponseMessage(toolResponses, Map.of()), returnDirect); } private List buildConversationHistoryAfterToolExecution(List previousMessages, @@ -216,6 +231,9 @@ private List buildConversationHistoryAfterToolExecution(List p return messages; } + private record InternalToolExecutionResult(ToolResponseMessage toolResponseMessage, boolean returnDirect) { + } + public static Builder builder() { return new Builder(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java new file mode 100644 index 00000000000..5129fe40f3f --- /dev/null +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java @@ -0,0 +1,67 @@ +/* + * Copyright 2023-2025 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.tool; + +import org.springframework.ai.chat.messages.Message; +import org.springframework.util.Assert; + +import java.util.List; + +/** + * Default implementation of {@link ToolExecutionResult}. + * + * @author Thomas Vitale + * @since 1.0.0 + */ +public record DefaultToolExecutionResult(List conversationHistory, + boolean returnDirect) implements ToolExecutionResult { + + public DefaultToolExecutionResult { + Assert.notNull(conversationHistory, "conversationHistory cannot be null"); + Assert.noNullElements(conversationHistory, "conversationHistory cannot contain null elements"); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private List conversationHistory = List.of(); + + private boolean returnDirect; + + private Builder() { + } + + public Builder conversationHistory(List conversationHistory) { + this.conversationHistory = conversationHistory; + return this; + } + + public Builder returnDirect(boolean returnDirect) { + this.returnDirect = returnDirect; + return this; + } + + public DefaultToolExecutionResult build() { + return new DefaultToolExecutionResult(conversationHistory, returnDirect); + } + + } + +} diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java index ae12fb05d3a..3922c44760c 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java @@ -75,7 +75,7 @@ public List resolveToolDefinitions(ToolCallingChatOptions chatOp Assert.notNull(chatOptions, "chatOptions cannot be null"); List toolCallbacks = new ArrayList<>(chatOptions.getToolCallbacks()); - for (String toolName : chatOptions.getTools()) { + for (String toolName : chatOptions.getToolNames()) { FunctionCallback toolCallback = resolveFunctionCallback(toolName); if (toolCallback == null) { throw new IllegalStateException("No ToolCallback found for tool name: " + toolName); @@ -107,7 +107,7 @@ private FunctionCallback resolveFunctionCallback(String toolName) { } @Override - public List executeToolCalls(Prompt prompt, ChatResponse chatResponse) { + public ToolExecutionResult executeToolCalls(Prompt prompt, ChatResponse chatResponse) { Assert.notNull(prompt, "prompt cannot be null"); Assert.notNull(chatResponse, "chatResponse cannot be null"); @@ -126,8 +126,10 @@ public List executeToolCalls(Prompt prompt, ChatResponse chatResponse) ToolResponseMessage toolMessageResponse = executeToolCall(prompt, assistantMessage, toolContext); - return buildConversationHistoryAfterToolExecution(prompt.getInstructions(), assistantMessage, - toolMessageResponse); + List conversationHistory = buildConversationHistoryAfterToolExecution(prompt.getInstructions(), + assistantMessage, toolMessageResponse); + + return ToolExecutionResult.builder().conversationHistory(conversationHistory).returnDirect(false).build(); } private static ToolContext buildToolContext(Prompt prompt, AssistantMessage assistantMessage) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java index 32aed320eff..6be2cf37d37 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java @@ -53,12 +53,12 @@ public interface ToolCallingChatOptions extends FunctionCallingOptions { /** * Names of the tools to register with the ChatModel. */ - Set getTools(); + Set getToolNames(); /** * Set the names of the tools to register with the ChatModel. */ - void setTools(Set toolNames); + void setToolNames(Set toolNames); /** * Whether the {@link ChatModel} is responsible for executing the tools requested by @@ -98,12 +98,12 @@ interface Builder extends FunctionCallingOptions.Builder { /** * Names of the tools to register with the ChatModel. */ - Builder tools(Set toolNames); + Builder toolNames(Set toolNames); /** * Names of the tools to register with the ChatModel. */ - Builder tools(String... toolNames); + Builder toolNames(String... toolNames); /** * Whether the {@link ChatModel} is responsible for executing the tools requested diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java index 63e7ba5cbe6..c93a38a21d6 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java @@ -16,7 +16,6 @@ package org.springframework.ai.model.tool; -import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.definition.ToolDefinition; @@ -39,7 +38,7 @@ public interface ToolCallingManager { /** * Execute the tool calls requested by the model. */ - List executeToolCalls(Prompt prompt, ChatResponse chatResponse); + ToolExecutionResult executeToolCalls(Prompt prompt, ChatResponse chatResponse); /** * Create a default {@link ToolCallingManager} builder. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java new file mode 100644 index 00000000000..41db567d493 --- /dev/null +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java @@ -0,0 +1,86 @@ +/* + * Copyright 2023-2025 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.tool; + +import org.springframework.ai.chat.messages.AssistantMessage; +import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.messages.ToolResponseMessage; +import org.springframework.ai.chat.metadata.ChatGenerationMetadata; +import org.springframework.ai.chat.model.Generation; + +import java.util.ArrayList; +import java.util.List; + +/** + * The result of a tool execution. + * + * @author Thomas Vitale + * @since 1.0.0 + */ +public interface ToolExecutionResult { + + String FINISH_REASON = "returnDirect"; + + String METADATA_TOOL_ID = "toolId"; + + String METADATA_TOOL_NAME = "toolName"; + + /** + * The history of messages exchanged during the conversation, including the tool + * execution result. + */ + List conversationHistory(); + + /** + * Whether the tool execution result should be returned directly or passed back to the + * model. + */ + default boolean returnDirect() { + return false; + } + + /** + * Create a default {@link ToolExecutionResult} builder. + */ + static DefaultToolExecutionResult.Builder builder() { + return DefaultToolExecutionResult.builder(); + } + + /** + * Build a list of {@link Generation} from the tool execution result, useful for + * sending the tool execution result to the client directly. + */ + static List buildGenerations(ToolExecutionResult toolExecutionResult) { + List conversationHistory = toolExecutionResult.conversationHistory(); + List generations = new ArrayList<>(); + if (conversationHistory + .get(conversationHistory.size() - 1) instanceof ToolResponseMessage toolResponseMessage) { + toolResponseMessage.getResponses().forEach(response -> { + AssistantMessage assistantMessage = new AssistantMessage(response.responseData()); + Generation generation = new Generation(assistantMessage, + ChatGenerationMetadata.builder() + .metadata(METADATA_TOOL_ID, response.id()) + .metadata(METADATA_TOOL_NAME, response.name()) + .finishReason(FINISH_REASON) + .build()); + generations.add(generation); + }); + } + return generations; + } + +} diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java new file mode 100644 index 00000000000..2414e4caecc --- /dev/null +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java @@ -0,0 +1,46 @@ +/* + * Copyright 2023-2025 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.tool.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Marks a tool argument. + * + * @author Thomas Vitale + * @since 1.0.0 + */ +@Target({ ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ToolParam { + + /** + * Whether the tool argument is required. + */ + boolean required() default true; + + /** + * The description of the tool argument. + */ + String description() default ""; + +} diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java index 699c69acbee..19dc017814f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java @@ -17,7 +17,7 @@ package org.springframework.ai.tool.definition; import org.springframework.ai.tool.util.ToolUtils; -import org.springframework.ai.util.json.JsonSchemaGenerator; +import org.springframework.ai.util.json.schema.JsonSchemaGenerator; import org.springframework.util.Assert; import java.lang.reflect.Method; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java index 8d635a6f47e..b4d3c89d129 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java @@ -32,7 +32,7 @@ import org.springframework.ai.tool.metadata.ToolMetadata; import org.springframework.ai.tool.util.ToolUtils; import org.springframework.ai.util.json.JsonParser; -import org.springframework.ai.util.json.JsonSchemaGenerator; +import org.springframework.ai.util.json.schema.JsonSchemaGenerator; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.log.LogAccessor; import org.springframework.lang.Nullable; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java b/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java index 5465ee83629..69398dc6338 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java @@ -26,8 +26,8 @@ import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.function.FunctionToolCallback; import org.springframework.ai.tool.util.ToolUtils; -import org.springframework.ai.util.json.JsonSchemaGenerator; -import org.springframework.ai.util.json.SchemaType; +import org.springframework.ai.util.json.schema.JsonSchemaGenerator; +import org.springframework.ai.util.json.schema.SchemaType; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Description; import org.springframework.context.support.GenericApplicationContext; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/JsonSchemaGenerator.java b/spring-ai-core/src/main/java/org/springframework/ai/util/json/JsonSchemaGenerator.java deleted file mode 100644 index 6e6bb0bbb13..00000000000 --- a/spring-ai-core/src/main/java/org/springframework/ai/util/json/JsonSchemaGenerator.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright 2023-2025 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.util.json; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.github.victools.jsonschema.generator.Option; -import com.github.victools.jsonschema.generator.OptionPreset; -import com.github.victools.jsonschema.generator.SchemaGenerator; -import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; -import com.github.victools.jsonschema.generator.SchemaVersion; -import com.github.victools.jsonschema.module.jackson.JacksonModule; -import com.github.victools.jsonschema.module.jackson.JacksonOption; -import com.github.victools.jsonschema.module.swagger2.Swagger2Module; -import org.springframework.util.Assert; - -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -/** - * Utilities to generate JSON Schemas from Java entities. - */ -public final class JsonSchemaGenerator { - - private static final SchemaGenerator TYPE_SCHEMA_GENERATOR; - - private static final SchemaGenerator SUBTYPE_SCHEMA_GENERATOR; - - /* - * Initialize JSON Schema generators. - */ - static { - var schemaGeneratorConfigBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, - OptionPreset.PLAIN_JSON) - .with(new JacksonModule(JacksonOption.RESPECT_JSONPROPERTY_REQUIRED)) - .with(new Swagger2Module()) - .with(Option.EXTRA_OPEN_API_FORMAT_VALUES) - .with(Option.PLAIN_DEFINITION_KEYS); - - var typeSchemaGeneratorConfig = schemaGeneratorConfigBuilder.without(Option.SCHEMA_VERSION_INDICATOR).build(); - TYPE_SCHEMA_GENERATOR = new SchemaGenerator(typeSchemaGeneratorConfig); - - var subtypeSchemaGeneratorConfig = schemaGeneratorConfigBuilder.build(); - SUBTYPE_SCHEMA_GENERATOR = new SchemaGenerator(subtypeSchemaGeneratorConfig); - } - - private JsonSchemaGenerator() { - } - - /** - * Generate a JSON Schema for a method's input parameters. - */ - public static String generateForMethodInput(Method method, SchemaOption... schemaOptions) { - ObjectNode schema = JsonParser.getObjectMapper().createObjectNode(); - schema.put("$schema", SchemaVersion.DRAFT_2020_12.getIdentifier()); - schema.put("type", "object"); - - ObjectNode properties = schema.putObject("properties"); - List required = new ArrayList<>(); - - for (int i = 0; i < method.getParameterCount(); i++) { - var parameterName = method.getParameters()[i].getName(); - var parameterType = method.getGenericParameterTypes()[i]; - if (isMethodParameterRequired(method, i)) { - required.add(parameterName); - } - properties.set(parameterName, SUBTYPE_SCHEMA_GENERATOR.generateSchema(parameterType)); - } - - var requiredArray = schema.putArray("required"); - if (Stream.of(schemaOptions).anyMatch(option -> option == SchemaOption.RESPECT_JSON_PROPERTY_REQUIRED)) { - required.forEach(requiredArray::add); - } - else { - Stream.of(method.getParameters()).map(Parameter::getName).forEach(requiredArray::add); - } - - if (Stream.of(schemaOptions) - .noneMatch(option -> option == SchemaOption.ALLOW_ADDITIONAL_PROPERTIES_BY_DEFAULT)) { - schema.put("additionalProperties", false); - } - - if (Stream.of(schemaOptions).anyMatch(option -> option == SchemaOption.UPPER_CASE_TYPE_VALUES)) { - convertTypeValuesToUpperCase(schema); - } - - return schema.toPrettyString(); - } - - /** - * Generate a JSON Schema for a class type. - */ - public static String generateForType(Type type, SchemaOption... schemaOptions) { - Assert.notNull(type, "type cannot be null"); - ObjectNode schema = TYPE_SCHEMA_GENERATOR.generateSchema(type); - if ((type == Void.class) && !schema.has("properties")) { - schema.putObject("properties"); - } - if (Stream.of(schemaOptions) - .noneMatch(option -> option == SchemaOption.ALLOW_ADDITIONAL_PROPERTIES_BY_DEFAULT)) { - schema.put("additionalProperties", false); - } - if (Stream.of(schemaOptions).anyMatch(option -> option == SchemaOption.UPPER_CASE_TYPE_VALUES)) { - convertTypeValuesToUpperCase(schema); - } - return schema.toPrettyString(); - } - - private static boolean isMethodParameterRequired(Method method, int index) { - var jsonPropertyAnnotation = method.getParameters()[index].getAnnotation(JsonProperty.class); - if (jsonPropertyAnnotation == null) { - return false; - } - return jsonPropertyAnnotation.required(); - } - - // Based on the method in ModelOptionsUtils. - private static void convertTypeValuesToUpperCase(ObjectNode node) { - if (node.isObject()) { - node.fields().forEachRemaining(entry -> { - JsonNode value = entry.getValue(); - if (value.isObject()) { - convertTypeValuesToUpperCase((ObjectNode) value); - } - else if (value.isArray()) { - value.elements().forEachRemaining(element -> { - if (element.isObject() || element.isArray()) { - convertTypeValuesToUpperCase((ObjectNode) element); - } - }); - } - else if (value.isTextual() && entry.getKey().equals("type")) { - String oldValue = node.get("type").asText(); - node.put("type", oldValue.toUpperCase()); - } - }); - } - else if (node.isArray()) { - node.elements().forEachRemaining(element -> { - if (element.isObject() || element.isArray()) { - convertTypeValuesToUpperCase((ObjectNode) element); - } - }); - } - } - - /** - * Options for generating JSON Schemas. - */ - public enum SchemaOption { - - /** - * Properties are only required if marked as such via the Jackson annotation - * "@JsonProperty(required = true)". Beware, that OpenAI requires all properties - * to be required. - */ - RESPECT_JSON_PROPERTY_REQUIRED, - - /** - * Allow additional properties by default. Beware, that OpenAI requires additional - * properties NOT to be allowed. - */ - ALLOW_ADDITIONAL_PROPERTIES_BY_DEFAULT, - - /** - * Convert all "type" values to upper case. For example, it's require in OpenAPI - * 3.0 with Vertex AI. - */ - UPPER_CASE_TYPE_VALUES; - - } - -} diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java new file mode 100644 index 00000000000..e66227933fb --- /dev/null +++ b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java @@ -0,0 +1,268 @@ +/* + * Copyright 2023-2025 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.util.json.schema; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.github.victools.jsonschema.generator.Module; +import com.github.victools.jsonschema.generator.Option; +import com.github.victools.jsonschema.generator.OptionPreset; +import com.github.victools.jsonschema.generator.SchemaGenerator; +import com.github.victools.jsonschema.generator.SchemaGeneratorConfig; +import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; +import com.github.victools.jsonschema.generator.SchemaVersion; +import com.github.victools.jsonschema.module.jackson.JacksonModule; +import com.github.victools.jsonschema.module.jackson.JacksonOption; +import com.github.victools.jsonschema.module.swagger2.Swagger2Module; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.ai.tool.annotation.ToolParam; +import org.springframework.ai.util.json.JsonParser; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +/** + * Utilities to generate JSON Schemas from Java types and method signatures. It's designed + * to work well in the context of tool calling and structured outputs, aiming at ensuring + * consistency and robustness across different model providers. + *

+ * Metadata such as descriptions and required properties can be specified using one of the + * following supported annotations: + *

+ *

    + *
  • {@code @ToolParam(required = ..., description = ...)}
  • + *
  • {@code @JsonProperty(required = ...)}
  • + *
  • {@code @Schema(required = ..., description = ...)}
  • + *
  • {@code @Nullable}
  • + *
+ *

+ * If none of these annotations are present, the default behavior is to consider the + * property as required and not to include a description. + *

+ * + * @author Thomas Vitale + * @since 1.0.0 + */ +public final class JsonSchemaGenerator { + + /** + * To ensure consistency and robustness across different model providers, all + * properties in the JSON Schema are considered required by default. This behavior can + * be overridden by setting the {@link ToolParam#required()}, + * {@link JsonProperty#required()}, or {@link Schema#requiredMode()}} annotation. + */ + private static final boolean PROPERTY_REQUIRED_BY_DEFAULT = true; + + private static final SchemaGenerator TYPE_SCHEMA_GENERATOR; + + private static final SchemaGenerator SUBTYPE_SCHEMA_GENERATOR; + + /* + * Initialize JSON Schema generators. + */ + static { + Module jacksonModule = new JacksonModule(JacksonOption.RESPECT_JSONPROPERTY_REQUIRED); + Module openApiModule = new Swagger2Module(); + Module springAiSchemaModule = PROPERTY_REQUIRED_BY_DEFAULT ? new SpringAiSchemaModule() + : new SpringAiSchemaModule(SpringAiSchemaModule.Option.PROPERTY_REQUIRED_FALSE_BY_DEFAULT); + + SchemaGeneratorConfigBuilder schemaGeneratorConfigBuilder = new SchemaGeneratorConfigBuilder( + SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON) + .with(jacksonModule) + .with(openApiModule) + .with(springAiSchemaModule) + .with(Option.EXTRA_OPEN_API_FORMAT_VALUES) + .with(Option.PLAIN_DEFINITION_KEYS); + + SchemaGeneratorConfig typeSchemaGeneratorConfig = schemaGeneratorConfigBuilder.build(); + TYPE_SCHEMA_GENERATOR = new SchemaGenerator(typeSchemaGeneratorConfig); + + SchemaGeneratorConfig subtypeSchemaGeneratorConfig = schemaGeneratorConfigBuilder + .without(Option.SCHEMA_VERSION_INDICATOR) + .build(); + SUBTYPE_SCHEMA_GENERATOR = new SchemaGenerator(subtypeSchemaGeneratorConfig); + } + + private JsonSchemaGenerator() { + } + + /** + * Generate a JSON Schema for a method's input parameters. + */ + public static String generateForMethodInput(Method method, SchemaOption... schemaOptions) { + ObjectNode schema = JsonParser.getObjectMapper().createObjectNode(); + schema.put("$schema", SchemaVersion.DRAFT_2020_12.getIdentifier()); + schema.put("type", "object"); + + ObjectNode properties = schema.putObject("properties"); + List required = new ArrayList<>(); + + for (int i = 0; i < method.getParameterCount(); i++) { + String parameterName = method.getParameters()[i].getName(); + Type parameterType = method.getGenericParameterTypes()[i]; + if (isMethodParameterRequired(method, i)) { + required.add(parameterName); + } + ObjectNode parameterNode = SUBTYPE_SCHEMA_GENERATOR.generateSchema(parameterType); + String parameterDescription = getMethodParameterDescription(method, i); + if (StringUtils.hasText(parameterDescription)) { + parameterNode.put("description", parameterDescription); + } + properties.set(parameterName, parameterNode); + } + + var requiredArray = schema.putArray("required"); + required.forEach(requiredArray::add); + + processSchemaOptions(schemaOptions, schema); + + return schema.toPrettyString(); + } + + /** + * Generate a JSON Schema for a class type. + */ + public static String generateForType(Type type, SchemaOption... schemaOptions) { + Assert.notNull(type, "type cannot be null"); + ObjectNode schema = TYPE_SCHEMA_GENERATOR.generateSchema(type); + if ((type == Void.class) && !schema.has("properties")) { + schema.putObject("properties"); + } + processSchemaOptions(schemaOptions, schema); + return schema.toPrettyString(); + } + + private static void processSchemaOptions(SchemaOption[] schemaOptions, ObjectNode schema) { + if (Stream.of(schemaOptions) + .noneMatch(option -> option == SchemaOption.ALLOW_ADDITIONAL_PROPERTIES_BY_DEFAULT)) { + schema.put("additionalProperties", false); + } + if (Stream.of(schemaOptions).anyMatch(option -> option == SchemaOption.UPPER_CASE_TYPE_VALUES)) { + convertTypeValuesToUpperCase(schema); + } + } + + /** + * Determines whether a property is required based on the presence of a series of + * annotations. + *

+ * - {@code @ToolParam(required = ...)} - {@code @JsonProperty(required = ...)} - + * {@code @Schema(required = ...)} + *

+ * If none of these annotations are present, the default behavior is to consider the + * property as required. + */ + private static boolean isMethodParameterRequired(Method method, int index) { + Parameter parameter = method.getParameters()[index]; + + var toolParamAnnotation = parameter.getAnnotation(ToolParam.class); + if (toolParamAnnotation != null) { + return toolParamAnnotation.required(); + } + + var propertyAnnotation = parameter.getAnnotation(JsonProperty.class); + if (propertyAnnotation != null) { + return propertyAnnotation.required(); + } + + var schemaAnnotation = parameter.getAnnotation(Schema.class); + if (schemaAnnotation != null) { + return schemaAnnotation.requiredMode() == Schema.RequiredMode.REQUIRED + || schemaAnnotation.requiredMode() == Schema.RequiredMode.AUTO || schemaAnnotation.required(); + } + + var nullableAnnotation = parameter.getAnnotation(Nullable.class); + if (nullableAnnotation != null) { + return false; + } + + return PROPERTY_REQUIRED_BY_DEFAULT; + } + + @Nullable + private static String getMethodParameterDescription(Method method, int index) { + Parameter parameter = method.getParameters()[index]; + + var toolParamAnnotation = parameter.getAnnotation(ToolParam.class); + if (toolParamAnnotation != null && StringUtils.hasText(toolParamAnnotation.description())) { + return toolParamAnnotation.description(); + } + + var schemaAnnotation = parameter.getAnnotation(Schema.class); + if (schemaAnnotation != null && StringUtils.hasText(schemaAnnotation.description())) { + return schemaAnnotation.description(); + } + + return null; + } + + // Based on the method in ModelOptionsUtils. + private static void convertTypeValuesToUpperCase(ObjectNode node) { + if (node.isObject()) { + node.fields().forEachRemaining(entry -> { + JsonNode value = entry.getValue(); + if (value.isObject()) { + convertTypeValuesToUpperCase((ObjectNode) value); + } + else if (value.isArray()) { + value.elements().forEachRemaining(element -> { + if (element.isObject() || element.isArray()) { + convertTypeValuesToUpperCase((ObjectNode) element); + } + }); + } + else if (value.isTextual() && entry.getKey().equals("type")) { + String oldValue = node.get("type").asText(); + node.put("type", oldValue.toUpperCase()); + } + }); + } + else if (node.isArray()) { + node.elements().forEachRemaining(element -> { + if (element.isObject() || element.isArray()) { + convertTypeValuesToUpperCase((ObjectNode) element); + } + }); + } + } + + /** + * Options for generating JSON Schemas. + */ + public enum SchemaOption { + + /** + * Allow an object to contain additional key/values not defined in the schema. + */ + ALLOW_ADDITIONAL_PROPERTIES_BY_DEFAULT, + + /** + * Convert all "type" values to upper case. + */ + UPPER_CASE_TYPE_VALUES; + + } + +} diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/SchemaType.java b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java similarity index 94% rename from spring-ai-core/src/main/java/org/springframework/ai/util/json/SchemaType.java rename to spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java index 9a9c988ff56..29b4df27834 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/util/json/SchemaType.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.util.json; +package org.springframework.ai.util.json.schema; /** * The type of schema to generate for a given Java type. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java new file mode 100644 index 00000000000..4ec861d7f87 --- /dev/null +++ b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java @@ -0,0 +1,127 @@ +/* + * Copyright 2023-2025 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.util.json.schema; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.victools.jsonschema.generator.FieldScope; +import com.github.victools.jsonschema.generator.MemberScope; +import com.github.victools.jsonschema.generator.Module; +import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; +import com.github.victools.jsonschema.generator.SchemaGeneratorConfigPart; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.ai.tool.annotation.ToolParam; +import org.springframework.lang.Nullable; +import org.springframework.util.StringUtils; + +import java.util.stream.Stream; + +/** + * JSON Schema Generator Module for Spring AI. + *

+ * This module provides a set of customizations to the JSON Schema generator to support + * the Spring AI framework. It allows to extract descriptions from + * {@code @ToolParam(description = ...)} annotations and to determine whether a property + * is required based on the presence of a series of annotations. + * + * @author Thomas Vitale + * @since 1.0.0 + */ +public final class SpringAiSchemaModule implements Module { + + private final boolean requiredByDefault; + + public SpringAiSchemaModule(Option... options) { + this.requiredByDefault = Stream.of(options) + .noneMatch(option -> option == Option.PROPERTY_REQUIRED_FALSE_BY_DEFAULT); + } + + @Override + public void applyToConfigBuilder(SchemaGeneratorConfigBuilder builder) { + this.applyToConfigBuilder(builder.forFields()); + } + + private void applyToConfigBuilder(SchemaGeneratorConfigPart configPart) { + configPart.withDescriptionResolver(this::resolveDescription); + configPart.withRequiredCheck(this::checkRequired); + } + + /** + * Extract description from {@code @ToolParam(description = ...)} for the given field. + */ + @Nullable + private String resolveDescription(MemberScope member) { + var toolParamAnnotation = member.getAnnotationConsideringFieldAndGetter(ToolParam.class); + if (toolParamAnnotation != null && StringUtils.hasText(toolParamAnnotation.description())) { + return toolParamAnnotation.description(); + } + return null; + } + + /** + * Determines whether a property is required based on the presence of a series of + * annotations. + *

+ *

    + *
  • {@code @ToolParam(required = ...)}
  • + *
  • {@code @JsonProperty(required = ...)}
  • + *
  • {@code @Schema(required = ...)}
  • + *
  • {@code @Nullable}
  • + *
+ *

+ * If none of these annotations are present, the default behavior is to consider the + * property as required, unless the {@link Option#PROPERTY_REQUIRED_FALSE_BY_DEFAULT} + * option is set. + */ + private boolean checkRequired(MemberScope member) { + var toolParamAnnotation = member.getAnnotationConsideringFieldAndGetter(ToolParam.class); + if (toolParamAnnotation != null) { + return toolParamAnnotation.required(); + } + + var propertyAnnotation = member.getAnnotationConsideringFieldAndGetter(JsonProperty.class); + if (propertyAnnotation != null) { + return propertyAnnotation.required(); + } + + var schemaAnnotation = member.getAnnotationConsideringFieldAndGetter(Schema.class); + if (schemaAnnotation != null) { + return schemaAnnotation.requiredMode() == Schema.RequiredMode.REQUIRED + || schemaAnnotation.requiredMode() == Schema.RequiredMode.AUTO || schemaAnnotation.required(); + } + + var nullableAnnotation = member.getAnnotationConsideringFieldAndGetter(Nullable.class); + if (nullableAnnotation != null) { + return false; + } + + return this.requiredByDefault; + } + + /** + * Options for customizing the behavior of the module. + */ + public enum Option { + + /** + * Properties are only required if marked as such via one of the supported + * annotations. + */ + PROPERTY_REQUIRED_FALSE_BY_DEFAULT; + + } + +} diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/package-info.java b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/package-info.java new file mode 100644 index 00000000000..410ac072767 --- /dev/null +++ b/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/package-info.java @@ -0,0 +1,22 @@ +/* + * Copyright 2023-2025 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. + */ + +@NonNullApi +@NonNullFields +package org.springframework.ai.util.json.schema; + +import org.springframework.lang.NonNullApi; +import org.springframework.lang.NonNullFields; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java index c29d874955a..8570bd9efda 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java @@ -1375,7 +1375,7 @@ void whenToolCallbacksElementIsNullThenThrow() { ChatClient.ChatClientRequestSpec spec = chatClient.prompt(); assertThatThrownBy(() -> spec.tools(mock(ToolCallback.class), null)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolObjects cannot contain null elements"); + .hasMessage("toolCallbacks cannot contain null elements"); } @Test diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java index 7f93db1e149..7c53cb7d1d3 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java @@ -68,50 +68,50 @@ void setToolCallbacksShouldRejectNullList() { } @Test - void setToolsShouldStoreTools() { + void setToolNamesShouldStoreToolNames() { DefaultToolCallingChatOptions options = new DefaultToolCallingChatOptions(); - Set tools = Set.of("tool1", "tool2"); + Set toolNames = Set.of("tool1", "tool2"); - options.setTools(tools); + options.setToolNames(toolNames); - assertThat(options.getTools()).hasSize(2).containsExactlyInAnyOrderElementsOf(tools); + assertThat(options.getToolNames()).hasSize(2).containsExactlyInAnyOrderElementsOf(toolNames); } @Test - void setToolsWithVarargsShouldStoreTools() { + void setToolNamesWithVarargsShouldStoreToolNames() { DefaultToolCallingChatOptions options = new DefaultToolCallingChatOptions(); - options.setTools(Set.of("tool1", "tool2")); + options.setToolNames(Set.of("tool1", "tool2")); - assertThat(options.getTools()).hasSize(2).containsExactlyInAnyOrder("tool1", "tool2"); + assertThat(options.getToolNames()).hasSize(2).containsExactlyInAnyOrder("tool1", "tool2"); } @Test - void setToolsShouldRejectNullSet() { + void setToolNamesShouldRejectNullSet() { DefaultToolCallingChatOptions options = new DefaultToolCallingChatOptions(); - assertThatThrownBy(() -> options.setTools((Set) null)).isInstanceOf(IllegalArgumentException.class) - .hasMessage("tools cannot be null"); + assertThatThrownBy(() -> options.setToolNames(null)).isInstanceOf(IllegalArgumentException.class) + .hasMessage("toolNames cannot be null"); } @Test - void setToolsShouldRejectNullElements() { + void setToolNamesShouldRejectNullElements() { DefaultToolCallingChatOptions options = new DefaultToolCallingChatOptions(); - Set tools = new HashSet<>(); - tools.add(null); + Set toolNames = new HashSet<>(); + toolNames.add(null); - assertThatThrownBy(() -> options.setTools(tools)).isInstanceOf(IllegalArgumentException.class) - .hasMessage("tools cannot contain null elements"); + assertThatThrownBy(() -> options.setToolNames(toolNames)).isInstanceOf(IllegalArgumentException.class) + .hasMessage("toolNames cannot contain null elements"); } @Test - void setToolsShouldRejectEmptyElements() { + void setToolNamesShouldRejectEmptyElements() { DefaultToolCallingChatOptions options = new DefaultToolCallingChatOptions(); - Set tools = new HashSet<>(); - tools.add(""); + Set toolNames = new HashSet<>(); + toolNames.add(""); - assertThatThrownBy(() -> options.setTools(tools)).isInstanceOf(IllegalArgumentException.class) - .hasMessage("tools cannot contain empty elements"); + assertThatThrownBy(() -> options.setToolNames(toolNames)).isInstanceOf(IllegalArgumentException.class) + .hasMessage("toolNames cannot contain empty elements"); } @Test @@ -137,7 +137,7 @@ void copyShouldCreateNewInstanceWithSameValues() { DefaultToolCallingChatOptions original = new DefaultToolCallingChatOptions(); ToolCallback callback = mock(ToolCallback.class); original.setToolCallbacks(List.of(callback)); - original.setTools(Set.of("tool1")); + original.setToolNames(Set.of("tool1")); original.setToolContext(Map.of("key", "value")); original.setInternalToolExecutionEnabled(true); original.setModel("gpt-4"); @@ -147,7 +147,7 @@ void copyShouldCreateNewInstanceWithSameValues() { assertThat(copy).isNotSameAs(original).satisfies(c -> { assertThat(c.getToolCallbacks()).isEqualTo(original.getToolCallbacks()); - assertThat(c.getTools()).isEqualTo(original.getTools()); + assertThat(c.getToolNames()).isEqualTo(original.getToolNames()); assertThat(c.getToolContext()).isEqualTo(original.getToolContext()); assertThat(c.isInternalToolExecutionEnabled()).isEqualTo(original.isInternalToolExecutionEnabled()); assertThat(c.getModel()).isEqualTo(original.getModel()); @@ -160,12 +160,12 @@ void gettersShouldReturnImmutableCollections() { DefaultToolCallingChatOptions options = new DefaultToolCallingChatOptions(); ToolCallback callback = mock(ToolCallback.class); options.setToolCallbacks(List.of(callback)); - options.setTools(Set.of("tool1")); + options.setToolNames(Set.of("tool1")); options.setToolContext(Map.of("key", "value")); assertThatThrownBy(() -> options.getToolCallbacks().add(mock(ToolCallback.class))) .isInstanceOf(UnsupportedOperationException.class); - assertThatThrownBy(() -> options.getTools().add("tool2")).isInstanceOf(UnsupportedOperationException.class); + assertThatThrownBy(() -> options.getToolNames().add("tool2")).isInstanceOf(UnsupportedOperationException.class); assertThatThrownBy(() -> options.getToolContext().put("key2", "value2")) .isInstanceOf(UnsupportedOperationException.class); } @@ -177,7 +177,7 @@ void builderShouldCreateOptionsWithAllProperties() { ToolCallingChatOptions options = DefaultToolCallingChatOptions.builder() .toolCallbacks(List.of(callback)) - .tools(Set.of("tool1")) + .toolNames(Set.of("tool1")) .toolContext(context) .internalToolExecutionEnabled(true) .model("gpt-4") @@ -192,7 +192,7 @@ void builderShouldCreateOptionsWithAllProperties() { assertThat(options).satisfies(o -> { assertThat(o.getToolCallbacks()).containsExactly(callback); - assertThat(o.getTools()).containsExactly("tool1"); + assertThat(o.getToolNames()).containsExactly("tool1"); assertThat(o.getToolContext()).isEqualTo(context); assertThat(o.isInternalToolExecutionEnabled()).isTrue(); assertThat(o.getModel()).isEqualTo("gpt-4"); @@ -225,11 +225,11 @@ void deprecatedMethodsShouldWorkCorrectly() { options.setFunctionCallbacks(List.of(callback1, callback2)); assertThat(options.getFunctionCallbacks()).hasSize(2); - options.setTools(Set.of("tool1")); + options.setToolNames(Set.of("tool1")); assertThat(options.getFunctions()).containsExactly("tool1"); options.setFunctions(Set.of("function1")); - assertThat(options.getTools()).containsExactly("function1"); + assertThat(options.getToolNames()).containsExactly("function1"); options.setInternalToolExecutionEnabled(true); assertThat(options.getProxyToolCalls()).isFalse(); diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java index 5529b8f7b6c..f86ad1c1968 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java @@ -19,7 +19,6 @@ import io.micrometer.observation.ObservationRegistry; import org.junit.jupiter.api.Test; import org.springframework.ai.chat.messages.AssistantMessage; -import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatResponse; @@ -29,6 +28,7 @@ import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.tool.execution.ToolCallExceptionConverter; import org.springframework.ai.tool.execution.ToolExecutionException; +import org.springframework.ai.tool.metadata.ToolMetadata; import org.springframework.ai.tool.resolution.StaticToolCallbackResolver; import org.springframework.ai.tool.resolution.ToolCallbackResolver; @@ -101,7 +101,7 @@ void whenToolCallbackExistsThenResolve() { .build(); List toolDefinitions = toolCallingManager - .resolveToolDefinitions(ToolCallingChatOptions.builder().tools("toolA").build()); + .resolveToolDefinitions(ToolCallingChatOptions.builder().toolNames("toolA").build()); assertThat(toolDefinitions).containsExactly(toolCallback.getToolDefinition()); } @@ -114,7 +114,7 @@ void whenToolCallbackDoesNotExistThenThrow() { .build(); assertThatThrownBy(() -> toolCallingManager - .resolveToolDefinitions(ToolCallingChatOptions.builder().tools("toolB").build())) + .resolveToolDefinitions(ToolCallingChatOptions.builder().toolNames("toolB").build())) .isInstanceOf(IllegalStateException.class) .hasMessage("No ToolCallback found for tool name: toolB"); } @@ -163,9 +163,32 @@ void whenSingleToolCallInChatResponseThenExecute() { ToolResponseMessage expectedToolResponse = new ToolResponseMessage( List.of(new ToolResponseMessage.ToolResponse("toolA", "toolA", "Mission accomplished!"))); - List toolCallHistory = toolCallingManager.executeToolCalls(prompt, chatResponse); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); - assertThat(toolCallHistory).contains(expectedToolResponse); + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + } + + @Test + void whenSingleToolCallWithReturnDirectInChatResponseThenExecute() { + ToolCallback toolCallback = new TestToolCallback("toolA", true); + ToolCallbackResolver toolCallbackResolver = new StaticToolCallbackResolver(List.of(toolCallback)); + ToolCallingManager toolCallingManager = DefaultToolCallingManager.builder() + .toolCallbackResolver(toolCallbackResolver) + .build(); + + Prompt prompt = new Prompt(new UserMessage("Hello"), ToolCallingChatOptions.builder().build()); + ChatResponse chatResponse = ChatResponse.builder() + .generations(List.of(new Generation(new AssistantMessage("", Map.of(), + List.of(new AssistantMessage.ToolCall("toolA", "function", "toolA", "{}")))))) + .build(); + + ToolResponseMessage expectedToolResponse = new ToolResponseMessage( + List.of(new ToolResponseMessage.ToolResponse("toolA", "toolA", "Mission accomplished!"))); + + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); + + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + assertThat(toolExecutionResult.returnDirect()).isTrue(); } @Test @@ -189,9 +212,63 @@ void whenMultipleToolCallsInChatResponseThenExecute() { List.of(new ToolResponseMessage.ToolResponse("toolA", "toolA", "Mission accomplished!"), new ToolResponseMessage.ToolResponse("toolB", "toolB", "Mission accomplished!"))); - List toolCallHistory = toolCallingManager.executeToolCalls(prompt, chatResponse); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); - assertThat(toolCallHistory).contains(expectedToolResponse); + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + } + + @Test + void whenMultipleToolCallsWithReturnDirectInChatResponseThenExecute() { + ToolCallback toolCallbackA = new TestToolCallback("toolA", true); + ToolCallback toolCallbackB = new TestToolCallback("toolB", true); + ToolCallbackResolver toolCallbackResolver = new StaticToolCallbackResolver( + List.of(toolCallbackA, toolCallbackB)); + ToolCallingManager toolCallingManager = DefaultToolCallingManager.builder() + .toolCallbackResolver(toolCallbackResolver) + .build(); + + Prompt prompt = new Prompt(new UserMessage("Hello"), ToolCallingChatOptions.builder().build()); + ChatResponse chatResponse = ChatResponse.builder() + .generations(List.of(new Generation(new AssistantMessage("", Map.of(), + List.of(new AssistantMessage.ToolCall("toolA", "function", "toolA", "{}"), + new AssistantMessage.ToolCall("toolB", "function", "toolB", "{}")))))) + .build(); + + ToolResponseMessage expectedToolResponse = new ToolResponseMessage( + List.of(new ToolResponseMessage.ToolResponse("toolA", "toolA", "Mission accomplished!"), + new ToolResponseMessage.ToolResponse("toolB", "toolB", "Mission accomplished!"))); + + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); + + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + assertThat(toolExecutionResult.returnDirect()).isTrue(); + } + + @Test + void whenMultipleToolCallsWithMixedReturnDirectInChatResponseThenExecute() { + ToolCallback toolCallbackA = new TestToolCallback("toolA", true); + ToolCallback toolCallbackB = new TestToolCallback("toolB", false); + ToolCallbackResolver toolCallbackResolver = new StaticToolCallbackResolver( + List.of(toolCallbackA, toolCallbackB)); + ToolCallingManager toolCallingManager = DefaultToolCallingManager.builder() + .toolCallbackResolver(toolCallbackResolver) + .build(); + + Prompt prompt = new Prompt(new UserMessage("Hello"), ToolCallingChatOptions.builder().build()); + ChatResponse chatResponse = ChatResponse.builder() + .generations(List.of(new Generation(new AssistantMessage("", Map.of(), + List.of(new AssistantMessage.ToolCall("toolA", "function", "toolA", "{}"), + new AssistantMessage.ToolCall("toolB", "function", "toolB", "{}")))))) + .build(); + + ToolResponseMessage expectedToolResponse = new ToolResponseMessage( + List.of(new ToolResponseMessage.ToolResponse("toolA", "toolA", "Mission accomplished!"), + new ToolResponseMessage.ToolResponse("toolB", "toolB", "Mission accomplished!"))); + + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); + + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + assertThat(toolExecutionResult.returnDirect()).isFalse(); } @Test @@ -211,17 +288,25 @@ void whenToolCallWithExceptionThenReturnError() { ToolResponseMessage expectedToolResponse = new ToolResponseMessage( List.of(new ToolResponseMessage.ToolResponse("toolC", "toolC", "You failed this city!"))); - List toolCallHistory = toolCallingManager.executeToolCalls(prompt, chatResponse); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); - assertThat(toolCallHistory).contains(expectedToolResponse); + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); } static class TestToolCallback implements ToolCallback { private final ToolDefinition toolDefinition; + private final ToolMetadata toolMetadata; + public TestToolCallback(String name) { this.toolDefinition = ToolDefinition.builder().name(name).inputSchema("{}").build(); + this.toolMetadata = ToolMetadata.builder().build(); + } + + public TestToolCallback(String name, boolean returnDirect) { + this.toolDefinition = ToolDefinition.builder().name(name).inputSchema("{}").build(); + this.toolMetadata = ToolMetadata.builder().returnDirect(returnDirect).build(); } @Override @@ -229,6 +314,11 @@ public ToolDefinition getToolDefinition() { return toolDefinition; } + @Override + public ToolMetadata getToolMetadata() { + return toolMetadata; + } + @Override public String call(String toolInput) { return "Mission accomplished!"; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java new file mode 100644 index 00000000000..9e338450081 --- /dev/null +++ b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2023-2025 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.tool; + +import org.junit.jupiter.api.Test; +import org.springframework.ai.chat.messages.Message; + +import java.util.ArrayList; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +/** + * Unit tests for {@link DefaultToolExecutionResult}. + * + * @author Thomas Vitale + */ +class DefaultToolExecutionResultTests { + + @Test + void whenConversationHistoryIsNullThenThrow() { + assertThatThrownBy(() -> DefaultToolExecutionResult.builder().conversationHistory(null).build()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("conversationHistory cannot be null"); + } + + @Test + void whenConversationHistoryHasNullElementsThenThrow() { + var history = new ArrayList(); + history.add(null); + assertThatThrownBy(() -> DefaultToolExecutionResult.builder().conversationHistory(history).build()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("conversationHistory cannot contain null elements"); + } + + @Test + void builder() { + var conversationHistory = new ArrayList(); + var result = DefaultToolExecutionResult.builder() + .conversationHistory(conversationHistory) + .returnDirect(true) + .build(); + assertThat(result.conversationHistory()).isEqualTo(conversationHistory); + assertThat(result.returnDirect()).isTrue(); + } + +} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java index 7e6adffacad..1d56f629dac 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java @@ -18,7 +18,6 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.chat.messages.AssistantMessage; -import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatResponse; @@ -60,7 +59,7 @@ void whenToolCallbackExistsThenResolve() { .build(); List toolDefinitions = toolCallingManager - .resolveToolDefinitions(ToolCallingChatOptions.builder().tools("toolA").build()); + .resolveToolDefinitions(ToolCallingChatOptions.builder().toolNames("toolA").build()); assertThat(toolDefinitions).containsExactly(toolCallback.getToolDefinition()); } @@ -70,7 +69,7 @@ void whenToolCallbackDoesNotExistThenThrow() { ToolCallingManager toolCallingManager = LegacyToolCallingManager.builder().functionCallbacks(List.of()).build(); assertThatThrownBy(() -> toolCallingManager - .resolveToolDefinitions(ToolCallingChatOptions.builder().tools("toolB").build())) + .resolveToolDefinitions(ToolCallingChatOptions.builder().toolNames("toolB").build())) .isInstanceOf(IllegalStateException.class) .hasMessage("No ToolCallback found for tool name: toolB"); } @@ -118,9 +117,10 @@ void whenSingleToolCallInChatResponseThenExecute() { ToolResponseMessage expectedToolResponse = new ToolResponseMessage( List.of(new ToolResponseMessage.ToolResponse("toolA", "toolA", "Mission accomplished!"))); - List toolCallHistory = toolCallingManager.executeToolCalls(prompt, chatResponse); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); - assertThat(toolCallHistory).contains(expectedToolResponse); + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + assertThat(toolExecutionResult.returnDirect()).isFalse(); } @Test @@ -142,9 +142,10 @@ void whenMultipleToolCallsInChatResponseThenExecute() { List.of(new ToolResponseMessage.ToolResponse("toolA", "toolA", "Mission accomplished!"), new ToolResponseMessage.ToolResponse("toolB", "toolB", "Mission accomplished!"))); - List toolCallHistory = toolCallingManager.executeToolCalls(prompt, chatResponse); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); - assertThat(toolCallHistory).contains(expectedToolResponse); + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + assertThat(toolExecutionResult.returnDirect()).isFalse(); } @Test @@ -163,9 +164,10 @@ void whenToolCallWithExceptionThenReturnError() { ToolResponseMessage expectedToolResponse = new ToolResponseMessage( List.of(new ToolResponseMessage.ToolResponse("toolC", "toolC", "You failed this city!"))); - List toolCallHistory = toolCallingManager.executeToolCalls(prompt, chatResponse); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); - assertThat(toolCallHistory).contains(expectedToolResponse); + assertThat(toolExecutionResult.conversationHistory()).contains(expectedToolResponse); + assertThat(toolExecutionResult.returnDirect()).isFalse(); } static class TestToolCallback implements ToolCallback { diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java new file mode 100644 index 00000000000..3baf9d66263 --- /dev/null +++ b/spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java @@ -0,0 +1,82 @@ +/* + * Copyright 2023-2025 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.tool; + +import org.junit.jupiter.api.Test; +import org.springframework.ai.chat.messages.AssistantMessage; +import org.springframework.ai.chat.messages.ToolResponseMessage; +import org.springframework.ai.chat.messages.UserMessage; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Unit tests for {@link ToolExecutionResult}. + * + * @author Thomas Vitale + */ +class ToolExecutionResultTests { + + @Test + void whenSingleToolCallThenSingleGeneration() { + var toolExecutionResult = ToolExecutionResult.builder() + .conversationHistory(List.of(new AssistantMessage("Hello, how can I help you?"), + new UserMessage("I would like to know the weather in London"), + new AssistantMessage("Call the weather tool"), + new ToolResponseMessage(List.of(new ToolResponseMessage.ToolResponse("42", "weather", + "The weather in London is 20 degrees Celsius"))))) + .build(); + + var generations = ToolExecutionResult.buildGenerations(toolExecutionResult); + + assertThat(generations).hasSize(1); + assertThat(generations.get(0).getOutput().getText()).isEqualTo("The weather in London is 20 degrees Celsius"); + assertThat((String) generations.get(0).getMetadata().get(ToolExecutionResult.METADATA_TOOL_NAME)) + .isEqualTo("weather"); + assertThat(generations.get(0).getMetadata().getFinishReason()).isEqualTo(ToolExecutionResult.FINISH_REASON); + } + + @Test + void whenMultipleToolCallsThenMultipleGenerations() { + var toolExecutionResult = ToolExecutionResult.builder() + .conversationHistory(List.of(new AssistantMessage("Hello, how can I help you?"), + new UserMessage("I would like to know the weather in London"), + new AssistantMessage("Call the weather tool and the news tool"), + new ToolResponseMessage(List.of( + new ToolResponseMessage.ToolResponse("42", "weather", + "The weather in London is 20 degrees Celsius"), + new ToolResponseMessage.ToolResponse("21", "news", + "There is heavy traffic in the centre of London"))))) + .build(); + + var generations = ToolExecutionResult.buildGenerations(toolExecutionResult); + + assertThat(generations).hasSize(2); + assertThat(generations.get(0).getOutput().getText()).isEqualTo("The weather in London is 20 degrees Celsius"); + assertThat((String) generations.get(0).getMetadata().get(ToolExecutionResult.METADATA_TOOL_NAME)) + .isEqualTo("weather"); + assertThat(generations.get(0).getMetadata().getFinishReason()).isEqualTo(ToolExecutionResult.FINISH_REASON); + + assertThat(generations.get(1).getOutput().getText()) + .isEqualTo("There is heavy traffic in the centre of London"); + assertThat((String) generations.get(1).getMetadata().get(ToolExecutionResult.METADATA_TOOL_NAME)) + .isEqualTo("news"); + assertThat(generations.get(1).getMetadata().getFinishReason()).isEqualTo(ToolExecutionResult.FINISH_REASON); + } + +} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java index caf3463470f..293ed14290f 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java @@ -22,7 +22,7 @@ import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.tool.execution.ToolCallResultConverter; import org.springframework.ai.tool.metadata.ToolMetadata; -import org.springframework.ai.util.json.JsonSchemaGenerator; +import org.springframework.ai.util.json.schema.JsonSchemaGenerator; import org.springframework.core.ParameterizedTypeReference; import java.util.List; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java index f6b5049bfe9..7f6df87dd29 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.util.json.SchemaType; +import org.springframework.ai.util.json.schema.SchemaType; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java b/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java index 406d8cf3555..243d81b141e 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java @@ -1,9 +1,29 @@ +/* + * Copyright 2023-2025 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.util.json; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; +import io.swagger.v3.oas.annotations.media.Schema; import org.junit.jupiter.api.Test; +import org.springframework.ai.tool.annotation.ToolParam; +import org.springframework.ai.util.json.schema.JsonSchemaGenerator; +import org.springframework.lang.Nullable; import java.lang.reflect.Method; import java.time.Duration; @@ -22,6 +42,8 @@ */ class JsonSchemaGeneratorTests { + // METHODS + @Test void generateSchemaForMethodWithSimpleParameters() throws Exception { Method method = TestMethods.class.getDeclaredMethod("simpleMethod", String.class, int.class); @@ -37,7 +59,7 @@ void generateSchemaForMethodWithSimpleParameters() throws Exception { }, "age": { "type": "integer", - "format" : "int32" + "format": "int32" } }, "required": [ @@ -52,11 +74,121 @@ void generateSchemaForMethodWithSimpleParameters() throws Exception { } @Test - void generateSchemaForMethodWithJsonPropertyAnnotations() throws Exception { + void generateSchemaForMethodWithToolParamAnnotations() throws Exception { Method method = TestMethods.class.getDeclaredMethod("annotatedMethod", String.class, String.class); - String schema = JsonSchemaGenerator.generateForMethodInput(method, - JsonSchemaGenerator.SchemaOption.RESPECT_JSON_PROPERTY_REQUIRED); + String schema = JsonSchemaGenerator.generateForMethodInput(method); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "username": { + "type": "string", + "description": "The username of the customer" + }, + "password": { + "type": "string" + } + }, + "required": [ + "password" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForMethodWhenParameterRequiredByDefault() throws Exception { + Method method = TestMethods.class.getDeclaredMethod("anotherAnnotatedMethod", String.class, String.class); + + String schema = JsonSchemaGenerator.generateForMethodInput(method); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": [ + "username", + "password" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForMethodWithOpenApiSchemaAnnotations() throws Exception { + Method method = TestMethods.class.getDeclaredMethod("openApiMethod", String.class, String.class); + + String schema = JsonSchemaGenerator.generateForMethodInput(method); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "username": { + "type": "string", + "description": "The username of the customer" + }, + "password": { + "type": "string" + } + }, + "required": [ + "password" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForMethodWithJacksonAnnotations() throws Exception { + Method method = TestMethods.class.getDeclaredMethod("jacksonMethod", String.class, String.class); + + String schema = JsonSchemaGenerator.generateForMethodInput(method); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": [ + "password" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForMethodWithNullableAnnotations() throws Exception { + Method method = TestMethods.class.getDeclaredMethod("nullableMethod", String.class, String.class); + + String schema = JsonSchemaGenerator.generateForMethodInput(method); String expectedJsonSchema = """ { "$schema": "https://json-schema.org/draft/2020-12/schema", @@ -106,7 +238,7 @@ void generateSchemaForMethodWithUpperCaseTypes() throws Exception { }, "age": { "type": "INTEGER", - "format" : "int32" + "format": "int32" } }, "required": [ @@ -122,7 +254,8 @@ void generateSchemaForMethodWithUpperCaseTypes() throws Exception { @Test void generateSchemaForMethodWithComplexParameters() throws Exception { - Method method = TestMethods.class.getDeclaredMethod("complexMethod", List.class, TestData.class); + Method method = TestMethods.class.getDeclaredMethod("complexMethod", List.class, TestData.class, + MoreTestData.class); String schema = JsonSchemaGenerator.generateForMethodInput(method); @@ -142,18 +275,31 @@ void generateSchemaForMethodWithComplexParameters() throws Exception { "properties": { "id": { "type": "integer", - "format" : "int32" + "format": "int32" }, "name": { - "type": "string" + "type": "string", + "description": "The special name" } - } + }, + "required": [ "id", "name" ] + }, + "moreData": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string", + "description": "Even more special name" + } + }, + "required": [ "id", "name" ] } }, - "required": [ - "items", - "data" - ], + "required": [ "items", "data", "moreData" ], "additionalProperties": false } """; @@ -174,7 +320,7 @@ void generateSchemaForMethodWithTimeParameters() throws Exception { "properties": { "duration": { "type": "string", - "format" : "duration" + "format": "duration" }, "localDateTime": { "type": "string", @@ -197,11 +343,14 @@ void generateSchemaForMethodWithTimeParameters() throws Exception { assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); } + // TYPES + @Test void generateSchemaForSimpleType() { String schema = JsonSchemaGenerator.generateForType(Person.class); String expectedJsonSchema = """ { + "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "email": { @@ -209,12 +358,13 @@ void generateSchemaForSimpleType() { }, "id": { "type": "integer", - "format" : "int32" + "format": "int32" }, "name": { "type": "string" } }, + "required": [ "email", "id", "name" ], "additionalProperties": false } """; @@ -231,12 +381,166 @@ void generateSchemaForTypeWithAdditionalPropertiesAllowed() throws JsonProcessin assertThat(jsonNode.has("additionalProperties")).isFalse(); } + @Test + void generateSchemaWhenParameterRequiredByDefault() { + String schema = JsonSchemaGenerator.generateForType(Person.class); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + } + }, + "required": [ + "email", + "id", + "name" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForTypeWithToolArgAnnotation() { + String schema = JsonSchemaGenerator.generateForType(AnnotatedPerson.class); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "The email of the person" + }, + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForTypeWithOpenApiAnnotation() { + String schema = JsonSchemaGenerator.generateForType(OpenApiPerson.class); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "The email of the person" + }, + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForTypeWithJacksonAnnotation() { + String schema = JsonSchemaGenerator.generateForType(JacksonPerson.class); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + + @Test + void generateSchemaForTypeWithNullableAnnotation() { + String schema = JsonSchemaGenerator.generateForType(JacksonPerson.class); + String expectedJsonSchema = """ + { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false + } + """; + + assertThat(schema).isEqualToIgnoringWhitespace(expectedJsonSchema); + } + @Test void generateSchemaForTypeWithUpperCaseValues() { String schema = JsonSchemaGenerator.generateForType(Person.class, JsonSchemaGenerator.SchemaOption.UPPER_CASE_TYPE_VALUES); String expectedJsonSchema = """ { + "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "OBJECT", "properties": { "email": { @@ -244,12 +548,13 @@ void generateSchemaForTypeWithUpperCaseValues() { }, "id": { "type": "INTEGER", - "format" : "int32" + "format": "int32" }, "name": { "type": "STRING" } }, + "required": [ "email", "id", "name" ], "additionalProperties": false } """; @@ -262,16 +567,19 @@ void generateSchemaForRecord() { String schema = JsonSchemaGenerator.generateForType(TestData.class); String expectedJsonSchema = """ { + "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "id": { "type": "integer", - "format" : "int32" + "format": "int32" }, "name": { - "type": "string" + "type": "string", + "description": "The special name" } }, + "required": [ "id", "name" ], "additionalProperties": false } """; @@ -284,6 +592,7 @@ void generateSchemaForEnum() { String schema = JsonSchemaGenerator.generateForType(Month.class); String expectedJsonSchema = """ { + "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "string", "enum": [ "JANUARY", @@ -317,10 +626,27 @@ static class TestMethods { public void simpleMethod(String name, int age) { } - public void annotatedMethod(String username, @JsonProperty(required = true) String password) { + public void annotatedMethod( + @ToolParam(required = false, description = "The username of the customer") String username, + @ToolParam(required = true) String password) { + } + + public void anotherAnnotatedMethod(String username, @ToolParam String password) { } - public void complexMethod(List items, TestData data) { + public void openApiMethod( + @Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED, + description = "The username of the customer") String username, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) String password) { + } + + public void jacksonMethod(@JsonProperty String username, @JsonProperty(required = true) String password) { + } + + public void nullableMethod(@Nullable String username, String password) { + } + + public void complexMethod(List items, TestData data, MoreTestData moreData) { } public void timeMethod(Duration duration, LocalDateTime localDateTime, Instant instant) { @@ -328,7 +654,27 @@ public void timeMethod(Duration duration, LocalDateTime localDateTime, Instant i } - record TestData(int id, String name) { + record TestData(int id, @ToolParam(description = "The special name") String name) { + } + + record MoreTestData(int id, @Schema(description = "Even more special name") String name) { + } + + record AnnotatedPerson(@ToolParam int id, @ToolParam String name, + @ToolParam(required = false, description = "The email of the person") String email) { + } + + record JacksonPerson(@JsonProperty(required = true) int id, @JsonProperty(required = true) String name, + @JsonProperty String email) { + } + + record OpenApiPerson(@Schema(requiredMode = Schema.RequiredMode.REQUIRED) int id, + @Schema(requiredMode = Schema.RequiredMode.REQUIRED) String name, + @Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED, + description = "The email of the person") String email) { + } + + record NullablePerson(int id, String name, @Nullable String email) { } static class Person { diff --git a/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt b/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt index c9088ea5e54..039b332f073 100644 --- a/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt +++ b/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt @@ -18,7 +18,7 @@ package org.springframework.ai.tool.resolution import org.assertj.core.api.Assertions import org.junit.jupiter.api.Test -import org.springframework.ai.util.json.SchemaType +import org.springframework.ai.util.json.schema.SchemaType import org.springframework.context.annotation.AnnotationConfigApplicationContext import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -73,13 +73,13 @@ class SpringBeanToolCallbackResolverKotlinTests { @Bean(WELCOME_TOOL_NAME) @Description(WELCOME_TOOL_DESCRIPTION) open fun welcome(): Consumer { - return Consumer { input: Void? -> } + return Consumer { _: Void? -> } } @Bean(WELCOME_USER_TOOL_NAME) @Description(WELCOME_USER_TOOL_DESCRIPTION) open fun welcomeUser(): Consumer { - return Consumer { user: User? -> } + return Consumer { _: User? -> } } @Bean(BOOKS_BY_AUTHOR_TOOL_NAME) diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/images/tools/tool-calling-01.png b/spring-ai-docs/src/main/antora/modules/ROOT/images/tools/tool-calling-01.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d384b1e799020baa718971a444bc0785ba0e21 GIT binary patch literal 387269 zcmeEvcUaBu|34{GqLPX!6|1P-zcZ zr*YbQfA52H5U=BNU7yc&{jTeGz5j5%U+>fFb&tn$Kkw&#-(E@z(iCI|$hK_RLUHke zq{@~pyQ{WrA>B&49sIK1s8$UAv(;8bT4GCD?ZIL2Ka$287q7|7Z#f2@Nw;jhZ?=UP z`wIAX0Q}psWn1jlE!)6jKCc5W?>hvK^E!5y?W0Aw-`U$ctv(0#x7TKG?Hfhsm$Mzo=;KiArAcZP z$gA|T-co5+>~yu4T0kPh??jp1N28Asch4rLzji~9!}K(b(JR-~`LcRGtll#TdtzJb zSi7=byE-LWH`KNF%h}sowh|GOQnJARefSrIe>ve_Dfm|k{*{9N&!xar2%*zx%yk8l z&?r43*~>b&^mxe7yTt3bXnJ42FY_(Bw|L<@Fv-tQArhrs?-rPH=;8)KcJP*b*%2Js zsRL<95!a}dU>$M=-0Bd0*7t)Rc}igF?{&pKOxCg|Jrw(9mmgXp()Zo;+_y*1VP>vv zx2hdvayy1X+?*iGR>v=HAl zg(p-|jH-s$SAxPi#m=;Acf_6QIgl3_qxB+h&mj9(Z06XNU^G_^Oj(w(4Y`R~0V1Y?w1|?|oCQgHYBP^`rOwua3-;wWRQ`0b5LsDcokM&JWlE3UL ztKn6*nwRJl(K+toKETeu_dA-uYaA9AK$ol>j>Ctc7{Fn#2J-6CC(rjq9yy68N}@VX zpV4z%9kyxCNRko@WuBSi!Fjb!S_a9-X>vpz96Oh@gyRcJOiDuPq`rjj;3-+ES_>~N zBLD>%EU0FvoD|2xn+L;RfO?rGI-!2gN2^3Y@4jk)&H*}JZ6-@@%f6_$_TSq@d?20O zGhea5lzV2}$@x>RVHMppU5`f@MGx}=F%J%^-@!Igfn8=hD0 zEE(DhT7J1W74n$(;HYu=-tRLXQTW`k&_(GeYQNFiS6kM8DYWag0fsLBA4qX{C=a-` zt&>if3J2b=!$Ks|XdrJck$6gs-^(~6o>0V^CbH0F14l<@=v?E%$;Kh#X6p`0^^HmW zxPo*SxuyP_p5)BAm_ddLyGL&zCUbiWViy+d&xxd75X0k-M>XuLE@669@Vc`zAk4*7 z$ELQRiqYyIuHP>tX+;Asr#>vBD+19i>bmZY9Thhb8PGkZ>;yfw`#-o3)#FppBbu&C zex?4*Oy4$iaZ=}(avU__3ZF-q*KI{|u2{A??V+n)USKsg-;XmAzu{*jkJ`hi*+Dh+ zE24M_K(Oznmwkj`F7A85-uQ^;`|k#;L?w=0bXCO~85V77+o^wR_Iqpl_bS06GAO8a z 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�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. + +===== Adding Tools to `ChatClient` + +When using the declarative specification approach, there are a few options for adding tools to a `ChatClient`. +Such tools will only be available for the specific chat request they are added to. + +* Pass the tool class instance directly to the `tools()` method. + +[source,java] +---- +ChatClient.create(chatModel) + .prompt("What day is tomorrow?") + .tools(new DateTimeTools()) + .call() + .content(); +---- + +* Generate `ToolCallback`s from the tool class instance and pass them to the `tools()` method. + +[source,java] +---- +ToolCallback[] dateTimeTools = ToolCallbacks.from(new DateTimeTools()); +ChatClient.create(chatModel) + .prompt("What day is tomorrow?") + .tools(dateTimeTools) + .call() + .content(); +---- + +===== Adding Default Tools to `ChatClient` + +When using the declarative specification approach, you can add default tools to a `ChatClient` by adding them to the `ChatClient.Builder` used to instantiate it. +Such tools will be available for ALL the chat requests performed by ALL the `ChatClient` instances built from that specific `ChatClient.Builder`. +They are useful for tools that are commonly used across different chat requests, but they can also be dangerous if not used carefully, risking to make them available when they shouldn't. + +* Pass the tool class instance directly to the `tools()` method. + +[source,java] +---- +ChatModel chatModel = ... +ChatClient chatClient = ChatClient.builder(chatModel) + .defaultTools(new DateTimeTools()) + .build(); +---- + +* Generate `ToolCallback`s from the tool class instance and pass them to the `tools()` method. + +[source,java] +---- +ChatModel chatModel = ... +ToolCallback[] dateTimeTools = ToolCallbacks.from(new DateTimeTools()); +ChatClient chatClient = ChatClient.builder(chatModel) + .defaultTools(dateTimeTools) + .build(); +---- + +===== Adding Tools to `ChatModel` + +When using the declarative specification approach, there are a few options for adding tools to a `ChatModel`. +Such tools will only be available for the specific chat request they are added to. + +* Generate `ToolCallback`s from the tool class instance and pass them to the `toolCallbacks()` method of `ToolCallingChatOptions`. + +[source,java] +---- +ChatModel chatModel = ... +ToolCallback[] dateTimeTools = ToolCallbacks.from(new DateTimeTools()); +ChatOptions chatOptions = ToolCallingChatOptions.builder() + .toolCallbacks(dateTimeTools) + .build(): +Prompt prompt = new Prompt("What day is tomorrow?", chatOptions); +chatModel.call(prompt); +---- + +==== Programmatic Specification: `MethodToolCallback` + +===== Adding Tools to `ChatClient` + +===== Adding Tools to `ChatModel` + +==== Limitations + +Methods using `Optional`, asynchronous (e.g. `CompletableFuture`, `Future`) or reactive types (e.g. `Flow`, `Mono`, `Flux`) as parameters or return types are not currently supported to be used as tools. + +Furthermore, methods returning a functional type (e.g. `Function`, `Supplier`, `Consumer`) are not supported to be used as tools using this approach, but they are supported using the function-based approach described in the next section. + +=== Functions as Tools + +Spring AI provides built-in support for specifying tools from functions, either programmatically using the low-level `FunctionToolCallback` implementation or dynamic using the `ToolCallbackResolver` interface for resolution at run-time. + +==== Programmatic Specification: `FunctionToolCallback` + +===== Adding Tools to `ChatClient` + +===== Adding Tools to `ChatModel` + +==== Dynamic Specification: `@Bean` + +===== Adding Tools to `ChatClient` + +===== Adding Tools to `ChatModel` + +==== Limitations + +* Only POJOs. +* Only public. +* No primitives. +* No lists or arrays. + +=== JSON Schema + +==== Description + +==== Required + +=== Result Conversion + +=== Exception Handling + +=== Tool Context + +=== Return Direct + +== Tool Execution + +=== Framework-Controlled Tool Execution + +=== User-Controlled Tool Execution + +== Tool Resolution + +=== Resolution from Application Context + +== Structured Outputs + +== Observability + +=== Logging diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java index 34fc1887f58..12a59740ccd 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/tool/ToolCallingManagerTests.java @@ -21,9 +21,9 @@ import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.springframework.ai.model.tool.ToolExecutionResult; import reactor.core.publisher.Flux; -import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatResponse; @@ -102,12 +102,13 @@ private void runExplicitToolCallingExecutionWithOptions(ChatOptions chatOptions, assertThat(chatResponse).isNotNull(); assertThat(chatResponse.hasToolCalls()).isTrue(); - List messages = toolCallingManager.executeToolCalls(prompt, chatResponse); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, chatResponse); - assertThat(messages).isNotEmpty(); - assertThat(messages.stream().anyMatch(m -> m instanceof ToolResponseMessage)).isTrue(); + assertThat(toolExecutionResult.conversationHistory()).isNotEmpty(); + assertThat(toolExecutionResult.conversationHistory().stream().anyMatch(m -> m instanceof ToolResponseMessage)) + .isTrue(); - Prompt secondPrompt = new Prompt(messages, chatOptions); + Prompt secondPrompt = new Prompt(toolExecutionResult.conversationHistory(), chatOptions); ChatResponse secondChatResponse = openAiChatModel.call(secondPrompt); @@ -121,12 +122,14 @@ private void runExplicitToolCallingExecutionWithOptions(ChatOptions chatOptions, private void runExplicitToolCallingExecutionWithOptionsStream(ChatOptions chatOptions, Prompt prompt) { ChatResponse chatResponse = openAiChatModel.stream(prompt).flatMap(response -> { if (response.hasToolCalls()) { - List messages = toolCallingManager.executeToolCalls(prompt, response); + ToolExecutionResult toolExecutionResult = toolCallingManager.executeToolCalls(prompt, response); - assertThat(messages).isNotEmpty(); - assertThat(messages.stream().anyMatch(m -> m instanceof ToolResponseMessage)).isTrue(); + assertThat(toolExecutionResult.conversationHistory()).isNotEmpty(); + assertThat(toolExecutionResult.conversationHistory() + .stream() + .anyMatch(m -> m instanceof ToolResponseMessage)).isTrue(); - Prompt secondPrompt = new Prompt(messages, chatOptions); + Prompt secondPrompt = new Prompt(toolExecutionResult.conversationHistory(), chatOptions); // return openAiChatModel.stream(secondPrompt); return Flux.just(openAiChatModel.call(secondPrompt)); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java index f3d6747abfc..d033c856004 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 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. @@ -95,7 +95,7 @@ void functionCallWithPortableFunctionCallingOptions() { "What's the weather like in San Francisco, Paris and in Tokyo? Use Multi-turn function calling."); ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), - ToolCallingChatOptions.builder().tools("weatherFunction").build())); + ToolCallingChatOptions.builder().toolNames("weatherFunction").build())); logger.info("Response: " + response); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java index 364ef52f234..41718b08e8b 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 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. @@ -63,14 +63,14 @@ void functionCallTest() { "What's the weather like in San Francisco, in Paris, France and in Tokyo, Japan? Return the temperature in Celsius."); ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), - ToolCallingChatOptions.builder().tools("weatherFunction").build())); + ToolCallingChatOptions.builder().toolNames("weatherFunction").build())); logger.info("Response: " + response); assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), - ToolCallingChatOptions.builder().tools("weatherFunction3").build())); + ToolCallingChatOptions.builder().toolNames("weatherFunction3").build())); logger.info("Response: " + response); @@ -92,7 +92,7 @@ void functionStreamTest() { "What's the weather like in San Francisco, in Paris, France and in Tokyo, Japan? Return the temperature in Celsius."); Flux responses = chatModel.stream(new Prompt(List.of(userMessage), - ToolCallingChatOptions.builder().tools("weatherFunction").build())); + ToolCallingChatOptions.builder().toolNames("weatherFunction").build())); String content = responses.collectList() .block() diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java index f39e75dd061..8aea4f7062a 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 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. @@ -118,7 +118,7 @@ void functionCallWithPortableFunctionCallingOptions() { UserMessage userMessage = new UserMessage( "What are the weather conditions in San Francisco, Tokyo, and Paris? Find the temperature in Celsius for each of the three locations."); - ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder().tools("WeatherInfo").build(); + ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder().toolNames("WeatherInfo").build(); ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java index 10e82513563..0028aece30f 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionToolBeanIT.java @@ -102,7 +102,7 @@ void functionCallTest() { "What are the weather conditions in San Francisco, Tokyo, and Paris? Find the temperature in Celsius for each of the three locations."); ChatResponse response = chatModel - .call(new Prompt(List.of(userMessage), OllamaOptions.builder().tools("weatherInfo").build())); + .call(new Prompt(List.of(userMessage), OllamaOptions.builder().toolNames("weatherInfo").build())); logger.info("Response: " + response); @@ -146,7 +146,7 @@ void functionCallWithPortableFunctionCallingOptions() { UserMessage userMessage = new UserMessage( "What are the weather conditions in San Francisco, Tokyo, and Paris? Find the temperature in Celsius for each of the three locations."); - ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder().tools("weatherInfo").build(); + ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder().toolNames("weatherInfo").build(); ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 513d2dbfd66..e8403a1ad84 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 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. @@ -154,7 +154,9 @@ void trainScheduler() { UserMessage userMessage = new UserMessage( "Please schedule a train from San Francisco to Los Angeles on 2023-12-25"); - ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder().tools("trainReservation").build(); + ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder() + .toolNames("trainReservation") + .build(); ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); @@ -263,7 +265,9 @@ void functionCallWithPortableFunctionCallingOptions() { // Test weatherFunction UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?"); - ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder().tools("weatherFunction").build(); + ToolCallingChatOptions functionOptions = ToolCallingChatOptions.builder() + .toolNames("weatherFunction") + .build(); ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions));