vercel/ai 是 Vercel 与 Next.js 团队主导的开源项目,官方定位为「The AI Toolkit for TypeScript」,目标是帮助开发者用 Next.js、React、Svelte、Vue、Angular 等 UI 框架以及 Node.js 运行时构建 AI 应用与 agent。仓库 topics 覆盖 anthropic、gemini、openai、language-model、llm、generative-ui、nextjs、react、svelte、vue 等关键词,基本勾勒出它的能力边界:多模型接入 + 生成式 UI + 前端框架集成。

统一 Provider 抽象:两种接入路径

AI SDK 的核心设计是 provider-agnostic。官方 README 给出两条接入路径。

第一条是默认走 Vercel AI Gateway,直接传模型字符串即可:

const result = await generateText({
  model: 'anthropic/claude-opus-5.5',
  prompt: 'Hello!',
});

第二条是安装各 Provider 的独立 SDK 包,例如 @ai-sdk/openai、@ai-sdk/anthropic、@ai-sdk/google,再以工厂函数形式传入模型:

import { anthropic } from '@ai-sdk/anthropic';

const result = await generateText({
  model: anthropic('claude-opus-5-5'),
  prompt: 'Hello!',
});

从工程角度看,这种「字符串模型 ID + Provider 工厂」的双轨设计,把模型选择从调用代码中解耦出来。团队可以在开发期用 Gateway 快速切换模型做对比,在生产期换成直连 Provider 以控制延迟、配额与计费路径。需要注意的是,README 只展示了调用形态,并未说明两条路径在鉴权、重试、超时、错误码归一化上的具体差异,这部分需要读源码或 API Reference 才能确认。

结构化输出:用 Zod schema 约束返回值

除了 generateText 返回纯文本,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.',
});

这是 LLM 应用里最容易踩坑的一环:把自然语言输出转成可编程消费的数据结构。用 schema 声明式约束,比手写 JSON 解析和容错重试更可控。但官方资料没有说明 schema 校验失败时的行为——是抛错、重试还是返回部分结果,这直接影响生产环境的错误处理策略,属于选型时必须验证的点。

Agent:ToolLoopAgent 与工具循环

Agent 能力由 ToolLoopAgent 承载。README 中的 sandbox agent 示例展示了完整形态:构造 agent 时传入 model、system prompt 和 tools,工具内部可以执行真实副作用,例如通过 Vercel Sandbox 运行 shell 命令并返回 stdout。

const sandboxAgent = new ToolLoopAgent({
  model: 'openai/gpt-6-astra',
  system: 'You are an agent with access to a shell environment.',
  tools: {
    shell: openai.tools.localShell({
      execute: async ({ action }) => {
        const [cmd, ...args] = action.command;
        const sandbox = await getSandbox();
        const command = await sandbox.runCommand({ cmd, args });
        return { output: await command.stdout() };
      },
    }),
  },
});

这里有几个值得注意的设计信号:工具定义与 Provider 绑定(openai.tools.localShell、openai.tools.imageGeneration),说明部分工具是 Provider 原生能力的封装;execute 是普通 async 函数,意味着工具执行发生在你的服务端代码里,权限、沙箱和超时都由开发者自己负责。官方资料没有给出工具循环的最大轮次、终止条件、并发工具调用等边界说明,这些是评估 agent 可靠性的关键,需要从源码确认。

UI 集成:从 Agent 到前端组件的数据流

AI SDK UI 模块提供框架无关的 hooks,可同时用于 Next.js、React、Svelte 和 Vue,按框架安装对应包(如 @ai-sdk/react)。README 的图片生成示例完整展示了数据流:

  1. Agent 定义:ToolLoopAgent 挂载 generateImage 工具,并用 InferAgentUIMessage 导出消息类型。
  2. 路由层:Next.js App Router 的 POST handler 调用 createAgentUIStreamResponse({ agent, messages }),把 agent 输出转成流式响应。
  3. UI 组件:UIToolInvocation 类型描述工具调用状态,组件按 invocation.state 分支渲染——input-available 显示「Generating image...」,output-available 渲染 base64 图片。
  4. 页面层:useChat 返回 messages、status、sendMessage,遍历 message.parts,按 part.type 区分文本与 tool-generateImage。

这套设计的价值在于把「工具调用」提升为一等公民的 UI 状态。传统做法是前端解析文本流再猜测进度,而这里每个工具调用都有明确的状态机,前端可以针对 input-available、output-available 分别渲染加载态和结果态。status !== 'ready' 时禁用输入框,也是流式场景下防止重复提交的常见做法。

选型判断:适合谁,需要验证什么

从官方资料能确认的适用场景:TypeScript 技术栈、使用 Next.js/React/Svelte/Vue/Angular 之一、需要多 Provider 切换、需要流式 UI 或工具调用型 agent。安装门槛是 Node.js 22+。仓库有 27.2k stars、5.3k forks、8,997 次提交,社区活跃度较高;项目还提供面向 Claude Code、Cursor 等编码 agent 的 skill(npx skills add vercel/ai),以及覆盖不同用例、Provider 和框架的 templates。

需要进一步从源码或 API Reference 验证的机制包括:Provider 抽象层如何归一化不同厂商的请求/响应差异;Gateway 与直连两条路径在错误处理和可观测性上的区别;结构化输出校验失败的重试策略;ToolLoopAgent 的循环终止条件与并发控制;useChat 的流式协议与断线重连行为。这些决定了它能否作为团队 LLM 应用的长期基础,而不只是快速原型工具。

总体而言,AI SDK 的定位清晰:用统一抽象降低多模型接入成本,用类型系统把工具调用和 UI 状态串起来。是否选它,取决于团队对 Provider 锁定、错误处理可控性和 agent 边界的容忍度——这些答案不在 README 里,而在源码里。