{"record":{"id":"6b9ab41293ca7d4d","repo":"zeroclaw-labs/zeroclaw","slug":"agents-agent-alias-model-provider-is-empty-runt","errorCode":null,"errorMessage":"agents.{agent_alias}.model_provider is empty; runtime reload requires a dotted `<type>.<alias>` provider reference","messagePattern":"agents\\.(.+?)\\.model_provider is empty; runtime reload requires a dotted `<type>\\.<alias>` provider reference","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-channels/src/orchestrator/mod.rs","lineNumber":1608,"sourceCode":"            )\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> {\n    let agent = config\n        .agents\n        .get(agent_alias)\n        .with_context(|| format!(\"agents.{agent_alias} is not configured\"))?;\n    let configured = agent.model_provider.trim();\n    if configured.is_empty() {\n        anyhow::bail!(\n            \"agents.{agent_alias}.model_provider is empty; runtime reload requires a dotted `<type>.<alias>` provider reference\"\n        );\n    }\n    let (model_provider, _) = model_provider_entry_for_ref(config, configured)?;\n    Ok(model_provider)\n}\n\nfn model_provider_entry_for_ref<'a>(\n    config: &'a Config,\n    model_provider: &str,\n) -> anyhow::Result<(String, &'a zeroclaw_config::schema::ModelProviderConfig)> {\n    let trimmed = model_provider.trim();\n    if trimmed.is_empty() {\n        anyhow::bail!(\"model_provider reference must not be empty\");\n    }\n\n    let Some((provider_type, provider_alias)) = trimmed.split_once('.') else {\n        anyhow::bail!(\"model_provider `{trimmed}` must use `<type>.<alias>` form\");","sourceCodeStart":1590,"sourceCodeEnd":1626,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-channels/src/orchestrator/mod.rs#L1590-L1626","documentation":"Thrown by resolved_runtime_model_provider_ref when a runtime model reload looks up `config.agents.get(agent_alias)` and finds the agent's `model_provider` field empty after trimming. Runtime reloads need a fully-qualified dotted `<type>.<alias>` reference (e.g. `openai.fast`) to know exactly which credentialed provider entry to rebuild the client from; an empty string cannot be resolved, so the reload aborts rather than guessing a default.","triggerScenarios":"Triggering a runtime model reload for an agent whose `[agents.<alias>]` section exists but has no `model_provider` key (or it is set to \"\" or whitespace). This happens via the orchestrator's reload path that calls resolved_runtime_model_provider_ref(config, agent_alias).","commonSituations":"Agent stanza copied from a template that omitted `model_provider`; the field was commented out or blanked during config cleanup; relying on a global default provider and assuming per-agent reload works without an explicit per-agent reference.","solutions":["Set an explicit dotted provider ref on the agent: `zeroclaw config set agents.<agent_alias>.model_provider \"openai.default\"`","Verify the `<type>.<alias>` pair actually exists under `[providers.models]` before saving","Restart or re-trigger the runtime reload; the agent now resolves to a concrete provider entry"],"exampleFix":"# before (zeroclaw.toml)\n[agents.main]\nmodel = \"gpt-4o\"\n# no model_provider -> reload fails\n\n# after\n[agents.main]\nmodel = \"gpt-4o\"\nmodel_provider = \"openai.default\"","handlingStrategy":"validation","validationCode":"let provider_ref = config\n    .agents\n    .get(agent_alias)\n    .map(|a| a.model_provider.trim().to_string())\n    .filter(|p| !p.is_empty())\n    .with_context(|| format!(\"agent `{agent_alias}` needs agents.{agent_alias}.model_provider set\"))?;","typeGuard":null,"tryCatchPattern":"Err(err) if err.to_string().contains(\"model_provider is empty\") => {\n    // prompt operator to set agents.<alias>.model_provider before retrying reload\n}","preventionTips":["Always set an explicit dotted model_provider on every [agents.*] stanza","Add a config-lint step at deploy time that fails on agents with empty model_provider","Treat a missing per-agent provider as a setup error, never fall back silently"],"tags":["model-provider","agents","configuration","runtime-reload","zeroclaw"],"backgroundTag":"missing-config-value","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}