在 TypeScript 生态里做 AI 应用,最琐碎的问题往往不是模型能力,而是接入层:OpenAI、Anthropic、Google 的 SDK 各不相同,换一个模型就要改一遍调用代码。vercel/ai(AI SDK)正是针对这个痛点设计的开源工具库,官方描述为“The AI Toolkit for TypeScript”,由 Vercel 与 Next.js 团队成员创建,GitHub 上已获得约 27.1k star、5.2k fork,仓库 topics 覆盖 anthropic、gemini、openai、language-model、generative-ui、react、svelte、vue 等关键词。
统一 Provider 架构
AI SDK 的核心定位是 provider-agnostic。官方 README 给出的统一 API 允许开发者用同一套调用方式访问 OpenAI、Anthropic、Google 等模型提供商。默认情况下,AI SDK 使用 Vercel AI Gateway,只需传入模型字符串即可:
const result = await generateText({
model: 'anthropic/claude-opus-5.5',
prompt: 'Hello!',
});
如果希望直连提供商,则安装对应 SDK 包并传入 provider 实例:
import { anthropic } from '@ai-sdk/anthropic';
const result = await generateText({
model: anthropic('claude-opus-5-5'),
prompt: 'Hello!',
});
这种设计把“模型标识”和“调用逻辑”解耦:业务代码只依赖 generateText 这类统一入口,切换模型时改动集中在 model 参数。对多模型对比、灰度切换或按成本路由的场景,这是最直接的收益。需要注意的是,README 只展示了字符串与 provider 实例两种写法,Provider 抽象在源码层面的具体接口、错误归一化与能力差异处理,仍需结合源码或 API Reference 进一步确认。
结构化输出与 Agent 模块
除了纯文本生成,AI SDK 提供结构化数据生成能力。官方示例通过 Output.object 配合 zod schema,让模型直接产出符合类型定义的对象:
const { output } = await generateText({
model: 'openai/gpt-6-astra',
output: Output.object({
schema: z.object({
recipe: z.object({
name: z.string(),
ingredients: z.array(z.object({ name: z.string(), amount: z.string() })),
steps: z.array(z.string()),
}),
}),
}),
prompt: 'Generate a lasagna recipe.',
});
Agent 方面,README 展示了 ToolLoopAgent 类。它接收 model、system 与 tools,工具可以是 provider 提供的预置工具,例如 openai.tools.localShell 或 openai.tools.imageGeneration,也可以是自定义实现。示例中的 sandboxAgent 把 shell 工具接到 Vercel Sandbox 上执行命令,体现了“模型决策 + 工具执行”的循环结构。ToolLoopAgent 的具体循环终止条件、并发与错误重试策略,README 未展开,属于需要看源码确认的部分。
生成式 UI 与框架集成
AI SDK UI 模块提供一组 hooks,用于构建聊天机器人和生成式用户界面。官方强调这些 hooks 是 framework agnostic 的,可用于 Next.js、React、Svelte 和 Vue,按框架安装对应包,例如 @ai-sdk/react。
一个完整的生成式 UI 链路在 README 中被拆成四层:
- Agent 定义:用 ToolLoopAgent 声明模型与工具,并通过 InferAgentUIMessage 导出消息类型。
- 路由层:在 Next.js App Router 中,用 createAgentUIStreamResponse 把 agent 与 messages 转成流式响应。
- 工具视图:用 UIToolInvocation 类型接收工具调用,根据 invocation.state 在 input-available、output-available 等状态间切换渲染。
- 页面层:用 useChat 获取 messages、status、sendMessage,遍历 message.parts,按 part.type 分发文本或工具组件。
这套结构的价值在于把“工具调用状态”直接映射为 UI 状态。示例中 imageGeneration 工具设置 partialImages: 3,前端在 output-available 时把 base64 结果渲染成 img。开发者可以据此推断:生成式 UI 的关键不是模型本身,而是工具调用生命周期与前端组件状态的对应关系。
选型参考与待确认边界
从官方资料可以确认的事实包括:AI SDK 是免费开源库,主要语言为 TypeScript,要求 Node.js 22+,通过 npm install ai 安装;提供统一 Provider API、结构化输出、ToolLoopAgent 与跨框架 UI hooks;官方还提供 templates 与面向编码 agent 的 skill(npx skills add vercel/ai)。
但以下问题在 README 层面没有答案,需要结合源码或 API Reference 验证:Provider 抽象的具体接口与能力差异如何归一化;ToolLoopAgent 的循环控制、超时与失败模式;生成式 UI 在流式传输下的部分结果与错误恢复策略;不同框架 hooks 的行为一致性。对准备选型的团队来说,建议先用官方模板跑通一条端到端链路,再针对上述边界做源码级确认,而不是仅凭 README 示例就假设多模型行为完全等价。