diff --git a/src/config.rs b/src/config.rs index a4f45431e..4a54e8de7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -2530,6 +2530,7 @@ impl Config { // Env-only routing: check for env overrides on channel/worker models. // SPACEBOT_MODEL overrides all process types at once; specific vars take precedence. + // ANTHROPIC_MODEL sets all anthropic/* models to the specified value. let mut routing = RoutingConfig::default(); if let Ok(model) = std::env::var("SPACEBOT_MODEL") { routing.channel = model.clone(); @@ -2538,6 +2539,19 @@ impl Config { routing.compactor = model.clone(); routing.cortex = model; } + if let Ok(anthropic_model) = std::env::var("ANTHROPIC_MODEL") { + // ANTHROPIC_MODEL sets all anthropic/* routes to the specified model + let channel = format!("anthropic/{}", anthropic_model); + let branch = format!("anthropic/{}", anthropic_model); + let worker = format!("anthropic/{}", anthropic_model); + let compactor = format!("anthropic/{}", anthropic_model); + let cortex = format!("anthropic/{}", anthropic_model); + routing.channel = channel; + routing.branch = branch; + routing.worker = worker; + routing.compactor = compactor; + routing.cortex = cortex; + } if let Ok(channel_model) = std::env::var("SPACEBOT_CHANNEL_MODEL") { routing.channel = channel_model; } diff --git a/src/llm/anthropic/auth.rs b/src/llm/anthropic/auth.rs index 6e7317a67..ec6efcf13 100644 --- a/src/llm/anthropic/auth.rs +++ b/src/llm/anthropic/auth.rs @@ -283,8 +283,7 @@ mod tests { #[test] fn proxy_bearer_uses_bearer_header() { - let (request, auth_path) = - build_request_with_bearer("my-proxy-token", false, true); + let (request, auth_path) = build_request_with_bearer("my-proxy-token", false, true); assert_eq!(auth_path, AnthropicAuthPath::ProxyBearer); assert_eq!( request.headers().get("Authorization").unwrap(), @@ -298,7 +297,10 @@ mod tests { let (request, _) = build_request_with_bearer("my-proxy-token", false, true); assert!(request.headers().get("x-app").is_none()); // Should not have Claude Code user-agent - let ua = request.headers().get("user-agent").map(|v| v.to_str().unwrap().to_string()); + let ua = request + .headers() + .get("user-agent") + .map(|v| v.to_str().unwrap().to_string()); assert!(ua.is_none() || !ua.unwrap().contains("claude-code")); } diff --git a/src/llm/manager.rs b/src/llm/manager.rs index 245423b01..56693c560 100644 --- a/src/llm/manager.rs +++ b/src/llm/manager.rs @@ -185,7 +185,7 @@ impl LlmManager { base_url: "https://api.anthropic.com".to_string(), api_key: token, name: None, - use_bearer_auth: false, + use_bearer_auth: false, }), (None, None) => Err(LlmError::UnknownProvider("anthropic".to_string()).into()), } @@ -254,7 +254,7 @@ impl LlmManager { base_url: "https://chatgpt.com/backend-api/codex".to_string(), api_key: token, name: None, - use_bearer_auth: false, + use_bearer_auth: false, }), None => Err(LlmError::UnknownProvider("openai-chatgpt".to_string()).into()), } diff --git a/src/llm/model.rs b/src/llm/model.rs index 5debdf625..4ba76e03d 100644 --- a/src/llm/model.rs +++ b/src/llm/model.rs @@ -826,7 +826,10 @@ impl SpacebotModel { fn remap_model_name_for_api(&self) -> String { if self.provider == "zai-coding-plan" { // Z.AI Coding Plan API expects "zai/glm-5" not "glm-5" - let model_name = self.model_name.strip_prefix("zai/").unwrap_or(&self.model_name); + let model_name = self + .model_name + .strip_prefix("zai/") + .unwrap_or(&self.model_name); format!("zai/{model_name}") } else { self.model_name.clone()