Repository navigation
v0.7.0:legacy Qoder 账号签到/积分/目录刷新报 account not found,worker 回退未生效 #329
Description
Description
v0.7.0 的 in-process PAT bridge(#313,commit 483810e)对升级前添加的 legacy Qoder 账号存在回归:这类账号只有 legacy CLI blob、没有 credential-payload 行,升级后未重新登录时,定时签到、控制台积分刷新、模型目录刷新全部以 "account not found" 失败,worker 回退路径不会生效,账号在网关请求时不可用。
重新用 PAT 登录后 payload 行生成、走 in-process 路径,症状消失,因此该问题容易被当成"凭据过期/需要重新登录"而漏报;但在 #313 的设计里 legacy 账号本应继续由 Node worker 承接。
Steps to Reproduce
- 在 v0.7.0 之前的版本上通过 CLI blob 登录添加 Qoder 账号(不产生 credential-payload 行)
- 升级到 v0.7.0,不重新登录
- 观察定时签到 / 控制台"刷新积分" / 模型目录刷新,返回 "account not found"
Expected Behavior
按 Bridge() 注释声明的设计意图,legacy 账号应返回 ErrPATRequired,Models / Quota / Checkin 据此回退到 worker 路径,账号继续可用。
Actual Behavior
internal/providers/qoder/pat.go 的 Bridge()(v0.7.0 tag 第 159 行附近)中,LoadCredentialPayload 出错时原样透传:
format, payload, err := store.LoadCredentialPayload(ctx, accountID)
if err != nil {
return nil, err // legacy 账号无 payload 行,透传的是 store 的 ErrAccountNotFound
}只有 store == nil 一种情形返回 ErrPATRequired。legacy 账号拿到的是 store 的 ErrAccountNotFound,而调用方的回退分支只认 ErrPATRequired(internal/providers/qoder/adapter.go 约 221/531 行,checkin.go 约 44 行):
} else if !errors.Is(err, ErrPATRequired) {
return nil, err
}
// Legacy fallback: account has no PAT, talk to the worker.错误类型不匹配,回退分支永远走不进去,整个调用直接失败。
Possible Fix
把 payload 行缺失映射回哨兵错误即可(我们在 fork 上验证过该修复对 legacy 账号生效,签到/积分/目录均正常回退到 worker):
format, payload, err := store.LoadCredentialPayload(ctx, accountID)
if err != nil {
if errors.Is(err, accounts.ErrAccountNotFound) {
return nil, ErrPATRequired
}
return nil, err
}第二组回归:PAT 登录成功后不显示额度,签到也不可用
同样由 #313 引入、影响的是新登录 PAT 账号(有 credential-payload 行)这一侧:
额度不刷新(机制已定位)。 v0.7.0 的 qoder adapter 未注册 Prober(Adapter() 返回的 bundle 不含 Prober),而额度刷新的所有路径都依赖它:
internal/runtime/manager_maintenance.go的refreshCheckinQuota/refreshQuotaOnly:adapter.Prober != nil才走fetchProviderQuota,否则回落 worker URLinternal/runtime/manager_probe.go的refreshInProcess:probe 成功后才触发额度刷新与状态落库
PAT 账号走 in-process 路径、没有 worker URL,Prober 又未注册,两条路都不满足:登录成功后额度永不刷新,控制台不显示额度,账号状态也停留在未就绪/离线(refreshOne 不 probe 无 URL 的 child-runtime item)。
签到不可用(实测观察)。 签到链路对 PAT 账号走 Bridge 的 in-process campaigns 接口。我们在修复环境的实测:PAT 账号 in-process 签到返回"签到活动未开放"(campaigns 接口无可领活动),同一时刻同体系的 legacy worker 账号签到成功(+100 积分)——两条签到路径的活动可见性不一致,PAT 账号签不上、拿不到积分。另外若 bridge() 返回非 ErrPATRequired 错误(如 session 刷新失败),签到同样没有 worker 回退,直接失败。
修复方向(fork 上已验证)。 注册 Prober 并让 Probe 先经 Bridge() 探测(legacy 账号回落 worker /health),refreshInProcess 即可恢复额度刷新与状态持久化;签到活动可见性差异建议单独核对 in-process campaigns 接口与 worker /admin/checkin 的 token 类型 / 入口是否一致(CN 区 securityOauthToken 与 OpenAPI token 的活动入口)。
关联
- PAT bridge 引入:feat(qoder): in-process PAT bridge, reasoning stream, and in-process check-in #313
- Qoder 冷启动首次探活失败后不自动恢复,刷新积分才重新可用 #318 报告的"冷启动探活失败后不自动恢复"是 v0.6 基线已存在的另一机制(探活无复探),与本 issue 不同,但同属账号不可用症状
Environment
- v0.7.0(Linux Docker 部署,fork 环境合并 v0.7.0 tag 后排查定位)
Activity