{"record":{"id":"697152a772dedc78","repo":"mvanhorn/last30days-skill","slug":"unsupported-reasoning-provider-provider-name","errorCode":null,"errorMessage":"Unsupported reasoning provider: {provider_name}","messagePattern":"Unsupported reasoning provider: (.+?)","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"skills/last30days/scripts/lib/providers.py","lineNumber":226,"sourceCode":"        default_rerank = GEMINI_PRO\n\n    planner_model = config.get(\"LAST30DAYS_PLANNER_MODEL\") or default_planner\n    rerank_model = config.get(\"LAST30DAYS_RERANK_MODEL\") or default_rerank\n\n    if provider_name == \"gemini\":\n        _require_gemini_31(planner_model, role=\"planner\")\n        _require_gemini_31(rerank_model, role=\"rerank\")\n\n    return planner_model, rerank_model\n\n\ndef mock_runtime(config: dict[str, Any], depth: str) -> schema.ProviderRuntime:\n    \"\"\"Resolve model pins for mock mode without requiring live credentials.\"\"\"\n    provider_name = (config.get(\"LAST30DAYS_REASONING_PROVIDER\") or \"gemini\").lower()\n    if provider_name == \"auto\":\n        provider_name = \"gemini\"\n    if provider_name not in _MODEL_DEFAULTS:\n        raise RuntimeError(f\"Unsupported reasoning provider: {provider_name}\")\n\n    planner_model, rerank_model = _resolve_model_pins(config, depth, provider_name)\n    return schema.ProviderRuntime(\n        reasoning_provider=provider_name,\n        planner_model=planner_model,\n        rerank_model=rerank_model,\n\n        x_search_backend=_resolve_x_backend(config),\n    )\n\n\ndef resolve_runtime(config: dict[str, Any], depth: str) -> tuple[schema.ProviderRuntime, ReasoningClient | None]:\n    \"\"\"Resolve the reasoning provider and pinned models.\"\"\"\n    provider_name = (config.get(\"LAST30DAYS_REASONING_PROVIDER\") or \"auto\").lower()\n    google_key = config.get(\"GOOGLE_API_KEY\") or config.get(\"GEMINI_API_KEY\") or config.get(\"GOOGLE_GENAI_API_KEY\")\n    openai_token = config.get(\"OPENAI_API_KEY\")\n    xai_key = config.get(\"XAI_API_KEY\")\n","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/mvanhorn/last30days-skill/blob/c7460f6114449ddfe6ea3fc2f23c3d910c0e740c/skills/last30days/scripts/lib/providers.py#L208-L244","documentation":"RuntimeError raised in mock_runtime when LAST30DAYS_REASONING_PROVIDER (after 'auto' maps to 'gemini') is not a key in _MODEL_DEFAULTS. Mock mode resolves model pins without live credentials but still requires a known provider name; unknown names are rejected here.","triggerScenarios":"Running the engine in mock mode with LAST30DAYS_REASONING_PROVIDER set to a typo ('gemni', 'Gemeni' after .lower(), 'azure') or a provider added to resolve_runtime but not to _MODEL_DEFAULTS.","commonSituations":"Typos in .env; copy-pasting provider names from other tools; adding a new provider to the real resolution path but forgetting the mock path; CI mock runs with a stale env file.","solutions":["Set LAST30DAYS_REASONING_PROVIDER to a supported value (gemini, openai, xai, openrouter) or 'auto'","Check the exact spelling in ~/.config/last30days/.env and the session environment","If you added a custom provider, register its defaults in _MODEL_DEFAULTS as well"],"exampleFix":"# before\nexport LAST30DAYS_REASONING_PROVIDER=gemni  # typo\n\n# after\nexport LAST30DAYS_REASONING_PROVIDER=gemini","handlingStrategy":"validation","validationCode":"SUPPORTED = {\"gemini\", \"openai\", \"xai\", \"openrouter\", \"auto\"}\nprovider = (os.environ.get(\"LAST30DAYS_REASONING_PROVIDER\") or \"gemini\").strip().lower()\nassert provider in SUPPORTED, f\"set LAST30DAYS_REASONING_PROVIDER to one of {sorted(SUPPORTED)}\"","typeGuard":"def is_supported_provider(name: str | None) -> bool:\n    normalized = (name or \"gemini\").strip().lower()\n    return normalized == \"auto\" or normalized in {\"gemini\", \"openai\", \"xai\", \"openrouter\"}","tryCatchPattern":"try:\n    runtime = mock_runtime(config, depth)\nexcept RuntimeError as e:\n    if \"Unsupported reasoning provider\" in str(e):\n        config[\"LAST30DAYS_REASONING_PROVIDER\"] = \"gemini\"\n        runtime = mock_runtime(config, depth)","preventionTips":["Validate provider names once at startup against the supported set","Normalize (strip/lower) provider env values before use","Keep _MODEL_DEFAULTS in sync when adding providers to resolve_runtime"],"tags":["providers","configuration","mock-mode","runtimeerror"],"backgroundTag":null,"analyzedSha":"c7460f6114449ddfe6ea3fc2f23c3d910c0e740c","analyzedAt":"2026-08-15T03:34:49.540Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}