Skip to content

Commit 68b5f59

Browse files
committed
Refactor ChatResponseMetadata Builder methods
- Refactor builder methods in `ChatResponseMetadata` to remove `with` prefixes and introduce new methods with updated naming conventions. - Deprecate existing `with*` methods while maintaining backward compatibility. - Ensure dependent files and tests are compatible with the updated `ChatResponseMetadata` class.
1 parent da45244 commit 68b5f59

File tree

23 files changed

+195
-122
lines changed

23 files changed

+195
-122
lines changed

models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
* @author Mariusz Bernacki
8282
* @author Thomas Vitale
8383
* @author Claudio Silva Junior
84+
* @author Alexandros Pappas
8485
* @since 1.0.0
8586
*/
8687
public class AnthropicChatModel extends AbstractToolCallSupport implements ChatModel {
@@ -357,12 +358,12 @@ private ChatResponseMetadata from(AnthropicApi.ChatCompletionResponse result) {
357358
private ChatResponseMetadata from(AnthropicApi.ChatCompletionResponse result, Usage usage) {
358359
Assert.notNull(result, "Anthropic ChatCompletionResult must not be null");
359360
return ChatResponseMetadata.builder()
360-
.withId(result.id())
361-
.withModel(result.model())
362-
.withUsage(usage)
363-
.withKeyValue("stop-reason", result.stopReason())
364-
.withKeyValue("stop-sequence", result.stopSequence())
365-
.withKeyValue("type", result.type())
361+
.id(result.id())
362+
.model(result.model())
363+
.usage(usage)
364+
.keyValue("stop-reason", result.stopReason())
365+
.keyValue("stop-sequence", result.stopSequence())
366+
.keyValue("type", result.type())
366367
.build();
367368
}
368369

models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
* @author Soby Chacko
109109
* @author Jihoon Kim
110110
* @author Ilayaperumal Gopinathan
111+
* @author Alexandros Pappas
111112
* @see ChatModel
112113
* @see com.azure.ai.openai.OpenAIClient
113114
* @since 1.0.0
@@ -184,11 +185,11 @@ public static ChatResponseMetadata from(ChatCompletions chatCompletions, PromptM
184185
Assert.notNull(chatCompletions, "Azure OpenAI ChatCompletions must not be null");
185186
String id = chatCompletions.getId();
186187
return ChatResponseMetadata.builder()
187-
.withId(id)
188-
.withUsage(usage)
189-
.withModel(chatCompletions.getModel())
190-
.withPromptMetadata(promptFilterMetadata)
191-
.withKeyValue("system-fingerprint", chatCompletions.getSystemFingerprint())
188+
.id(id)
189+
.usage(usage)
190+
.model(chatCompletions.getModel())
191+
.promptMetadata(promptFilterMetadata)
192+
.keyValue("system-fingerprint", chatCompletions.getSystemFingerprint())
192193
.build();
193194
}
194195

@@ -206,12 +207,12 @@ public static ChatResponseMetadata from(ChatResponse chatResponse, Usage usage)
206207
Assert.notNull(chatResponse, "ChatResponse must not be null");
207208
ChatResponseMetadata chatResponseMetadata = chatResponse.getMetadata();
208209
ChatResponseMetadata.Builder builder = ChatResponseMetadata.builder();
209-
builder.withId(chatResponseMetadata.getId())
210-
.withUsage(usage)
211-
.withModel(chatResponseMetadata.getModel())
212-
.withPromptMetadata(chatResponseMetadata.getPromptMetadata());
210+
builder.id(chatResponseMetadata.getId())
211+
.usage(usage)
212+
.model(chatResponseMetadata.getModel())
213+
.promptMetadata(chatResponseMetadata.getPromptMetadata());
213214
if (chatResponseMetadata.containsKey("system-fingerprint")) {
214-
builder.withKeyValue("system-fingerprint", chatResponseMetadata.get("system-fingerprint"));
215+
builder.keyValue("system-fingerprint", chatResponseMetadata.get("system-fingerprint"));
215216
}
216217
return builder.build();
217218
}

models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@
129129
*
130130
* @author Christian Tzolov
131131
* @author Wei Jiang
132+
* @author Alexandros Pappas
132133
* @since 1.0.0
133134
*/
134135
public class BedrockProxyChatModel extends AbstractToolCallSupport implements ChatModel {
@@ -565,8 +566,8 @@ private ChatResponse toChatResponse(ConverseResponse response, ChatResponse perv
565566
ConverseMetrics metrics = response.metrics();
566567

567568
var chatResponseMetaData = ChatResponseMetadata.builder()
568-
.withId(response.responseMetadata() != null ? response.responseMetadata().requestId() : "Unknown")
569-
.withUsage(usage)
569+
.id(response.responseMetadata() != null ? response.responseMetadata().requestId() : "Unknown")
570+
.usage(usage)
570571
.build();
571572

572573
return new ChatResponse(allGenerations, chatResponseMetaData);

models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/api/ConverseApiUtils.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
*
6363
* @author Wei Jiang
6464
* @author Christian Tzolov
65+
* @author Alexandros Pappas
6566
* @since 1.0.0
6667
*/
6768
public final class ConverseApiUtils {
@@ -144,7 +145,7 @@ public static Flux<ChatResponse> toChatResponse(Flux<ConverseStreamOutput> respo
144145
ChatGenerationMetadata.builder().finishReason("tool_use").build());
145146

146147
var chatResponseMetaData = ChatResponseMetadata.builder()
147-
.withUsage(new DefaultUsage(promptTokens, generationTokens, totalTokens))
148+
.usage(new DefaultUsage(promptTokens, generationTokens, totalTokens))
148149
.build();
149150

150151
return new Aggregation(
@@ -210,7 +211,7 @@ else if (nextEvent instanceof ConverseStreamMetadataEvent metadataEvent) {
210211
metadataEvent.usage().outputTokens().longValue(),
211212
metadataEvent.usage().totalTokens().longValue());
212213

213-
var chatResponseMetaData = ChatResponseMetadata.builder().withUsage(usage).build();
214+
var chatResponseMetaData = ChatResponseMetadata.builder().usage(usage).build();
214215

215216
return new Aggregation(newMeta, new ChatResponse(List.of(), chatResponseMetaData));
216217
}
@@ -235,10 +236,10 @@ else if (nextEvent instanceof ConverseStreamMetadataEvent metadataEvent) {
235236
Long totalTokens = perviousChatResponse.getMetadata().getUsage().getTotalTokens();
236237

237238
if (chatResponse.getMetadata() != null) {
238-
metadataBuilder.withId(chatResponse.getMetadata().getId());
239-
metadataBuilder.withModel(chatResponse.getMetadata().getModel());
240-
metadataBuilder.withRateLimit(chatResponse.getMetadata().getRateLimit());
241-
metadataBuilder.withPromptMetadata(chatResponse.getMetadata().getPromptMetadata());
239+
metadataBuilder.id(chatResponse.getMetadata().getId());
240+
metadataBuilder.model(chatResponse.getMetadata().getModel());
241+
metadataBuilder.rateLimit(chatResponse.getMetadata().getRateLimit());
242+
metadataBuilder.promptMetadata(chatResponse.getMetadata().getPromptMetadata());
242243

243244
if (chatResponse.getMetadata().getUsage() != null) {
244245
promptTokens = promptTokens + chatResponse.getMetadata().getUsage().getPromptTokens();
@@ -248,7 +249,7 @@ else if (nextEvent instanceof ConverseStreamMetadataEvent metadataEvent) {
248249
}
249250
}
250251

251-
metadataBuilder.withUsage(new DefaultUsage(promptTokens, generationTokens, totalTokens));
252+
metadataBuilder.usage(new DefaultUsage(promptTokens, generationTokens, totalTokens));
252253

253254
return new ChatResponse(chatResponse.getResults(), metadataBuilder.build());
254255
}

models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModel.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
* @author Ben Middleton
5656
* @author Christian Tzolov
5757
* @author Wei Jiang
58+
* @author Alexandros Pappas
5859
* @since 1.0.0
5960
*/
6061
public class BedrockAnthropic3ChatModel implements ChatModel, StreamingChatModel {
@@ -92,9 +93,9 @@ public ChatResponse call(Prompt prompt) {
9293
.toList();
9394

9495
ChatResponseMetadata metadata = ChatResponseMetadata.builder()
95-
.withId(response.id())
96-
.withModel(response.model())
97-
.withUsage(extractUsage(response))
96+
.id(response.id())
97+
.model(response.model())
98+
.usage(extractUsage(response))
9899
.build();
99100

100101
return new ChatResponse(generations, metadata);

models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
* backed by {@link MiniMaxApi}.
7777
*
7878
* @author Geng Rong
79+
* @author Alexandros Pappas
7980
* @see ChatModel
8081
* @see StreamingChatModel
8182
* @see MiniMaxApi
@@ -386,11 +387,11 @@ private ChatOptions buildRequestOptions(ChatCompletionRequest request) {
386387
private ChatResponseMetadata from(ChatCompletion result) {
387388
Assert.notNull(result, "MiniMax ChatCompletionResult must not be null");
388389
return ChatResponseMetadata.builder()
389-
.withId(result.id() != null ? result.id() : "")
390-
.withUsage(result.usage() != null ? MiniMaxUsage.from(result.usage()) : new EmptyUsage())
391-
.withModel(result.model() != null ? result.model() : "")
392-
.withKeyValue("created", result.created() != null ? result.created() : 0L)
393-
.withKeyValue("system-fingerprint", result.systemFingerprint() != null ? result.systemFingerprint() : "")
390+
.id(result.id() != null ? result.id() : "")
391+
.usage(result.usage() != null ? MiniMaxUsage.from(result.usage()) : new EmptyUsage())
392+
.model(result.model() != null ? result.model() : "")
393+
.keyValue("created", result.created() != null ? result.created() : 0L)
394+
.keyValue("system-fingerprint", result.systemFingerprint() != null ? result.systemFingerprint() : "")
394395
.build();
395396
}
396397

models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
* @author Thomas Vitale
7878
* @author luocongqiu
7979
* @author Ilayaperumal Gopinathan
80+
* @author Alexandros Pappas
8081
* @since 1.0.0
8182
*/
8283
public class MistralAiChatModel extends AbstractToolCallSupport implements ChatModel {
@@ -151,20 +152,20 @@ public static ChatResponseMetadata from(MistralAiApi.ChatCompletion result) {
151152
Assert.notNull(result, "Mistral AI ChatCompletion must not be null");
152153
MistralAiUsage usage = MistralAiUsage.from(result.usage());
153154
return ChatResponseMetadata.builder()
154-
.withId(result.id())
155-
.withModel(result.model())
156-
.withUsage(usage)
157-
.withKeyValue("created", result.created())
155+
.id(result.id())
156+
.model(result.model())
157+
.usage(usage)
158+
.keyValue("created", result.created())
158159
.build();
159160
}
160161

161162
public static ChatResponseMetadata from(MistralAiApi.ChatCompletion result, Usage usage) {
162163
Assert.notNull(result, "Mistral AI ChatCompletion must not be null");
163164
return ChatResponseMetadata.builder()
164-
.withId(result.id())
165-
.withModel(result.model())
166-
.withUsage(usage)
167-
.withKeyValue("created", result.created())
165+
.id(result.id())
166+
.model(result.model())
167+
.usage(usage)
168+
.keyValue("created", result.created())
168169
.build();
169170
}
170171

models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
* MoonshotChatModel is a {@link ChatModel} implementation that uses the Moonshot
7575
*
7676
* @author Geng Rong
77+
* @author Alexandros Pappas
7778
*/
7879
public class MoonshotChatModel extends AbstractToolCallSupport implements ChatModel, StreamingChatModel {
7980

@@ -317,10 +318,10 @@ public Flux<ChatResponse> stream(Prompt prompt) {
317318
private ChatResponseMetadata from(ChatCompletion result) {
318319
Assert.notNull(result, "Moonshot ChatCompletionResult must not be null");
319320
return ChatResponseMetadata.builder()
320-
.withId(result.id() != null ? result.id() : "")
321-
.withUsage(result.usage() != null ? MoonshotUsage.from(result.usage()) : new EmptyUsage())
322-
.withModel(result.model() != null ? result.model() : "")
323-
.withKeyValue("created", result.created() != null ? result.created() : 0L)
321+
.id(result.id() != null ? result.id() : "")
322+
.usage(result.usage() != null ? MoonshotUsage.from(result.usage()) : new EmptyUsage())
323+
.model(result.model() != null ? result.model() : "")
324+
.keyValue("created", result.created() != null ? result.created() : 0L)
324325
.build();
325326
}
326327

models/spring-ai-oci-genai/src/main/java/org/springframework/ai/oci/cohere/OCICohereChatModel.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
* {@link ChatModel} implementation that uses the OCI GenAI Chat API.
6363
*
6464
* @author Anders Swanson
65+
* @author Alexandros Pappas
6566
* @since 1.0.0
6667
*/
6768
public class OCICohereChatModel implements ChatModel {
@@ -138,8 +139,8 @@ private ChatResponse doChatRequest(Prompt prompt) {
138139
validateChatOptions(options);
139140

140141
ChatResponseMetadata metadata = ChatResponseMetadata.builder()
141-
.withModel(options.getModel())
142-
.withKeyValue("compartment", options.getCompartment())
142+
.model(options.getModel())
143+
.keyValue("compartment", options.getCompartment())
143144
.build();
144145
return new ChatResponse(getGenerations(prompt, options), metadata);
145146

models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
* @author luocongqiu
7777
* @author Thomas Vitale
7878
* @author Jihoon Kim
79+
* @author Alexandros Pappas
7980
* @since 1.0.0
8081
*/
8182
public class OllamaChatModel extends AbstractToolCallSupport implements ChatModel {
@@ -164,16 +165,16 @@ static ChatResponseMetadata from(OllamaApi.ChatResponse response, ChatResponse p
164165
DefaultUsage aggregatedUsage = new DefaultUsage(promptTokens, generationTokens, totalTokens);
165166

166167
return ChatResponseMetadata.builder()
167-
.withUsage(aggregatedUsage)
168-
.withModel(response.model())
169-
.withKeyValue(METADATA_CREATED_AT, response.createdAt())
170-
.withKeyValue(METADATA_EVAL_DURATION, evalDuration)
171-
.withKeyValue(METADATA_EVAL_COUNT, aggregatedUsage.getGenerationTokens().intValue())
172-
.withKeyValue(METADATA_LOAD_DURATION, loadDuration)
173-
.withKeyValue(METADATA_PROMPT_EVAL_DURATION, promptEvalDuration)
174-
.withKeyValue(METADATA_PROMPT_EVAL_COUNT, aggregatedUsage.getPromptTokens().intValue())
175-
.withKeyValue(METADATA_TOTAL_DURATION, totalDuration)
176-
.withKeyValue(DONE, response.done())
168+
.usage(aggregatedUsage)
169+
.model(response.model())
170+
.keyValue(METADATA_CREATED_AT, response.createdAt())
171+
.keyValue(METADATA_EVAL_DURATION, evalDuration)
172+
.keyValue(METADATA_EVAL_COUNT, aggregatedUsage.getGenerationTokens().intValue())
173+
.keyValue(METADATA_LOAD_DURATION, loadDuration)
174+
.keyValue(METADATA_PROMPT_EVAL_DURATION, promptEvalDuration)
175+
.keyValue(METADATA_PROMPT_EVAL_COUNT, aggregatedUsage.getPromptTokens().intValue())
176+
.keyValue(METADATA_TOTAL_DURATION, totalDuration)
177+
.keyValue(DONE, response.done())
177178
.build();
178179
}
179180

0 commit comments

Comments
 (0)