infiniflow/ragflow · error · LookupError
Provider {provider_name} not found.
Error message
Provider {provider_name} not found. What it means
LookupError raised by get_api_key's name-based fallback when a provider segment exists but no tenant_model_provider row matches (tenant_id, provider_name). Tenant-scoped: the provider must have been added under this tenant in Model Providers. The API key the caller wants is stored on that provider's instance rows, so a missing provider row ends resolution immediately.
Source
Thrown at api/db/joint_services/tenant_model_service.py:475
model_obj.instance_id,
)
raise LookupError(f"Instance {model_obj.instance_id} not found for model {model_name}.")
logger.debug(
"Direct-ID resolution: resolved | tenant_id=%s model_id=%s instance_id=%s",
tenant_id,
model_name,
model_obj.instance_id,
)
return instance_obj.api_key
# Fall back to name-based resolution: model[@instance]@provider
_, instance_name, provider_name = split_model_name(model_name)
if not provider_name:
raise LookupError("Provider name is required.")
provider_obj = TenantModelProviderService.get_by_tenant_id_and_provider_name(tenant_id, provider_name)
if not provider_obj:
raise LookupError(f"Provider {provider_name} not found.")
instance_obj = _resolve_instance_for_model(provider_obj, instance_name, model_name)
return instance_obj.api_key
def get_model_type_by_id(model_id: str):
exist, model_obj = TenantModelService.get_by_id(model_id)
if not exist:
raise LookupError(f"TenantModel id={model_id} not found.")
return get_model_type_human(model_obj.model_type)
def resolve_model_type(tenant_id: str, model_ref: str):
try:
return get_model_type_by_id(model_ref)
except LookupError:
return get_model_type_by_name(tenant_id, model_ref)
View on GitHub (pinned to 554fb1133a)
Solutions
- Verify the provider exists for this tenant in Model Providers and use its exact name in the suffix.
- Re-add the provider (with API key and base URL) if it was deleted.
- Prefer the tenant_model id over names in programmatic calls to avoid name drift.
Defensive patterns
Strategy: validation
Validate before calling
if not TenantModelProviderService.get_by_tenant_id_and_provider_name(tenant_id, provider_name):
raise ValueError(f"Add provider '{provider_name}' in Model Providers before use") Try / catch
try:
key = get_api_key(tenant_id, model_name)
except LookupError as e:
if f"Provider {provider_name} not found." == str(e):
# tenant-scoped miss: add provider or fix name; permanent
raise Prevention
- Provision providers per tenant during onboarding automation.
- Keep provider names stable after creation (renames break stored model strings).
- Use exact names from the tenant's Model Providers list.
When it happens
Trigger: get_api_key(tenant_id, 'model@NoSuchProvider') where the tenant never added that provider, deleted it, or the name's case/spacing differs from the stored provider row.
Common situations: Provider renamed after models were configured; fresh tenant account used with config from another account; provider removed during key rotation.
Related errors
- Model {model_name} not found for type {model_type_val}.
- Provider id={model_obj.provider_id} not found for model {mod
- Tenant {tenant_id} has no access to provider owned by tenant
- Instance {model_obj.instance_id} not found for model {model_
- Provider name is required.
AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15).
Data as JSON: /api/errors/9d8fad5ad868a870.
Report an issue: GitHub.