From 69ffd0eb48c4d9a61087db78ad2a002049f13dbd Mon Sep 17 00:00:00 2001 From: Junhyuk Lee Date: Wed, 29 Apr 2026 15:21:18 +0000 Subject: [PATCH] Advance OSS contribution for Realtime API Pydantic Models incomplete for RealtimeResponseStatus type Nightly Codex produced a focused contribution for https://github.com/openai/openai-python/issues/2502. Constraint: Automated nightly run; keep changes small and reviewable. Confidence: medium Scope-risk: narrow Tested: See uploaded nightly artifacts and workflow logs. Not-tested: Maintainer CI beyond this workflow. --- NIGHTLY_CODEX_FINAL_ATTEMPT_1.md | 15 ++++ .../beta/realtime/realtime_response_status.py | 3 + .../realtime/realtime_response_status.py | 3 + tests/test_realtime_response_status.py | 71 +++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 NIGHTLY_CODEX_FINAL_ATTEMPT_1.md create mode 100644 tests/test_realtime_response_status.py diff --git a/NIGHTLY_CODEX_FINAL_ATTEMPT_1.md b/NIGHTLY_CODEX_FINAL_ATTEMPT_1.md new file mode 100644 index 0000000000..86e4250ea2 --- /dev/null +++ b/NIGHTLY_CODEX_FINAL_ATTEMPT_1.md @@ -0,0 +1,15 @@ +Implemented the focused fix for openai/openai-python#2502. + +Changed: +- [src/openai/types/realtime/realtime_response_status.py](/home/runner/work/oss-nightly-control/oss-nightly-control/target/src/openai/types/realtime/realtime_response_status.py): added optional `Error.message`. +- [src/openai/types/beta/realtime/realtime_response_status.py](/home/runner/work/oss-nightly-control/oss-nightly-control/target/src/openai/types/beta/realtime/realtime_response_status.py): added the same field for beta realtime. +- [tests/test_realtime_response_status.py](/home/runner/work/oss-nightly-control/oss-nightly-control/target/tests/test_realtime_response_status.py): added regression coverage for declared model fields and failed `response.done` payload parsing. +- [NIGHTLY_REPORT.md](/home/runner/work/oss-nightly-control/oss-nightly-control/target/NIGHTLY_REPORT.md): written with summary, tests, and risks. + +Verified: +- `uv run python -m pytest tests/test_realtime_response_status.py -q` passed: `4 passed` +- `uv run ruff check ...` passed +- `uv run ruff format --check ...` passed +- `uv run python -m compileall -q ...` passed + +I did not commit, push, or open a PR. The issue context used was https://github.com/openai/openai-python/issues/2502. \ No newline at end of file diff --git a/src/openai/types/beta/realtime/realtime_response_status.py b/src/openai/types/beta/realtime/realtime_response_status.py index 7189cd58a1..ae56d174ea 100644 --- a/src/openai/types/beta/realtime/realtime_response_status.py +++ b/src/openai/types/beta/realtime/realtime_response_status.py @@ -12,6 +12,9 @@ class Error(BaseModel): code: Optional[str] = None """Error code, if any.""" + message: Optional[str] = None + """A human-readable error message.""" + type: Optional[str] = None """The type of error.""" diff --git a/src/openai/types/realtime/realtime_response_status.py b/src/openai/types/realtime/realtime_response_status.py index 26b272ae5a..d0f478ee58 100644 --- a/src/openai/types/realtime/realtime_response_status.py +++ b/src/openai/types/realtime/realtime_response_status.py @@ -17,6 +17,9 @@ class Error(BaseModel): code: Optional[str] = None """Error code, if any.""" + message: Optional[str] = None + """A human-readable error message.""" + type: Optional[str] = None """The type of error.""" diff --git a/tests/test_realtime_response_status.py b/tests/test_realtime_response_status.py new file mode 100644 index 0000000000..fbd95f1af6 --- /dev/null +++ b/tests/test_realtime_response_status.py @@ -0,0 +1,71 @@ +from openai._compat import parse_obj, get_model_fields +from openai.types.realtime.response_done_event import ResponseDoneEvent +from openai.types.beta.realtime.response_done_event import ResponseDoneEvent as BetaResponseDoneEvent +from openai.types.realtime.realtime_response_status import Error as RealtimeResponseStatusError +from openai.types.beta.realtime.realtime_response_status import Error as BetaRealtimeResponseStatusError + +ERROR_MESSAGE = "We're currently processing too many requests - please try again later." + + +def test_realtime_response_status_error_declares_message() -> None: + assert "message" in get_model_fields(RealtimeResponseStatusError) + + +def test_beta_realtime_response_status_error_declares_message() -> None: + assert "message" in get_model_fields(BetaRealtimeResponseStatusError) + + +def test_realtime_response_done_failed_error_message() -> None: + event = parse_obj( + ResponseDoneEvent, + { + "type": "response.done", + "event_id": "event_123", + "response": { + "object": "realtime.response", + "id": "resp_123", + "status": "failed", + "status_details": { + "type": "failed", + "error": { + "type": "invalid_request_error", + "code": "inference_rate_limit_exceeded", + "message": ERROR_MESSAGE, + }, + }, + "output": [], + }, + }, + ) + + assert event.response.status_details is not None + assert event.response.status_details.error is not None + assert event.response.status_details.error.message == ERROR_MESSAGE + + +def test_beta_realtime_response_done_failed_error_message() -> None: + event = parse_obj( + BetaResponseDoneEvent, + { + "type": "response.done", + "event_id": "event_123", + "response": { + "object": "realtime.response", + "id": "resp_123", + "status": "failed", + "status_details": { + "type": "failed", + "error": { + "type": "invalid_request_error", + "code": "inference_rate_limit_exceeded", + "message": ERROR_MESSAGE, + }, + }, + "output": [], + }, + }, + ) + + assert event.response.status_details is not None + assert event.response.status_details.error is not None + assert event.response.status_details.error.message == ERROR_MESSAGE