From 37597b07ab7518127000b713be2050a9e2e47518 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Mon, 22 Jun 2026 10:33:42 -0400 Subject: [PATCH 1/2] fix(parsing): guard against None response.output in parse_response When the API sends `response.output: null` in a response.completed event, parse_response() would raise TypeError: 'NoneType' object is not iterable. Fixes #3314, #3321, #3325 --- src/openai/lib/_parsing/_responses.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openai/lib/_parsing/_responses.py b/src/openai/lib/_parsing/_responses.py index 232718cef6..ad2297e249 100644 --- a/src/openai/lib/_parsing/_responses.py +++ b/src/openai/lib/_parsing/_responses.py @@ -58,7 +58,7 @@ def parse_response( ) -> ParsedResponse[TextFormatT]: output_list: List[ParsedResponseOutputItem[TextFormatT]] = [] - for output in response.output: + for output in (response.output or []): if output.type == "message": content_list: List[ParsedContent[TextFormatT]] = [] for item in output.content: From f633aad112dc988dccf6721679b7f2a0f98c5658 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Mon, 22 Jun 2026 10:35:13 -0400 Subject: [PATCH 2/2] fix(streaming): fall back to snapshot output when response.completed has output=null --- src/openai/lib/streaming/responses/_responses.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/openai/lib/streaming/responses/_responses.py b/src/openai/lib/streaming/responses/_responses.py index 6975a9260d..8fd9e5f480 100644 --- a/src/openai/lib/streaming/responses/_responses.py +++ b/src/openai/lib/streaming/responses/_responses.py @@ -357,9 +357,15 @@ def accumulate_event(self, event: RawResponseStreamEvent) -> ParsedResponseSnaps if output.type == "function_call": output.arguments += event.delta elif event.type == "response.completed": + completed_response = event.response + if completed_response.output is None and snapshot.output: + completed_response = construct_type_unchecked( + type_=type(event.response), + value={**event.response.to_dict(), "output": [item.to_dict() for item in snapshot.output]}, + ) self._completed_response = parse_response( text_format=self._text_format, - response=event.response, + response=completed_response, input_tools=self._input_tools, )