Skip to content

Commit e81621b

Browse files
authored
Merge branch 'main' into main
2 parents 1d7a8a4 + c4c9e77 commit e81621b

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

pydantic_ai_slim/pydantic_ai/models/openai.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,10 +1144,10 @@ async def _responses_create(
11441144
+ list(model_settings.get('openai_builtin_tools', []))
11451145
+ self._get_tools(model_request_parameters)
11461146
)
1147-
1147+
profile = OpenAIModelProfile.from_profile(self.profile)
11481148
if not tools:
11491149
tool_choice: Literal['none', 'required', 'auto'] | None = None
1150-
elif not model_request_parameters.allow_text_output:
1150+
elif not model_request_parameters.allow_text_output and profile.openai_supports_tool_choice_required:
11511151
tool_choice = 'required'
11521152
else:
11531153
tool_choice = 'auto'
@@ -1180,7 +1180,6 @@ async def _responses_create(
11801180
text = text or {}
11811181
text['verbosity'] = verbosity
11821182

1183-
profile = OpenAIModelProfile.from_profile(self.profile)
11841183
unsupported_model_settings = profile.openai_unsupported_model_settings
11851184
for setting in unsupported_model_settings:
11861185
model_settings.pop(setting, None)

tests/models/test_openai.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,14 @@
4545
from pydantic_ai.usage import RequestUsage
4646

4747
from ..conftest import IsDatetime, IsNow, IsStr, TestEnv, try_import
48-
from .mock_openai import MockOpenAI, completion_message, get_mock_chat_completion_kwargs
48+
from .mock_openai import (
49+
MockOpenAI,
50+
MockOpenAIResponses,
51+
completion_message,
52+
get_mock_chat_completion_kwargs,
53+
get_mock_responses_kwargs,
54+
response_message,
55+
)
4956

5057
with try_import() as imports_successful:
5158
from openai import APIStatusError, AsyncOpenAI
@@ -2978,6 +2985,25 @@ async def test_tool_choice_fallback(allow_model_requests: None) -> None:
29782985
assert get_mock_chat_completion_kwargs(mock_client)[0]['tool_choice'] == 'auto'
29792986

29802987

2988+
async def test_tool_choice_fallback_response_api(allow_model_requests: None) -> None:
2989+
"""Ensure tool_choice falls back to 'auto' for Responses API when 'required' unsupported."""
2990+
profile = OpenAIModelProfile(openai_supports_tool_choice_required=False).update(openai_model_profile('stub'))
2991+
2992+
mock_client = MockOpenAIResponses.create_mock(response_message([]))
2993+
model = OpenAIResponsesModel('openai/gpt-oss', provider=OpenAIProvider(openai_client=mock_client), profile=profile)
2994+
2995+
params = ModelRequestParameters(function_tools=[ToolDefinition(name='x')], allow_text_output=False)
2996+
2997+
await model._responses_create( # pyright: ignore[reportPrivateUsage]
2998+
messages=[],
2999+
stream=False,
3000+
model_settings={},
3001+
model_request_parameters=params,
3002+
)
3003+
3004+
assert get_mock_responses_kwargs(mock_client)[0]['tool_choice'] == 'auto'
3005+
3006+
29813007
async def test_openai_model_settings_temperature_ignored_on_gpt_5(allow_model_requests: None, openai_api_key: str):
29823008
m = OpenAIChatModel('gpt-5', provider=OpenAIProvider(api_key=openai_api_key))
29833009
agent = Agent(m)

0 commit comments

Comments
 (0)