From b9961b6ec568ff8155e8c702acca8809d444e612 Mon Sep 17 00:00:00 2001 From: Xsidz Date: Sun, 16 Aug 2026 22:51:34 +0530 Subject: [PATCH 1/2] fix(responses): guard against null item/text in stream accumulator and output_text Fixes #3125: response.output_item.added with item=null crashed with AttributeError because event.item.type was accessed unconditionally. Skip the item when null. Fixes #3011: Response.output_text crashed with TypeError when a content block had text=null. Filter out null text values before joining. --- src/openai/lib/streaming/responses/_responses.py | 4 +++- src/openai/types/responses/response.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/openai/lib/streaming/responses/_responses.py b/src/openai/lib/streaming/responses/_responses.py index 6975a9260d..2c803889c4 100644 --- a/src/openai/lib/streaming/responses/_responses.py +++ b/src/openai/lib/streaming/responses/_responses.py @@ -328,7 +328,9 @@ def accumulate_event(self, event: RawResponseStreamEvent) -> ParsedResponseSnaps return self._create_initial_response(event) if event.type == "response.output_item.added": - if event.item.type == "function_call": + if event.item is None: + pass + elif event.item.type == "function_call": snapshot.output.append( construct_type_unchecked( type_=cast(Any, ParsedResponseFunctionToolCall), value=event.item.to_dict() diff --git a/src/openai/types/responses/response.py b/src/openai/types/responses/response.py index 762080dc0f..39c0590de8 100644 --- a/src/openai/types/responses/response.py +++ b/src/openai/types/responses/response.py @@ -486,7 +486,7 @@ def output_text(self) -> str: for output in self.output: if output.type == "message": for content in output.content: - if content.type == "output_text": + if content.type == "output_text" and content.text is not None: texts.append(content.text) return "".join(texts) From fe0ebbedb832e54c4b2438534101b8cb4531207c Mon Sep 17 00:00:00 2001 From: Xsidz Date: Mon, 17 Aug 2026 00:09:15 +0530 Subject: [PATCH 2/2] fix(types): make ResponseOutputItemAddedEvent.item Optional to match runtime behavior The accumulator guard in _responses.py already handles event.item being None; make the type annotation reflect this so type-checkers don't flag the null check as dead code. --- src/openai/types/beta/beta_response_output_item_added_event.py | 2 +- src/openai/types/responses/response_output_item_added_event.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/openai/types/beta/beta_response_output_item_added_event.py b/src/openai/types/beta/beta_response_output_item_added_event.py index 4e12b9d3d0..cddf411acb 100644 --- a/src/openai/types/beta/beta_response_output_item_added_event.py +++ b/src/openai/types/beta/beta_response_output_item_added_event.py @@ -19,7 +19,7 @@ class Agent(BaseModel): class BetaResponseOutputItemAddedEvent(BaseModel): """Emitted when a new output item is added.""" - item: BetaResponseOutputItem + item: Optional[BetaResponseOutputItem] = None """The output item that was added. For reasoning items, `encrypted_content` may be incomplete while the item is in diff --git a/src/openai/types/responses/response_output_item_added_event.py b/src/openai/types/responses/response_output_item_added_event.py index 36ac0e2245..a8754b95d8 100644 --- a/src/openai/types/responses/response_output_item_added_event.py +++ b/src/openai/types/responses/response_output_item_added_event.py @@ -1,5 +1,6 @@ # File generated from our OpenAPI spec by Castiron. See CONTRIBUTING.md for details. +from typing import Optional from typing_extensions import Literal from ..._models import BaseModel @@ -11,7 +12,7 @@ class ResponseOutputItemAddedEvent(BaseModel): """Emitted when a new output item is added.""" - item: ResponseOutputItem + item: Optional[ResponseOutputItem] = None """The output item that was added. For reasoning items, `encrypted_content` may be incomplete while the item is in