dsh-opencode-go-usage:在 DSH Web GUI 中监视 OpenCode Go 套餐额度

前言

在 DeepSeek Harness(DSH)里用 Composer 写代码时,界面通常会显示上下文用量(context meter)。若你同时订阅了 OpenCode Go,额度还分 5 小时滚动、周、月等窗口;这些数字在官方控制台里,和当前对话界面是分开的。来回切换容易在额度快用尽时才发现。

下面介绍社区插件 dsh-opencode-go-usage(维护者 lccc233):它把 OpenCode Go 三个额度窗口做成 Composer 停靠区里、紧挨 context meter 右侧的三个小圆环,悬停可展开明细。插件归类为「工作流」,面向已在 DSH Web GUI 中日常对话、又需要盯 OpenCode Go 用量的开发者。

这是什么

dsh-opencode-go-usage 是 DSH 的 Web GUI 插件:在聊天输入框(composer dock)旁展示 OpenCode Go plan 的额度占用,不注册工具、不注入 system prompt、不订阅 session 事件,因此不增加面向模型的 token,也不影响 KV cache。

数据来源是 OpenCode 官方接口 GET https://opencode.ai/zen/go/v1/usage(Authorization: Bearer <key>)。Host 端通过 ctx.credentials 解析 API Key 并代请求上游,浏览器只轮询本机 loopback 上的快照路由,密钥不会进入浏览器。

界面与数据含义

紧凑模式下始终可见三个 14px 圆环(2px 描边),分别对应 5h rolling / weekly / monthly,环上无文字;填充比例表示该窗口的已用百分比(percent),剩余为 100 − percent。

颜色阈值(资料原文):

  • 已用 <60%:绿色
  • 已用 ≥60%:琥珀色
  • 已用 ≥85%:红色
  • 无数据:灰色环
  • 上游失败:三环均为红色

悬停、聚焦或点击可展开详情:每个窗口一条 6px 进度条,并显示剩余比例、重置倒计时、采样时间与手动刷新。环与行的 title、aria-label 中会带上可读摘要(例如 5h rolling · 3% used (97 left · resets in 3h25m))。

上游 JSON 结构示例(字段以官方为准):

{ "usage": {
    "rolling": { "status": "ok", "percent": 3,  "resetsAt": "2026-10-02T16:18:57.800Z" },
    "weekly":  { "status": "ok", "percent": 1,  "resetsAt": "2026-10-05T00:00:00.000Z" },
    "monthly": { "status": "ok", "percent": 59, "resetsAt": "2026-10-11T12:22:02.000Z" } } }

环境与依赖

安装前请确认:

  1. DSH 0.2.0-rc.2(插件开发与验证针对的版本),启用 Web GUI profile(@deepseek-ai/dsh-web-app),且具备 conversation.composer.dock 插槽(随 @deepseek-ai/dsh-client-ui-conversation 提供)。
  2. 有效的 OpenCode Go 订阅及 API Key。默认凭据引用为 OPENCODE_GO_API_KEY(与 llm-pi-ai provider 相同)。可在 Settings → Models 配置,或写入 ~/.dsh/.credentials.yaml,或导出同名环境变量。
  3. Windows、macOS 或 Linux。开发校验需要 Node 22+。

安装与启用

DSH 主目录默认为 ~/.dsh(Windows 为 %USERPROFILE%\.dsh)。Profile 位于 ~/.dsh/profiles/<name>/;桌面版 Electron 使用 desktop profile,下文示例以 desktop 为准。

无论哪种路径,启用插件都需要三件事:

  1. Profile 能解析到包:~/.dsh/profiles/<name>/node_modules/dsh-opencode-go-usage 存在(实体目录、junction 或 symlink)。
  2. ~/.dsh/profiles/<name>/package.json 的 dependencies 中记录该包。
  3. ~/.dsh/profiles/<name>/cordis.patch.yml 中有对应的 Loader insert 行。

修改 package.json 与 patch 时请使用无 BOM 的 UTF-8;Windows PowerShell 的 Set-Content -Encoding UTF8 可能写入 BOM,导致 DSH 无法解析 JSON。

完成上述步骤后 重启 DSH。全新包不会在配置热重载时进入 Loader 图,需启动时加载。

路径 A:克隆到插件目录并链入 profile(desktop 推荐)

先把仓库放到 profile 可解析的位置,再链入 node_modules:

