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

  1. Update the model-menu scraping selectors in clis/gemini/ask.js to match the current Gemini DOM
  2. Add/retry a longer wait after opening the picker before reading menu items
  3. Run `opencli gemini models` to see whether discovery works standalone and inspect its raw output
  4. 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

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


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/75f1bdaf65e30e94. Report an issue: GitHub.