{"record":{"id":"9d8fad5ad868a870","repo":"infiniflow/ragflow","slug":"provider-provider-name-not-found","errorCode":null,"errorMessage":"Provider {provider_name} not found.","messagePattern":"Provider (.+?) not found\\.","errorType":"exception","errorClass":"LookupError","httpStatus":null,"severity":"error","filePath":"api/db/joint_services/tenant_model_service.py","lineNumber":475,"sourceCode":"                model_obj.instance_id,\n            )\n            raise LookupError(f\"Instance {model_obj.instance_id} not found for model {model_name}.\")\n        logger.debug(\n            \"Direct-ID resolution: resolved | tenant_id=%s model_id=%s instance_id=%s\",\n            tenant_id,\n            model_name,\n            model_obj.instance_id,\n        )\n        return instance_obj.api_key\n\n    # Fall back to name-based resolution: model[@instance]@provider\n    _, instance_name, provider_name = split_model_name(model_name)\n\n    if not provider_name:\n        raise LookupError(\"Provider name is required.\")\n    provider_obj = TenantModelProviderService.get_by_tenant_id_and_provider_name(tenant_id, provider_name)\n    if not provider_obj:\n        raise LookupError(f\"Provider {provider_name} not found.\")\n    instance_obj = _resolve_instance_for_model(provider_obj, instance_name, model_name)\n    return instance_obj.api_key\n\n\ndef get_model_type_by_id(model_id: str):\n    exist, model_obj = TenantModelService.get_by_id(model_id)\n    if not exist:\n        raise LookupError(f\"TenantModel id={model_id} not found.\")\n    return get_model_type_human(model_obj.model_type)\n\n\ndef resolve_model_type(tenant_id: str, model_ref: str):\n    try:\n        return get_model_type_by_id(model_ref)\n    except LookupError:\n        return get_model_type_by_name(tenant_id, model_ref)\n\n","sourceCodeStart":457,"sourceCodeEnd":493,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/api/db/joint_services/tenant_model_service.py#L457-L493","documentation":"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.","triggerScenarios":"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.","commonSituations":"Provider renamed after models were configured; fresh tenant account used with config from another account; provider removed during key rotation.","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."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if not TenantModelProviderService.get_by_tenant_id_and_provider_name(tenant_id, provider_name):\n    raise ValueError(f\"Add provider '{provider_name}' in Model Providers before use\")","typeGuard":null,"tryCatchPattern":"try:\n    key = get_api_key(tenant_id, model_name)\nexcept LookupError as e:\n    if f\"Provider {provider_name} not found.\" == str(e):\n        # tenant-scoped miss: add provider or fix name; permanent\n        raise","preventionTips":["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."],"tags":["provider","api-key","tenant-scoped","ragflow"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}