Skip to content

[v6.0] fix(langchain): reset streamEvents text between model invocations#16789

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

[v6.0] fix(langchain): reset streamEvents text between model invocations#16789
gr2m merged 1 commit into
release-v6.0from
backport-v6.0/fix-15254

Conversation

@gr2m

@gr2m gr2m commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Backport of #15254 to release-v6.0 (clean cherry-pick). on_chat_model_start did not reset textStarted/reasoningStarted, so multi-invocation streamEvents runs appended later text to the first text part.

Part of the v6.0 backport tracking issue #16767.

…5254)

## Background

When `toUIMessageStream` consumes LangGraph **`streamEvents`** (v2),
`processStreamEventsEvent` tracks streaming text with `textStarted` /
`textMessageId` (and reasoning with `reasoningStarted` /
`reasoningMessageId`). Those flags were only cleared at the end of the
whole stream, not when a **new** chat model run started.

If a graph performs multiple LLM calls in one run (e.g. tool use then
model again), **`on_chat_model_start`** can fire again while
`textStarted` is still `true`. Subsequent **`text-delta`** chunks then
reuse the first text part’s id, so later prose appends to that first
block. Tool events still append **new** tool parts after it, so the
assistant `UIMessage`’s `parts` no longer reflect chronological order in
the UI.

## Summary

- On **`on_chat_model_start`**, if the previous model turn left streams
open, emit **`reasoning-end`** and **`text-end`** with the correct ids,
then reset `reasoningStarted` / `reasoningMessageId` and `textStarted` /
`textMessageId`.
- After that, set **`messageId`** from `event.run_id` or
`event.data.run_id` as before.

This matches the intent of ending open streams when a new model
invocation begins, so the next **`text-start`** / **`reasoning-start`**
pair applies to the new turn.

## Manual Verification

- Use a LangGraph agent with **`streamEvents`** (v2) that **invokes the
chat model more than once** in the same run (e.g. tools then model
again), with text on both segments.
- Pipe the iterator through **`toUIMessageStream`** and consume the UI
message stream.
- Confirm the resulting assistant message has **multiple text parts in
order** (one per model segment) and that **tool parts** appear in the
order events occurred, not all text merged into the first text part.

## Checklist

- [ ] All commits are signed (PRs with unsigned commits cannot be
merged)
- [ ] Tests have been added / updated (for bug fixes / features)
- [ ] Documentation has been added / updated (for bug fixes / features)
- [ ] A _patch_ changeset for relevant packages has been added (for bug
fixes / features - run `pnpm changeset` in the project root)
- [x] I have reviewed this pull request (self-review)

## Future Work

Optional: add an automated test that simulates two `on_chat_model_start`
/ `on_chat_model_stream` sequences and asserts the emitted chunk
sequence includes **`text-end`** before the second segment’s
**`text-start`**.

---------

Co-authored-by: Lars Grammel <lars.grammel@gmail.com>
(cherry picked from commit 3711955)
@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 c8e38eb into release-v6.0 Jul 6, 2026
52 checks passed
@gr2m gr2m deleted the backport-v6.0/fix-15254 branch July 6, 2026 20:05
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: #16824

@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