feat: add a subagent frame
This commit is contained in:
118
agentlite/examples/custom_tools.py
Normal file
118
agentlite/examples/custom_tools.py
Normal file
@@ -0,0 +1,118 @@
|
||||
"""Example: Custom Tools
|
||||
|
||||
This example demonstrates how to define and use custom tools with agents.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
from agentlite import Agent, OpenAIProvider, tool
|
||||
from agentlite.tool import CallableTool2, ToolOk
|
||||
|
||||
|
||||
# Define a tool using the decorator
|
||||
@tool()
|
||||
async def get_current_time() -> str:
|
||||
"""Get the current date and time."""
|
||||
return datetime.now().isoformat()
|
||||
|
||||
|
||||
@tool()
|
||||
async def calculate(expression: str) -> str:
|
||||
"""Evaluate a mathematical expression.
|
||||
|
||||
Args:
|
||||
expression: The mathematical expression to evaluate (e.g., "2 + 2").
|
||||
"""
|
||||
try:
|
||||
# Safe evaluation - only allow basic math operations
|
||||
allowed_names = {
|
||||
"abs": abs,
|
||||
"max": max,
|
||||
"min": min,
|
||||
"pow": pow,
|
||||
"round": round,
|
||||
}
|
||||
result = eval(expression, {"__builtins__": {}}, allowed_names)
|
||||
return str(result)
|
||||
except Exception as e:
|
||||
return f"Error: {e}"
|
||||
|
||||
|
||||
# Define a tool using CallableTool2 (type-safe)
|
||||
class WeatherParams(BaseModel):
|
||||
"""Parameters for weather tool."""
|
||||
|
||||
city: str
|
||||
units: str = "celsius"
|
||||
|
||||
|
||||
class GetWeather(CallableTool2[WeatherParams]):
|
||||
"""Get weather information for a city."""
|
||||
|
||||
name = "get_weather"
|
||||
description = "Get the current weather for a city."
|
||||
params = WeatherParams
|
||||
|
||||
async def __call__(self, params: WeatherParams) -> ToolOk:
|
||||
# This is a mock implementation
|
||||
# In a real scenario, you would call a weather API
|
||||
weather_data = {
|
||||
"Beijing": {"temp": 22, "condition": "Sunny"},
|
||||
"Shanghai": {"temp": 25, "condition": "Cloudy"},
|
||||
"New York": {"temp": 18, "condition": "Rainy"},
|
||||
"London": {"temp": 15, "condition": "Overcast"},
|
||||
}
|
||||
|
||||
city = params.city
|
||||
if city in weather_data:
|
||||
data = weather_data[city]
|
||||
temp = data["temp"]
|
||||
if params.units == "fahrenheit":
|
||||
temp = temp * 9 // 5 + 32
|
||||
return ToolOk(
|
||||
output=f"Weather in {city}: {data['condition']}, {temp}°{params.units[0].upper()}"
|
||||
)
|
||||
return ToolOk(output=f"Weather data not available for {city}")
|
||||
|
||||
|
||||
async def main():
|
||||
"""Run the custom tools example."""
|
||||
# Create provider
|
||||
provider = OpenAIProvider(
|
||||
api_key=os.getenv("OPENAI_API_KEY", "your-api-key"),
|
||||
model="gpt-4o-mini",
|
||||
)
|
||||
|
||||
# Create agent with tools
|
||||
agent = Agent(
|
||||
provider=provider,
|
||||
system_prompt="You are a helpful assistant with access to tools.",
|
||||
tools=[
|
||||
get_current_time,
|
||||
calculate,
|
||||
GetWeather(),
|
||||
],
|
||||
)
|
||||
|
||||
# Test tools
|
||||
print("=== Testing Tools ===\n")
|
||||
|
||||
print("User: What time is it?")
|
||||
response = await agent.run("What time is it?")
|
||||
print(f"Agent: {response}\n")
|
||||
|
||||
print("User: What is 123 * 456?")
|
||||
response = await agent.run("What is 123 * 456?")
|
||||
print(f"Agent: {response}\n")
|
||||
|
||||
print("User: What's the weather in Beijing?")
|
||||
response = await agent.run("What's the weather in Beijing?")
|
||||
print(f"Agent: {response}\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user