{"record":{"id":"1d4f2094651184ad","repo":"Hmbown/CodeWhale","slug":"deepseek-api-key-not-found-1-get-a-key-https","errorCode":null,"errorMessage":"DeepSeek API key not found.\n\n1. Get a key:  https://platform.deepseek.com/api_keys\n2. Save it (works in every folder, no OS prompts):\ncodewhale auth set --provider deepseek\n\nAlternatives:\n• export DEEPSEEK_API_KEY=<your-key>      (current shell only;\nalso note: zsh users — exports in ~/.zshrc only reach interactive\nshells, prefer ~/.zshenv for everything)\n• api_key = \"<your-key>\"  in ~/.codewhale/config.toml\n• already configured DeepSeek Harness? grant read-only access:\ncodewhale auth external-consent --provider deepseek --mode read-only","messagePattern":"DeepSeek API key not found\\.\n\n1\\. Get a key:  https://platform\\.deepseek\\.com/api_keys\n2\\. Save it \\(works in every folder, no OS prompts\\):\ncodewhale auth set --provider deepseek\n\nAlternatives:\n• export DEEPSEEK_API_KEY=<your-key>      \\(current shell only;\nalso note: zsh users — exports in ~/\\.zshrc only reach interactive\nshells, prefer ~/\\.zshenv for everything\\)\n• api_key = \"<your-key>\"  in ~/\\.codewhale/config\\.toml\n• already configured DeepSeek Harness\\? grant read-only access:\ncodewhale auth external-consent --provider deepseek --mode read-only","errorType":"console","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/config.rs","lineNumber":6353,"sourceCode":"            && (provider_route_is_keyless_self_hosted(provider, &self.deepseek_base_url())\n                || base_url_uses_local_host(&self.deepseek_base_url()))\n        {\n            return Ok(String::new());\n        }\n\n        if custom_endpoint {\n            let route_name = self\n                .provider\n                .as_deref()\n                .unwrap_or_else(|| provider.as_str());\n            anyhow::bail!(\n                \"Custom endpoint credentials for {route_name} must be bound explicitly. Ambient provider credentials are not sent to {}. Add api_key or api_key_env to this provider route, or pass --api-key with --base-url.\",\n                self.deepseek_base_url()\n            );\n        }\n\n        match provider {\n            ApiProvider::Deepseek | ApiProvider::DeepseekCN => anyhow::bail!(\n                \"DeepSeek API key not found.\\n\\\n                 \\n\\\n                 1. Get a key:  https://platform.deepseek.com/api_keys\\n\\\n                 2. Save it (works in every folder, no OS prompts):\\n\\\n                        codewhale auth set --provider deepseek\\n\\\n                 \\n\\\n                 Alternatives:\\n\\\n                   • export DEEPSEEK_API_KEY=<your-key>      (current shell only;\\n\\\n                     also note: zsh users — exports in ~/.zshrc only reach interactive\\n\\\n                     shells, prefer ~/.zshenv for everything)\\n\\\n                   • api_key = \\\"<your-key>\\\"  in ~/.codewhale/config.toml\\n\\\n                   • already configured DeepSeek Harness? grant read-only access:\\n\\\n                        codewhale auth external-consent --provider deepseek --mode read-only\"\n            ),\n            ApiProvider::SiliconflowCn => anyhow::bail!(\n                \"SiliconFlow China API key not found. Get a key: {}. Run 'codewhale auth set --provider siliconflow-CN', \\\n                 set {}, or add [{}] api_key in ~/.codewhale/config.toml. \\\n                 [providers.siliconflow] remains a fallback when the CN table omits api_key.\",","sourceCodeStart":6335,"sourceCodeEnd":6371,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/crates/tui/src/config.rs#L6335-L6371","documentation":"Raised when provider is DeepSeek/DeepSeekCN, no custom endpoint is in play, and no credential was found in any source: the durable auth store, DEEPSEEK_API_KEY, config api_key, or an external DeepSeek Harness consent. The message walks through each remedy in order and notes the zsh quirk that ~/.zshrc exports only reach interactive shells.","triggerScenarios":"Fresh install with provider = deepseek and no auth ever configured; DEEPSEEK_API_KEY exported only in an interactive shell but codewhale launched from a service; key deleted from the secret store via logout.","commonSituations":"New machines/containers; CI runners without secrets wired; after `auth logout` wiped stored keys (#343); zsh users whose exports live in ~/.zshrc.","solutions":["Run codewhale auth set --provider deepseek (works in every folder, no OS prompts).","Or export DEEPSEEK_API_KEY=<key> — on zsh prefer ~/.zshenv so non-interactive shells inherit it.","Or set api_key = \"<key>\" in ~/.codewhale/config.toml.","If DeepSeek Harness is already configured, grant read-only access: codewhale auth external-consent --provider deepseek --mode read-only."],"exampleFix":"# before: no credentials anywhere\nprovider = \"deepseek\"\n\n# after (terminal)\n# codewhale auth set --provider deepseek\n# or: export DEEPSEEK_API_KEY=sk-... (put in ~/.zshenv for zsh)","handlingStrategy":"validation","validationCode":"fn deepseek_key_present(cfg: &Config) -> bool {\n    std::env::var(\"DEEPSEEK_API_KEY\").map(|v| !v.trim().is_empty()).unwrap_or(false)\n        || cfg.provider_config_for(ApiProvider::Deepseek)\n            .and_then(|pc| pc.api_key.clone())\n            .is_some_and(|k| !k.trim().is_empty())\n        || secret_store_has(ApiProvider::Deepseek) // codewhale auth set\n}\n\nanyhow::ensure!(deepseek_key_present(&config), \"configure DeepSeek auth first\");","typeGuard":"fn deepseek_credentials_configured(cfg: &Config) -> bool {\n    deepseek_key_present(cfg)\n}","tryCatchPattern":"match config.deepseek_api_key() {\n    Err(e) if e.to_string().starts_with(\"DeepSeek API key not found\") => {\n        // interactive setup path: run `codewhale auth set --provider deepseek`, then retry once\n        run_auth_set(ApiProvider::Deepseek)?;\n        config.deepseek_api_key()\n    }\n    other => other,\n}","preventionTips":["Run codewhale auth set --provider deepseek once per machine instead of ad-hoc exports.","Put DEEPSEEK_API_KEY in ~/.zshenv (zsh) or the service environment, not just interactive rc files.","Re-check credentials after `auth logout` wipes the secret store."],"tags":["rust","deepseek","api-key","authentication","credentials"],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}