From 8b8f8b37c35479f747a70a65f069c0d8d4b01dcf Mon Sep 17 00:00:00 2001 From: sigoden Date: Fri, 28 Jun 2024 07:11:20 +0800 Subject: fix: gemini with functions that have empty parameters (#666) --- src/client/vertexai.rs | 13 ++++++++++++- src/function.rs | 9 +++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/client/vertexai.rs b/src/client/vertexai.rs index cc7e464..a4c4050 100644 --- a/src/client/vertexai.rs +++ b/src/client/vertexai.rs @@ -353,7 +353,18 @@ pub fn gemini_build_chat_completions_body( } if let Some(functions) = functions { - body["tools"] = json!([{ "functionDeclarations": *functions }]); + // Gemini doesn't support functions with parameters that have empty properties, so we need to patch it. + let function_declarations: Vec<_> = functions.into_iter().map(|function| { + if function.parameters.is_empty_properties() { + json!({ + "name": function.name, + "description": function.description, + }) + } else { + json!(function) + } + }).collect(); + body["tools"] = json!([{ "functionDeclarations": function_declarations }]); } Ok(body) diff --git a/src/function.rs b/src/function.rs index 8528af5..e99d2c6 100644 --- a/src/function.rs +++ b/src/function.rs @@ -125,6 +125,15 @@ pub struct JsonSchema { pub required: Option>, } +impl JsonSchema { + pub fn is_empty_properties(&self) -> bool { + match &self.properties { + Some(v) => v.is_empty(), + None => true, + } + } +} + #[derive(Debug, Clone, Default, Deserialize, Serialize)] pub struct ToolCall { pub name: String, -- cgit v1.2.3