Skip to content

fix(live): avoid hangs at fractional transcript grouping deadlines - #3970

Merged
markstuart-oai merged 1 commit into
mainfrom
codex/sdk-1016-transcript-deadlines
Sep 27, 2026
Merged

markstuart-oai merged 1 commit into
mainfrom
codex/sdk-1016-transcript-deadlines

Conversation

@markstuart-oai

Copy link
Copy Markdown
Contributor

Valid fractional Live transcript grouping timeouts can hang on the next transcript event. For example, after a fragment ends at 200 ms, a timeout of 0.1 ms is scheduled for 200.1; subtracting 200 later rounds to less than 0.1, so the scheduler never consumes that deadline.

Compare absolute times against the same deadlines that the scheduler creates. This preserves the existing API and options and adds bounded sync/async regressions for assistant silence, speaker separation, and isolated backchannels.

Validation:

  • All six regressions safely reproduced the hang before the fix.
  • 224/224 Live tests passed on both Pydantic v1 and v2 after the fix.
  • Full Ruff, mypy and Pyright passed.
  • No schema, generated SDK, dependency or API changes.

@markstuart-oai
markstuart-oai requested a review from a team as a code owner September 27, 2026 17:58
@openai-sdks

openai-sdks Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

OkTest Summary

✅ 236/236 SDK tests passed in 8.723s for Python SDK PR #3970.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 152ms
tests/chat-completions-create.test.ts ✅ Passed 167ms
tests/chat-completions-stream.test.ts ✅ Passed 116ms
tests/files-content-binary.test.ts ✅ Passed 165ms
tests/files-create-multipart.test.ts ✅ Passed 185ms
tests/files-list-pagination.test.ts ✅ Passed 105ms
tests/initialize-config.test.ts ✅ Passed 111ms
tests/instance-isolation.test.ts ✅ Passed 127ms
tests/models-list.test.ts ✅ Passed 169ms
tests/responses-background-lifecycle.test.ts ✅ Passed 136ms
tests/responses-body-method-errors.test.ts ✅ Passed 279ms
tests/responses-cancel-timeout.test.ts ✅ Passed 165ms
tests/responses-cancel.test.ts ✅ Passed 172ms
tests/responses-compact-retries.test.ts ✅ Passed 206ms
tests/responses-compact.test.ts ✅ Passed 231ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 122ms
tests/responses-create-advanced.test.ts ✅ Passed 164ms
tests/responses-create-disconnect.test.ts ✅ Passed 1.133s
tests/responses-create-errors.test.ts ✅ Passed 167ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 93ms
tests/responses-create-retries.test.ts ✅ Passed 158ms
tests/responses-create-stream-failures.test.ts ✅ Passed 78ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 201ms
tests/responses-create-stream-wire.test.ts ✅ Passed 2.543s
tests/responses-create-stream.test.ts ✅ Passed 277ms
tests/responses-create-terminal-states.test.ts ✅ Passed 203ms
tests/responses-create-timeout.test.ts ✅ Passed 202ms
tests/responses-create.test.ts ✅ Passed 392ms
tests/responses-delete.test.ts ✅ Passed 164ms
tests/responses-input-items-errors.test.ts ✅ Passed 338ms
tests/responses-input-items-list.test.ts ✅ Passed 244ms
tests/responses-input-items-options.test.ts ✅ Passed 216ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 217ms
tests/responses-input-tokens-count.test.ts ✅ Passed 157ms
tests/responses-malformed-inputs.test.ts ✅ Passed 1.764s
tests/responses-not-found-errors.test.ts ✅ Passed 247ms
tests/responses-parse.test.ts ✅ Passed 180ms
tests/responses-retrieve-retries.test.ts ✅ Passed 176ms
tests/responses-retrieve.test.ts ✅ Passed 156ms
tests/responses-stored-method-errors.test.ts ✅ Passed 388ms
tests/retry-behavior.test.ts ✅ Passed 3.143s
tests/sdk-error-shape.test.ts ✅ Passed 254ms

View OkTest run #36338880347

SDK merge (403fa1c46157) · head (7fbc8b75e566) · base (43443d14c5ab) · OkTest (f9111d4e2fcd)

@github-actions

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

47 mixed files remain; 0 existing customizations changed.

Compared 43443d14c5ab → 7fbc8b75e566. Generated baselines verified.

