🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

错峰调度 TetraSsky/dsh-offpeak

DeepSeek Harness
TetraSsky30 天前有提交已提供中文文档扫描:含敏感能力

高峰时段挂起模型调用,窗口结束自动恢复发送

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
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 30 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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。
预览分享卡片长什么样 ↓TetraSsky/dsh-offpeak
分享 · DeepSeek Harness Hub
TetraSsky/dsh-offpeak

高峰时段挂起模型调用,窗口结束自动恢复发送

回到顶部