dsh-time-router:按北京时间在峰谷上游之间切换模型路由

前言

在 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];HTTP GET /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)为准。

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

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

小夜