Skip to content

Commit 56fba7c

Browse files
committed
ToolCallingChatOptions: rename attempts to iterations for tool execution
Signed-off-by: lambochen <[email protected]>
1 parent c63341b commit 56fba7c

File tree

38 files changed

+309
-309
lines changed

38 files changed

+309
-309
lines changed

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons
178178
return this.internalCall(prompt, previousChatResponse, 1);
179179
}
180180

181-
public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatResponse, int attempts) {
181+
public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatResponse, int iterations) {
182182
ChatCompletionRequest request = createRequest(prompt, false);
183183

184184
ChatModelObservationContext observationContext = ChatModelObservationContext.builder()
@@ -208,7 +208,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons
208208
return chatResponse;
209209
});
210210

211-
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), response, attempts)) {
211+
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), response, iterations)) {
212212
var toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, response);
213213
if (toolExecutionResult.returnDirect()) {
214214
// Return tool execution result directly to the client.
@@ -220,7 +220,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons
220220
else {
221221
// Send the tool execution result back to the model.
222222
return this.internalCall(new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()),
223-
response, attempts + 1);
223+
response, iterations + 1);
224224
}
225225
}
226226

@@ -244,7 +244,7 @@ public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCha
244244
return this.internalStream(prompt, previousChatResponse, 1);
245245
}
246246

247-
public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousChatResponse, int attempts) {
247+
public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousChatResponse, int iterations) {
248248
return Flux.deferContextual(contextView -> {
249249
ChatCompletionRequest request = createRequest(prompt, true);
250250

@@ -269,7 +269,7 @@ public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCha
269269
Usage accumulatedUsage = UsageCalculator.getCumulativeUsage(currentChatResponseUsage, previousChatResponse);
270270
ChatResponse chatResponse = toChatResponse(chatCompletionResponse, accumulatedUsage);
271271

272-
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), chatResponse, attempts)
272+
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), chatResponse, iterations)
273273
&& chatResponse.hasFinishReasons(Set.of("tool_use"))) {
274274
// FIXME: bounded elastic needs to be used since tool calling
275275
// is currently only synchronous
@@ -284,7 +284,7 @@ public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCha
284284
else {
285285
// Send the tool execution result back to the model.
286286
return this.internalStream(new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()),
287-
chatResponse, attempts + 1);
287+
chatResponse, iterations + 1);
288288
}
289289
}).subscribeOn(Schedulers.boundedElastic());
290290
}
@@ -447,9 +447,9 @@ Prompt buildRequestPrompt(Prompt prompt) {
447447
requestOptions.setInternalToolExecutionEnabled(
448448
ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(),
449449
this.defaultOptions.getInternalToolExecutionEnabled()));
450-
requestOptions.setInternalToolExecutionMaxAttempts(
451-
ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionMaxAttempts(),
452-
defaultOptions.getInternalToolExecutionMaxAttempts()));
450+
requestOptions.setInternalToolExecutionMaxIterations(
451+
ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionMaxIterations(),
452+
defaultOptions.getInternalToolExecutionMaxIterations()));
453453
requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(),
454454
this.defaultOptions.getToolNames()));
455455
requestOptions.setToolCallbacks(ToolCallingChatOptions.mergeToolCallbacks(runtimeOptions.getToolCallbacks(),
@@ -461,7 +461,7 @@ Prompt buildRequestPrompt(Prompt prompt) {
461461
requestOptions.setHttpHeaders(this.defaultOptions.getHttpHeaders());
462462
requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled());
463463
requestOptions
464-
.setInternalToolExecutionMaxAttempts(this.defaultOptions.getInternalToolExecutionMaxAttempts());
464+
.setInternalToolExecutionMaxIterations(this.defaultOptions.getInternalToolExecutionMaxIterations());
465465
requestOptions.setToolNames(this.defaultOptions.getToolNames());
466466
requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks());
467467
requestOptions.setToolContext(this.defaultOptions.getToolContext());

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public class AnthropicChatOptions implements ToolCallingChatOptions {
8181
private Boolean internalToolExecutionEnabled;
8282

8383
@JsonIgnore
84-
private Integer internalToolExecutionMaxAttempts = ToolCallingChatOptions.DEFAULT_TOOL_EXECUTION_MAX_ATTEMPTS;
84+
private Integer internalToolExecutionMaxIterations = ToolCallingChatOptions.DEFAULT_TOOL_EXECUTION_MAX_ITERATIONS;
8585

8686
@JsonIgnore
8787
private Map<String, Object> toolContext = new HashMap<>();
@@ -113,7 +113,7 @@ public static AnthropicChatOptions fromOptions(AnthropicChatOptions fromOptions)
113113
fromOptions.getToolCallbacks() != null ? new ArrayList<>(fromOptions.getToolCallbacks()) : null)
114114
.toolNames(fromOptions.getToolNames() != null ? new HashSet<>(fromOptions.getToolNames()) : null)
115115
.internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled())
116-
.internalToolExecutionMaxAttempts(fromOptions.getInternalToolExecutionMaxAttempts())
116+
.internalToolExecutionMaxIterations(fromOptions.getInternalToolExecutionMaxIterations())
117117
.toolContext(fromOptions.getToolContext() != null ? new HashMap<>(fromOptions.getToolContext()) : null)
118118
.httpHeaders(fromOptions.getHttpHeaders() != null ? new HashMap<>(fromOptions.getHttpHeaders()) : null)
119119
.build();
@@ -232,13 +232,13 @@ public void setInternalToolExecutionEnabled(@Nullable Boolean internalToolExecut
232232
}
233233

