Skip to content

fix(streaming): abort before early-exit cleanup - #2613

Merged
HAYDEN-OAI merged 3 commits into
mainfrom
codex/sse-early-exit-cancellation
Sep 5, 2026
Merged

HAYDEN-OAI merged 3 commits into
mainfrom
codex/sse-early-exit-cancellation

Conversation

@HAYDEN-OAI

@HAYDEN-OAI HAYDEN-OAI commented Sep 4, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Fix a response-backed SSE iterator lifecycle hang: after receiving an event, breaking from for await or returning the iterator could wait indefinitely for asynchronous body cancellation before the request controller was aborted.

Abort before the locally owned SSE-message iterator begins nested cleanup. This reuses the existing abort-aware cleanup and completion-sentinel state; normal EOF and [DONE], unused/completed iterators, original errors, and tee sibling ownership are preserved.

This is a nine-line production change plus focused public-API regressions. No parser, buffering, timeout, generated code, public declaration, dependency, or retry changes. Native async-generator return queued behind an unresolved next remains outside this fix.

Review follow-up (626aa57b)

Moved the nine public Responses early-exit lifecycle cases and their setup into tests/lib/streaming-early-exit.test.ts, addressing the maintainability review. All executable test code and helper declarations are unchanged. tests/lib/streaming-core.test.ts is byte-identical to the PR base (961 lines), so it is no longer part of the overall PR diff. Production code is unchanged from the initial implementation.

CI identified that the deliberate one-event for await loop had moved outside an existing filename-scoped lint exception. A single documented next-line no-unreachable-loop exception preserves that regression without changing the loop or broadening lint policy. The initial local check used the pinned linter binary with an older shared Ultracite preset; final validation below uses a clean, frozen installation of the complete pinned toolchain.

  • The relocated suite retained its original before-fix detection on base 31bf7e79: four expected deferred-cancellation failures and five passing controls.
  • Final full canonical handwritten unit run: 7,540/7,540 tests passed across 191 files, using Node 24.19.0 and pinned Vitest 4.1.11. The earlier cached-formatter failure is absent with the complete pinned installation.
  • The combined core and early-exit suites passed all 75 tests (66 core + 9 early-exit) on Node 22.22.3, 24.19.0, and 26.7.0 with Vitest 4.1.11.
  • Full canonical ./scripts/lint, TypeScript 6.0.3 checking, and whitespace checks passed with Ultracite 7.10.5, Oxfmt 0.62.0, and Oxlint 1.79.0. Normal pnpm 11.5.1 install --frozen-lockfile retained all dependency and supply-chain policies; no dependency or configuration files changed.
  • Repeated adversarial self-review and independent equivalence reviews confirmed unchanged assertions, error identity, cancellation ordering, listener cleanup, imports, and test discovery. Both test paths are wholly handwritten.

The updated head is also subject to the repository's full CI. The implementation-level results below were collected before this test-only extraction.

Initial implementation verification (194a49a6)

  • Four new public responses.create({ stream: true }) regressions failed on clean main before the fix; all nine new lifecycle cases now pass.
  • 177 focused streaming tests pass on Node 22.22.2 and 24.19.0, including tee, SSE sentinel/error/privacy, and Bedrock Runtime coverage. The original combined streaming-core suite passed 75/75.
  • 150 independent built-package checks pass across CJS/ESM and exact Node 22.0.0, 24.19.0, and 26.7.0. They cover public Responses/chat, ordinary/thread/synthesized SSE, pending/rejecting/throwing cleanup, error identity, locks/listeners, ordinary/nested tees, and real native-fetch loopback disconnects. All 30 baseline hang cases were reproduced before rebuilding.
  • Canonical build, full TypeScript check, pinned Oxfmt 0.62.0, cached Oxlint 1.76.0, and whitespace checks pass. Root and core-streaming CJS/ESM declarations are byte-identical to main. All 24 streaming benchmarks completed successfully; no performance comparison is claimed.
  • Final complete handwritten unit run: 7,539 passed / 7,540 total. The sole failure also reproduces on untouched main: the cached formatter fixture leaves an assignment unformatted. Local dependencies contain Vitest 4.1.10 rather than pinned 4.1.11, and Oxlint 1.76.0 rather than pinned 1.79.0; pinned CI remains authoritative.

Adversarial review

Independent reviews checked security, compatibility, cancellation/error ordering, [DONE], unstarted/unused/completed iterators, cleanup rejection observation, and tee ownership. Test cleanup was tightened to guarantee listener removal on failures and assert exactly-once cancellation after delayed cleanup settles. No blocking findings remain.

@HAYDEN-OAI
HAYDEN-OAI requested a review from a team as a code owner September 4, 2026 22:38
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 4, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-05T07:47:45.347202Z 3e7a4f7 New commits
🔒 Security Review ✅ Completed 2026-09-05T07:49:12.199121Z 3e7a4f7 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@openai-sdks

openai-sdks Bot commented Sep 4, 2026 •

Copy link
Copy Markdown
Contributor

OkTest Summary

✅ 237/237 SDK tests passed in 9.061s for Node SDK PR #2613.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 89ms
tests/chat-completions-create.test.ts ✅ Passed 116ms
tests/chat-completions-stream.test.ts ✅ Passed 129ms
tests/files-content-binary.test.ts ✅ Passed 143ms
tests/files-create-multipart.test.ts ✅ Passed 113ms
tests/files-list-pagination.test.ts ✅ Passed 136ms
tests/initialize-config.test.ts ✅ Passed 102ms
tests/instance-isolation.test.ts ✅ Passed 78ms
tests/models-list.test.ts ✅ Passed 88ms
tests/responses-background-lifecycle.test.ts ✅ Passed 152ms
tests/responses-body-method-errors.test.ts ✅ Passed 265ms
tests/responses-cancel-timeout.test.ts ✅ Passed 184ms
tests/responses-cancel.test.ts ✅ Passed 128ms
tests/responses-compact-retries.test.ts ✅ Passed 210ms
tests/responses-compact.test.ts ✅ Passed 139ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 68ms
tests/responses-create-advanced.test.ts ✅ Passed 123ms
tests/responses-create-disconnect.test.ts ✅ Passed 1.13s
tests/responses-create-errors.test.ts ✅ Passed 160ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 118ms
tests/responses-create-retries.test.ts ✅ Passed 201ms
tests/responses-create-stream-failures.test.ts ✅ Passed 144ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 2.117s
tests/responses-create-stream-wire.test.ts ✅ Passed 2.469s
tests/responses-create-stream.test.ts ✅ Passed 74ms
tests/responses-create-terminal-states.test.ts ✅ Passed 127ms
tests/responses-create-timeout.test.ts ✅ Passed 222ms
tests/responses-create.test.ts ✅ Passed 110ms
tests/responses-delete.test.ts ✅ Passed 166ms
tests/responses-input-items-errors.test.ts ✅ Passed 144ms
tests/responses-input-items-list.test.ts ✅ Passed 138ms
tests/responses-input-items-options.test.ts ✅ Passed 77ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 185ms
tests/responses-input-tokens-count.test.ts ✅ Passed 150ms
tests/responses-malformed-inputs.test.ts ✅ Passed 2.008s
tests/responses-not-found-errors.test.ts ✅ Passed 160ms
tests/responses-parse.test.ts ✅ Passed 131ms
tests/responses-retrieve-retries.test.ts ✅ Passed 185ms
tests/responses-retrieve.test.ts ✅ Passed 140ms
tests/responses-stored-method-errors.test.ts ✅ Passed 791ms
tests/retry-behavior.test.ts ✅ Passed 2.958s
tests/sdk-error-shape.test.ts ✅ Passed 218ms

View OkTest run #33953756002

SDK merge (c40be16d76c6) · head (626aa57bd46c) · base (31bf7e79a3bc) · OkTest (2b1bdfd25e98)

@github-actions

github-actions Bot commented Sep 4, 2026 •

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

32 mixed files remain; 0 existing customizations changed.

Compared 31bf7e79a3bc → 626aa57bd46c. Generated baselines verified.

32 existing customizations unchanged
  • api.md
  • scripts/castiron/README.md
  • scripts/castiron/custom_code_report.py
  • scripts/castiron/test_custom_code_report.py
  • src/client.ts
  • src/resources/audio/transcriptions.ts
  • src/resources/audio/translations.ts
  • src/resources/beta/assistants.ts
  • src/resources/beta/beta.ts
  • src/resources/beta/index.ts
  • src/resources/beta/responses/internal-base.ts
  • src/resources/beta/responses/responses.ts
  • src/resources/beta/threads/index.ts
  • src/resources/beta/threads/runs/index.ts
  • src/resources/beta/threads/runs/runs.ts
  • src/resources/beta/threads/threads.ts
  • src/resources/chat/completions/completions.ts
  • src/resources/chat/completions/index.ts
  • src/resources/conversations/index.ts
  • src/resources/embeddings.ts
  • src/resources/files.ts
  • src/resources/fine-tuning/checkpoints/permissions.ts
  • src/resources/images.ts
  • src/resources/responses/internal-base.ts
  • src/resources/responses/responses.ts
  • src/resources/skills/skills.ts
  • src/resources/skills/versions/versions.ts
  • src/resources/vector-stores/file-batches.ts
  • src/resources/vector-stores/files.ts
  • src/resources/webhooks/index.ts
  • src/resources/webhooks/webhooks.ts
  • tests/lib/data-residency.test.ts

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 33953800196 --repo openai/openai-node \
  --name castiron-custom-code-33953800196-1 --dir /tmp/castiron-custom-code-33953800196-1
git apply --stat /tmp/castiron-custom-code-33953800196-1/custom-code.patch
cat /tmp/castiron-custom-code-33953800196-1/custom-code.patch

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

git fetch --no-tags origin 31bf7e79a3bc7a9ab2911abe547d215a12ab6d68 626aa57bd46c7333e90191e2b571868d608aefe6
python3 scripts/castiron/custom_code_report.py report \
  --base 31bf7e79a3bc7a9ab2911abe547d215a12ab6d68 \
  --head 626aa57bd46c7333e90191e2b571868d608aefe6 --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-626aa57bd46c
cat /tmp/castiron-custom-code-626aa57bd46c/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

@markstuart-oai markstuart-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.

The early-exit fix reproduces against fresh main and resolves the hang. I found no functional regression, but the new test suite should be decomposed as noted inline before approval.

Validation at 194a49a6bf58938c3007f18140b6722d5a0bce74: 166 focused streaming tests passed on both Node 22.23.2 and 24.19.0. All four new deferred-cancellation cases failed against fresh main and pass with this change. The canonical build, eight built-package CJS/ESM public Responses checks, changed-file Oxfmt/Oxlint checks, and diff whitespace checks passed. Full type-checking was limited by unavailable example dependencies (including Azure Identity, dotenv, and Express); the SDK build type-checks passed. I did not rerun the complete unit suite, ecosystem matrix, or real-network tests.

Comment thread tests/lib/streaming-core.test.ts Resolved

@markstuart-oai markstuart-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.

Re-reviewed the complete change at 626aa57 and the test reorganization since my prior review. The earlier decomposition finding is addressed: public Responses early-exit coverage now lives in a focused 176-line suite, and streaming-core.test.ts is back below 1,000 lines. The production change is unchanged from the previously inspected version; abort-before-cleanup ordering, unused-iterator ownership, completion handling, and error identity remain covered. No substantive correctness or maintainability issues remain.

Validation: 110 focused tests passed on Node 24.19.0 through the canonical scripts/test entrypoint, including the extracted early-exit suite, core streaming tests, and line decoder tests. Verified production source and dependency files are unchanged since my prior review; git diff --check passed. I did not repeat the full package build, complete test suite, or browser/runtime matrix.

