{"record":{"id":"3f68d12dea5a4da0","repo":"zeroclaw-labs/zeroclaw","slug":"no-public-catalog-for-family-family","errorCode":null,"errorMessage":"no public catalog for family {family:?}","messagePattern":"no public catalog for family (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-providers/src/catalog.rs","lineNumber":217,"sourceCode":"        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()\n        .filter_map(|model| {\n            let model_l = model.to_ascii_lowercase();\n            if is_non_chat_model_lower(&model_l) {\n                None\n            } else {\n                Some((chat_model_rank_lower(&provider_l, &model_l), model_l, model))\n            }\n        })\n        .collect();\n    if ranked.is_empty() {\n        return None;","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-providers/src/catalog.rs#L199-L235","documentation":"The family is recognized in the catalog table, but it has no usable public catalog source: the models.dev lookup failed or returned empty, and the family has no OpenRouter vendor prefix fallback (table entries such as azure, bedrock, copilot, groq, lmstudio map to a models.dev key with None as the OpenRouter prefix, so there is no second source to try).","triggerScenarios":"Calling list_models_for_family for e.g. \"azure\" or \"copilot\" while models.dev is unreachable, rate-limits the request, errors, or returns an empty list - the sole catalog source failed, so the call bails.","commonSituations":"Offline machine or firewall blocking models.dev; models.dev outage or temporary DNS failure; CI environments with restricted egress.","solutions":["Retry once models.dev is reachable (verify with: curl -sS https://models.dev/api.json)","Configure an explicit model list on the alias instead of relying on the live catalog","Allow egress to models.dev in firewall or proxy rules","Cache the catalog response at the application layer if you depend on it for startup"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Pre-check connectivity to the sole catalog source when the family\n// has no OpenRouter fallback (prefix is None)\nlet (_, or_prefix) = zeroclaw_providers::catalog::catalog_source_for(family)\n    .ok_or_else(|| anyhow::anyhow!(\"unknown family\"))?;\nif or_prefix.is_none() && !net_reachable(\"https://models.dev\").await {\n    return Ok(configured_static_models.to_vec());\n}","typeGuard":null,"tryCatchPattern":"match list_models_for_family(\"azure\").await {\n    Ok(models) => Ok(models),\n    Err(e) if e.to_string().contains(\"no public catalog\") => {\n        Ok(static_model_list_from_config()) // degrade, do not fail the caller\n    }\n    Err(e) => Err(e),\n}","preventionTips":["Always configure a static model fallback list for families whose only catalog is models.dev","Cache the last successful catalog result and reuse it on network failure","Allow egress to models.dev in CI and container network policies","Do not treat model listing as mandatory for chat - degrade gracefully"],"tags":["catalog","models-dev","network","rust"],"backgroundTag":"model-catalog-unavailable","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}