{"record":{"id":"d5254dc4c4cae9d5","repo":"invoke-ai/InvokeAI","slug":"unknown-external-provider-provider-id","errorCode":null,"errorMessage":"Unknown external provider '{provider_id}'","messagePattern":"Unknown external provider '(.+?)'","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"error","filePath":"invokeai/app/api/routers/app_info.py","lineNumber":366,"sourceCode":"    provider_id: str = Path(description=\"The external provider identifier\"),\n) -> ExternalProviderConfigModel:\n    api_key_field, base_url_field = _get_external_provider_fields(provider_id)\n    _apply_external_provider_update({api_key_field: None, base_url_field: None})\n    _remove_external_models_for_provider(provider_id)\n    return _build_external_provider_config(provider_id, get_config())\n\n\ndef status_to_model(status: ExternalProviderStatus) -> ExternalProviderStatusModel:\n    return ExternalProviderStatusModel(\n        provider_id=status.provider_id,\n        configured=status.configured,\n        message=status.message,\n    )\n\n\ndef _get_external_provider_fields(provider_id: str) -> tuple[str, str]:\n    if provider_id not in EXTERNAL_PROVIDER_FIELDS:\n        raise HTTPException(status_code=404, detail=f\"Unknown external provider '{provider_id}'\")\n    return EXTERNAL_PROVIDER_FIELDS[provider_id]\n\n\ndef _write_external_api_keys_file(api_keys_file_path: FilePath, api_keys: dict[str, str]) -> None:\n    if not api_keys:\n        if api_keys_file_path.exists():\n            api_keys_file_path.unlink()\n        return\n\n    api_keys_file_path.parent.mkdir(parents=True, exist_ok=True)\n    with open(api_keys_file_path, \"w\", encoding=locale.getpreferredencoding()) as api_keys_file:\n        yaml.safe_dump(api_keys, api_keys_file, sort_keys=False)\n\n\ndef _apply_external_provider_update(updates: dict[str, str | None]) -> None:\n    with _EXTERNAL_PROVIDER_CONFIG_LOCK:\n        runtime_config = get_config()\n        config_path = runtime_config.config_file_path","sourceCodeStart":348,"sourceCodeEnd":384,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/api/routers/app_info.py#L348-L384","documentation":"_get_external_provider_fields is a lookup against the fixed EXTERNAL_PROVIDER_FIELDS table (known providers like openai, anthropic, etc.). Any external-provider endpoint (set/reset config, build config) with a provider_id outside that table raises 404 with this detail.","triggerScenarios":"Calling set_external_provider_config, reset_external_provider_config, or _build_external_provider_config with a provider_id string not in EXTERNAL_PROVIDER_FIELDS (typo, custom provider name, old/renamed id).","commonSituations":"Typos like 'open-ai' or 'OpenAI' (ids are exact, lowercase); using a provider removed/renamed in a newer InvokeAI version; hardcoding provider ids from docs of a different version.","solutions":["Use an id present in EXTERNAL_PROVIDER_FIELDS in invokeai/app/api/routers/app_info.py (e.g. 'openai', 'anthropic')","Fix casing/typos — matching is exact membership, not case-insensitive","Check your InvokeAI version for the supported provider list","Handle 404 in the client and surface the list of supported providers"],"exampleFix":"// before\nawait setProviderConfig('OpenAI', { api_key: 'sk-...' });\n// after\nawait setProviderConfig('openai', { api_key: 'sk-...' });","handlingStrategy":"validation","validationCode":"KNOWN_PROVIDERS = {'openai', 'anthropic'}  # mirror EXTERNAL_PROVIDER_FIELDS keys\n\ndef validate_provider_id(provider_id: str) -> None:\n    if provider_id not in KNOWN_PROVIDERS:\n        raise ValueError(f'Unknown provider {provider_id!r}; expected one of {sorted(KNOWN_PROVIDERS)}')","typeGuard":"def is_known_provider(provider_id: str) -> bool:\n    return isinstance(provider_id, str) and provider_id in KNOWN_PROVIDERS","tryCatchPattern":"try:\n    resp = requests.post(f'{base}/providers/{provider_id}/config', json=body)\n    resp.raise_for_status()\nexcept requests.HTTPError as e:\n    if e.response.status_code == 404:\n        raise ValueError(f'{provider_id} is not a supported provider') from e","preventionTips":["Keep provider ids in a shared constant matching the server's EXTERNAL_PROVIDER_FIELDS","Use lowercase exact ids — matching is case-sensitive membership","Pin/verify the InvokeAI version whose provider list your client assumes","Fetch/refresh the supported provider list instead of hardcoding stale ids"],"tags":["http-404","api-request","unknown-identifier"],"backgroundTag":"unknown-provider-id","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}