47 existing customizations unchanged
  • api.md
  • scripts/castiron/README.md
  • scripts/castiron/custom_code_report.py
  • scripts/castiron/test_custom_code_report.py
  • src/openai/init.py
  • src/openai/_client.py
  • src/openai/resources/audio/transcriptions.py
  • src/openai/resources/audio/translations.py
  • src/openai/resources/beta/agents/sessions/sessions.py
  • src/openai/resources/beta/beta.py
  • src/openai/resources/beta/responses/responses.py
  • src/openai/resources/beta/threads/runs/runs.py
  • src/openai/resources/beta/threads/threads.py
  • src/openai/resources/chat/completions/completions.py
  • src/openai/resources/embeddings.py
  • src/openai/resources/files.py
  • src/openai/resources/live/forks.py
  • src/openai/resources/live/live.py
  • src/openai/resources/live/sideband.py
  • src/openai/resources/realtime/api.md
  • src/openai/resources/realtime/realtime.py
  • src/openai/resources/responses/responses.py
  • src/openai/resources/uploads/uploads.py
  • src/openai/resources/vector_stores/file_batches.py
  • src/openai/resources/vector_stores/files.py
  • src/openai/resources/videos.py
  • src/openai/resources/webhooks/init.py
  • src/openai/resources/webhooks/webhooks.py
  • src/openai/types/beta/agent_session_message.py
  • src/openai/types/chat/init.py
  • src/openai/types/chat/chat_completion_message_tool_call.py
  • src/openai/types/fine_tuning/fine_tuning_job_integration.py
  • src/openai/types/realtime/conversation_item_input_audio_transcription_delta_event.py
  • src/openai/types/realtime/realtime_error_event.py
  • src/openai/types/responses/init.py
  • src/openai/types/responses/response.py
  • src/openai/types/responses/response_function_web_search.py
  • src/openai/types/responses/response_function_web_search_param.py
  • src/openai/types/responses/responses_client_event.py
  • src/openai/types/responses/responses_client_event_param.py

7 more in the full report.

A changed generated baseline means this report cannot reliably identify which handwritten lines changed.

Inspect the custom-code diff

Download the exact patch produced by this run (requires repository access):

gh run download 36338900263 --repo openai/openai-python \
  --name castiron-custom-code-36338900263-1 --dir /tmp/castiron-custom-code-36338900263-1
git apply --stat /tmp/castiron-custom-code-36338900263-1/custom-code.patch
cat /tmp/castiron-custom-code-36338900263-1/custom-code.patch

Or reproduce it from an SDK checkout containing the vendored reporter:

git fetch --no-tags origin 43443d14c5ab8b9bc9d7aaf31263351f071afca2 7fbc8b75e566b0aa5a4cc1d3f035b7224bbace5e
python3 scripts/castiron/custom_code_report.py report \
  --base 43443d14c5ab8b9bc9d7aaf31263351f071afca2 \
  --head 7fbc8b75e566b0aa5a4cc1d3f035b7224bbace5e --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-7fbc8b75e566
cat /tmp/castiron-custom-code-7fbc8b75e566/custom-code.patch

This is the current full custom patch for mixed files, not an attribution of only the handwritten lines changed by this PR.

Full report and patch

@jbeckwith-oai jbeckwith-oai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 7fbc8b75e566b0aa5a4cc1d3f035b7224bbace5e: no blocking findings.

Using the same sums as deadline() fixes the fractional-boundary non-progress loop without changing public signatures, defaults or async dispatch ownership.

I independently exercised assistant-silence, speaker-separation and backchannel-isolation cases through both actual sync and async grouper methods: all six baseline processes timed out, and all six current-head cases completed with the expected closed segments/reasons. These in-memory probes used the actual listener/state/policy/dataclass modules, a controlled monotonic clock and synthetic event/error types; they did not exercise Pydantic or rerun the full package suite. I reviewed the complete diff and surrounding timer/closure paths. Exact-head hosted checks, including the Pydantic-v1 lane, are green.

@markstuart-oai
markstuart-oai added this pull request to the merge queue Sep 27, 2026
Merged via the queue into main with commit 4ef4129 Sep 27, 2026
26 checks passed
@markstuart-oai
markstuart-oai deleted the codex/sdk-1016-transcript-deadlines branch September 27, 2026 20:05
@openai-sdks openai-sdks Bot mentioned this pull request Sep 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants