decolua/9router · warning
[AutoPing] ${provider}:${connection.id}: ping failed (reset
Error message
[AutoPing] ${provider}:${connection.id}: ping failed (reset ${resetAt}) What it means
After a successful credential refresh and usage lookup, pingConnection sends a minimal 'ping' request upstream to start/confirm the quota window (handler.sendPing). If the upstream does not accept it (sendPing returns false — non-2xx response, provider rejected the tiny request, streaming setup failed), the failure is cached (cooldown) and this warning logs the reset time. lastPingedResetAt is deliberately NOT updated so the ping is retried after cooldown.
Source
Thrown at src/shared/services/quotaAutoPing.js:235
state.resetCache[key] = resetAt;
if (providerConfig.skipWhenBlockingQuotaExhausted && hasExhaustedBlockingQuota(quotas, providerConfig.quotaKey)) return;
if (isQuotaExhausted(quota)) return;
const now = Date.now();
const resetKey = normalizeResetKey(resetAt);
const lastPingedResetKey = connection.lastPingedResetKey || normalizeResetKey(connection.lastPingedResetAt);
// Claude waits for reset. Codex pings only when resetAt slides, which means the 5h window is inactive.
if (!shouldPingForReset(providerConfig, cachedReset, resetAt, now)) return;
if (wasPingedRecently(connection, providerConfig.minPingIntervalMs, now)) return;
if (lastPingedResetKey === resetKey) return;
const ok = await handler.sendPing(connection, providerConfig, proxyOptions, deps);
if (!ok) {
// Do not mark reset as pinged unless upstream accepted the tiny request.
state.failureCache[key] = Date.now();
console.warn(`[AutoPing] ${provider}:${connection.id}: ping failed (reset ${resetAt})`);
return;
}
delete state.failureCache[key];
await deps.updateProviderConnection(connection.id, {
lastPingedResetAt: resetAt,
lastPingedResetKey: resetKey,
lastPingAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
});
console.log(`[AutoPing] ${provider}:${connection.id}: ping sent (reset ${resetAt})`);
}
function createDefaultDeps() {
return {
getSettings,
getProviderConnections,
updateProviderConnection,View on GitHub (pinned to 90b52e06ff)
Solutions
- Wait for the failure cooldown to elapse — the ping is retried automatically on a later tick.
- Check the provider account status/quota in its dashboard; a hard-exhausted or flagged account won't accept pings.
- Verify providerConfig.pingModel is still valid for the account and adjust it if the model was renamed.
- Test the provider endpoint manually with the same model; if 429/401/403, fix auth/plan issues before expecting the ping to succeed.
Defensive patterns
Strategy: retry
Validate before calling
// sanity-check the ping model is accepted by the account before enabling auto-ping
const r = await fetch(baseUrl + "/v1/chat/completions", {
method: "POST",
headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" },
body: JSON.stringify({ model: providerConfig.pingModel, max_tokens: 1, messages: [{ role: "user", content: "hi" }] })
});
if (!r.ok) console.warn("ping model rejected by upstream:", r.status); Try / catch
// failure cache + retry is built in; alert only if the same reset window keeps failing
if (state.failureCache[key] && Date.now() - state.failureCache[key] > 3 * C.failureCooldownMs) {
console.warn(`[AutoPing] ${provider} persistent ping failure — check account/model`);
} Prevention
- Keep providerConfig.pingModel set to a cheap, always-available model.
- Check account quota/plan status in the provider dashboard for hard-exhausted accounts.
- Investigate 429/5xx spikes on the provider before expecting pings to succeed.
- Ensure lastPingedResetKey isn't manually cleared, causing retry storms against a rejecting upstream.
When it happens
Trigger: handler.sendPing(connection, providerConfig, proxyOptions, deps) returns false: upstream chat/completions endpoint rejects the ping request (model unavailable, 429/5xx, auth scopes insufficient, account flagged), or response.ok is false; resetAt identifies the quota window that failed to be started.
Common situations: Provider outage or rate limiting at reset time; ping model removed/renamed in providerConfig; account lacking permission to call the ping model; streaming endpoint blocked by proxy; exhausted account that cannot accept even a tiny request.
Related errors
- All accounts unavailable
- [${provider}/${model}] ${errorMsg}
- FUSION Panel ${model} failed
- Kiro tool input changed fragment type
- MiMo bootstrap failed: ${response.status}
AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30).
Data as JSON: /api/errors/77c9201edf641bad.
Report an issue: GitHub.