Skip to content

fix(assistants): retain terminal message snapshots - #2650

Merged
HAYDEN-OAI merged 1 commit into
mainfrom
codex/assistant-terminal-message-snapshots
Sep 6, 2026
Merged

HAYDEN-OAI merged 1 commit into
mainfrom
codex/assistant-terminal-message-snapshots

Conversation

@HAYDEN-OAI

Copy link
Copy Markdown
Contributor

Summary

Make AssistantStream.finalMessages() retain the authoritative thread.message.completed or thread.message.incomplete message instead of the earlier creation/delta snapshot.

Previously, an ordinary completed stream could emit the correct messageDone event while finalMessages() and the terminal textDone snapshot still reported status: 'in_progress', null completion/incompletion timestamps, and no incomplete reason. The earlier accumulated content could also retain delta-only fields instead of the final message content.

Keep the existing snapshot invariant and in-progress accumulation, but select the terminal event's message when it arrives. Terminal callbacks and final storage now share that authoritative object; previously retained creation/delta snapshots are not retroactively mutated. Document that transition on finalMessages().

Before replacing the snapshot, preserve its existing message-ID aliases through the existing reservation method, matching the run-step boundary. This retains the established validation and duplicate-ID behavior without adding state, a merge helper, or a parser.

Regression coverage

Extend the existing AssistantStream suite with complete public Message/Run fixtures, four new completed/incomplete cases, and strengthened existing controls:

  • Completed and incomplete messages retain terminal status, timestamps, incomplete details, and content.
  • Final storage and terminal callback contexts use the terminal object, while earlier snapshot identity/content and raw-event ordering remain unchanged.
  • Aliases introduced through the previously exposed snapshot remain reserved when terminal replacement occurs; a subsequent conflicting creation is rejected before exposure.
  • Existing no-terminal-message cases explicitly retain their original snapshot identity.

The two metadata regressions fail on the original source. The alias regressions pass on the original source and caught a regression in the initial patch; the implementation was tightened and independently reviewed again.

Verification

  • Full handwritten suite on Node 24.19.0: 7,749 tests across 203 files pass, using CI=1 OPENAI_TEST_SUITE=unit ./scripts/test.
  • Focused lifecycle, identity, and security coverage: 254 tests across six files pass.
  • Actual built public SDK, CJS and ESM: completed/incomplete SSE reproductions verify the failure before the fix and terminal snapshots after it.
  • 24 independent public-SDK SSE cases pass on Node 22.0.0, 22.22.3, and 26.7.0, covering differing accumulated/final content, retained-object identity, event order, and alias preservation. Each case makes one synthetic-authenticated request through an in-memory transport.
  • Public exports, .js alias/class identity, methods, and declaration signatures are unchanged apart from documentation comments.
  • Canonical formatting, lint, full repository TypeScript check, JS/MJS SDK build, and git diff --check pass.
  • Adversarial self-review, independent review, tightening, and repeat review complete with no remaining findings.

Only the handwritten helper and its existing test file change. Generated code, dependencies, transport behavior, and public signatures are untouched. No live API calls or real credentials were used.

Generated API tests were not run locally: the fresh worktree lacks the pinned Steady mock source. The successful full handwritten run above is explicitly separate from that local generated-test setup limitation.

@HAYDEN-OAI
HAYDEN-OAI requested a review from a team as a code owner September 6, 2026 00:04
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 6, 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-06T00:06:20.902657Z ad8895c PR opened
🔒 Security Review ✅ Completed 2026-09-06T00:09:21.949175Z ad8895c 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 Sep 6, 2026 •

Copy link
Copy Markdown
Contributor

OkTest Summary

✅ 237/237 SDK tests passed in 10.989s for Node SDK PR #2650.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 161ms
tests/chat-completions-create.test.ts ✅ Passed 274ms
tests/chat-completions-stream.test.ts ✅ Passed 205ms
tests/files-content-binary.test.ts ✅ Passed 158ms
tests/files-create-multipart.test.ts ✅ Passed 163ms
tests/files-list-pagination.test.ts ✅ Passed 175ms
tests/initialize-config.test.ts ✅ Passed 152ms
tests/instance-isolation.test.ts ✅ Passed 120ms
tests/models-list.test.ts ✅ Passed 137ms
tests/responses-background-lifecycle.test.ts ✅ Passed 220ms
tests/responses-body-method-errors.test.ts ✅ Passed 365ms
tests/responses-cancel-timeout.test.ts ✅ Passed 251ms
tests/responses-cancel.test.ts ✅ Passed 279ms
tests/responses-compact-retries.test.ts ✅ Passed 273ms
tests/responses-compact.test.ts ✅ Passed 209ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 189ms
tests/responses-create-advanced.test.ts ✅ Passed 182ms
tests/responses-create-disconnect.test.ts ✅ Passed 1.168s
tests/responses-create-errors.test.ts ✅ Passed 279ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 206ms
tests/responses-create-retries.test.ts ✅ Passed 242ms
tests/responses-create-stream-failures.test.ts ✅ Passed 224ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 2.167s
tests/responses-create-stream-wire.test.ts ✅ Passed 2.584s
tests/responses-create-stream.test.ts ✅ Passed 128ms
tests/responses-create-terminal-states.test.ts ✅ Passed 296ms
tests/responses-create-timeout.test.ts ✅ Passed 291ms
tests/responses-create.test.ts ✅ Passed 177ms
tests/responses-delete.test.ts ✅ Passed 251ms
tests/responses-input-items-errors.test.ts ✅ Passed 181ms
tests/responses-input-items-list.test.ts ✅ Passed 183ms
tests/responses-input-items-options.test.ts ✅ Passed 112ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 328ms
tests/responses-input-tokens-count.test.ts ✅ Passed 235ms
tests/responses-malformed-inputs.test.ts ✅ Passed 2.197s
tests/responses-not-found-errors.test.ts ✅ Passed 359ms
tests/responses-parse.test.ts ✅ Passed 217ms
tests/responses-retrieve-retries.test.ts ✅ Passed 276ms
tests/responses-retrieve.test.ts ✅ Passed 237ms
tests/responses-stored-method-errors.test.ts ✅ Passed 577ms
tests/retry-behavior.test.ts ✅ Passed 3.149s
tests/sdk-error-shape.test.ts ✅ Passed 339ms

View OkTest run #34000332350

SDK merge (3551802b7379) · head (ad8895cf9e88) · base (86acb953e274) · OkTest (2b1bdfd25e98)

@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

32 mixed files remain; 0 existing customizations changed.

Compared 86acb953e274 → ad8895cf9e88. 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 34000348563 --repo openai/openai-node \
  --name castiron-custom-code-34000348563-1 --dir /tmp/castiron-custom-code-34000348563-1
git apply --stat /tmp/castiron-custom-code-34000348563-1/custom-code.patch
cat /tmp/castiron-custom-code-34000348563-1/custom-code.patch

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

git fetch --no-tags origin 86acb953e27459ba73d6f930c6edb56369dfd002 ad8895cf9e8817e19071777212a19b161d7d6d1f
python3 scripts/castiron/custom_code_report.py report \
  --base 86acb953e27459ba73d6f930c6edb56369dfd002 \
  --head ad8895cf9e8817e19071777212a19b161d7d6d1f --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-ad8895cf9e88
cat /tmp/castiron-custom-code-ad8895cf9e88/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 the exact head against the requested terminal-snapshot lifecycle behavior. Terminal completed and incomplete message objects now become authoritative for finalMessages and terminal callbacks, while earlier accumulated snapshots remain unmutated and prior aliases remain reserved. The focused completed, incomplete, identity, ordering, alias, and no-terminal controls cover the affected paths. I found no blocking issues.

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

Reviewed the full message lifecycle, callback identity, canonical-ID/alias reservations, and terminal/no-terminal controls at ad8895c. No substantive correctness or maintainability findings. Selecting the authoritative terminal object in the existing accumulator and reserving the outgoing snapshot before replacement is a direct fix; it needs no new merge policy, state, or abstraction. Both changed files already exceeded 1,000 lines; this focused change does not introduce a new responsibility that warrants decomposition.

Independently passed 515 tests across eight focused stream/lifecycle/security suites, the canonical SDK build and lint, and git diff --check. A separate public-SDK SSE probe passed 24 cases per revision in CJS/ESM on both Node 24.20.0 and 22.22.3, reproducing stale base snapshots and verifying terminal content/metadata, callback identity, retained snapshots, and alias rejection on head. Full repository type checking is limited by missing Azure/dotenv/Express example dependencies; a broader handwritten-suite run reports failures outside this change, so I have not reproduced the claimed all-green full-suite result. Generated tests and the exact Node 22.0.0 floor were not run.

@HAYDEN-OAI
HAYDEN-OAI added this pull request to the merge queue Sep 6, 2026
Merged via the queue into main with commit 414677e Sep 6, 2026
38 checks passed
@HAYDEN-OAI
HAYDEN-OAI deleted the codex/assistant-terminal-message-snapshots branch September 6, 2026 06:21
@openai-sdks openai-sdks Bot mentioned this pull request Sep 6, 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.

3 participants