Tools¶
Tools give agents the ability to take actions and access external data.
Function Tools¶
The simplest way to create a tool:
from agents import Agent, function_tool
@function_tool
def get_weather(city: str) -> str:
"""Get current weather for a city.
Args:
city: The city name to get weather for
"""
# Your implementation
return f"Weather in {city}: Sunny, 72°F"
agent = Agent(
name="weather_bot",
instructions="Help users with weather information.",
tools=[get_weather],
)
Async Tools¶
@function_tool
async def fetch_data(url: str) -> str:
"""Fetch data from a URL."""
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
Tools with Context¶
Access the run context in tools:
from dataclasses import dataclass
from agents import function_tool, RunContextWrapper
@dataclass
class AppContext:
user_id: str
api_key: str
@function_tool
def get_user_profile(ctx: RunContextWrapper[AppContext]) -> str:
"""Get the current user's profile."""
user_id = ctx.context.user_id
# Fetch profile using user_id
return f"Profile for user {user_id}"
Tool Parameters¶
Pydantic models for complex parameters:
from pydantic import BaseModel, Field
from agents import function_tool
class SearchParams(BaseModel):
query: str = Field(description="Search query")
max_results: int = Field(default=10, description="Max results to return")
include_metadata: bool = Field(default=False)
@function_tool
def search(params: SearchParams) -> str:
"""Search the knowledge base."""
# Use params.query, params.max_results, etc.
return f"Found results for: {params.query}"
Custom Tool Class¶
For more control, extend the Tool class:
from agents import Tool
class DatabaseTool(Tool):
name = "query_database"
description = "Query the application database"
def __init__(self, connection_string: str):
self.conn = connect(connection_string)
async def run(self, query: str) -> str:
result = await self.conn.execute(query)
return str(result)
@property
def parameters_schema(self) -> dict:
return {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "SQL query to execute"
}
},
"required": ["query"]
}
Tool Return Types¶
String (default)¶
Structured (Pydantic)¶
class ToolResult(BaseModel):
success: bool
data: dict
@function_tool
def structured() -> ToolResult:
return ToolResult(success=True, data={"key": "value"})
List/Dict¶
Error Handling¶
from agents import function_tool, ToolError
@function_tool
def risky_operation(param: str) -> str:
"""An operation that might fail."""
try:
result = do_something(param)
return result
except Exception as e:
raise ToolError(f"Operation failed: {e}")
Tool Metadata¶
@function_tool(
name="custom_name", # Override function name
description="Custom description", # Override docstring
)
def my_tool(x: int) -> int:
return x * 2
Multiple Tools¶
from agents import Agent
agent = Agent(
name="multi_tool",
instructions="Use available tools to help users.",
tools=[
get_weather,
search_web,
calculate,
send_email,
],
)
See Also¶
- Agents - Creating agents
- Running Agents - Execution
- Context - Run context