Skip to content

docs(examples): preserve split UTF-8 in raw stream consumer - #2714

Merged
HAYDEN-OAI merged 4 commits into
openai:mainfrom
mikevillari:docs/streaming-fetch-utf8
Sep 16, 2026
Merged

HAYDEN-OAI merged 4 commits into
openai:mainfrom
mikevillari:docs/streaming-fetch-utf8

Conversation

@mikevillari

@mikevillari mikevillari commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

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 TextDecoderStream instead. 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é 日本語 🐕 becomes caf�� ��������� ����. 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.

  • Literal snippet regression passes on Node 22.23.2, 24.20.0 and 26.5.0.
  • Changed file passes pinned Oxfmt 0.62.0 and Oxlint 1.80.0 using the repository configs (Ultracite 7.10.5).
  • git diff --check passes. 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.ts extracts 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.

@mikevillari
mikevillari requested a review from a team as a code owner September 9, 2026 19:41
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 9, 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-16T16:35:27.547446Z 52779df New commits
🔒 Security Review ✅ Completed 2026-09-16T16:36:13.957796Z 52779df 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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

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.

@github-actions

github-actions Bot commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

45 mixed files remain; 0 existing customizations changed.

Compared eda4d0cd5427 → d33f02330f83. Generated baselines verified.

45 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/agents/environments/files.ts
  • src/resources/beta/agents/sessions/sessions.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/responses/ws-base.ts
  • src/resources/beta/responses/ws.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/live/forks/ws-base.ts
  • src/resources/live/forks/ws.ts
  • src/resources/live/sideband/ws-base.ts
  • src/resources/live/sideband/ws.ts
  • src/resources/live/ws-base.ts
  • src/resources/live/ws.ts
  • src/resources/responses/internal-base.ts
  • src/resources/responses/responses.ts
  • src/resources/responses/ws-base.ts
  • src/resources/responses/ws.ts
  • src/resources/skills/skills.ts
  • src/resources/skills/versions/versions.ts
  • src/resources/vector-stores/file-batches.ts

5 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 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.patch

Or 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.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 16, 2026
Merged via the queue into openai:main with commit f44152a Sep 16, 2026
34 checks passed
@openai-sdks openai-sdks Bot mentioned this pull request Sep 16, 2026
HAYDEN-OAI pushed a commit that referenced this pull request Sep 16, 2026
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>
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