harry0703/MoneyPrinterTurbo · error · ValueError
{llm_provider}: unsupported llm provider
Error message
{llm_provider}: unsupported llm provider What it means
Provider-resolution failure in _generate_response: get_llm_provider(llm_provider) returned None, meaning the value from config's llm_provider key (lowercased) does not match any registered provider. Raised before any credential checks, so it is purely a config-name mismatch.
Source
Thrown at app/services/llm.py:151
if content is not None:
return _normalize_text_response(content, "qwen")
text = _get_response_field(output, "text") if output else None
return _normalize_text_response(text, "qwen")
def _generate_response(prompt: str, app_config=None) -> str:
try:
# WebUI 在视频生成期间允许用户准备下一条文案。调用方可以传入提交瞬间
# 的配置快照,确保模型请求重试期间不会因为后台任务结束并应用新配置,
# 而切换到另一个 Provider、Base URL 或模型。
runtime_app_config = app_config if app_config is not None else config.app
llm_provider = str(
runtime_app_config.get("llm_provider", DEFAULT_LLM_PROVIDER_ID)
).lower()
provider = get_llm_provider(llm_provider)
if provider is None:
raise ValueError(f"{llm_provider}: unsupported llm provider")
logger.info(f"llm provider: {llm_provider}")
api_key = runtime_app_config.get(provider.config_key("api_key"), "")
configured_model = runtime_app_config.get(provider.config_key("model_name"), "")
model_name = provider.resolve_model_name(configured_model)
if configured_model and model_name != configured_model:
logger.warning(
f"{llm_provider} model '{configured_model}' is deprecated, "
f"fallback to '{model_name}'"
)
configured_base_url = runtime_app_config.get(
provider.config_key("base_url"), ""
)
base_url = provider.resolve_base_url(configured_base_url)
if configured_base_url and configured_base_url.strip().rstrip("/") in {
url.rstrip("/") for url in provider.deprecated_base_urls
}:
logger.warning(View on GitHub (pinned to 1f9f19c202)
Solutions
- List the valid provider ids from the provider registry (the same table get_llm_provider consults) and correct llm_provider in config.toml
- Check for case/whitespace: the value is lowercased before lookup, but trailing spaces in TOML strings survive
- If the id comes from a queued config snapshot, validate it at submission time in the WebUI
- After upgrades, re-read the config docs — provider ids may have been renamed
Example fix
# config.toml before
llm_provider = "openai-compat" # not a registered id
# config.toml after
llm_provider = "openai"
# defensive check at enqueue time
provider = get_llm_provider(str(snapshot.get("llm_provider", "")).lower())
if provider is None:
raise ValueError("unknown llm_provider in submitted config") Defensive patterns
Strategy: validation
Validate before calling
provider = get_llm_provider(str(cfg.get("llm_provider", "")).lower())
if provider is None:
raise ValueError(f"unknown llm_provider; valid: {list_provider_ids()}") Type guard
def is_known_provider(name: str) -> bool:
return get_llm_provider(str(name).lower()) is not None Prevention
- Validate llm_provider at config-save time, not at generation time
- Keep a enum/dropdown in the UI instead of free-text provider entry
When it happens
Trigger: Setting llm_provider in config.toml (or the WebUI config snapshot) to a string that is not a registered provider id — typo like 'opena', removed provider after an upgrade, or a custom provider id never registered via the provider registry.
Common situations: Typos in config.toml, renaming of provider ids between app versions, users copying config snippets from tutorials that reference plugins not installed, or an app_config snapshot queued with a stale provider id.
Related errors
- {llm_provider}: api_key is not set, please set it in the con
- {llm_provider}: model_name is not set, please set it in the
- {llm_provider}: base_url is not set, please set it in the co
- {llm_provider}: {field.config_suffix} is not set, please set
- [{llm_provider}] returned empty response
AI-assisted analysis of harry0703/MoneyPrinterTurbo@1f9f19c202 (2026-08-14).
Data as JSON: /api/errors/380f260aba6d3925.
Report an issue: GitHub.