fix(providers): 模型未配置 Temperature 时请求体不再携带该字段

- AnthropicRequest.temperature 增加 skip_serializing_if:留空时不再序列化出 temperature:null,而是完全省略该键,交由模型服务端使用默认值(OpenAI 型 provider 此前已是该行为)

- 新增两个序列化回归测试:temperature 为 None 时请求体不含该键,为 Some 时正常输出

- 同步设置页提示文案:Temperature 留空不传该字段;Max Tokens 留空不传(Anthropic 型 provider 回退为 1024)
This commit is contained in:
oudecheng 2026-08-17 16:45:12 +08:00
parent 27160ef560
commit 2ab9c2d404
2 changed files with 33 additions and 2 deletions

View File

@ -196,6 +196,7 @@ struct AnthropicRequest {
model: String, model: String,
messages: Vec<AnthropicMessage>, messages: Vec<AnthropicMessage>,
max_tokens: u32, max_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
temperature: Option<f32>, temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
tools: Option<Vec<AnthropicTool>>, tools: Option<Vec<AnthropicTool>>,
@ -630,6 +631,36 @@ mod tests {
assert!(resp.content.is_empty()); assert!(resp.content.is_empty());
} }
// ---- AnthropicRequest 序列化:未配置的可选字段不出现在请求体中 ----
fn make_request(temperature: Option<f32>) -> 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 ---- // ---- format_error_chain ----
#[test] #[test]

View File

@ -37,7 +37,7 @@ export function ModelsTab({ config, update }: TabProps) {
</Field> </Field>
<Field <Field
label="Temperature" label="Temperature"
hint="控制回复随机性0 表示确定性输出,值越大越随机。留空使用模型默认值" hint="控制回复随机性0 表示确定性输出,值越大越随机。留空则不传该字段,由模型使用其默认值"
> >
<input <input
type="number" type="number"
@ -52,7 +52,7 @@ export function ModelsTab({ config, update }: TabProps) {
</Field> </Field>
<Field <Field
label="Max Tokens" label="Max Tokens"
hint="模型单次回复最大生成 token 数,超出会被截断。留空使用模型默认值(如 4096/8192" hint="模型单次回复最大生成 token 数,超出会被截断。留空则不传该字段Anthropic 型 provider 会回退为 1024"
> >
<input <input
type="number" type="number"