-
Notifications
You must be signed in to change notification settings - Fork 3.7k
fix(ai): throw error for missing start chunks in processUIMessageStream #11463
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(ai): throw error for missing start chunks in processUIMessageStream #11463
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR adds defensive null checks to prevent runtime errors when processing malformed UI message streams. The fix addresses cases where delta or end chunks are received before their corresponding start chunks.
Summary
The PR adds null checks for text-delta, text-end, reasoning-delta, reasoning-end, and tool-input-delta chunk types to prevent crashes when start chunks are missing. Instead of crashing with a generic TypeError, the code now throws descriptive errors that help identify the upstream issue.
Key Changes
- Added null checks with descriptive error messages for delta and end chunks in stream processing
- Added test cases to verify error handling for malformed streams (delta without start)
- Minor formatting improvements to type definitions
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| packages/ai/src/ui/process-ui-message-stream.ts | Added null checks for text, reasoning, and tool-input parts with descriptive error messages; minor formatting improvements |
| packages/ai/src/ui/process-ui-message-stream.test.ts | Added test cases for malformed stream scenarios where delta chunks are received without corresponding start chunks |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
can you first address all the comments of the above bots? |
addressed all of them |
|
since you already have the PR, can you create an issue and in the issue have a brief repro of where you encountered this error please. tag me so that i can take a look at it |
| case 'text-end': { | ||
| const textPart = state.activeTextParts[chunk.id]; | ||
| if (textPart == null) { | ||
| throw new Error( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it would be good to have a dedicated error AI SDK error class for this, e.g. UIMessageStreamError
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Created a dedicated UIMessageStreamError class following the AI SDK error patterns.
|
please add a changeset |
|
does this break backwards compat, i.e. are there cases where it might have worked before but would error after this change? |
added |
This change should not break backwards compatibility for valid stream usage.
|
148437e to
b374c01
Compare
|
hold off on merging this - there might be a different problem than the original for which the PR was raised |
aayush-kapoor
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
run pnpm prettier-fix to fix failing CI
This PR addresses a runtime error:
TypeError: Cannot read properties of undefined (reading 'text')inprocessUIMessageStream.Issue
The issue occurs when
text-delta,reasoning-delta, ortool-input-deltachunks are received before their corresponding start chunks (e.g.,text-start). This can happen in malformed streams, network issues causing packet reordering, or specific backend behaviors where a delta is emitted immediately without a start frame.Previously,
processUIMessageStreamassumed that a start part (initialized inactiveTextParts, etc.) always existed when a delta arrived. When it didn't, accessing properties liketextPart.textcaused a crash.Fix
This change adds explicit null checks for the active parts (
textPart,reasoningPart,partialToolCall). If a delta is received for a missing part, it now throws a descriptive error:This descriptive error aids in debugging the actual upstream issue (broken stream) rather than crashing the UI with an opaque TypeError.
Changes
if (part == null)checks intext-delta,reasoning-delta, andtool-input-deltacases.consumeStreamto properly propagate errors for validation.Related Issues
Fixes #11700