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

  1. Wait for the failure cooldown to elapse — the ping is retried automatically on a later tick.
  2. Check the provider account status/quota in its dashboard; a hard-exhausted or flagged account won't accept pings.
  3. Verify providerConfig.pingModel is still valid for the account and adjust it if the model was renamed.
  4. 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

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


AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30). Data as JSON: /api/errors/77c9201edf641bad. Report an issue: GitHub.