D.Nova for Copilot Chat
把公司预置的大模型接入 GitHub Copilot Chat 的模型选择器,安装后只需配置对应模型的 Key 即可在 Copilot Chat 中直接使用。
支持的模型(即网关实际开放的 4 个):
| 模型 |
发送给网关的 model |
声明上下文 |
视觉输入 |
工具调用 |
DeepSeek-V4-Flash |
DeepSeek-V4-Flash |
131072 |
❌ |
✅ |
Qwen3.5-Light |
Qwen3.5_LIGHT |
32768 |
✅ |
✅ |
Kimi-K2.6 |
Kimi-K2.6 |
16384 |
✅ |
✅ |
Qwen3.5-VL |
Qwen3.5-VL |
32768 |
✅ |
✅ |
上表的「视觉输入 / 工具调用」均经过真网关实测(2026-09-03):
四个模型都能流式返回 tool_calls;DeepSeek-V4-Flash 收到图片时网关返回空流(即不支持视觉),
其余三个能正确识别 100×100 纯蓝 PNG。
插件基于 VS Code 1.116+ 的 languageModelChatProviders 原生 API(BYOK,自带密钥),
无需额外进程、无需 Docker,直接复用 Copilot Chat 的代理模式、工具调用、MCP、指令等全部能力。
协议兼容:公司网关需提供 OpenAI 兼容的 /v1/chat/completions 接口(Qwen / Kimi / GLM 默认均支持),
鉴权方式为 Authorization: Bearer <key>。
⚠️ 版本适用范围:本版本支持 个人 OpenAPI Key(每位开发者各自申请的令牌,存入本机钥匙串)。
鉴权方式为 Authorization: Bearer <key>,网关返回 401 表示 Key 无效或过期,重新填入即可,无需 SSO。
安装
cd d-nova-for-copilot
npm install
npm run compile
npx vsce package # 生成 d-nova-for-copilot-x.x.x.vsix
在 VS Code / Cursor / 任意兼容 Open VSX 的编辑器里:扩展 → 从 VSIX 安装…,选择生成的 .vsix。
修改发布者:编辑 package.json 的 publisher 字段(当前占位为 DNova)。
配置步骤
1. 设置网关 Base URL
打开 设置 → 搜索 d-nova,把 Company-llm: Base Url 改为公司网关地址,例如:
{
"d-nova.baseUrl": "https://gateway.DNova.com/v1"
}
如果某个模型有独立的网关地址,可在 d-nova.models 下按模型单独覆盖(见下文)。
2. 配置各模型的 Key
命令面板(Ctrl/Cmd + Shift + P)→ 运行 「D.Nova: 配置模型 API Key」:
- 选择要配置的模型(或「全局 Key(所有模型共用)」)。
- 粘贴该模型的 API Key。
Key 通过 VS Code SecretStorage 安全保存在系统钥匙串中,不会写入明文配置文件。
当前仅支持个人 API Key 模式:请填入你本人申请的 Key。
团队共享 Key、企业统一鉴权等(团队 API)暂不支持,后续版本提供。
如果公司网关所有模型共用一把 Key,直接选「全局 Key」配置一次即可;
若每个模型各自的 Key,则逐个选择模型分别配置。
3. 选择模型开始对话
打开 Copilot Chat,在模型选择器里即可看到 4 个模型(未配置 Key 的会显示 ⚠ 提示)。
选中心仪模型直接对话,支持工具调用、代理模式、MCP 等。
设置项
| 设置 |
默认 |
说明 |
d-nova.baseUrl |
https://your-gateway.example.com/v1 |
网关 OpenAI 兼容 Base URL(所有模型默认共用) |
d-nova.apiKey |
"" |
(可选)全局 Key 兜底,写入 settings 明文,不推荐;建议用命令配置到钥匙串 |
d-nova.maxTokens |
0 |
单条回复最大输出 token;0 表示不限制 |
d-nova.temperature |
-1 |
采样温度;-1 表示使用网关默认 |
d-nova.debug |
false |
输出详细日志(每个 SSE 分片、请求明细)到「D.Nova」输出面板。排查“空响应”时打开 |
d-nova.models.<modelId>.baseUrl |
"" |
该模型专用 Base URL(覆盖全局) |
d-nova.models.<modelId>.modelId |
模型自身 id |
发送给网关的模型名(网关命名不同时覆盖) |
modelId 取值:deepseek-v4-flash / qwen3.5-light / kimi-k2.6 / qwen3.5-vl。
示例(每模型独立网关 + 模型名映射):
{
"d-nova.baseUrl": "https://gateway.DNova.com/v1",
"d-nova.models": {
"deepseek-v4-flash": { "modelId": "DeepSeek-V4-Flash" },
"qwen3.5-light": { "baseUrl": "https://qwen.DNova.com/v1" }
}
}
命令
| 命令 |
说明 |
D.Nova: 配置模型 API Key |
选择模型并输入 Key(存钥匙串) |
D.Nova: 清除模型 API Key |
选择模型并清除 Key |
D.Nova: 打开设置 |
打开本插件设置页 |
排错
- 模型带 ⚠ 且无法对话:未配置该模型 Key,运行「配置模型 API Key」。
- 网关连接失败:检查
d-nova.baseUrl 是否正确、网络是否可达、Key 是否有效。
- 网关返回 401:Key 无效或已过期,用「D.Nova: 配置模型 API Key」重新填入正确的 OpenAPI Key(不是 SSO 问题)。注意每个模型可单独配 Key,若某模型单独配过 Key,会覆盖全局 Key。
- 提示“网关限流”:网关限制约 15~20 次请求 / 2 分钟,超时后进入 10 分钟惩罚期。Copilot 代理模式一轮对话会连发多次请求,较易触发,等 10 分钟自动恢复。
- 图像发送给非视觉模型报错:
DeepSeek-V4-Flash 不支持图片,附带图片时网关会返回空响应,请换用其余三个模型。
- 详细日志:输出面板搜索「D.Nova」;排查空响应时把
d-nova.debug 设为 true 可看到逐分片明细。
关于 “Sorry, no response was returned.”
网关对部分错误不返回 4xx,而是返回 HTTP 200 + 零字节响应体(实测:请求内容超长、模型名不被支持都会这样)。
插件已把这种情况识别为「空响应」并给出可读报错,常见原因与处理:
| 原因 |
处理 |
| 请求内容超出模型上下文上限 |
缩短上下文(关闭无关文件、新建会话);优先用 DeepSeek-V4-Flash |
| 模型名与网关目录不一致 |
用 d-nova.models.<modelId>.modelId 覆盖(见上表“发送给网关的 model”) |
| 网关限流 |
等待 10 分钟 |
插件为各模型声明的 maxInputTokens 刻意取得保守(Kimi 仅 16k),
因为 Copilot 依据该值决定裁剪多少上下文——数值虚高必然导致静默空响应。
已知限制(本版本)
- 推理过程(reasoning)不展示:部分模型返回的
reasoning_content 目前不会在 Copilot Chat 中单独显示(不影响最终回答)。
- 对话中 4xx 报错:若开启工具调用 / 代理模式时网关返回
400,多为网关对 OpenAI 兼容细节要求严格所致,请确认网关支持 tool_calls;纯文本对话不受影响。
开发
npm install
npm run watch # 监听编译
# 在 .vscode 中 "Run Extension" 启动扩展开发宿主
npm run compile # 一次性编译
npx vsce package # 打包 VSIX
源码结构:
src/
extension.ts # 入口,转发 activate/deactivate
consts.ts # 模型清单、vendor、常量
config.ts # 读取 baseUrl / modelId / maxTokens
auth.ts # 每模型 Key 管理(SecretStorage)
client/ # OpenAI 兼容 SSE 客户端 + 错误处理
provider/ # 消息转换、模型信息、流式响应、Provider 实现
runtime/ # 激活、注册 Provider、注册命令