fix(agents): disable Claude Code server-side auto mode checks for CPA gateways

This commit is contained in:
lzt404 committed 2026-09-27 18:13:01 +08:00
1 parent 9c67b9d40c
commit ecf0ad58fd
5 files changed
+45 -4

No files matched your search

+7
View File
@@ -590,6 +590,7 @@ pub(crate) fn build_claude_agent_config(
env.remove("ANTHROPIC_API_KEY");
env.remove("CLAUDE_CODE_EFFORT_LEVEL");
env.remove(CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV);
env.remove(CLAUDE_CODE_AUTO_MODE_SERVER_ENV);
env.remove(CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV);
env.remove(DISABLE_AUTO_COMPACT_ENV);
for (key, value) in [
@@ -625,6 +626,10 @@ pub(crate) fn build_claude_agent_config(
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV.to_string(),
serde_json::Value::String("1".to_string()),
);
env.insert(
CLAUDE_CODE_AUTO_MODE_SERVER_ENV.to_string(),
serde_json::Value::String("0".to_string()),
);
env.insert(
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV.to_string(),
serde_json::Value::String(mappings.auto_compact_pct.to_string()),
@@ -1159,6 +1164,7 @@ pub(crate) fn prepare_claude_code_managed_removal(
"ANTHROPIC_DEFAULT_FABLE_MODEL",
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV,
CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV,
CLAUDE_CODE_AUTO_MODE_SERVER_ENV,
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV,
DISABLE_AUTO_COMPACT_ENV,
"CLAUDE_CODE_SUBAGENT_MODEL",
@@ -1800,6 +1806,7 @@ pub(crate) fn build_restored_claude_code_config(
"ANTHROPIC_DEFAULT_FABLE_MODEL",
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV,
CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV,
CLAUDE_CODE_AUTO_MODE_SERVER_ENV,
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV,
DISABLE_AUTO_COMPACT_ENV,
"CLAUDE_CODE_SUBAGENT_MODEL",
+5 -1
View File
@@ -2790,7 +2790,11 @@ pub(crate) fn inspect_claude_agent_config(
&& env
.and_then(|env| env.get(CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV))
.and_then(serde_json::Value::as_str)
== Some("1");
== Some("1")
&& env
.and_then(|env| env.get(CLAUDE_CODE_AUTO_MODE_SERVER_ENV))
.and_then(serde_json::Value::as_str)
== Some("0");
let model = env
.and_then(|env| env.get("ANTHROPIC_MODEL"))
.and_then(serde_json::Value::as_str)
+1
View File
@@ -181,6 +181,7 @@ const CLAUDE_DESKTOP_EXTENDED_CONTEXT_WINDOW: u64 = 1_000_000;
const CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV: &str = "CLAUDE_CODE_MAX_CONTEXT_TOKENS";
const CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV: &str =
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY";
const CLAUDE_CODE_AUTO_MODE_SERVER_ENV: &str = "CLAUDE_CODE_AUTO_MODE_SERVER";
const CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV: &str = "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE";
const DISABLE_AUTO_COMPACT_ENV: &str = "DISABLE_AUTO_COMPACT";
const DEFAULT_CLAUDE_AUTO_COMPACT_PCT: u8 = 90;
+30 -2
View File
@@ -5,7 +5,7 @@ use super::*;
fn claude_agent_config_preserves_existing_fields() {
let rendered = build_claude_agent_config(
Some(
r#"{"theme":"dark","env":{"KEEP":"yes","ANTHROPIC_API_KEY":"legacy-key","CLAUDE_CODE_EFFORT_LEVEL":"max"}}"#,
r#"{"theme":"dark","env":{"KEEP":"yes","ANTHROPIC_API_KEY":"legacy-key","CLAUDE_CODE_EFFORT_LEVEL":"max","CLAUDE_CODE_AUTO_MODE_SERVER":"1"}}"#,
),
"http://127.0.0.1:8317",
DEFAULT_API_KEY,
@@ -26,6 +26,7 @@ fn claude_agent_config_preserves_existing_fields() {
value["env"][CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV],
"1"
);
assert_eq!(value["env"][CLAUDE_CODE_AUTO_MODE_SERVER_ENV], "0");
assert_eq!(value["env"][CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV], "200000");
assert_eq!(value["env"][CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV], "90");
assert!(value["env"].get(DISABLE_AUTO_COMPACT_ENV).is_none());
@@ -49,6 +50,7 @@ fn claude_code_inspection_normalizes_legacy_1m_suffix() {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317",
"ANTHROPIC_AUTH_TOKEN": "test-key",
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1",
"CLAUDE_CODE_AUTO_MODE_SERVER": "0",
"ANTHROPIC_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v4-pro[1m]",
@@ -87,7 +89,33 @@ fn claude_code_requires_gateway_model_discovery_to_be_enabled() {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317",
"ANTHROPIC_AUTH_TOKEN": "test-key",
"ANTHROPIC_MODEL": "gpt-test",
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "0"
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "0",
"CLAUDE_CODE_AUTO_MODE_SERVER": "0"
}
}"#,
)
.unwrap();
let (configured, model) = inspect_claude_agent_config(&path, 8317, "test-key").unwrap();
assert!(!configured);
assert_eq!(model.as_deref(), Some("gpt-test"));
fs::remove_dir_all(directory).unwrap();
}
#[test]
fn claude_code_requires_server_classifier_to_be_disabled_for_gateway() {
let directory = agent_test_home("claude-code-auto-mode-server");
let path = directory.join("settings.json");
fs::write(
&path,
r#"{
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8317",
"ANTHROPIC_AUTH_TOKEN": "test-key",
"ANTHROPIC_MODEL": "gpt-test",
"CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1",
"CLAUDE_CODE_AUTO_MODE_SERVER": "1"
}
}"#,
)
+2 -1
View File
@@ -201,7 +201,7 @@ fn kimi_and_grok_status_does_not_depend_on_legacy_state() {
#[test]
fn session_merge_preserves_runtime_fields_for_other_agent_formats() {
let claude_original = r#"{"env":{"KEEP_ENV":"original","CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY":"0"},"keep":"claude"}"#;
let claude_original = r#"{"env":{"KEEP_ENV":"original","CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY":"0","CLAUDE_CODE_AUTO_MODE_SERVER":"1"},"keep":"claude"}"#;
let claude_managed = build_claude_agent_config(
Some(claude_original),
"http://127.0.0.1:8317",
@@ -230,6 +230,7 @@ fn session_merge_preserves_runtime_fields_for_other_agent_formats() {
claude["env"][CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV],
"0"
);
assert_eq!(claude["env"][CLAUDE_CODE_AUTO_MODE_SERVER_ENV], "1");
assert!(claude["env"].get("ANTHROPIC_BASE_URL").is_none());
assert!(claude.get("model").is_none());