AI SDK Core
Backend AI with Vercel AI SDK v5 and v6.
Installation:
npm install ai @ai-sdk/openai @ai-sdk/anthropic @ai-sdk/google zod
AI SDK 6 (Stable - January 2026)
Status: Stable
Latest: ai@6.0.26 (Jan 2026)
BREAKING: Output API Replaces generateObject/streamObject
⚠️ CRITICAL: generateObject() and streamObject() are DEPRECATED and will be removed in a future version. Use the new Output API instead.
Before (v5 - DEPRECATED):
CODEBLOCK1
After (v6 - USE THIS):
CODEBLOCK2
Output Types
CODEBLOCK3
Streaming with Output API
CODEBLOCK4
v6 New Features
1. Agent Abstraction
Unified interface for building agents with ToolLoopAgent class:
- - Full control over execution flow, tool loops, and state management
- Replaces manual tool calling orchestration
2. Tool Execution Approval (Human-in-the-Loop)
Use selective approval for better UX. Not every tool call needs approval.
CODEBLOCK5
Best Practices:
- - Use dynamic approval for operations where risk depends on parameters (e.g., payment amount)
- Always require approval for destructive operations (delete, modify, purchase)
- Don't require approval for safe read operations
- Add system instruction: "When a tool execution is not approved, do not retry it"
- Implement timeout for approval requests to prevent stuck states
- Store user preferences for repeat actions
Sources:
3. Reranking for RAG
CODEBLOCK6
4. MCP Tools (Model Context Protocol)
⚠️ SECURITY WARNING: MCP tools have significant production risks. See security section below.
CODEBLOCK7
Known Issue: MCP tools may not execute in streaming mode (Vercel Community Discussion). Use generateText() instead of streamText() for MCP tools.
MCP Security Considerations
⚠️ CRITICAL: Dynamic MCP tools in production have security risks:
Risks:
- - Tool definitions become part of your agent's prompt
- Can change unexpectedly without warning
- Compromised MCP server can inject malicious prompts
- New tools can escalate user privileges (e.g., adding delete to read-only server)
Solution - Use Static Tool Generation:
CODEBLOCK8
Best Practice: Generate static tools, review them, commit to version control, and only update intentionally.
Source: Vercel Blog: MCP Security
5. Language Model Middleware
CODEBLOCK9
6. Telemetry (OpenTelemetry)
CODEBLOCK10
Official Docs: https://ai-sdk.dev/docs
Latest AI Models (2025-2026)
OpenAI
GPT-5.2 (Dec 2025):
- - 400k context window, 128k output tokens
- Enhanced reasoning capabilities
- Available in API platform
GPT-5.1 (Nov 2025):
- - Improved speed and efficiency over GPT-5
- "Warmer" and more intelligent responses
GPT-5 (Aug 2025):
- - 45% less hallucination than GPT-4o
- State-of-the-art in math, coding, visual perception
o3 Reasoning Models (Dec 2025):
- - o3, o3-pro, o3-mini - Advanced reasoning
- o4-mini - Fast reasoning
CODEBLOCK11
Anthropic
Claude 4 Family (May-Oct 2025):
- - Opus 4 (May 22): Best for complex reasoning, $15/$75 per million tokens
- Sonnet 4 (May 22): Balanced performance, $3/$15 per million tokens
- Opus 4.1 (Aug 5): Enhanced agentic tasks, real-world coding
- Sonnet 4.5 (Sept 29): Most capable for coding, agents, computer use
- Haiku 4.5 (Oct 15): Small, fast, low-latency model
CODEBLOCK12
Google
Gemini 2.5 Family (Mar-Sept 2025):
- - Pro (March 2025): Most intelligent, #1 on LMArena at launch
- Pro Deep Think (May 2025): Enhanced reasoning mode
- Flash (May 2025): Fast, cost-effective
- Flash-Lite (Sept 2025): Updated efficiency
CODEBLOCK13
Core Functions
Text Generation
generateText() - Text completion with tools
streamText() - Real-time streaming
Structured Output (v6 Output API)
Output.object() - Typed objects with Zod schema (replaces generateObject)
Output.array() - Typed arrays
Output.choice() - Enum selection
Output.json() - Unstructured JSON
See "AI SDK 6" section above for usage examples.
Multi-Modal Capabilities
Speech Synthesis (Text-to-Speech)
CODEBLOCK14
Supported Providers:
- - OpenAI: tts-1, tts-1-hd, gpt-4o-mini-tts
- ElevenLabs: elevenmultilingualv2, eleventurbov2
- LMNT, Hume
Transcription (Speech-to-Text)
CODEBLOCK15
Supported Providers:
- - OpenAI: whisper-1
- ElevenLabs, Deepgram, AssemblyAI, Groq, Rev.ai
Image Generation
CODEBLOCK16
Supported Providers:
- - OpenAI: dall-e-2, dall-e-3
- Google: imagen-3.0
- Fal AI, Black Forest Labs (Flux), Luma AI, Replicate
Embeddings
CODEBLOCK17
Supported Providers:
- - OpenAI: text-embedding-3-small, text-embedding-3-large
- Google: text-embedding-004
- Cohere, Voyage AI, Mistral, Amazon Bedrock
Multi-Modal Prompts (Files, Images, PDFs)
CODEBLOCK18
See official docs for full API: https://ai-sdk.dev/docs/ai-sdk-core
v5 Stream Response Methods
When returning streaming responses from an API, use the correct method:
| Method | Output Format | Use Case |
|---|
| INLINECODE5 | Plain text chunks | Simple text streaming |
| INLINECODE6 |
SSE with JSON events |
Chat UIs (text-start, text-delta, text-end, finish) |
For chat widgets and UIs, always use toUIMessageStreamResponse():
CODEBLOCK19
Note: toDataStreamResponse() does NOT exist in AI SDK v5 (common misconception).
workers-ai-provider Version Compatibility
IMPORTANT: workers-ai-provider@2.x requires AI SDK v5, NOT v4.
CODEBLOCK20
Zod Version: AI SDK v5 requires zod@^3.25.0 or later for zod/v3 and zod/v4 exports. Older versions (3.22.x) cause build errors: "Could not resolve zod/v4".
Cloudflare Workers Startup Fix
Problem: AI SDK v5 + Zod causes >270ms startup time (exceeds Workers 400ms limit).
Solution:
CODEBLOCK21
Additional:
- - Minimize top-level Zod schemas
- Move complex schemas into route handlers
- Monitor startup time with Wrangler
v5 Tool Calling Changes
Breaking Changes:
- -
parameters → inputSchema (Zod schema) - Tool properties:
args → input, result → INLINECODE18 - INLINECODE19 removed (now
tool-error content parts) - INLINECODE21 parameter removed → Use INLINECODE22
New in v5:
- - Dynamic tools (add tools at runtime based on context)
- Agent class (multi-step execution with tools)
Critical v4→v5 Migration
AI SDK v5 introduced extensive breaking changes. If migrating from v4, follow this guide.
Breaking Changes Overview
- 1. Parameter Renames
-
maxTokens →
maxOutputTokens
-
providerMetadata → INLINECODE26
- 2. Tool Definitions
-
parameters →
inputSchema
- Tool properties:
args →
input,
result → INLINECODE32
- 3. Message Types
-
CoreMessage →
ModelMessage
-
Message →
UIMessage
-
convertToCoreMessages → INLINECODE38
- 4. Tool Error Handling
-
ToolExecutionError class removed
- Now
tool-error content parts
- Enables automated retry
- 5. Multi-Step Execution
-
maxSteps →
stopWhen
- Use
stepCountIs() or INLINECODE44
- 6. Message Structure
- Simple
content string →
parts array
- Parts: text, file, reasoning, tool-call, tool-result
- 7. Streaming Architecture
- Single chunk → start/delta/end lifecycle
- Unique IDs for concurrent streams
- 8. Tool Streaming
- Enabled by default
-
toolCallStreaming option removed
- 9. Package Reorganization
-
ai/rsc →
@ai-sdk/rsc
-
ai/react →
@ai-sdk/react
-
LangChainAdapter → INLINECODE53
Migration Examples
Before (v4):
CODEBLOCK22
After (v5):
CODEBLOCK23
Migration Checklist
- - [ ] Update all
maxTokens to INLINECODE55 - [ ] Update
providerMetadata to INLINECODE57 - [ ] Convert tool
parameters to INLINECODE59 - [ ] Update tool execute functions:
args → INLINECODE61 - [ ] Replace
maxSteps with INLINECODE63 - [ ] Update message types:
CoreMessage → INLINECODE65 - [ ] Remove
ToolExecutionError handling - [ ] Update package imports (
ai/rsc → @ai-sdk/rsc) - [ ] Test streaming behavior (architecture changed)
- [ ] Update TypeScript types
Automated Migration
AI SDK provides a migration tool:
CODEBLOCK24
This will update most breaking changes automatically. Review changes carefully.
Official Migration Guide:
https://ai-sdk.dev/docs/migration-guides/migration-guide-5-0
Top 15 Errors & Solutions
1. AI_APICallError
Cause: API request failed (network, auth, rate limit).
Solution:
CODEBLOCK25
Prevention:
- - Validate API keys at startup
- Implement retry logic with exponential backoff
- Monitor rate limits
- Handle network errors gracefully
2. AI_NoObjectGeneratedError
Cause: Model didn't generate valid object matching schema.
Solution:
CODEBLOCK26
Prevention:
- - Start with simple schemas, add complexity incrementally
- Include examples in prompt: "Generate a person like: { name: 'Alice', age: 30 }"
- Use GPT-4 for complex structured output
- Test schemas with sample data first
3. Worker Startup Limit (270ms+)
Cause: AI SDK v5 + Zod initialization overhead in Cloudflare Workers exceeds startup limits.
Solution:
CODEBLOCK27
Prevention:
- - Move AI SDK imports inside route handlers
- Minimize top-level Zod schemas
- Monitor Worker startup time (must be <400ms)
- Use Wrangler's startup time reporting
GitHub Issue: Search for "Workers startup limit" in Vercel AI SDK issues
4. streamText Fails Silently
Cause: Stream errors can be swallowed by createDataStreamResponse.
Status: ✅ RESOLVED - Fixed in ai@4.1.22 (February 2025)
Solution (Recommended):
CODEBLOCK28
Alternative (Manual try-catch):
CODEBLOCK29
Prevention:
- - Use
onError callback for proper error capture (recommended) - Implement server-side error monitoring
- Test stream error handling explicitly
- Always log on server side in production
GitHub Issue: #4726 (RESOLVED)
5. AI_LoadAPIKeyError
Cause: Missing or invalid API key.
Solution:
CODEBLOCK30
Prevention:
- - Validate API keys at application startup
- Use environment variable validation (e.g., zod)
- Provide clear error messages in development
- Document required environment variables
6. AI_InvalidArgumentError
Cause: Invalid parameters passed to function.
Solution:
CODEBLOCK31
Prevention:
- - Use TypeScript for type checking
- Validate inputs before calling AI SDK functions
- Read function signatures carefully
- Check official docs for parameter constraints
7. AI_NoContentGeneratedError
Cause: Model generated no content (safety filters, etc.).
Solution:
CODEBLOCK32
Prevention:
- - Sanitize user inputs
- Avoid prompts that may trigger safety filters
- Have fallback messaging
- Log occurrences for analysis
8. AI_TypeValidationError
Cause: Zod schema validation failed on generated output.
Solution:
CODEBLOCK33
Prevention:
- - Start with lenient schemas, tighten gradually
- Use
.optional() for fields that may not always be present - Add validation hints in field descriptions
- Test with various prompts
9. AI_RetryError
Cause: All retry attempts failed.
Solution:
CODEBLOCK34
Prevention:
- - Investigate root cause of failures
- Adjust retry configuration if needed
- Implement circuit breaker pattern for provider outages
- Have fallback providers
10. Rate Limiting Errors
Cause: Exceeded provider rate limits (RPM/TPM).
Solution:
CODEBLOCK35
Prevention:
- - Monitor rate limit headers
- Queue requests to stay under limits
- Upgrade provider tier if needed
- Implement request throttling
11. TypeScript Performance with Zod
Cause: Complex Zod schemas slow down TypeScript type checking.
Solution:
CODEBLOCK36
Prevention:
- - Avoid top-level complex schemas
- Use
z.lazy() for recursive types - Split large schemas into smaller ones
- Use type assertions where appropriate
Official Docs:
https://ai-sdk.dev/docs/troubleshooting/common-issues/slow-type-checking
12. Invalid JSON Response (Provider-Specific)
Cause: Some models occasionally return invalid JSON.
Solution:
CODEBLOCK37
Prevention:
- - Use
mode: 'json' when available - Prefer GPT-4 for structured output
- Implement retry logic
- Validate responses
GitHub Issue: #4302 (Imagen 3.0 Invalid JSON)
13. Gemini Implicit Caching Fails with Tools
Error: No error, but higher API costs due to disabled caching
Cause: Google Gemini 3 Flash's cost-saving implicit caching doesn't work when any tools are defined, even if never used.
Source: GitHub Issue #11513
Why It Happens: Gemini API disables caching when tools are present in the request, regardless of whether they're invoked.
Prevention:
CODEBLOCK38
Impact: High - Can significantly increase API costs for repeated context
14. Anthropic Tool Error Results Cause JSON Parse Crash
Error: SyntaxError: "[object Object]" is not valid JSON
Cause: Anthropic provider built-in tools (web_fetch, etc.) return error objects that SDK tries to JSON.parse
Source: GitHub Issue #11856
Why It Happens: When Anthropic built-in tools fail (e.g., urlnotallowed), they return error objects. AI SDK incorrectly tries to parse these as JSON strings.
Prevention:
CODEBLOCK39
Impact: High - Production crashes when using Anthropic built-in tools
15. Tool-Result in Assistant Message (Anthropic)
Error: Anthropic API error - tool-result in assistant message not allowed
Cause: Server-executed tools incorrectly place tool-result parts in assistant messages
Source: GitHub Issue #11855
Why It Happens: When using server-executed tools (tools where execute runs on server, not sent to model), the AI SDK incorrectly includes tool-result parts in the assistant message. Anthropic expects tool-result only in user messages.
Prevention:
CODEBLOCK40
Impact: High - Breaks server-executed tool pattern with Anthropic provider
Status: Known issue, PR #11854 submitted
More Errors: https://ai-sdk.dev/docs/reference/ai-sdk-errors (31 total)
Known Issues & Limitations
useChat Stale Closures with Memoized Options
Issue: When using useChat with memoized options (common for performance), the onData and onFinish callbacks have stale closures and don't see updated state variables.
Source: GitHub Issue #11686
Reproduction:
CODEBLOCK41
Workaround 1 - Don't Memoize Callbacks:
CODEBLOCK42
Workaround 2 - Use useRef:
CODEBLOCK43
Full Repro: https://github.com/alechoey/ai-sdk-stale-ondata-repro
Stream Resumption Fails on Tab Switch
Issue: When users switch browser tabs or background the app during an AI stream, the stream does not resume when they return. The connection is lost and does not automatically reconnect.
Source: GitHub Issue #11865
Impact: High - Major UX issue for long-running streams
Workaround 1 - Implement onError Handler:
CODEBLOCK44
Workaround 2 - Detect Visibility Change:
CODEBLOCK45
Status: Known limitation, no auto-reconnection built-in
When to Use This Skill
Use ai-sdk-core when:
- - Building backend AI features (server-side text generation)
- Implementing server-side text generation (Node.js, Workers, Next.js)
- Creating structured AI outputs (JSON, forms, data extraction)
- Building AI agents with tools (multi-step workflows)
- Integrating multiple AI providers (OpenAI, Anthropic, Google, Cloudflare)
- Migrating from AI SDK v4 to v5
- Encountering AI SDK errors (AIAPICallError, AINoObjectGeneratedError, etc.)
- Using AI in Cloudflare Workers (with workers-ai-provider)
- Using AI in Next.js Server Components/Actions
- Need consistent API across different LLM providers
Don't use this skill when:
- - Building React chat UIs (use ai-sdk-ui skill instead)
- Need frontend hooks like useChat (use ai-sdk-ui skill instead)
- Need advanced topics like embeddings or image generation (check official docs)
- Building native Cloudflare Workers AI apps without multi-provider (use cloudflare-workers-ai skill instead)
- Need Generative UI / RSC (see https://ai-sdk.dev/docs/ai-sdk-rsc)
Versions
AI SDK:
- - Stable: ai@6.0.26 (Jan 2026)
- ⚠️ Skip v6.0.40 - Breaking streaming change (reverted in v6.0.41)
- Legacy v5: ai@5.0.117 (ai-v5 tag)
- Zod 3.x/4.x both supported
Latest Models (2026):
- - OpenAI: GPT-5.2, GPT-5.1, GPT-5, o3, o3-mini, o4-mini
- Anthropic: Claude Sonnet 4.5, Opus 4.1, Haiku 4.5
- Google: Gemini 2.5 Pro/Flash/Lite
Check Latest:
npm view ai version
npm view ai dist-tags
Official Docs
Core:
- - AI SDK v6: https://ai-sdk.dev/docs
- AI SDK Core: https://ai-sdk.dev/docs/ai-sdk-core/overview
- Output API: https://ai-sdk.dev/docs/ai-sdk-core/generating-structured-data
- v4→v5 Migration: https://ai-sdk.dev/docs/migration-guides/migration-guide-5-0
- All Errors (31): https://ai-sdk.dev/docs/reference/ai-sdk-errors
- Providers (69+): https://ai-sdk.dev/providers/overview
Multi-Modal:
- - Speech: https://ai-sdk.dev/docs/ai-sdk-core/speech
- Transcription: https://ai-sdk.dev/docs/ai-sdk-core/transcription
- Image Generation: https://ai-sdk.dev/docs/ai-sdk-core/image-generation
- Embeddings: https://ai-sdk.dev/docs/ai-sdk-core/embeddings
GitHub:
- - Repository: https://github.com/vercel/ai
- Issues: https://github.com/vercel/ai/issues
Last Updated: 2026-01-20
Skill Version: 2.1.0
Changes: Added 3 new errors (Gemini caching, Anthropic tool errors, tool-result placement), MCP security guidance, tool approval best practices, React hooks edge cases, stream resumption workarounds
AI SDK: 6.0.26 stable (avoid v6.0.40)
AI SDK Core
使用 Vercel AI SDK v5 和 v6 的后端 AI。
安装:
bash
npm install ai @ai-sdk/openai @ai-sdk/anthropic @ai-sdk/google zod
AI SDK 6(稳定版 - 2026年1月)
状态: 稳定
最新版本: ai@6.0.26(2026年1月)
重大变更:Output API 取代 generateObject/streamObject
⚠️ 关键:generateObject() 和 streamObject() 已弃用,将在未来版本中移除。请改用新的 Output API。
之前(v5 - 已弃用):
typescript
// ❌ 已弃用 - 将被移除
import { generateObject } from ai;
const result = await generateObject({
model: openai(gpt-5),
schema: z.object({ name: z.string(), age: z.number() }),
prompt: 生成一个人物,
});
之后(v6 - 使用此方式):
typescript
// ✅ 新的 OUTPUT API
import { generateText, Output } from ai;
const result = await generateText({
model: openai(gpt-5),
output: Output.object({ schema: z.object({ name: z.string(), age: z.number() }) }),
prompt: 生成一个人物,
});
// 访问类型化对象
console.log(result.object); // { name: Alice, age: 30 }
输出类型
typescript
import { generateText, Output } from ai;
// 使用 Zod schema 的对象
output: Output.object({ schema: myZodSchema })
// 类型化对象数组
output: Output.array({ schema: personSchema })
// 从选项中选择枚举
output: Output.choice({ choices: [positive, negative, neutral] })
// 纯文本(显式)
output: Output.text()
// 非结构化 JSON(无 schema 验证)
output: Output.json()
使用 Output API 进行流式传输
typescript
import { streamText, Output } from ai;
const result = streamText({
model: openai(gpt-5),
output: Output.object({ schema: personSchema }),
prompt: 生成一个人物,
});
// 流式传输部分对象
for await (const partialObject of result.objectStream) {
console.log(partialObject); // { name: Ali... } -> { name: Alice, age: ... }
}
// 获取最终对象
const finalObject = await result.object;
v6 新功能
1. 代理抽象
使用 ToolLoopAgent 类构建代理的统一接口:
- - 完全控制执行流程、工具循环和状态管理
- 取代手动工具调用编排
2. 工具执行审批(人机协同)
使用选择性审批以获得更好的用户体验。并非每个工具调用都需要审批。
typescript
tools: {
payment: tool({
// 基于输入的动态审批
needsApproval: async ({ amount }) => amount > 1000,
inputSchema: z.object({ amount: z.number() }),
execute: async ({ amount }) => { / 处理支付 / },
}),
readFile: tool({
needsApproval: false, // 安全操作无需审批
inputSchema: z.object({ path: z.string() }),
execute: async ({ path }) => fs.readFile(path),
}),
deleteFile: tool({
needsApproval: true, // 破坏性操作始终需要审批
inputSchema: z.object({ path: z.string() }),
execute: async ({ path }) => fs.unlink(path),
}),
}
最佳实践:
- - 对风险取决于参数的操作(如支付金额)使用动态审批
- 始终要求对破坏性操作(删除、修改、购买)进行审批
- 不要要求对安全读取操作进行审批
- 添加系统指令:当工具执行未被批准时,不要重试
- 为审批请求实现超时,防止卡死状态
- 存储用户对重复操作的偏好
来源:
3. RAG 重排序
typescript
import { rerank } from ai;
const result = await rerank({
model: cohere.reranker(rerank-v3.5),
query: 用户问题,
documents: searchResults,
topK: 5,
});
4. MCP 工具(模型上下文协议)
⚠️ 安全警告:MCP 工具存在显著的生产风险。请参阅下面的安全部分。
typescript
import { experimental_createMCPClient } from ai;
const mcpClient = await experimental_createMCPClient({
transport: { type: stdio, command: npx, args: [-y, @modelcontextprotocol/server-filesystem] },
});
const tools = await mcpClient.tools();
const result = await generateText({
model: openai(gpt-5),
tools,
prompt: 列出当前目录中的文件,
});
已知问题:MCP 工具可能无法在流式模式下执行(Vercel 社区讨论)。对于 MCP 工具,请使用 generateText() 而不是 streamText()。
MCP 安全注意事项
⚠️ 关键:生产环境中的动态 MCP 工具存在安全风险:
风险:
- - 工具定义成为代理提示的一部分
- 可能在没有警告的情况下意外更改
- 被攻破的 MCP 服务器可以注入恶意提示
- 新工具可能提升用户权限(例如,向只读服务器添加删除功能)
解决方案 - 使用静态工具生成:
typescript
// ❌ 有风险:动态工具在您无法控制的情况下更改
const mcpClient = await experimental_createMCPClient({ / ... / });
const tools = await mcpClient.tools(); // 随时可能更改!
// ✅ 安全:生成静态、版本化的工具定义
// 步骤 1:安装 mcp-to-ai-sdk
npm install -g mcp-to-ai-sdk
// 步骤 2:生成静态工具(一次性,版本控制)
npx mcp-to-ai-sdk generate stdio npx -y @modelcontextprotocol/server-filesystem
// 步骤 3:导入静态工具
import { tools } from ./generated-mcp-tools;
const result = await generateText({
model: openai(gpt-5),
tools, // 静态、已审查、版本化
prompt: 使用工具,
});
最佳实践:生成静态工具,审查它们,提交到版本控制,并且只在有意时更新。
来源:Vercel 博客:MCP 安全
5. 语言模型中间件
typescript
import { wrapLanguageModel, extractReasoningMiddleware } from ai;
const wrappedModel = wrapLanguageModel({
model: anthropic(claude-sonnet-4-5-20250929),
middleware: extractReasoningMiddleware({ tagName: think }),
});
// 从 ... 标签自动提取推理过程
6. 遥测(OpenTelemetry)
typescript
const result = await generateText({
model: openai(gpt-5),
prompt: 你好,
experimental_telemetry: {
isEnabled: true,
functionId: my-chat-function,
metadata: { userId: 123 },
recordInputs: true,
recordOutputs: true,
},
});
官方文档: https://ai-sdk.dev/docs
最新 AI 模型(2025-2026)
OpenAI
GPT-5.2(2025年12月):
- - 400k 上下文窗口,128k 输出令牌
- 增强的推理能力
- 在 API 平台可用
GPT-5.1(2025年11月):
- - 相比 GPT-5 提高了速度和效率
- 更温暖且更智能的响应
GPT-5(2025年8月):
- - 相比 GPT-4o 幻觉减少 45%
- 在数学、编码、视觉感知方面达到最先进水平
o3 推理模型(2025年12月):