Vercel AI SDK 4.2 重要更新支持MCP

577 阅读12分钟

主要功能: juejin.cn/aicoding AI编程板块了解更多AI编程干货

  • MCP(Model Context Protocol)客户端支持:允许应用程序连接到数百个预构建的工具,如 GitHub、Slack、文件系统操作等。用户还可以构建并连接自定义的 MCP 服务器,扩展应用程序功能。
  • 推理(Reasoning)支持:支持像 Anthropic 的 Claude 3.7 Sonnet 和 DeepSeek R1 这样的推理模型,这些模型能够以明确的分步推理方式解决问题。
  • 来源(Sources)标准化:跨 OpenAI、Google、Vertex 和 Perplexity 提供标准化的 URL 搜索结果,确保在不同提供商之间一致地展示搜索结果。
  • 其他功能:包括 OpenAI Responses API 的支持(用于基于网络搜索的可靠答案和简化的聊天历史记录)。

介绍 MCP 客户端、推理、来源等

image.png

AI SDK 是一个用于使用 JavaScript 和 TypeScript 构建 AI 应用的开源工具包。其统一的提供者 API 允许您使用任何语言模型,并支持与领先的 Web 框架(如 Next.js 和 Svelte)的强大 UI 集成。

每周超过 100 万次下载,开发者们正在使用该 SDK 创建令人惊叹的应用,例如 Otto,一款 AI 驱动的研究工具:

“AI SDK 为 Otto 提供了所有功能,从代理到数据结构再到构建工作流程。有了 AI SDK,我们可以专注于开发产品,让我们能够更快地交付更新。最棒的是,我们无需担心支持新模型的更改——AI SDK 为我们搞定了这一切,让我们能够更快地发布更新。”——Sully Omar

今天,我们宣布发布 AI SDK 4.2,带来了以下新功能和改进:

  • 推理(Reasoning)
  • 模型上下文协议(MCP)客户端
  • useChat 消息部件
  • 语言模型的图像生成
  • URL 来源
  • OpenAI 响应 API
  • Svelte 5
  • 中间件更新

让我们来探索这些新功能和改进。

推理(Reasoning)

推理模型(如 Anthropic Sonnet 3.7 和 DeepSeek R1)在推理时会投入计算资源,逐步解决问题,就像人类展示他们的思维链一样。相比传统模型,这种方法能产生更准确、更可靠的结果,尤其是在涉及逻辑或多步骤分析的任务中。

image.png AI SDK 现在支持各大提供者的推理模型。您可以像使用其他模型一样使用 Anthropic 的 Claude 3.7 Sonnet,并通过 reasoning 属性访问模型的推理令牌:

javascript

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

const { text, reasoning } = await generateText({
  model: anthropic('claude-3-7-sonnet-20250219'),
  prompt: '2040年世界上会有多少人生活?',
});

您可以尝试不同的模型,找到最适合您应用的那一个。只需更改两行代码即可轻松切换提供者:

image.png javascript

import { generateText } from 'ai';
import { bedrock } from '@ai-sdk/amazon-bedrock';

const { text, reasoning } = await generateText({
  model: bedrock('anthropic.claude-3-7-sonnet-20250219-v1:0'),
  prompt: '2040年世界上会有多少人生活?',
});

对于将推理作为文本输出一部分而不是单独令牌的提供者,您可以使用 extractReasoningMiddleware,它会自动从格式化的响应中提取推理内容。这确保了在 OpenAI、Anthropic、Groq、Together AI、Azure OpenAI 等提供者之间的一致体验,无需更改应用代码。

要查看推理的实际应用,请查看 AI SDK 推理模板。要了解更多,请参阅我们的推理文档。

模型上下文协议(MCP)客户端

AI SDK 现在支持模型上下文协议(MCP),这是一个开放标准,可将您的应用连接到不断增长的工具和集成生态系统。通过 MCP 支持,您可以访问数百个预构建的工具(“服务器”),为您的应用添加强大功能。一些流行的 MCP 服务器包括:

  • GitHub - 管理存储库、问题和拉取请求
  • Slack - 发送消息并与工作区互动
  • Filesystem - 具有可配置访问控制的安全文件操作

由于 MCP 是一个开放协议,您的用户还可以构建并连接他们自己的自定义 MCP 服务器,根据需要扩展您的应用功能。MCP 有许多用例,但对于本地代码自动化尤其强大。

SDK 支持通过 stdio(本地工具)或 SSE(远程服务器)连接到 MCP 服务器。一旦连接,您可以直接在 AI SDK 中使用 MCP 工具:

javascript

import { experimental_createMCPClient as createMCPClient } from 'ai';
import { openai } from '@ai-sdk/openai';

const mcpClient = await createMCPClient({
  transport: {
    type: 'sse',
    url: 'https://my-server.com/sse',
  },
});

const response = await generateText({
  model: openai('gpt-4o'),
  tools: await mcpClient.tools(), // 使用 MCP 工具
  prompt: '找到价格低于100美元的产品',
});

要了解更多关于在项目中实现 MCP 的信息,请查看我们的 MCP 工具文档和分步 MCP 指南。

useChat 消息部件

语言模型生成的不仅仅是文本——它们将推理、来源、工具调用和文本响应组合在一个消息中。在多步骤代理用例中,这些不同类型的输出经常混合在单个响应中。

AI SDK 4.2 为 useChat 引入了消息部件,这是一种处理这些不同类型输出的新方式,能够保留它们的精确顺序:

javascript

function Chat() {
  const { messages } = useChat();
  return (
    <div>
      {messages.map(message => (
        message.parts.map((part, i) => {
          switch (part.type) {
            case "text": return <p key={i}>{part.text}</p>;
            case "source": return <p key={i}>{part.source.url}</p>;
            case "reasoning": return <div key={i}>{part.reasoning}</div>;
            case "tool-invocation": return <div key={i}>{part.toolInvocation.toolName}</div>;
            case "file": return <img key={i} src={`data:${part.mimeType};base64,${part.data}`} />;
          }
        })
      ))}
    </div>
  );
}

我们计划在未来的 4.2.x 版本中添加更多部件类型。要了解更多,请查看我们的 4.2 迁移指南。

语言模型的图像生成

Google 的 Gemini 2.0 Flash 是第一个能够直接在响应中生成图像的语言模型。AI SDK 支持此功能,使您能够构建支持文本和图像生成与理解的多模态聊天机器人。

在客户端,您可以通过 useChat 使用 file 消息部件访问语言模型生成的图像:

javascript

import { useChat } from '@ai-sdk/react';

export default function Chat() {
  const { messages } = useChat();

  return (
    <div>
      {messages.map(message => (
        <div key={message.id}>
          {message.role === 'user' ? '用户: ' : 'AI: '}
          {message.parts.map((part, i) => {
            if (part.type === 'text') {
              return <div key={i}>{part.text}</div>;
            } else if (
              part.type === 'file' &&
              part.mimeType.startsWith('image/')
            ) {
              return (
                <img
                  key={i}
                  src={`data:${part.mimeType};base64,${part.data}`}
                  alt="生成的图像"
                />
              );
            }
          })}
        </div>
      ))}
    </div>
  );
}

生成图像后,它们会像文本消息一样成为聊天历史的一部分。您可以通过自然对话引用、迭代或“编辑”之前生成的图像——要求模型修改颜色、调整风格或创建变体,同时保持视觉对话的上下文。

要了解更多,请查看我们的文件生成文档。

URL 来源

许多提供者(如 OpenAI 和 Google)可以在其响应中包含搜索结果,但每个提供者的实现方式各不相同。AI SDK 标准化了 URL 来源(即网站),使您能够构建使用来源归属的 AI 应用。

例如,以下是如何使用 Gemini Flash 使用和发送来源:

api/chat/route.ts

javascript

import { google } from "@ai-sdk/google";
import { streamText } from "ai";

export async function POST(req: Request) {
  const { messages } = await req.json();

  const result = streamText({
    model: google("gemini-1.5-flash", { useSearchGrounding: true }),
    messages,
  });

  return result.toDataStreamResponse({
    sendSources: true,
  });
}

以下是如何在客户端组件中使用 useChat 显示来源:

app/page.tsx

javascript

function Chat() {
  const { messages } = useChat();
  return (
    <div>
      {messages.map((message) => (
        <div key={message.id}>
          {message.role === "user" ? "用户: " : "AI: "}
          {message.parts
            .filter((part) => part.type !== "source")
            .map((part, index) => {
              if (part.type === "text") {
                return <div key={index}>{part.text}</div>;
              }
            })}
          {message.parts
            .filter((part) => part.type === "source")
            .map((part) => (
              <span key={`source-${part.source.id}`}>
                [
                <a href={part.source.url} target="_blank">
                  {part.source.title ?? new URL(part.source.url).hostname}
                </a>
                ]
              </span>
            ))}
        </div>
      ))}
    </div>
  );
}

