Skip to main content
Build agentic workflows with Agno agents and extend their functionality through the use of custom tools.

from dataclasses import dataclass

from agno.agent import Agent
from agno.models.openai import OpenAIChat
from pydantic import BaseModel

# ---------------------------------------------------------------------------
# Create Agent
# ---------------------------------------------------------------------------


def dict_tool(name: str, age: int, city: str):
    """
    Return a dictionary with the name, age, and city of the person.
    """
    return {"name": name, "age": age, "city": city}


def list_tool(items: list[str]):
    """
    Return a list of items.
    """
    return items


def set_tool(items: list[str]):
    """
    Return a set of items.
    """
    return set(items)


def tuple_tool(name: str, age: int, city: str):
    """
    Return a tuple with the name, age, and city of the person.
    """
    return (name, age, city)


def generator_tool(items: list[str]):
    """
    Return a generator of items.
    """
    for item in items:
        yield item
        yield " "


def pydantic_tool(name: str, age: int, city: str):
    """
    Return a Pydantic model with the name, age, and city of the person.
    """

    class CustomTool(BaseModel):
        name: str
        age: int
        city: str

    return CustomTool(name=name, age=age, city=city)


def data_class_tool(name: str, age: int, city: str):
    """
    Return a data class with the name, age, and city of the person.
    """

    @dataclass
    class CustomTool:
        name: str
        age: int
        city: str

    return CustomTool(name=name, age=age, city=city)


agent = Agent(
    model=OpenAIChat(id="gpt-4o"),
    tools=[
        dict_tool,
        list_tool,
        generator_tool,
        pydantic_tool,
        data_class_tool,
        set_tool,
        tuple_tool,
    ],
)

# ---------------------------------------------------------------------------
# Run Agent
# ---------------------------------------------------------------------------
if __name__ == "__main__":
    agent.print_response("Call all the tools and make up interesting arguments")

    # ---------------------------------------------------------------------------
    # Async Variant
    # ---------------------------------------------------------------------------

    import asyncio
    from dataclasses import dataclass

    from agno.agent import Agent
    from agno.models.openai import OpenAIChat
    from pydantic import BaseModel

    async def dict_tool(name: str, age: int, city: str):
        """
        Return a dictionary with the name, age, and city of the person.
        """
        return {"name": name, "age": age, "city": city}

    async def list_tool(items: list[str]):
        """
        Return a list of items.
        """
        return items

    async def set_tool(items: list[str]):
        """
        Return a set of items.
        """
        return set(items)

    async def tuple_tool(name: str, age: int, city: str):
        """
        Return a tuple with the name, age, and city of the person.
        """
        return (name, age, city)

    async def generator_tool(items: list[str]):
        """
        Return a generator of items.
        """
        for item in items:
            yield item
            yield " "

    async def pydantic_tool(name: str, age: int, city: str):
        """
        Return a Pydantic model with the name, age, and city of the person.
        """

        class CustomTool(BaseModel):
            name: str
            age: int
            city: str

        return CustomTool(name=name, age=age, city=city)

    async def data_class_tool(name: str, age: int, city: str):
        """
        Return a data class with the name, age, and city of the person.
        """

        @dataclass
        class CustomTool:
            name: str
            age: int
            city: str

        return CustomTool(name=name, age=age, city=city)

    agent = Agent(
        model=OpenAIChat(id="gpt-4o"),
        tools=[
            dict_tool,
            list_tool,
            generator_tool,
            pydantic_tool,
            data_class_tool,
            set_tool,
            tuple_tool,
        ],
    )

    asyncio.run(
        agent.aprint_response("Call all the tools and make up interesting arguments")
    )

Run the Example

# Clone and setup repo
git clone https://github.com/agno-agi/agno.git
cd agno/cookbook/91_tools

# Create and activate virtual environment
./scripts/demo_setup.sh
source .venvs/demo/bin/activate

python custom_tools.py
For details, see Custom tools cookbook.