234234
@Override
235-
public Integer getInternalToolExecutionMaxAttempts() {
236-
return this.internalToolExecutionMaxAttempts;
235+
public Integer getInternalToolExecutionMaxIterations() {
236+
return this.internalToolExecutionMaxIterations;
237237
}
238238

239239
@Override
240-
public void setInternalToolExecutionMaxAttempts(@Nullable Integer internalToolExecutionMaxAttempts) {
241-
this.internalToolExecutionMaxAttempts = internalToolExecutionMaxAttempts;
240+
public void setInternalToolExecutionMaxIterations(@Nullable Integer internalToolExecutionMaxIterations) {
241+
this.internalToolExecutionMaxIterations = internalToolExecutionMaxIterations;
242242
}
243243

244244
@Override
@@ -296,7 +296,7 @@ public boolean equals(Object o) {
296296
&& Objects.equals(this.toolCallbacks, that.toolCallbacks)
297297
&& Objects.equals(this.toolNames, that.toolNames)
298298
&& Objects.equals(this.internalToolExecutionEnabled, that.internalToolExecutionEnabled)
299-
&& Objects.equals(this.internalToolExecutionMaxAttempts, that.internalToolExecutionMaxAttempts)
299+
&& Objects.equals(this.internalToolExecutionMaxIterations, that.internalToolExecutionMaxIterations)
300300
&& Objects.equals(this.toolContext, that.toolContext)
301301
&& Objects.equals(this.httpHeaders, that.httpHeaders);
302302
}
@@ -305,7 +305,7 @@ public boolean equals(Object o) {
305305
public int hashCode() {
306306
return Objects.hash(this.model, this.maxTokens, this.metadata, this.stopSequences, this.temperature, this.topP,
307307
this.topK, this.thinking, this.toolCallbacks, this.toolNames, this.internalToolExecutionEnabled,
308-
this.internalToolExecutionMaxAttempts, this.toolContext, this.httpHeaders);
308+
this.internalToolExecutionMaxIterations, this.toolContext, this.httpHeaders);
309309
}
310310

311311
public static class Builder {
@@ -390,8 +390,8 @@ public Builder internalToolExecutionEnabled(@Nullable Boolean internalToolExecut
390390
return this;
391391
}
392392

393-
public Builder internalToolExecutionMaxAttempts(@Nullable Integer internalToolExecutionMaxAttempts) {
394-
this.options.setInternalToolExecutionMaxAttempts(internalToolExecutionMaxAttempts);
393+
public Builder internalToolExecutionMaxIterations(@Nullable Integer internalToolExecutionMaxIterations) {
394+
this.options.setInternalToolExecutionMaxIterations(internalToolExecutionMaxIterations);
395395
return this;
396396
}
397397

models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatOptionsTests.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ void testBuilderWithAllFields() {
4444
.topP(0.8)
4545
.topK(50)
4646
.metadata(new Metadata("userId_123"))
47-
.internalToolExecutionMaxAttempts(3)
47+
.internalToolExecutionMaxIterations(3)
4848
.build();
4949

5050
assertThat(options)
5151
.extracting("model", "maxTokens", "stopSequences", "temperature", "topP", "topK", "metadata",
52-
"internalToolExecutionMaxAttempts")
52+
"internalToolExecutionMaxIterations")
5353
.containsExactly("test-model", 100, List.of("stop1", "stop2"), 0.7, 0.8, 50, new Metadata("userId_123"), 3);
5454
}
5555

@@ -64,7 +64,7 @@ void testCopy() {
6464
.topK(50)
6565
.metadata(new Metadata("userId_123"))
6666
.toolContext(Map.of("key1", "value1"))
67-
.internalToolExecutionMaxAttempts(3)
67+
.internalToolExecutionMaxIterations(3)
6868
.build();
6969

7070
AnthropicChatOptions copied = original.copy();
@@ -74,7 +74,7 @@ void testCopy() {
7474
assertThat(copied.getStopSequences()).isNotSameAs(original.getStopSequences());
7575
assertThat(copied.getToolContext()).isNotSameAs(original.getToolContext());
7676

77-
assertThat(copied.getInternalToolExecutionMaxAttempts()).isEqualTo(3);
77+
assertThat(copied.getInternalToolExecutionMaxIterations()).isEqualTo(3);
7878
}
7979

8080
@Test
@@ -87,7 +87,7 @@ void testSetters() {
8787
options.setTopP(0.8);
8888
options.setStopSequences(List.of("stop1", "stop2"));
8989
options.setMetadata(new Metadata("userId_123"));
90-
options.setInternalToolExecutionMaxAttempts(3);
90+
options.setInternalToolExecutionMaxIterations(3);
9191

9292
assertThat(options.getModel()).isEqualTo("test-model");
9393
assertThat(options.getMaxTokens()).isEqualTo(100);
@@ -96,7 +96,7 @@ void testSetters() {
9696
assertThat(options.getTopP()).isEqualTo(0.8);
9797
assertThat(options.getStopSequences()).isEqualTo(List.of("stop1", "stop2"));
9898
assertThat(options.getMetadata()).isEqualTo(new Metadata("userId_123"));
99-
assertThat(options.getInternalToolExecutionMaxAttempts()).isEqualTo(3);
99+
assertThat(options.getInternalToolExecutionMaxIterations()).isEqualTo(3);
100100
}
101101

102102
@Test
@@ -109,8 +109,8 @@ void testDefaultValues() {
109109
assertThat(options.getTopP()).isNull();
110110
assertThat(options.getStopSequences()).isNull();
111111
assertThat(options.getMetadata()).isNull();
112-
assertThat(options.getInternalToolExecutionMaxAttempts())
113-
.isEqualTo(ToolCallingChatOptions.DEFAULT_TOOL_EXECUTION_MAX_ATTEMPTS);
112+
assertThat(options.getInternalToolExecutionMaxIterations())
113+
.isEqualTo(ToolCallingChatOptions.DEFAULT_TOOL_EXECUTION_MAX_ITERATIONS);
114114
}
115115

116116
}

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons
256256
return internalCall(prompt, previousChatResponse, 1);
257257
}
258258

259-
public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatResponse, int attempts) {
259+
public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatResponse, int iterations) {
260260

261261
ChatModelObservationContext observationContext = ChatModelObservationContext.builder()
262262
.prompt(prompt)
@@ -276,7 +276,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons
276276
return chatResponse;
277277
});
278278

279-
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), response, attempts)) {
279+
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), response, iterations)) {
280280
var toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, response);
281281
if (toolExecutionResult.returnDirect()) {
282282
// Return tool execution result directly to the client.
@@ -288,7 +288,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons
288288
else {
289289
// Send the tool execution result back to the model.
290290
return this.internalCall(new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()),
291-
response, attempts + 1);
291+
response, iterations + 1);
292292
}
293293
}
294294

