{"record":{"id":"ce3d4725f2b6e27b","repo":"zeroclaw-labs/zeroclaw","slug":"no-configured-model-providers-to-probe-run-zero","errorCode":null,"errorMessage":"No configured model_providers to probe — run `zeroclaw quickstart` to set one up first","messagePattern":"No configured model_providers to probe — run `zeroclaw quickstart` to set one up first","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/doctor/mod.rs","lineNumber":532,"sourceCode":"    tmp.write_all(json.as_bytes())\n        .context(\"Failed to write model cache temp file\")?;\n    tmp.persist(&cache_path)\n        .map_err(|e| e.error)\n        .context(\"Failed to rename model cache temp file\")?;\n\n    Ok(())\n}\n\npub async fn run_models(\n    config: &Config,\n    provider_override: Option<&str>,\n    _use_cache: bool,\n    show_model_names: bool,\n) -> Result<()> {\n    let targets = doctor_model_targets(config, provider_override);\n\n    if targets.is_empty() {\n        anyhow::bail!(\n            \"No configured model_providers to probe — run `zeroclaw quickstart` to set one up first\"\n        );\n    }\n\n    println!(\"🩺 ZeroClaw Doctor — Model Catalog Probe\");\n    println!(\"  Providers to probe: {}\", targets.len());\n    println!();\n\n    let mut ok_count = 0usize;\n    let mut skipped_count = 0usize;\n    let mut auth_count = 0usize;\n    let mut error_count = 0usize;\n    let mut matrix_rows: Vec<(String, ModelProbeOutcome, Option<usize>, String)> = Vec::new();\n\n    for provider_name in &targets {\n        println!(\"  [{}]\", provider_name);\n\n        let outcome = fetch_provider_catalog(config, provider_name).await;","sourceCodeStart":514,"sourceCodeEnd":550,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/doctor/mod.rs#L514-L550","documentation":"run_models (the doctor model-catalog probe) builds its target list from the configured model_providers and any provider override. An empty target list means no [model_providers.<alias>] entries exist at all, so there is nothing to probe and the command aborts with a pointer to zeroclaw quickstart.","triggerScenarios":"Running the doctor models probe on a fresh install before any [model_providers.<alias>] entry exists; pointing the CLI at an empty or new config/data dir; a provider override that is blank after trimming.","commonSituations":"First run after install; new workspace or CI container with no config migrated yet; tests exercising probe behavior against an empty Config.","solutions":["Run zeroclaw quickstart to configure a first model provider","Or add a [model_providers.<alias>] block with model, uri, and api_key to zeroclaw.toml","Re-run the doctor models probe"],"exampleFix":"# zeroclaw.toml — before\n# (no model_providers section)\n\n# after\n[model_providers.openai]\nmodel = \"gpt-4o\"\nuri = \"https://api.openai.com/v1\"\napi_key = \"sk-...\"","handlingStrategy":"validation","validationCode":"if config.providers.models.is_empty() {\n    anyhow::bail!(\"no model_providers configured — run `zeroclaw quickstart` first\");\n}\nzeroclaw_runtime::doctor::run_models(&config, None, false, false).await?;","typeGuard":"fn has_model_providers(config: &zeroclaw_config::schema::Config) -> bool {\n    !config.providers.models.is_empty()\n}","tryCatchPattern":"if let Err(err) = zeroclaw_runtime::doctor::run_models(&config, override.as_deref(), false, false).await {\n    if err.to_string().contains(\"No configured model_providers\") {\n        eprintln!(\"nothing to probe — run `zeroclaw quickstart` or add [model_providers.<alias>]\");\n        return Ok(());\n    }\n    return Err(err);\n}","preventionTips":["Provision at least one [model_providers.<alias>] entry before shipping a workspace","In containers/CI, fail fast on empty provider config instead of invoking the probe"],"tags":["doctor","model-providers","config"],"backgroundTag":"missing-configuration","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}