This document outlines the breaking changes users will encounter when upgrading from v4 to v5 of the ai-sdk-provider-claude-code.
- v5 provider with AI SDK v4 ❌
- v4 provider with AI SDK v5 ❌
You must upgrade both together.
Update your dependencies to use the beta versions:
{
"dependencies": {
"ai": "beta",
"ai-sdk-provider-claude-code": "latest"
}
}The token usage properties have been renamed:
// V4
const { usage } = await generateText(...);
console.log(usage.promptTokens); // ❌ Old
console.log(usage.completionTokens); // ❌ Old
// V5
const { usage } = await generateText(...);
console.log(usage.inputTokens); // ✅ New
console.log(usage.outputTokens); // ✅ New
console.log(usage.totalTokens); // ✅ NewThe streamText function now returns a result object with promises:
// V4
const { text, usage } = await streamText({
model: claudeCode('opus'),
prompt: 'Hello',
});
// V5
const result = streamText({
model: claudeCode('opus'),
prompt: 'Hello',
});
const text = await result.text;
const usage = await result.usage;In v5, messages sent to the model should use ModelMessage type:
// V4
import type { Message } from 'ai';
const messages: Message[] = [];
// V5
import type { ModelMessage } from 'ai';
const messages: ModelMessage[] = [];Note: UIMessage is for UI state management, while ModelMessage is for sending to language models.
Some parameter names have changed:
// V4
generateText({
model: claudeCode('opus'),
prompt: 'Hello',
maxTokens: 100, // ❌ Old
});
// V5
generateText({
model: claudeCode('opus'),
prompt: 'Hello',
maxOutputTokens: 100, // ✅ New
});V5 streams now emit additional events:
// V5 stream includes these events:
// - stream-start (with warnings)
// - response-metadata
// - text-delta (with 'delta' property, not 'textDelta')
// - finish// V5 Pattern
import { streamText } from 'ai';
import { claudeCode } from 'ai-sdk-provider-claude-code';
const result = streamText({
model: claudeCode('opus'),
prompt: 'Write a haiku',
});
// Await the results
const text = await result.text;
const usage = await result.usage;
const metadata = await result.providerMetadata;// V5 Pattern
import { streamText } from 'ai';
import { claudeCode } from 'ai-sdk-provider-claude-code';
import type { CoreMessage } from 'ai';
const messages: CoreMessage[] = [
{ role: 'user', content: 'Hello!' },
{ role: 'assistant', content: 'Hi there!' },
{ role: 'user', content: 'How are you?' },
];
const result = streamText({
model: claudeCode('opus'),
messages,
});
const response = await result.text;- All Claude Code SDK-specific limitations still apply (no temperature control, no output length limits, etc.)
- TypeScript users will get compile-time errors for most breaking changes
- This is a complete rewrite for v5 compatibility - no v4 compatibility is maintained