mirror of
https://github.com/openai/codex.git
synced 2026-09-11 20:36:49 +00:00
## Why When ordinary included usage is exhausted, eligible users need a way to keep working with the backend-provided Luna Reserve quota and return to their previous model once ordinary usage recovers. ## What changed - Automatically switch eligible TUI tasks to Luna Reserve after an authoritative account usage read, preserving the prior model and reasoning effort per task. - Restrict model selection while on Reserve to its supported reasoning levels, keep queued turns on the accepted model, and restore the saved model after a fresh read confirms recovery. - Surface Reserve usage in the composer and `/status`, and expose `normalModelSlug` in app-server rate-limit snapshots so clients can use the associated model's display metadata without changing the request model. - Poll account limits more frequently near exhaustion and retain compatibility with app servers that only accept the legacy null request parameters. ## Testing - Added coverage for Reserve entry, queued-turn handling, task reconstruction, recovery authorization, account changes, model selection, usage rendering, and banner dismissal. GitOrigin-RevId: 46a435e9531051f8cec3f6a46c4b9f7cfa479747
338 lines
8.0 KiB
JSON
Generated
338 lines
8.0 KiB
JSON
Generated
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"definitions": {
|
|
"CreditsSnapshot": {
|
|
"properties": {
|
|
"balance": {
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"hasCredits": {
|
|
"type": "boolean"
|
|
},
|
|
"unlimited": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"required": [
|
|
"hasCredits",
|
|
"unlimited"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"PlanType": {
|
|
"enum": [
|
|
"free",
|
|
"go",
|
|
"plus",
|
|
"pro",
|
|
"prolite",
|
|
"team",
|
|
"self_serve_business_prolite",
|
|
"self_serve_business_usage_based",
|
|
"business",
|
|
"ent26",
|
|
"enterprise_cbp_automation",
|
|
"enterprise_cbp_usage_based",
|
|
"enterprise",
|
|
"edu",
|
|
"edu_plus",
|
|
"edu_pro",
|
|
"unknown"
|
|
],
|
|
"type": "string"
|
|
},
|
|
"RateLimitReachedType": {
|
|
"enum": [
|
|
"rate_limit_reached",
|
|
"workspace_owner_credits_depleted",
|
|
"workspace_member_credits_depleted",
|
|
"workspace_owner_usage_limit_reached",
|
|
"workspace_member_usage_limit_reached"
|
|
],
|
|
"type": "string"
|
|
},
|
|
"RateLimitResetCredit": {
|
|
"properties": {
|
|
"description": {
|
|
"description": "Backend-provided display description for this credit, or `null` when unavailable.",
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"expiresAt": {
|
|
"description": "Unix timestamp in seconds when the credit expires, or `null` if it does not expire.",
|
|
"format": "int64",
|
|
"type": [
|
|
"integer",
|
|
"null"
|
|
]
|
|
},
|
|
"grantedAt": {
|
|
"description": "Unix timestamp in seconds when the credit was granted.",
|
|
"format": "int64",
|
|
"type": "integer"
|
|
},
|
|
"id": {
|
|
"description": "Opaque backend identifier for this reset credit.",
|
|
"type": "string"
|
|
},
|
|
"resetType": {
|
|
"$ref": "#/definitions/RateLimitResetType"
|
|
},
|
|
"status": {
|
|
"$ref": "#/definitions/RateLimitResetCreditStatus"
|
|
},
|
|
"title": {
|
|
"description": "Backend-provided display title for this credit, or `null` when unavailable.",
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"grantedAt",
|
|
"id",
|
|
"resetType",
|
|
"status"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"RateLimitResetCreditStatus": {
|
|
"enum": [
|
|
"available",
|
|
"redeeming",
|
|
"redeemed",
|
|
"unknown"
|
|
],
|
|
"type": "string"
|
|
},
|
|
"RateLimitResetCreditsSummary": {
|
|
"properties": {
|
|
"availableCount": {
|
|
"format": "int64",
|
|
"type": "integer"
|
|
},
|
|
"credits": {
|
|
"description": "Detail rows for available reset credits, when the backend provides them.\n\n`null` means only `availableCount` is known, while an empty array means details were fetched and no available credits were returned. The backend may cap this list, so its length can be less than `availableCount`.",
|
|
"items": {
|
|
"$ref": "#/definitions/RateLimitResetCredit"
|
|
},
|
|
"type": [
|
|
"array",
|
|
"null"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"availableCount"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"RateLimitResetType": {
|
|
"enum": [
|
|
"codexRateLimits",
|
|
"unknown"
|
|
],
|
|
"type": "string"
|
|
},
|
|
"RateLimitSnapshot": {
|
|
"properties": {
|
|
"credits": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/CreditsSnapshot"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"individualLimit": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/SpendControlLimitSnapshot"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"limitId": {
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"limitName": {
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"normalModelSlug": {
|
|
"description": "Normal model whose display name and reasoning options describe this quota alias.",
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"planType": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/PlanType"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"primary": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/RateLimitWindow"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"rateLimitReachedType": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/RateLimitReachedType"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"secondary": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/RateLimitWindow"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"spendControlReached": {
|
|
"description": "Backend-reported spend-control state. `None` is unavailable, not a sparse-update recovery.",
|
|
"type": [
|
|
"boolean",
|
|
"null"
|
|
]
|
|
}
|
|
},
|
|
"type": "object"
|
|
},
|
|
"RateLimitWindow": {
|
|
"properties": {
|
|
"resetsAt": {
|
|
"format": "int64",
|
|
"type": [
|
|
"integer",
|
|
"null"
|
|
]
|
|
},
|
|
"usedPercent": {
|
|
"format": "int32",
|
|
"type": "integer"
|
|
},
|
|
"windowDurationMins": {
|
|
"format": "int64",
|
|
"type": [
|
|
"integer",
|
|
"null"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"usedPercent"
|
|
],
|
|
"type": "object"
|
|
},
|
|
"SpendControlLimitSnapshot": {
|
|
"properties": {
|
|
"limit": {
|
|
"type": "string"
|
|
},
|
|
"remainingPercent": {
|
|
"format": "int32",
|
|
"type": "integer"
|
|
},
|
|
"resetsAt": {
|
|
"format": "int64",
|
|
"type": "integer"
|
|
},
|
|
"used": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": [
|
|
"limit",
|
|
"remainingPercent",
|
|
"resetsAt",
|
|
"used"
|
|
],
|
|
"type": "object"
|
|
}
|
|
},
|
|
"properties": {
|
|
"accountId": {
|
|
"description": "Account associated with this usage snapshot, when supplied by the backend.",
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"ordinaryUsageAllowed": {
|
|
"description": "Backend permission for ordinary included usage, validated against the active account. Null means unavailable; clients must not infer recovery from percentages or reset times.",
|
|
"type": [
|
|
"boolean",
|
|
"null"
|
|
]
|
|
},
|
|
"rateLimitResetCredits": {
|
|
"anyOf": [
|
|
{
|
|
"$ref": "#/definitions/RateLimitResetCreditsSummary"
|
|
},
|
|
{
|
|
"type": "null"
|
|
}
|
|
]
|
|
},
|
|
"rateLimitUpsell": {
|
|
"description": "Optional backend-owned banner from the same usage read. Its nested keys retain the backend's snake_case contract; an absent banner leaves the client's existing UI unchanged."
|
|
},
|
|
"rateLimits": {
|
|
"allOf": [
|
|
{
|
|
"$ref": "#/definitions/RateLimitSnapshot"
|
|
}
|
|
],
|
|
"description": "Backward-compatible single-bucket view; mirrors the historical payload."
|
|
},
|
|
"rateLimitsByLimitId": {
|
|
"additionalProperties": {
|
|
"$ref": "#/definitions/RateLimitSnapshot"
|
|
},
|
|
"description": "Multi-bucket view keyed by metered `limit_id` (for example, `codex`).",
|
|
"type": [
|
|
"object",
|
|
"null"
|
|
]
|
|
}
|
|
},
|
|
"required": [
|
|
"rateLimits"
|
|
],
|
|
"title": "GetAccountRateLimitsResponse",
|
|
"type": "object"
|
|
} |