
Composio 与 Vercel AI SDK v6 兼容性保障深入解读 composio/vercel 的端到端测试套件【免费下载链接】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/vercel与 Vercel AI SDKai6的兼容性端到端测试套件展开说明 Composio 如何把 1000 工具包装为 AI SDK 原生tool格式、如何通过npm pack Docker 多版本 Node 的隔离环境验证安装、类型检查与运行时执行以及每个测试标记背后的实现原理。读完你将掌握该测试套件的目录结构、运行方式、fixture 契约并能从源码层面理解wrapTool/wrapTools的输入规范化与严格模式机制。套件定位守护^6.0.0 || ^7.0.0双主版本兼容范围的一侧在 ts/packages/providers/vercel/package.json 中composio/vercel将ai声明为跨多个主版本的 peer dependency^6.0.0 || ^7.0.0。这意味着一个发布包需要同时服务 AI SDK v6 与 v7 两代消费者。仓库用两套平行的端到端套件分别守护该范围的两条臂v6 臂本文主题 ts/e2e-tests/runtimes/node/vercel-ai-sdk-v6/README.md锁定ai6v7 臂同级的 ts/e2e-tests/runtimes/node/vercel-ai-sdk-v7/README.md除覆盖相同行为外还额外验证 v7 特有的ToolExecutionOptions形状标记V7_EXECUTION_OPTIONS_OK。两套套件结构完全镜像目的都是防止未来某次改动在未察觉的情况下破坏某一代消费者。本指南以 v6 套件为观察窗口其结论同样适用于 v7。套件验证的五项核心契约v6 套件通过五个 stdout 标记逐项断言兼容性任何一项缺失都会让测试失败标记验证内容vercel ai sdk compatibility typecheck passed打包后的 provider 在ai6环境下通过tsc --noEmit类型检查对应 fixtures/index.tsWRAPPED_TOOL_INPUT_SCHEMA_OKwrapTool返回符合 AI SDK 工具形状的对象含inputSchema与executeOBJECT_INPUT_EXECUTION_OK对象形式的输入被原样转发给executeToolSTRING_INPUT_EXECUTION_OKJSON 字符串形式的输入在交给executeTool前被规范化解析为对象TOOL_SET_OKwrapTools产出一个与ToolSet兼容的工具集合这五个标记同时出现在两个地方形成双重校验fixture 运行时输出执行 fixtures/index.mjs 时逐条打印测试断言e2e.test.ts 中对result.stdout逐一toContain校验且校验了 setup 阶段的退出码与输出。Fixture 三件套运行时、类型层与依赖声明fixtures/ ├── index.mjs # 运行时执行包装工具并断言执行行为 ├── index.ts # 纯类型检查tsc --noEmit断言 provider 类型与 ai6 对齐 └── package.json # 声明 composio/core链接、ai6、typescript、zod运行时断言index.mjsfixture 构造了一个模拟的 Composio 工具与执行函数随后用VercelProvider包装import { VercelProvider } from composio/vercel; const composioTool { slug: TEST_TOOL, name: Test Tool, description: A tool used by the AI SDK compatibility fixture, version: 20260625_00, availableVersions: [20260625_00], inputParameters: { type: object, properties: { query: { type: string, description: Query text } }, required: [query], }, tags: [], }; const calls []; const executeTool async (slug, params) { calls.push({ slug, params }); return { data: { slug, params }, error: null, successful: true }; }; const provider new VercelProvider(); const wrapped provider.wrapTool(composioTool, executeTool);随后依次断言工具形状wrapped.inputSchema存在且typeof wrapped.execute function否则抛出Wrapped tool does not match the AI SDK tool shape对象输入转发await wrapped.execute({ query: object input })后检查calls.at(-1)的 slug 与 params 是否与入参一致字符串输入规范化await wrapped.execute(JSON.stringify({ query: string input }))验证字符串被解析后再转发集合形状provider.wrapTools([composioTool], executeTool)产出的集合必须包含TEST_TOOL键。注意executeTool的返回结构{ data, error, successful }—— 这是 Composio 执行结果的标准信封execute包装层原样透传。类型层断言index.tsfixtures/index.ts 是纯类型测试编译时tsc --noEmit验证import { VercelProvider, type VercelToolCollection } from composio/vercel; import type { Tool as ComposioTool, ExecuteToolFn } from composio/core; import type { ToolSet } from ai; const composioTool { /* ... */ } satisfies ComposioTool; const executeTool (async () ({ data: { ok: true }, error: null, successful: true })) satisfies ExecuteToolFn; const provider new VercelProvider(); const tools provider.wrapTools([composioTool], executeTool); // 可赋值性冒烟检查包装后的集合必须同时满足 // provider 导出的类型与已安装 AI SDK 的 ToolSet。 const _wrappedToolSet: VercelToolCollection tools satisfies ToolSet;核心契约在于tools satisfies ToolSet若composio/vercel发布的dist类型与ai6的ToolSet定义出现任何不兼容编译期即报错无需等待运行时。该文件在 tsconfig.json 中以strict: true、noEmit: true编译。依赖声明package.jsonfixtures/package.json 精确锁定了关键版本{ private: true, type: module, scripts: { install:vercel: VERCEL_TGZ$(npm pack /app/ts/packages/providers/vercel --pack-destination . --silent) test -n \$VERCEL_TGZ\ npm install --ignore-scripts --legacy-peer-deps --package-lockfalse \./$VERCEL_TGZ\, typecheck: tsc --noEmit echo vercel ai sdk compatibility typecheck passed }, dependencies: { composio/core: file:/app/ts/packages/core, ai: 6.0.211, typescript: 5.8.3, zod: 4.5.4 } }两点值得注意ai被钉在6.0.211测试的是 v6 主版本内的具体版本避免上游热更新造成结果抖动--legacy-peer-depscomposio/vercel的 peer 范围是^6.0.0 || ^7.0.0在 v6 锁定环境下安装时借助该标志规避 peer 解析冲突聚焦验证「包本身能否安装、类型能否对齐」。关键设计以发布产物tarball而非工作区源码作为被测对象套件刻意复刻真实消费者的安装路径npm pack /app/ts/packages/providers/vercel先打 tarball再安装该 tarball。这样被验证的是发布出去的dist与peerDependencies而非工作区源码——任何只在 workspace 下能跑、发布后不可用的问题漏打包文件、peer 声明错误、dist 未构建等都会在这里暴露。composio/core则以file:链接方式引入保证核心类型与执行层同步。install:vercel之所以不单独执行npm install正如 e2e.test.ts 注释所述安装 tarball 的过程会物化完整的 fixture 依赖树ai6、zod、typescript等依赖随之落地。Setup 阶段与运行方式setup阶段在 Docker 卷内依次执行npm run install:vercel npm run typecheck然后以只读挂载已安装node_modules的方式运行 fixtureindex.mjs。只读挂载保证了 fixture 运行时不会污染安装产物也验证了运行时对已安装依赖的纯读取依赖。pnpm test:e2ee2e辅助函数来自e2e-tests/utils接收版本矩阵与 fixture 配置beforeAll中以 300 秒超时运行 setupe2e(import.meta.url, { versions: { node: [22.22.3, 24.17.0, 25.9.0] }, usesFixtures: true, defineTests: ({ runFixture }) { /* ... */ }, });即该套件会在Node.js 22.22.3、24.17.0、25.9.0三个版本上分别执行完整流程确认composio/vercel的运行时行为不受 Node 主版本影响。测试分组清晰setup组校验安装与类型检查composio/vercel ai6组逐一断言五个运行时标记。源码纵深wrapTool 的输入规范化与 strict 模式理解了测试契约后再看其背后的实现 ts/packages/providers/vercel/src/index.ts。VercelProvider继承自BaseAgenticProvider核心方法是wrapTool单工具与wrapTools批量按 slug 归并为字典。工具形状description inputSchema executereturn 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 ); }, });inputSchema由 Composio 工具的inputParametersJSON Schema转换而来转换链为deduplicateJsonSchemaRequiredArrays去重 required 数组→ 可选 strict 重写 →dereferenceJsonSchema展开$ref未解析时回退 sentinel因为 Zod 转换器不跟踪$ref→jsonSchemaToZodSchemaJSON Schema 转 Zod schema。JSON 字符串输入的规范化STRING_INPUT_EXECUTION_OK标记验证的正是normalizeToolArguments的行为其实现在 ts/packages/core/src/utils/toolArguments.ts。源码注释指出模型偶尔会以 JSON 字符串而非对象的形式输出工具入参对应 issue #2406因此该函数对字符串输入做JSON.parsenull/undefined返回{}空字符串返回{}解析失败则抛出ComposioInvalidToolArgumentsError。这正是为什么wrapped.execute(JSON.stringify({ query: string input }))能被安全转发。可选 strict 模式构造器new VercelProvider({ strict: true })启用严格模式。部分模型会拒绝包含可选参数的 tool schemastrict 模式调用toStrictJsonSchema重写 schema所有属性进入required可选属性变为 nullable、对象封闭、去除注解关键字。若 schema 存在无法表达的结构任意键对象、allOf、prefixItems、未解析$ref工具保留原 schema 并通过logger.warn告警改写成功时执行前用omitNullToolArguments把 strict 重写引入的null丢弃——除非工具自身 schema 允许该参数为null。wrapTools的实现是一个简单的 reduce遍历工具数组以slug为键逐一调用wrapTool最终得到 AI SDK 的ToolSet字典。实际使用示例测试套件之外ts/packages/providers/vercel/README.md 给出了生产用法。安装依赖后设置COMPOSIO_API_KEY及模型提供方密钥如ANTHROPIC_API_KEYnpm install composio/core composio/vercel ai ai-sdk/anthropicimport { anthropic } from ai-sdk/anthropic; import { Composio } from composio/core; import { VercelProvider } from composio/vercel; import { generateText, stepCountIs } from ai; const composio new Composio({ provider: new VercelProvider() }); // 每个 session 绑定一个终端用户 const session await composio.create(user_123); const tools await session.tools(); const { text } await generateText({ model: anthropic(claude-sonnet-4-6), tools, prompt: Summarize my emails from today, stopWhen: stepCountIs(10), }); console.log(text);多轮对话场景下应保存session.sessionId并在后续轮次用composio.use(sessionId)复用而不是每轮新建 session。wrapTool内建的execute意味着 AI SDK 会自动执行工具调用无需手写 agentic loop。总结双版本矩阵如何保证长期兼容把 v6 套件的设计要点串起来看它构成了一个多层防线安装层以npm packtarball 复刻消费者安装路径验证发布产物与 peer 范围类型层fixtures/index.ts在ai6下做satisfies ToolSet编译期对齐任何类型漂移立即失败运行时层fixtures/index.mjs验证包装形状、对象输入、字符串输入规范化与集合结构四个行为契约隔离层Docker 卷 只读node_modules挂载 Node 22/24/25 三版本矩阵排除宿主环境与 Node 版本差异的干扰。v7 臂在其上追加ToolExecutionOptions形状验证与 v6 臂共同覆盖^6.0.0 || ^7.0.0的完整承诺。这套「fixture 即契约、标记即断言」的模式为其他 provider 包的跨主版本兼容守护提供了可复制的范式。【免费下载链接】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),仅供参考