diff --git a/src/providers/anthropic.rs b/src/providers/anthropic.rs index 59cd021..726503e 100644 --- a/src/providers/anthropic.rs +++ b/src/providers/anthropic.rs @@ -196,6 +196,7 @@ struct AnthropicRequest { model: String, messages: Vec, max_tokens: u32, + #[serde(skip_serializing_if = "Option::is_none")] temperature: Option, #[serde(skip_serializing_if = "Option::is_none")] tools: Option>, @@ -630,6 +631,36 @@ mod tests { assert!(resp.content.is_empty()); } + // ---- AnthropicRequest 序列化:未配置的可选字段不出现在请求体中 ---- + + fn make_request(temperature: Option) -> AnthropicRequest { + AnthropicRequest { + model: "glm-5".to_string(), + messages: vec![AnthropicMessage { + role: "user".to_string(), + content: vec![serde_json::json!({"type": "text", "text": "hi"})], + }], + max_tokens: 1024, + temperature, + tools: None, + extra: HashMap::new(), + } + } + + #[test] + fn test_request_omits_temperature_when_none() { + let json = serde_json::to_value(make_request(None)).unwrap(); + let obj = json.as_object().unwrap(); + assert!(!obj.contains_key("temperature")); + assert_eq!(obj.get("max_tokens").and_then(|v| v.as_u64()), Some(1024)); + } + + #[test] + fn test_request_includes_temperature_when_set() { + let json = serde_json::to_value(make_request(Some(0.5))).unwrap(); + assert_eq!(json["temperature"], serde_json::json!(0.5)); + } + // ---- format_error_chain ---- #[test] diff --git a/web/src/components/Settings/tabs/ModelsTab.tsx b/web/src/components/Settings/tabs/ModelsTab.tsx index 0e7254f..30342a0 100644 --- a/web/src/components/Settings/tabs/ModelsTab.tsx +++ b/web/src/components/Settings/tabs/ModelsTab.tsx @@ -37,7 +37,7 @@ export function ModelsTab({ config, update }: TabProps) {