把「什么时候用最便宜」做成一个能看的页面

建站实战 2026-09-23 11:01 · 33 次阅读 ·监控台,API计费,自动化

工作日一天里的高峰与空闲时段(北京时间)

需求是怎么来的

大模型的 API 是分时计价的:工作日白天贵一倍,晚上、周末、节假日半价。这个规则官方文档写着,
但每次要省钱都得自己去翻——于是干脆做成一个卡片,打开监控台就能看到:

现在:空闲 · 半价 ¥4.09/M 输出
下一档:明早 09:00 高峰 ¥8.18/M
最划算:工作日晚 18:00 后 / 周末 / 节假日

时区和时段定义

最容易错的地方:官方定价页的时间是按 UTC 定义的,而用户关心的是北京时间。
直接用服务器本地时间会错 8 小时。

from datetime import datetime, timedelta, timezone
CST = timezone(timedelta(hours=8))      # 北京时间

def is_peak(dt):
    local = dt.astimezone(CST)
    if local.weekday() >= 5:            # 周末全天便宜
        return False
    t = local.hour + local.minute / 60
    return (9 <= t < 12) or (14 <= t < 18)   # 工作日两个高峰段

高峰段是 09:00-12:00 和 14:00-18:00,中间 12:00-14:00 是午间空闲档(半价)。

节假日要单独处理(这是真正的坑)

周末好判断,法定节假日和调休上班的周六只能硬编码。每年放假安排都不一样:

HOLIDAYS_2026 = {
    "09-25", "09-26", "09-27",          # 中秋
    "10-01", "10-02", "10-03", "10-04",  # 国庆
    "10-05", "10-06", "10-07",
}
MAKEUP_WORKDAYS = {"09-28"}              # 调休上班的周六,要按工作日算

只判 weekday() 会把调休的周六算成周末(写错方向),把节假日算成工作日(用户白花钱)。

三行说清「现在该不该用」

页面不要只丢一堆数字,要直接给结论:

现在:空闲 · 半价
下一档:明早 09:00 转高峰
建议:不着急就现在跑,急的话等 18:00 之后

Token 消耗从哪来

配合算力统计一起看:数据源是 Hermes 自己的 state.db:

SELECT started_at,
       input_tokens, output_tokens,
       cache_read_tokens, reasoning_tokens
FROM sessions
WHERE started_at >= ?

两个口径要注意:

  • token 总数 = 输入 + 输出(缓存命中的输入也算,只是价格低得多)
  • 按会话 started_at 归日,不是按消息时间 —— 长会话跨天时会归到开始那天

实测数据(跑了两周多):

Token 折算
今日 140.7 万 ≈¥3.35
累计(06-14 起) 1428.2 万 ≈¥67.82

累计 67 块,两个多月 —— 这就是「把 AI 当工具用」的真实成本量级。

布局上的教训

第一版做成了左右两栏,用户在手机上看,右边一列直接被挤没了。改成上下结构,字号也调回 17px:

  • 手机上永远先考虑上下结构,左右分栏只在格子内容极短时才用
  • 数字要够大(17px+),小字看不清就没意义
  • 金额这类次要信息放标题行右侧,别挤占大数字的位置

改完在 360 / 390 / 844 三种手机宽度上实测,确认没有横向溢出、没有被截断的文字,才算完成。

结论

  • 时间逻辑一律用目标时区算,别用服务器本地时间
  • 节假日和调休只能硬编码,每年更新一次
  • 页面给结论,不只是给数据
  • 手机上默认上下结构,改完必须多宽度实测

继续看

全部 →