dsh-cannbot-connect:在 DSH 里复用 CANNWork 登录态接入 CANNBOT 网关

前言

在 DeepSeek Harness(DSH)里接第三方模型,常见做法是单独配置 provider、填 API Key 或走一套 OAuth。若你已经在 opencode 里通过 CANNWork(cannbot-toolkit 扩展)登录过 CANNBOT 网关,网关侧实际需要 Virtual Key(VK)与 JWT 同时出现在请求里,缺一就会 401。再为 DSH 重复登录或手抄凭据,既容易过期不同步,也增加密钥散落面。

下面介绍维护者 gentle-knight 的插件 dsh-cannbot-connect:把 CANNBOT 网关模型注册进 DSH,从本机 CANNWork 已写入的文件读取 VK 与 JWT,在每次 LLM 请求里自动带上,不另起 OAuth、不需要在插件里填 key。仓库声明 MIT 许可,当前版本 0.2.1;GitHub 镜像见文末链接,安装命令以 README 为准(clone 源为 gitcode.com)。

这是什么

dsh-cannbot-connect 是一个 first-class LlmAdapter 插件:用 fetch 与 SSE 直接对接 CANNBOT 的 OpenAI 兼容网关(默认 https://cannbot.hicann.cn/gateway/compatible-mode/v1),零运行时依赖。它不做凭据签发,只消费 CANNWork 维护的本机文件;DSH 侧每次请求现读磁盘,CANNWork 刷新令牌后下一个 DSH 请求即可生效,无需重启 DSH。

网关实测行为(README 归纳):

请求携带 网关响应
只带 VK 401,提示需要 Access Token
只带 JWT 401,提示需要 Virtual Key
VK + JWT 200,正常返回

核心功能

凭据来源与查找顺序

插件按顺序自适应 opencode 的数据目录与配置目录(兼容不同版本 CANNWork/opencode 的落盘位置):

  1. 数据目录:$XDG_DATA_HOME/opencode(默认 ~/.local/share/opencode)
  2. 配置目录:$XDG_CONFIG_HOME/opencode(默认 ~/.config/opencode)
凭据 文件 字段 维护方
JWT session.json accessToken CANNWork,约 24h 有效并自动刷新
VK auth.json cannbot.key CANNWork

JWT 先查数据目录的 session.json,再查配置目录。VK 在两处 auth.json 中按 cannbot.key 查找;旧版 opencode 可能把 vk- 前缀的值放在 cannbot-cli.refresh,插件仅接受 vk- 开头作为兜底,避免误把刷新令牌当 VK 发出。

DSH 侧行为

  • 接入点:ctx.llm.registerAdapter(['cannbot'], adapter)。
  • 模型目录:用 JWT 请求个人模型列表;内置兜底模型先挂载,catalog 拉取成功后替换;对 builtinModels 与 personalModels 按「personal 优先」去重,避免 DSH 因重复 id 报 INVALID_CATALOG。
  • 对话能力:支持文本与推理档位(minimal/low/medium/high/max/xhigh;网关不接受 reasoning_effort=off);assistant 历史中的 reasoning_content 与 tool_calls / tool_call_id 多轮往返已按 README 说明实现。
  • 输入限制:对外只声明文本输入;图片/文件块会被明确拒绝。
  • 错误映射:失败归类到 DSH 错误体系(如 AUTH、RATE_LIMIT、SERVER 等),并按 Retry-After 回填 providerRetryAfterMs。

安全相关(仓库已说明)

  • baseURL / modelsURL 默认必须 https(回环地址允许 http);请求带 redirect: 'error',不跟随重定向。
  • 错误正文对 JWT/VK 做脱敏;凭据经校验后再写入 HTTP 头;插件只读凭据文件、不写盘。仓库不含密钥,VK/JWT 均来自运行时本机文件。

前置条件

  1. 已安装 CANNWork 并成功登录。未登录时插件仍会注册但不可用;可先确认某处 session.json 存在 accessToken。
  2. DSH 内核:>=0.2.1-rc.2 且 <0.3.0(engines.dsh 与 peerDependencies 中 @deepseek-ai/dsh-llm 区间需同时满足)。
  3. Node.js:^22.19.0 || >=24.0.0。
  4. 网络可访问 cannbot.hicann.cn。

安装与启用

插件无运行时依赖,README 给出的安装步骤如下。clone 完成后用本地路径加入 profile:

git clone https://gitcode.com/gentle-knight/dsh-cannbot-connect.git
dsh plugin --profile desktop add file:$(pwd)/dsh-cannbot-connect

然后重启 DSH,模型选择器中应出现 CANNBOT 分组。

若 CLI 对 desktop profile 报 EPERM(部分发行版不允许独立 CLI 写 App 管理的 ~/.dsh/profiles/desktop),可改用 Web/TUI profile,或按 README §7 在 profile 的 package.json 与 cordis.patch.yml 中手动挂载;仓库自带 cordis.patch.yml,bundle 安装时会通过 dsh.bundle.patch 生效。可选配置示例:

- id: llm-cannbot
  name: dsh-cannbot-connect
  config:
    baseURL: https://cannbot.hicann.cn/gateway/compatible-mode/v1
    streamIdleTimeoutMs: 300000

验证与典型用法

开发期验证需安装 dev 依赖后运行 e2e(使用真实本机凭据与网关):

npm install
node e2e.mjs

成功时 README 示例会打印 jwt: present、vk : present、可用模型数量,以及文本回合、工具调用与工具结果回放等 ok 行,并以 PASS: CANNBOT is reachable through the DSH LLM seam. 结束。常见失败:jwt: MISSING 表示未登录 CANNWork;catalog 未加载可能为 JWT 过期,需重开 CANNWork 后再试。

离线安全回归(无需 CANNBOT 登录):

npm test

适用场景与注意

适合:已在 opencode 使用 CANNWork、希望在 DSH 同一账号可见模型 roster 下直接选 CANNBOT 分组,且接受网关仅文本输入与固定推理档位集合的用户。

务必知晓:

  • 插件以当前 DSH 进程权限运行,会读取 opencode 凭据文件并向配置的 baseURL / modelsURL 发送 JWT 与 VK;安装前应阅读源码与 MIT 许可证,确认可接受凭据复用范围。
  • 强依赖 CANNWork 续期 JWT;DSH 侧不缓存凭据文件内容,但令牌过期后请求会失败,需依赖 CANNWork 恢复登录态。
  • 换账号后重新请求即可反映新模型列表,无需重启;升级 DSH 内核后若兼容性判定变化,请对照 engines.dsh 区间并重跑 node e2e.mjs。
  • DSH 插件目录为社区站点 SkillHub 插件页 与 awesome-dsh-plugins 等生态索引,与 DeepSeek / 幻方无官方从属关系;本文事实来自仓库 README 与 package.json。

链接

  • 目录页:https://www.skillhub.cn/plugins/gentle-knight/dsh-cannbot-connect
  • GitHub:https://github.com/gentle-knight/dsh-cannbot-connect
  • 安装用仓库(README clone 地址):https://gitcode.com/gentle-knight/dsh-cannbot-connect.git

经过上面的步骤,DSH 可在不重复配置 OAuth 或 API Key 的前提下,与 CANNWork 共用同一套 CANNBOT 网关凭据,在 harness 内直接选用网关模型。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye