前言¶
在 DeepSeek Harness(DSH)裏接多條 LLM 上游時,常見做法是手動換 provider,或在配置裏寫死一條默認路由。高峯時段若要走另一套端點(例如對齊官方加價窗口的第三方推理通道),低峯再回到官方路由,既要記住時段,又要避免同一輪對話中途換路導致上下文或計費語義混亂。
dsh-time-router 是維護者 AnkoCD 發佈的 DSH bundle,分類屬於模型推理:它註冊虛擬 provider time-router(虛擬模型 auto-flash / auto-pro),在 Harness 的 llm/stream waterfall 上按北京時間、工作日窗口與中國節假日日曆,把每一輪請求鎖定到 peak 或 offPeak 中的一條真實路由,並在首 token 之前支持重試與回退。下面介紹其定位、能力與在 Desktop / Web profile 下的啓用方式。
這是什麼¶
dsh-time-router(npm 包名同倉庫名,當前版本 0.1.0,MIT 許可證)面向 DSH 0.2.2-rc.1。插件不引入 @deepseek-ai/* 運行時依賴,以 Cordis patch 形式注入路由邏輯與 Web 客戶端 UI(composer 停靠區狀態 chip)。
默認語義(Asia/Shanghai):工作日 09:00–12:00、14:00–18:00(半開區間)走 peak;週末、法定節假日及其餘時刻走 offPeak。國務院調休補班日按工作日處理,仍按窗口判定。社區目錄頁見 SkillHub;源碼與文檔在 GitHub。
核心功能¶
時間與日曆
- 判定順序(
Scheduler.evaluate()):未過期的manual.mode強制路由 →enabled: false固定 offPeak → 工作日且落在peakWindows爲 peak → 否則 offPeak(原因含statutory-holiday、weekend等)。 - 內置
data/holidays-2025.json至holidays-2027.json;可選在線刷新(NateScarlet/holiday-cn、timor.tech),不阻塞請求。
路由形態
- direct:配置
baseURL時由插件按 OpenAI Chat Completions 協議直連;需配置models.chat/models.reasoner與密鑰解析鏈。 - delegated:僅配置
provider:時改寫到 Harness 已註冊路由,由既有 adapter 流式轉發。 - 默認組合爲 peak 直連 OpenCode Go、offPeak 委託
deepseek-official(README 2026-11-09 實測說明與 DeepSeek 加價窗口對齊)。
穩定性與可觀測性
- 按輪鎖定(以該輪最後一條持久用戶消息 id 爲鍵);工具續寫與會話標題等帶
purpose的請求繼承鎖;首 token 前可同路由重試一次再回退,之後不再切換。 - 認證與配額類失敗觸發熔斷;回退通知說明路線、原因、目的地及本輪計價後果。
- 內存狀態環、按日按路由 token 用量、JSONL 事件日誌(默認 5 MB × 3 輪轉);命令
/time-router [probe|sync|reset];HTTPGET /api/time-router/status、POST /api/time-router/state。
安裝與啓用¶
插件以本地目錄安裝(link: 依賴),需先在本機準備好倉庫目錄(公開地址:https://github.com/AnkoCD/dsh-time-router)。前置條件:DSH 0.2.2-rc.1;Node ≥ 22 僅用於倉庫內測試,安裝 bundle 本身不需要 node_modules。
1、安裝 bundle(三選一)
- Harness Plugins 頁面:「從本地目錄安裝」,指向倉庫絕對路徑。
- Agent 工具
plugin_manager:以該絕對目錄爲安裝目標。 - CLI(
dsh將參數轉發給 profile 下的 pnpm):
dsh plugin --profile desktop add /path/to/dsh-time-router
README 示例使用 Windows 路徑 C:\path\to\dsh-time-router,實際替換爲本機目錄即可。
2、配置 peak 密鑰與路由(可選)
默認即可用:peak 直連 OpenCode Go,offPeak 委託 deepseek-official。直連密鑰按順序解析:peak.apiKey(不推薦明文)→ peak.apiKeyEnv(默認 OPENCODE_API_KEY)→ peak.apiKeyFile → %DSH_HOME%/plugins/time-router/keys/peak.key(面板保存)。
在 profile 的 cordis.patch.yml 用 id: time-router 覆蓋 config(patch 爲整塊替換,插件再與內置默認值合併):
# ~/.dsh/profiles/<profile>/cordis.patch.yml
- id: time-router
name: dsh-time-router
config:
enabled: true
timezone: Asia/Shanghai
peakWindows:
- ['09:00', '12:00']
- ['14:00', '18:00']
peak:
label: OpenCode Go
baseURL: https://opencode.ai/inference/go/openai/v1
apiKeyEnv: OPENCODE_API_KEY
models:
chat: deepseek-v4.1-flash
reasoner: deepseek-v4-pro
offPeak:
provider: deepseek-official
models:
chat: deepseek-flash
reasoner: deepseek-v4-pro
3、把默認模型指到虛擬路由
未選用 time-router 時插件不參與路由。可在 Settings → Models 選擇 time-router / auto-flash,或在 patch 中設置:
- id: agent-default-model
name: "@deepseek-ai/dsh-agent-default-model"
config:
provider: time-router
model: auto-flash
reasoningEffort: high
4、卸載注意
移除 bundle 前先把默認模型切回真實 provider,再執行:
dsh plugin --profile desktop remove dsh-time-router
或在 Plugins 頁面移除;否則默認模型仍指向已消失的虛擬路由。
典型用法¶
配置完成後,在會話中執行探測命令,確認當前時刻被判到哪條路由:
/time-router probe
該命令經虛擬路由發送一條約 16 token 的短請求(提示爲 “Reply with the single word: pong”),並回報本輪路由、原因與模型回覆。也可查看 /time-router 狀態輸出,或請求 GET /api/time-router/status。
節假日數據過期時可執行 /time-router sync;熔斷或手動覆蓋狀態可用 /time-router reset(詳見 README「命令與面板」)。事件與緩存默認寫在 %DSH_HOME%/plugins/time-router/(如 events.jsonl、holidays.cache.json)。
若兩條路線都希望委託已有 Harness provider,可參考 README 中「只有委託路由的配置」示例,併爲 peak / offPeak 顯式寫出 models,避免默認模型 id 與 gateway 不一致。
適用場景與注意¶
適合誰
- 已在 DSH 中註冊官方路由,並希望在高峯窗口自動切到另一條直連或網關路由、低峯自動回到官方鏈路的開發者。
- 需要按中國工作日/節假日自動判定、且要求「一輪內不換路」的長對話或 Agent 場景。
使用注意
- 插件隨 當前 DSH 進程權限運行,可讀寫 profile、
%DSH_HOME%/plugins/time-router/下的密鑰與日誌;安裝前應閱讀倉庫源碼與 MIT 許可證,自行評估上游端點與密鑰存放方式。 - DSH 生態奉行「一切皆插件」;SkillHub 爲社區目錄,與 DeepSeek / 幻方無官方從屬關係。
- 插件重載會丟失內存中的按輪鎖,下一輪將按當時時刻重新判定,這是文檔中唯一接受的中途換路情形。
- 完整配置字段、告警與示例見倉庫
docs/CONFIGURATION.md。
結尾¶
dsh-time-router 把峯谷時段、節假日與熔斷回退收攏到穩定的虛擬模型 time-router / auto-flash 背後,減少手工切路與同一輪中途換路的成本。目錄介紹見 SkillHub:AnkoCD/dsh-time-router,安裝與排障以 GitHub 倉庫 README(含 README.zh.md)爲準。