Repository navigation
docs(examples): preserve split UTF-8 in raw stream consumer - #2714
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 35f2a2eaf5
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
HAYDEN-OAI
left a comment
There was a problem hiding this comment.
Reviewed with Codex at f3deee43c5c8d09a26ddc3f82b8e59042971fb00. TextDecoderStream preserves UTF-8 sequences split across chunks and flushes the decoder at EOF. No actionable correctness or supported-runtime compatibility findings. LGTM.
Castiron custom code✅ No new custom-code files detected. 45 mixed files remain; 0 existing customizations changed. Compared 45 existing customizations unchanged
5 more in the full report. A changed generated baseline means this report cannot reliably identify which handwritten lines changed. Inspect the custom-code diffDownload the exact patch produced by this run (requires repository access): gh run download 35123730120 --repo openai/openai-node \
--name castiron-custom-code-35123730120-1 --dir /tmp/castiron-custom-code-35123730120-1
git apply --stat /tmp/castiron-custom-code-35123730120-1/custom-code.patch
cat /tmp/castiron-custom-code-35123730120-1/custom-code.patchOr reproduce it from an SDK checkout containing the vendored reporter: git fetch --no-tags origin eda4d0cd54271ac9fc05a3e44dfe7fd1c16d2d77 d33f02330f8350b70862837aa0c85a189dec965a
python3 scripts/castiron/custom_code_report.py report \
--base eda4d0cd54271ac9fc05a3e44dfe7fd1c16d2d77 \
--head d33f02330f8350b70862837aa0c85a189dec965a --fetch --require-head-hash --public \
--out /tmp/castiron-custom-code-d33f02330f83
cat /tmp/castiron-custom-code-d33f02330f83/custom-code.patchThis is the current full custom patch for mixed files, not an attribution of only the handwritten lines changed by this PR. |
Automated Release PR --- ## [7.17.0](v7.16.0...v7.17.0) (2026-09-16) ### Features * **api:** add compaction progress events ([#2749](#2749)) ([425502d](425502d)) ### Bug Fixes * **ci:** retry transient Deno download failures ([#2752](#2752)) ([e39037b](e39037b)) * preserve chat runner abort reasons ([#2607](#2607)) ([eda4d0c](eda4d0c)) * **realtime:** preserve native WebSocket error causes ([#2715](#2715)) ([58fa72a](58fa72a)) * **responses:** reject function-based API keys in WebSocket constructors ([#2586](#2586)) ([eea7618](eea7618)) * **runners:** reject unfinished turns in streaming runTools ([#2716](#2716)) ([937ed67](937ed67)) * **streaming:** emit terminal SSE events missing a trailing blank line ([#2726](#2726)) ([94d6418](94d6418)) * **zod:** omit impossible optional branch in strict schemas ([#2751](#2751)) ([2b4c2c7](2b4c2c7)) ### Chores * update lint tooling and tailor anti-slop for the SDK ([#2753](#2753)) ([21a03c2](21a03c2)) ### Documentation * **examples:** preserve split UTF-8 in raw stream consumer ([#2714](#2714)) ([f44152a](f44152a)) --- 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>
Summary
Fix the copyable fetch consumer in the raw streaming example so UTF-8 characters are preserved when their bytes span response chunks. The current
TextDecoder.decode(chunk)calls finalize decoding on every chunk, turning valid accented text, CJK characters and emoji into replacement characters.Pipe the response through
TextDecoderStreaminstead. It retains partial characters across chunks and flushes at EOF. The example change is limited to the commented recipe, with an automated regression added alongside it; the server and SDK runtime are unchanged.Validation
Executed the literal documented fetch snippet against a synthetic Response that emits one byte per chunk. Before:
café 日本語 🐕becomescaf�� ��������� ����. After: the text is preserved. Also verified that an incomplete final UTF-8 sequence flushes to a replacement character.No OpenAI API calls were made.
git diff --checkpasses. Full SDK/build suites were not run for this example/test-only change.Automated regression added after review
tests/lib/raw-streaming-fetch-example.test.tsextracts and executes the actual documented fetch consumer against synthetic streamed Responses. It covers split multibyte UTF-8, EOF flushing, and an empty body. Vitest 4.1.11: 3 passed on Node 24.20.0. Reverting only the example fix makes 2 fail while the empty-body control still passes. The test file also passes pinned formatting/lint.