From f92450279148cfe9988b5224c3bb00da55dcbfb7 Mon Sep 17 00:00:00 2001 From: liugddx Date: Sun, 3 Nov 2024 22:36:35 +0800 Subject: [PATCH] Support single object tool_calls in OpenAI vendor APIs XFY Spark and possibly other vendors implement the OpenAI interface but return tool_calls as a single object rather than an array. Add @JsonFormat annotation to handle both array and single object responses in ChatCompletionMessage, making Spring AI more broadly compatible with OpenAI API implementations. Only ChatCompletionMessage.java required modification to support this alternate format while maintaining backward compatibility with the standard OpenAI API response structure. Co-authored-by: jito --- .../java/org/springframework/ai/openai/api/OpenAiApi.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java index 9f7111bb9..63458b559 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java @@ -22,6 +22,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.function.Predicate; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; @@ -905,7 +906,8 @@ public class OpenAiApi { @JsonProperty("role") Role role, @JsonProperty("name") String name, @JsonProperty("tool_call_id") String toolCallId, - @JsonProperty("tool_calls") List toolCalls, + @JsonProperty("tool_calls") + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) List toolCalls, @JsonProperty("refusal") String refusal) { // @formatter:on /**