| summary | read_when | |||
|---|---|---|---|---|
Gemini provider data sources: OAuth-backed quota APIs, token refresh, and tier detection. |
|
Gemini uses the Gemini CLI OAuth credentials and private quota APIs. No browser cookies.
-
OAuth-backed quota API (only path used in
fetch())- Reads auth type from
~/.gemini/settings.json. - Supported:
oauth-personal(or unknown → try OAuth creds). - Unsupported:
api-key,vertex-ai(hard error).
- Reads auth type from
-
Legacy CLI parsing (parser exists but not used in current fetch path)
GeminiStatusProbe.parse(text:)can parse/statsoutput.
- File:
~/.gemini/oauth_creds.json. - Required fields:
access_token,refresh_token(optional),id_token,expiry_date. - If access token is expired, we refresh via Google OAuth using client ID/secret extracted from the Gemini CLI install (see below).
- We locate the installed
geminibinary, then search for:- Homebrew nested path:
.../libexec/lib/node_modules/@google/gemini-cli/node_modules/@google/gemini-cli-core/dist/src/code_assist/oauth2.js
- Bun/npm sibling path:
.../node_modules/@google/gemini-cli-core/dist/src/code_assist/oauth2.js
- Homebrew nested path:
- Regex extraction:
OAUTH_CLIENT_IDandOAUTH_CLIENT_SECRETfromoauth2.js.
- Quota:
POST https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota- Body:
{ "project": "<projectId>" }(or{}if unknown) - Header:
Authorization: Bearer <access_token>
- Project discovery (quota project ID):
- Primary:
cloudaicompanionProjectfromloadCodeAssist. - Fallback:
GET https://cloudresourcemanager.googleapis.com/v1/projects- Picks
gen-lang-client*or labelgenerative-language.
- Picks
- Primary:
- Tier detection:
POST https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist- Body:
{ "metadata": { "ideType": "GEMINI_CLI", "pluginType": "GEMINI" } }
- Token refresh:
POST https://oauth2.googleapis.com/token- Form body:
client_id,client_secret,refresh_token,grant_type=refresh_token.
- Quota buckets:
remainingFraction,resetTime,modelId.- For each model, lowest
remainingFractionwins. percentLeft = remainingFraction * 100.
- Reset:
resetTimeparsed as ISO-8601, formatted as "Resets in Xh Ym".
- UI mapping:
- Primary: Pro models (lowest percent left).
- Secondary: Flash models (lowest percent left).
- Tier from
loadCodeAssist:standard-tier→ "Paid"free-tier+hdclaim → "Workspace"free-tier→ "Free"legacy-tier→ "Legacy"
- Email from
id_tokenJWT claims.
Sources/CodexBarCore/Providers/Gemini/GeminiStatusProbe.swift