Skip to content

[v6.0] fix(react): use the latest transport in useChat instead of a stale one#16806

Merged
gr2m merged 1 commit into
release-v6.0from
backport-v6.0/fix-16546
Jul 6, 2026
Merged

[v6.0] fix(react): use the latest transport in useChat instead of a stale one#16806
gr2m merged 1 commit into
release-v6.0from
backport-v6.0/fix-16546

Conversation

@gr2m

@gr2m gr2m commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Backport of #16546 to release-v6.0. useChat() creates its Chat instance once in a useRef, so a transport passed to useChat() was frozen at its first-render value and became stale after React state changes; the fix extends the existing latest-values ref pattern (already used for callbacks on v6) to also cover the transport, handing Chat a stable proxy transport whose sendMessages/reconnectToStream always delegate to the latest transport (falling back to a lazily created DefaultChatTransport). The use-chat.ts rewrite from callbacksRef to latestRef applied cleanly and matches main exactly, except that v6's shouldRecreateChat guard is kept as-is (the nullish-id guard from #16484 is backported independently in its own PR); conflict resolution was limited to the import block (v6 does not import fireEvent in the test file) and re-indenting the new stale transport test describe block to v6's flat test file structure (main wraps tests in an outer describe('use-chat')). Verified the ported regression test fails on v6 without the fix and passes with it. Part of the v6.0 backport tracking issue #16767.

…one (#16546)

`useChat()` creates its `Chat` instance once and stores it in a
`useRef()`, so as a result, a `transport` passed to `useChat()` was
captured and then frozen at its value in the first render. If react
state later changes, the `transport` becomes stale.

A very similar problem was addressed in
#8985 but with callbacks.

Rather than passing the transport directly to `Chat`, this passes a
proxy object that always reads the latest transport (or falls back to a
default one).

This uses the same solution as in #8985
for callbacks.

Added a route to the ai-e2e-next example at
`/chat/stale-transport-demo`. It reproduces the bug without the changes
made, and then is fixed with these changes.

Fixes #7819

Closes #12330
Closes #13464
Closes #15380
Closes #16326

(cherry picked from commit 8b2dc3c)
@gr2m gr2m added the backport Admins only: add this label to a pull request in order to backport it to the prior version label Jul 6, 2026
@gr2m gr2m merged commit 1a0240b into release-v6.0 Jul 6, 2026
52 checks passed
@gr2m gr2m deleted the backport-v6.0/fix-16546 branch July 6, 2026 20:08
github-actions Bot added a commit that referenced this pull request Jul 6, 2026
@github-actions github-actions Bot removed the backport Admins only: add this label to a pull request in order to backport it to the prior version label Jul 6, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

⚠️ Backport to release-v5.0 created but has conflicts: #16834

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

🚀 Published in:

Package Version
ai 6.0.221 github npm
@ai-sdk/alibaba 1.0.36 github npm
@ai-sdk/amazon-bedrock 4.0.131 github npm
@ai-sdk/angular 2.0.222 github npm
@ai-sdk/anthropic 3.0.95 github npm
@ai-sdk/anthropic-aws 1.0.17 github npm
@ai-sdk/assemblyai 2.0.44 github npm
@ai-sdk/azure 3.0.86 github npm
@ai-sdk/baseten 1.0.61 github npm
@ai-sdk/black-forest-labs 1.0.45 github npm
@ai-sdk/bytedance 1.0.25 github npm
@ai-sdk/cerebras 2.0.64 github npm
@ai-sdk/cohere 3.0.46 github npm
@ai-sdk/deepgram 2.0.43 github npm
@ai-sdk/deepinfra 2.0.62 github npm
@ai-sdk/deepseek 2.0.46 github npm
@ai-sdk/elevenlabs 2.0.43 github npm
@ai-sdk/fal 2.0.44 github npm
@ai-sdk/fireworks 2.0.66 github npm
@ai-sdk/gateway 3.0.145 github npm
@ai-sdk/gladia 2.0.43 github npm
@ai-sdk/google 3.0.90 github npm
@ai-sdk/google-vertex 4.0.158 github npm
@ai-sdk/groq 3.0.49 github npm
@ai-sdk/huggingface 1.0.60 github npm
@ai-sdk/hume 2.0.43 github npm
@ai-sdk/klingai 3.0.28 github npm
@ai-sdk/langchain 2.0.229 github npm
@ai-sdk/llamaindex 2.0.221 github npm
@ai-sdk/lmnt 2.0.43 github npm
@ai-sdk/luma 2.0.43 github npm
@ai-sdk/mcp 1.0.60 github npm
@ai-sdk/mistral 3.0.47 github npm
@ai-sdk/moonshotai 2.0.34 github npm
@ai-sdk/open-responses 1.0.26 github npm
@ai-sdk/openai 3.0.82 github npm
@ai-sdk/openai-compatible 2.0.58 github npm
@ai-sdk/perplexity 3.0.44 github npm
@ai-sdk/prodia 1.0.42 github npm
@ai-sdk/provider-utils 4.0.37 github npm
@ai-sdk/quiverai 1.0.10 github npm
@ai-sdk/react 3.0.223 github npm
@ai-sdk/replicate 2.0.43 github npm
@ai-sdk/revai 2.0.43 github npm
@ai-sdk/rsc 2.0.221 github npm
@ai-sdk/svelte 4.0.221 github npm
@ai-sdk/togetherai 2.0.63 github npm
@ai-sdk/valibot 2.0.38 github npm
@ai-sdk/vercel 2.0.60 github npm
@ai-sdk/voyage 1.0.14 github npm
@ai-sdk/vue 3.0.221 github npm
@ai-sdk/xai 3.0.104 github npm

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