Skip to content

Commit cce032e

Browse files
docs: add MIGRATION.md for v5 to v6 migration
1 parent be22345 commit cce032e

File tree

1 file changed

+194
-0
lines changed

1 file changed

+194
-0
lines changed

MIGRATION.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# Migration Guide: v1.x to v6.x
2+
3+
Migrating from `@openrouter/ai-sdk-provider` v1.x (AI SDK 5) to v6.x (AI SDK 6).
4+
5+
## Package Updates
6+
7+
```bash
8+
# Remove old versions
9+
bun remove @openrouter/ai-sdk-provider ai
10+
11+
# Install v6
12+
bun add @openrouter/ai-sdk-provider@6.0.0-alpha.1 ai@^6.0.0
13+
```
14+
15+
**package.json diff:**
16+
```diff
17+
- "ai": "^5.0.0",
18+
- "@openrouter/ai-sdk-provider": "^1.0.0"
19+
+ "ai": "^6.0.0",
20+
+ "@openrouter/ai-sdk-provider": "^6.0.0-alpha.1"
21+
```
22+
23+
## Breaking Changes
24+
25+
### 1. Usage Object Structure
26+
27+
The biggest user-facing change. Usage data is now nested.
28+
29+
**Before (v5):**
30+
```typescript
31+
const { usage } = await generateText({...});
32+
33+
console.log(usage.promptTokens); // number
34+
console.log(usage.completionTokens); // number
35+
console.log(usage.totalTokens); // number
36+
```
37+
38+
**After (v6):**
39+
```typescript
40+
const { usage } = await generateText({...});
41+
42+
console.log(usage.inputTokens.total); // number
43+
console.log(usage.inputTokens.cached); // number | undefined
44+
console.log(usage.outputTokens.total); // number
45+
console.log(usage.outputTokens.reasoning); // number | undefined
46+
console.log(usage.totalTokens); // number
47+
```
48+
49+
**Migration pattern:**
50+
```typescript
51+
// If you have code like this:
52+
const cost = usage.promptTokens * inputPrice + usage.completionTokens * outputPrice;
53+
54+
// Change to:
55+
const cost = usage.inputTokens.total * inputPrice + usage.outputTokens.total * outputPrice;
56+
```
57+
58+
### 2. Structured Outputs
59+
60+
`generateObject()` is replaced by `generateText()` with an `output` option.
61+
62+
**Before (v5):**
63+
```typescript
64+
import { generateObject } from 'ai';
65+
import { z } from 'zod';
66+
67+
const { object } = await generateObject({
68+
model: openrouter('openai/gpt-4o'),
69+
schema: z.object({
70+
recipe: z.string(),
71+
ingredients: z.array(z.string()),
72+
}),
73+
prompt: 'Generate a recipe for chocolate cake.',
74+
});
75+
```
76+
77+
**After (v6):**
78+
```typescript
79+
import { generateText, Output } from 'ai';
80+
import { z } from 'zod';
81+
82+
const { output } = await generateText({
83+
model: openrouter('openai/gpt-4o'),
84+
output: Output.object({
85+
schema: z.object({
86+
recipe: z.string(),
87+
ingredients: z.array(z.string()),
88+
}),
89+
}),
90+
prompt: 'Generate a recipe for chocolate cake.',
91+
});
92+
```
93+
94+
### 3. Interface Versions (Internal)
95+
96+
Only relevant if you're extending provider internals.
97+
98+
| v5 | v6 |
99+
|----|-----|
100+
| `LanguageModelV2` | `LanguageModelV3` |
101+
| `ProviderV2` | `ProviderV3` |
102+
| `specificationVersion: 'v2'` | `specificationVersion: 'v3'` |
103+
104+
**Before (v5):**
105+
```typescript
106+
import type { LanguageModelV2 } from '@ai-sdk/provider';
107+
108+
const model: LanguageModelV2 = openrouter('anthropic/claude-sonnet-4');
109+
```
110+
111+
**After (v6):**
112+
```typescript
113+
import type { LanguageModelV3 } from '@ai-sdk/provider';
114+
115+
const model: LanguageModelV3 = openrouter('anthropic/claude-sonnet-4');
116+
```
117+
118+
## No Changes Required
119+
120+
These APIs work the same in both versions:
121+
122+
### Provider Creation
123+
124+
```typescript
125+
import { createOpenRouter } from '@openrouter/ai-sdk-provider';
126+
127+
const openrouter = createOpenRouter();
128+
// or with API key:
129+
const openrouter = createOpenRouter({ apiKey: 'sk-or-...' });
130+
```
131+
132+
### Basic Generation
133+
134+
```typescript
135+
const { text } = await generateText({
136+
model: openrouter('anthropic/claude-sonnet-4'),
137+
prompt: 'Hello!',
138+
});
139+
```
140+
141+
### Streaming
142+
143+
```typescript
144+
const { textStream } = streamText({
145+
model: openrouter('openai/gpt-4o'),
146+
prompt: 'Write a haiku.',
147+
});
148+
149+
for await (const chunk of textStream) {
150+
process.stdout.write(chunk);
151+
}
152+
```
153+
154+
### Provider Metadata
155+
156+
```typescript
157+
const { providerMetadata } = await generateText({
158+
model: openrouter('anthropic/claude-sonnet-4'),
159+
prompt: 'Hello!',
160+
});
161+
162+
const openrouterData = providerMetadata?.openrouter;
163+
// { id, model, provider, cost, ... }
164+
```
165+
166+
### Tool Calling
167+
168+
```typescript
169+
const { toolCalls } = await generateText({
170+
model: openrouter('openai/gpt-4o'),
171+
tools: {
172+
weather: tool({
173+
description: 'Get weather',
174+
parameters: z.object({ city: z.string() }),
175+
execute: async ({ city }) => `Sunny in ${city}`,
176+
}),
177+
},
178+
prompt: 'What is the weather in Tokyo?',
179+
});
180+
```
181+
182+
## Checklist
183+
184+
- [ ] Update `package.json` dependencies
185+
- [ ] Find/replace `usage.promptTokens``usage.inputTokens.total`
186+
- [ ] Find/replace `usage.completionTokens``usage.outputTokens.total`
187+
- [ ] Replace `generateObject()` calls with `generateText()` + `Output.object()`
188+
- [ ] Update any `LanguageModelV2` type annotations to `LanguageModelV3`
189+
- [ ] Run tests
190+
191+
## Links
192+
193+
- [AI SDK 6.0 Announcement](https://vercel.com/blog/ai-sdk-6)
194+
- [OpenRouter Models](https://openrouter.ai/models)

0 commit comments

Comments
 (0)