Skip to content

参考

基于 Vercel AI SDK v7(ai-sdk.dev/docs,2026 年)编写。完整 API 见 ai-sdk.dev/docs

包列表

用途
ai核心(Core + 工具函数 + 类型)
@ai-sdk/reactReact UI hooks(useChat 等)
@ai-sdk/svelteSvelte UI hooks
@ai-sdk/vueVue UI hooks
@ai-sdk/solidSolid UI hooks
@ai-sdk/openai / anthropic / google / mistral / xaiProvider
@ai-sdk/provider-utils自建 provider 用
@ai-sdk/openai-compatible自建 OpenAI 兼容 provider

Core 函数

generateText

typescript
function generateText(options: {
  model: LanguageModel;
  system?: string;
  prompt?: string;
  messages?: ModelMessage[];
  temperature?: number;
  maxOutputTokens?: number;
  stopSequences?: string[];
  topP?: number;
  topK?: number;
  frequencyPenalty?: number;
  presencePenalty?: number;
  seed?: number;
  tools?: ToolSet;
  toolChoice?: ToolChoice;
  output?: Output<unknown>;
  maxSteps?: number;
  stopWhen?: StopCondition;
  providerOptions?: Record<string, unknown>;
  headers?: Record<string, string>;
  abortSignal?: AbortSignal;
  experimental_telemetry?: TelemetrySettings;
}): Promise<GenerateTextResult>

返回对象关键字段:

字段含义
text最终文本(拼接所有 step)
output结构化输出(如 Output.object 时为对象)
toolCalls所有 tool 调用
toolResults所有 tool 结果
usage{ promptTokens, completionTokens, totalTokens }
finishReasonstop / length / tool-calls / error
steps多步执行每步细节
warnings模型/SDK 警告

streamText

generateText 参数,但返回 stream 对象:

字段含义
textStreamAsyncIterable<string> + ReadableStream
fullStreamAsyncIterable<StreamPart>,含 text-delta / tool-call / reasoning-delta / finish-step / error
textPromise<string>,等流结束拿全文
usagePromise<TokenUsage>
toUIMessageStreamResponse()Next.js Route 直接返回(给 useChat)
toTextStreamResponse()纯文本 SSE
pipeUIMessageStreamToResponse()写入 Node Response
toUIMessageStream()拿原始 UIMessageStream

embed / embedMany

typescript
embed({ model: EmbeddingModel, value: string }): Promise<{ embedding: number[] }>
embedMany({ model, values: string[] }): Promise<{ embeddings: number[][] }>

generateImage

typescript
generateImage({
  model: ImageModel;
  prompt: string;
  n?: number;
  size?: `${number}x${number}`;
  aspectRatio?: string;
  providerOptions?: Record<string, unknown>;
}): Promise<{ image: GeneratedImage }>

GeneratedImagebase64 / uint8Array

Output API(v7)

typescript
import { Output } from 'ai';

Output.object({ schema: z.object({...}), mode?: 'auto'|'json'|'tool' })
Output.array({ schema, mode? })
Output.text()
Output.choice({ choices: string[] })
Output.json()

Tool 定义

typescript
import { tool } from 'ai';
import { z } from 'zod';

const myTool = tool({
  description: '说明文字(给模型看)',
  parameters: z.object({
    city: z.string().describe('城市名'),
  }),
  execute: async (args, { toolCallId, messages, abortSignal }) => {
    return await fetchWeather(args.city);
  },
  // 可选:onInputAvailable(流式时输入参数完整后立即触发)
  // 可选:onOutputAvailable
});

参数 schema 支持 Zod / Valibot / ArkType / 标准 JSON Schema。

UI Hooks(React)

useChat

typescript
const {
  messages,         // UIMessage[](每条有 parts 数组)
  sendMessage,      // (message: string | Message) => Promise
  status,           // 'submitted' | 'streaming' | 'ready' | 'error'
  stop,             // 停止
  regenerate,       // 重发最后一条
  setMessages,      // 手动改 messages
  error,            // Error | null
  addToolResult,    // 给 tool 提供结果(interactive tool)
} = useChat({
  api: '/api/chat',
  id: 'chat-1',
  onFinish: ({ message }) => {...},
  onError: (error) => {...},
  maxSteps: 5,
  sendExtraMessageFields: false,
});

useCompletion

typescript
const { completion, input, setInput, handleSubmit, isLoading, stop } = useCompletion({
  api: '/api/completion',
});

适合「单次补全」场景(如自动完成 / 生成标题),不需要对话历史。

useObject

typescript
import { useObject } from '@ai-sdk/react';
import { Output } from 'ai';
import { z } from 'zod';

const { object, submit, stop, error, isLoading } = useObject({
  api: '/api/object',
  output: Output.object({ schema: z.object({...}) }),
});

