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) <noreply@anthropic.com>
This commit is contained in:
asepharyana
2026-07-12 15:36:45 +07:00
co-authored by Claude Opus 4.8
parent aac1de8af6
commit 56847f380a
+38
View File
@@ -101,6 +101,44 @@ impl AppConfig {
for (name, provider) in defaults.providers { for (name, provider) in defaults.providers {
cfg.providers.entry(name).or_insert(provider); 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 cfg
} }
} }
/// Configuration structure inside `~/.claude/settings.json`.
#[derive(Debug, Clone, Serialize, Deserialize)]
struct ClaudeEnv {
#[serde(alias = "ANTHROPIC_BASE_URL")]
anthropic_base_url: Option<String>,
#[serde(alias = "ANTHROPIC_API_KEY")]
anthropic_api_key: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
struct ClaudeSettings {
env: Option<ClaudeEnv>,
}
/// 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<ProviderConfig> {
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,
})
}