mcpField
A
ai-sdk-6

ai-sdk-6

github.com/laguagu开发70212 次安装2 天前更新
代码仓库

关于 ai-sdk-6

面向现有 AI SDK 6 项目的开发维护技能,强调依据已安装版本查阅文档,并遵循版本特定的 API 行为。

主要功能

  1. 01解析已安装的 SDK 和提供方版本
  2. 02查阅匹配版本的文档与类型
  3. 03采用 v6 Agent 和工具模式
  4. 04检查流、审批和错误

适用场景

  1. 01维护固定使用 AI SDK 6 的应用
  2. 02实现工具或结构化输出
  3. 03排查聊天传输与流行为

MCP 相关

在处理 MCP 集成时,指导开发者查阅 AI SDK 6 的 MCP 传输与清理文档。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/laguagu/claude-code-nextjs-skills --skill ai-sdk-6

安装后在 Claude Code 中输入/ai-sdk-6确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
agents.md
core-functions.md
examples.md
mcp.md
middleware.md
tools.md
ui-hooks.md
workflows.md

详细介绍

AI SDK 6 维护

此技能仅适用于 ai@6 项目。根据现有清单/锁定文件解析兼容的提供商和 UI 包。主版本未知时使用 ai-sdk,经授权升级时使用 ai-sdk-7。

阅读已解析版本的 ai/docs/、提供商文档以及源码/类型定义,确认对应次要版本的准确内容。在 monorepo 中,根据使用该依赖的应用解析版本。默认网站文档和仓库主分支可能描述的是 v7。ai 从 6.0.32 开始捆绑 docs/;目录树镜像网站路径(映射见 ai-sdk)。如果无法使用已安装的文档,请在 vercel/ai 中选择 ai@<resolved-version> 标签并阅读 content/docs/。 此处的功能链接使用经过核验的 v6 文档快照作为后备;如果有项目对应的发布版本,请使用该版本。此标签用于选择文档,并非应用依赖版本。

与旧版和新版代码不同的边界

  • 文本函数使用 system;ToolLoopAgent 使用 instructions。
  • 循环限制使用 stopWhen: stepCountIs(...)。文本函数默认执行一步(执行工具后不提供后续回答);ToolLoopAgent 默认执行 20 步。
  • convertToModelMessages 是异步的;请使用 await。
  • 新的 schema 输出请在文本函数中使用 Output;旧版对象函数已弃用。
  • 工具使用 inputSchema;由 SDK 执行的审批使用工具级别的 needsApproval。V6 不识别 v7 的 toolApproval:除非类型检查报错,否则它会被忽略,工具将不经审批直接运行。
  • React useChat 管理消息和流状态,不管理表单输入。请使用适当的传输方式和 UI 消息响应协议。
  • Core 完成回调为 onFinish;结果中的 usage 是最后一步的用量,而 totalUsage 涵盖所有步骤。

使用已确认适用于实际提供商的已配置模型。集成变更后,请进行类型检查,并测试包含相关工具/审批/错误状态的多轮流式交互。

核心结构

已通过 [email protected]、@ai-sdk/[email protected]、[email protected]、React 19 和 TypeScript 5.9 验证:执行 tsc --noEmit,并使用模拟模型完成一次工具步骤和后续回答。字符串模型会通过 AI Gateway 解析。在 v7 中,system、stepCountIs 和 result.toUIMessageStreamResponse() 分别变为 instructions、isStepCount 和 createUIMessageStreamResponse({ stream: toUIMessageStream({ stream: result.stream }) })。

// app/api/chat/route.ts
import { convertToModelMessages, stepCountIs, streamText, tool, validateUIMessages,
  type InferUITools, type UIDataTypes, type UIMessage } from 'ai';
import { z } from 'zod';

const tools = {
  weather: tool({
    inputSchema: z.object({ city: z.string() }),
    execute: async ({ city }) => ({ city, celsius: 21 }),
  }),
};
export type ChatMessage = UIMessage<never, UIDataTypes, InferUITools<typeof tools>>;

export async function POST(req: Request) {
  const { messages } = await req.json();
  const uiMessages = await validateUIMessages<ChatMessage>({ messages, tools });
  const result = streamText({
    model: 'provider/model-id', // configured gateway ID, or a provider instance
    system: 'Answer briefly.',
    messages: await convertToModelMessages(uiMessages),
    tools,
    stopWhen: stepCountIs(5),
  });
  return result.toUIMessageStreamResponse();
}
// app/page.tsx
'use client';
import { useChat } from '@ai-sdk/react';
import { DefaultChatTransport } from 'ai';
import type { ChatMessage } from './api/chat/route';

const transport = new DefaultChatTransport<ChatMessage>({ api: '/api/chat' });

export default function Chat() {
  const { messages, sendMessage, status } = useChat<ChatMessage>({ transport });
  return (
    <form action={(form) => void sendMessage({ text: String(form.get('text')) })}>
      {messages.map((m) => <div key={m.id}>{m.parts.map((part, i) =>
        part.type === 'text' ? <p key={i}>{part.text}</p>
        : part.type === 'tool-weather' && part.state === 'output-available'
          ? <p key={i}>{part.output.city}: {part.output.celsius} °C</p> : null)}</div>)}
      <input name="text" disabled={status === 'submitted' || status === 'streaming'} />
    </form>
  );
}

按功能阅读

  • Agents:循环限制、调用选项和上下文。
  • Core 函数:输出和流式传输约定。
  • 工具:执行、审批和类型化状态。
  • UI hooks:传输、恢复和流的生命周期。
  • 中间件:提供商拦截。
  • MCP:传输和清理。
  • 工作流:需要显式编排循环时的处理方式。
  • 示例:与版本匹配的官方实现。

评论

支持 Markdown