jfreey/dsh-opencode-go-usage:在 Harness 里看 OpenCode Go 用量

前言

DSH 的理念是「一切皆插件」,用量查询这种小事通常也该由插件来做,而不是手动开一个网页再切回来。用 OpenCode Go 的人有个反复出现的动作:写代码时想知道 5 小时额度还剩多少,于是切到 Console,记下数字,再切回来。这个插件的定位就是把这个动作折回 Harness 界面里——输入框底栏放一个徽标,设置页放一节,别的什么都不加。

下面介绍的插件由 Jfreey 维护,在社区目录 SkillHub 上归在「客户端」分类,目前靠插件管理器指向仓库安装。它只做一件事:显示 OpenCode Go 的用量。没有多余界面,没有额外依赖,不需要构建步骤。

这是什么

一句话定位:一个轻量的 DSH 客户端插件,把 OpenCode Go 的三类额度(5 小时滚动、周、月)显示在 composer dock 的徽标和 Settings 页面里。

它解决的问题是「用量可见性」。插件从 https://opencode.ai/zen/go/v1/usage 读取上面三档额度,用你已经保存的密钥鉴权,把百分比和重置时间渲染成进度条。密钥不进浏览器,页面只收到百分比和重置时间。

维护者:Jfreey。许可证:MIT,仓库内随附 LICENSE 文件。

核心功能

输入框底栏徽标。 composer dock 里显示一个紧凑的 Go [进度条] 5h 13% 徽标,位置在 Turn-count 徽标的左侧。进度条可以关掉,跟踪的级别(5h / week / month)可配置,也可以按定时轮换。

展开面板。 鼠标悬停、点击或聚焦徽标,展开的面板里是三个额度各一条进度条,加上已用百分比、重置倒计时、手动刷新按钮,以及进度条、级别、轮换的开关。这里的改动保存在浏览器本地。

设置页。 Settings → OpenCode Go 一节包含三张卡片。打开时先读缓存、不额外查一次上游,之后每 60 秒自动刷新,按钮用于立刻取一次。

中英双语。 UI 跟随 Harness 应用语言,插件注册了中文和英文两套词条。访问读数走宿主只读路由,且面板会提示读数与 Console 最多差 1 个百分点。

安装与启用

仓库本身就是可安装的 bundle(package.json 里声明了 dsh.bundle)。在 Harness 的插件管理器里指向该目录或该 GitHub 仓库即可,没有需要手敲的安装命令。安装后刷新页面:底栏出现 Go 徽标,设置里出现「OpenCode Go」一节。

它依赖 DeepSeek Harness 0.2.x,具体用到的是 dsh.client、ctx.slots、ctx.locale 三个契约。版本不够的话先升级 Harness。

安装前建议把仓库里这几个文件读一遍,尤其是 index.js、client.js 和 cordis.patch.yml——patch 文件会改宿主代码,值得确认改动范围再启用。许可证是 MIT,商用和二次分发都允许。

配置

插件配置写成插件行的形式:

- id: opencode-go-usage
  name: 'dsh-opencode-go-usage'
  config:
    apiKeyEnv: OPENCODE_GO_API_KEY   # 凭据引用名
    # apiKey: oc_sk_...              # 也可以直接写死,不推荐
    path: /dsh-opencode-go/usage     # Host 只读路由
    cacheSeconds: 60                 # 宿主缓存秒数,也是底栏刷新周期

    dock: true          # 底栏徽标总开关
    bar: true           # 徽标里的进度条
    level: rolling      # 跟踪级别:rolling (5h) | weekly | monthly
    rotate: false       # 级别轮换显示
    rotateSeconds: 5    # 轮换间隔(最小 2 秒),仅 rotate: true 时生效

level 也接受 week/w/周 与 month/m/月;无法识别时回落到 rolling。任何配置改动都要重载 Harness(重启应用或重新启用该 bundle)才生效。

密钥从哪里来

插件不需要你手动写密钥,它按下面的顺序逐次解析:

  1. 插件行里的 config.apiKey(显式填写时优先)。
  2. 凭据服务里的 config.apiKeyEnv 引用,默认名是 OPENCODE_GO_API_KEY——也就是「设置 → 模型」里为 opencode-go 保存的那把密钥。
  3. 同名进程环境变量。

所以只要模型页里已经有 opencode-go 的凭据,插件装上就能直接读数。

刷新与缓存

不同界面对同一条路由的行为不同:

场景 请求 行为
底栏徽标 GET /dsh-opencode-go/usage 每 60 秒拉一次;宿主缓存未过期时直接返回缓存
面板「刷新」 GET …?refresh=1 跳过缓存,强制向上游查询
设置页打开 GET …?cache=1 有缓存就用缓存(哪怕过期),只有从未读过时才查上游
设置页保持打开 GET /dsh-opencode-go/usage 每 60 秒自动刷新,与底栏同一节奏
设置页「刷新」 GET …?refresh=1 立刻查一次上游

凭据变化(credentials/reference-updated 事件)会清空缓存,换 key 后下一次请求就用新凭据,不会继续显示上一个账号的数字。

HTTP 路由

Host 提供一条只读路由 GET /dsh-opencode-go/usage,?refresh=1 强制刷新,?cache=1 只读缓存。返回体的例子:

{
  "ok": true,
  "fetchedAt": "2026-11-04T12:40:00.000Z",
  "credentialSource": "stored",
  "dock": true,
  "display": { "bar": true, "level": "rolling", "rotate": false, "rotateSeconds": 5 },
  "servedFromCache": true,
  "stale": false,
  "usage": {
    "rolling": { "status": "ok", "percent": 12.5, "resetsAt": "2026-11-04T17:33:21.000Z" },
    "weekly":  { "status": "ok", "percent": 4.1,  "resetsAt": "2026-11-09T00:00:00.000Z" },
    "monthly": { "status": "ok", "percent": 1.2,  "resetsAt": "2026-12-04T12:23:50.000Z" }
  }
}

失败时返回 { "ok": false, "error": { "code": "NO_KEY|UNAUTHORIZED|FORBIDDEN|TIMEOUT|NETWORK|UPSTREAM|SHAPE", "message": "…" } },据此可以区分是没配密钥、鉴权失败还是上游异常。

适用场景与注意

适合两类人:一是不想切窗口查限额、希望用量一直可见的人;二是想给别的 provider 做同类用量插件、需要一个可参考实现的人——这个插件面很小,入口只有 dock 和 Settings 两处,代码量也少。

需要注意的几点:

  • 插件以当前 dsh 进程的权限运行,能读到进程环境变量和凭据库里的引用。安装前检查源码与许可证,确认你愿意让插件拿到这些权限。
  • 路由是只读、同源的 GET,不经过 Harness 的浏览器登录闸门。Harness 默认只监听回环地址;一旦你把它暴露到局域网或隧道,这条路由也会随之可达。
  • 进度条颜色使用主题 token(--dsw-alias-*),明暗主题都适用,不需要额外适配。
  • 读数就是接口返回的整数百分比,与 Console 最多差 1 个百分点,插件面板上已注明。

目录页:https://www.skillhub.cn/plugins/Jfreey/dsh-opencode-go-usage

GitHub:https://github.com/Jfreey/dsh-opencode-go-usage

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

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

小夜