|
|
|
@@ -13,6 +13,52 @@ from ._base import BaseTool |
|
|
|
|
|
|
|
|
|
|
|
class FunctionTool(BaseTool[BaseModel, BaseModel]): |
|
|
|
""" |
|
|
|
Create custom tools by wrapping standard Python functions. |
|
|
|
|
|
|
|
`FunctionTool` offers an interface for executing Python functions either asynchronously or synchronously. |
|
|
|
Each function must include type annotations for all parameters and its return type. These annotations |
|
|
|
enable `FunctionTool` to generate a schema necessary for input validation, serialization, and for informing |
|
|
|
the LLM about expected parameters. When the LLM prepares a function call, it leverages this schema to |
|
|
|
generate arguments that align with the function's specifications. |
|
|
|
|
|
|
|
.. note:: |
|
|
|
|
|
|
|
It is the user's responsibility to verify that the tool's output type matches the expected type. |
|
|
|
|
|
|
|
Args: |
|
|
|
func (Callable[..., ReturnT | Awaitable[ReturnT]]): The function to wrap and expose as a tool. |
|
|
|
description (str): A description to inform the model of the function's purpose, specifying what |
|
|
|
it does and the context in which it should be called. |
|
|
|
name (str, optional): An optional custom name for the tool. Defaults to |
|
|
|
the function's original name if not provided. |
|
|
|
|
|
|
|
Example: |
|
|
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
|
|
import random |
|
|
|
from autogen_core.base import CancellationToken |
|
|
|
from autogen_core.components.tools import FunctionTool |
|
|
|
from typing_extensions import Annotated |
|
|
|
|
|
|
|
|
|
|
|
async def get_stock_price(ticker: str, date: Annotated[str, "Date in YYYY/MM/DD"]) -> float: |
|
|
|
# Simulates a stock price retrieval by returning a random float within a specified range. |
|
|
|
return random.uniform(10, 200) |
|
|
|
|
|
|
|
|
|
|
|
# Initialize a FunctionTool instance for retrieving stock prices. |
|
|
|
stock_price_tool = FunctionTool(get_stock_price, description="Fetch the stock price for a given ticker.") |
|
|
|
|
|
|
|
# Execute the tool with cancellation support. |
|
|
|
cancellation_token = CancellationToken() |
|
|
|
result = await stock_price_tool.run_json({"ticker": "AAPL", "date": "2021/01/01"}, cancellation_token) |
|
|
|
|
|
|
|
# Output the result as a formatted string. |
|
|
|
print(stock_price_tool.return_value_as_string(result)) |
|
|
|
""" |
|
|
|
|
|
|
|
def __init__(self, func: Callable[..., Any], description: str, name: str | None = None) -> None: |
|
|
|
self._func = func |
|
|
|
signature = get_typed_signature(func) |
|
|
|
@@ -46,6 +92,4 @@ class FunctionTool(BaseTool[BaseModel, BaseModel]): |
|
|
|
cancellation_token.link_future(future) |
|
|
|
result = await future |
|
|
|
|
|
|
|
if not isinstance(result, self.return_type()): |
|
|
|
raise ValueError(f"Expected return type {self.return_type()}, got {type(result)}") |
|
|
|
return result |