File: migration-guide-4-2.md | Updated: 11/15/2025
Menu
v5 (Latest)
AI SDK 5.x
Model Context Protocol (MCP) Tools
Migrate Your Data to AI SDK 5.0
Copy markdown
==================================================================================================================
Check out the AI SDK 4.2 release blog post for more information about the release.
This guide will help you upgrade to AI SDK 4.2:
The following APIs have been moved to stable and no longer have the experimental_ prefix:
customProviderproviderOptions (renamed from providerMetadata for provider-specific inputs)providerMetadata (for provider-specific outputs)toolCallStreaming option for streamTextAI SDK requires a non-optional zod dependency with version ^3.23.8.
In AI SDK 4.2, we've redesigned how useChat handles model outputs with message parts and multiple steps. This is a significant improvement that simplifies rendering complex, multi-modal AI responses in your UI.
Assistant messages with tool calling now get combined into a single message with multiple parts, rather than creating separate messages for each step. This change addresses two key developments in AI applications:
Previously, useChat stored different output types separately, which made it challenging to maintain the correct sequence in your UI when these elements were interleaved in a response, and led to multiple consecutive assistant messages when there were tool calls. For example:
message.content = "Final answer: 42";message.reasoning = "First I'll calculate X, then Y...";message.toolInvocations = [{toolName: "calculator", args: {...}}];
This structure was limiting. The new message parts approach replaces separate properties with an ordered array that preserves the exact sequence:
message.parts = [ { type: "text", text: "Final answer: 42" }, { type: "reasoning", reasoning: "First I'll calculate X, then Y..." }, { type: "tool-invocation", toolInvocation: { toolName: "calculator", args: {...} } },];
Existing applications using the previous message format will need to update their UI components to handle the new parts array. The fields from the previous format are still available for backward compatibility, but we recommend migrating to the new format for better support of multi-modal and multi-step interactions.
You can use the useChat hook with the new message parts as follows:
function Chat() { const { messages } = useChat(); return ( <div> {messages.map(message => message.parts.map((part, i) => { switch (part.type) { case 'text': return <p key={i}>{part.text}</p>; case 'source': return <p key={i}>{part.source.url}</p>; case 'reasoning': return <div key={i}>{part.reasoning}</div>; case 'tool-invocation': return <div key={i}>{part.toolInvocation.toolName}</div>; case 'file': return ( <img key={i} src={`data:${part.mediaType};base64,${part.data}`} /> ); } }), )} </div> );}
On this page
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: