jackwener/OpenCLI · error · CommandExecutionError
Gemini model discovery returned no selectable models. Gemini
Error message
Gemini model discovery returned no selectable models. Gemini Web may have changed its model selector UI.
What it means
Thrown when Gemini model discovery succeeded mechanically but returned an empty list of selectable models, while a --model value was requested. The library treats this as a sign the Gemini Web model-selector UI changed and models could no longer be scraped.
Source
Thrown at clis/gemini/ask.js:172
// Wait for React to render the menu.
await page.wait(1.0);
// Read model entries from the open menu.
const raw = await page.evaluate(readMenuModelsScript());
discoveredModels = requireDiscoveredModels(raw);
// Close the menu. Thinking support is intentionally not copied from
// the currently-visible UI into every model row: Gemini exposes
// thinking controls for the current selection, not a reliable
// per-model capability matrix.
await page.evaluate(`(() => { try { document.body.click(); } catch (_) {} })()`);
}
// ── Model selection ──────────────────────────────────────────────
if (hasModel) {
const availableModels = discoveredModels || [];
if (!Array.isArray(availableModels) || availableModels.length === 0) {
throw new CommandExecutionError(
'Gemini model discovery returned no selectable models. Gemini Web may have changed its model selector UI.'
);
}
const availableIds = availableModels.map((m) => m?.model).filter(Boolean);
if (!availableIds.includes(modelValue)) {
throw new ArgumentError(
'Unknown model "' + modelValue + '". ' +
'Available models: ' + availableIds.join(', ') + '. ' +
'Use "opencli gemini models" to see available values.'
);
}
await selectGeminiModel(page, modelValue);
}
// ── Thinking validation and selection ──────────────────────────
if (hasThinking) {
// Reuse the pre-discovered models from the shared discovery call.
const discovered = discoveredModels || [];View on GitHub (pinned to 49907e53dc)
Solutions
- Update the model-menu scraping selectors in clis/gemini/ask.js to match the current Gemini DOM
- Add/retry a longer wait after opening the picker before reading menu items
- Run `opencli gemini models` to see whether discovery works standalone and inspect its raw output
- Omit --model so the command uses the default model instead of discovery
Example fix
// before await page.wait(1.0); const models = readMenuItems(); // after await page.wait(3.0); // give React time to render menu items const models = readMenuItems();
Defensive patterns
Strategy: validation
Validate before calling
if (!Array.isArray(discoveredModels) || discoveredModels.length === 0) {
throw new Error('Model discovery empty — run `opencli gemini models` to diagnose');
} Type guard
function hasModels(v) { return Array.isArray(v) && v.length > 0 && v.every(m => typeof m?.model === 'string'); } Try / catch
try {
await askWithModel(model);
} catch (e) {
if (/no selectable models/i.test(e.message)) {
// fall back to default model or re-run discovery after a longer wait
}
} Prevention
- Call `opencli gemini models` first to confirm discovery works
- Allow generous waits for the model menu to render
- Pin/verify model IDs after Gemini UI updates
- Omit --model when unsure to use the default
When it happens
Trigger: hasModel is true but `discoveredModels` is null, not an array, or an empty array at clis/gemini/ask.js:172.
Common situations: Gemini redesigned its model menu so scraping yields zero items; picker opened but menu items render late and were read too early; account/region without model menu; A/B-tested UI variants.
Related errors
- Gemini model discovery returned a malformed result
- Gemini model discovery returned a malformed row
- Codex extract-diff returned an invalid payload.
- No Codex diffs were visible. Run opencli codex send "/review
- No Codex conversations were visible. Open the Codex sidebar
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/75f1bdaf65e30e94.
Report an issue: GitHub.