Remove stripping of required fields from gemini optimized schema

This commit is contained in:
matt-greathouse
2025-10-31 15:54:51 -04:00
parent 55661ba26f
commit d3f60a76fe
2 changed files with 14 additions and 18 deletions

View File

@@ -164,27 +164,13 @@ class SchemaOptimizer:
@staticmethod
def create_gemini_optimized_schema(model: type[BaseModel]) -> dict[str, Any]:
"""
Create Gemini-optimized schema that removes 'required' arrays to save tokens.
Gemini can infer required fields from context since all fields are required.
Create Gemini-optimized schema, preserving explicit `required` arrays so Gemini
respects mandatory fields defined by the caller.
Args:
model: The Pydantic model to optimize
Returns:
Optimized schema without required arrays
Optimized schema suitable for Gemini structured output
"""
# Start with standard optimized schema
schema = SchemaOptimizer.create_optimized_json_schema(model)
def remove_required_arrays(obj: Any) -> Any:
"""Recursively remove 'required' arrays"""
if isinstance(obj, dict):
# Remove 'required' key
result = {k: v for k, v in obj.items() if k != 'required'}
# Recursively process nested structures
return {k: remove_required_arrays(v) for k, v in result.items()}
elif isinstance(obj, list):
return [remove_required_arrays(item) for item in obj]
return obj
return remove_required_arrays(schema)
return SchemaOptimizer.create_optimized_json_schema(model)

View File

@@ -64,3 +64,13 @@ def test_optimizer_preserves_all_fields_in_structured_done_action():
f'Missing from optimized: {original_fields - optimized_fields}\n'
f'Unexpected in optimized: {optimized_fields - original_fields}'
)
def test_gemini_schema_retains_required_fields():
"""Gemini schema should keep explicit required arrays for mandatory fields."""
schema = SchemaOptimizer.create_gemini_optimized_schema(ProductInfo)
assert 'required' in schema, 'Gemini schema removed required fields.'
required_fields = set(schema['required'])
assert {'price', 'title'}.issubset(required_fields), 'Mandatory fields must stay required for Gemini.'