OpenAI Agent 工具全面开发者指南——从 RAG 到 Computer Use:Responses API 与 MCP 实战拆解,把 endpoint 改到 TaoToken
1. 从 Assistants 到 ResponsesAgent 工具链的迁移痛点如果你最近在维护一个基于 Assistants API 的 Agent 项目大概率会遇到这样的困惑Thread 对象越堆越多run 状态轮询写得像状态机file_search 的向量库偶尔抽风想加个 MCP 工具还得自己写一层适配。OpenAI 把 Responses API 推出来之后官方文档里那句 agentic by default 其实说得很直白——旧接口是为聊天设计的新接口是为模型自己决定调什么工具设计的。Responses API 能做什么简单说它把 file_search、code_interpreter、web_search、image_generation、computer_use、remote MCP servers 这些能力统一收进一个tools数组里模型在一次请求内可以自主串联多个工具。适合谁适合正在做 RAG 问答、数据分析 Agent、GUI 自动化、或者想把内部系统通过 MCP 暴露给模型的开发者。它不再是你问我答而是你给目标模型规划步骤并调用工具。我试过把一个老的 Assistants 项目迁过来最直观的变化是不再需要手动管理 thread_id 和 run 的轮询循环一次responses.create就能拿到带file_search_call、mcp_call的完整轨迹。但迁移过程中真正的坑不在 API 结构而在 endpoint 和鉴权配置——很多团队卡在本地能跑、联调 401这一步。这篇就围绕 Responses API 的调用结构、RAG 检索增强、Computer Use 循环以及 MCP 接入把可复制的 endpoint 配置和验证动作拆开讲。先明确一个概念边界Responses API 里的工具分两类。一类是 OpenAI 托管的内置工具比如 file_search 背后是托管的向量存储code_interpreter 背后是沙盒另一类是 remote MCP servers由你自己部署模型通过mcp_list_tools发现工具、通过mcp_call执行。前者你只需要传vector_store_ids后者你需要处理 OAuth 或自定义鉴权。理解这个分层后面配置才不会乱。还有一个容易被忽略的点Responses API 的返回是事件流式的结构。一次请求可能返回多个 output item包括reasoning、file_search_call、message、mcp_call等。很多同学第一次解析时直接取output[0].content结果拿到的是检索元数据而不是最终回答。正确做法是遍历 output按 type 分流处理。这个细节在后面的验证章节会给出完整代码。2. TaoToken 前置把 endpoint 改到统一入口在动手写 Agent 之前先把请求入口理顺。很多开发者本地调试时直接用官方 endpoint到了团队联调或者多模型对比时又要改 base_url、换 key、对模型 ID配置散落在.env、settings.json、auth.json好几个地方。TaoToken 在这里的角色是一个统一的 API 入口官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 路径不带 UTM 参数。你需要准备三样东西我把它叫三件套Base URL、API Key、Model ID。这三者在任何 OpenAI 兼容客户端里都是必填项缺一个就会报鉴权或模型不存在的错。Base URL 填https://taotoken.net/apiKey 在控制台的 API Keys 页面生成Model ID 按你实际要调的模型填比如做 Responses API 实验时用支持工具调用的模型。获取 Key 的路径是进入控制台后找到 API Keys 模块新建一个 key 并复制保存。这里有个实操建议给 Agent 项目单独建一个 key不要和日常对话混用方便后面按项目排查用量和报错。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 页面是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。配置方式分两种场景。第一种是纯 Python SDK通过环境变量注入第二种是带配置文件的客户端比如 Claude Code、Cline、Codex 这类需要写进 JSON 或 TOML。两种都要保证 Base URL 和 Key 一致否则会出现命令行能跑、IDE 里 401的割裂现象。我踩过的坑就是.env里改了 base_url但 IDE 插件读的是自己的 settings结果排查了半天。对于 Responses API 的调用Python 侧推荐用官方 SDK 并指定base_url。如果你用的是 OpenAI 兼容的 HTTP 客户端直接把请求打到https://taotoken.net/api/v1/responses即可。注意路径里的/v1是 OpenAI 兼容层的约定不同客户端可能自动拼接配置时先确认客户端是否已经带了/v1避免出现/api/v1/v1/responses这种双斜杠路径。模型对话的在线调试入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 可以先用它验证 key 和模型 ID 是否匹配再去写代码。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到参数不确定时对照文档比猜要快。长期做编码 Agent 的话Coding Plan 页面是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 适合需要稳定跑 Agent 工作流的场景。3. 可复制配置JSON / TOML / settings 片段这一节给可直接粘贴的配置。先给 Python 环境变量方式适合脚本和 CIexport OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEYsk-你的key export OPENAI_MODEL你的模型ID然后是 Python SDK 初始化显式传 base_url避免依赖环境变量被覆盖from openai import OpenAI client OpenAI( base_urlhttps://taotoken.net/api, api_keysk-你的key, ) resp client.responses.create( model你的模型ID, input用一句话解释 RAG 的检索增强是什么意思, tools[{type: file_search}], tool_config{vector_store_ids: [vs_你的向量库ID]}, ) print(resp.output_text)如果你用的是带配置文件的客户端比如 Cline 或 Claude Code 这类配置通常写在 JSON 里。下面是一个通用的 settings 片段字段名按客户端可能略有差异但三件套不变{ models: { provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: sk-你的key, model: 你的模型ID, temperature: 0.2 } }Codex 的auth.json结构类似核心是 base_url 和 api_key 两个字段{ openai: { base_url: https://taotoken.net/api, api_key: sk-你的key, model: 你的模型ID } }MCP 接入的配置单独说。Remote MCP server 在 Responses API 里通过tools数组声明结构如下{ type: mcp, server_label: my_internal_tools, server_url: https://your-mcp-server.example.com/sse, require_approval: never }require_approval控制审批循环设为never时模型直接调用设为always时会返回mcp_approval_request需要你在客户端回一个mcp_approval_response。生产环境建议至少对写操作开启审批读操作可以放行。TOML 场景多见于一些 CLI 工具结构如下[model] base_url https://taotoken.net/api api_key sk-你的key model_id 你的模型ID [mcp] server_url https://your-mcp-server.example.com/sse approval never配置写完先别急着跑 Agent用一条最简单的请求验证连通性。如果这一步就报 401说明 key 或 base_url 有问题如果报 model not found说明 Model ID 不对。把这两个错误分开定位比一上来就调复杂工具链高效得多。4. 验证请求从 RAG 到 Computer Use 的成功结果先验证 RAG。file_search 的完整流程是上传文件、创建向量存储、关联文件、等待状态 completed、再在 responses 里引用。上传和建库的代码# 1. 上传文件 file client.files.create( fileopen(manual.pdf, rb), purposeassistants, ) # 2. 创建向量存储 vs client.vector_stores.create(nameagent_kb) # 3. 关联文件 client.vector_stores.files.create( vector_store_idvs.id, file_idfile.id, ) # 4. 轮询状态直到 completed import time while True: status client.vector_stores.retrieve(vs.id) if status.status completed: break time.sleep(2) print(vector store ready:, vs.id)拿到vs.id后发起带 file_search 的请求并正确解析返回resp client.responses.create( model你的模型ID, input这份手册里关于安装步骤是怎么写的, tools[{type: file_search}], tool_config{vector_store_ids: [vs.id]}, ) for item in resp.output: if item.type file_search_call: print(检索查询:, item.queries) elif item.type message: for c in item.content: if c.type output_text: print(回答:, c.text) for ann in c.annotations: if ann.type file_citation: print(引用文件:, ann.filename)成功的结果是先打印出模型重写后的检索 query再打印带引用的回答。如果只看到回答没有 citation检查文件是否真的完成了索引。再验证 Computer Use。它的工作流是一个循环发初始请求带截图和目标模型返回 action客户端执行再回传新截图。伪代码结构screenshot capture_screen() # 你的截图函数 resp client.responses.create( model你的模型ID, input[{ role: user, content: [ {type: input_text, text: 打开设置并关闭通知}, {type: input_image, image_url: fdata:image/png;base64,{screenshot}}, ], }], tools[{type: computer_use_preview, display_width: 1920, display_height: 1080}], ) for item in resp.output: if item.type computer_call: action item.action execute_action(action) # 你的鼠标键盘执行函数 new_shot capture_screen() # 把 new_shot 作为下一轮输入继续循环成功标志是模型返回computer_call且 action 类型是click、type、scroll之一。注意 Computer Use 目前是预览能力屏幕尺寸要和实际分辨率一致否则坐标会偏。MCP 的验证更直接。声明 remote MCP server 后第一次请求会触发mcp_list_tools你能在 output 里看到工具清单随后模型决定调用时返回mcp_call包含工具名和参数。成功结果里应该同时出现mcp_list_tools和mcp_call两类 item。如果只有 list 没有 call说明模型判断不需要调工具可以换一个明确需要外部数据的 prompt 再试。5. 常见报错排查401、local proxy failed、reading choices、OAuth第一个高频错误是 401 Unauthorized。典型信息是Incorrect API key provided或invalid_api_key。原因通常是三件套里 key 和 base_url 不匹配——比如 key 是在 A 环境生成的base_url 却指向了 B 环境。排查动作用 curl 直接打一次最小请求排除客户端缓存干扰。curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的key如果这条返回模型列表说明 key 和 base_url 没问题问题在客户端配置层。第二个是local proxy failed或连接被拒。这类报错多半是本地网络配置或客户端自带的转发层出了问题不是 API 本身。排查方向确认客户端没有配置额外的本地转发端口确认 base_url 是完整的https://taotoken.net/api而不是localhost。把客户端配置里的代理相关字段清空直接用直连方式重试。第三个是解析阶段的reading choices报错典型信息是choices或object has no attribute choices。这是因为 Responses API 的返回结构里没有choices字段它用的是output数组。如果你把 Responses 的返回当成 Chat Completions 来解析就会报这个错。修正方式是遍历resp.output按 item.type 分流而不是取resp.choices[0]。第四个是 MCP 相关的 OAuth 报错典型信息是mcp_approval_request未响应或oauth token expired。Remote MCP server 如果要求 OAuth第一次调用会返回审批请求你需要回传mcp_approval_response。如果 token 过期重新走授权流程。排查时先确认require_approval的设置再检查 server 端的 token 有效期。还有一个隐蔽的坑向量库状态一直是in_progress。这通常是文件太大或格式不支持。file_search 支持 pdf、txt、md、docx 等但扫描版 PDF 没有文字层索引会失败。排查动作是换一个纯文本文件测试确认是文件问题还是流程问题。把这几类错误按鉴权层、网络层、解析层、工具层分开定位比盲目改代码快得多。鉴权层看 401网络层看连接失败解析层看字段名工具层看审批和状态。6. 语义一致 CTA按场景选入口配置和验证跑通之后下一步是按你的实际场景选入口。如果你现在卡在排障或接入阶段比如 401 还没解决、MCP 审批流程没理顺先去 API Keys 页面确认 key 状态再对照接入文档检查参数API Keys 在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。如果你只是想快速验证某个模型在 Responses API 下的工具调用表现不想写代码直接用模型对话入口试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。输入一个需要检索或需要调工具的问题看它是否触发 file_search 或 mcp_call。如果你是要长期跑编码 Agent、把 MCP 工具链接进日常开发流那 Coding Plan 更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它面向的是持续性的 Agent 工作流而不是单次调试。最后给一个实操建议把三件套写进项目的.env.example但不要提交真实 key。团队协作时每个人用自己的 keybase_url 和 model ID 保持一致。这样既避免了 key 泄露也保证了本地能跑、联调也能跑。Agent 工具链的调试成本一大半花在环境不一致上把入口统一了剩下的就是调 prompt 和工具参数的事了。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →