fix: exclude Fable model env from Claude common config (#4272) (#5206)

* Add test for Fable model env key exclusion

Add regression test to ensure Fable model env keys are excluded from common config.

* Add Fable model to CLAUDE_MODEL_OVERRIDE_ENV_KEYS

* Add files via upload

* Delete .github/workflows/build-windows-unsigned.yml
This commit is contained in:
Dawn
2026-07-11 10:11:57 +08:00
committed by GitHub
parent 99e11e0851
commit 50270d5e42
2 changed files with 70 additions and 2 deletions
+54
View File
@@ -775,6 +775,56 @@ mod tests {
assert_eq!(value.get("includeCoAuthoredBy"), Some(&json!(false)));
}
/// Regression for issue #4272: Fable tier env keys must not enter the shared
/// Claude common-config snippet (same class as haiku/sonnet/opus model pins).
#[test]
fn extract_claude_common_config_strips_fable_model_env_keys() {
let settings = json!({
"env": {
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "haiku-mapped",
"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME": "Haiku Mapped",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "sonnet-mapped[1M]",
"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME": "Sonnet Mapped",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "opus-mapped[1M]",
"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME": "Opus Mapped",
"ANTHROPIC_DEFAULT_FABLE_MODEL": "deepseek-v4-flash[1M]",
"ANTHROPIC_DEFAULT_FABLE_MODEL_NAME": "deepseek-v4-flash",
"ANTHROPIC_MODEL": "default-mapped",
"ENABLE_TOOL_SEARCH": "true"
},
"theme": "dark"
});
let snippet = ProviderService::extract_claude_common_config(&settings)
.expect("extract should succeed");
let value: Value = serde_json::from_str(&snippet).expect("snippet is valid JSON");
let env = value.get("env");
for stripped in [
"ANTHROPIC_DEFAULT_HAIKU_MODEL",
"ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME",
"ANTHROPIC_DEFAULT_SONNET_MODEL",
"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME",
"ANTHROPIC_DEFAULT_OPUS_MODEL",
"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME",
"ANTHROPIC_DEFAULT_FABLE_MODEL",
"ANTHROPIC_DEFAULT_FABLE_MODEL_NAME",
"ANTHROPIC_MODEL",
] {
assert!(
env.and_then(|e| e.get(stripped)).is_none(),
"provider-specific model key {stripped} must not enter common config"
);
}
assert_eq!(
env.and_then(|e| e.get("ENABLE_TOOL_SEARCH"))
.and_then(|v| v.as_str()),
Some("true")
);
assert_eq!(value.get("theme").and_then(|v| v.as_str()), Some("dark"));
}
#[test]
fn validate_provider_settings_rejects_negative_cost_multiplier() {
let mut provider = Provider::with_id(
@@ -2869,6 +2919,10 @@ impl ProviderService {
"ANTHROPIC_DEFAULT_OPUS_MODEL_NAME",
"ANTHROPIC_DEFAULT_SONNET_MODEL",
"ANTHROPIC_DEFAULT_SONNET_MODEL_NAME",
// Fable 是 v3.16.3 新增的第四档模型映射,与 haiku/sonnet/opus 同属供应商专属,
// 不得进入通用配置片段,否则会污染其它供应商(issue #4272)。
"ANTHROPIC_DEFAULT_FABLE_MODEL",
"ANTHROPIC_DEFAULT_FABLE_MODEL_NAME",
"CLAUDE_CODE_SUBAGENT_MODEL",
"ANTHROPIC_BASE_URL",
];