fix: remove extra_body tool_choice hack for Claude backend
Build and Push / release (push) Successful in 3s
Build and Push / build (push) Successful in 1m57s

PydanticAI handles tool_choice natively for Anthropic. The extra_body
hack caused an infinite tool call loop where Claude kept calling the
same tool because tool_choice was forced to "any".

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-05 11:51:42 +01:00
co-authored by Claude Opus 4.5
parent 6dd1c2e2a9
commit e15def607d
5 changed files with 32 additions and 6 deletions
+5 -5
View File
@@ -494,13 +494,13 @@ class TatlockAgent(AgentInterface):
)
# Run with scoped tools and tracker
# Force tool_choice: required to make LLM actually call tools
from pydantic_ai.settings import ModelSettings
# Force tool_choice to make LLM actually call tools
from src.anthropic.model_selector import get_tool_choice_settings
result = await scoped_agent.run(
enriched_message,
message_history=pydantic_history if pydantic_history else None,
deps=tool_tracker,
model_settings=ModelSettings(extra_body={"tool_choice": "required"})
model_settings=get_tool_choice_settings(),
)
logger.info(
@@ -624,7 +624,6 @@ class TatlockAgent(AgentInterface):
- tool_outputs: Dict mapping tool names to their outputs
- raw_output: The agent's raw text output
"""
from pydantic_ai.settings import ModelSettings
from pydantic_ai.messages import (
ModelRequest,
ModelResponse,
@@ -684,11 +683,12 @@ class TatlockAgent(AgentInterface):
)
# Run with scoped tools and tracker
from src.anthropic.model_selector import get_tool_choice_settings
result = await scoped_agent.run(
enriched_message,
message_history=pydantic_history if pydantic_history else None,
deps=tool_tracker,
model_settings=ModelSettings(extra_body={"tool_choice": "required"})
model_settings=get_tool_choice_settings(),
)
# Extract tool calls and results from the agent's messages