Skip to content

Commit 5387476

Browse files
committed
feat: Added support for enums as arguments for function tools
1 parent 0b84d3e commit 5387476

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

src/google/adk/tools/_function_parameter_parse_util.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
from google.genai import types
2929
import pydantic
30+
from enum import Enum
3031

3132
from ..utils.variant_utils import GoogleLLMVariant
3233

@@ -145,6 +146,15 @@ def _parse_schema_from_parameter(
145146
schema.type = _py_builtin_type_to_schema_type[param.annotation]
146147
_raise_if_schema_unsupported(variant, schema)
147148
return schema
149+
if isinstance(param.annotation, type) and issubclass(param.annotation, Enum):
150+
schema.type = types.Type.STRING
151+
schema.enum = [e.value for e in param.annotation]
152+
if param.default is not inspect.Parameter.empty:
153+
if not _is_default_value_compatible(param.default, param.annotation):
154+
raise ValueError(default_value_error_msg)
155+
schema.default = param.default
156+
_raise_if_schema_unsupported(variant, schema)
157+
return schema
148158
if (
149159
get_origin(param.annotation) is Union
150160
# only parse simple UnionType, example int | str | float | bool

tests/unittests/tools/test_build_function_declaration.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
# TODO: crewai requires python 3.10 as minimum
2323
# from crewai_tools import FileReadTool
2424
from pydantic import BaseModel
25-
25+
from enum import Enum
2626

2727
def test_string_input():
2828
def simple_function(input_str: str) -> str:
@@ -219,6 +219,24 @@ def simple_function(
219219
assert function_decl.parameters.properties['input_dir'].type == 'ARRAY'
220220
assert function_decl.parameters.properties['input_dir'].items.type == 'OBJECT'
221221

222+
def test_enums():
223+
224+
class InputEnum(Enum):
225+
AGENT = "agent"
226+
TOOL = "tool"
227+
228+
def simple_function(input:InputEnum):
229+
return input.value
230+
231+
function_decl = _automatic_function_calling_util.build_function_declaration(
232+
func=simple_function
233+
)
234+
235+
assert function_decl.name == 'simple_function'
236+
assert function_decl.parameters.type == 'OBJECT'
237+
assert function_decl.parameters.properties['input'].type == 'STRING'
238+
assert function_decl.parameters.properties['input'].enum == ['agent', 'tool']
239+
222240

223241
def test_basemodel_list():
224242
class ChildInput(BaseModel):

0 commit comments

Comments
 (0)