Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Closes #2799
Adds
tool_choicetoModelSettings, letting users control how the model interacts with function tools.Currently Pydantic AI internally decides whether to use
tool_choice='auto'or'required'based on output configuration, but users have no way to override this. The workaround was usingextra_body={'tool_choice': 'none'}which is provider-specific and doesn't work everywhere.This PR allows the user to set
tool_choiceto:One important distinction: this only affects
function tools(the ones you register on the agent), not output tools (used internally for structured output). So if you have an agent withoutput_type=SomeModeland you set
tool_choice='none', the output tool stays available - you'll just get a warning about it.Implementation is spread across all model providers since each has its own API format for tool_choice.
Added a
resolve_tool_choiceutility that handles validation (checking tool names exist, warning aboutconflicts with output tools) and returns a normalized representation that each provider then maps to their specific format.
Bedrock is a bit of a special case - it doesn't support 'none' at all, so we fall back to 'auto' with a warning. Anthropic has a constraint where 'required' and specific tool selection don't work with thinking/extended thinking enabled.
TODO