Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions python/packages/autogen-core/src/autogen_core/_function_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,16 +117,15 @@ class ToolFunction(BaseModel):
function: Annotated[Function, Field(description="Function under tool")]


def type2description(k: str, v: Union[Annotated[Type[Any], str], Type[Any]]) -> str:
# handles Annotated
def type2description(k: str, v: Any) -> str:
if hasattr(v, "__metadata__"):
retval = v.__metadata__[0]
if isinstance(retval, str):
return retval
else:
raise ValueError(f"Invalid description {retval} for parameter {k}, should be a string.")
else:
return k
for metadata in v.__metadata__:
if isinstance(metadata, str):
return metadata
description = getattr(metadata, "description", None)
if isinstance(description, str):
return description
return k


def get_parameter_json_schema(k: str, v: Any, default_values: Dict[str, Any]) -> Dict[str, Any]:
Expand Down
28 changes: 27 additions & 1 deletion python/packages/autogen-core/tests/test_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import pytest
from autogen_core import CancellationToken
from autogen_core._function_utils import get_typed_signature
from autogen_core._function_utils import get_typed_signature, type2description
from autogen_core.tools import BaseTool, FunctionTool
from autogen_core.tools._base import ToolSchema
from pydantic import BaseModel, Field, ValidationError, model_serializer
Expand Down Expand Up @@ -94,6 +94,32 @@ def my_function(arg: str, other: Annotated[int, "int arg"], nonrequired: int = 5
assert len(schema["parameters"]["properties"]) == 3


def test_func_tool_schema_generation_with_annotated_metadata() -> None:
def my_function(
query: Annotated[str, Field(description="SQL search term")],
score: Annotated[float, Field(gt=0), "Normalized score"],
limit: Annotated[int, Field(ge=0)],
) -> str:
return "result"

schema = FunctionTool(my_function, description="Function tool.").schema
assert "parameters" in schema
properties = schema["parameters"]["properties"]

assert properties["query"]["description"] == "SQL search term"
assert properties["score"]["description"] == "Normalized score"
assert properties["limit"]["description"] == "limit"


def test_type2description_uses_description_attribute() -> None:
class DescribedMetadata:
description = "Custom description"

annotation = Annotated[int, object(), DescribedMetadata()]

assert type2description("value", annotation) == "Custom description"


def test_func_tool_schema_generation_strict() -> None:
def my_function1(arg: str, other: Annotated[int, "int arg"], nonrequired: int = 5) -> MyResult:
return MyResult(result="test")
Expand Down