dsh-offpeak-guard:給 DeepSeek Harness 加上峯谷計價錯峯調度

前言

用 DeepSeek 跑長時間任務時,賬單上最大的變量不是模型,是時間段。工作日 09:00–12:00、14:00–18:00 是原價,週末和法定節假日全天是谷價。人工盯着點去掐表暫停,既不現實也容易漏;寫腳本定時 kill 會話,又會丟掉待處理隊列。DSH 的插件機制允許在會話控制器層面做這件事,下面介紹的 dsh-offpeak-guard 就是這個方向的插件:它讀 DeepSeek 的峯谷規則和當前會話的真實模型,在峯時暫停任務、在谷時自動恢復,並把「12 點再跑」這類需求排進下一個谷價窗口。

這是什麼

dsh-offpeak-guard 由 HATO-24 維護,分類屬於 DSH 社區目錄裏的「工作流」,許可證爲 MIT,npm 上對應包名就是 dsh-offpeak-guard。它不替換 DSH 的任務系統,而是在會話層做一層價格窗口調度:識別當前是峯還是谷,決定正在跑和即將開始的任務該不該放行。

核心思路是兩條正交的判斷:

  1. 時間:按 DeepSeek 官方規則判斷峯谷窗口,含法定節假日處理;
  2. 模型:按會話真實的 provider / model 判斷是不是峯谷計價模型,避免誤傷不相關的模型。

兩者都命中時才介入;其餘情況插件不動作。

核心功能

時間識別

按 DeepSeek 官方規則,北京時間週一至週五(不含中國法定節假日)09:00–12:00、14:00–18:00 爲峯值原價,其餘時間(含週末、法定節假日全天)爲谷價,按 5 折計費。節假日默認從公開 API 動態同步,失敗時回退內置的 2026 列表。

模型識別

插件按會話的真實 provider / model 精確判斷。默認情況下模型名(或供應商名)包含 deepseek 就納入管理;也可以在設置面板逐模型開關,或用 peakPricedModels / exemptModels 精確控制,這兩個列表非空時優先於 modelPattern。

峯時策略與會話豁免

  • 策略可選「立即暫停」或「完成當前輪後暫停」;
  • 會話有子代理在跑時先放行子代理,子代理結束後再暫停父會話,谷價開始時恢復;
  • 可以豁免某個會話不參與暫停/恢復,通過設置面板或 offpeak_guard exempt/unexempt,隨時可取消。

工作規劃

  • 峯時開始 → 暫停正在運行的任務,保留待處理隊列,不丟消息;
  • 峯時新起的任務 → 立即停住,不花峯時 token;
  • 谷價開始 → 自動把被打斷的任務交還給會話繼續執行;
  • 提供 offpeak_plan 工具,把「12 點再跑」這類事排進下一個谷價窗口。

界面

輸入框下方有一條狀態條,顯示當前峯/谷、距下次切換的倒計時、當前模型,以及暫停/規劃數量。左側欄底部另有一枚常駐計時,臨近切換時閃色提醒:峯價快開始閃紅,谷價快開始閃綠。點擊左欄計時打開設置面板,可以切換峯時策略、逐模型管理、會話豁免、查看節假日同步狀態。

另外支持就地豁免:鼠標移到左側會話行,行尾出現盾牌按鈕,點一下豁免或取消;輸入框狀態條右側也有「豁免本會話」按鈕。

安裝與啓用

插件已發佈到 npm。在 DSH 的插件頁搜索 dsh-offpeak-guard 安裝,或用命令行:

dsh plugin --profile <profile> add dsh-offpeak-guard

安裝完成後建議先看一次 offpeak_status,確認識別到的時段和模型符合預期。

環境要求(來自 package.json 的 engines):

{ "node": ">=22.5", "dsh": ">=0.2.1-rc.2 <0.3.0" }

典型用法

插件提供三個工具,覆蓋查詢、規劃、手動控制。

工具 用途
offpeak_status 當前時段、下次切換、當前模型是否適用、暫停與規劃清單
offpeak_plan add / list / remove / clear 錯峯規劃
offpeak_guard status / pause_now / resume_now / run_plans_now 手動控制

典型的工作流是:

1、長任務在跑,先看 offpeak_status,確認現在是谷價、距峯時還有多久,判斷要不要讓它繼續;
2、如果即將進入峯時,新任務先不要發,用 offpeak_plan add 排進下一個谷價窗口;
3、峯時開始後,插件按設置的策略暫停正在跑的任務,狀態條和暫停數量會更新;
4、谷價開始,任務自動交還會話繼續跑,offpeak_status 裏可以看到恢復記錄;
5、遇到必須馬上跑的情況,用 offpeak_guard pause_now / resume_now 手動介入,resume_now 會給這些會話 10 分鐘豁免,避免剛恢復又被停回去。

配置

配置可以寫在 cordis.patch.yml 裏 offpeak-guard 那一行的 config,也可以在 DSH 設置頁的插件配置裏修改(插件已聲明 Config schema)。常用鍵如下,默認值按 package.json 聲明。

config:
  enabled: true
  preset: auto
  pauseMode: pause-now
  timezone: Asia/Shanghai
  modelPattern: deepseek
  peakPricedModels: []
  exemptModels: []
  pauseRunningOnPeak: true
  deferNewTurnsOnPeak: true
  resumeOnOffPeak: true
  pollSeconds: 15
  resumeDelaySeconds: 3
  bypassMinutes: 10
  alertMinutes: 10

各鍵含義:

  • enabled:總開關;
  • preset:auto 按 provider 自動選,WorkBuddy/CodeBuddy 用 workbuddy,其餘用 deepseek-official;也可固定爲 deepseek-official / workbuddy / custom;
  • pauseMode:pause-now 峯時立即暫停,finish-turn 當前輪跑完再暫停;
  • timezone:計價時區,默認 Asia/Shanghai;
  • peakWeekdays / peakWindows / discount:僅 custom 預設使用,官方調價或換供應商時改這裏;
  • holidays:追加的法定節假日,YYYY-MM-DD;
  • holidaySource:auto 動態同步,builtin 只用內置/配置列表;
  • modelPattern / peakPricedModels / exemptModels:模型匹配與豁免;
  • pauseRunningOnPeak / deferNewTurnsOnPeak / resumeOnOffPeak:三條主策略開關;
  • pollSeconds:檢查間隔,範圍 5–300;
  • resumeDelaySeconds:谷價開始後等幾秒再恢復;
  • bypassMinutes:手動恢復後的豁免期;
  • alertMinutes:左欄計時在距切換多少分鐘內開始閃爍,0 表示不閃。

環境變量

部署方可以用環境變量統一注入配置,優先級是環境變量 > 配置 > 默認,無效值會被忽略。命名規則統一爲 DSH_OFFPEAK_ 前綴加配置鍵的大寫下劃線形式,例如:

DSH_OFFPEAK_PRESET=custom
DSH_OFFPEAK_PAUSE_MODE=finish-turn
DSH_OFFPEAK_PEAK_WINDOWS=09:00-12:00,14:00-18:00
DSH_OFFPEAK_DISCOUNT=0.5
DSH_OFFPEAK_HOLIDAYS=2026-10-01,2026-10-02
DSH_OFFPEAK_MODEL_PATTERN=deepseek
DSH_OFFPEAK_PEAK_MODELS=deepseek-flash,vendor/model
DSH_OFFPEAK_BYPASS_MINUTES=10

完整列表見 README,覆蓋 enabled、timezone、peakWeekdays、holidaySource、holidayApi、pollSeconds 等全部配置項。

預設

  • deepseek-official(默認):官方工作日峯時 + 內置 2026 法定節假日,節假日全天谷價;
  • workbuddy:WorkBuddy 積分規則,峯時窗口與官方相同,按 provider 自動選擇時用於標註來源;
  • custom:完全使用 peakWeekdays / peakWindows / discount / holidays,適合其他供應商或自建計價。

數據與恢復機制

狀態和快照都在 $DSH_HOME/offpeak-guard/:

  • state.json:暫停/等待中的任務、錯峯規劃、會話豁免、精確模型規則、峯時策略;
  • status.json:給輸入框狀態條/設置面板讀的只讀快照,同時鏡像到 ~/.dsh/offpeak-guard/status.json;
  • holidays.json:動態同步的節假日緩存。

插件不寫用戶工作區。

暫停用的是 sessionController.cancel,只結束當前一輪、保留待處理隊列;恢復用的是 sessionController.prompt,向原會話投遞一條「繼續上次中斷處」的指令,冷會話會被自動喚醒。恢復文本會註明中斷時間與被暫停的模型,方便在對話裏追溯。

子代理與等待

  • 峯時開始時若會話有正在運行的子代理,先放行父會話與子代理;
  • 子代理結束後,父會話按當前策略暫停(記錄爲 waiting-children),谷價開始後自動恢復;
  • finish-turn 模式下當前輪允許跑完,如果隨後又排入了下一輪,下一輪會在峯時被攔下並記錄,谷價開始恢復;
  • 當前輪跑完且沒有後續輪次時,記錄標記爲 completed,不會在谷價時無意義地再起一輪。

這點需要留意:插件只在子代理結束時停住父會話,無法在傳輸層攔截已經進入父會話歷史的消息,子代理結果由模型在父會話恢復後繼續消費。

適用場景與注意

適合這三類用法:

  1. 跑長任務、批量任務,希望把 token 成本壓到谷價窗口的人;
  2. 需要把「某個時間再跑」這類安排交給模型表達,而不是手寫 cron 的人;
  3. 團隊部署,希望通過環境變量統一注入峯谷策略的運維方。

幾點注意:

  • 插件通過 sessionController 干預會話,實際以當前 dsh 進程的權限運行,安裝前建議先讀一遍源碼確認行爲符合預期,許可證爲 MIT;
  • 內置法定節假日目前覆蓋 2026 年,2027 年安排公佈前,動態同步補不上時要用 holidays 或 DSH_OFFPEAK_HOLIDAYS 追加,否則節假日會被當作普通工作日;
  • 動態節假日來自第三方公開 API(默認 timor.tech,只發送年份),離線或接口失敗時回退 holidays.json 緩存與內置列表,設 holidaySource: builtin 可完全離線;
  • 只處理有工作目錄、非子代理的根會話,避免打斷子代理導致父會話卡住;
  • 「會話豁免」隻影響後續暫停/恢復,不會自動把已經暫停的任務立即恢復,需要時用 resume_now;
  • 插件自身重啓時不會主動打斷正在跑的任務,之後進入峯時或新起任務仍按規則處理。

結尾

dsh-offpeak-guard 的價值在於把峯谷計價這件事變成會話層的自動策略,而不是靠人記時間或寫一次性腳本。它和 DSH 現有的暫停/恢復機制配合,不丟隊列、可豁免、可回溯,適合作爲日常跑任務時的默認的第一層成本控制。

目錄頁:https://www.skillhub.cn/plugins/HATO-24/dsh-offpeak-guard

GitHub:https://github.com/HATO-24/dsh-offpeak-guard

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

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

小夜