fix: Annotate response type as None for transfer_to_agent tool and set empty Schema as response schema when tool has no response annotation

1. if a function has no return type annotation, we should treat it as returning any type
2. we use empty schema (with `type` as None) to indicate no type constraints and this is already supported by model server

PiperOrigin-RevId: 789808104
This commit is contained in:
Xiang (Sean) Zhou
2025-08-01 10:22:28 -07:00
committed by Copybara-Service
parent faadef167e
commit 86a44873e9
7 changed files with 242 additions and 16 deletions
@@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Any
from typing import Dict
from google.adk.tools import _automatic_function_calling_util
@@ -51,9 +52,10 @@ def test_from_function_with_options_no_return_annotation_vertex():
assert declaration.name == 'test_function'
assert declaration.parameters.type == 'OBJECT'
assert declaration.parameters.properties['param'].type == 'STRING'
# VERTEX_AI should have response schema for None return
# VERTEX_AI should have response schema for functions with no return annotation
# Changed: Now uses Any type instead of NULL for no return annotation
assert declaration.response is not None
assert declaration.response.type == types.Type.NULL
assert declaration.response.type is None # Any type maps to None in schema
def test_from_function_with_options_explicit_none_return_vertex():
@@ -150,6 +152,26 @@ def test_from_function_with_options_int_return_vertex():
assert declaration.response.type == types.Type.INTEGER
def test_from_function_with_options_any_annotation_vertex():
"""Test from_function_with_options with Any type annotation for VERTEX_AI."""
def test_function(param: Any) -> Any:
"""A test function that uses Any type annotations."""
return param
declaration = _automatic_function_calling_util.from_function_with_options(
test_function, GoogleLLMVariant.VERTEX_AI
)
assert declaration.name == 'test_function'
assert declaration.parameters.type == 'OBJECT'
# Any type should map to None in schema (TYPE_UNSPECIFIED behavior)
assert declaration.parameters.properties['param'].type is None
# VERTEX_AI should have response schema for Any return
assert declaration.response is not None
assert declaration.response.type is None # Any type maps to None in schema
def test_from_function_with_options_no_params():
"""Test from_function_with_options with no parameters."""