nexu-io/open-design · error · RuntimeError
Unsupported reasoning provider: {provider_name}
Error message
Unsupported reasoning provider: {provider_name} What it means
Raised in mock_runtime after normalizing 'auto' to 'gemini'. The provider name is checked against _MODEL_DEFAULTS, whose keys are exactly gemini, openai, xai, openrouter. Any other value (including typos or partially-supported providers) aborts mock mode before model pins are resolved.
Source
Thrown at design-templates/last30days/scripts/lib/providers.py:247
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_preview(planner_model, role="planner")
_require_gemini_31_preview(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 5be4028344)
Solutions
- Set LAST30DAYS_REASONING_PROVIDER to one of gemini, openai, xai, openrouter, or auto.
- Leave it unset to default to 'gemini' in mock mode.
- If you need a new provider in mock mode, add its (planner, rerank) defaults to _MODEL_DEFAULTS in providers.py.
Example fix
# before LAST30DAYS_REASONING_PROVIDER=anthropic # after LAST30DAYS_REASONING_PROVIDER=gemini
Defensive patterns
Strategy: validation
Validate before calling
SUPPORTED_PROVIDERS = {"gemini", "openai", "xai", "openrouter", "auto"}
def validate_mock_provider(config):
p = (config.get("LAST30DAYS_REASONING_PROVIDER") or "gemini").lower()
if p not in SUPPORTED_PROVIDERS:
raise ValueError(f"Unsupported provider for mock mode: {p!r}")
return p Type guard
null
Try / catch
null
Prevention
- Treat the _MODEL_DEFAULTS keys as the canonical provider allow-list and validate against it in one place.
- Default LAST30DAYS_REASONING_PROVIDER to 'auto' or 'gemini' rather than leaving a chance of an unknown pin.
- Surface a friendly config error at load time instead of letting mock_runtime raise mid-run.
When it happens
Trigger: Setting LAST30DAYS_REASONING_PROVIDER to a string outside {gemini, openai, xai, openrouter, auto} and running in mock mode (no live credentials).
Common situations: Trying to mock with a provider like 'anthropic' or 'mistral' that the runtime does not pin models for. A trailing space or uppercase variant ('OpenAI') after .lower() that still is not in the map (lower handles case, not unknown names).
Related errors
- Gemini selected but no Google API key is configured.
- OpenAI selected but no valid OpenAI auth is configured.
- xAI selected but XAI_API_KEY is not configured.
- OpenRouter selected but OPENROUTER_API_KEY is not configured
- WORKSPACE_AUTHORITY_UNAVAILABLE
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/a0b2a43db622690d.
Report an issue: GitHub.