@@ -307,7 +307,7 @@ public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCha
307307
return this.internalStream(prompt, previousChatResponse, 1);
308308
}
309309

310-
public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousChatResponse, int attempts) {
310+
public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousChatResponse, int iterations) {
311311

312312
return Flux.deferContextual(contextView -> {
313313
ChatCompletionsOptions options = toAzureChatCompletionsOptions(prompt);
@@ -388,7 +388,7 @@ public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCha
388388

389389
return chatResponseFlux.flatMap(chatResponse -> {
390390
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), chatResponse,
391-
attempts)) {
391+
iterations)) {
392392
// FIXME: bounded elastic needs to be used since tool calling
393393
// is currently only synchronous
394394
return Flux.defer(() -> {
@@ -404,7 +404,7 @@ public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCha
404404
// Send the tool execution result back to the model.
405405
return this.internalStream(
406406
new Prompt(toolExecutionResult.conversationHistory(), prompt.getOptions()),
407-
chatResponse, attempts + 1);
407+
chatResponse, iterations + 1);
408408
}
409409
}).subscribeOn(Schedulers.boundedElastic());
410410
}
@@ -677,9 +677,9 @@ Prompt buildRequestPrompt(Prompt prompt) {
677677
requestOptions.setInternalToolExecutionEnabled(
678678
ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionEnabled(),
679679
this.defaultOptions.getInternalToolExecutionEnabled()));
680-
runtimeOptions.setInternalToolExecutionMaxAttempts(
681-
ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionMaxAttempts(),
682-
this.defaultOptions.getInternalToolExecutionMaxAttempts()));
680+
runtimeOptions.setInternalToolExecutionMaxIterations(
681+
ModelOptionsUtils.mergeOption(runtimeOptions.getInternalToolExecutionMaxIterations(),
682+
this.defaultOptions.getInternalToolExecutionMaxIterations()));
683683
requestOptions.setStreamUsage(ModelOptionsUtils.mergeOption(runtimeOptions.getStreamUsage(),
684684
this.defaultOptions.getStreamUsage()));
685685
requestOptions.setToolNames(ToolCallingChatOptions.mergeToolNames(runtimeOptions.getToolNames(),
@@ -692,7 +692,7 @@ Prompt buildRequestPrompt(Prompt prompt) {
692692
else {
693693
requestOptions.setInternalToolExecutionEnabled(this.defaultOptions.getInternalToolExecutionEnabled());
694694
requestOptions
695-
.setInternalToolExecutionMaxAttempts(this.defaultOptions.getInternalToolExecutionMaxAttempts());
695+
.setInternalToolExecutionMaxIterations(this.defaultOptions.getInternalToolExecutionMaxIterations());
696696
requestOptions.setStreamUsage(this.defaultOptions.getStreamUsage());
697697
requestOptions.setToolNames(this.defaultOptions.getToolNames());
698698
requestOptions.setToolCallbacks(this.defaultOptions.getToolCallbacks());

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public class AzureOpenAiChatOptions implements ToolCallingChatOptions {
202202
private Boolean internalToolExecutionEnabled;
203203

204204
@JsonIgnore
205-
private Integer internalToolExecutionMaxAttempts = ToolCallingChatOptions.DEFAULT_TOOL_EXECUTION_MAX_ATTEMPTS;
205+
private Integer internalToolExecutionMaxIterations = ToolCallingChatOptions.DEFAULT_TOOL_EXECUTION_MAX_ITERATIONS;
206206

207207
/**
208208
* Whether to include token usage information in streaming chat completion responses.
@@ -262,13 +262,13 @@ public void setInternalToolExecutionEnabled(@Nullable Boolean internalToolExecut
262262
}
263263

264264
@Override
265-
public Integer getInternalToolExecutionMaxAttempts() {
266-
return this.internalToolExecutionMaxAttempts;
265+
public Integer getInternalToolExecutionMaxIterations() {
266+
return this.internalToolExecutionMaxIterations;
267267
}
268268

269269
@Override
270-
public void setInternalToolExecutionMaxAttempts(Integer internalToolExecutionMaxAttempts) {
271-
this.internalToolExecutionMaxAttempts = internalToolExecutionMaxAttempts;
270+
public void setInternalToolExecutionMaxIterations(Integer internalToolExecutionMaxIterations) {
271+
this.internalToolExecutionMaxIterations = internalToolExecutionMaxIterations;
272272
}
273273

274274
public static Builder builder() {
@@ -298,7 +298,7 @@ public static AzureOpenAiChatOptions fromOptions(AzureOpenAiChatOptions fromOpti
298298
.enhancements(fromOptions.getEnhancements())
299299
.toolContext(fromOptions.getToolContext() != null ? new HashMap<>(fromOptions.getToolContext()) : null)
300300
.internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled())
301-
.internalToolExecutionMaxAttempts(fromOptions.getInternalToolExecutionMaxAttempts())
301+
.internalToolExecutionMaxIterations(fromOptions.getInternalToolExecutionMaxIterations())
302302
.streamOptions(fromOptions.getStreamOptions())
303303
.toolCallbacks(
304304
fromOptions.getToolCallbacks() != null ? new ArrayList<>(fromOptions.getToolCallbacks()) : null)
@@ -519,7 +519,7 @@ public boolean equals(Object o) {
519519
&& Objects.equals(this.toolCallbacks, that.toolCallbacks)
520520
&& Objects.equals(this.toolNames, that.toolNames)
521521
&& Objects.equals(this.internalToolExecutionEnabled, that.internalToolExecutionEnabled)
522-
&& Objects.equals(this.internalToolExecutionMaxAttempts, that.internalToolExecutionMaxAttempts)
522+
&& Objects.equals(this.internalToolExecutionMaxIterations, that.internalToolExecutionMaxIterations)
523523
&& Objects.equals(this.logprobs, that.logprobs) && Objects.equals(this.topLogProbs, that.topLogProbs)
524524
&& Objects.equals(this.enhancements, that.enhancements)
525525
&& Objects.equals(this.streamOptions, that.streamOptions)
@@ -535,7 +535,7 @@ public boolean equals(Object o) {
535535
public int hashCode() {
536536
return Objects.hash(this.logitBias, this.user, this.n, this.stop, this.deploymentName, this.responseFormat,
537537
this.toolCallbacks, this.toolNames, this.internalToolExecutionEnabled,
538-
this.internalToolExecutionMaxAttempts, this.seed, this.logprobs, this.topLogProbs, this.enhancements,
538+
this.internalToolExecutionMaxIterations, this.seed, this.logprobs, this.topLogProbs, this.enhancements,
539539
this.streamOptions, this.reasoningEffort, this.enableStreamUsage, this.toolContext, this.maxTokens,
540540
this.frequencyPenalty, this.presencePenalty, this.temperature, this.topP);
541541
}
@@ -680,8 +680,8 @@ public Builder internalToolExecutionEnabled(@Nullable Boolean internalToolExecut
680680
return this;
681681
}
682682

683-
public Builder internalToolExecutionMaxAttempts(@Nullable Integer internalToolExecutionMaxAttempts) {
684-
this.options.setInternalToolExecutionMaxAttempts(internalToolExecutionMaxAttempts);
683+
public Builder internalToolExecutionMaxIterations(@Nullable Integer internalToolExecutionMaxIterations) {
684+
this.options.setInternalToolExecutionMaxIterations(internalToolExecutionMaxIterations);
685685
return this;
686686
}
687687

0 commit comments

Comments
 (0)