Composio 与 OpenAI 集成指南:使用 @composio/openai 将工具接入 Responses 与 Chat Completions

发布时间:2026/11/12 9:07:50

Composio 与 OpenAI 集成指南:使用 @composio/openai 将工具接入 Responses 与 Chat Completions Composio 与 OpenAI 集成指南使用 composio/openai 将工具接入 Responses 与 Chat Completions【免费下载链接】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/composiocomposio/openai是 Composio 官方提供的 OpenAI 适配层它把 Composio 平台上的 1000 工具包装成 OpenAI 标准的 function calling 格式同时覆盖 Responses API 与 Chat Completions API 两条调用链路。本文以 ts/packages/providers/openai/README.md 为主体结合 OpenAIResponsesProvider.ts、OpenAIProvider.ts 源码与测试、示例完整讲解安装配置、两种 Provider 的选择、工具执行循环的编写以及 strict 模式Structured Outputs的底层实现原理。读完本文你将能在自己的 OpenAI Agent 中快速接入 Composio 工具并跑通完整的模型调用工具 → 工具返回结果 → 模型生成最终答案闭环。安装与前置配置composio/openai与composio/core、官方openaiSDK 一同安装npm install composio/core composio/openai openai从 package.json 可以看到该包的版本约束composio/core需要0.10.0 1.0.0 || 1.0.0-beta.0 1.0.0openaiSDK 需要^6.49.0 || ^7.0.0Node 环境要求22.22.3。安装完成后在环境变量中配置两个密钥COMPOSIO_API_KEYComposio 平台密钥OPENAI_API_KEYOpenAI 平台密钥。两个 ProviderResponses API 与 Chat Completions API该包按 OpenAI 的 API 面导出两个 Provider见 index.tsProvider目标 API特点适用场景OpenAIResponsesProviderResponses APIhandleToolCalls返回按call_id关联的function_call_output条目配合previous_response_id每轮只重发新增输出新的 Agent 流程官方推荐OpenAIProviderChat Completions APIComposio SDK 默认 Providernew Composio()不带参数时自动使用handleToolCalls返回可直接追加的tool消息消息列表由你自己维护扩展现有 Chat Completions 代码库OpenAIProvider实际上定义在composio/core内部见 ts/packages/core/src/provider/OpenAIProvider.tscomposio/openai只是把它作为便捷导出重新暴露而OpenAIResponsesProvider是本包的核心实现见 OpenAIResponsesProvider.ts。快速上手基于 Responses API 的 Agent 循环以下是 README 中的完整 Quickstart 代码。核心思路是为用户创建会话 → 获取工具 → 请求模型 → 若返回function_call则执行工具并把结果回传循环直至模型回复文本import OpenAI from openai; import { Composio } from composio/core; import { OpenAIResponsesProvider } from composio/openai; const composio new Composio({ provider: new OpenAIResponsesProvider(), }); const client new OpenAI(); // Create a session for your user const session await composio.create(user_123); const tools await session.tools(); let response await client.responses.create({ model: gpt-5.2, tools, input: [ { role: user, content: Send an email to johnexample.com with the subject Hello and body Hello from Composio!, }, ], }); // Agentic loop: keep executing tool calls until the model responds with text while (response.output.some(o o.type function_call)) { const results await composio.provider.handleToolCalls(session, response.output); response await client.responses.create({ model: gpt-5.2, tools, previous_response_id: response.id, input: results, }); } // Print final response for (const item of response.output) { if (item.type message item.content[0].type output_text) { console.log(item.content[0].text); } }这个循环有三个关键点工具获取有两种方式session.tools()会话工具或composio.tools.get()直接工具。当使用composio.tools.get()获取工具时handleToolCalls的第一个参数应传用户 ID字符串而不是 session。previous_response_id的妙用在 Responses API 中把上一轮响应的 ID 传回模型上下文自动续接你只需要把新的function_call_output条目作为input传入无需手动拼接全部历史消息。退出条件response.output中存在function_call时继续循环当模型输出纯文本消息output_text时结束。仓库中还提供了一个基于handleResponse的等价写法见 ts/examples/openai/src/responses-api/index.ts它用composio.provider.handleResponse(default, initialResponse)一步完成过滤 function_call → 执行工具 → 生成输出条目并演示了beforeExecute/afterExecute执行修饰器modifiers的用法可用于打点日志、拦截或改写参数。handleToolCalls 与 handleResponse 的内部行为从源码看OpenAIResponsesProvider.tshandleToolCalls会遍历response.output中所有function_call条目逐条执行并生成function_call_output执行成功时返回条目带status: completedoutput为工具结果的 JSON 字符串执行失败抛出异常时同样生成一条function_call_output但status: incompleteoutput是错误消息文本。这样即使某个工具调用失败模型也能看到错误信息并据此调整策略不会因为缺失某条call_id的结果而导致下一次请求报错。测试用例 opeanai-responses.test.ts 中专门验证了会话执行失败时输出incomplete状态且保留call_id与多工具调用按原始顺序返回这两个行为。handleResponse(userId, response)则是handleToolCalls的便捷封装它先从response.output中过滤出function_call条目再交给handleToolCalls处理见 源码 L425-L434。Chat Completions 集成手动维护消息列表OpenAIProvider默认 Provider面向 Chat Completions API。README 中说明handleToolCalls(session, chatCompletion)返回可直接追加的tool消息消息列表由你自己维护。结合示例 ts/examples/openai/src/chat-completions.ts典型用法如下import { Composio } from composio/core; import { OpenAI } from openai; const openai new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); // 不传 provider默认即 OpenAIProvider const composio new Composio({ apiKey: process.env.COMPOSIO_API_KEY }); const tools await composio.tools.get(default, HACKERNEWS_GET_USER); const response await openai.chat.completions.create({ model: gpt-4o, messages: [ { role: system, content: You are a helpful assistant that can use tools to answer questions. }, { role: user, content: Find information about the HackerNews user pg }, ], tools, tool_choice: auto, }); if (response.choices[0].message.tool_calls?.[0].type function) { // 单条工具调用也可直接使用 executeToolCall const toolResult await composio.provider.executeToolCall( default, response.choices[0].message.tool_calls[0], { connectedAccountId: } ); const finalResponse await openai.chat.completions.create({ model: gpt-4o, messages: [ { role: system, content: You are a helpful assistant that can use tools to answer questions. }, { role: user, content: query }, response.choices[0].message, // 携带 tool_calls 的 assistant 消息 { role: tool, tool_call_id: response.choices[0].message.tool_calls[0].id, content: toolResult }, ], }); console.log(finalResponse.choices[0].message.content); }handleToolCalls对应 OpenAIProvider.ts会遍历chatCompletion.choices[0].message.tool_calls为每个 function 调用生成一条{ role: tool, tool_call_id, content }消息。源码中的两个细节值得注意只处理第一个 choice当n 1时其余 choice 是模型生成的备选补全永远不会被继续使用执行它们的工具调用只会产生孤儿tool_call_id测试 openai.test.ts 中有专门用例锁定该行为并行工具调用同一条 assistant 消息可携带多个tool_calls默认开启并行每个都必须有对应的tool结果否则下一次请求会因未应答的tool_call_id而失败。此外OpenAIProvider还保留了面向已弃用 Assistant API 的handleAssistantMessage与waitAndHandleAssistantToolCalls源码中标注了deprecated将在下一个大版本移除新代码不建议使用。深入 strict 模式Structured Outputs 的完整实现OpenAIResponsesProvider构造时可传入{ strict: true }开启 strict 模式默认false见 源码 L89-L92const composio new Composio({ provider: new OpenAIResponsesProvider({ strict: true }), });strict 模式会调用 jsonSchema.ts 中的toStrictJsonSchema对工具 schema 做深度归一化遵循 OpenAI Structured Outputs 的约束每个对象全部封闭所有对象节点都变成 closed object——required列出全部属性并追加additionalProperties: false可选属性变成必填但可空可选属性会被加入required并拓宽为接受null例如type: string变为type: [string, null]或追加anyOf的 null 分支。这是 OpenAI 官方文档认可的模拟可选字段的做法——模型用null表达省略而该null在工具真正执行前会被丢弃详见下文omitNullToolArguments除非源 schema 本身就接受该字段为 null无损改写oneOf转为anyOfoneOf不受支持、剥离default/examples等注解关键字。每次改写都会被记录为changes上限 50 条totalChanges保存真实计数并在 debug 日志中输出具体路径与原因。无法表达 strict 的工具自动降级并告警toStrictJsonSchema会收集所有 strict 模式无法表达的构造unsupported数组包括接受任意键的对象schema 值或true的additionalProperties、patternProperties、无属性的自由对象、allOf、prefixItems、元组形式items、条件/依赖关键字、外部或悬空$ref等。改写这些构造会改变工具的真实语义因此源码选择不压缩而是将整个工具按非 strict 模式发送并打印一条 warning 日志提示该工具因 schema 无法表达为 strict structured outputs 而放弃 strict 模式见 wrapTool 实现 L161-L178。测试 opeanai-responses.test.ts 中验证了含additionalProperties: { type: string }的工具在 strict 模式下会得到strict: false且保留原 schema。另外两个边界行为也在测试中被锁定无参数工具在 strict 模式下输出空的封闭对象{ type: object, properties: {}, required: [], additionalProperties: false }本地$ref指向#/$defs/...会被保留$defs本身也会被归一化可选$ref属性通过anyOf追加 null 分支。执行前的参数修正omitNullToolArgumentsstrict 模式下模型会为可选参数发送null直接透传会撞上工具自身 schema 的校验。因此executeToolCall在执行前会查表strictInputSchemaskeyed by tool slug取出该工具实际看到的 strict schema调用omitNullToolArguments递归删除源 schema 不接受的null值若源 schema 接受 null可空字段、显式清空该值则原样保留见 源码 L287-L304 与 jsonSchema.ts 的 omitNullToolArguments。对应的测试用例验证了{ cfg: { url: u, note: null }, label: null, clearable: null }最终执行时被清洗为{ cfg: { url: u }, clearable: null }。底层执行细节与工具包装无论哪个 Provider工具执行最终都汇聚到两个共用机制上normalizeToolArgumentsOpenAI 总是把工具参数序列化为 JSON 字符串该函数负责解析同时容忍空字符串 / 对象形态的载荷对应 issue #2406 的修复空字符串会被归一为空对象{}deduplicateJsonSchemaRequiredArrays在 vendor schema 的发射边界对required数组去重。JSON Schema 2020-12 不允许required出现重复项而工具 schema 既来自 Composio API 也可能来自直接 provider 调用该归一化保证所有 Provider 收到规范的 schema。测试中确认了required: [input, input]会被折叠为[input]wrapMcpServerResponseResponses Provider 会把 MCP 服务器响应转换为 OpenAI Responses 的 MCP 工具格式type: mcp、server_label、server_url、require_approval: never并且测试保证不会把 MCP URL可能含敏感 token打到 stdout。工具包装的结果是标准的 OpenAI function 声明OpenAIResponsesProvider产出{ type: function, name: slug, description, parameters, strict }OpenAIProvider产出{ type: function, function: { name, description, parameters } }。工具名统一使用 Composio 工具 slug因此从tools.get()/session.tools()拿到的数组可以直接透传给 OpenAI 的tools参数。测试与验证该包在两个测试文件中覆盖了完整的契约opeanai-responses.test.ts验证 Provider 名称、wrapTool的 strict 语义可选属性 required-nullable、嵌套可空对象、$defs引用保留、不可表达构造降级、空参数封闭对象、参数去重与归一化、executeToolCall的参数传递含connectedAccountId、customAuthParams、modifiers、handleToolCalls的排序与错误状态、handleResponse对空输出与缺省输出字段的容错openai.test.ts覆盖OpenAIProvider的工具包装、并行工具调用、n 1时仅处理首个 choice、handleAssistantMessage、以及 Assistant API 的轮询/提交逻辑。运行测试的命令为npm testvitest run。你可以用这些用例作为行为基线验证自己的集成代码是否与 Provider 的预期契约一致。小结composio/openai的价值在于把工具获取、格式适配、参数归一、执行回传全部封装进 Provider让 OpenAI 的两种主流调用方式都能以最少的样板代码接入 Composio 工具生态。新项目推荐使用OpenAIResponsesProvider Responses API previous_response_id的循环模式存量 Chat Completions 代码库则直接用默认的OpenAIProvider手动维护消息列表。若需要模型输出严格符合工具 schema可开启strict: true并理解其必填但可空 执行前剥离 null 无法表达时自动降级的三层机制从而写出既稳定又可控的 Agent 工具循环。【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/11/11 10:28:08

微信聊天记录导出与永久保存:WeChatMsg完整指南

微信聊天记录导出与永久保存:WeChatMsg完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …

2026/11/10 13:30:30

WT系列语音芯片原理与实战:存储-解码-驱动一体化设计

1. 语音芯片不是“会说话的黑盒子”,而是可编程的声音执行器 你拆过玩具里的发声模块吗?按一下按钮,“欢迎光临”就响了;插上USB小音箱,通电自动播报“设备已连接”。这些声音背后,大概率不是单片机跑音频解…

2026/11/12 9:04:37

附近哪里办到电工证在哪考,学历不高也能拿证拿高薪

附近哪里办到电工证在哪考,学历不高也能拿证拿高薪 你是不是也担心学历不高,连电工证都报不了名?别急,电工证其实对学历要求并不高,关键是你得知道 在哪考 ,才能顺利拿证。今天就来聊聊 附近哪里办到电工证…

2026/11/12 9:04:37

低压电工证色弱能考吗保姆级教程:郑州金水区小白也能看懂

低压电工证色弱能考吗保姆级教程:郑州金水区小白也能看懂 你是不是也遇到过这种情况:想考低压电工证,但听说色弱不能考,心里一慌,不知道从哪儿下手,更怕被那些中介坑了钱还办不成证?别急,这篇保姆级教程专为像你这样的郑州金水区初次报考人员量身打造…

2026/11/12 9:04:37

丽江市考电工证报名费多少钱?良心建议帮你少走弯路

丽江市考电工证报名费多少钱?良心建议帮你少走弯路 急需特种作业证才能上岗找工作,这是很多在丽江准备入行或转行的小伙伴的真实写照。特别是电工证,不仅关系到能否顺利上岗,还直接决定了你未来的职业发展空间。很多人一上来就问“丽江市考电工证报名费多…

2026/11/12 9:04:37

武警特种装备维修工官方报名入口在哪里?学历不高也能考吗

武警特种装备维修工官方报名入口在哪里?学历不高也能考吗 你是不是也在纠结, 学历不高怕报不上名 ?其实, 武警特种装备维修工 这个证,对学历的要求并不高,但它的含金量和就业前景却十分可观。很多像你一样的人,其实都是从零基础起步,通过…

2026/11/12 9:04:37

_电工证如何报考实操考试考什么

电工证如何报考网上查询外省证能不能转 之前考的证在外省能不能转过来?这几乎是每个想要报考或正在准备复审的电工同行都会问的问题。尤其是在河南信阳浉河区从事水利工程的电工朋友,很多时候需要跨区域施工,证书能否跨省使用直接关系到能不能顺利上岗。好…

2026/11/12 8:59:36

哪种电工证工资最高培训机构怎么选

电工证工资哪家高?实操考试心里没底怕挂科,良心建议来了 实操考试心里没底怕挂科,这是很多准备考电工证的朋友最真实的感受。尤其是面对【哪种电工证工资最高】这个问题,很多人不仅关心证书种类,更关心考哪一种能真正拿到高工资。但很多人也担心,培训费…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