Repository navigation
v1.7.5 — 模型列表会告诉你「现在用哪个不花钱」
Hy4 preview 晚上 23 点到早上 8 点免费,Hy3 一直在免费期 —— 现在卡片上直接看得出来。
你会看到:模型列表里,当前免费的排在最上面并带标记:
[免费] hy3 x0.00
auto
(23:00 起免费 · 活动至 10-31) hy4-preview x0.29
hy3-x x0.05
到了晚上 23 点,同一行会变成:
[免费至 08:00 · 活动至 10-31] hy4-preview x0.29
[免费] hy3 x0.00
为什么需要专门做:因为上游接口不说这件事。我拉了真实的国内版接口逐字段核对:
| 信息 | 上游提供吗 |
|---|---|
| Hy3 限免 | ✅ 提供 —— credits: "x0.00",倍率本身就是 0,我们一直在正确显示 |
| Hy4 preview 夜间限免 | ❌ 不提供 —— 倍率恒为 x0.29,没有任何时段字段 |
| Hy4 preview 新用户 14 天额度 | ❌ 不提供 —— 积分包里也没有这类条目 |
所以夜间限免这条规则,只能由插件自己带。我把它写成一张规则表(src/promo.ts),包含「哪个平台、哪些 id 前缀、哪些小时、有效期到哪天」。
几个刻意的设计:
- 规则区分平台。这是国内版活动,所以规则里带
region: 'cn',国际版完全不受影响 —— 国际版的hy4-preview-f显示「免费」是因为上游倍率真的是 0(客观事实),不是我们套了活动规则; - 免费状态是「此刻」的,不是模型固有属性。所以同一天里
hy4-preview的标记会变 —— 这才是真实情况; - 窗口外只给一个低调的虚线提示(
23:00 起免费),不给「免费」徽章。因为它此刻确实要花积分,标成免费会让你花错钱; - 只有「此刻免费」的才置顶。窗口外的模型不置顶,否则就是把一个要花钱的模型举到最前面,误导性更强;
- 标出活动截止日(
活动至 10-31)。方便你安排什么时候用 —— 而且活动一旦延期,改日期就能看到,不用翻更新日志; - 规则带过期日期,到 10 月 31 日之后自动失效,不需要有人记得来删代码;
hy4-preview用前缀匹配,因为上游有hy4-preview和hy4-preview-x两个 id,是同一款产品。
关于「新用户 14 天免费额度」——明确没做
你提到「新用户没用过 Hy4 preview,还能免费 14 天,要区分出来」。这个我做不到,而且硬做会更糟:
上游完全不记录「这个账户有没有用过 Hy4 preview」—— 模型目录里没有、积分包里也没有(我实测过,44 个积分包里没有一个试用额度条目)。
唯一能猜的办法是「插件自己记住第一次调用的时间」。但这有个致命问题:它只知道「用本插件之后」的历史。你之前要是在官方客户端用过 Hy4 preview,插件照样会以为你是新用户,然后给你标一个假的「免费」 —— 而你会因此放心去用,结果扣了积分。
给你一个假的「免费」,比不给你标记更糟,因为它直接改变你的花钱决定。所以这条留白,不做推测。
如果你确实需要,可行的做法是你自己确认:卡片上显示的是客观事实(倍率 + 夜间窗口),你清楚自己是不是新用户,看一眼就知道该不该用。
验证
- 类型检查全绿,测试 297 项全绿(+19)。
- 新增
tests/promo.test.ts:23:00–08:00 窗口内/外的判定、跨午夜(23 点在窗口内、8 点不在)、窗口关闭时间(免费至 08:00)、下次开启时间(23:00 起免费)、同族 id(hy4-preview与hy4-preview-x)、零倍率模型全天免费且不误入夜间规则、到期自动失效(10/31 有效、11/1 失效)、免费置顶只认「此刻」免费、活动截止日随状态带出、国际版不受活动影响(但零倍率模型在两边都算免费)。 - 反向验证:清空夜间小时 → 7 项变红;删掉过期日期 → 2 项变红;移除平台过滤 → 「国际版不受影响」变红。确认测试真的能抓住这三类缺陷。
- 用两个平台的真实清单(国内版 16 个 / 国际版 24 个)跑卡片渲染逻辑,在 12:00 与 23:30 核对:国内版
hy4-preview正确显示活动徽章与截止日,国际版完全不受活动规则影响。