Handle bare dict types in construct_type - #3383
Conversation
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR improves handling of “bare” dict type annotations in transform/construct logic and adds support for an Error.message field in realtime response status models, with corresponding tests.
Changes:
- Treat
dict(without type parameters) as a passthrough in_transform_recursive,_async_transform_recursive, andconstruct_type. - Add
messageto realtimeErrormodels (beta + non-beta) and validate via a new test. - Add regression tests covering bare-dict behavior in transform and model construction.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/test_transform.py | Adds async+sync coverage for TypedDict fields annotated as bare dict. |
| tests/test_models.py | Adds coverage for construct_type(..., type_=dict) passthrough and typed dict construction. |
| tests/lib/test_realtime_response_status.py | New test validating Error.message deserialization for beta and non-beta realtime status models. |
| src/openai/types/realtime/realtime_response_status.py | Adds optional message field to realtime Error model. |
| src/openai/types/beta/realtime/realtime_response_status.py | Adds optional message field to beta realtime Error model. |
| src/openai/_utils/_transform.py | Avoids get_args(...)[1] crash for bare dict annotations by early returning. |
| src/openai/_models.py | Avoids unpacking crash for bare dict in construct_type by early returning. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if origin == dict and is_mapping(data): | ||
| items_type = get_args(stripped_type)[1] | ||
| args = get_args(stripped_type) | ||
| if len(args) < 2: | ||
| return data | ||
| items_type = args[1] | ||
| return {key: _transform_recursive(value, annotation=items_type) for key, value in data.items()} |
| from openai.types.beta.realtime import RealtimeResponseStatus as BetaRealtimeResponseStatus | ||
| from openai.types.realtime import RealtimeResponseStatus as RealtimeResponseStatus |
|
Thank you for the contribution. The bare-dictionary construction and transformation fixes are now covered by merged #3760. Keeping this PR open because the Realtime error-message fields and pre-connect event transformation are separate changes. Please rebase on |
|
Thank you for the contribution. The bare-dict crashes are fixed on main by #3760. We’re closing this combined PR after reviewing the remaining changes. Please follow #3403 for pre-connect Realtime serialization, #3506 for async dictionary transforms, and #2502 for error-message typing. Those follow-ups remain open. |
Fixes #3341.
Summary
Testing