高峰时段挂起模型调用,窗口结束自动恢复发送
29/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/11 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add TetraSsky/dsh-offpeak该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 30 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
- 发起网络请求src/balance.js:37
const response = await fetch(BALANCE_URL, { - 删除本地文件src/goals.js:20
unlinkSync(filePath) - 写入本地文件src/goals.js:26
mkdirSync(dirname(filePath), { recursive: true }) - 写入本地文件src/goals.js:28
writeFileSync(temporary, JSON.stringify({ version: 1, ...record }, null, 2)) - 写入本地文件src/goals.js:29
renameSync(temporary, filePath) - 读取本地文件src/goals.js:129
stored = JSON.parse(readFileSync(filePath, 'utf8')) - 删除本地文件src/goals.js:144
unlinkSync(filePath) - 写入本地文件src/history.js:22
mkdirSync(dirname(filePath), { recursive: true }) - 写入本地文件src/history.js:24
writeFileSync(temporary, JSON.stringify({ version: HISTORY_VERSION, currency, samples }, null, 2)) - 写入本地文件src/history.js:25
renameSync(temporary, filePath) - 读取本地文件src/history.js:33
const parsed = JSON.parse(readFileSync(filePath, 'utf8'))
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 高峰时段挂起调用
- 低谷时段低价发送
- 窗口结束自动恢复
DSH 插件:高峰时段挂起 DeepSeek 模型调用,改到低谷时段按低价发送。
README
由 DeepSeek 最新模型翻译生成dsh-offpeak
在高峰计费时段拦住 DeepSeek 模型调用,让它们按非高峰价格发出。窗口打开期间,请求干脆不发:智能体等着,窗口一结束自己恢复。
这是独立插件。它只读写自己的文件,不依赖任何其他插件。
环境要求
- DeepSeek Harness,使用 web 配置档。
- 通过 Models 页面存好 DEEPSEEK_API_KEY,只有想看余额和消费图表时才需要。暂停功能不靠它也能用。
安装
from GitHub
dsh plugin --profile web add github:TetraSsky/dsh-offpeak
or from a local checkout
dsh plugin --profile web add <path-to-this-package>
然后把 dsh-offpeak 加进 $DSH_HOME/profiles/web/package.json 里的 dsh.profile.bundles,重启。包的 cordis.patch.yml 会自己插入对应行。
本地开发时,也可以在配置档的 node_modules 里建一个目录联接,再往 $DSH_HOME/profiles/web/cordis.patch.yml 加一行 insert,同样能用,还能热重载——见 Development。
展开完整文档(README 剩余 1 节)
dsh-offpeak
在高峰计费时段拦住 DeepSeek 模型调用,让它们按非高峰价格发出。窗口打开期间,请求干脆不发:智能体等着,窗口一结束自己恢复。
这是独立插件。它只读写自己的文件,不依赖任何其他插件。
环境要求
- DeepSeek Harness,使用 web 配置档。
- 通过 Models 页面存好 DEEPSEEK_API_KEY,只有想看余额和消费图表时才需要。暂停功能不靠它也能用。
安装
from GitHub
dsh plugin --profile web add github:TetraSsky/dsh-offpeak
or from a local checkout
dsh plugin --profile web add <path-to-this-package>
然后把 dsh-offpeak 加进 $DSH_HOME/profiles/web/package.json 里的 dsh.profile.bundles,重启。包的 cordis.patch.yml 会自己插入对应行。
本地开发时,也可以在配置档的 node_modules 里建一个目录联接,再往 $DSH_HOME/profiles/web/cordis.patch.yml 加一行 insert,同样能用,还能热重载——见 Development。
拦截是怎么生效的
三套独立机制,合起来就是这里说的「已暂停」:
| 机制 | 作用 |
| 请求闸门 | llm/stream 是每次模型调用都会经过的 waterfall。窗口内,调用在到达适配器之前就被挂起,所以什么都不发,也不产生计费。 |
| 目标冻结 | 处于 active 阶段的目标一律暂停,于是它不再推进,显示为已暂停而不是忙碌。你自己暂停的目标绝不会被碰。 |
| 状态工具 | offpeak_status 让模型说明自己在等什么。只读:它改不了时间表。 |
没有按请求的覆盖开关,也没有按窗口的跳过。时间表是「什么时候拦截调用」的唯一依据;想提前结束暂停,就改时间表或关掉插件。
被拦住的请求会在这些时候放行:窗口结束、请求被中止、时间表改动后它不再被拦、插件卸载。重启后会精确恢复本插件暂停过的那些目标,靠的是它为此保留的一份记录。
窗口打开期间(或即将打开时),页头会带一条提示,上面有 Dismiss 按钮。点掉它,这个窗口在本次页面会话里就不再提示——切换聊天不会让它回来,因为页头条目对每个会话都会重建——而刷新页面会重新开始,再次提醒。换一个窗口就是另一次事件,总会提示。
时间表与时区
高峰计费按北京时间定义,所以插件把两个时区分开:
- 时间表时区 —— 窗口按哪个时区书写。属于时间表身份的一部分。
- 时间显示时区 —— 只是查看偏好。改它只会重新标注时间,永远改不了窗口。
因为状态机按时间表时区求值,所以无论浏览器在哪个时区,浏览器和主机对状态的判断始终一致。
应用 DeepSeek 高峰时段会把北京时间 09:00-12:00 和 14:00-18:00(工作日,留两分钟余量)换算成你选定的时区,再追加到时段里。它绝不改动你的时区,也绝不丢弃你自己加的时段。
如果你的时区有夏令时,换算出来的时段每年会相对北京高峰漂移两次,因为北京不移动。设置页会说明这一点,并提供改用北京时间表达时段的选项,这样就不会漂移。
余额与消费图表
打开 Show API balance 后,宿主用你保存的密钥读取 DeepSeek 账户余额,页头显示这个数字。悬停它会拆分消费明细;点击它会打开八小时的十分钟柱状图。
- 密钥从不离开宿主。浏览器通过一条需要认证的路由请求换算后的数字。
- 消费是余额下降量的总和,所以充值不会抵消真实消费。
- 只要插件处于启用状态,每五分钟采样一次,不只在显示余额时才采样,样本保存在 $DSH_HOME/offpeak-history.json(288 个样本,约 24 小时)。
- 消费是派生量,所以历史从插件启用那一刻开始。插件安装之前的用量无法重建。
显示哪种货币
余额 API 用账户自己的货币作答——有些账户是 USD,有些是 CNY——数字和符号都来自这个回答。
Balance currency 覆盖符号:Follow the API(默认)、¥ CNY 或 $ USD。单独用这个覆盖项只会给 API 的数字换个标签,两种货币不同时就会把金额说错,所以选定一种货币还会显示 CNY per USD。把它留为 0 就原样显示 API 的数字;设一个汇率,所有金额——余额、悬停明细、图表柱——都按它换算。
这两个开关都不跟随界面语言:中文界面显示美元账户时,仍然显示 API 的美元数字,除非你另有指定。
设置
| 设置 | 含义 |
| Enable off-peak pause | 总开关。 |
| Schedule time zone | 时段写入所用的时区。选择器列出 58 个时区,覆盖 -11 到 +14 的每个整点偏移,外加半小时和一刻钟偏移,每个都标出偏移量并按偏移量排序。 |
| Show times in | 第二个灰色时间的查看时区。 |
| Pause windows | pauseAt-resumeAt 的挂钟时间范围,每个范围有自己的星期。 |
| Days that pause | 日程适用的星期。周末是低谷时段,所以排除在外。 |
| Warn before pause | 时段开始前多久出现提示。 |
| Applies to | 所有调用,或仅 DeepSeek 官方路由。默认是官方路由,因为高峰定价只在那里存在。 |
| Show API balance | 余额数字和消费图表。 |
| Balance currency | 显示的符号,以及换算用的汇率。见上文。 |
| Show the status in the header | 完全隐藏页头条目。 |
Language
字符串跟随 harness 自身的语言选择,没有单独设置,所以把 harness 在英文和中文之间切换,这个插件也跟着切换。
harness 只提供两个 locale(zh 和 en),插件为每个 locale 各提供一份词典——不多不少。harness 不提供的 locale,就算有词典也永远不会被选中;插件没有词典的 locale,则回退到英文。缺失的键同样回退到英文,所以永远不会显示原始键名。
文件
| 路径 | 内容 |
| $DSH_HOME/settings.yaml | 配置,位于 harness 设置文档的 offpeak 命名空间下。 |
| $DSH_HOME/offpeak-history.json | 图表用的余额采样。 |
| $DSH_HOME/offpeak-paused.json | 被这个插件暂停的目标,重启后只恢复这些。 |
开发
宿主那一半没有构建步骤:index.js 和 src/.js 就是源码。
浏览器那一半是生成的,因为客户端 bundle 无法导入相对文件,而调度逻辑必须与宿主逐字共享:
node scripts/build-client.mjs # src/{core,spend,money,i18n,client}.js -> client.js
node tests/run.mjs # 163 tests
只要 client.js 与它的源码不一致,tests/bundle.test.mjs 就会失败,所以改动这五个文件中任何一个之后都要跑一次构建。
通过 junction 安装时,插件会被 realpath 到 profile 之外,于是 @deepseek-ai/ 不再能从它那里解析。在本目录内放一个 node_modules/@deepseek-ai junction,指向 profile 自己的那套,就能解决;复制安装则不需要。
三个花时间才找到的坑
客户端的 locale 服务必须在 inject 里声明。 ctx.get('locale') 读起来像宽容查找,但服务只有在提供它的 fiber 激活之后才会返回——读早一步就拿到 undefined,之后插件里每个字符串都悄悄回退到英文,而 harness 其余部分照常切换语言。声明 locale 会把激活挂起,直到服务上线。设置区段的标签由设置外壳投射,而不是由这个插件投射,所以它注册为 thunk;用普通字符串的话,它会一直保持注册时所用的语言。
Connection 的通用 RPC 无法从另一个插件使用。 ctx.connection.rpc.handle() 看起来是把宿主事实提供给自己的浏览器那一半的正确方式,但它通过 Connection 自己的 fiber 注册路由,而那个 fiber 从不注入 webServer。注册会抛错,路由则悄无声息地永远不存在。它的另一个位置 intercept('/api', ...) 已被 API Gateway 占用。所以这个插件注册自己的 webServer 前缀路由,并对每个请求调用 connection.requestRejection(),以保持同样的 Host/Origin 围栏和浏览器会话检查。
在 Connection 激活之前注册的路由没有围栏。 Connection 可能起来路由安装完成后再解析 requestRejection,这样每次请求都会重新解析,而不是在安装时只捕获一次。如果在安装时就捕获,端点会在无鉴权的情况下悄悄对外服务。
致谢
这个插件能存在,要感谢 zhu168 的 dsh-save-money,该项目采用 MIT 协议。读它的源码,才摸清了这个问题的轮廓:把 llm/stream 瀑布流当作挂起调用的位置,暂停目标而不只是暂停它们下一次请求,DeepSeek 高峰时段预设,以及从余额采样推算花费。状态机的三个阶段,以及半开、跨午夜的窗口匹配,都沿用了它的设计。
它是重写的,不是 fork 的,因为它的几个决定没法保留:配置从实时会话状态解析、余额历史按 API-key 指纹索引、无鉴权的 HTTP 路由,以及一个面向模型、能改写时间表的工具。这些记在提交历史里,没有抄到这里。
如果你想要的是这个插件所取代的那个,用他们的。如果你想要的是这些修复,用这个。
协议
MIT。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
TetraSsky/dsh-offpeak
高峰时段挂起模型调用,窗口结束自动恢复发送
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1