diff --git a/src/google/adk/tools/_automatic_function_calling_util.py b/src/google/adk/tools/_automatic_function_calling_util.py index 6a76066..96d7226 100644 --- a/src/google/adk/tools/_automatic_function_calling_util.py +++ b/src/google/adk/tools/_automatic_function_calling_util.py @@ -16,6 +16,7 @@ from __future__ import annotations import inspect from types import FunctionType +import typing from typing import Any from typing import Callable from typing import Dict @@ -29,7 +30,7 @@ from pydantic import BaseModel from pydantic import create_model from pydantic import fields as pydantic_fields -from . import function_parameter_parse_util +from . import _function_parameter_parse_util _py_type_2_schema_type = { 'str': types.Type.STRING, @@ -306,7 +307,11 @@ def from_function_with_options( inspect.Parameter.KEYWORD_ONLY, inspect.Parameter.POSITIONAL_ONLY, ): - schema = function_parameter_parse_util._parse_schema_from_parameter( + # This snippet catches the case when type hints are stored as strings + if isinstance(param.annotation, str): + param = param.replace(annotation=typing.get_type_hints(func)[name]) + + schema = _function_parameter_parse_util._parse_schema_from_parameter( variant, param, func.__name__ ) parameters_properties[name] = schema @@ -320,7 +325,7 @@ def from_function_with_options( properties=parameters_properties, ) declaration.parameters.required = ( - function_parameter_parse_util._get_required_fields( + _function_parameter_parse_util._get_required_fields( declaration.parameters ) ) @@ -331,14 +336,19 @@ def from_function_with_options( if return_annotation is inspect._empty: return declaration + return_value = inspect.Parameter( + 'return_value', + inspect.Parameter.POSITIONAL_OR_KEYWORD, + annotation=return_annotation, + ) + # This snippet catches the case when type hints are stored as strings + if isinstance(return_value.annotation, str): + return_value = return_value.replace(annotation=typing.get_type_hints(func)["return"]) + declaration.response = ( - function_parameter_parse_util._parse_schema_from_parameter( + _function_parameter_parse_util._parse_schema_from_parameter( variant, - inspect.Parameter( - 'return_value', - inspect.Parameter.POSITIONAL_OR_KEYWORD, - annotation=return_annotation, - ), + return_value, func.__name__, ) ) diff --git a/src/google/adk/tools/function_parameter_parse_util.py b/src/google/adk/tools/_function_parameter_parse_util.py similarity index 99% rename from src/google/adk/tools/function_parameter_parse_util.py rename to src/google/adk/tools/_function_parameter_parse_util.py index 5cda5ba..964a615 100644 --- a/src/google/adk/tools/function_parameter_parse_util.py +++ b/src/google/adk/tools/_function_parameter_parse_util.py @@ -13,6 +13,8 @@ # limitations under the License. # +from __future__ import annotations + import inspect import logging import types as typing_types