1. 为什么要在 VS Code Copilot 里接第三方 GPT Reasoning 模型
VS Code 自带的 Copilot Chat 默认只走官方模型通道,模型列表里能选的东西是固定的。如果你手上有第三方 OpenAI-compatible 服务提供的 GPT Reasoning 模型,想直接在 Copilot Chat 的模型下拉框里选它、用它的 reasoning 档位来读代码或做重构,就需要一个中间扩展把两边接起来。oai-compatible-copilot就是干这个的:它把第三方 OpenAI-compatible 接口包装成 Copilot Chat 能识别的模型提供方,让你在 VS Code 界面里像选官方模型一样选第三方模型。
这套配置适合谁?适合已经在用 VS Code + Copilot Chat、手里有第三方 API Key、想用 GPT Reasoning 系列模型做代码理解或长上下文推理的人。不适合完全没接触过 settings.json 的人硬上,因为配置写错一个逗号就会整段失效。我试过在 Remote-SSH 场景下配,最容易翻车的不是 Key,而是配置写到了本地而扩展跑在远程,两边对不上。
这篇按「先跑通、再解释、后排障」的顺序写,所有操作都在 VS Code 界面里完成,不涉及命令行改扩展目录。示例扩展版本按oai-compatible-copilot 0.3.6来,不同版本字段可能略有差异,以你实际装的版本为准。
2. TaoToken 前置:拿到统一 Key 和 API 通道
在写 settings.json 之前,先把两样东西准备好:一个可用的 API Key,一个明确的 base URL。TaoToken 在这里扮演的是统一 Key / API 通道的角色,你不需要为每个模型单独记一套地址,用同一个通道就能把 GPT Reasoning 模型接进 VS Code。
第一步,打开控制台创建 API Key。地址是https://taotoken.net/console,登录后在 API Keys 页面新建一个 Key,复制出来先存到安全的地方,后面要填进 settings.json。注意 Key 只在创建时完整显示一次,关掉页面就看不到了。
第二步,确认 API 通道地址。TaoToken 的 API 入口是https://taotoken.net/api,在 oai-compatible-copilot 里填 baseUrl 时,通常写到/v1这一层,也就是https://taotoken.net/api/v1。不要自己手动拼/v1/responses,扩展会根据 apiMode 自动补路径,你多拼一段反而会 404。
第三步,确认你要用的模型 ID。在模型对话页面可以先试一下目标 GPT Reasoning 模型能不能正常回话,确认模型 ID 拼写。地址是https://taotoken.net/models,选好模型发一句「你好」验证连通性,能回就说明 Key 和通道都没问题。
注意:Key 不要写进会提交到 Git 的文件里。settings.json 如果是用户级配置,一般不会被项目仓库带走,但如果你用的是工作区级配置,务必确认它没被纳入版本管理。
3. 可复制配置:settings.json 骨架与逐项说明
这一节给可直接粘贴的配置。核心原则是:配置要写到oai-compatible-copilot实际运行的那一侧。本地 VS Code 就改用户配置,Remote-SSH 且扩展装在远程就改远程配置。
先打开正确的 settings.json。按Ctrl + Shift + P打开命令面板,本地环境输入Preferences: Open User Settings (JSON)回车;Remote-SSH 环境输入Preferences: Open Remote Settings (JSON)回车。如果你不确定扩展跑在哪一侧,打开扩展面板搜oai-compatible-copilot,看它显示在 Local 还是 Remote 分组。
然后在最外层{ ... }里加入下面这段:
{ "oaicopilot.baseUrl": "https://taotoken.net/api/v1", // 仅排查问题时临时打开;平时建议注释掉或使用默认日志级别。 // "oaicopilot.logLevel": "debug", "oaicopilot.retry": { "enabled": true, "max_attempts": 3, "interval_ms": 1000, "status_codes": [] }, "oaicopilot.models": [ { "id": "your-gpt-model-id", "displayName": "GPT reasoning xhigh", "configId": "xhigh", "owned_by": "openai", "context_length": 256000, // 按需要选择 reasoning 档位,例如 medium / high / xhigh。 "reasoning_effort": "xhigh", "apiMode": "openai-responses" } ] }需要替换的占位符对照如下:
| 占位符 | 替换成什么 |
|---|---|
https://taotoken.net/api/v1 | 你的 API base URL,通常只填到/v1 |
your-gpt-model-id | 服务商给你的模型 ID |
displayName | VS Code 模型列表里显示的名字,可自起 |
configId | 区分不同 reasoning 档位,如 medium、high、xhigh |
reasoning_effort | reasoning 档位,如 medium、high、xhigh |
context_length | 模型上下文长度,按服务商能力填 |
如果你只需要中等推理强度,把模型对象改成:
{ "id": "your-gpt-model-id", "displayName": "GPT reasoning medium", "configId": "medium", "owned_by": "openai", "context_length": 256000, "reasoning_effort": "medium", "apiMode": "openai-responses" }这里最容易混淆的是baseUrl和apiMode的关系。baseUrl通常写到/v1,apiMode: "openai-responses"告诉扩展实际请求时走 Responses API,所以最终请求路径会变成/v1/responses。你不需要在 baseUrl 里手动补/responses。
关于 reasoning 和 Responses API 的关系,严谨说法是:不能简单讲「reasoning 必须走 Responses API」。Chat Completions 接口也出现过reasoning_effort这类参数,Responses 接口同样支持 reasoning 配置。第三方 OpenAI-compatible 服务是否支持 Chat Completions 的 reasoning,要看服务商实现。本文推荐优先尝试apiMode: "openai-responses",是为了让扩展明确走 Responses API,便于和 reasoning 配置配合,但这不代表 Chat Completions 一定不能做 reasoning。
保存后按Ctrl + S。如果 VS Code 提示 JSON 格式错误,先检查逗号和括号。settings.json 是 JSONC,允许//注释,所以示例里的注释可以保留。
4. 验证请求:从模型选择到日志确认
配置写完不等于跑通,要逐项验证。第一步,重新加载窗口。按Ctrl + Shift + P打开命令面板,输入Developer: Reload Window回车。注意这是命令面板里的命令,不是在终端里敲的。
第二步,在 Copilot Chat 里选模型。打开 Copilot Chat 面板,找到模型选择入口,选你刚配的displayName,比如GPT reasoning xhigh。输入一句简单问题:
你好,用一句话介绍你当前使用的模型配置。能正常回答,说明基础配置已经成功。
第三步,确认请求真的走了 Responses API。临时打开 debug 日志,在 settings.json 里加一行:
"oaicopilot.logLevel": "debug"保存后再次Developer: Reload Window,复现一次对话。然后按Ctrl + O打开文件窗口,找到日志目录。Windows 下是C:\Users\<用户名>\.copilot\oaicopilot\logs\,Linux / macOS 下是~/.copilot/oaicopilot/logs/。打开当天的日志文件,文件名类似oaicopilot-YYYYMMDD.log。
在日志里按Ctrl + F搜索/responses。如果能搜到/v1/responses,说明请求走了 Responses API。再搜reasoning,能看到reasoning或reasoning_effort,说明 reasoning 配置被带进了请求。正常请求大致长这样:
{ "url": "https://taotoken.net/api/v1/responses", "requestBody": { "model": "your-gpt-model-id", "reasoning": { "effort": "xhigh" } } }判断标准很直接:看到/v1/responses说明用了 Responses API;看到reasoning.effort说明档位带上了;如果看到的是/v1/chat/completions,说明当前配置没走 Responses API,优先检查apiMode是不是写成了别的值。
抓到日志后,把"oaicopilot.logLevel": "debug"这行注释掉,别长期开着,日志可能比较大,也可能包含请求内容。
5. 本篇常见错排查:400 报错与 Python 扩展冲突
配这套东西最常见的 400 不是模型不可用,而是 tool schema 校验失败。典型报错长这样:
Responses API error: [400] Bad Request Invalid schema for function 'configure_python_environment': {} is not of type 'array'. param: tools[36].parameters code: invalid_function_parameters URL: https://taotoken.net/api/v1/responses这个错误表示请求发到 API 后,服务端在校验 tools 定义时失败,模型还没开始回答。常见原因是某些 VS Code 扩展向 Copilot 暴露了工具,oai-compatible-copilot把这些工具转成 OpenAI-compatible 的 tools 格式后,第三方 API 对 schema 校验不通过。
configure_python_environment通常来自 Microsoft Python 扩展,扩展 ID 是ms-python.python。它的用途是让 AI 在处理 Python 项目时配置解释器、虚拟环境、依赖等。装了 Python 扩展后,这个工具可能被带进请求,遇到校验严格的 API 就报invalid_function_parameters。
排查动作:打开扩展面板(Ctrl + Shift + X),搜Python,找到 Microsoft 发布的那个,点开详情确认 ID 是ms-python.python。如果当前项目不是 Python 项目,临时禁用它:在扩展详情页点Disable,VS Code 问禁用范围时按实际情况选本地或远程。然后Developer: Reload Window,重新测试。
禁用 Python 扩展的副作用要心里有数:会影响 Python 补全、跳转、类型检查、Pylance、调试、测试发现和运行,以及 AI 自动配置 Python 环境。通常不影响 C / C++ / 嵌入式项目编辑、SCons / Make / CMake 编译、终端手动跑python、以及 Copilot 普通聊天和改非 Python 代码。恢复就是重新 Enable 再 Reload 一次。
其他几个高频坑一并列出来:
baseUrl只填到/v1,不要自己拼/v1/responses,多拼会 404。reasoning_effort不一定是xhigh,按需求配medium、high、xhigh。oaicopilot.logLevel: "debug"只在接入或排障时临时开。- settings.json 是 JSONC,可以有注释,但逗号和括号仍要正确。
- 出现
tools[x].parameters优先怀疑 tool schema 兼容问题,别先怀疑模型不可用。 - Remote-SSH 场景确认配置写到了扩展实际运行的那一侧。
6. 后续怎么用:模型对话、Coding Plan 与接入文档
跑通之后,日常使用就是两件事:验证模型和长期编码。想快速验证某个 GPT Reasoning 模型在当前通道下是否可用、reasoning 档位是否生效,直接去模型对话页面发消息试,地址是https://taotoken.net/models,比在 VS Code 里反复改配置快得多。
如果你打算把这类模型长期用在编码、Agent 或批量代码任务上,按量计费不一定划算,可以看 Coding Plan,地址是https://taotoken.net/coding-plan,适合有稳定编码需求的场景。配置过程中遇到字段含义、路径拼接、报错码不确定的,接入文档在https://taotoken.net/doc,API Keys 管理在https://taotoken.net/api-keys。
最后留一个实用习惯:每次改完 settings.json,先Developer: Reload Window再测,别在旧窗口里反复试。配置类问题九成出在没重载或写错了运行侧,剩下那一成才轮到模型和通道。