git clone https://github.com/lccc233/dsh-opencode-go-usage.git ~/.dsh/plugins/dsh-opencode-go-usage

Windows(junction):

cmd /c mklink /J "%USERPROFILE%\.dsh\profiles\desktop\node_modules\dsh-opencode-go-usage" "%USERPROFILE%\.dsh\plugins\dsh-opencode-go-usage"

POSIX(symlink):

ln -s ~/.dsh/plugins/dsh-opencode-go-usage ~/.dsh/profiles/desktop/node_modules/dsh-opencode-go-usage

在 ~/.dsh/profiles/desktop/package.json 中登记依赖(路径相对 profile 目录):

{
  "name": "dsh-profile-desktop",
  "private": true,
  "dependencies": {
    "dsh-opencode-go-usage": "file:../../plugins/dsh-opencode-go-usage"
  }
}

在 ~/.dsh/profiles/desktop/cordis.patch.yml 增加 Loader 行:

- insert:
    - id: opencode-go-usage
      name: "dsh-opencode-go-usage"
      config:
        apiKeyEnv: OPENCODE_GO_API_KEY
        endpoint: https://opencode.ai/zen/go/v1/usage
        refreshMs: 60000
        timeoutMs: 10000
        route: /opencode-go-usage/snapshot

路径 B:profile 自带的插件管理器

若环境已部署 @deepseek-ai/dsh-plugin-manager 且有 dsh CLI,可对非 desktop profile 执行:

dsh plugin --profile <name> add dsh-opencode-go-usage

该命令会完成依赖安装、bundle 记录与 patch 行。注意:desktop profile 不能这样管理(dsh plugin --profile desktop 会被拒绝);desktop 请用路径 A。本仓库在 package.json 中声明 dsh.bundle.patch,作为 bundle 安装时会写入相同 insert。

路径 C:作为 profile bundle

在 profile 的 package.json → dsh.profile.bundles 中加入包名,由仓库自带的 cordis.patch.yml 插入 Loader 行:

{
  "dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-opencode-go-usage"] } }
}

profile 层手写行与 bundle 层使用相同 id: opencode-go-usage,profile 层 config 可覆盖 bundle 层。

配置项

字段 默认值 含义
apiKeyEnv OPENCODE_GO_API_KEY 每次刷新经 ctx.credentials 解析;可回退同名环境变量
apiKey — 明文 Key(不推荐,会出现在 patch 中)
endpoint https://opencode.ai/zen/go/v1/usage 额度接口
refreshMs 60000 缓存时长;浏览器按同周期轮询
timeoutMs 10000 单次上游请求超时
route /opencode-go-usage/snapshot 本机 Web 服务快照路径

验证与日常使用

启动 DSH 后,端口见启动日志中的 dsh web: URL。先用 curl 确认 Host 半部已加载:

curl http://127.0.0.1:<port>/opencode-go-usage/snapshot/probe

probe 返回插件名、版本(当前包版本 0.1.0)、路由与采样时间等;404 表示未加载(路径错误、缺少 insert 或 import 失败)。

拉取快照:

curl http://127.0.0.1:<port>/opencode-go-usage/snapshot

返回各窗口的 percent、resetsAt 及 stale、error 等字段。随后在 Web GUI 打开对话页,Composer dock 中 context meter 右侧应出现三个额度圆环;需要明细时悬停即可。

卸载时从 cordis.patch.yml 移除对应 insert、从 package.json 去掉依赖并删除 node_modules 中的包,再重启 DSH(完整步骤见仓库 README)。

适用场景与注意

适合:已在 DSH Web GUI(含 desktop profile)中使用 Composer,且持有 OpenCode Go 订阅、希望在与上下文用量同一行观察三档额度窗口的开发者。

请注意:

  • 插件在 当前 DSH 进程权限 下运行,会代你调用 OpenCode 额度 API;安装前应阅读 GitHub 源码 与 MIT 许可证,确认行为符合你的安全策略。
  • 社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,目录站是独立社区索引。
  • 版本与 DSH 的匹配以 README 为准(开发验证版本 0.2.0-rc.2);升级 DSH 或 OpenCode 接口后若异常,可对照 probe/snapshot 的 lastError 与仓库 Issue。

链接

经过上面的步骤,你可以在不动对话 prompt 的前提下,把 OpenCode Go 的 rolling / weekly / monthly 额度贴在 Composer 旁,用颜色阈值和悬停明细避免额度用尽才发现的问题。

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

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

Xiaoye