@HAYDEN-OAI
HAYDEN-OAI added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit 03acf94 Sep 5, 2026
49 checks passed
@HAYDEN-OAI
HAYDEN-OAI deleted the codex/sse-early-exit-cancellation branch September 5, 2026 17:29
@openai-sdks openai-sdks Bot mentioned this pull request Sep 5, 2026
gh-actions-shared Bot pushed a commit to xf-qubit/openai-node that referenced this pull request Sep 8, 2026
Automated Release PR
---


##
[7.11.0](openai/openai-node@v7.10.0...v7.11.0)
(2026-09-08)


### Features

* **api:** Add prompt cache diagnostics
([openai#2608](openai#2608))
([f83de8f](openai@f83de8f))
* **api:** add service-account API key expiration fields
([openai#2618](openai#2618))
([eecbebe](openai@eecbebe))
* **api:** correct function argument completion event fields
(openapi-545)
([openai#2611](openai#2611))
([31bf7e7](openai@31bf7e7))
* **api:** recognize incomplete web search call status
([openai#2576](openai#2576))
([c093c44](openai@c093c44))


### Bug Fixes

* **assistants:** retain terminal message snapshots
([openai#2650](openai#2650))
([414677e](openai@414677e))
* **audio:** only signal started recording processes
([openai#2665](openai#2665))
([cebdf7c](openai@cebdf7c))
* **audio:** prefer readable inputs over body metadata
([openai#2548](openai#2548))
([86ff7d5](openai@86ff7d5))
* **audio:** use ALSA card identifiers when recording
([openai#2564](openai#2564))
([67da19c](openai@67da19c))
* **audio:** wait for input cleanup before reporting success
([openai#2624](openai#2624))
([5ed87fe](openai@5ed87fe))
* **auth:** account for token exchange elapsed time
([openai#2609](openai#2609))
([b0f6f20](openai@b0f6f20))
* **auth:** validate Azure metadata access token values
([openai#2523](openai#2523))
([32b4d35](openai@32b4d35))
* **azure:** carry declared options through withOptions and fix
deployment paths
([openai#2514](openai#2514))
([f8f29fb](openai@f8f29fb))
* **bedrock:** cancel requests awaiting AWS credentials
([openai#2610](openai#2610))
([97c94e4](openai@97c94e4))
* bound partial number recovery to its token
([openai#2692](openai#2692))
([0d306ca](openai@0d306ca))
* **build:** fail on reported transpile errors
([openai#2638](openai#2638))
([833e3e8](openai@833e3e8))
* **build:** fail when a compiler worker is signaled
([openai#2633](openai#2633))
([cd79cd1](openai@cd79cd1))
* **build:** honor configured compiler worker limits
([openai#2635](openai#2635))
([aa08b44](openai@aa08b44))
* **build:** narrow Git-install staging detection
([openai#2621](openai#2621))
([a6170d3](openai@a6170d3))
* **build:** postprocess the selected package manifest
([openai#2620](openai#2620))
([1850d58](openai@1850d58))
* **build:** preserve CommonJS source-map positions
([openai#2623](openai#2623))
([df0034d](openai@df0034d))
* **build:** preserve config-relative compiler project paths
([openai#2637](openai#2637))
([3acb064](openai@3acb064))
* **build:** preserve declaration file import specifiers
([openai#2659](openai#2659))
([0098c2e](openai@0098c2e))
* **ci:** propagate Node matrix check failures
([openai#2569](openai#2569))
([bff92c9](openai@bff92c9))
* **ci:** serialize release-please branch updates
([openai#2631](openai#2631))
([bb0e400](openai@bb0e400))
* clean up failed mock-server startups
([openai#2558](openai#2558))
([83c92f0](openai@83c92f0))
* **deps:** bump qs to 6.16.0 for security fixes
([openai#2588](openai#2588))
([4e5c6e3](openai@4e5c6e3))
* **docs:** await headers in Next.js webhook examples
([openai#2595](openai#2595))
([7e48f05](openai@7e48f05))
* **docs:** correct the chat streaming helper contract
([openai#2596](openai#2596))
([135ac7e](openai@135ac7e))
* **docs:** include image detail in the Vision example
([openai#2598](openai#2598))
([e76bb16](openai@e76bb16))
* **docs:** omit absent Bedrock provider session tokens
([openai#2597](openai#2597))
([41f85bd](openai@41f85bd))
* **ecosystem:** preserve retry delays in parallel workers
([openai#2673](openai#2673))
([6164745](openai@6164745))
* **ecosystem:** reject invalid retry counts
([openai#2642](openai#2642))
([d0e2bcf](openai@d0e2bcf))
* **ecosystem:** restore explicit web type-test module markers
([openai#2584](openai#2584))
([3c189f4](openai@3c189f4))
* **embeddings:** preserve numeric output with body overrides
([openai#2549](openai#2549))
([97d1ae7](openai@97d1ae7))
* **embeddings:** preserve numeric responses after request hooks
([openai#2590](openai#2590))
([5202b13](openai@5202b13))
* **embeddings:** reject incomplete float32 vectors
([openai#2615](openai#2615))
([3940a20](openai@3940a20))
* **embeddings:** validate response collection before decoding
([openai#2686](openai#2686))
([888811f](openai@888811f))
* **events:** preserve unbound listener receivers
([openai#2644](openai#2644))
([c8238e7](openai@c8238e7))
* **examples:** annotate Responses WebSocket turn result
([openai#2585](openai#2585))
([dde19c5](openai@dde19c5))
* **examples:** avoid extra requests for empty tool calls
([openai#2672](openai#2672))
([be292d3](openai@be292d3))
* **examples:** avoid unhandled WebSocket rejections
([openai#2669](openai#2669))
([744b0ad](openai@744b0ad))
* **examples:** cancel Edge streams when requests abort
([openai#2530](openai#2530))
([18100a1](openai@18100a1))
* **examples:** close failed streaming responses
([openai#2531](openai#2531))
([eb9b468](openai@eb9b468))
* **examples:** close multi-agent WebSockets on terminal responses
([openai#2533](openai#2533))
([51ec453](openai@51ec453))
* **examples:** drain manual conversation error output
([openai#2629](openai#2629))
([e488b53](openai@e488b53))
* **examples:** find structured-output tool calls
([openai#2572](openai#2572))
([84870a8](openai@84870a8))
* **examples:** keep tracking fine-tuning file validation
([openai#2528](openai#2528))
([63312f2](openai@63312f2))
* **examples:** preserve background stream resume cursors
([openai#2671](openai#2671))
([b7398e3](openai@b7398e3))
* **examples:** reject early multi-agent WebSocket closure
([openai#2599](openai#2599))
([c6320f0](openai@c6320f0))
* **examples:** reject early Realtime socket closure
([openai#2639](openai#2639))
([7db48ec](openai@7db48ec))
* **examples:** reject incomplete image streams
([openai#2617](openai#2617))
([ef39397](openai@ef39397))
* **examples:** reject incomplete multi-agent streams
([openai#2666](openai#2666))
([152b98d](openai@152b98d))
* **examples:** reject unsuccessful background responses
([openai#2600](openai#2600))
([902a931](openai@902a931))
* **examples:** reject unsuccessful Responses streams
([openai#2645](openai#2645))
([86acb95](openai@86acb95))
* **examples:** reject unsuccessful structured-tool responses
([openai#2668](openai#2668))
([99aa303](openai@99aa303))
* **examples:** report audio demo failures
([openai#2570](openai#2570))
([29c0572](openai@29c0572))
* **examples:** report image-streaming failures
([openai#2563](openai#2563))
([947c555](openai@947c555))
* **examples:** report multi-agent streaming failures
([openai#2550](openai#2550))
([19d9151](openai@19d9151))
* **examples:** report nonstreaming request failures
([openai#2603](openai#2603))
([384dc26](openai@384dc26))
* **examples:** report premature WebSocket closure
([openai#2544](openai#2544))
([7eb5f7e](openai@7eb5f7e))
* **examples:** report unsuccessful Azure Realtime responses
([openai#2612](openai#2612))
([2b62209](openai@2b62209))
* **examples:** report unsuccessful fine-tuning jobs
([openai#2616](openai#2616))
([e761c16](openai@e761c16))
* **examples:** report unsuccessful Realtime responses
([openai#2559](openai#2559))
([5d3e584](openai@5d3e584))
* **examples:** respect raw streaming proxy backpressure
([openai#2663](openai#2663))
([a11bb1b](openai@a11bb1b))
* **examples:** reuse completed background responses
([openai#2557](openai#2557))
([8e1977b](openai@8e1977b))
* **examples:** serialize missing book lookup results
([openai#2573](openai#2573))
([db7e371](openai@db7e371))
* **examples:** stop polling failed training files
([openai#2592](openai#2592))
([1d67945](openai@1d67945))
* **examples:** support redirected streaming output
([openai#2546](openai#2546))
([8df2e3a](openai@8df2e3a))
* **examples:** use the default audio recording input
([openai#2593](openai#2593))
([6153484](openai@6153484))
* **format:** ignore missing literal file-list paths
([openai#2670](openai#2670))
([516a849](openai@516a849))
* **format:** preserve file-list scope
([openai#2568](openai#2568))
([7faff0e](openai@7faff0e))
* identify modern Edge browser runtime headers
([openai#2628](openai#2628))
([9cdf6f0](openai@9cdf6f0))
* isolate monthly node review publication
([openai#2691](openai#2691))
([3970dae](openai@3970dae))
* isolate realtime connection credentials
([openai#2690](openai#2690))
([e9db491](openai@e9db491))
* keep formatter inputs on LF across Git checkouts
([openai#2515](openai#2515))
([074618f](openai@074618f))
* **lint:** preserve leading-dash generated file paths
([openai#2640](openai#2640))
([3b91a83](openai@3b91a83))
* **pagination:** follow next cursors through empty pages
([openai#2561](openai#2561))
([9ea39ce](openai@9ea39ce))
* parse JSON media types case-insensitively
([openai#2551](openai#2551))
([7ea7926](openai@7ea7926))
* **polling:** honor zero custom polling intervals
([openai#2518](openai#2518))
([0cd94bb](openai@0cd94bb))
* **polling:** treat a cancelled vector store file as terminal
([openai#2506](openai#2506))
([43c1007](openai@43c1007))
* preserve alternate Headers inputs
([openai#2560](openai#2560))
([5d36ff4](openai@5d36ff4))
* preserve CommonJS constructor inheritance
([openai#2547](openai#2547))
([aafb64e](openai@aafb64e))
* preserve cross-realm error causes
([openai#2555](openai#2555))
([bfec504](openai@bfec504))
* preserve own Zod schema definition names
([openai#2695](openai#2695))
([f65d190](openai@f65d190))
* preserve package selection in parallel ecosystem tests
([openai#2516](openai#2516))
([fa0ce41](openai@fa0ce41))
* preserve streamed API error classification
([openai#2694](openai#2694))
([8e2c6ee](openai@8e2c6ee))
* **realtime:** preserve base URL routing components
([openai#2567](openai#2567))
([0f2e22d](openai@0f2e22d))
* **responses:** omit parsed values from replayed history
([openai#2634](openai#2634))
([124b652](openai@124b652))
* **responses:** parse namespaced function tools
([openai#2574](openai#2574))
([4d86684](openai@4d86684))
* **responses:** validate indexed response collections
([openai#2687](openai#2687))
([1ecbf52](openai@1ecbf52))
* **runners:** observe cancellation after completion callbacks
([openai#2591](openai#2591))
([27f5c6a](openai@27f5c6a))
* **runners:** preserve frozen input history
([openai#2525](openai#2525))
([1211038](openai@1211038))
* **runners:** reuse caller abort listeners across tool turns
([openai#2594](openai#2594))
([57d0da4](openai@57d0da4))
* **runners:** suppress content events for input history
([openai#2520](openai#2520))
([37d6fc2](openai@37d6fc2))
* serialize tool-call IDs once per completion
([openai#2688](openai#2688))
([8afb23e](openai@8afb23e))
* **streaming:** abort before early-exit cleanup
([openai#2613](openai#2613))
([03acf94](openai@03acf94))
* **streaming:** avoid duplicate terminal tool argument events
([openai#2658](openai#2658))
([12e5db6](openai@12e5db6))
* **streaming:** interrupt pending reads on cancellation
([openai#2556](openai#2556))
([2d7a767](openai@2d7a767))
* **streaming:** surface server error frames and settle streams past
throwing listeners
([openai#2502](openai#2502))
([17a661e](openai@17a661e))
* support Edge Runtime without Node process
([openai#2552](openai#2552))
([5dc4deb](openai@5dc4deb))
* **test:** cancel Steady commands waiting for cache locks
([openai#2636](openai#2636))
([8896395](openai@8896395))
* **test:** preserve unrelated processes on mock startup failure
([openai#2622](openai#2622))
([6896e66](openai@6896e66))
* **test:** reap Steady commands when lease creation fails
([openai#2664](openai#2664))
([518756a](openai@518756a))
* **test:** reject HTTP errors in mock health checks
([openai#2667](openai#2667))
([7b9e0b0](openai@7b9e0b0))
* **test:** reject unknown ecosystem project names
([openai#2626](openai#2626))
([fcd12bb](openai@fcd12bb))
* **test:** run Bun validation with --from-npm
([openai#2625](openai#2625))
([74f58a9](openai@74f58a9))
* **test:** use a monotonic Steady lock timeout
([openai#2661](openai#2661))
([7b5d120](openai@7b5d120))
* **types:** account for optional event arguments
([openai#2527](openai#2527))
([548a651](openai@548a651))
* **types:** include missing parsed response stream events
([openai#2521](openai#2521))
([6a9db07](openai@6a9db07))
* **types:** preserve custom tool factory metadata
([openai#2526](openai#2526))
([13dca7b](openai@13dca7b))
* **types:** preserve runnable function tuple positions
([openai#2524](openai#2524))
([e345d0f](openai@e345d0f))
* **uploads:** accept cross-realm ArrayBuffers
([openai#2529](openai#2529))
([69d7bda](openai@69d7bda))
* **uploads:** preserve explicit empty filenames
([openai#2532](openai#2532))
([eabb487](openai@eabb487))
* **uploads:** reject zero batch upload concurrency
([openai#2519](openai#2519))
([8b9405a](openai@8b9405a))
* validate partial image indices in streaming example
([openai#2693](openai#2693))
([a9a4440](openai@a9a4440))
* **zod:** preserve strict schema compatibility with Zod 4.5.4
([openai#2677](openai#2677))
([c11870e](openai@c11870e))
* **zod:** retain the original tool parameter schema
([openai#2662](openai#2662))
([fdb038e](openai@fdb038e))


### Performance Improvements

* **bedrock:** avoid copying repeated query values
([openai#2545](openai#2545))
([80ab919](openai@80ab919))


### Chores

* **api:** document throttling and model overload responses — SDK-235
([openai#2632](openai#2632))
([9dd0524](openai@9dd0524))
* clarify Response types and remove unused handwritten code
([openai#2660](openai#2660))
([86152ab](openai@86152ab))
* **deps-dev:** bump @aws-sdk/credential-provider-node from 3.972.78 to
3.972.81 ([openai#2681](openai#2681))
([48629a3](openai@48629a3))
* **deps-dev:** bump @cloudflare/workers-types from 5.20260816.1 to
5.20260823.1 in /ecosystem-tests/cloudflare-worker
([openai#2535](openai#2535))
([dc14bf5](openai@dc14bf5))
* **deps-dev:** bump @cloudflare/workers-types from 5.20260823.1 to
5.20260830.1 in /ecosystem-tests/cloudflare-worker
([openai#2676](openai#2676))
([ae04066](openai@ae04066))
* **deps-dev:** bump @smithy/signature-v4 from 5.7.2 to 5.7.3
([openai#2679](openai#2679))
([41ca20d](openai@41ca20d))
* **deps-dev:** bump @swc/core from 1.15.47 to 1.16.1
([openai#2538](openai#2538))
([5c04dc4](openai@5c04dc4))
* **deps-dev:** bump fast-uri from 3.1.5 to 3.1.7 in
/ecosystem-tests/ts-browser-webpack
([openai#2579](openai#2579))
([34380bf](openai@34380bf))
* **deps-dev:** bump fast-uri from 3.1.5 to 3.1.7 in
/ecosystem-tests/vercel-edge
([openai#2577](openai#2577))
([511d1e4](openai@511d1e4))
* **deps-dev:** bump oxlint from 1.76.0 to 1.79.0
([openai#2542](openai#2542))
([2683c3a](openai@2683c3a))
* **deps-dev:** bump oxlint from 1.79.0 to 1.80.0
([openai#2683](openai#2683))
([02d5fb0](openai@02d5fb0))
* **deps-dev:** bump puppeteer from 25.7.0 to 25.8.0 in
/ecosystem-tests/browser-direct-import
([openai#2534](openai#2534))
([f039c09](openai@f039c09))
* **deps-dev:** bump puppeteer from 25.7.0 to 25.8.0 in
/ecosystem-tests/ts-browser-webpack
([openai#2539](openai#2539))
([5828818](openai@5828818))
* **deps-dev:** bump puppeteer from 25.8.0 to 25.9.0 in
/ecosystem-tests/browser-direct-import
([openai#2675](openai#2675))
([bebd72f](openai@bebd72f))
* **deps-dev:** bump puppeteer from 25.8.0 to 25.9.0 in
/ecosystem-tests/ts-browser-webpack
([openai#2680](openai#2680))
([fe3770f](openai@fe3770f))
* **deps-dev:** bump ultracite from 7.10.0 to 7.10.5
([openai#2537](openai#2537))
([6d37b30](openai@6d37b30))
* **deps-dev:** bump vitest from 4.1.10 to 4.1.11
([openai#2541](openai#2541))
([6ea24b3](openai@6ea24b3))
* **deps-dev:** bump webpack from 5.109.2 to 5.110.2 in
/ecosystem-tests/ts-browser-webpack
([openai#2682](openai#2682))
([73405d1](openai@73405d1))
* **deps-dev:** bump wrangler from 4.125.0 to 4.127.1 in
/ecosystem-tests/cloudflare-worker
([openai#2678](openai#2678))
([0d92742](openai@0d92742))
* **deps:** bump @azure/identity from 4.13.1 to 4.13.2
([openai#2540](openai#2540))
([0318287](openai@0318287))
* **deps:** bump express and @types/express
([openai#2684](openai#2684))
([c581c17](openai@c581c17))
* **ecosystem:** remove unused proxy stub
([openai#2641](openai#2641))
([ce1713a](openai@ce1713a))
* migrate to forked steady
([openai#2587](openai#2587))
([67ce45d](openai@67ce45d))


### Documentation

* correct Bun ecosystem test instructions
([openai#2627](openai#2627))
([3434b42](openai@3434b42))
* correct error handling diagnostics
([openai#2630](openai#2630))
([d334d8c](openai@d334d8c))
* **helpers:** remove undefined main call from parsing example
([openai#2648](openai#2648))
([d8f6be9](openai@d8f6be9))
* **realtime:** report unsuccessful responses in the guide
([openai#2647](openai#2647))
([f58b1fd](openai@f58b1fd))
* **streaming:** reject unsuccessful background responses
([openai#2614](openai#2614))
([1025f7a](openai@1025f7a))
* **tools:** support TypeScript 4.9 in the function loop
([openai#2649](openai#2649))
([42e852b](openai@42e852b))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: openai-sdks[bot] <284451331+openai-sdks[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants