{"record":{"id":"a983735a4b63c54d","repo":"zeroclaw-labs/zeroclaw","slug":"unknown-provider-family-family","errorCode":null,"errorMessage":"unknown provider family {family:?}","messagePattern":"unknown provider family (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-providers/src/catalog.rs","lineNumber":206,"sourceCode":"        .await?\n        .error_for_status()?;\n    let bytes = response.bytes().await?;\n    parse_openai_models_catalog(&bytes)\n}\n\n/// Probe the catalog for `family` without constructing a live provider.\n/// Returns the union of every known public catalog source. Errors if\n/// `family` is unknown or has no public catalog source set.\npub async fn list_models_for_family(family: &str) -> Result<Vec<String>> {\n    if family == \"nearai\" {\n        return list_nearai_models().await;\n    }\n    if family == \"atlascloud\" {\n        return list_atlascloud_models().await;\n    }\n\n    let Some((md_key, or_prefix)) = catalog_source_for(family) else {\n        anyhow::bail!(\"unknown provider family {family:?}\");\n    };\n    if let Some(k) = md_key\n        && let Ok(ms) = crate::models_dev::list_models_for(k).await\n        && !ms.is_empty()\n    {\n        return Ok(ms);\n    }\n    if let Some(p) = or_prefix {\n        return crate::openrouter_catalog::list_models_for_vendor(p).await;\n    }\n    anyhow::bail!(\"no public catalog for family {family:?}\")\n}\n\n#[must_use]\npub fn sort_model_catalog_for_chat(provider: &str, models: Vec<String>) -> Option<Vec<String>> {\n    let provider_l = provider.to_ascii_lowercase();\n    let mut ranked: Vec<(i32, String, String)> = models\n        .into_iter()","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-providers/src/catalog.rs#L188-L224","documentation":"list_models_for_family maps a provider family name to public catalog sources via catalog_source_for (plus special cases nearai and atlascloud). It errors with 'unknown provider family' when the family string matches no entry in that table - the string is not a family ZeroClaw knows how to enumerate.","triggerScenarios":"Calling list_models_for_family with a typo'd or unregistered family string (e.g. \"openai-compatible\", \"open-ai\", \"Gemini CLI\"), passing a provider alias instead of a family name, or a config written for a newer release that added a family the installed binary does not know.","commonSituations":"Typos in model_provider family config; configs authored against a newer ZeroClaw release than the installed binary; custom OpenAI-compatible endpoints given an invented family instead of using the compatible family.","solutions":["Use one of the family keys listed in catalog_source_for in crates/zeroclaw-providers/src/catalog.rs (openai, anthropic, azure, bedrock, gemini, gemini_cli, grok_cli, openrouter, copilot, xai, and others) - lowercase and exact","For custom OpenAI-compatible endpoints use the compatible family with base_url, not an invented family name","Upgrade zeroclaw-providers if the config targets a family added in a newer release","Double-check spelling, e.g. \"gemini_cli\" not \"Gemini CLI\""],"exampleFix":"# before (config)\n[model_provider.my-provider]\nfamily = \"openai-compatible\"\nbase_url = \"https://api.example.com/v1\"\n\n# after\n[model_provider.my-provider]\nfamily = \"compatible\"\nbase_url = \"https://api.example.com/v1\"","handlingStrategy":"validation","validationCode":"// Check the family is catalog-known before calling\nlet family = family.trim().to_ascii_lowercase();\nif family != \"nearai\"\n    && family != \"atlascloud\"\n    && zeroclaw_providers::catalog::catalog_source_for(&family).is_none()\n{\n    anyhow::bail!(\"family {family:?} has no model catalog; check spelling\");\n}\nlet models = zeroclaw_providers::catalog::list_models_for_family(&family).await?;","typeGuard":null,"tryCatchPattern":"match list_models_for_family(&family).await {\n    Ok(models) => { /* ... */ }\n    Err(e) if e.to_string().contains(\"unknown provider family\") => {\n        // fall back to a configured static model list for this alias\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Normalize family strings to lowercase before use","Keep family names in one constant/enums instead of free-form config strings","Use the compatible family for custom endpoints rather than inventing families","Validate config at load time against catalog_source_for, not at call time"],"tags":["catalog","provider-family","config","rust"],"backgroundTag":"unknown-provider-identifier","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}