{"record":{"id":"810d1a450ef78dd7","repo":"zeroclaw-labs/zeroclaw","slug":"model-provider-family-has-multiple-configured","errorCode":null,"errorMessage":"model_provider `{family}` has multiple configured aliases; use one of: {list}","messagePattern":"model_provider `(.+?)` has multiple configured aliases; use one of: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/orchestrator/mod.rs","lineNumber":1583,"sourceCode":"        .collect();\n    aliases.sort();\n    match aliases.len() {\n        0 => ModelsCommandResolution::NoAlias(family),\n        1 => ModelsCommandResolution::Resolved(format!(\"{family}.{}\", aliases[0])),\n        _ => ModelsCommandResolution::Ambiguous { family, aliases },\n    }\n}\n\nfn resolve_provider_ref_for_runtime_switch(config: &Config, raw: &str) -> anyhow::Result<String> {\n    match resolve_models_command(config, raw) {\n        ModelsCommandResolution::Resolved(provider_ref) => Ok(provider_ref),\n        ModelsCommandResolution::Ambiguous { family, aliases } => {\n            let list = aliases\n                .iter()\n                .map(|alias| format!(\"{family}.{alias}\"))\n                .collect::<Vec<_>>()\n                .join(\", \");\n            anyhow::bail!(\n                \"model_provider `{family}` has multiple configured aliases; use one of: {list}\"\n            )\n        }\n        ModelsCommandResolution::NoAlias(ref_or_family) => {\n            anyhow::bail!(\n                \"model_provider `{ref_or_family}` does not resolve to a configured provider\"\n            )\n        }\n        ModelsCommandResolution::Unknown => {\n            anyhow::bail!(\"unknown model_provider `{raw}`\")\n        }\n    }\n}\n\nfn resolved_runtime_model_provider_ref(\n    config: &Config,\n    agent_alias: &str,\n) -> anyhow::Result<String> {","sourceCodeStart":1565,"sourceCodeEnd":1601,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/orchestrator/mod.rs#L1565-L1601","documentation":"The `/models <arg>` runtime switch resolves its argument via `resolve_models_command`: a dotted `family.alias` must exist in config, and a bare family name resolves only when it has exactly one configured alias under `[providers.models.<family>.*]`. When a family has two or more aliases, the bare name is ambiguous, so this error lists every qualified `family.alias` option for the user to pick from.","triggerScenarios":"Sending `/models openai` in chat when the config defines multiple aliases for that family, e.g. `[providers.models.openai.work]` and `[providers.models.openai.personal]`.","commonSituations":"Multiple API keys or endpoints configured per family (work/personal, standard/proxy); a second alias added later breaks a bare `/models <family>` command that previously auto-resolved.","solutions":["Use a qualified ref from the listed options, e.g. `/models openai.personal`","Or remove unneeded aliases so the family has exactly one configured entry","List `[providers.models.<family>]` in the config to see current alias names"],"exampleFix":"# before\n/models openai\n# error: model_provider `openai` has multiple configured aliases; use one of: openai.personal, openai.work\n\n# after\n/models openai.personal","handlingStrategy":"validation","validationCode":"fn qualified_models_ref(config: &Config, raw: &str) -> Option<String> {\n    let aliases: Vec<String> = config\n        .providers\n        .models\n        .aliases_of(raw.trim())\n        .map(ToString::to_string)\n        .collect();\n    match aliases.len() {\n        1 => Some(format!(\"{}.{}\", raw.trim(), aliases[0])),\n        _ => None, // 0 or >1: require the user to pass family.alias explicitly\n    }\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = runtime_switch(raw).await {\n    if e.to_string().contains(\"multiple configured aliases\") {\n        // re-prompt with the family.alias options listed in the error message\n    }\n}","preventionTips":["Autocomplete /models arguments from the configured family.alias pairs instead of free text","Qualify with `family.alias` by default whenever a family has more than one alias","After adding a new provider alias, update any scripts or playbooks that use bare family names"],"tags":["orchestrator","models-command","config","rust"],"backgroundTag":"ambiguous-configuration","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}