更新greok调度

This commit is contained in:
2026-07-02 00:25:12 +08:00
parent 4ddf6cc775
commit 803ce31a86
2 changed files with 16 additions and 7 deletions
+10 -5
View File
@@ -131,12 +131,17 @@ func (m *MaintenanceService) tick(ctx context.Context) {
log.Printf("maintenance: roll_reset: %v", err) log.Printf("maintenance: roll_reset: %v", err)
} }
// 1b. Runway tokens have no refresh — once the JWT expiry (its reset marker) // 1b. Runway/grok tokens have no refresh — once the reset marker passes, mark
// passes, mark them dead directly instead of letting them 401 on next use. // them dead directly instead of letting them 401 on next use. Runway's
if n, err := m.tokens.ExpireByReset(ctx, "runway"); err != nil { // marker is the JWT expiry; grok's is the credits reset (grok sso can't be
log.Printf("maintenance: expire_runway: %v", err) // renewed either — 失效就失效 — so a purchased short-lived account that has
// lapsed by its reset time is treated as dead rather than re-scheduled).
for _, pool := range []string{"runway", "grok"} {
if n, err := m.tokens.ExpireByReset(ctx, pool); err != nil {
log.Printf("maintenance: expire_%s: %v", pool, err)
} else if n > 0 { } else if n > 0 {
log.Printf("maintenance: expired %d runway token(s)", n) log.Printf("maintenance: expired %d %s token(s)", n, pool)
}
} }
// 1c. Proactively renew krea/imagine sessions ~10min before expiry so a // 1c. Proactively renew krea/imagine sessions ~10min before expiry so a
+5 -1
View File
@@ -1451,7 +1451,11 @@ func (s *TokenService) Quota(ctx context.Context, pool, id string) (map[string]a
meta["cached_quota_total"] = total meta["cached_quota_total"] = total
} }
patch["meta"] = meta patch["meta"] = meta
if reset := strings.TrimSpace(stringValue(data["reset_after"])); reset != "" { // Recovery time is the death deadline: the maintenance sweep expires a grok
// account once this marker passes (grok sso can't be renewed). Only stamp it
// when still unset (import couldn't resolve it) — never move it forward on a
// later refresh, so an admin opening 账号管理 can't push the death time out.
if reset := strings.TrimSpace(stringValue(data["reset_after"])); reset != "" && strings.TrimSpace(item.CachedQuotaResetAfter) == "" {
patch["cached_quota_reset_after"] = reset patch["cached_quota_reset_after"] = reset
item.CachedQuotaResetAfter = reset item.CachedQuotaResetAfter = reset
} }