From 5846b24b71e605c8484be6cbfd81717de052bf99 Mon Sep 17 00:00:00 2001 From: "Xiang (Sean) Zhou" Date: Sat, 3 May 2025 10:30:59 -0700 Subject: [PATCH] set param required tag to False by default PiperOrigin-RevId: 754382785 --- CHANGELOG.md | 6 +- .../adk/sessions/database_session_service.py | 8 +- .../adk/tools/openapi_tool/common/common.py | 8 +- .../openapi_spec_parser/operation_parser.py | 16 ++-- .../openapi_spec_parser/test_rest_api_tool.py | 76 +++++++++---------- 5 files changed, 57 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d04235f..02fe6d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ ### ⚠ BREAKING CHANGES * Auth: expose `access_token` and `refresh_token` at top level of auth - credentials, instead of a `dict` + credentails, instead of a `dict` ([commit](https://github.com/google/adk-python/commit/956fb912e8851b139668b1ccb8db10fd252a6990)). ### Features @@ -50,7 +50,7 @@ ### Miscellaneous Chores -* README.md improvements. +* README.md impprovements. * Various code improvements. * Various typo fixes. * Bump min version of google-genai to 1.11.0. @@ -108,4 +108,4 @@ * Built-in evaluation support * Development UI that makes local development easy * Deploy to Google Cloud Run, Agent Engine -* (Experimental) Live(Bidi) audio/video agent support and Compositional Function Calling(CFC) support +* (Experimental) Live(Bidi) auido/video agent support and Compositional Function Calling(CFC) support diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index b53dd87..7597361 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -484,11 +484,9 @@ class DatabaseSessionService(BaseSessionService): if storage_session.update_time.timestamp() > session.last_update_time: raise ValueError( - f"Session last_update_time " - f"{datetime.fromtimestamp(session.last_update_time):%Y-%m-%d %H:%M:%S} " - f"is later than the update_time in storage " - f"{storage_session.update_time:%Y-%m-%d %H:%M:%S}" - ) + f"Session last_update_time {session.last_update_time} is later than" + f" the upate_time in storage {storage_session.update_time}" + ) # Fetch states from storage storage_app_state = sessionFactory.get( diff --git a/src/google/adk/tools/openapi_tool/common/common.py b/src/google/adk/tools/openapi_tool/common/common.py index ffd7877..68c53d3 100644 --- a/src/google/adk/tools/openapi_tool/common/common.py +++ b/src/google/adk/tools/openapi_tool/common/common.py @@ -14,11 +14,7 @@ import keyword import re -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Union +from typing import Any, Dict, List, Optional, Union from fastapi.openapi.models import Response from fastapi.openapi.models import Schema @@ -100,7 +96,7 @@ class ApiParameter(BaseModel): py_name: Optional[str] = '' type_value: type[Any] = Field(default=None, init_var=False) type_hint: str = Field(default=None, init_var=False) - required: Optional[bool] = None + required: bool = False def model_post_init(self, _: Any): self.py_name = ( diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py index 7c78eee..930e05c 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py @@ -17,9 +17,13 @@ from textwrap import dedent from typing import Any, Dict, List, Optional, Union from fastapi.encoders import jsonable_encoder -from fastapi.openapi.models import Operation, Parameter, Schema +from fastapi.openapi.models import Operation +from fastapi.openapi.models import Parameter +from fastapi.openapi.models import Schema -from ..common.common import ApiParameter, PydocHelper, to_snake_case +from ..common.common import ApiParameter +from ..common.common import PydocHelper +from ..common.common import to_snake_case class OperationParser: @@ -76,7 +80,9 @@ class OperationParser: description = param.description or '' location = param.in_ or '' schema = param.schema_ or {} # Use schema_ instead of .schema - schema.description = description if schema.description is None and description != '' else schema.description + schema.description = ( + description if not schema.description else schema.description + ) required = param.required self.params.append( @@ -85,7 +91,7 @@ class OperationParser: param_location=location, param_schema=schema, description=description, - required=required + required=required, ) ) @@ -233,7 +239,7 @@ class OperationParser: } return { 'properties': properties, - 'required': [p.py_name for p in self.params if p.required is not False], + 'required': [p.py_name for p in self.params if p.required], 'title': f"{self.operation.operationId or 'unnamed'}_Arguments", 'type': 'object', } diff --git a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py index 6b4e27f..74b83d6 100644 --- a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +++ b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py @@ -61,7 +61,7 @@ class TestRestApiTool: return mock_parser @pytest.fixture - def sample_endpoint(self): + def sample_endpiont(self): return OperationEndpoint( base_url="https://example.com", path="/test", method="GET" ) @@ -131,7 +131,7 @@ class TestRestApiTool: def test_init( self, - sample_endpoint, + sample_endpiont, sample_operation, sample_auth_scheme, sample_auth_credential, @@ -139,14 +139,14 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_scheme=sample_auth_scheme, auth_credential=sample_auth_credential, ) assert tool.name == "test_tool" assert tool.description == "Test Tool" - assert tool.endpoint == sample_endpoint + assert tool.endpoint == sample_endpiont assert tool.operation == sample_operation assert tool.auth_credential == sample_auth_credential assert tool.auth_scheme == sample_auth_scheme @@ -154,7 +154,7 @@ class TestRestApiTool: def test_from_parsed_operation_str( self, - sample_endpoint, + sample_endpiont, sample_api_parameters, sample_return_parameter, sample_operation, @@ -162,7 +162,7 @@ class TestRestApiTool: parsed_operation_str = json.dumps({ "name": "test_operation", "description": "Test Description", - "endpoint": sample_endpoint.model_dump(), + "endpoint": sample_endpiont.model_dump(), "operation": sample_operation.model_dump(), "auth_scheme": None, "auth_credential": None, @@ -174,12 +174,12 @@ class TestRestApiTool: assert tool.name == "test_operation" def test_get_declaration( - self, sample_endpoint, sample_operation, mock_operation_parser + self, sample_endpiont, sample_operation, mock_operation_parser ): tool = RestApiTool( name="test_tool", description="Test description", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, should_parse_operation=False, ) @@ -198,7 +198,7 @@ class TestRestApiTool: self, mock_request, mock_tool_context, - sample_endpoint, + sample_endpiont, sample_operation, sample_auth_scheme, sample_auth_credential, @@ -210,7 +210,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_scheme=sample_auth_scheme, auth_credential=sample_auth_credential, @@ -228,7 +228,7 @@ class TestRestApiTool: def test_call_auth_pending( self, mock_request, - sample_endpoint, + sample_endpiont, sample_operation, sample_auth_scheme, sample_auth_credential, @@ -237,7 +237,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_scheme=sample_auth_scheme, auth_credential=sample_auth_credential, @@ -258,7 +258,7 @@ class TestRestApiTool: } def test_prepare_request_params_query_body( - self, sample_endpoint, sample_auth_credential, sample_auth_scheme + self, sample_endpiont, sample_auth_credential, sample_auth_scheme ): # Create a mock Operation object mock_operation = Operation( @@ -288,7 +288,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="test", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -327,7 +327,7 @@ class TestRestApiTool: assert request_params["params"] == {"testQueryParam": "query_value"} def test_prepare_request_params_array( - self, sample_endpoint, sample_auth_scheme, sample_auth_credential + self, sample_endpiont, sample_auth_scheme, sample_auth_credential ): mock_operation = Operation( operationId="test_op", @@ -345,7 +345,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="test", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -367,7 +367,7 @@ class TestRestApiTool: assert request_params["json"] == ["item1", "item2"] def test_prepare_request_params_string( - self, sample_endpoint, sample_auth_credential, sample_auth_scheme + self, sample_endpiont, sample_auth_credential, sample_auth_scheme ): mock_operation = Operation( operationId="test_op", @@ -380,7 +380,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -401,7 +401,7 @@ class TestRestApiTool: assert request_params["headers"]["Content-Type"] == "text/plain" def test_prepare_request_params_form_data( - self, sample_endpoint, sample_auth_scheme, sample_auth_credential + self, sample_endpiont, sample_auth_scheme, sample_auth_credential ): mock_operation = Operation( operationId="test_op", @@ -419,7 +419,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="test", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -443,7 +443,7 @@ class TestRestApiTool: ) def test_prepare_request_params_multipart( - self, sample_endpoint, sample_auth_credential, sample_auth_scheme + self, sample_endpiont, sample_auth_credential, sample_auth_scheme ): mock_operation = Operation( operationId="test_op", @@ -465,7 +465,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="test", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -486,7 +486,7 @@ class TestRestApiTool: assert request_params["headers"]["Content-Type"] == "multipart/form-data" def test_prepare_request_params_octet_stream( - self, sample_endpoint, sample_auth_scheme, sample_auth_credential + self, sample_endpiont, sample_auth_scheme, sample_auth_credential ): mock_operation = Operation( operationId="test_op", @@ -501,7 +501,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="test", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -524,13 +524,13 @@ class TestRestApiTool: ) def test_prepare_request_params_path_param( - self, sample_endpoint, sample_auth_credential, sample_auth_scheme + self, sample_endpiont, sample_auth_credential, sample_auth_scheme ): mock_operation = Operation(operationId="test_op") tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -557,7 +557,7 @@ class TestRestApiTool: def test_prepare_request_params_header_param( self, - sample_endpoint, + sample_endpiont, sample_auth_credential, sample_auth_scheme, sample_operation, @@ -565,7 +565,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -586,7 +586,7 @@ class TestRestApiTool: def test_prepare_request_params_cookie_param( self, - sample_endpoint, + sample_endpiont, sample_auth_credential, sample_auth_scheme, sample_operation, @@ -594,7 +594,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -614,7 +614,7 @@ class TestRestApiTool: assert request_params["cookies"]["session_id"] == "cookie_value" def test_prepare_request_params_multiple_mime_types( - self, sample_endpoint, sample_auth_credential, sample_auth_scheme + self, sample_endpiont, sample_auth_credential, sample_auth_scheme ): # Test what happens when multiple mime types are specified. It should take # the first one. @@ -632,7 +632,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=mock_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -653,7 +653,7 @@ class TestRestApiTool: def test_prepare_request_params_unknown_parameter( self, - sample_endpoint, + sample_endpiont, sample_auth_credential, sample_auth_scheme, sample_operation, @@ -661,7 +661,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -719,7 +719,7 @@ class TestRestApiTool: def test_prepare_request_params_no_unrecognized_query_parameter( self, - sample_endpoint, + sample_endpiont, sample_auth_credential, sample_auth_scheme, sample_operation, @@ -727,7 +727,7 @@ class TestRestApiTool: tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_credential=sample_auth_credential, auth_scheme=sample_auth_scheme, @@ -748,13 +748,13 @@ class TestRestApiTool: def test_prepare_request_params_no_credential( self, - sample_endpoint, + sample_endpiont, sample_operation, ): tool = RestApiTool( name="test_tool", description="Test Tool", - endpoint=sample_endpoint, + endpoint=sample_endpiont, operation=sample_operation, auth_credential=None, auth_scheme=None,