diff --git a/python/packages/openai/agent_framework_openai/_chat_client.py b/python/packages/openai/agent_framework_openai/_chat_client.py index 75a9af765f..7fa68f1f86 100644 --- a/python/packages/openai/agent_framework_openai/_chat_client.py +++ b/python/packages/openai/agent_framework_openai/_chat_client.py @@ -619,6 +619,9 @@ class RawOpenAIChatClient( # type: ignore[misc] response_format: Any | None = None def _finalize_with_captured_format(updates: Sequence[ChatResponseUpdate]) -> ChatResponse[Any]: + # ResponseStream only calls the finalizer after iterating or draining `_stream()`, + # so `response_format` has already been populated from the validated request state + # unless request setup failed before streaming began. return self._finalize_response_updates(updates, response_format=response_format) async def _stream() -> AsyncIterable[ChatResponseUpdate]: diff --git a/python/packages/openai/tests/openai/test_openai_chat_client.py b/python/packages/openai/tests/openai/test_openai_chat_client.py index 170bcbdf95..31c3c26fe0 100644 --- a/python/packages/openai/tests/openai/test_openai_chat_client.py +++ b/python/packages/openai/tests/openai/test_openai_chat_client.py @@ -874,7 +874,11 @@ async def test_streaming_text_format_preserves_final_structured_output() -> None patch.object(client.client.responses, "stream", return_value=fake_stream_ctx), patch.object(client, "_get_metadata_from_response", return_value={}), ): - stream = client._inner_get_response(messages=[Message(role="user", contents=["Hi"])], options={}, stream=True) + stream = client.get_response( + messages=[Message(role="user", contents=["Hi"])], + options={"response_format": OutputStruct}, + stream=True, + ) response = await stream.get_final_response() assert response.model == "test-model"