AI SDK 支持通过 OpenAI Responses、Google、Vertex 和 Perplexity 等兼容模型的 URL 来源。要查看来源的实际应用,请查看来源模板。

OpenAI 响应 API

OpenAI 最近发布了 Responses API,这是一种在 OpenAI 平台上构建应用的全新方式。新 API 提供了持久化聊天历史的功能、用于支持 LLM 响应的网络搜索工具,以及即将推出的文件搜索和计算机使用工具。

AI SDK 从第一天起就支持 Responses API,从现有的 Completions API 迁移到新的 Responses API 非常简单:

javascript

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

const completionsAPIModel = openai('gpt-4o-mini');
const responsesAPIModel = openai.responses('gpt-4o-mini');

新的网络搜索工具使模型能够访问互联网获取相关信息,从而提高对事实性查询的响应质量:

javascript

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

const result = await generateText({
  model: openai.responses('gpt-4o-mini'),
  prompt: '上周旧金山发生了什么?',
  tools: {
    web_search_preview: openai.tools.webSearchPreview(),
  },
});

console.log(result.text);
console.log(result.sources);

Responses API 还简化了对话历史的管理。您无需在每次请求中发送完整对话,而是可以通过 ID 引用之前的交互,从而降低应用的复杂性。

要了解更多关于这些功能的信息,请查看 OpenAI Responses API 指南。

Svelte 5

随着 AI SDK 4.2,@ai-sdk/svelte 包已由 Svelte 团队完全重写,以支持 Svelte 5 并充分利用原生模式。

这种新实现用基于类的 Svelte 原生模式替换了 React 的钩子方法:

image.png

html

<script>
  import { Chat } from '@ai-sdk/svelte';

  // 使用 Chat 类而不是 useChat 钩子
  const chat = new Chat();
</script>

