Fix the nullability of the Status property of Responses items - #1346
Fix the nullability of the Status property of Responses items#1346joseharriaga wants to merge 7 commits into
Status property of Responses items#1346Conversation
* Fix optional response item statuses Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com> * Complete optional response item status fixes Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com> * Restore required apply patch output status Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com> * Regenerate API listings Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR aligns the Responses item status field nullability across the TypeSpec source, codegen customization layer, and generated .NET models so that deserialization correctly accepts "status": null without throwing, while also removing now-redundant custom overrides.
Changes:
- Updates the base Responses TypeSpec item models to make many
statusproperties optional and relocates the apply-patch output status note to the base spec. - Removes overlapping
statuscustomizations from the client TSP layer and the codegenOpenAILibraryVisitor. - Regenerates .NET Responses models/serializers so
Statusis nullable and deserializers skipJsonValueKind.Nullforstatus, and removes the corresponding custom partialStatusproperties.
Reviewed changes
Copilot reviewed 14 out of 45 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| specification/client/responses.client.tsp | Removes per-item status lifecycle visibility overrides now handled by the base spec/codegen. |
| specification/base/typespec/responses/models_items.tsp | Makes multiple item status properties optional; documents apply-patch output status requirement in the base model. |
| OpenAI.Responses/src/Generated/Models/WebSearchCallResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/WebSearchCallResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/ReasoningResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/ReasoningResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/MessageResponseItem.Serialization.cs | Removes no-longer-relevant generator customization comments for status write guard. |
| OpenAI.Responses/src/Generated/Models/MessageResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/InternalUnknownResponsesMessageItemResource.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/InternalResponsesUserMessage.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/InternalResponsesSystemMessage.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/InternalResponsesDeveloperMessage.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/InternalResponsesAssistantMessage.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/InternalLocalShellToolCallOutputItemResource.Serialization.cs | Makes status write conditional on Optional.IsDefined; skips status: null in deserialization. |
| OpenAI.Responses/src/Generated/Models/InternalLocalShellToolCallOutputItemResource.cs | Updates Status to nullable and adjusts constructors accordingly. |
| OpenAI.Responses/src/Generated/Models/InternalLocalShellToolCallItemResource.Serialization.cs | Makes status write conditional on Optional.IsDefined; skips status: null in deserialization. |
| OpenAI.Responses/src/Generated/Models/InternalLocalShellToolCallItemResource.cs | Updates Status to nullable and adjusts constructors accordingly. |
| OpenAI.Responses/src/Generated/Models/ImageGenerationCallResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/ImageGenerationCallResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/FunctionCallResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/FunctionCallResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/FunctionCallOutputResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/FunctionCallOutputResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/FileSearchCallResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/FileSearchCallResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/ComputerCallResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/ComputerCallResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/ComputerCallOutputResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/ComputerCallOutputResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/CodeInterpreterCallResponseItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/CodeInterpreterCallResponseItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Generated/Models/ApplyPatchCallItem.Serialization.cs | Skips status when JSON value is null during deserialization. |
| OpenAI.Responses/src/Generated/Models/ApplyPatchCallItem.cs | Adds generated nullable Status property. |
| OpenAI.Responses/src/Custom/Items/WebSearchTool/WebSearchCallResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/Reasoning/ReasoningResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/Message/MessageResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/ImageGenerationTool/ImageGenerationCallResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/FunctionTool/FunctionCallResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/FunctionTool/FunctionCallOutputResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/FileSearchTool/FileSearchCallResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/ComputerTool/ComputerCallResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/ComputerTool/ComputerCallOutputResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/CodeInterpreterTool/CodeInterpreterCallResponseItem.cs | Removes custom Status property override now generated correctly. |
| OpenAI.Responses/src/Custom/Items/ApplyPatch/ApplyPatchCallItem.cs | Removes custom Status property override now generated correctly. |
| codegen/generator/src/OpenAILibraryVisitor.cs | Removes status-specific type mappings (but leaves an unused field that should be cleaned up). |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com>
Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com>
Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com>
Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 15 out of 46 changed files in this pull request and generated no new comments.
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
specification/base/typespec/responses/models_items.tsp:1067
- This change edits the base TypeSpec under
specification/base/typespec/, but the repo’s spec-ingestion guidance treats the base spec as an exact upstream copy (local fixes should live inspecification/client/or be applied upstream and then re-synced). Keeping local patches here risks the next spec ingestion overwriting this fix and reintroducing the null-status bug.
Co-authored-by: joseharriaga <45773732+joseharriaga@users.noreply.github.com>
The
statusproperties of Responses items were not defined as optional in the base TypeSpec. This error in the spec remained hidden because the properties went through a series of overlapping customizations in client.tsp, theOpenAILibraryVisitor, and Custom code that correctly exposed theStatusas nullable in the .NET library. However, these same customizations resulted in incorrect deserialization code that would fail when the value ofstatuswas null. In other words: Even though the property was nullable, our deserialization logic was not acceptingnullas valid. This change fixes the base TypeSpec and removes the overlapping customizations.