尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Cursor Agent 使用 GPT 5.6 报错:tools[6].type unknown variant custom 问题排查与解决

Cursor Agent 使用 GPT 5.6 报错:tools[6].type unknown variant custom 问题排查与解决 1. Cursor Agent 调用 GPT 5.6 报 tools[6].type unknown variant custom 是什么你在 Cursor 里开着 Agent 模式模型选 GPT 5.6消息一发出去还没等模型开始思考界面直接弹出一段 JSON 报错{ error: { message: Failed to deserialize the JSON body into the target type: tools[6].type: unknown variant custom, expected function at line 1 column 95797, type: invalid_request_error, param: null, code: invalid_request_error } }这个报错的核心检索词就是tools[6].type unknown variant custom它属于 OpenAI 兼容接口在请求体反序列化阶段的校验失败。翻成大白话Cursor 在发请求时往tools数组里塞了第 7 个工具下标从 0 开始所以是tools[6]这个工具的type字段写的是custom但接收请求的那一端只认识function这个取值于是请求在真正到达模型之前就被拒了。它能做什么判断只要看到unknown variant、expected function、tools[n]这几个关键词同时出现基本可以锁定是工具协议格式不兼容而不是你的项目代码写错了。适合谁看适合所有在 Cursor 里用 Agent 模式、又配置过自定义 OpenAI Key 或 Base URL 的开发者尤其是那种「Claude 和 Composer 都正常唯独 GPT 系列一用就炸」的情况。这里有个容易被忽略的点报错发生在模型运行之前属于请求校验失败所以你在 Cursor 里看不到任何 token 消耗也看不到模型输出。很多人第一反应是「GPT 5.6 是不是挂了」其实模型根本没被调用到。我先把结论摆出来这个问题的根因九成以上是 Cursor 的 OpenAI 路由被自定义配置劫持了。你在 Settings → Models 里填过自定义 OpenAI API Key 或者 Override OpenAI Base URLCursor 就会把 GPT 系列的请求转发到那个第三方网关而那个网关只支持传统的type: function工具格式不支持 Cursor Agent 注入的type: custom新格式。Claude、Gemini、Composer 走的是另一条线路不受这个覆盖影响所以它们正常。理解这一点之后排查方向就清晰了不是去改项目代码而是去查模型路由和工具格式这两层。下面我按「先定位、再配置、后验证」的顺序把整条路径拆开讲。2. 定位 tools 数组结构与 custom 类型兼容性要真正搞懂这个报错得先看清楚 Cursor Agent 到底往请求体里塞了什么。Agent 模式和 Ask 模式最大的区别就是 Agent 会注入大量工具定义文件读写、Shell 执行、代码搜索、MCP 工具等等。这些工具在请求体里长这样简化版{ model: gpt-5.6, tools: [ { type: function, function: { name: read_file, parameters: {} } }, { type: function, function: { name: list_dir, parameters: {} } }, { type: custom, name: apply_patch, description: ... } ] }注意第三个工具它的type是custom而且结构跟function完全不一样——custom类型没有嵌套的function对象name和description直接放在顶层。这是 OpenAI 新一套工具协议Responses API 体系的写法用来表达「自由格式输入」这类工具比如打补丁、执行任意命令。而传统的 Chat Completions 协议只认这一种{ type: function, function: { name: read_file, description: ..., parameters: { type: object, properties: {} } } }两套协议的差异就是报错里unknown variant custom, expected function的来源。接收端用的是严格的反序列化器Rust 的 serde 之类它把type当成枚举来解析枚举里只有function一个合法值遇到custom直接抛错连字段内容都不看。那为什么偏偏是tools[6]因为 Cursor 注入工具是有顺序的前几个通常是基础的文件操作到第 7 个左右才开始出现custom类型的工具比如apply_patch或者某些 MCP 工具。所以报错下标不固定取决于你开了多少 MCP Server、Cursor 版本注入了哪些工具。有人报tools[0]有人报tools[6]本质一样。这里要区分两种失败场景。第一种是网关完全不支持custom请求体一进去就被拒报的就是你现在看到的unknown variant。第二种是网关支持custom但字段校验更严可能报missing field function之类的错。两种都属于工具协议适配问题解决思路一致。再往下挖一层为什么自定义 Base URL 会劫持 GPT 路由Cursor 的模型配置里OpenAI 系列的 Base URL 覆盖是独立的一项。你一旦填了它所有gpt-*、o1-*、o3-*这类模型的请求都会走你填的地址。而 Claude、Gemini 用的是 Anthropic、Google 各自的配置项Composer 是 Cursor 自研模型走官方线路它们都不受 OpenAI Base URL 影响。这就完美解释了「只有 GPT 报错」的现象。所以排查的第一步不是去翻 Cursor 的日志文件而是打开 Settings → Models看 OpenAI 那一栏有没有被填过。这一步花不了两分钟却能省掉大量瞎猜。3. 可复制的 Base URL 与鉴权配置片段定位到问题之后接下来是配置层。这里分两种情况一种是你想彻底关掉自定义 OpenAI 配置让 GPT 5.6 走 Cursor 官方线路另一种是你确实需要用自己的 Key 和网关那就得选一个支持custom工具格式的兼容端点。先说第一种也是最省事的。打开 Cursor Settings → Models找到 OpenAI API Key 和 Override OpenAI Base URL 两项把它们清空。清空后 Cursor 会回落到官方基础设施工具格式由 Cursor 侧适配custom类型在内部就被转换掉了你不会再看到这个报错。这个操作不需要重启改完直接重选 GPT 5.6 重试即可。第二种情况你需要保留 BYOKBring Your Own Key那就得确保你的网关支持新工具协议。以 TaoToken 为例它的 API 端点是https://taotoken.net/api兼容 OpenAI 协议。在 Cursor 里配置时Base URL 填这个地址Key 填你在控制台生成的令牌。配置片段如下这是 Cursor 的 settings 结构示意实际在 UI 里逐项填写{ openai.apiKey: sk-你的TaoToken令牌, openai.baseUrl: https://taotoken.net/api, models: { gpt-5.6: { provider: openai, baseUrl: https://taotoken.net/api, modelId: gpt-5.6 } } }如果你用的是 Cline 或 Roo Code 这类插件配置写在settings.json里结构类似{ cline.apiProvider: openai, cline.openAiApiKey: sk-你的TaoToken令牌, cline.openAiBaseUrl: https://taotoken.net/api, cline.openAiModelId: gpt-5.6 }三件套必须齐全Base URL、Key、Model ID。少任何一个都会导致请求发不出去或者路由到错误端点。Model ID 要写准确gpt-5.6就是gpt-5.6不要写成gpt5.6或者带日期后缀的变体除非你的网关明确支持。如果你用的是 Codex CLI鉴权信息写在~/.codex/auth.json{ OPENAI_API_KEY: sk-你的TaoToken令牌, OPENAI_BASE_URL: https://taotoken.net/api }注意auth.json里的字段名是大写下划线风格跟 Cursor 的驼峰不一样别抄错。改完这个文件后Codex 下次启动会读取新配置。配置完成后建议先用一个最小请求验证网关是否真的支持custom工具。可以用 curl 直接打一发curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoToken令牌 \ -H Content-Type: application/json \ -d { model: gpt-5.6, messages: [{role: user, content: hi}], tools: [ {type: function, function: {name: test, parameters: {type: object, properties: {}}}} ] }如果这个请求返回正常说明基础鉴权和路由没问题。然后再把type换成custom试一次看网关是否接受。这一步能帮你区分「是网关不支持」还是「是 Cursor 配置没生效」。4. 验证请求与成功结果配置改完之后怎么确认问题真的解决了不能只看「这次没报错」得有一套可复现的验证步骤。第一步回到 Cursor新建一个空项目或者打开一个测试目录避免业务代码干扰判断。在 Agent 模式下选 GPT 5.6发一条会触发工具调用的指令比如「读取当前目录下的 README.md 并总结内容」。这条指令会强制 Cursor 注入文件读取工具如果工具格式不兼容必然复现报错。第二步观察响应。成功的情况下你会看到 Cursor 先显示「正在读取文件」之类的工具调用状态然后才输出总结内容。这说明tools数组被正确解析custom类型要么被网关接受要么被 Cursor 内部转换成了function。第三步如果还是报错去看报错信息里的下标有没有变化。如果从tools[6]变成了tools[0]说明工具数组结构变了但问题依旧大概率是网关仍然不支持custom。这时候可以临时关掉几个 MCP Server减少工具数量看报错是否消失。MCP 工具往往是custom类型的重灾区尤其是那些提供自由格式输入的工具。第四步做一个对照实验。同一个会话里把模型切到 Claude 或 Composer发同样的指令。如果它们正常而 GPT 5.6 报错那就再次确认是 GPT 路由的问题而不是 Cursor 本身或者项目环境的问题。我实测下来关掉自定义 OpenAI 配置之后GPT 5.6 在 Agent 模式下调用文件工具、Shell 工具都正常报错彻底消失。如果你保留 BYOK 但换了支持新协议的网关也能正常跑通关键是网关那一端要认custom。验证通过之后建议把这次成功的配置记下来尤其是 Base URL 和 Model ID 的准确写法。下次换机器或者重装 Cursor 时直接照抄能省掉重复排查的时间。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配好之后不一定一次成功下面这几个报错是我在排查过程中真实遇到过的按出现频率排一下。401 Unauthorized最常见。原因通常是 Key 填错、Key 过期、或者 Base URL 和 Key 不匹配比如把 A 网关的 Key 填到了 B 网关的地址上。排查方法用第 3 节的 curl 命令直接测如果 curl 也 401就是 Key 或地址的问题如果 curl 正常但 Cursor 报 401那就是 Cursor 里填的字段不对检查有没有多余空格或者换行。local proxy failed这个报错通常出现在 Cursor 尝试走本地代理转发请求时。原因可能是 Base URL 填成了localhost或者某个本地端口但本地服务没起来。解决办法确认 Base URL 是完整的公网地址带https://前缀不要填127.0.0.1。如果你确实在用本地网关确保它先启动再发请求。reading choices 相关报错这类错误说明请求发出去了但响应体结构不符合预期Cursor 在解析choices字段时失败。常见于网关返回了非标准格式比如把错误信息包在了choices里或者返回了流式和非流式混用的响应。排查方法用 curl 看原始响应确认返回的是标准 OpenAI 格式的 JSON。OAuth 相关报错如果你用的是需要 OAuth 鉴权的端点但 Cursor 只支持填静态 Key就会报 OAuth 失败。这种情况要么换成支持静态 Key 的端点要么在网关侧配置一个长期令牌。TaoToken 的 API Keys 页面可以生成长期有效的令牌直接填到 Cursor 里即可不需要走 OAuth 流程。还有一个隐蔽的坑Cursor 版本过旧。老版本 Cursor 注入的工具格式和新版网关的预期可能对不上升级到最新版往往能解决一些莫名其妙的兼容问题。排查清单可以按这个顺序走先看是不是 Agent 模式再看有没有配 OpenAI Base URL再看报错是不是只在 GPT 系列最后看错误信息里有没有custom/function/tools[n]。前四项都符合基本就是路由加工具格式的问题。6. 按场景选配置让 GPT 5.6 在 Agent 模式下稳定跑起来最后按使用场景给个配置建议你对号入座就行。如果你主要用 Cursor 订阅内的 GPT 5.6那就把 Settings → Models 里的 OpenAI API Key 和 Base URL 覆盖全部关掉。这是最稳的方案工具格式由 Cursor 官方适配你不需要关心custom还是function。缺点是没法用自己的 Key 计费。如果你需要用自己的 Key比如团队统一走一个网关那就选一个明确支持新工具协议的端点。配置时三件套写全Base URL 填https://taotoken.net/apiKey 填控制台生成的令牌Model ID 填gpt-5.6。配完先用 curl 验证再回 Cursor 测 Agent 模式。如果网关不支持custom复杂编码任务优先切 Composer 或 Claude把 GPT 5.6 留给纯问答场景。如果你同时用两种那就按任务切换要 GPT 5.6 跑 Agent 时关掉 BYOK要用自己 Key 时换模型或者关掉 Agent 模式。听起来麻烦但比每次报错再排查要省时间。需要生成令牌和查看接入文档的话可以从这里进API Keys 在https://taotoken.net/api-keys接入文档在https://taotoken.net/doc。想先验证模型对话是否通用https://taotoken.net/chat发一条消息最快。长期做编码和 Agent 任务可以看 Coding Planhttps://taotoken.net/coding-plan。这个报错本身不复杂难的是第一次遇到时容易往项目代码上想。记住那个判断口诀只有 GPT 报错、报错含custom、发生在模型运行前就去查 OpenAI Base URL 覆盖。查完基本就解决了。
返回列表