<div>
  {#each chat.messages as message}
    <div class="message {message.role}">{message.content}</div>
  {/each}
</div>

要了解更多,请查看 Svelte 快速入门指南或查看使用这些模式实现的开源 Svelte 聊天机器人模板。

中间件更新

语言模型中间件现已稳定,它通过拦截和修改对语言模型的调用来增强其行为。这种模式支持防护栏、缓存和日志记录等功能,同时保持提供者的灵活性。中间件通过一个简单的包装函数应用,保留标准模型接口。

SDK 现在包括三种生产就绪的中间件选项:

  • extractReasoningMiddleware:从带有特殊标签(如 )的文本中提取推理步骤。
  • simulateStreamingMiddleware:通过非流式语言模型的响应模拟流式行为。
  • defaultSettingsMiddleware:跨模型调用应用一致的配置,与任何模型(包括自定义提供者)无缝协作。只需为参数(如温度)指定默认值,并使用 providerMetadata 设置提供者特定选项。

javascript

import { openai } from "@ai-sdk/openai";
import { anthropic } from "@ai-sdk/anthropic";
import {
  customProvider,
  defaultSettingsMiddleware,
  wrapLanguageModel,
} from "ai";

// 使用 defaultSettingsMiddleware 的自定义提供者:
export const model = customProvider({
  languageModels: {
    fast: openai("gpt-4o-mini"),
    writing: anthropic("claude-3-5-sonnet-latest"),
    reasoning: wrapLanguageModel({
      model: anthropic("claude-3-7-sonnet-20250219"),
      middleware: defaultSettingsMiddleware({
        settings: {
          providerMetadata: {
            anthropic: {
              thinking: { type: "enabled", budgetTokens: 12000 },
            },
          },
        },
      }),
    }),
  },
});

这些中间件选项可以组合使用,创建跨任何支持的语言模型的强大、可组合功能。查看我们的中间件文档了解更多。

其他功能

我们最近将几个实验性功能稳定,这意味着它们现已生产就绪并经过充分测试。这些功能包括:

  • 自定义提供者:将 ID 映射到任何模型,允许您设置自定义模型配置、别名等。
  • 中间件改进:同时应用多个中间件,以增强请求处理和转换。中间件已移至稳定版。
  • 工具调用流:作为数据流的一部分流式传输部分工具调用。已移至稳定版。
  • 响应体访问:在使用 generateText 或 generateObject 时通过 response.body 属性直接访问原始响应体。
  • 数据流增强:为 streamText 发送开始/结束事件,并使用 write/writeSource 方法更精细地控制流数据。
  • 错误处理:利用 streamText/streamObject 的 onError 回调优雅地管理错误。
  • 对象生成:利用 generateObject 的 repairText 功能修复和改进生成的内容。
  • 提供者选项:配置特定于提供者的请求选项(例如 OpenAI 的 reasoningEffort)。具体取决于提供者。已移至稳定版。
  • 提供者元数据:访问特定于提供者的响应元数据。具体取决于提供者。已移至稳定版。

提供者更新

AI SDK 的提供者生态系统不断扩展,新增和改进的提供者包括:

  • Amazon Bedrock:与 AI SDK 标准功能更紧密集成,支持中止、获取和错误处理。新增缓存点支持、Amazon Nova Canvas 的图像生成、预算令牌支持和推理支持。
  • Anthropic:新增推理支持、推理内容的模型设置调整、工具更新(bash、文本编辑器、计算机)和图像 URL 支持。
  • Azure:新增图像生成支持。
  • Cohere:改进了工具处理,修复了参数和工具计划内容。
  • DeepInfra:新增图像生成支持。
  • Google:增强了架构支持、对未定义部分的容错、种子支持、动态检索、空内容处理、推理支持和模型 ID 更新。
  • Google Vertex AI:新增 Gemini 模型、消息中公共文件 URL 支持以及 Anthropic Claude 模型的提示缓存。
  • Mistral:改进了内容处理,修复了未定义内容、复杂内容类型、PDF 支持和多个文本内容部分。
  • OpenAI:新增对 gpt-4.5、o3-mini、Responses API 和 PDF 输入的支持。
  • OpenAI 兼容:新增对 generateText/streamText 中 providerOptions 的支持。
  • Perplexity:新增来源支持。
  • Replicate:新增对版本化模型的支持。
  • Together AI:新增图像生成支持并扩展了提供者 V1 规范。
  • xAI:新增图像生成支持。

入门

凭借 MCP 支持、语言模型图像生成和推理等强大新功能,现在是使用 AI SDK 构建 AI 应用的最佳时机。

  • 启动一个新的 AI 项目:准备好构建新东西了吗?查看我们最新的指南。
  • 探索我们的模板:访问我们的模板库,查看 AI SDK 的实际应用。
  • 加入社区:在我们的 GitHub 讨论中分享您的构建成果。

展示

自 4.1 版本发布以来,我们看到了一些由 AI SDK 驱动的惊艳产品,值得特别展示:

  • Otto:一个代理电子表格,自动化重复的知识工作。
  • Payload:一个开源 Next.js 全栈框架,将您的配置转化为完整的后端,包括管理 UI、API 和数据库管理,集成在一个无缝的包中。

“切换到 AI SDK 让我们立即删除了大量自定义代码,并轻松支持所有当前和未来的 AI 提供者。API 非常简洁,设计深思熟虑,并提供一流的 TypeScript 支持——我们非常满意!”——Alessio Gravili, Payload

贡献者

AI SDK 4.2 是 Vercel 核心团队(Lars、Jeremy、Walter 和 Nico)与众多社区贡献者共同努力的结果。感谢以下贡献者提交了合并的拉取请求:

Xiang-CH、d3lm、dreamorosi、MrunmayS、valstu、BrianHung、jstjoe、rmarescu、lasley、shaneporter、FinnWoelm、threepointone、minpeter、UrielCh、Younis-Ahmed、edukure、O1af、abhishekpatil4、sandonl、NVolcz、nihaocami、yudistiraashadi、mattlgroff、gianpaj、habeebmoosa、KABBOUCHI、franklin007ban2、yoshinorisano、jcppman、gravelBridge、peetzweg、patelvivekdev、ggallon、zeke、epoyraz、IObert、KitBurgess、marwhyte、niranjan94、asishupadhyay、SalmanK81099。

特别表彰:

  • elliott-with-the-longest-name-on-github:Svelte 5 支持
  • iteratetograceness:MCP 支持
  • Und3rf10w:Amazon Bedrock 推理支持

您的反馈和贡献继续塑造着 AI SDK。我们迫不及待想看到您将用这些新功能构建什么。