服务端用 streamText + Output.object,前端拿到的 object 是流式部分对象(边生成边更新)。

Message 类型(v7)

typescript
type UIMessage = {
  id: string;
  role: 'user' | 'assistant' | 'system' | 'tool';
  parts: UIMessagePart[];
};

type UIMessagePart =
  | { type: 'text'; text: string }
  | { type: 'tool-<name>'; toolCallId, input, state, output }
  | { type: 'reasoning'; text }
  | { type: 'file'; mediaType, url }
  | { type: 'data', data };

服务端用 ModelMessage(更接近 provider 原始 schema),通过 convertToModelMessages(uiMessages) 转换。

Provider 列表(官方维护)

厂商示例
@ai-sdk/openaiOpenAIopenai('gpt-5'), openai.embedding('text-embedding-3-large')
@ai-sdk/azureAzure OpenAIazure('gpt-5')
@ai-sdk/anthropicAnthropicanthropic('claude-sonnet-4.6')
@ai-sdk/googleGemini (AI Studio)google('gemini-2.5-pro')
@ai-sdk/google-vertexGemini (Vertex)vertex('gemini-2.5-pro')
@ai-sdk/amazon-bedrockAWS Bedrockbedrock('anthropic.claude-sonnet-4.6')
@ai-sdk/mistralMistralmistral('mistral-large-latest')
@ai-sdk/cohereCoherecohere('command-r-plus')
@ai-sdk/xaixAI Grokxai('grok-4')
@ai-sdk/perplexityPerplexity Sonarperplexity('sonar-pro')
@ai-sdk/deepseekDeepSeekdeepseek('deepseek-chat')
@ai-sdk/togetheraiTogether.aitogetherai('meta-llama/Llama-3.3-70B-Instruct-Turbo')
@ai-sdk/fireworksFireworksfireworks('...')
@ai-sdk/groqGroqgroq('llama-3.3-70b-versatile')
@ai-sdk/cerebrasCerebrascerebras('llama3.1-70b')
@ai-sdk/deepinfraDeepInfradeepinfra('...')
@ai-sdk/elevenlabsElevenLabs TTSelevenlabs('eleven_multilingual_v2')
@ai-sdk/lmntLMNT TTSlmnt('...')
@ai-sdk/deepgramDeepgram STTdeepgram.transcribe(...)
@ai-sdk/assemblyaiAssemblyAI STTassemblyai(...)
@ai-sdk/humeHume(情感)hume('...')
@ai-sdk/revaiRev.ai STTrevai(...)
@ai-sdk/gladiaGladia STTgladia(...)
@ai-sdk/basetenBasetenbaseten(...)

完整 + 实时:ai-sdk.dev/docs/ai-sdk-core/providers-and-models

自定义 Provider

OpenAI 兼容

typescript
import { createOpenAI } from '@ai-sdk/openai';

const myProvider = createOpenAI({
  baseURL: 'https://my-api.com/v1',
  apiKey: process.env.MY_API_KEY,
  name: 'my-provider',
});

const model = myProvider('my-model-id');

完全自定义

实现 LanguageModelV2 接口(doGenerate / doStream)。详见 Custom Provider

Stream Part 协议

toUIMessageStreamResponse() 输出的 SSE 数据格式:

0:"Hello"          // text-delta
2:{"toolCallId":"...","toolName":"...","input":{...}}   // tool-call
a:{"toolCallId":"...","output":{...}}                    // tool-result
g:{"text":"..."}                                          // reasoning-delta
d:{"finishReason":"stop","usage":{...}}                  // finish-step
e:{"text":"..."}                                          // error

前缀字符是类型标识,详见 UI Message Stream

Middleware

typescript
import { wrapLanguageModel, extractReasoningMiddleware } from 'ai';

const model = wrapLanguageModel({
  model: anthropic('claude-sonnet-4.6'),
  middleware: extractReasoningMiddleware({}),
});

常用 middleware:

  • extractReasoningMiddleware:分离 thinking 内容(DeepSeek R1 等)
  • simulateStreamingMiddleware:把非流式模型包装成流式
  • 自定义:实现 transformParams / wrapStream / transformOutput

错误处理

typescript
import { generateText } from 'ai';

try {
  const { text } = await generateText({...});
} catch (error) {
  if (APICallError.isInstance(error)) {
    console.log(error.url, error.responseBody, error.isRetryable);
  }
}

错误类型:

类型含义
APICallErrorProvider HTTP 错误(含 statusCode / responseBody)
EmptyResponseBodyErrorProvider 返回空
AbortErrorabortSignal 触发
NoSuchToolError模型调了未定义的 tool
ToolExecutionErrortool execute 抛错
InvalidToolArgumentsErrortool args 不符合 schema

资源链接