@lujianjun19/dsh-llm-github-copilot
GitHub Copilot LLM adapter: OAuth device-flow sign-in, live model discovery from the Copilot API, vision support for image-capable models (gpt-4.1, gpt-4o), and two wire protocols (Chat Completions and Responses API) with automatic endpoint routing per model.
Install
dsh plugin --profile web add @lujianjun19/dsh-llm-github-copilot
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-llm-github-copilot
[English](README.md) | 中文
为 DeepSeek Harness 提供 GitHub Copilot 登录。
本插件提供 GitHub OAuth 设备流登录页面和斜杠命令,并写入 Harness 内置 github-copilot 提供方使用的凭据。它不注册 LLM 适配器,也不维护模型目录:token 交换与刷新、模型可用性、请求、图片和流式处理均由 Harness 的 @deepseek-ai/dsh-llm-pi-ai 路由负责。可用模型取决于该路由的目录和账号权限,而不只取决于 Copilot 订阅。参见 [ADR-0002](docs/adr/0002-narrow-to-credential-provider.md)。
依赖要求
- 支持的 Harness 版本:
0.1.7-rc.1至0.1.7-rc.2、0.2.0-rc.1至0.2.0-rc.2,以及0.2.1-rc.2至0.2.1-rc.5,搭配@deepseek-ai/cordis^4.0.4。开发基线为0.2.1-rc.5。尚不支持0.2.2alpha 线;0.2.2-alpha.3仅作为不阻塞的 CI 预览运行。 - 声明的 Harness peer 范围:
^0.1.7-rc.1 || ^0.2.0-rc.1 || ^0.2.1-rc.2(见 [package.json](package.json))。不能把 npm 持续变化的latest/next标签当成支持承诺。验证范围见 [0.2.1 兼容性评估](docs/dsh-v0.2.1-rc.3-compatibility-analysis.md)。 - Harness 自带的
@deepseek-ai/dsh-llm-pi-ai路由,以及dsh-credentials-local等凭据服务。默认 Web profile 已提供这些组件,自定义组合需自行挂载。 - 一个有 Copilot 使用权限的 GitHub 账号。
- Node.js ≥ 24;执行
dsh plugin命令时,PATH中须有 pnpm ≥ 9。
安装
以下命令均针对 web profile。其默认目录是 ~/.dsh/profiles/web;设置了 DSH_HOME 时则为 $DSH_HOME/profiles/web。
从 npm 安装(推荐)
dsh plugin --profile web add @lujianjun19/dsh-llm-github-copilot -w
从 GitHub 安装
dsh plugin --profile web add github:lujianjun19/dsh-llm-github-copilot -w
这会安装仓库默认分支,可能包含尚未发布的变更。如果 pnpm 提示需要批准构建,请将提示中的精确键名加入 profile 的 pnpm-workspace.yaml 中的 allowBuilds,然后重新执行安装命令。不要根据仓库名猜测键名。
dsh plugin 会将本包注册到 profile 的 dsh.profile.bundles,并加载包内的 cordis.patch.yml。不要再向 profile patch 添加本插件的 insert 条目。 如果旧安装保留了手动注册,请在采用 bundle 安装时移除重复条目。
停止正在运行的实例,然后重新启动该 profile:
dsh web
更新插件的客户端 bundle 后,对已打开的浏览器标签页执行硬刷新。
更新
通过 Harness 的包管理入口更新,以保持 profile 的 pnpm lockfile 和 bundle 列表同步:
dsh plugin --profile web update @lujianjun19/dsh-llm-github-copilot --latest -w
如需指定版本,将 X.Y.Z 替换为目标版本号:
dsh plugin --profile web add @lujianjun19/dsh-llm-github-copilot@X.Y.Z -w
profile 的 pnpm minimumReleaseAge 策略可能延迟新版本的安装。如果实际安装版本偏旧,请检查该策略;确需放行时,仅将目标包和版本加入 minimumReleaseAgeExclude,再按精确版本安装。不要假设 @latest 一定选中了目标版本,也不要在 pnpm 管理的 profile 中混用 npm install。
重启 DSH 并硬刷新浏览器。在 设置 → GitHub Copilot 页面底部确认安装版本,或执行:
dsh plugin --profile web list @lujianjun19/dsh-llm-github-copilot
登录
打开 设置 → GitHub Copilot 并点击登录,也可以在 Harness 对话框中运行:
/copilot-login
在浏览器中打开提示的 GitHub 验证链接,输入设备码,并授权 GitHub App(VS Code)。Host 会在后台持续轮询,授权完成后自动保存凭据。Web 登录界面会自动更新,聊天命令弹出的登录对话框会在检测到登录成功后关闭。
查看已保存的凭据状态:
/copilot-status
authenticated 仅表示存在长期 token,不代表已通过实际 API 请求验证。只有下游路由已记录 availableModelIds 时,该命令才报告模型数量;它不会请求或列出模型。路由首次交换 token 前,可能没有数量信息。
删除本机凭据:
/copilot-logout
Web 界面会要求确认。退出登录会删除 grant 和可写的 token 引用,但不会撤销 GitHub 上的授权,也不会删除已配置的模型提供方。如果只读引用或环境变量/.env fallback 仍提供 token,界面和命令会明确提示退出尚未完成,需要移除外部 token 并重启。此时状态 API 返回 credentialRemaining: true,不会返回 token 本身。
使用已有 OAuth token
可以用长期 GitHub OAuth token 代替设备流登录:
export GITHUB_COPILOT_OAUTH_TOKEN='<your-github-oauth-token>' dsh web
凭据服务就绪后,插件仅在 grant 尚不存在时将该 token 写入 grant。已有 grant 的优先级高于环境变量或凭据引用。在将环境变量引用视为只读的 Harness 版本中,沿用过程只写入 grant,不尝试覆盖环境变量。
应使用兼容 Copilot OAuth 流程取得的 token,而不是短期 Copilot API token。本插件不校验 token 前缀,也不保证任意 PAT 或 gh auth login 取得的 token 都有 Copilot 权限。
使用环境变量 token 时,如需退出登录,请先从启动环境移除该变量,在没有它的环境中重启 DSH,再执行 /copilot-logout。否则旧版 Harness 会拒绝清除只读引用;新版虽可删除文件中的覆盖值,仍会回退到环境变量 token。后续启动时还可能被重新沿用。
选择模型
登录只发布凭据,不会添加提供方配置。
1. 打开 设置 → 模型,注意这与本插件的登录页面不同。
2. 如果尚未配置,选择添加提供方,从内置目录选择 github-copilot。使用已保存的 grant 时,无需自定义 endpoint 或粘贴 API key。
3. 保存后重新打开聊天输入框的模型选择器,在 github-copilot 下选择模型。
4. 发起请求。Harness 路由会按需将长期 GitHub token 交换为短期 Copilot token、自动刷新,并推导账号对应的端点。
在已验证的 Harness 基线上,模型选择器来自路由的配置目录。打开选择器不代表已经按账号动态发现模型或验证认证成功;退出登录后,目录条目也可能仍然可见。插件既不会过滤这些条目,也不会补充下游目录中没有的模型。参见[模型列表跟踪问题](docs/issues/github-copilot-model-list-refresh.md)。
如果从旧适配器版本(截至 0.4.5)升级,请把设置和会话中已移除的 github-copilot-official 提供方改为 github-copilot,并选择当前目录中可用的模型。已有 token 引用会被自动沿用;只要 token 仍然有效,就无需再次登录。
配置
本插件无需配置即可使用。唯一选项 oauthTokenEnv 指定读取已有 token 的凭据引用/环境变量名,并在该引用可写时保存一份登录后的 token:
- id: llm-github-copilot
config:
oauthTokenEnv: GITHUB_COPILOT_OAUTH_TOKEN
将这段覆盖配置写入活动 profile 的 cordis.patch.yml,不要再添加 insert。实时设置使用该 profile patch,不使用单独的 settings.yaml 设置段。
路由实际读取的 grant 始终位于 llm-pi-ai/github-copilot;修改 oauthTokenEnv 不会移动它,也不会创建第二个账号或提供方。模型、端点和请求行为均在 Harness 路由的 llm-pi-ai 条目下配置,不在本插件中。
开发
需要 Node.js ≥ 24 和 npm。在仓库根目录操作,修改 src/host/ 和 src/client/,不要编辑生成的 lib/ 文件。
npm ci npm run build # 合并源码分片 → lib/index.js 和 lib/client.js npm test # 测试生成产物、凭据交接、i18n、元数据和 README 契约 npm run check # 构建 + 产物测试 + npm pack 演练(prepack 会执行完整测试集)
针对所支持 RC 版本运行打包安装和真实浏览器检查:
npx playwright install chromium npm run test:harness -- 0.2.1-rc.2 npm run test:harness -- 0.2.1-rc.5
这些检查使用独立临时 DSH_HOME 和模拟 GitHub 响应,不使用你的凭据,也不发起真实 Copilot 请求。CI 还覆盖 0.2.0-rc.2 和 0.2.1-rc.3,并以不阻塞的预览方式运行 0.2.2-alpha.3。测试选项以及分支、PR、发布规则见[开发工作流](docs/WORKFLOW.md)。
全部检查通过后,可选择部署到本地 Web profile:
npm run deploy # 构建 → 产物测试 → 原子部署,保留回滚备份
该命令直接复制发布文件和运行时依赖,不执行 npm install,也不会替 profile 注册尚未存在的 bundle。首次安装当前 checkout 时,先构建,再执行:
dsh plugin --profile web add . -w
修改 Host 代码后需重启 DSH;仅修改 Client 代码时,硬刷新(Ctrl+Shift+R)通常就足够了。
回滚本地部署
npm run deploy 会将已有安装备份到 ${DSH_HOME:-$HOME/.dsh}/plugin-backups/dsh-llm-github-copilot/,最多保留五份备份。目录名包含版本号和时间戳。
停止 DSH,选定备份后替换安装目录,不要将备份复制到一个已存在的插件目录内部:
PLUGIN="${DSH_HOME:-$HOME/.dsh}/profiles/web/node_modules/@lujianjun19/dsh-llm-github-copilot"
BACKUP="${DSH_HOME:-$HOME/.dsh}/plugin-backups/dsh-llm-github-copilot/<backup-directory>"
# 执行以下命令前,先替换上面的 <backup-directory>。
test -d "$BACKUP" && mv "$PLUGIN" "${PLUGIN}.before-rollback-$(date +%Y%m%d%H%M%S)" && cp -a "$BACKUP" "$PLUGIN"
dsh web
这只恢复本地部署的包文件,不恢复 profile manifest 或 lockfile。对于 npm/GitHub 管理的安装,应改用
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::24,最后更新 2026-11-04