can1357/oh-my-pi · error · Error

Usage depleted for ${primary.model.provider}/${primary.model

Error message

Usage depleted for ${primary.model.provider}/${primary.model.id}; reserve policy is fail-closed.

What it means

Before a session starts, the SDK checks provider usage health. When the primary model's provider reports state "depleted" (quota/credits exhausted) and the configured usageReservePolicy is "fail-closed", session creation is aborted instead of silently starting a session that will fail on the first request.

Source

Thrown at packages/coding-agent/src/sdk.ts:2450

					settings.get("retry.usageAwareFallback")
				) {
					let usageHealth: ModelUsageHealth | undefined;
					try {
						usageHealth = await modelRegistry.authStorage.getModelUsageHealth(primary.model.provider, {
							modelId: primary.model.id,
							baseUrl: primary.model.baseUrl,
							reserveFraction: settings.get("retry.usageReservePct") / 100,
						});
					} catch (error) {
						logger.debug("Usage-aware model preflight failed open", {
							provider: primary.model.provider,
							model: primary.model.id,
							error: String(error),
						});
					}
					if (usageHealth?.state === "depleted") {
						if (usageReservePolicy === "fail-closed") {
							throw new Error(
								`Usage depleted for ${primary.model.provider}/${primary.model.id}; reserve policy is fail-closed.`,
							);
						}
						if (modelFallbackEnabled) {
							usageFallbackTriggered = true;
							continue;
						}
					}
					if (usageHealth?.state === "reserve") {
						if (usageReservePolicy === "fail-closed") {
							throw new Error(
								`Usage reserve reached for ${primary.model.provider}/${primary.model.id}; reserve policy is fail-closed.`,
							);
						}
						if (
							modelFallbackEnabled &&
							(usageReservePolicy === "auto" || (!options.hasUI && !options.deferUsageReserveConfirmation))
						) {

View on GitHub (pinned to 9690622007)

Solutions

  1. Top up or restore quota/credits for the provider account
  2. Change usageReservePolicy from "fail-closed" to "auto" (or enable modelFallbackEnabled) so the session falls back to another model
  3. Choose a primary model on a provider whose usage is not depleted

Example fix

// before
await createAgentSession({ usageReservePolicy: "fail-closed", ... });
// after
await createAgentSession({ usageReservePolicy: "auto", modelFallbackEnabled: true, ... });
Defensive patterns

Strategy: fallback

Validate before calling

const health = await getUsageHealth(primaryModel);
if (health?.state === "depleted") console.warn("provider quota depleted before session start");

Type guard

null

Try / catch

try {
  session = await createAgentSession(options);
} catch (err) {
  if (err instanceof Error && err.message.startsWith("Usage depleted")) {
    session = await createAgentSession({ ...options, model: fallbackModel });
  } else throw err;
}

Prevention

When it happens

Trigger: createAgentSession with usageReservePolicy "fail-closed" while the primary model's provider usage health is "depleted" and model fallback is disabled or exhausted.

Common situations: Ran out of API credits/quota for the provider; running in headless/CI environments with a strict fail-closed policy; expired billing causing provider to report zero remaining usage.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/17ac4315799648dc. Report an issue: GitHub.