Skip to content

Commit 0d748e2

Browse files
tzolovilayaperumalg
authored andcommitted
feat(tool): Add ToolExecutionEligibilityChecker interface
Introduce a new ToolExecutionEligibilityChecker interface to provide a more flexible way to determine when tool execution should be performed based on model responses. This abstraction replaces the hardcoded logic previously scattered across the codebase. - Adds a new ToolExecutionEligibilityChecker interface in spring-ai-core - Integrates the checker into OpenAiChatModel with appropriate defaults - Updates OpenAiChatAutoConfiguration to support the new interface - Provides a default implementation that maintains backward compatibility Signed-off-by: Christian Tzolov <[email protected]> refactor: Replace ToolExecutionEligibilityChecker with ToolExecutionEligibilityPredicate - Replacing ToolExecutionEligibilityChecker with ToolExecutionEligibilityPredicate - Changing from Function<ChatResponse, Boolean> to BiPredicate<ChatOptions, ChatResponse> - Adding a DefaultToolExecutionEligibilityPredicate implementation - Updating AnthropicChatModel and OpenAiChatModel to use the new predicate - Updating auto-configurations to inject the new predicate - Adding comprehensive tests for the new predicate implementation The new approach provides a cleaner and more consistent way to determine when tool execution should be performed based on both prompt options and chat responses. Add Bedrock Converse support add mistral support Add ollama and vertex gemini add ToolExecutionEligibilityPredicate docs Signed-off-by: Christian Tzolov <[email protected]>
1 parent fbd03b7 commit 0d748e2

File tree

24 files changed

+700
-49
lines changed

24 files changed

