Composio × Vercel AI SDK 实战:用 HackerNews 智能体打通工具调用与流式输出

📅 发布时间:2026/9/12 4:12:46
Composio × Vercel AI SDK 实战:用 HackerNews 智能体打通工具调用与流式输出
Composio × Vercel AI SDK 实战用 HackerNews 智能体打通工具调用与流式输出【免费下载链接】composioComposio powers 1000 toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio本指南基于 Composio 仓库中的 ts/examples/vercel 示例完整演示如何将 Composio SDK 与 Vercel AI SDKai集成构建一个能够实时读取 HackerNews 数据并由大模型驱动的 AI 应用。读完本文你将掌握示例的四种运行形态单轮问答、流式输出、ToolLoopAgent 自动工具循环、MCP 工具路由会话理解VercelProvider把 Composio 工具转换为 AI SDK 工具的底层原理JSON Schema → Zod、strict 模式、参数规范化并能在本地一键复现整个示例。示例概览它能做什么ts/examples/vercel是一个开箱即用的 TypeScript 示例围绕HackerNews 数据 OpenAI 模型演示了 Composio 与 Vercel AI SDK 的核心协作方式集成 Composio SDK 与 Vercel AI SDK通过composio/vercel提供的VercelProvider桥接两者使用 HackerNews 工具获取用户资料、首页热门故事等数据由 GPT 系列模型示例源码实际使用gpt-4o-mini生成摘要与回答支持流式streamingAI 响应逐 token 输出全程 TypeScript 类型安全并提供 AI SDK v6 的ToolLoopAgent自动工具循环示例。示例目录结构如下ts/examples/vercel/ ├── README.md # 示例说明本文主体文档 ├── package.json # 依赖与脚本start / start:stream / typecheck ├── tsconfig.json ├── CHANGELOG.md └── src/ ├── ai.ts # 单轮问答generateText 工具执行钩子 ├── stream.ts # 流式输出streamText textStream ├── tool-loop-agent.ts # AI SDK v6 ToolLoopAgent 自动工具循环 ├── tool-router-ai.ts # 基于 MCP 会话的工具路由智能体 └── types.ts # 消息角色常量user / assistant / tool环境准备与快速开始根据 示例 README 的说明运行前需要准备前置条件说明Node.js建议使用最新 LTS 版本pnpmv10.8.0 或更高版本Composio API Key用于鉴权并拉取/执行工具OpenAI API Key驱动 GPT 模型生成回答第一步进入示例目录并安装依赖基于当前仓库示例位于ts/examples/vercel仓库根目录为GitHub_Trending/co/composiocd ts/examples/vercel pnpm install示例的依赖通过 pnpm workspace 的catalog:与workspace:*协议管理composio/core与composio/vercel直接引用仓库内的 ts/packages/core 与 ts/packages/providers/vercel 工作区包ai、ai-sdk/openai、ai-sdk/mcp、zod等则取自统一的版本目录见 package.json。第二步配置环境变量cp .env.example .env然后编辑.env填入你的密钥COMPOSIO_API_KEYyour_composio_api_key OPENAI_API_KEYyour_openai_api_key示例依赖列表包含dotenv用于加载.env中的变量package.json 的 dependencies 中声明了dotenv: catalog:。在 stream.ts 中可以看到COMPOSIO_API_KEY通过process.env.COMPOSIO_API_KEY读取。第三步启动示例pnpm start运行 src/ai.ts 后控制台会先打印工具执行钩子日志 Executing .../✅ Executed ...随后输出模型针对HackerNews 用户 pg 是谁生成的回答。四种运行形态逐个拆解src/下的四个入口脚本覆盖了从最简单轮调用到MCP 工具路由的完整演进路径它们共用同一套工具获取 API1. 单轮问答ai.tssrc/ai.ts 是最小的完整示例关键步骤初始化 Composio 并注入 Vercel providerimport { Composio } from composio/core; import { VercelProvider } from composio/vercel; const composio new Composio({ provider: new VercelProvider(), });VercelProvider的作用是把 Composio 工具包装成 AI SDK 认识的tool对象让generateText直接调度执行。获取工具并注册执行钩子const tools await composio.tools.get(test-user-id, HACKERNEWS_GET_USER, { beforeExecute: ({ params, toolSlug }) { console.log( Executing ${toolSlug} with params:, { params }); return params; }, afterExecute: ({ result, toolSlug }) { console.log(✅ Executed ${toolSlug} with result:, { result }); return result; }, });这里composio.tools.get(userId, toolSlug, hooks)是示例中常用的工具获取方式第一个参数是用户标识示例用占位符test-user-id第二个参数是工具 slug如HACKERNEWS_GET_USER、HACKERNEWS_GET_TOP_STORIES第三个参数可以注册beforeExecute/afterExecute钩子做日志或参数/结果改写。交给 AI SDK 执行const { text } await generateText({ model: openai(gpt-4o-mini), tools, messages: [{ role: user, content: Who is the user pg on hackernews? }], stopWhen: stepCountIs(5), }); console.log(text);stopWhen: stepCountIs(5)是 AI SDK 的步骤上限控制——最多执行 5 步含模型推理与工具调用防止智能体陷入无限循环。types.ts 中定义的MessageRoles常量user/assistant/tool则用于约束消息类型。2. 流式输出stream.tssrc/stream.ts 演示了 HackerNews 首页摘要的流式生成const composio new Composio({ apiKey: process.env.COMPOSIO_API_KEY, provider: new VercelProvider(), }); const tools await composio.tools.get(test-user-id, HACKERNEWS_GET_TOP_STORIES); const stream await streamText({ model: openai(gpt-4o-mini), tools, prompt: Summarize the front page of HackerNews, stopWhen: stepCountIs(5), }); for await (const textPart of stream.textStream) { process.stdout.write(textPart); }与generateText不同streamText返回流对象通过textStream异步迭代逐段输出。这个模式非常适合移植到 Vercel 的 API Route / Edge Function 中把textStream接到StreamingTextResponse即可实现浏览器端的打字机效果。3. 自动工具循环tool-loop-agent.tssrc/tool-loop-agent.ts 展示了 AI SDK v6 引入的ToolLoopAgent类它把模型推理 → 工具调用 → 结果回填 → 再次推理的完整循环封装为生产级实现开发者无需手写 agentic loopimport { ToolLoopAgent } from ai; const tools await composio.tools.get(test-user-id, HACKERNEWS_GET_USER, { beforeExecute: ({ params, toolSlug }) { console.log( Executing ${toolSlug}...); return params; }, afterExecute: ({ result, toolSlug }) { console.log(✅ ${toolSlug} completed); return result; }, }); const hackerNewsAgent new ToolLoopAgent({ model: openai(gpt-4o-mini), instructions: You are a helpful assistant that can look up information about Hacker News users. When asked about a user, use the available tools to fetch their profile information., tools, }); const result await hackerNewsAgent.generate({ prompt: Who is the user pg on Hacker News? Tell me about their profile., }); console.log(result.text);instructions提供了系统级行为约束何时调用工具、如何总结generate一条调用即完成整轮多步交互适用于对可观测性要求不高的快速原型。4. MCP 工具路由会话tool-router-ai.tssrc/tool-router-ai.ts 是能力最完整的形态通过 Composio 创建基于 MCP 的 toolrouter 会话把 Gmail 等工具以 MCP 服务器形式暴露给 AI SDKconst session await composio.create(default, { toolkits: [gmail], manageConnections: true, mcp: true, tools: { gmail: { enable: [GMAIL_FETCH_EMAILS], }, }, }); const { mcp, sessionId } session; const mcpClient await createMCPClient({ transport: { type: http, url: mcp.url, headers: mcp.headers, }, }); const tools await mcpClient.tools(); const stream streamText({ model: openai(gpt-5.2), prompt: Fetch my latest received email from Gmail and summarize it., stopWhen: stepCountIs(10), onStepFinish: step { if (step.toolCalls.length 0) { for (let i 0; i step.toolCalls.length; i) { const toolCall step.toolCalls[i]; console.log( Executed ${toolCall.toolName}); const toolResult step.toolResults?.[i]; if (toolResult ! undefined) { console.log(✅ Result for ${toolCall.toolName}:, toolResult); } } } }, tools, }); for await (const textPart of stream.textStream) { process.stdout.write(textPart); } await mcpClient.close();这段代码的核心链路是composio.create(...)创建带 MCP 出口的会话mcp: true返回mcp.url与mcp.headers→ai-sdk/mcp的createMCPClient通过 HTTP transport 连接 →mcpClient.tools()拉取工具清单 → 交给streamText执行。onStepFinish回调可以在每个步骤结束时观察工具调用与结果。文件末尾还有一段被注释的Output.object({ schema: z.object({...}) })配置提示可以将模型输出约束为结构化对象subject / bodySummary / date / sender需要时取消注释并搭配zod使用。源码级解析VercelProvider 如何把工具包装给 AI SDK示例的桥梁是 composio/vercel 包核心实现在 ts/packages/providers/vercel/src/index.ts。VercelProvider继承自composio/core的BaseAgenticProvider负责把 Composio 工具定义转换为 AI SDK 的tool格式。转换流水线wrapTool方法如下去重required数组调用deduplicateJsonSchemaRequiredArrays规范化 JSON Schema 的 required 字段可选 strict 改写若开启 strict 模式调用toStrictJsonSchema把 schema 改写为 OpenAI 结构化输出要求的形态所有属性必填、对象封闭、删除注解关键字无法表达的结构如任意键对象、allOf、prefixItems、未解析的$ref会保留原始 schema 并打印 warningJSON Schema → ZoddereferenceJsonSchema内联$ref定义后用jsonSchemaToZodSchema转成 AI SDK 依赖的 Zod schemaZod 转换器不跟随$ref所以必须先解引用封装 execute包装后的每个工具自带execute函数内部先调用normalizeToolArguments处理模型偶尔把参数序列化成 JSON 字符串的情况源码注释提到 issue #2406strict 模式下还会用omitNullToolArguments剔除表示省略的null最后交给composio.tools.execute真正执行。// 摘自 ts/packages/providers/vercel/src/index.ts示意 return tool({ description: composioTool.description, inputSchema: inputParametersSchema, execute: async params { const normalized normalizeToolArguments(params, composioTool.slug); return await executeTool( composioTool.slug, strictSource ? omitNullToolArguments(normalized, strictSource) : normalized ); }, });正因为每个工具都内嵌了executeAI SDK 才会自动运行工具调用无需开发者手写 agentic loop——这正是 composio/vercel README 所强调的设计。strict 模式部分模型会拒绝包含可选参数的 tool schema。VercelProvider的构造器接受{ strict?: boolean }默认false见 index.ts开启后每个对象的所有属性都会被放入required并封闭对象可选属性保留但接受null执行前null会被剔除除非工具自身 schema 接受该参数的nullconst composio new Composio({ provider: new VercelProvider({ strict: true }), });无法表达 strict 形态的工具会保留原 schema 并通过logger.warn输出原因如path: keyword (detail)格式便于排查。MCP 响应包装wrapMcpServerResponse把 Composio 的 MCP URL 响应转换为 Vercel 标准形态每个条目映射为{ url: new URL(item.url), name: item.name }供 MCP 客户端直接消费。脚本与依赖速查package.json 中预置了如下脚本命令作用pnpm start运行bun src/ai.ts执行单轮问答示例pnpm start:stream运行bun src/stream.ts执行流式摘要示例pnpm typecheck运行tsc --noEmit -p ./tsconfig.json做类型检查核心依赖及其分工composio/coreComposio SDK 核心初始化客户端、获取/执行工具composio/vercelVercel AI SDK 集成 provider工具包装、strict 模式、MCP 响应适配ai-sdk/openaiOpenAI 模型接入openai(gpt-4o-mini)等ai-sdk/mcpmodelcontextprotocol/sdkMCP 客户端用于 toolrouter 会话aiVercel AI SDK 本体generateText/streamText/ToolLoopAgent/stepCountIsdotenv加载.env环境变量zod/zod-to-json-schemaschema 定义与转换结构化输出场景。常见问题与扩展建议多轮对话会话复用按 composio/vercel README 的建议多轮对话应保存session.sessionId并用composio.use(sessionId)复用会话而不是每轮新建以维持工具执行上下文与连接状态。更换模型示例默认 OpenAI将ai-sdk/openai换成任意 AI SDK 模型包如ai-sdk/anthropic即可适配其他厂商模型工具包装与执行逻辑不变。从 demo 到 Next.js API Routestream.ts与tool-router-ai.ts的textStream输出模式可直接对接StreamingTextResponseai.ts的generateText模式则适合一次性摘要任务。结构化输出参考tool-router-ai.ts中被注释的Output.object({ schema: ... })配合zod可将模型回答约束为固定字段便于下游程序消费。结语ts/examples/vercel是一个麻雀虽小五脏俱全的集成范本从generateText的单轮调用到streamText的流式体验再到ToolLoopAgent的自动循环与 MCP toolrouter 会话完整覆盖了 Composio × Vercel AI SDK 的典型集成路径而VercelProvider的源码则揭示了工具从 JSON Schema 到 AI SDK 可执行工具的完整转换链。按照本文步骤配置密钥后运行pnpm start即可亲身体验大模型推理 Composio 工具执行的完整闭环。【免费下载链接】composioComposio powers 1000 toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考