Drop unsupported additionalProperties field from gemini tool definitions

This commit is contained in:
Debanjum
2025-07-09 17:53:19 -07:00
parent 3141035f48
commit cc6da4c440
2 changed files with 21 additions and 3 deletions

View File

@@ -41,7 +41,7 @@ def gemini_send_message_to_model(
if tools: if tools:
model_kwargs["tools"] = tools model_kwargs["tools"] = tools
# Monitor for flakiness in 1.5+ models. This would cause unwanted behavior and terminate response early in 1.5 models. # Monitor for flakiness in 1.5+ models. This would cause unwanted behavior and terminate response early in 1.5 models.
elif response_type == "json_object" and not model.startswith("gemini-1.5"): elif response_type == "json_object":
model_kwargs["response_mime_type"] = "application/json" model_kwargs["response_mime_type"] = "application/json"
if response_schema: if response_schema:
model_kwargs["response_schema"] = response_schema model_kwargs["response_schema"] = response_schema

View File

@@ -4,7 +4,7 @@ import os
import random import random
from copy import deepcopy from copy import deepcopy
from time import perf_counter from time import perf_counter
from typing import AsyncGenerator, AsyncIterator, Dict, List from typing import Any, AsyncGenerator, AsyncIterator, Dict, List
import httpx import httpx
from google import genai from google import genai
@@ -456,13 +456,31 @@ def is_reasoning_model(model_name: str) -> bool:
def to_gemini_tools(tools: List[ToolDefinition]) -> List[gtypes.ToolDict] | None: def to_gemini_tools(tools: List[ToolDefinition]) -> List[gtypes.ToolDict] | None:
"Transform tool definitions from standard format to Gemini format." "Transform tool definitions from standard format to Gemini format."
def clean_schema(schema: Dict[str, Any]) -> Dict[str, Any]:
"""Remove additionalProperties from schema as Gemini doesn't accept it."""
if not isinstance(schema, dict):
return schema
cleaned: Dict[str, Any] = {}
for key, value in schema.items():
if key == "additionalProperties":
continue
if isinstance(value, dict):
cleaned[key] = clean_schema(value)
elif isinstance(value, list):
cleaned[key] = [clean_schema(item) if isinstance(item, dict) else item for item in value]
else:
cleaned[key] = value
return cleaned
gemini_tools = [ gemini_tools = [
gtypes.ToolDict( gtypes.ToolDict(
function_declarations=[ function_declarations=[
gtypes.FunctionDeclarationDict( gtypes.FunctionDeclarationDict(
name=tool.name, name=tool.name,
description=tool.description, description=tool.description,
parameters=tool.schema, parameters=clean_schema(tool.schema),
) )
for tool in tools for tool in tools
] ]