HKUDS/nanobot · error · ValueError

No API key configured for provider

Error message

No API key configured for provider '{provider_name}'.

What it means

Credential guard in _resolve_provider_setup: for anthropic and openai_compat backends (except bedrock-prefixed models, which use AWS credentials) neither the provider config nor the environment supplies an API key. The provider client would fail on first request, so the factory fails fast. This is a sentinel validation raised from the key-exemption check (needs_key/exempt logic).

Solutions

  1. Set providers.<name>.apiKey in config
  2. Export the provider's standard key environment variable (e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY)
  3. If using Bedrock (model prefixed bedrock/), the key is not required — verify the model name prefix is correct
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at nanobot/providers/factory.py:123 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of HKUDS/nanobot@42f37dc4c0 (2026-08-26). Data as JSON: /api/errors/d92aaf7b9b8c3f6b. Report an issue: GitHub.

Appendix: source

Thrown at nanobot/providers/factory.py:123

    if backend == "azure_openai":
        if not p or not p.api_base:
            raise ValueError("Azure OpenAI requires api_base in config.")
    elif (
        backend == "openai_compat"
        and spec
        and spec.is_direct
        and not spec.default_api_base
        and not (p and p.api_base)
    ):
        raise ValueError(f"Provider '{provider_name}' requires api_base in config.")
    elif backend in {"anthropic", "openai_compat"} and not (
        backend == "openai_compat" and model.startswith("bedrock/")
    ):
        needs_key = not (p and p.api_key)
        exempt = spec and (spec.is_oauth or spec.is_local or spec.is_direct)
        if needs_key and not exempt:
            raise ValueError(f"No API key configured for provider '{provider_name}'.")

    return _ProviderSetup(
        model=model,
        provider_name=provider_name,
        provider_config=p,
        spec=spec,
        backend=backend,
    )


def validate_provider_setup(
    config: Config,
    *,
    preset_name: str | None = None,
    preset: ModelPresetConfig | None = None,
    model: str | None = None,
) -> None:
    """Validate local provider/model settings without loading a provider client."""

View on GitHub (pinned to 42f37dc4c0)