From d3f60a76fef017df341bfda6f4ef0be3d034e36e Mon Sep 17 00:00:00 2001 From: matt-greathouse Date: Fri, 31 Oct 2025 15:54:51 -0400 Subject: [PATCH] Remove stripping of required fields from gemini optimized schema --- browser_use/llm/schema.py | 22 ++++---------------- tests/ci/models/test_llm_schema_optimizer.py | 10 +++++++++ 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/browser_use/llm/schema.py b/browser_use/llm/schema.py index 075564462..8467e09d4 100644 --- a/browser_use/llm/schema.py +++ b/browser_use/llm/schema.py @@ -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) diff --git a/tests/ci/models/test_llm_schema_optimizer.py b/tests/ci/models/test_llm_schema_optimizer.py index 5fc5e15a5..5aa452b05 100644 --- a/tests/ci/models/test_llm_schema_optimizer.py +++ b/tests/ci/models/test_llm_schema_optimizer.py @@ -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.'