{"record":{"id":"17ac4315799648dc","repo":"can1357/oh-my-pi","slug":"usage-depleted-for-primary-model-provider-pri","errorCode":null,"errorMessage":"Usage depleted for ${primary.model.provider}/${primary.model.id}; reserve policy is fail-closed.","messagePattern":"Usage depleted for (.+?)/(.+?); reserve policy is fail-closed\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/sdk.ts","lineNumber":2450,"sourceCode":"\t\t\t\t\tsettings.get(\"retry.usageAwareFallback\")\n\t\t\t\t) {\n\t\t\t\t\tlet usageHealth: ModelUsageHealth | undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tusageHealth = await modelRegistry.authStorage.getModelUsageHealth(primary.model.provider, {\n\t\t\t\t\t\t\tmodelId: primary.model.id,\n\t\t\t\t\t\t\tbaseUrl: primary.model.baseUrl,\n\t\t\t\t\t\t\treserveFraction: settings.get(\"retry.usageReservePct\") / 100,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger.debug(\"Usage-aware model preflight failed open\", {\n\t\t\t\t\t\t\tprovider: primary.model.provider,\n\t\t\t\t\t\t\tmodel: primary.model.id,\n\t\t\t\t\t\t\terror: String(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (usageHealth?.state === \"depleted\") {\n\t\t\t\t\t\tif (usageReservePolicy === \"fail-closed\") {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Usage depleted for ${primary.model.provider}/${primary.model.id}; reserve policy is fail-closed.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (modelFallbackEnabled) {\n\t\t\t\t\t\t\tusageFallbackTriggered = true;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (usageHealth?.state === \"reserve\") {\n\t\t\t\t\t\tif (usageReservePolicy === \"fail-closed\") {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Usage reserve reached for ${primary.model.provider}/${primary.model.id}; reserve policy is fail-closed.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmodelFallbackEnabled &&\n\t\t\t\t\t\t\t(usageReservePolicy === \"auto\" || (!options.hasUI && !options.deferUsageReserveConfirmation))\n\t\t\t\t\t\t) {","sourceCodeStart":2432,"sourceCodeEnd":2468,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/sdk.ts#L2432-L2468","documentation":"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.","triggerScenarios":"createAgentSession with usageReservePolicy \"fail-closed\" while the primary model's provider usage health is \"depleted\" and model fallback is disabled or exhausted.","commonSituations":"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.","solutions":["Top up or restore quota/credits for the provider account","Change usageReservePolicy from \"fail-closed\" to \"auto\" (or enable modelFallbackEnabled) so the session falls back to another model","Choose a primary model on a provider whose usage is not depleted"],"exampleFix":"// before\nawait createAgentSession({ usageReservePolicy: \"fail-closed\", ... });\n// after\nawait createAgentSession({ usageReservePolicy: \"auto\", modelFallbackEnabled: true, ... });","handlingStrategy":"fallback","validationCode":"const health = await getUsageHealth(primaryModel);\nif (health?.state === \"depleted\") console.warn(\"provider quota depleted before session start\");","typeGuard":"null","tryCatchPattern":"try {\n  session = await createAgentSession(options);\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith(\"Usage depleted\")) {\n    session = await createAgentSession({ ...options, model: fallbackModel });\n  } else throw err;\n}","preventionTips":["Monitor provider quota/balance before launching sessions","Configure modelFallbackEnabled with usageReservePolicy \"auto\" in headless environments","Alert on usage-health state transitions instead of failing session creation"],"tags":["quota","billing","usage"],"backgroundTag":"quota-exceeded","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}