infiniflow/ragflow · error · LookupError
Provider name is required.
Error message
Provider name is required.
What it means
LookupError raised by get_api_key's name-based fallback path: model_name did not parse as a direct id, and split_model_name found no '@provider' suffix, so there is no way to locate the tenant_model_provider row that holds the API key. Unlike the resolver at line 390, this path has no TEI builtin escape hatch — a provider segment is unconditionally required.
Source
Thrown at api/db/joint_services/tenant_model_service.py:472
"Direct-ID resolution: instance not found | tenant_id=%s model_id=%s instance_id=%s",
tenant_id,
model_name,
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:View on GitHub (pinned to 554fb1133a)
Solutions
- Pass the fully qualified 'model@provider' (or 'model@instance@provider') string, e.g. 'BAAI/bge-large-en-v1.5@OpenAI-Compatible'.
- Or pass the tenant_model id (UUID) directly — the direct-ID path runs first.
- Normalize stored model settings to always carry the provider suffix.
Example fix
# before key = get_api_key(tenant_id, "deepseek-chat") # after key = get_api_key(tenant_id, "deepseek-chat@DeepSeek")
Defensive patterns
Strategy: validation
Validate before calling
_, _, provider = split_model_name(model_name)
if not provider and not TenantModelService.get_by_id(model_name)[0]:
raise ValueError("Pass 'model@provider' or a tenant_model id") Type guard
def api_key_ref_valid(model_name: str) -> bool:
if TenantModelService.get_by_id(model_name)[0]:
return True
return bool(split_model_name(model_name)[2]) Try / catch
try:
key = get_api_key(tenant_id, model_name)
except LookupError as e:
if str(e) == "Provider name is required.":
key = get_api_key(tenant_id, f"{model_name}@{known_provider}") Prevention
- Note this path has NO builtin-TEI exception — always suffix or use an id.
- Keep one helper that formats model@provider strings for all config writes.
- Reject bare names at config-save time with a clear message.
When it happens
Trigger: Calling get_api_key(tenant_id, 'gpt-4o') with a bare name (no '@OpenAI'); a model string that is neither an existing tenant_model id nor a 'model@provider' reference; empty provider segment after splitting.
Common situations: Configs or env vars storing bare model names; older integrations written before the provider-suffix scheme; values copied from provider dashboards (which show bare names) into RAGFlow settings.
Related errors
- Provider name is required to resolve model id for {model_nam
- Model {model_name} not found for type {model_type_val}.
- Tenant {tenant_id} has no access to provider owned by tenant
- Instance {model_obj.instance_id} not found for model {model_
- Provider {provider_name} not found.
AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15).
Data as JSON: /api/errors/ead949170e3d4d0e.
Report an issue: GitHub.