Skip to content

fix: [responses] Avoid quadratic comparisons when accumulating long text - #2434

Merged
apcha-oai merged 1 commit into
mainfrom
apcha/fix-response-accumulator-text-comparison
Aug 20, 2026
Merged

apcha-oai merged 1 commit into
mainfrom
apcha/fix-response-accumulator-text-comparison

Conversation

@apcha-oai

Copy link
Copy Markdown
Contributor

Summary

#2354 made direct accumulateResponse(event, snapshot) calls recount caller-owned output so that edits between calls cannot leave stale text behind. That correctness guarantee is necessary, but the recount also compared the rebuilt string with the previous aggregate. For a long response, those independently accumulated strings can be equal only after walking the entire prefix again on every delta.

Assign the authoritative recount directly. A local replay of 16,000 64-byte deltas (1.024 MB) dropped from about 1.5 seconds to 14 ms on Node 22 and 24. This preserves the existing public API, snapshot-mutation behavior, and privately owned ResponseStream context; it does not introduce a cache or pretend the necessary content-part scan can be eliminated.

Add a deterministic public-entrypoint regression for that long-response shape. It detects reads of the old aggregate before the recount is installed, so the original implementation fails without relying on a wall-clock threshold.

@github-actions

github-actions Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

34 mixed files remain; 0 existing customizations changed.

Compared 4e588c2fed7f → e41c4c3d55d5. Generated baselines verified.

34 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/api-resources/embeddings.test.ts
  • tests/api-resources/responses/responses.test.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 32425237895 --repo openai/openai-node \
  --name castiron-custom-code-32425237895-1 --dir /tmp/castiron-custom-code-32425237895-1
git apply --stat /tmp/castiron-custom-code-32425237895-1/custom-code.patch
cat /tmp/castiron-custom-code-32425237895-1/custom-code.patch

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

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

@apcha-oai
apcha-oai marked this pull request as ready for review August 20, 2026 22:39
@apcha-oai
apcha-oai requested a review from a team as a code owner August 20, 2026 22:39
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 20, 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-20T22:41:06.579239Z e41c4c3 Draft marked ready
🔒 Security Review ✅ Completed 2026-08-20T22:40:59.826775Z e41c4c3 Draft marked ready
ℹ️ 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.

@apcha-oai apcha-oai changed the title [responses] Avoid quadratic comparisons when accumulating long text fix: [responses] Avoid quadratic comparisons when accumulating long text Aug 20, 2026
@openai-sdks

openai-sdks Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

OkTest Summary

✅ 237/237 SDK tests passed in 11.867s for Node SDK PR #2434.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 231ms
tests/chat-completions-create.test.ts ✅ Passed 293ms
tests/chat-completions-stream.test.ts ✅ Passed 328ms
tests/files-content-binary.test.ts ✅ Passed 215ms
tests/files-create-multipart.test.ts ✅ Passed 228ms
tests/files-list-pagination.test.ts ✅ Passed 236ms
tests/initialize-config.test.ts ✅ Passed 249ms
tests/instance-isolation.test.ts ✅ Passed 143ms
tests/models-list.test.ts ✅ Passed 175ms
tests/responses-background-lifecycle.test.ts ✅ Passed 298ms
tests/responses-body-method-errors.test.ts ✅ Passed 377ms
tests/responses-cancel-timeout.test.ts ✅ Passed 219ms
tests/responses-cancel.test.ts ✅ Passed 386ms
tests/responses-compact-retries.test.ts ✅ Passed 305ms
tests/responses-compact.test.ts ✅ Passed 298ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 115ms
tests/responses-create-advanced.test.ts ✅ Passed 375ms
tests/responses-create-disconnect.test.ts ✅ Passed 1.271s
tests/responses-create-errors.test.ts ✅ Passed 239ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 238ms
tests/responses-create-retries.test.ts ✅ Passed 402ms
tests/responses-create-stream-failures.test.ts ✅ Passed 209ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 2.161s
tests/responses-create-stream-wire.test.ts ✅ Passed 2.53s
tests/responses-create-stream.test.ts ✅ Passed 86ms
tests/responses-create-terminal-states.test.ts ✅ Passed 306ms
tests/responses-create-timeout.test.ts ✅ Passed 256ms
tests/responses-create.test.ts ✅ Passed 270ms
tests/responses-delete.test.ts ✅ Passed 263ms
tests/responses-input-items-errors.test.ts ✅ Passed 393ms
tests/responses-input-items-list.test.ts ✅ Passed 176ms
tests/responses-input-items-options.test.ts ✅ Passed 268ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 278ms
tests/responses-input-tokens-count.test.ts ✅ Passed 312ms
tests/responses-malformed-inputs.test.ts ✅ Passed 2.176s
tests/responses-not-found-errors.test.ts ✅ Passed 326ms
tests/responses-parse.test.ts ✅ Passed 300ms
tests/responses-retrieve-retries.test.ts ✅ Passed 337ms
tests/responses-retrieve.test.ts ✅ Passed 370ms
tests/responses-stored-method-errors.test.ts ✅ Passed 759ms
tests/retry-behavior.test.ts ✅ Passed 2.935s
tests/sdk-error-shape.test.ts ✅ Passed 303ms

View OkTest run #32425240242

SDK merge (b355c8b0cfe1) · head (e41c4c3d55d5) · base (4e588c2fed7f) · OkTest (2b1bdfd25e98)

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

Independently verified the response-stream accumulator removes repeated full-prefix comparisons while preserving canonical accumulated text, mixed content, ordering, caller-owned snapshots, and existing stream/error behavior. The deterministic 16,000-delta regression directly detects the previous quadratic path, and all CI checks are green.

@apcha-oai
apcha-oai added this pull request to the merge queue Aug 20, 2026
Merged via the queue into main with commit 95628ce Aug 20, 2026
56 checks passed
@apcha-oai
apcha-oai deleted the apcha/fix-response-accumulator-text-comparison branch August 20, 2026 23:00
@openai-sdks openai-sdks Bot mentioned this pull request Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants