File: abort-breaks-resumable-streams.md | Updated: 11/15/2025
Menu
v5 (Latest)
AI SDK 5.x
Model Context Protocol (MCP) Tools
Client-Side Function Calls Not Invoked
Server Actions in Client Components
useChat/useCompletion stream output contains 0:... instead of text
Tool Invocation Missing Result Error
Streaming Not Working When Deployed
Streaming Not Working When Proxied
Getting Timeouts When Deploying on Vercel
useChat Failed to Parse Stream
Server Action Plain Objects Error
Custom headers, body, and credentials not working with useChat
TypeScript performance issues with Zod and AI SDK 5
Repeated assistant messages in useChat
onFinish not called when stream is aborted
Tool calling with generateObject and streamObject
Abort breaks resumable streams
Streaming Status Shows But No Text Appears
Stale body values with useChat
Unsupported model version error
Object generation failed with OpenAI
Model is not assignable to type "LanguageModelV1"
TypeScript error "Cannot find namespace 'JSX'"
React error "Maximum update depth exceeded"
Jest: cannot find module '@ai-sdk/rsc'
Copy markdown
Abort breaks resumable streams
========================================================================================================================================
When using useChat with resume: true for stream resumption, the abort functionality breaks. Closing a tab, refreshing the page, or calling the stop() function will trigger an abort signal that interferes with the resumption mechanism, preventing streams from being properly resumed.
// This configuration will cause conflictsconst { messages, stop } = useChat({ id: chatId, resume: true, // Stream resumption enabled});
// Closing the tab will trigger abort and stop resumption
When a page is closed or refreshed, the browser automatically sends an abort signal, which breaks the resumption flow.
We're aware of this incompatibility and are exploring solutions. In the meantime, please choose either stream resumption or abort functionality based on your application's requirements, but not both.
If you need to support long-running generations that persist across page reloads:
const { messages, sendMessage } = useChat({ id: chatId, resume: true,});
If you need to allow users to stop streams manually:
const { messages, sendMessage, stop } = useChat({ id: chatId, resume: false, // Disable stream resumption (default behaviour)});
On this page
Abort breaks resumable streams
Option 1: Use stream resumption without abort
Option 2: Use abort without stream resumption
Deploy and Scale AI Apps with Vercel.
Vercel delivers the infrastructure and developer experience you need to ship reliable AI-powered applications at scale.
Trusted by industry leaders: