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

  1. List the valid provider ids from the provider registry (the same table get_llm_provider consults) and correct llm_provider in config.toml
  2. Check for case/whitespace: the value is lowercased before lookup, but trailing spaces in TOML strings survive
  3. If the id comes from a queued config snapshot, validate it at submission time in the WebUI
  4. 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

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


AI-assisted analysis of harry0703/MoneyPrinterTurbo@1f9f19c202 (2026-08-14). Data as JSON: /api/errors/380f260aba6d3925. Report an issue: GitHub.