一个轻量、置顶、跨平台的桌面悬浮窗(desktop overlay,不是浏览器插件、无宿主依赖),实时显示多家 LLM 服务商的峰谷时段和距离下次切换的秒级倒计时。 不读取任何 API Key、不发起网络请求、纯本地时间计算——就像某些客户端内置的"1 小时 32 分后进入低峰折扣"提示,但同时覆盖多家厂商,并回答它们回答不了的问题:现在跑任务,哪家最划算?
| 规则 | 高峰/白天 | 低峰/优惠 | 时区 |
|---|---|---|---|
| DeepSeek | 工作日 09:00–12:00、14:00–18:00 高峰原价(高峰:低谷=2:1,全系;WorkBuddy 内 DeepSeek 同段同关系,仅单位为积分) | 其余时段 + 周末全天 低谷半价(0.5×) | Asia/Shanghai |
| GLM | 工作日 14:00–18:00(高峰 3 倍消耗,GLM Coding Plan 全系) | 其余时段正常计费 | Asia/Shanghai |
| Qwen | 白天正常计费 | 22:00–08:00 夜间折扣(部分模型,仅限编程/智能体工具内交互式调用) | Asia/Shanghai |
| WorkBuddy | 正常计费 | 23:00–次日 08:00 Hy4 Preview 夜间免费(限时活动 2026-09-11 至 2026-10-31) | Asia/Shanghai |
各模型的具体倍率、覆盖范围与平台限制,鼠标悬停对应行即可查看。 GLM 各模型基础倍率不同(GLM-5.3 为 1×/3×,GLM-5.3-Flash 为 0.4×/1.2×),但峰谷倍率关系均为 3 倍。
- 无边框圆角悬浮窗,始终置顶,鼠标左键拖拽移动
- 每次启动默认紧凑倒计时:中文显示
2小时/40分钟,英文显示2h/40m - 设置中可切换完整倒计时,固定显示
HH:MM:SS,不足一小时也保留零位(如00:00:40) - 当前状态统一使用绿色(相对便宜)和橙色(相对贵);即将到来的状态用更淡的同色徽章显示
- 单页设置按语言、模型开关、时段通知、倒计时和显示时区排列,二选一选项使用滑动开关
- 系统托盘图标:左键显示/隐藏,右键菜单
- 开机自启开关(Windows 写注册表,Linux 写 .desktop)
- 配置文件热重载(改完保存即刻生效,无需重启)
- 半透明、圆角、深色配色,不挡眼
需要 Python 3.10+。
# 克隆后
pip install -e .
offpeak-hours
# 或直接
python run.py依赖只有 PySide6-Essentials 和 tzdata(后者在 Windows 上提供 IANA 时区库,保证时区计算正确)。
首次运行会在以下位置生成 config.json:
- Windows:
%APPDATA%\offpeak-hours\config.json - Linux/macOS:
~/.config/offpeak-hours/config.json
(2026-10 项目由 peak-hour-widget 更名而来;旧目录下的 config.json 会在首次运行时自动迁移一次。)
右键悬浮窗 → "编辑配置…" 即可打开。示例:
{
"enabled_rules": ["DeepSeek", "GLM", "Qwen", "WorkBuddy"],
"opacity": 0.92,
"always_on_top": true,
"autostart": false,
"position": null,
"font_scale": 1.0
}在 enabled_rules 里增删规则名即可启用/关闭某条。新增自定义规则请 fork 后编辑
offpeak_hours/builtin_rules.py——规则数据结构是纯 dataclass,跨夜窗口、工作日限制、限时活动(start_date / end_date)都已支持。
规则是纯数据,不写在代码里:offpeak_hours/data/rules.json(schema 1)。
启动时只做 json.load 与字段校验,不执行任何代码;文件缺失或校验失败时回退到
内置兜底表,并把原因记在 rule_store.load_error()(界面提示后续接入)。
改规则 = 改 JSON。python tools/dump_rules_json.py 可从兜底表重新生成整份文件;
tests/test_rule_store.py 里的漂移探针会在 JSON 与兜底表不一致时失败。
规则引擎是纯函数(时间以参数注入),边界用例不依赖 GUI:
python tests/test_rules.py # 无需 pytest
python -m pytest tests/ # 有 pytest 时- 时间引擎(跨时区、DST、下一次边界计算)改编自 bozdemir/claude-usage-widget(MIT)。
- 各厂商规则数据来自官方定价页(见
offpeak_hours/builtin_rules.py头部注释)。
