diff --git a/src/providers/gemini.rs b/src/providers/gemini.rs index 5db27d8c..a2f1f78e 100644 --- a/src/providers/gemini.rs +++ b/src/providers/gemini.rs @@ -57,8 +57,6 @@ struct GeminiPart { function_response: Option, #[serde(skip_serializing_if = "Option::is_none")] thought: Option, - #[serde(skip_serializing_if = "Option::is_none")] - thought_signature: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -72,6 +70,8 @@ struct GeminiInlineData { struct GeminiFunctionCall { name: String, args: Value, + #[serde(skip_serializing_if = "Option::is_none", rename = "thought_signature")] + thought_signature: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -231,7 +231,6 @@ impl GeminiProvider { function_call: None, function_response: None, thought: None, - thought_signature: None, }); } } @@ -271,7 +270,6 @@ impl GeminiProvider { response: response_value, }), thought: None, - thought_signature: None, }); } else if msg.role == "assistant" { // Assistant messages: handle text, thought (reasoning), and tool_calls @@ -284,7 +282,6 @@ impl GeminiProvider { function_call: None, function_response: None, thought: None, - thought_signature: None, }); } } @@ -299,7 +296,6 @@ impl GeminiProvider { function_call: None, function_response: None, thought: Some(reasoning.clone()), - thought_signature: None, }); } } @@ -324,10 +320,10 @@ impl GeminiProvider { function_call: Some(GeminiFunctionCall { name: tc.function.name.clone(), args, + thought_signature, }), function_response: None, thought: None, - thought_signature, }); } } @@ -343,7 +339,6 @@ impl GeminiProvider { function_call: None, function_response: None, thought: None, - thought_signature: None, }); } } @@ -362,7 +357,6 @@ impl GeminiProvider { function_call: None, function_response: None, thought: None, - thought_signature: None, }); } } @@ -398,7 +392,6 @@ impl GeminiProvider { function_call: None, function_response: None, thought: None, - thought_signature: None, }], }); } @@ -525,11 +518,10 @@ impl GeminiProvider { fn extract_tool_calls(parts: &[GeminiPart]) -> Option> { let calls: Vec = parts .iter() - .filter(|p| p.function_call.is_some()) - .map(|p| { - let fc = p.function_call.as_ref().unwrap(); - // CAPTURE: Use thought_signature from Part as the ID if available - let id = p.thought_signature.clone().unwrap_or_else(|| format!("call_{}", Uuid::new_v4().simple())); + .filter_map(|p| p.function_call.as_ref()) + .map(|fc| { + // CAPTURE: Use thought_signature from functionCall as the ID if available + let id = fc.thought_signature.clone().unwrap_or_else(|| format!("call_{}", Uuid::new_v4().simple())); ToolCall { id, @@ -549,12 +541,11 @@ impl GeminiProvider { fn extract_tool_call_deltas(parts: &[GeminiPart]) -> Option> { let deltas: Vec = parts .iter() + .filter_map(|p| p.function_call.as_ref()) .enumerate() - .filter(|(_, p)| p.function_call.is_some()) - .map(|(i, p)| { - let fc = p.function_call.as_ref().unwrap(); - // CAPTURE: Use thought_signature from Part as the ID if available - let id = p.thought_signature.clone().unwrap_or_else(|| format!("call_{}", Uuid::new_v4().simple())); + .map(|(i, fc)| { + // CAPTURE: Use thought_signature from functionCall as the ID if available + let id = fc.thought_signature.clone().unwrap_or_else(|| format!("call_{}", Uuid::new_v4().simple())); ToolCallDelta { index: i as u32,