3v324v23's picture
Add Bextts TTS integration
b3f024a
Raw
History Blame Contribute Delete
5.39 kB
#!/usr/bin/env python3
"""Multiple tools example with Esperanto.
This example demonstrates using multiple tools:
1. Define several tools for different purposes
2. Let the model choose which tool(s) to call
3. Handle different tool call types
Environment variables required:
- OPENAI_API_KEY: Your OpenAI API key
Run with:
python examples/tool_calling/multiple_tools.py
"""
import json
import os
from esperanto import AIFactory
from esperanto.common_types import Tool, ToolFunction
def create_tools():
"""Create a set of tools for a hypothetical assistant."""
# Weather tool
weather_tool = Tool(
type="function",
function=ToolFunction(
name="get_weather",
description="Get current weather for a location",
parameters={
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City name, e.g., 'Paris, France'",
}
},
"required": ["location"],
},
),
)
# Calculator tool
calculator_tool = Tool(
type="function",
function=ToolFunction(
name="calculate",
description="Perform mathematical calculations",
parameters={
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "Mathematical expression to evaluate, e.g., '2 + 2' or '15 * 7'",
}
},
"required": ["expression"],
},
),
)
# Search tool
search_tool = Tool(
type="function",
function=ToolFunction(
name="search_web",
description="Search the web for information",
parameters={
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query",
},
"num_results": {
"type": "integer",
"description": "Number of results to return (1-10)",
"minimum": 1,
"maximum": 10,
},
},
"required": ["query"],
},
),
)
# Time tool
time_tool = Tool(
type="function",
function=ToolFunction(
name="get_current_time",
description="Get the current time in a specific timezone",
parameters={
"type": "object",
"properties": {
"timezone": {
"type": "string",
"description": "Timezone name, e.g., 'America/New_York' or 'Europe/London'",
}
},
"required": ["timezone"],
},
),
)
return [weather_tool, calculator_tool, search_tool, time_tool]
def main():
# Check for API key
if not os.getenv("OPENAI_API_KEY"):
print("Please set OPENAI_API_KEY environment variable")
print("Export it with: export OPENAI_API_KEY='your-key-here'")
return
# Create tools
tools = create_tools()
# Create model
model = AIFactory.create_language(
provider="openai",
model_name="gpt-4o-mini",
config={"tools": tools},
)
print("=== Multiple Tools Example ===\n")
print(f"Available tools: {[t.function.name for t in tools]}\n")
# Test different queries that should trigger different tools
test_queries = [
"What's 15 multiplied by 23?",
"What's the weather in Berlin?",
"What time is it in Tokyo?",
"Search for the latest news about AI",
]
for query in test_queries:
print(f"User: {query}")
messages = [{"role": "user", "content": query}]
response = model.chat_complete(messages)
message = response.choices[0].message
if message.tool_calls:
for tool_call in message.tool_calls:
args = json.loads(tool_call.function.arguments)
print(f" -> Tool: {tool_call.function.name}")
print(f" Args: {args}")
else:
print(f" -> Response: {message.content[:100]}...")
print()
# Test a query that might trigger multiple tools (parallel tool calls)
print("--- Testing parallel tool calls ---\n")
complex_query = "What's the weather in New York and what time is it there?"
print(f"User: {complex_query}")
messages = [{"role": "user", "content": complex_query}]
# Enable parallel tool calls
response = model.chat_complete(messages, parallel_tool_calls=True)
message = response.choices[0].message
if message.tool_calls:
print(f"Model requested {len(message.tool_calls)} tool call(s):")
for i, tool_call in enumerate(message.tool_calls, 1):
args = json.loads(tool_call.function.arguments)
print(f" {i}. {tool_call.function.name}: {args}")
else:
print(f" Response: {message.content}")
print("\n=== Example Complete ===")
if __name__ == "__main__":
main()