+700
-49
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/main/java/org/springframework/ai/model/anthropic/autoconfigure/AnthropicChatAutoConfiguration.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import org.springframework.ai.chat.observation.ChatModelObservationConvention;
2828
import org.springframework.ai.model.function.DefaultFunctionCallbackResolver;
2929
import org.springframework.ai.model.function.FunctionCallbackResolver;
30+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
3031
import org.springframework.ai.model.tool.ToolCallingManager;
32+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
3133
import org.springframework.beans.factory.ObjectProvider;
3234
import org.springframework.boot.autoconfigure.AutoConfiguration;
3335
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
@@ -79,12 +81,15 @@ public AnthropicApi anthropicApi(AnthropicConnectionProperties connectionPropert
7981
public AnthropicChatModel anthropicChatModel(AnthropicApi anthropicApi, AnthropicChatProperties chatProperties,
8082
RetryTemplate retryTemplate, ToolCallingManager toolCallingManager,
8183
ObjectProvider<ObservationRegistry> observationRegistry,
82-
ObjectProvider<ChatModelObservationConvention> observationConvention) {
84+
ObjectProvider<ChatModelObservationConvention> observationConvention,
85+
ObjectProvider<ToolExecutionEligibilityPredicate> anthropicToolExecutionEligibilityPredicate) {
8386

8487
var chatModel = AnthropicChatModel.builder()
8588
.anthropicApi(anthropicApi)
8689
.defaultOptions(chatProperties.getOptions())
8790
.toolCallingManager(toolCallingManager)
91+
.toolExecutionEligibilityPredicate(anthropicToolExecutionEligibilityPredicate
92+
.getIfUnique(() -> new DefaultToolExecutionEligibilityPredicate()))
8893
.retryTemplate(retryTemplate)
8994
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
9095
.build();

auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiChatAutoConfiguration.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import org.springframework.ai.model.SpringAIModels;
2626
import org.springframework.ai.model.function.DefaultFunctionCallbackResolver;
2727
import org.springframework.ai.model.function.FunctionCallbackResolver;
28+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
2829
import org.springframework.ai.model.tool.ToolCallingManager;
30+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
2931
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
3032
import org.springframework.beans.factory.ObjectProvider;
3133
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -59,12 +61,15 @@ public class AzureOpenAiChatAutoConfiguration {
5961
public AzureOpenAiChatModel azureOpenAiChatModel(OpenAIClientBuilder openAIClientBuilder,
6062
AzureOpenAiChatProperties chatProperties, ToolCallingManager toolCallingManager,
6163
ObjectProvider<ObservationRegistry> observationRegistry,
62-
ObjectProvider<ChatModelObservationConvention> observationConvention) {
64+
ObjectProvider<ChatModelObservationConvention> observationConvention,
65+
ObjectProvider<ToolExecutionEligibilityPredicate> azureOpenAiToolExecutionEligibilityPredicate) {
6366

6467
var chatModel = AzureOpenAiChatModel.builder()
6568
.openAIClientBuilder(openAIClientBuilder)
6669
.defaultOptions(chatProperties.getOptions())
6770
.toolCallingManager(toolCallingManager)
71+
.toolExecutionEligibilityPredicate(azureOpenAiToolExecutionEligibilityPredicate
72+
.getIfUnique(() -> new DefaultToolExecutionEligibilityPredicate()))
6873
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
6974
.build();
7075
observationConvention.ifAvailable(chatModel::setObservationConvention);

auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/converse/autoconfigure/BedrockConverseProxyChatAutoConfiguration.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
import org.springframework.ai.chat.observation.ChatModelObservationConvention;
3232
import org.springframework.ai.model.function.DefaultFunctionCallbackResolver;
3333
import org.springframework.ai.model.function.FunctionCallbackResolver;
34+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
3435
import org.springframework.ai.model.tool.ToolCallingManager;
36+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
3537
import org.springframework.beans.factory.ObjectProvider;
3638
import org.springframework.boot.autoconfigure.AutoConfiguration;
3739
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
@@ -70,7 +72,8 @@ public BedrockProxyChatModel bedrockProxyChatModel(AwsCredentialsProvider creden
7072
ObjectProvider<ObservationRegistry> observationRegistry,
7173
ObjectProvider<ChatModelObservationConvention> observationConvention,
7274
ObjectProvider<BedrockRuntimeClient> bedrockRuntimeClient,
73-
ObjectProvider<BedrockRuntimeAsyncClient> bedrockRuntimeAsyncClient) {
75+
ObjectProvider<BedrockRuntimeAsyncClient> bedrockRuntimeAsyncClient,
76+
ObjectProvider<ToolExecutionEligibilityPredicate> bedrockToolExecutionEligibilityPredicate) {
7477

7578
var chatModel = BedrockProxyChatModel.builder()
7679
.credentialsProvider(credentialsProvider)
@@ -79,6 +82,8 @@ public BedrockProxyChatModel bedrockProxyChatModel(AwsCredentialsProvider creden
7982
.defaultOptions(chatProperties.getOptions())
8083
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
8184
.toolCallingManager(toolCallingManager)
85+
.toolExecutionEligibilityPredicate(bedrockToolExecutionEligibilityPredicate
86+
.getIfUnique(() -> new DefaultToolExecutionEligibilityPredicate()))
8287
.bedrockRuntimeClient(bedrockRuntimeClient.getIfAvailable())
8388
.bedrockRuntimeAsyncClient(bedrockRuntimeAsyncClient.getIfAvailable())
8489
.build();

auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiChatAutoConfiguration.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import org.springframework.ai.model.SpringAIModels;
2626
import org.springframework.ai.model.function.DefaultFunctionCallbackResolver;
2727
import org.springframework.ai.model.function.FunctionCallbackResolver;
28+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
2829
import org.springframework.ai.model.tool.ToolCallingManager;
30+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
2931
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
3032
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3133
import org.springframework.beans.factory.ObjectProvider;
@@ -69,7 +71,8 @@ public MistralAiChatModel mistralAiChatModel(MistralAiCommonProperties commonPro
6971
MistralAiChatProperties chatProperties, ObjectProvider<RestClient.Builder> restClientBuilderProvider,
7072
ToolCallingManager toolCallingManager, RetryTemplate retryTemplate,
7173
ResponseErrorHandler responseErrorHandler, ObjectProvider<ObservationRegistry> observationRegistry,
72-
ObjectProvider<ChatModelObservationConvention> observationConvention) {
74+
ObjectProvider<ChatModelObservationConvention> observationConvention,
75+
ObjectProvider<ToolExecutionEligibilityPredicate> mistralAiToolExecutionEligibilityPredicate) {
7376

7477
var mistralAiApi = mistralAiApi(chatProperties.getApiKey(), commonProperties.getApiKey(),
7578
chatProperties.getBaseUrl(), commonProperties.getBaseUrl(),
@@ -79,6 +82,8 @@ public MistralAiChatModel mistralAiChatModel(MistralAiCommonProperties commonPro
7982
.mistralAiApi(mistralAiApi)
8083
.defaultOptions(chatProperties.getOptions())
8184
.toolCallingManager(toolCallingManager)
85+
.toolExecutionEligibilityPredicate(mistralAiToolExecutionEligibilityPredicate
86+
.getIfUnique(() -> new DefaultToolExecutionEligibilityPredicate()))
8287
.retryTemplate(retryTemplate)
8388
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
8489
.build();

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfiguration.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import org.springframework.ai.model.SpringAIModels;
2424
import org.springframework.ai.model.function.DefaultFunctionCallbackResolver;
2525
import org.springframework.ai.model.function.FunctionCallbackResolver;
26+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
2627
import org.springframework.ai.model.tool.ToolCallingManager;
28+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
2729
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
2830
import org.springframework.ai.ollama.OllamaChatModel;
2931
import org.springframework.ai.ollama.api.OllamaApi;
@@ -64,14 +66,17 @@ public class OllamaChatAutoConfiguration {
6466
public OllamaChatModel ollamaChatModel(OllamaApi ollamaApi, OllamaChatProperties properties,
6567
OllamaInitializationProperties initProperties, ToolCallingManager toolCallingManager,
6668
ObjectProvider<ObservationRegistry> observationRegistry,
67-
ObjectProvider<ChatModelObservationConvention> observationConvention) {
69+
ObjectProvider<ChatModelObservationConvention> observationConvention,
70+
ObjectProvider<ToolExecutionEligibilityPredicate> ollamaToolExecutionEligibilityPredicate) {
6871
var chatModelPullStrategy = initProperties.getChat().isInclude() ? initProperties.getPullModelStrategy()
6972
: PullModelStrategy.NEVER;
7073

7174
var chatModel = OllamaChatModel.builder()
7275
.ollamaApi(ollamaApi)
7376
.defaultOptions(properties.getOptions())
7477
.toolCallingManager(toolCallingManager)
78+
.toolExecutionEligibilityPredicate(ollamaToolExecutionEligibilityPredicate
79+
.getIfUnique(() -> new DefaultToolExecutionEligibilityPredicate()))
7580
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
7681
.modelManagementOptions(
7782
new ModelManagementOptions(chatModelPullStrategy, initProperties.getChat().getAdditionalModels(),

auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiChatAutoConfiguration.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import org.springframework.ai.model.SpringAIModels;
2525
import org.springframework.ai.model.function.DefaultFunctionCallbackResolver;
2626
import org.springframework.ai.model.function.FunctionCallbackResolver;
27+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
2728
import org.springframework.ai.model.tool.ToolCallingManager;
29+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
2830
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
2931
import org.springframework.ai.openai.OpenAiChatModel;
3032
import org.springframework.ai.openai.api.OpenAiApi;
@@ -72,7 +74,8 @@ public OpenAiChatModel openAiChatModel(OpenAiConnectionProperties commonProperti
7274
ObjectProvider<WebClient.Builder> webClientBuilderProvider, ToolCallingManager toolCallingManager,
7375
RetryTemplate retryTemplate, ResponseErrorHandler responseErrorHandler,
7476
ObjectProvider<ObservationRegistry> observationRegistry,
75-
ObjectProvider<ChatModelObservationConvention> observationConvention) {
77+
ObjectProvider<ChatModelObservationConvention> observationConvention,
78+
ObjectProvider<ToolExecutionEligibilityPredicate> openAiToolExecutionEligibilityPredicate) {
7679

7780
var openAiApi = openAiApi(chatProperties, commonProperties,
7881
restClientBuilderProvider.getIfAvailable(RestClient::builder),
@@ -82,6 +85,8 @@ public OpenAiChatModel openAiChatModel(OpenAiConnectionProperties commonProperti
8285
.openAiApi(openAiApi)
8386
.defaultOptions(chatProperties.getOptions())
8487
.toolCallingManager(toolCallingManager)
88+
.toolExecutionEligibilityPredicate(openAiToolExecutionEligibilityPredicate
89+
.getIfUnique(() -> new DefaultToolExecutionEligibilityPredicate()))
8590
.retryTemplate(retryTemplate)
8691
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
8792
.build();

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/main/java/org/springframework/ai/model/vertexai/autoconfigure/gemini/VertexAiGeminiChatAutoConfiguration.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import org.springframework.ai.chat.observation.ChatModelObservationConvention;
2626
import org.springframework.ai.model.SpringAIModelProperties;
2727
import org.springframework.ai.model.SpringAIModels;
28+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
2829
import org.springframework.ai.model.tool.ToolCallingManager;
30+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
2931
import org.springframework.ai.model.tool.autoconfigure.ToolCallingAutoConfiguration;
3032
import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration;
3133
import org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel;
@@ -93,12 +95,15 @@ public VertexAI vertexAi(VertexAiGeminiConnectionProperties connectionProperties
9395
public VertexAiGeminiChatModel vertexAiGeminiChat(VertexAI vertexAi, VertexAiGeminiChatProperties chatProperties,
9496
ToolCallingManager toolCallingManager, ApplicationContext context, RetryTemplate retryTemplate,
9597
ObjectProvider<ObservationRegistry> observationRegistry,
96-
ObjectProvider<ChatModelObservationConvention> observationConvention) {
98+
ObjectProvider<ChatModelObservationConvention> observationConvention,
99+
ObjectProvider<ToolExecutionEligibilityPredicate> vertexAiGeminiToolExecutionEligibilityPredicate) {
97100

98101
VertexAiGeminiChatModel chatModel = VertexAiGeminiChatModel.builder()
99102
.vertexAI(vertexAi)
100103
.defaultOptions(chatProperties.getOptions())
101104
.toolCallingManager(toolCallingManager)
105+
.toolExecutionEligibilityPredicate(vertexAiGeminiToolExecutionEligibilityPredicate
106+
.getIfUnique(() -> new DefaultToolExecutionEligibilityPredicate()))
102107
.retryTemplate(retryTemplate)
103108
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
104109
.build();

auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/gemini/tool/FunctionCallWithPromptFunctionIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class FunctionCallWithPromptFunctionIT {
5050
void functionCallTest() {
5151
this.contextRunner
5252
.withPropertyValues("spring.ai.vertex.ai.gemini.chat.options.model="
53-
+ VertexAiGeminiChatModel.ChatModel.GEMINI_2_0_FLASH_LIGHT.getValue())
53+
+ VertexAiGeminiChatModel.ChatModel.GEMINI_2_5_PRO.getValue())
5454
.run(context -> {
5555

5656
VertexAiGeminiChatModel chatModel = context.getBean(VertexAiGeminiChatModel.class);

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

+28-4
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,10 @@
6464
import org.springframework.ai.chat.prompt.Prompt;
6565
import org.springframework.ai.content.Media;
6666
import org.springframework.ai.model.ModelOptionsUtils;
67+
import org.springframework.ai.model.tool.DefaultToolExecutionEligibilityPredicate;
6768
import org.springframework.ai.model.tool.ToolCallingChatOptions;
6869
import org.springframework.ai.model.tool.ToolCallingManager;
70+
import org.springframework.ai.model.tool.ToolExecutionEligibilityPredicate;
6971
import org.springframework.ai.model.tool.ToolExecutionResult;
7072
import org.springframework.ai.retry.RetryUtils;
7173
import org.springframework.ai.tool.definition.ToolDefinition;
@@ -124,6 +126,12 @@ public class AnthropicChatModel implements ChatModel {
124126

125127
private final ToolCallingManager toolCallingManager;
126128

129+
/**
130+
* The tool execution eligibility predicate used to determine if a tool can be
131+
* executed.
132+
*/
133+
private final ToolExecutionEligibilityPredicate toolExecutionEligibilityPredicate;
134+
127135
/**
128136
* Conventions to use for generating observations.
129137
*/
@@ -132,18 +140,27 @@ public class AnthropicChatModel implements ChatModel {
132140
public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaultOptions,
133141
ToolCallingManager toolCallingManager, RetryTemplate retryTemplate,
134142
ObservationRegistry observationRegistry) {
143+
this(anthropicApi, defaultOptions, toolCallingManager, retryTemplate, observationRegistry,
144+
new DefaultToolExecutionEligibilityPredicate());
145+
}
146+
147+
public AnthropicChatModel(AnthropicApi anthropicApi, AnthropicChatOptions defaultOptions,
148+
ToolCallingManager toolCallingManager, RetryTemplate retryTemplate, ObservationRegistry observationRegistry,
149+
ToolExecutionEligibilityPredicate toolExecutionEligibilityPredicate) {
135150

136151
Assert.notNull(anthropicApi, "anthropicApi cannot be null");
137152
Assert.notNull(defaultOptions, "defaultOptions cannot be null");
138153
Assert.notNull(toolCallingManager, "toolCallingManager cannot be null");
139154
Assert.notNull(retryTemplate, "retryTemplate cannot be null");
140155
Assert.notNull(observationRegistry, "observationRegistry cannot be null");
156+
Assert.notNull(toolExecutionEligibilityPredicate, "toolExecutionEligibilityPredicate cannot be null");
141157

142158
this.anthropicApi = anthropicApi;
143159
this.defaultOptions = defaultOptions;
144160
this.toolCallingManager = toolCallingManager;
145161
this.retryTemplate = retryTemplate;
146162
this.observationRegistry = observationRegistry;
163+
this.toolExecutionEligibilityPredicate = toolExecutionEligibilityPredicate;
147164
}
148165

149166
@Override
@@ -184,8 +201,7 @@ public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatRespons
184201
return chatResponse;
185202
});
186203

187-
if (ToolCallingChatOptions.isInternalToolExecutionEnabled(prompt.getOptions()) && response != null
188-
&& response.hasToolCalls()) {
204+
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), response)) {
189205
var toolExecutionResult = this.toolCallingManager.executeToolCalls(prompt, response);
190206
if (toolExecutionResult.returnDirect()) {
191207
// Return tool execution result directly to the client.
@@ -243,7 +259,7 @@ public Flux<ChatResponse> internalStream(Prompt prompt, ChatResponse previousCha
243259
Usage accumulatedUsage = UsageUtils.getCumulativeUsage(currentChatResponseUsage, previousChatResponse);
244260
ChatResponse chatResponse = toChatResponse(chatCompletionResponse, accumulatedUsage);
245261

246-
if (ToolCallingChatOptions.isInternalToolExecutionEnabled(prompt.getOptions()) && chatResponse.hasToolCalls() && chatResponse.hasFinishReasons(Set.of("tool_use"))) {
262+
if (this.toolExecutionEligibilityPredicate.isToolExecutionRequired(prompt.getOptions(), chatResponse) && chatResponse.hasFinishReasons(Set.of("tool_use"))) {
247263
// FIXME: bounded elastic needs to be used since tool calling
248264
// is currently only synchronous
249265
return Flux.defer(() -> {
@@ -540,6 +556,8 @@ public static final class Builder {
540556

541557
private ObservationRegistry observationRegistry = ObservationRegistry.NOOP;
542558

559+
private ToolExecutionEligibilityPredicate toolExecutionEligibilityPredicate = new DefaultToolExecutionEligibilityPredicate();
560+
543561
private Builder() {
544562
}
545563

@@ -563,6 +581,12 @@ public Builder toolCallingManager(ToolCallingManager toolCallingManager) {
563581
return this;
564582
}
565583

584+
public Builder toolExecutionEligibilityPredicate(
585+
ToolExecutionEligibilityPredicate toolExecutionEligibilityPredicate) {
586+
this.toolExecutionEligibilityPredicate = toolExecutionEligibilityPredicate;
587+
return this;
588+
}
589+
566590
public Builder observationRegistry(ObservationRegistry observationRegistry) {
567591
this.observationRegistry = observationRegistry;
568592
return this;
@@ -574,7 +598,7 @@ public AnthropicChatModel build() {
574598
observationRegistry);
575599
}
576600
return new AnthropicChatModel(anthropicApi, defaultOptions, DEFAULT_TOOL_CALLING_MANAGER, retryTemplate,
577-
observationRegistry);
601+
observationRegistry, toolExecutionEligibilityPredicate);
578602
}
579603

580604
}

0 commit comments

Comments
 (0)