{"record":{"id":"97331082baf614ec","repo":"zeroclaw-labs/zeroclaw","slug":"label-no-api-key-set-may-rely-on-env-vars-or-m","errorCode":null,"errorMessage":"{label}: no api_key set (may rely on env vars or model_provider defaults)","messagePattern":"(.+?): no api_key set \\(may rely on env vars or model_provider defaults\\)","errorType":"console","errorClass":"DiagItem","httpStatus":null,"severity":"warning","filePath":"crates/zeroclaw-runtime/src/doctor/mod.rs","lineNumber":1153,"sourceCode":"            let label = format!(\"{family}.{alias}\");\n            if let Some(reason) = provider_validation_error(config, &label) {\n                items.push(DiagItem::error(\n                    cat,\n                    format!(\"model_provider \\\"{label}\\\" is invalid: {reason}\"),\n                ));\n            } else {\n                items.push(DiagItem::ok(\n                    cat,\n                    format!(\"model_provider \\\"{label}\\\" is valid\"),\n                ));\n            }\n\n            // API key presence\n            if family != \"ollama\" {\n                if entry.api_key.as_deref().is_some() {\n                    items.push(DiagItem::ok(cat, format!(\"{label}: API key configured\")));\n                } else {\n                    items.push(DiagItem::warn(\n                        cat,\n                        format!(\"{label}: no api_key set (may rely on env vars or model_provider defaults)\"),\n                    ));\n                }\n            }\n\n            // Model configured\n            if let Some(model) = entry.model.as_deref() {\n                items.push(DiagItem::ok(cat, format!(\"{label}: model: {model}\")));\n            } else {\n                items.push(DiagItem::warn(cat, format!(\"{label}: no model configured\")));\n            }\n\n            // A missing value remains unknown until this profile is selected;\n            // zero is explicitly invalid because it leaves recovery with no\n            // usable model-context budget.\n            match entry.context_window {\n                Some(0) => items.push(DiagItem::error(","sourceCodeStart":1135,"sourceCodeEnd":1171,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/doctor/mod.rs#L1135-L1171","documentation":"For every non-ollama provider profile, check_config_semantics verifies that an `api_key` is configured. This warning means none is set on the profile — auth will fall back to environment variables or provider defaults, which may or may not exist when a call is actually made.","triggerScenarios":"A `[providers.<name>]` entry omits `api_key` (intending env-var auth); any `zeroclaw doctor` run prints `{label}: no api_key set` for that profile.","commonSituations":"Env-var-based deployments where the variable is missing in some shells or service units; new provider profiles created from minimal templates; local gateways where the key is optional.","solutions":["Set `api_key` on the provider profile if the key is stable","Or export the provider's env var (e.g. `OPENAI_API_KEY`) in every environment that runs zeroclaw","If the endpoint genuinely needs no key, verify a call succeeds and accept the warning"],"exampleFix":"# before\n[providers.openai]\nfamily = \"openai\"\nmodel = \"gpt-4o\"\n\n# after\n[providers.openai]\nfamily = \"openai\"\nmodel = \"gpt-4o\"\napi_key = \"sk-...\"\n# or: export OPENAI_API_KEY=sk-... in the runtime environment","handlingStrategy":"validation","validationCode":"for var in OPENAI_API_KEY ANTHROPIC_API_KEY GEMINI_API_KEY; do\n  if [ -z \"${!var}\" ]; then\n    echo \"warn: $var unset and no api_key on the profile\"\n  fi\ndone","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set api_key on the profile or export the provider env var in every unit/shell that runs zeroclaw","Re-run `zeroclaw doctor` after changing auth sources"],"tags":["zeroclaw","doctor","config","api-key","env-vars"],"backgroundTag":"missing-api-key","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}