Copilot模型配置助手
从兼容OpenAI格式的API获取模型列表,并将模型配置到GitHub Copilot。适合对接 OpenAI、DeepSeek,以及任何实现了 GET /v1/models 的兼容服务。
亮点特色
无需先登录 GitHub Copilot 账号,即可直接配置模型。 插件直接维护本机的 Copilot 自定义模型配置,并将 API Key 安全写入 Copilot 使用的加密存储,不依赖 Copilot 登录状态完成配置。
这不会绕过 GitHub 的授权或订阅校验;配置后的模型能否在 Copilot 中使用,仍取决于本机 VS Code 是否已安装并支持 GitHub Copilot 自定义语言模型能力。
能做什么?
- 在活动栏打开「Copilot模型配置助手」,填写 Base URL 和 API Key 后拉取模型列表。
- 按模型 ID 排序展示,点击条目查看接口返回的完整 JSON。
- 保存过的连接会出现在「连接列表」,可一键恢复、复制地址或复制完整密钥。
- 把历史连接加入 Copilot:自动写入
chatLanguageModels.json,并按 Copilot 规范保存密钥占位符。
- 把单个模型加入已同步的 Copilot 连接组,或从组中移除。
- 已加入 Copilot 的连接和模型显示绿色状态点,并展示组名。
- 已有 Copilot 自定义连接会在启动或刷新时自动导入为历史记录,无需手工对照配置文件。
- 连接列表加载完成后,自动检查并补齐用户级
settings.json 中缺失的推荐配置,已存在的配置不覆盖;同时确保状态栏隐藏项包含指定 ID。
- 启动时可把自定义全局样式和脚本写入 VS Code 的
workbench.html,用于隐藏工作台元素,并在 Markdown 文件大纲中隐藏标题前的 #,保留原有树形层级。
安装与打开
在 VS Code 扩展面板搜索「Copilot模型配置助手」或扩展 ID zhifeiya.copilot-model-config-assistant 安装,也可用命令行:
code --install-extension zhifeiya.copilot-model-config-assistant
安装后左侧活动栏会出现「Copilot模型配置助手」图标。
也可以从本仓库构建开发版:
- 安装依赖:
npm install
- 构建:
npm run compile
- 在 VS Code 中打开本仓库,按
F5 启动扩展开发主机。
- 在新窗口左侧活动栏点击「Copilot模型配置助手」图标。
命令面板也可使用:
刷新模型列表
打开 Copilot模型配置助手设置
使用指南
1. 配置连接并获取模型
- 展开「连接配置」。
- 填写 Base URL,例如:
https://api.openai.com/v1
https://api.deepseek.com
https://api.deepseek.com/v1
- 填写 API Key。界面默认以密码框显示,历史列表只展示脱敏值。
- 点击 保存并获取模型。
插件会请求 {规范化后的 Base URL}/models。无论你是否手写 /v1,保存时都会整理成带 /v1 的地址。例如输入 https://api.openai.com,实际请求为 https://api.openai.com/v1/models。
保存成功后:
- Base URL 写入 VS Code 全局状态。
- API Key 写入 VS Code 密钥库,不会明文出现在 Webview 或普通日志里。
- 当前连接进入「连接列表」。同一地址、不同密钥会保存为两条独立记录。
首次打开侧边栏时不会自动请求模型。需要点击某条历史连接,或填写新配置后保存。
2. 使用连接列表
连接列表保存最近使用过的配置,便于在多个服务之间切换。
| 操作 |
说明 |
| 点击连接 |
恢复该条 Base URL / API Key,并重新拉取模型 |
| 复制地址 |
复制完整 Base URL |
| 复制密钥 |
从扩展宿主读取完整 API Key 并写入剪贴板,页面上仍只显示脱敏值 |
| 添加到 Copilot |
为该连接创建 Copilot 自定义语言模型组 |
| 从 Copilot 删除 |
删除对应 Copilot 组及其全部模型,历史记录保留 |
| 删除历史 |
仅删除插件里的这条记录,不影响 Copilot 配置 |
状态说明:
- 绿色小圆点:该连接已加入 Copilot。
- 「组 xxx」:当前 Copilot 组名。组名只用于显示,真正的关联依据是连接地址 + API Key。
- 已加入 Copilot 时,删除历史的「×」会隐藏,避免误删仍在生效的配置。
- 从 Copilot 删除后,「×」重新出现。
删除历史前会弹出确认。若连接仍在 Copilot 中,插件会要求先执行「从 Copilot 删除」。
3. 浏览模型
保存或选中连接后,「可用模型」会显示接口返回的模型,并按 ID 排序。
如果 Copilot 配置中仍保留某个但接口已不再返回的模型,该模型也会继续显示,前面的状态点为红色,并且只能点击「从 Copilot 删除」。
- 点击模型:下方展开详情,展示接口原始 JSON。
- 复制按钮:复制模型 ID。
- ↻ 刷新:重新请求当前连接的模型列表,并重新读取 Copilot 配置。
如果当前连接已经加入 Copilot,每条模型还会出现「添加到 Copilot / 从 Copilot 删除」:
- 只有连接已加入 Copilot 时,模型行才显示该按钮。
- 点击添加后,模型写入对应组的
models 数组。
- 已添加的模型显示绿色状态点,按钮变为「从 Copilot 删除」。
- 同一连接组内重复添加同一模型 ID 是幂等的,不会产生重复项。
- 不同连接可以添加相同的模型 ID,互不影响。
写入 Copilot 的模型字段规则:
id、name 都使用接口返回的模型 ID,两者相同。
url 使用当前连接地址,并只去掉结尾的 /v1 和多余斜杠,不会误删路径中间的 v1。
toolCalling、vision、上下文长度、推理力度等其余字段按 Copilot 自定义端点的固定值写入。
4. 同步到 Copilot
添加连接组
- 在连接列表点击「添加到 Copilot」。
- 输入组名。组名必须包含字母或数字,只能使用字母、数字、下划线或横线,例如
deepseek、my-openai。
- 确定后,插件在
chatLanguageModels.json 根数组中新增一组:
vendor 固定为 customendpoint
apiType 固定为 chat-completions
apiKey 只写占位符,例如 ${input:chat.lm.secret.xxxxxxxx}
models 初始为空数组
- 真实 API Key 写入 Copilot 实际使用的加密存储,不会写进 JSON。
组名不能重复。添加成功后,请到 Copilot 中选择该组模型并实际发起一次对话,确认密钥可用。
从 Copilot 删除连接组
点击「从 Copilot 删除」会弹出确认:该组下的全部 Copilot 模型都会被移除,但插件历史记录会保留。只有这一步才会改 Copilot 配置;删除历史记录不会自动删组。
旧配置导入
如果 chatLanguageModels.json 里已经有合规的自定义连接,而插件历史中还没有对应记录,启动或刷新时会自动导入:
- 只导入
vendor 为 customendpoint、apiType 为 chat-completions 的组。
- 必须能解析合法的密钥占位符。
- 其他供应商或 API 类型会保留,但不会变成插件历史。
- 导入后会显示组名、绿色状态点和对应模型状态。
5. 自动补齐推荐设置
扩展启动时,以及每次连接列表加载后,插件都会按内置清单逐项检查用户级 settings.json:
- 配置项不存在:写入插件内置的推荐值。
- 配置项已存在:无论取值是否与推荐值一致,都保持原样,不做覆盖。
- 逐项独立进行,某一项写入失败不会影响其余配置。
清单内容与仓库根目录 test.txt 一致,涵盖提交信息生成说明以及若干 chat.*、workbench.*、terminal.*、update.* 开关。读写全部通过 VS Code 配置 API 完成,由当前实例自行定位用户设置文件,因此 macOS、Windows、Linux 以及 Stable / Insiders / Portable 都无需额外适配,也不会改动工作区级或文件夹级配置。
已补齐的配置在下一次加载时会被识别为“已存在”而跳过;若你手工删除了某一项,重新加载窗口后会再次补上。个别配置项在当前 VS Code 版本中无法写入时,插件只在输出通道记录一条包含键名的日志,其余项照常处理。
每次校验还会检查当前 profile 状态数据库中的 workbench.statusbar.hidden,把 src/settings/defaults.ts 中 STATUS_BAR_ARRAY 列出的状态栏项追加进去。默认隐藏 Copilot Chat 的 chat.statusBarEntry 和远程主机指示器 status.host;以后想隐藏其他状态栏项,直接往该数组追加对应 ID 即可。
- 只追加缺失项,保留 VS Code 已有的其他隐藏项和顺序;重复执行是幂等的。
- 它不是
settings.json 配置项,而是 globalStorage/state.vscdb 的内部状态,因此不使用 VS Code 配置 API。
- 该状态由 VS Code 主进程缓存,写入后必须完全退出并重新打开 VS Code才会生效;仅重载窗口不会生效。
- 只在本地桌面窗口执行;Remote SSH、容器、WSL 和网页版会跳过。因此请先在本地窗口完成一次加载并重启,再连接远程主机;同一 profile 的远程窗口会复用已写入的隐藏状态。
- 数据库缺失、数据损坏或写入失败时,插件只在输出通道记录日志,不会覆盖原内容,也不会弹窗。
同一位置还会检查活动栏左下角账户头像的显示状态 workbench.activity.showAccounts(见 src/settings/defaults.ts 的 ACCOUNTS_VISIBILITY_KEY)。该键同样是 state.vscdb 中的 UI 状态,不是 settings.json 配置项。
- 你从未调整过账户头像显示状态时写入
false,即隐藏活动栏的账户图标。
- 你已经在活动栏右键菜单里勾选或取消过“账户”时,记录已存在,插件一律跳过,不改变你的选择(包括你手动重新显示它)。
- 重复执行是幂等的;数据库缺失、表缺失或写入失败时只记录日志,不覆盖原内容。
- 与状态栏隐藏项一样由 VS Code 主进程缓存,需完全退出并重新打开 VS Code才生效,只重载窗口可能看不到变化。
6. 全局样式(可选)
扩展启动时以及每次连接列表加载后,都会检查当前 VS Code 安装目录的 workbench.html,把 src/settings/defaults.ts 中的全局样式和脚本写入带标记的块。默认隐藏聊天输入框右上角的下拉操作:
.dropdown-action-container {
display: none !important;
}
同时,脚本只在当前活动编辑器是 Markdown 文件(.md 或 .markdown)时处理大纲标题,将 ### 标题 显示为 标题。它只修改大纲条目的显示文本,不改变大纲的缩进、父子关系或折叠状态;切换到其他文件类型时会恢复原始标题。脚本兼容不同 VS Code 版本的大纲 DOM 结构,包括旧版的 .outline-element-label 和新版的 .monaco-highlighted-label。
- 只维护自己的标记块,保留 CSP、VS Code 原有内容以及其他扩展(例如 Custom CSS Hot Reload)的补丁。
- 不删除 CSP;内联脚本使用随机 nonce,并同步加入当前
workbench.html 的 script-src。
- 写入的是当前 VS Code 安装目录,属于非官方修改。VS Code 升级会覆盖该文件;扩展会在后续启动或连接列表加载时重新写入,样式在之后的一次重载/重启后生效。
- 仅本地桌面版执行;Remote SSH、容器、WSL、网页版跳过。
- 安装目录不可写时会记录日志,不会覆盖原文件,也不会弹窗。
- 将
WORKBENCH_CUSTOM_CSS 和全局脚本同时设为空字符串可移除已写入的块;卸载扩展不会自动清理该块,需要手动删除标记块,或先用空字符串启动一次。
- 修改
WORKBENCH_CUSTOM_CSS 或全局脚本后,重载窗口生效。
写入样式后,VS Code 下次启动会检测到 workbench.html 与官方校验值不一致,并弹出“你的 VS Code 安装似乎已损坏”的警告。为避免这个提示,扩展会在成功维护样式块之后,按 VS Code 自身完整性服务的状态格式,向公共状态库(<用户目录>/User/globalStorage/state.vscdb 的 integrityService)预先写入 {"dontShowPrompt":true,"commit":"<当前安装目录 product.json 的 commit>"},效果等价于手动点过该提示里的“不再显示”。
- 只在样式确实写入过
workbench.html 时处理;WORKBENCH_CUSTOM_CSS 为空时不会改动你的偏好。
- 只补齐这两个字段,保留该记录里原有的其他字段;数据损坏或数据库不可用时报错且不覆盖原内容,错误只写入输出通道。
- 该偏好与
commit 绑定,VS Code 升级后 commit 变化会自动重新写入,因此升级后仍然不会弹提示。
- 由于提示被抑制,安装文件被其他程序意外破坏时也不会再提醒;如需恢复提醒,可在状态库中删除
integrityService 记录。
- 自定义 profile 下写的是公共的
User/globalStorage/state.vscdb,因为该状态属于 application 作用域。
7. 生效时机与日志
上面三项自动写入的触发条件相同(扩展启动、以及每次连接列表加载后各执行一次),但生效条件不同:
| 写入内容 |
生效条件 |
推荐用户设置(settings.json) |
立即生效,无需重启 |
状态栏隐藏项(state.vscdb) |
必须完全退出并重新打开 VS Code;仅重载窗口(Reload Window)不会生效 |
活动栏账户头像显示状态(state.vscdb) |
同上,需完全退出并重新打开 VS Code |
全局样式(workbench.html) |
需重载窗口才加载;VS Code 升级覆盖该文件后,会在下次启动时重新写入,同样需再重载一次 |
因此「刚装好插件、只重载了窗口」时,可能只看到推荐设置已写入,而状态栏和全局样式看起来没变化,这属于预期行为。
这些自动写入的失败不会弹窗打扰,统一记录在输出面板的「Copilot模型配置助手」通道里,排查时按 Ctrl+Shift+U(macOS 为 Cmd+Shift+U)选择该通道查看。
数据如何保存
| 数据 |
保存位置 |
说明 |
| Base URL |
VS Code 全局状态 |
跨窗口复用当前连接地址 |
| 当前 API Key |
VS Code SecretStorage |
扩展私有密钥库 |
| 连接历史 |
VS Code 密钥库 |
含地址、密钥和稳定 connectionId |
| Copilot 连接组 |
chatLanguageModels.json |
只写占位符,不写明文密钥 |
| Copilot 真实密钥 |
Copilot 使用的加密存储 |
与官方「管理语言模型」写入方式对齐 |
安全约定:
- 配置文件、错误提示、普通日志、Webview 消息都不会输出完整 API Key。
- 复制密钥仍可用,但由扩展宿主直接读取,不会把明文送到页面脚本。
- 删除 Copilot 组时会清理对应密钥;若密钥仍被其他组使用,则不会误删。
- 修改配置时只增删本插件管理的组和模型,保留文件中其他供应商配置以及未知字段。
- 写入采用读取最新内容 + 临时文件再替换,避免中途中断损坏原文件。
- 文件不是合法 JSON、根节点不是数组、无权限或写入失败时,不会覆盖原文件。
Copilot 配置路径
插件按当前 VS Code 实例定位配置,不会写死普通版 Code 目录。
常见位置:
- macOS:
~/Library/Application Support/Code/User/chatLanguageModels.json
- Windows:
%APPDATA%\Code\User\chatLanguageModels.json
- Linux:
~/.config/Code/User/chatLanguageModels.json
- Insiders:上述路径中的
Code 替换为 Code - Insiders
- Portable:
{VSCODE_PORTABLE}/user-data/User/chatLanguageModels.json
文件不存在时会自动创建父目录和空数组 []。路径在每次实际操作前重新计算。
当前限制
- 最低支持 VS Code 1.120.0;低于该版本时
engines.vscode 校验会导致无法安装。
- 第一版只支持本地桌面版 VS Code 窗口。
- Remote SSH、容器、WSL、网页版 VS Code 暂不支持管理 Copilot 配置,界面会给出明确提示。
- 需要本机已安装并可使用 GitHub Copilot 自定义语言模型能力。
- 模型写入 Copilot 后,部分能力字段(工具调用、视觉、推理力度等)使用固定值,不根据上游接口动态探测。
开发
npm install # 安装依赖
npm run compile # 类型检查、lint 与开发构建
npm test # 运行扩展测试
npm run package # 生产构建,产物在 dist/
npm run vsix # 打包 VSIX 安装包到 out/
按 F5 启动扩展开发主机。修改代码后可重新启动调试,或在开发主机中执行 Developer: Reload Window。
生成 VSIX 安装包执行 npm run vsix,产物为 out/<name>-<version>.vsix。打包前会自动执行 vscode:prepublish 生产构建,vsce 已作为开发依赖安装,无需全局安装。安装到其他机器:
code --install-extension out/<name>-<version>.vsix
发布到 VS Code 扩展市场(需要 Azure DevOps Personal Access Token,且 package.json 的 publisher 与已注册的发布者 ID 一致):
npx vsce login zhifeiya # 只需一次,PAT 存入系统钥匙串
npm run publish:patch # 或 npm run publish / npm run publish:pre