From 56847f380a4eca42c9776048796300b53671edc8 Mon Sep 17 00:00:00 2001 From: asepharyana Date: Sun, 12 Jul 2026 15:36:45 +0700 Subject: [PATCH] feat: auto-detect provider from ~/.claude/settings.json Reads ANTHROPIC_BASE_URL and ANTHROPIC_API_KEY from Claude Code's settings.json and registers them as a 'claude' provider. Automatically sets it as the default provider when no custom default is configured. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/model/app_config.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/model/app_config.rs b/src/model/app_config.rs index 4be8dbd..ab6bc10 100644 --- a/src/model/app_config.rs +++ b/src/model/app_config.rs @@ -101,6 +101,44 @@ impl AppConfig { for (name, provider) in defaults.providers { cfg.providers.entry(name).or_insert(provider); } + // Auto-detect provider from ~/.claude/settings.json + if let Some(claude_provider) = detect_claude_settings_provider() { + cfg.providers.entry("claude".to_string()).or_insert(claude_provider); + if cfg.default_provider == defaults.default_provider { + cfg.default_provider = "claude".to_string(); + } + } cfg } } + +/// Configuration structure inside `~/.claude/settings.json`. +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ClaudeEnv { + #[serde(alias = "ANTHROPIC_BASE_URL")] + anthropic_base_url: Option, + #[serde(alias = "ANTHROPIC_API_KEY")] + anthropic_api_key: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ClaudeSettings { + env: Option, +} + +/// Read `~/.claude/settings.json` and return a `ProviderConfig` if the file +/// contains `ANTHROPIC_BASE_URL` and `ANTHROPIC_API_KEY` in its `env` block. +fn detect_claude_settings_provider() -> Option { + let path = dirs::home_dir()?.join(".claude").join("settings.json"); + let content = std::fs::read_to_string(&path).ok()?; + let settings: ClaudeSettings = serde_json::from_str(&content).ok()?; + let env = settings.env?; + let base_url = env.anthropic_base_url?; + let _api_key = env.anthropic_api_key?; // presence check — stored as env var, not in config. + Some(ProviderConfig { + api_base: base_url, + api_key_env: Some("ANTHROPIC_API_KEY".to_string()), + default_model: None, + default_api_key: None, + }) +}