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

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

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

小夜