Skip to content

fix(streaming): keep indexed snapshots compact - #490

Open
jbeckwith-oai wants to merge 5 commits into
mainfrom
codex/compact-stream-indices
Open

fix(streaming): keep indexed snapshots compact#490
jbeckwith-oai wants to merge 5 commits into
mainfrom
codex/compact-stream-indices

Conversation

@jbeckwith-oai

@jbeckwith-oai jbeckwith-oai commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • treat streamed choice and tool-call indices as protocol identifiers while keeping snapshot arrays compact
  • preserve deterministic index ordering and independent state for interleaved choices and tool calls
  • reject negative indices before mutating stream state
  • keep choice/tool-call lookup linear or constant-time and avoid repeated sorting for monotonic streamed appends

The behavior is implemented in the handwritten streaming accumulator; generated transport models remain unchanged.

Validation

  • rebased onto origin/main at 2c4abe5e321053be32916d0df823a20f621a8d4c
  • focused stream-index regressions on Ruby 3.3.12, 3.4.10, and 4.0.6: 8 runs / 40 assertions per version
  • complete chat streaming and snapshot matrix: 42 runs / 200 assertions per version
  • complete suite on Ruby 3.3.12, 3.4.10, and 4.0.6: 1,120 runs / 10,146 assertions per version
  • bundle exec rake lint
  • bundle exec rake build:gem
  • independent two-pass review, thermo-nuclear maintainability review, and scoped Codex Security diff scan

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

48 mixed files remain; 0 existing customizations changed.

Compared 851f53438f5a15c96822ca98. Generated baselines verified.

48 existing customizations unchanged
  • lib/openai.rb
  • lib/openai/client.rb
  • lib/openai/models/chat/chat_completion_message.rb
  • lib/openai/models/chat/chat_completion_message_function_tool_call.rb
  • lib/openai/models/chat/completion_create_params.rb
  • lib/openai/models/response_format_json_schema.rb
  • lib/openai/models/responses/function_tool.rb
  • lib/openai/models/responses/response.rb
  • lib/openai/models/responses/response_create_params.rb
  • lib/openai/models/responses/response_format_text_config.rb
  • lib/openai/models/responses/response_format_text_json_schema_config.rb
  • lib/openai/models/responses/response_function_tool_call.rb
  • lib/openai/models/responses/response_function_web_search.rb
  • lib/openai/models/responses/response_output_text.rb
  • lib/openai/models/responses/tool.rb
  • lib/openai/resources/beta/responses.rb
  • lib/openai/resources/beta/threads.rb
  • lib/openai/resources/chat/completions.rb
  • lib/openai/resources/files.rb
  • lib/openai/resources/responses.rb
  • lib/openai/resources/vector_stores/file_batches.rb
  • lib/openai/resources/vector_stores/files.rb
  • lib/openai/resources/webhooks.rb
  • rbi/openai/client.rbi
  • rbi/openai/models/chat/chat_completion_message.rbi
  • rbi/openai/models/chat/chat_completion_message_function_tool_call.rbi
  • rbi/openai/models/chat/completion_create_params.rbi
  • rbi/openai/models/response_format_json_schema.rbi
  • rbi/openai/models/responses/response.rbi
  • rbi/openai/models/responses/response_create_params.rbi
  • rbi/openai/models/responses/response_function_tool_call.rbi
  • rbi/openai/models/responses/response_function_web_search.rbi
  • rbi/openai/models/responses/response_output_text.rbi
  • rbi/openai/resources/chat/completions.rbi
  • rbi/openai/resources/files.rbi
  • rbi/openai/resources/responses.rbi
  • rbi/openai/resources/vector_stores/file_batches.rbi
  • rbi/openai/resources/vector_stores/files.rbi
  • scripts/castiron/README.md
  • scripts/castiron/custom_code_report.py

8 more in the full report.

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

Inspect the custom-code diff

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

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

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

git fetch --no-tags origin 851f53438f5afc7f32e3ccbe866fd03bbade576a 15c96822ca9889eb5d921b692e591b8e0e855e88
python3 scripts/castiron/custom_code_report.py report \
  --base 851f53438f5afc7f32e3ccbe866fd03bbade576a \
  --head 15c96822ca9889eb5d921b692e591b8e0e855e88 --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-15c96822ca98
cat /tmp/castiron-custom-code-15c96822ca98/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 requested a review from a team August 20, 2026 17:51
@jbeckwith-oai
jbeckwith-oai marked this pull request as ready for review August 20, 2026 17:55
@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-21T04:21:53.232362Z 15c9682 New commits
🔒 Security Review Completed 2026-08-21T04:22:34.150111Z 15c9682 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 Aug 20, 2026

