前言¶
在 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)为准。