mvanhorn/last30days-skill · error · RuntimeError
Unsupported reasoning provider: {provider_name}
Error message
Unsupported reasoning provider: {provider_name} What it means
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.
Source
Thrown at skills/last30days/scripts/lib/providers.py:226
default_rerank = GEMINI_PRO
planner_model = config.get("LAST30DAYS_PLANNER_MODEL") or default_planner
rerank_model = config.get("LAST30DAYS_RERANK_MODEL") or default_rerank
if provider_name == "gemini":
_require_gemini_31(planner_model, role="planner")
_require_gemini_31(rerank_model, role="rerank")
return planner_model, rerank_model
def mock_runtime(config: dict[str, Any], depth: str) -> schema.ProviderRuntime:
"""Resolve model pins for mock mode without requiring live credentials."""
provider_name = (config.get("LAST30DAYS_REASONING_PROVIDER") or "gemini").lower()
if provider_name == "auto":
provider_name = "gemini"
if provider_name not in _MODEL_DEFAULTS:
raise RuntimeError(f"Unsupported reasoning provider: {provider_name}")
planner_model, rerank_model = _resolve_model_pins(config, depth, provider_name)
return schema.ProviderRuntime(
reasoning_provider=provider_name,
planner_model=planner_model,
rerank_model=rerank_model,
x_search_backend=_resolve_x_backend(config),
)
def resolve_runtime(config: dict[str, Any], depth: str) -> tuple[schema.ProviderRuntime, ReasoningClient | None]:
"""Resolve the reasoning provider and pinned models."""
provider_name = (config.get("LAST30DAYS_REASONING_PROVIDER") or "auto").lower()
google_key = config.get("GOOGLE_API_KEY") or config.get("GEMINI_API_KEY") or config.get("GOOGLE_GENAI_API_KEY")
openai_token = config.get("OPENAI_API_KEY")
xai_key = config.get("XAI_API_KEY")
View on GitHub (pinned to c7460f6114)
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
Example fix
# before export LAST30DAYS_REASONING_PROVIDER=gemni # typo # after export LAST30DAYS_REASONING_PROVIDER=gemini
Defensive patterns
Strategy: validation
Validate before calling
SUPPORTED = {"gemini", "openai", "xai", "openrouter", "auto"}
provider = (os.environ.get("LAST30DAYS_REASONING_PROVIDER") or "gemini").strip().lower()
assert provider in SUPPORTED, f"set LAST30DAYS_REASONING_PROVIDER to one of {sorted(SUPPORTED)}" Type guard
def is_supported_provider(name: str | None) -> bool:
normalized = (name or "gemini").strip().lower()
return normalized == "auto" or normalized in {"gemini", "openai", "xai", "openrouter"} Try / catch
try:
runtime = mock_runtime(config, depth)
except RuntimeError as e:
if "Unsupported reasoning provider" in str(e):
config["LAST30DAYS_REASONING_PROVIDER"] = "gemini"
runtime = mock_runtime(config, depth) Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Gemini selected but no Google API key is configured.
- xAI selected but XAI_API_KEY is not configured.
- OpenRouter selected but OPENROUTER_API_KEY is not configured
- No sources are available for this run.
- No X backend is available.
AI-assisted analysis of mvanhorn/last30days-skill@c7460f6114 (2026-08-15).
Data as JSON: /api/errors/697152a772dedc78.
Report an issue: GitHub.