mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
## 参考依据 `qoder-credits.ts` 的 `claimQoderDailyCheckin` / `parseQoderCampaigns` / `claimQoderCampaign` / `hasQoderCampaignRefreshedToday`。 参考用**抓包 + 用户报障**定位过三条会「误报」的陷阱,全部在实现与判据里钉死: ### ① 「无可领活动」必须是 inactive,不能报 already-claimed 旧实现 targets 为空就说"今天已领取" ⇒ 只要服务端没下发可领项(含**请求头不完整**、 未到刷新时间、本就无活动三种情形),界面就谎报已领,与官方 IDE 的"可领取"直接矛盾。 用户报障原文:「没领过却显示今日已领取,去 IDE 看还能领」。 ### ② 每日 10:00(UTC+8)刷新;刷新前的 CLAIMED 属于**昨天** 此时说"今天已领取"是谎报,且不可逆(用户以为今天不必再领)。 必须用**算术平移**判 UTC+8 —— 用本机时区在出差/改时区时会判错方向 (偏东提前把当天记为已处理、真漏领;偏西一天判两次)。 ### ③ 未开通要给 action_required 的可操作提示 判据是**两条同时**满足(无 CLAIM_BENEFIT + 用量响应里 `addOnQuota` **字段缺失**)。 ⚠️ 用「字段是否存在」而非「remaining 是否为 0」—— 后者对"额度用光"与"从未开通" 不可区分,会把用光额度的老账号误报成未开通。文案要可操作(去官方客户端登录一次), 并作为显式字段透传给 UI,而不是让 UI 猜文案。 ### 其他要点 - 一个账号可能同时有**多个** CLAIM_BENEFIT 活动 → 逐个领取(实测有每日 100 与运营活动) - 幂等判据是响应体的 **`replayed`**,不是 HTTP 状态码:重复领取同样回 200, 但 `replayed:true` 且不含 benefit(只看状态码会把"今天已领"误报成"成功 +100") - 请求体必须是**空串**(抓包实测 `content-length: 0`) - 缺 `Cosy-MachineToken/MachineType` 时服务端不下发可领活动(见上一个提交) ## 判据 - `TestQoderClaimDecisionTable`:6 个用例覆盖四类结果 + claim 次数 + body 必须为空 - `TestQoderRefreshUsesUTC8NotLocalTime`:**注入 UTC 时刻**验证刷新判定 ★ 修判据自身两处缺陷(首轮变异存活): 1. `TestMain` 把测试进程 TZ 钉成 **UTC** —— 本机恰是 HKT(+0800),于是 「UTC 平移」与「本机时区」结果**完全相同**,误用本机时区的实现抓不到(判据不可达)。 2. 决策表缺「无任何活动且已开通(addOnQuota 存在)」用例 → 把 inactive 误报成 already-claimed 的变异得以存活。补齐后两个变异都被抓。 ## 统一前向声明(Lua 作用域,本文件第 N 次) 把 `qoderMachineIdentity / rfc3986Escape / newToken / lobsteraiClientVersion` 统一在 PLATFORMS 之前前向声明。此前逐个补、位置还放错过一次,导致运行时报 `attempt to call global 'x' (a nil value)` 而编译期静默。 ## 文档 `docs/channels-parity.md` 更新:gemini-sigstore 标注为**⛔ 不适用** (llmsproxy 的推理走无状态适配器,插件不参与推理 —— 插件侧缓存会成为死代码; 若将来要支持,位置在适配器侧,与"适配器无状态"约定冲突,须单独决策)。
23 lines
729 B
Go
23 lines
729 B
Go
package core
|
||
|
||
import (
|
||
"os"
|
||
"testing"
|
||
"time"
|
||
)
|
||
|
||
// 把测试进程的时区钉成 **UTC**。
|
||
//
|
||
// 为什么必需:Qoder 的每日活动按 **UTC+8** 结算,判定必须用算术平移而不是
|
||
// 本机时区。但这台机器**本身就是 HKT(+0800)** —— 于是在真实环境里
|
||
// 「os.date("!*t")(UTC 平移)」与「os.date("*t")(本机时区)」结果**完全相同**,
|
||
// 判据无法区分二者(实测:把实现改成用本机时区,判据照样通过)。
|
||
// 钉成 UTC 后两者相差 8 小时,误用本机时区的实现立刻暴露。
|
||
//
|
||
// 只影响测试进程,不改系统时区。
|
||
func TestMain(m *testing.M) {
|
||
os.Setenv("TZ", "UTC")
|
||
time.Local = time.UTC
|
||
os.Exit(m.Run())
|
||
}
|