Back to home@ziangl59

dsh-opencode-go-meter

DeepSeek Harness (dsh) 插件:在设置页侧边栏监测OpenCode Go订阅套餐剩余量与每个API Key的Token用量。

Stars
0
Language
JavaScript
Created
Aug 17, 2026
Updated
Aug 17, 2026
GitHub repo

Introduction

dsh-opencode-go-meter

DeepSeek Harness Web GUI 插件:在设置页侧边栏新增 「OpenCode Go 用量」 分区,监测 OpenCode Go 订阅的套餐剩余量与每个 API Key 的 Token 用量。

核心功能

多维配额监控

  • 三窗口进度条:实时展示 5 小时滚动 / 每周 / 每月 的已用百分比及重置倒计时。
  • 智能告警:任一窗口使用率 ≥ 80% 时自动触发页面横幅提醒。
  • 套餐识别:自动解析账号套餐类型(如 lite),支持通过配置自定义各套餐限额常量。

Per-Key 用量明细

  • 全量字段:单 Key 维度展示请求数、输入/输出/推理/缓存读写 Token、总 Token 及费用 (USD)。
  • 智能命名:优先显示官方 keyName,支持 keyLabels 映射覆盖,兼容多账号插件配置。
  • 合计统计:自动汇总所有 Key 数据,支持按留存期(默认 90 天)聚合。

双数据源

  • 官方明细(首选):配置 Auth Cookie 后,拉取 opencode.ai workspace 全端调用记录(含非 DSH 流量)。
  • 本地估算(兜底):无 Cookie 时自动降级为 DSH 本机 llm/stream 归因统计,UI 明确标识数据来源。
  • 零查询启动:基于 overview.json 快照机制,重启后秒开页面;仅在快照过期时后台静默刷新,杜绝加载卡顿。
  • 后台自动同步:独立于页面运行(默认 5min/次),支持增量同步与历史全量回填,确保数据连续性。。

安装

方式一:pnpm 管理(推荐)

dsh plugin --profile web add ./dsh-opencode-go-meter

方式二:手动安装

  1. dsh-opencode-go-meter 目录复制到 $DSH_HOME/profiles/web/node_modules/ 路径下
  2. 编辑 $DSH_HOME/profiles/web/cordis.patch.yml,追加以下配置:
- insert:
    - id: opencode-go-meter
      name: 'dsh-opencode-go-meter'

配置完成后重启 dsh web,主机侧与客户端 bundle 即可生效。

配置项

cordis.patch.yml 的插件条目下通过 config 字段配置,完整参数如下:

- insert:
    - id: opencode-go-meter
      name: 'dsh-opencode-go-meter'
      config:
        baseUrl: https://opencode.ai/zen/go/v1/usage
        timeoutMs: 8000
        quotaCacheMs: 60000
        recordsSyncMs: 60000
        autoSyncMs: 300000          # 后台自动同步间隔(毫秒),设为 0 关闭
        fullSyncMaxPages: 1000      # 全量回填最大页数(每页 50 条)
        fullSyncMaxMs: 900000       # 单次全量回填总时长上限(毫秒),超时中止、下次续跑,0 为不限制
        syncAwaitMs: 8000           # overview/refresh 接口等待同步完成的最长时间,超时则先返回已有数据
        snapshotMaxAgeMs: 300000    # 本地快照有效期(毫秒);有效期内打开页面直接读快照,不发网络请求,0 表示始终使用快照
        apiKey: ''                 # 也可通过凭据 OPENCODE_GO_API_KEY 或 opencode auth.json 读取
        authCookie: ''             # 也可通过凭据 OPENCODE_GO_AUTH_COOKIE 或页面内粘贴录入
        workspaceId: ''            # 留空则自动解析第一个工作区
        providerFilter: opencode   # 本地归因仅统计 provider 路由包含该字符串的调用
        alertThreshold: 80         # 告警阈值(百分比)
        retentionDays: 90          # 本地数据留存天数
        keyLabels: {}              # 可选:keyID 到显示名的映射,优先级最高,例如 { key_xxx: "我的主力 Key" };也会自动读取 opencode-go-multi-auth 的账号配置
        planLimits: {}             # 可选:按套餐自定义额度展示,例如 { lite: { rolling: "$12", weekly: "$30", monthly: "$60" } }

凭据解析优先级

表格

凭据类型解析顺序
API Key(配额查询用)config.apiKey → 凭据项 OPENCODE_GO_API_KEY~/.local/share/opencode/auth.json
auth cookie(明细查询用)config.authCookie → 凭据项 OPENCODE_GO_AUTH_COOKIE → 页面内保存的 $DSH_HOME/plugins/opencode-go-meter/cookie.txt

数据说明

  • 配额为账号维度:同一 OpenCode Go 账号下所有 API Key 的配额占比一致;单 Key 维度仅展示用量明细,官方记录按 keyID 分组统计,本地数据按 provider 路由分组。
  • 总 Token 计算规则:总 Token = 输入 Token(含缓存读)+ 输出 Token + 推理 Token;缓存写 Token 单独列示,不计入总 Token。
  • 剩余额度展示:官方接口仅返回已用百分比与重置时间,不返回绝对 Token 数值;额度默认使用展示常量,可通过 planLimits 按套餐自定义(默认值为 $12 / $30 / $60)。
  • 合计数据范围:默认统计最近 90 天数据。首次运行会自动回填官方保留的历史记录(实测官方仅保留约 2–4 周),后续按分钟级增量累积;90 天为本地数据的裁剪上限,不代表可回填的历史时长。
  • 套餐标识:从用量记录的 enrichment.plan 字段解析(如 lite),仅用于展示与额度映射,不影响统计逻辑。

技术实现与文件结构

纯 ESM 模块,无需构建步骤,为 Host + Client 双面插件。

表格

文件职责
index.js主机侧:实现 OpencodeUsageGateway 远程服务,提供 overview /refresh/backfill /saveCookie/clearCookie 接口;管理后台自动同步定时器
local-meter.js本地用量归因:基于 llm/stream waterfall 链路统计,使用 JSONL 存储,作为官方数据的兜底方案
typert.host.js手写 Typert 主机接口清单,开启 zod 严格校验
client.js客户端 bundle:实现设置页分区 UI,包含配额卡、明细表格、合计行、来源标识、刷新 / 回填按钮、告警提示、Cookie 管理
package.json双面插件声明:包含 mainexports["./client"]exports["./typert"]dsh.client 字段

数据统一存储在 $DSH_HOME/plugins/opencode-go-meter/ 目录下:

  • records.jsonl:官方用量记录
  • local.jsonl:本地统计样本
  • cookie.txt:Cookie 存储文件(权限 0600)
  • overview.json:最近一次查询快照(权限 0600)
  • meta.json:回填标记与同步时间记录(权限 0600)

已知局限与稳健性设计

  • 接口未公开:官方 API 无文档且可能变动,插件采用防御式解析,失败时自动回退本地数据并提示。
  • 防卡死机制
    • 所有网络请求均有硬性超时 + Abort 保护。
    • 页面加载设 30s 全局超时,刷新时保留旧数据并显示 Loading 态。
    • overview/refresh 超过 syncAwaitMs 即返回当前数据,同步任务转入后台。
  • Cookie 有效期:401 错误时自动提示重新粘贴;增量同步遇「整页重复」自动停止。
  • 回填容错:全量回填受 fullSyncMaxMs 保护,超时自动中止并在下次同步时断点续跑。

参考

License

MIT