Copy link
Copy Markdown
Contributor

OkTest Summary

237/237 SDK tests passed in 9.913s for Ruby SDK PR #490.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 180ms
tests/chat-completions-create.test.ts ✅ Passed 237ms
tests/chat-completions-stream.test.ts ✅ Passed 139ms
tests/files-content-binary.test.ts ✅ Passed 233ms
tests/files-create-multipart.test.ts ✅ Passed 142ms
tests/files-list-pagination.test.ts ✅ Passed 153ms
tests/initialize-config.test.ts ✅ Passed 183ms
tests/instance-isolation.test.ts ✅ Passed 233ms
tests/models-list.test.ts ✅ Passed 174ms
tests/responses-background-lifecycle.test.ts ✅ Passed 243ms
tests/responses-body-method-errors.test.ts ✅ Passed 430ms
tests/responses-cancel-timeout.test.ts ✅ Passed 222ms
tests/responses-cancel.test.ts ✅ Passed 264ms
tests/responses-compact-retries.test.ts ✅ Passed 229ms
tests/responses-compact.test.ts ✅ Passed 246ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 142ms
tests/responses-create-advanced.test.ts ✅ Passed 184ms
tests/responses-create-disconnect.test.ts ✅ Passed 977ms
tests/responses-create-errors.test.ts ✅ Passed 257ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 218ms
tests/responses-create-retries.test.ts ✅ Passed 312ms
tests/responses-create-stream-failures.test.ts ✅ Passed 162ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 211ms
tests/responses-create-stream-wire.test.ts ✅ Passed 2.469s
tests/responses-create-stream.test.ts ✅ Passed 89ms
tests/responses-create-terminal-states.test.ts ✅ Passed 289ms
tests/responses-create-timeout.test.ts ✅ Passed 204ms
tests/responses-create.test.ts ✅ Passed 245ms
tests/responses-delete.test.ts ✅ Passed 253ms
tests/responses-input-items-errors.test.ts ✅ Passed 200ms
tests/responses-input-items-list.test.ts ✅ Passed 195ms
tests/responses-input-items-options.test.ts ✅ Passed 255ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 240ms
tests/responses-input-tokens-count.test.ts ✅ Passed 269ms
tests/responses-malformed-inputs.test.ts ✅ Passed 2.088s
tests/responses-not-found-errors.test.ts ✅ Passed 354ms
tests/responses-parse.test.ts ✅ Passed 197ms
tests/responses-retrieve-retries.test.ts ✅ Passed 287ms
tests/responses-retrieve.test.ts ✅ Passed 258ms
tests/responses-stored-method-errors.test.ts ✅ Passed 738ms
tests/retry-behavior.test.ts ✅ Passed 3.116s
tests/sdk-error-shape.test.ts ✅ Passed 355ms

View OkTest run #32446583564

SDK merge (2acfbada75c6) · head (15c96822ca98) · base (851f53438f5a) · OkTest (2b1bdfd25e98)

@jbeckwith-oai jbeckwith-oai added the generator Touches generated SDK files label Aug 20, 2026

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

Found one introduced P2 reliability/scalability issue in the indexed streaming accumulator.

Comment thread lib/openai/helpers/streaming/chat_completion_stream.rb Outdated

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

One substantive P2 performance regression is documented inline.

Comment thread lib/openai/helpers/streaming/chat_completion_stream.rb Outdated
@jbeckwith-oai
jbeckwith-oai requested a review from a team August 20, 2026 23:16
@jbeckwith-oai
jbeckwith-oai force-pushed the codex/compact-stream-indices branch from 2e09128 to 32bf016 Compare August 21, 2026 01:22
@jbeckwith-oai

Copy link
Copy Markdown
Contributor Author

Rebased onto current origin/main and completed a comprehensive re-review. The independent pass found one sibling performance gap: monotonically appended tool calls still triggered a full sort_by! after every chunk. The deterministic regression failed first with 127 sorts for 127 appends and now passes with zero; out-of-order/interleaved ordering remains covered. Exact head 32bf0169bb08e89687a41f241dcf01859f8e30ad is fully green. Local verification: chat streaming matrix 42 runs / 200 assertions on Ruby 3.3.12, 3.4.10, and 4.0.6; full suite 1,120 runs / 10,146 assertions on each; lint, types, rubyfmt, gem build, two-pass review, thermo review, and scoped security review all passed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

generator Touches generated SDK files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants