Skip to content

fix(examples): close multi-agent WebSockets on terminal responses - #2533

Merged
HAYDEN-OAI merged 1 commit into
mainfrom
dev/hayden/autoimprove-multi-agent-websocket-cleanup
Sep 3, 2026
Merged

HAYDEN-OAI merged 1 commit into
mainfrom
dev/hayden/autoimprove-multi-agent-websocket-cleanup

Conversation

@HAYDEN-OAI

Copy link
Copy Markdown
Contributor

Summary

Make the multi-agent Responses WebSocket example finish on the coordinator's terminal response and close its connection on every exit path.

The existing loop closes only for response.completed. A root response.failed or response.incomplete leaves it waiting indefinitely on the still-open socket. API errors and exceptions while writing output leave the iterator without closing the connection; the public WebSocket iterator explicitly does not own socket closure. A child agent's completion also currently closes the example before the coordinator can finish.

This change:

  • Wraps the request and iteration in try/finally, with one ws.close() cleanup site.
  • Rejects failed or incomplete coordinator responses with a fixed diagnostic containing only the terminal event type.
  • Ignores child-agent terminal events and continues displaying the coordinator's response. Missing/null agent metadata retains the existing /root convention.
  • Preserves the request, beta header, model, streamed text, and agent/coordinator formatting.

Only the handwritten example and its regression tests change. No generated SDK files, public declarations, dependencies, policies, or custom-code budget changes are involved. Neither file appears in the verified generated snapshot, and no other open PR covers this example.

Regression coverage

The tests execute the actual example with the public OpenAI and beta ResponsesWS implementations against an ephemeral localhost WebSocket server. Only client configuration and stdout are injected; socket transport, protocol dispatch, iteration, and the close handshake are real. All credentials and events are synthetic.

The first six regressions were run before the fix: the completed-response control passed and all five failure/cleanup cases failed because the connection stayed open. The adversarial review then added child-agent termination cases, which exposed premature completion and prevented the initial failure handler from terminating the coordinator on a child's failure.

The final 11 tests cover success, failed/incomplete coordinator responses before and after partial text, each child terminal status followed by coordinator output, both API error shapes, and output-write failures. They verify a clean close handshake, unchanged request settings, preserved output formatting, and propagation of existing errors.

Validation

  • Focused example and existing stable/beta WebSocket suites: 66 passed.
  • CI=true ./scripts/test: 7,020 handwritten + 556 generated tests passed, with the existing two generated test skips; all 12 snapshots passed.
  • pnpm lint, pnpm exec tsc --noEmit, and pnpm build: passed.
  • Built CJS and ESM public SDK entrypoints on Node 22.0.0, 24.20.0, and 26.7.0: 126 local WebSocket example scenarios passed, including omitted/null/explicit-root metadata, child terminal events, API errors, and output failures.
  • The changed example compiles against built public declarations with TypeScript 4.5.5 and 4.9.5, with skipLibCheck: false.

Adversarial self-review

Repeated the review after adding the child-agent safeguard. The final change has a single connection owner and cleanup path, does not add retries or parser state, preserves streamed output and existing error objects, and adds no response-body data to failure diagnostics. The request URL and beta header were checked in the compatibility smoke tests. API behavior and runtime requirements outside this example are unchanged.

@HAYDEN-OAI
HAYDEN-OAI requested a review from a team as a code owner August 31, 2026 12:14
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 31, 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-08-31T12:16:29.353139Z 5680917 PR opened
🔒 Security Review ✅ Completed 2026-08-31T12:16:50.271898Z 5680917 PR opened
ℹ️ 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 Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

OkTest Summary

✅ 237/237 SDK tests passed in 10.482s for Node SDK PR #2533.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 178ms
tests/chat-completions-create.test.ts ✅ Passed 216ms
tests/chat-completions-stream.test.ts ✅ Passed 206ms
tests/files-content-binary.test.ts ✅ Passed 147ms
tests/files-create-multipart.test.ts ✅ Passed 156ms
tests/files-list-pagination.test.ts ✅ Passed 177ms
tests/initialize-config.test.ts ✅ Passed 163ms
tests/instance-isolation.test.ts ✅ Passed 108ms
tests/models-list.test.ts ✅ Passed 144ms
tests/responses-background-lifecycle.test.ts ✅ Passed 217ms
tests/responses-body-method-errors.test.ts ✅ Passed 324ms
tests/responses-cancel-timeout.test.ts ✅ Passed 234ms
tests/responses-cancel.test.ts ✅ Passed 171ms
tests/responses-compact-retries.test.ts ✅ Passed 275ms
tests/responses-compact.test.ts ✅ Passed 258ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 120ms
tests/responses-create-advanced.test.ts ✅ Passed 201ms
tests/responses-create-disconnect.test.ts ✅ Passed 1.183s
tests/responses-create-errors.test.ts ✅ Passed 247ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 139ms
tests/responses-create-retries.test.ts ✅ Passed 357ms
tests/responses-create-stream-failures.test.ts ✅ Passed 239ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 2.146s
tests/responses-create-stream-wire.test.ts ✅ Passed 2.45s
tests/responses-create-stream.test.ts ✅ Passed 116ms
tests/responses-create-terminal-states.test.ts ✅ Passed 242ms
tests/responses-create-timeout.test.ts ✅ Passed 227ms
tests/responses-create.test.ts ✅ Passed 189ms
tests/responses-delete.test.ts ✅ Passed 241ms
tests/responses-input-items-errors.test.ts ✅ Passed 229ms
tests/responses-input-items-list.test.ts ✅ Passed 183ms
tests/responses-input-items-options.test.ts ✅ Passed 122ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 229ms
tests/responses-input-tokens-count.test.ts ✅ Passed 312ms
tests/responses-malformed-inputs.test.ts ✅ Passed 2.016s
tests/responses-not-found-errors.test.ts ✅ Passed 301ms
tests/responses-parse.test.ts ✅ Passed 204ms
tests/responses-retrieve-retries.test.ts ✅ Passed 238ms
tests/responses-retrieve.test.ts ✅ Passed 220ms
tests/responses-stored-method-errors.test.ts ✅ Passed 621ms
tests/retry-behavior.test.ts ✅ Passed 3.023s
tests/sdk-error-shape.test.ts ✅ Passed 340ms

View OkTest run #33390802479

SDK merge (6f112b9460d6) · head (568091772e29) · base (eea2292a4a52) · OkTest (2b1bdfd25e98)

@github-actions

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

32 mixed files remain; 0 existing customizations changed.

Compared eea2292a4a52 → 568091772e29. 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 33390829019 --repo openai/openai-node \
  --name castiron-custom-code-33390829019-1 --dir /tmp/castiron-custom-code-33390829019-1
git apply --stat /tmp/castiron-custom-code-33390829019-1/custom-code.patch
cat /tmp/castiron-custom-code-33390829019-1/custom-code.patch

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

git fetch --no-tags origin eea2292a4a523da9405161dde0a79ac5dc2ecb2a 568091772e29ab8b15499cb1a9c143883cd120c2
python3 scripts/castiron/custom_code_report.py report \
  --base eea2292a4a523da9405161dde0a79ac5dc2ecb2a \
  --head 568091772e29ab8b15499cb1a9c143883cd120c2 --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-568091772e29
cat /tmp/castiron-custom-code-568091772e29/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

@HAYDEN-OAI
HAYDEN-OAI added this pull request to the merge queue Sep 3, 2026
Merged via the queue into main with commit 51ec453 Sep 3, 2026
37 checks passed
@HAYDEN-OAI
HAYDEN-OAI deleted the dev/hayden/autoimprove-multi-agent-websocket-cleanup branch September 3, 2026 20:32
@openai-sdks openai-sdks Bot mentioned this pull request Sep 3, 2026
gh-actions-shared Bot pushed a commit to xf-qubit/openai-node that referenced this pull request Sep 3, 2026
## Summary

Reject an unfinished response when the standard Responses WebSocket
example receives a socket close event.

`runResponse()` listens for response events and errors, but not
connection closure. A normal close frame or abrupt TCP disconnect can
therefore leave its promise pending. Because a pending promise does not
keep Node running, the actual CLI exits **0 with no error**, even though
it never received the response or completed the remaining demo turns.

The fix is six added lines in the handwritten example: register a close
listener that uses the existing failure path, and remove that listener
alongside the existing event/error listeners on every settled response.
Successful completion and API errors continue to win before a subsequent
socket close. The new diagnostic is fixed text and does not expose the
peer's close reason.

No SDK implementation, generated file, public declaration, dependency,
policy, or custom-code budget changes are included. Both changed files
are absent from the verified generated snapshot, and no open PR covers
this standard example. This is independent of the separate multi-agent
example in openai#2533.

## Regression coverage

The tests run the actual TypeScript example in a child process using its
documented `ts-node`/`tsconfig-paths` runtime and source SDK
entrypoints. An ephemeral localhost WebSocket server provides synthetic
responses. The child receives an explicitly isolated environment with a
synthetic API key and local base URL; no live API access is used.

Before the fix, the clean-close and abrupt-disconnect tests failed
because the CLI returned exit code 0. The complete-conversation and
API-error controls already passed. All four pass after the fix:

- Clean close after partial response text: exit 1, fixed diagnostic, no
completed assistant output or second turn.
- Abrupt disconnect before response content: the same failure behavior.
- All three demo turns, including tool execution and six response
requests: exit 0, unchanged output and `previous_response_id` chain,
normal final cleanup.
- API error followed immediately by socket closure: preserve the
original API diagnostic instead of replacing it with the new close
error.

Every case also checks that neither the synthetic credential nor the
peer's synthetic private close reason appears in output.

## Validation

- Focused CLI regressions and existing stable/beta WebSocket suite: **59
passed**.
- `CI=true ./scripts/test`: **7,013 handwritten + 556 generated tests
passed**; the existing two generated test skips remain and all 12
snapshots passed.
- `pnpm lint`, `pnpm exec tsc --noEmit` (TypeScript 6.0.3), and `pnpm
build`: passed.
- Actual CLI execution compiled as CJS and native ESM, using built
public SDK entrypoints on Node **22.0.0, 24.20.0, and 26.7.0**: **24
lifecycle scenarios passed**.
- Additional legacy-compiler comparison: TypeScript **4.5.5 and 4.9.5**
both report the same pre-existing `TS7022` for the unrelated
`turnResult` initializer on main and this branch (line 510 on main, 516
after these six additions). Those legacy example checks do not pass on
either revision; this PR adds no new diagnostic and does not broaden
scope to that typing issue.

## Adversarial self-review

Reviewed and rechecked listener ownership, closure before/after terminal
response events, consecutive tool-call turns, error precedence, and
peer-controlled diagnostic data. The listener is registered before
sending each request and removed by the existing shared cleanup path on
both success and failure. No new state, parser, retry, timeout, or
transport behavior is added to the SDK.
HAYDEN-OAI added a commit to 1fanwang/openai-node that referenced this pull request Sep 4, 2026
## Summary

Make the multi-agent SSE example report unsuccessful coordinator
responses instead of silently exiting successfully.

The example currently prints message/text events but ignores
`response.failed` and `response.incomplete`. Both are valid beta
Responses stream events. Unlike named SSE `error` frames, the SDK
correctly yields these ordinary response events to the caller. When the
stream ends, the example prints a newline and exits 0—even if the
coordinator failed before producing any text or after partial output.

## Change

Add a five-line branch in `examples/responses/multi-agent-streaming.ts`
that throws a concise diagnostic for failed/incomplete coordinator
responses.

- Treat omitted/null ownership and explicit `/root` ownership as the
coordinator.
- Keep child-agent terminal events non-fatal so the coordinator can
recover and continue.
- Preserve successful output, agent labels, request parameters, and the
existing SDK handling of named SSE errors.
- Report only the terminal event type, not response/error payload
details.

This is separate from openai#2533 and openai#2544, which address WebSocket examples.
The SSE example needs no WebSocket-style close handling: its existing
iterator closes normally on completion and performs its existing abort
cleanup when the loop throws.

The shared ecosystem CLI fixtures also persist offline npm settings in
each temporary project’s `.npmrc`. pnpm strips `npm_config_*`
environment variables when starting workers, which allowed Node 22’s
nested npm installs to make audit requests and time out. The
dependency-free wrapper also disables pnpm’s automatic root
installation, preventing parallel workers from racing on shared pnpm
state. The fixtures retain real npm package installations and the
existing 15-second timeout; failures now include subprocess output.

Only this handwritten example and two handwritten test files change. No
generated code, SDK APIs, dependencies, or budget rules change.

## Validation

The ecosystem fixture correction passes all three install modes on Node
22.23.2 and all 31 ecosystem CLI/SSE tests on Node 24.20.0. Lint,
TypeScript, and the CJS/ESM build pass.

Validation of the streaming change:

- Four executable regressions fail on main because failed/incomplete
root responses exit 0; all eight final cases pass with the fix.
- Tests run the actual documented `ts-node` entrypoint and public SDK
against a local synthetic HTTP/SSE server. They cover failures
before/after partial text, omitted/null/explicit-root ownership, all
three child terminal statuses followed by coordinator success, and named
SSE error handling. They also check the actual request path/body, exact
output, exit status, and absence of credentials/private failure details
in new diagnostics.
- Complete `CI=true ./scripts/test`: 7,017 handwritten tests across 164
files, 556 generated tests across 82 suites, and 12 snapshots pass.
Existing generated skips are unchanged.
- `pnpm lint`, `pnpm exec tsc --noEmit`, and `pnpm build` pass.
- The changed example compiles against the built SDK with strict
TypeScript 4.5.5 and 4.9.5 checks (`skipLibCheck: false`).
- An additional 138-case runtime matrix passes across Node 22.0.0,
24.20.0, and 26.7.0, loading actual built CJS/ESM SDK classes with the
transpiled example. It covers root/child terminal events, partial
output, SSE errors, original stdout-error identity, and request-signal
abort on failure. The same matrix confirms the corresponding baseline
failures.

Repeated adversarial self-review and an independent bounded review found
no remaining defect. Fixtures are synthetic and require no live API
calls or credentials.
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