mirror of
https://github.com/hanzoai/python-sdk.git
synced 2026-10-23 20:23:00 +00:00
Fix 35 ruff errors (E722, F841, B904, B905, B007, E741, S202, S310, S306, S110, TID251, UP042, F401) and run black on 526 files. Co-authored-by: Hanzo Dev <[email protected]>
326 lines
9.9 KiB
Python
326 lines
9.9 KiB
Python
"""Example demonstrating agent networks with routing and state sharing."""
|
|
|
|
import asyncio
|
|
from typing import Any, Dict
|
|
|
|
from agents import (
|
|
Agent,
|
|
AgentNetwork,
|
|
NetworkConfig,
|
|
SemanticRouter,
|
|
RuleBasedRouter,
|
|
routing_strategy,
|
|
InMemoryStateStore,
|
|
Memory,
|
|
MemoryType,
|
|
Orchestrator,
|
|
OrchestrationConfig,
|
|
function_tool,
|
|
Runner,
|
|
)
|
|
|
|
# Define specialized agents
|
|
research_agent = Agent(
|
|
name="research_agent",
|
|
instructions="""You are a research specialist. You excel at:
|
|
- Finding information on any topic
|
|
- Analyzing data and trends
|
|
- Summarizing complex information
|
|
- Providing citations and sources
|
|
|
|
When you receive a research request, provide thorough, well-sourced information.""",
|
|
handoff_description="Handles research, data gathering, and analysis tasks",
|
|
)
|
|
|
|
writer_agent = Agent(
|
|
name="writer_agent",
|
|
instructions="""You are a writing specialist. You excel at:
|
|
- Creating engaging content
|
|
- Adapting tone and style
|
|
- Structuring documents
|
|
- Editing and proofreading
|
|
|
|
When you receive a writing request, create polished, well-structured content.""",
|
|
handoff_description="Handles content creation, editing, and writing tasks",
|
|
)
|
|
|
|
coder_agent = Agent(
|
|
name="coder_agent",
|
|
instructions="""You are a coding specialist. You excel at:
|
|
- Writing clean, efficient code
|
|
- Debugging and optimization
|
|
- System design and architecture
|
|
- Code reviews and best practices
|
|
|
|
When you receive a coding request, provide working, well-documented solutions.""",
|
|
handoff_description="Handles programming, debugging, and technical implementation",
|
|
)
|
|
|
|
coordinator_agent = Agent(
|
|
name="coordinator_agent",
|
|
instructions="""You are a project coordinator. You:
|
|
- Break down complex tasks
|
|
- Delegate to appropriate specialists
|
|
- Ensure quality and consistency
|
|
- Synthesize results from multiple agents
|
|
|
|
Analyze each request and coordinate with the right specialists.""",
|
|
handoff_description="Main coordinator that delegates tasks to specialists",
|
|
)
|
|
|
|
|
|
# Tools for agents
|
|
@function_tool
|
|
async def save_to_memory(ctx, key: str, value: str) -> str:
|
|
"""Save information to shared memory for other agents to access."""
|
|
# Access network context
|
|
if hasattr(ctx, "network"):
|
|
await ctx.set_state(key, value, namespace="shared")
|
|
return f"Saved '{key}' to shared memory"
|
|
return "Memory not available"
|
|
|
|
|
|
@function_tool
|
|
async def recall_from_memory(ctx, key: str) -> str:
|
|
"""Recall information from shared memory."""
|
|
if hasattr(ctx, "network"):
|
|
value = await ctx.get_state(key, namespace="shared")
|
|
if value:
|
|
return f"Retrieved from memory: {value}"
|
|
return f"No memory found for key '{key}'"
|
|
return "Memory not available"
|
|
|
|
|
|
@function_tool
|
|
async def list_memories(ctx) -> str:
|
|
"""List all keys in shared memory."""
|
|
if hasattr(ctx, "network"):
|
|
keys = await ctx.state_store.keys(namespace="shared")
|
|
if keys:
|
|
return f"Memory keys: {', '.join(keys)}"
|
|
return "No memories stored"
|
|
return "Memory not available"
|
|
|
|
|
|
# Add tools to agents
|
|
research_agent.tools = [save_to_memory, recall_from_memory, list_memories]
|
|
writer_agent.tools = [save_to_memory, recall_from_memory, list_memories]
|
|
coder_agent.tools = [save_to_memory, recall_from_memory, list_memories]
|
|
coordinator_agent.tools = [save_to_memory, recall_from_memory, list_memories]
|
|
|
|
|
|
async def basic_network_example():
|
|
"""Basic example of agent network with semantic routing."""
|
|
print("=== Basic Network Example ===\n")
|
|
|
|
# Create network with semantic router
|
|
network = AgentNetwork(
|
|
config=NetworkConfig(name="Research Network"),
|
|
router=SemanticRouter(),
|
|
)
|
|
|
|
# Add agents with capabilities
|
|
network.add_agent(
|
|
research_agent,
|
|
capabilities=["research", "analysis", "data", "information"],
|
|
)
|
|
network.add_agent(
|
|
writer_agent,
|
|
capabilities=["writing", "content", "editing", "documentation"],
|
|
)
|
|
network.add_agent(
|
|
coder_agent,
|
|
capabilities=["coding", "programming", "debugging", "implementation"],
|
|
)
|
|
|
|
# Test routing
|
|
queries = [
|
|
"Research the latest trends in AI",
|
|
"Write a blog post about climate change",
|
|
"Debug this Python function that's not working",
|
|
]
|
|
|
|
for query in queries:
|
|
print(f"Query: {query}")
|
|
result = await network.run(input=query, max_turns=1)
|
|
print(f"Response: {result.final_output}\n")
|
|
|
|
|
|
async def advanced_network_with_rules():
|
|
"""Advanced example with rule-based routing and state sharing."""
|
|
print("\n=== Advanced Network with Rules ===\n")
|
|
|
|
# Create router with rules
|
|
router = RuleBasedRouter()
|
|
router.add_rule(r"research|analyze|find", "research_agent", priority=10)
|
|
router.add_rule(r"write|draft|compose", "writer_agent", priority=10)
|
|
router.add_rule(r"code|program|debug|implement", "coder_agent", priority=10)
|
|
|
|
# Create network with state store
|
|
state_store = InMemoryStateStore()
|
|
network = AgentNetwork(
|
|
config=NetworkConfig(
|
|
name="Advanced Network",
|
|
state_store=state_store,
|
|
),
|
|
router=router,
|
|
)
|
|
|
|
# Add agents
|
|
network.add_agent(research_agent)
|
|
network.add_agent(writer_agent)
|
|
network.add_agent(coder_agent)
|
|
|
|
# Complex task that requires multiple agents
|
|
print("Task: Research AI trends and write a technical blog post\n")
|
|
|
|
# Step 1: Research
|
|
result1 = await network.run(
|
|
input="Research the top 3 AI trends in 2024 and save them to memory",
|
|
starting_agent="research_agent",
|
|
)
|
|
print(f"Research complete: {result1.final_output}\n")
|
|
|
|
# Step 2: Write based on research
|
|
result2 = await network.run(
|
|
input="Recall the AI trends from memory and write a technical blog post about them",
|
|
starting_agent="writer_agent",
|
|
)
|
|
print(f"Blog post: {result2.final_output}\n")
|
|
|
|
|
|
async def orchestrated_workflow_example():
|
|
"""Example using the orchestrator for complex workflows."""
|
|
print("\n=== Orchestrated Workflow Example ===\n")
|
|
|
|
# Create orchestrator
|
|
orchestrator = Orchestrator(
|
|
config=OrchestrationConfig(
|
|
name="AI Project Orchestrator",
|
|
enable_ui_streaming=True,
|
|
),
|
|
)
|
|
|
|
# Register agents
|
|
orchestrator.register_agent(coordinator_agent, capabilities=["coordination"])
|
|
orchestrator.register_agent(research_agent, capabilities=["research"])
|
|
orchestrator.register_agent(writer_agent, capabilities=["writing"])
|
|
orchestrator.register_agent(coder_agent, capabilities=["coding"])
|
|
|
|
# Create a workflow
|
|
workflow = orchestrator.create_workflow_from_agents(
|
|
name="AI Article Workflow",
|
|
agents=["coordinator_agent"],
|
|
)
|
|
|
|
# Register and execute workflow
|
|
orchestrator.register_workflow(workflow)
|
|
|
|
result = await orchestrator.execute_workflow(
|
|
workflow_id=workflow.id,
|
|
input="""Create a comprehensive guide about implementing
|
|
a simple neural network in Python. Include:
|
|
1. Research on neural network basics
|
|
2. Code implementation
|
|
3. Well-written explanation
|
|
""",
|
|
)
|
|
|
|
print(f"Workflow completed: {result.success}")
|
|
print(f"Duration: {result.duration:.2f}s")
|
|
print(f"Output: {result.output}")
|
|
|
|
|
|
async def memory_system_example():
|
|
"""Example demonstrating the memory system."""
|
|
print("\n=== Memory System Example ===\n")
|
|
|
|
# Create memory system
|
|
memory = Memory(max_entries=100)
|
|
|
|
# Create memory-enabled agent
|
|
memory_agent = Agent(
|
|
name="memory_agent",
|
|
instructions="""You are an agent with long-term memory.
|
|
You can remember facts, conversations, and learn from experience.
|
|
Always check your memory before responding.""",
|
|
)
|
|
|
|
# Wrap with memory capabilities
|
|
memory_enabled = memory.create_agent_wrapper(memory_agent)
|
|
|
|
# Store some memories
|
|
await memory.remember(
|
|
"The user's favorite color is blue",
|
|
type=MemoryType.FACT,
|
|
agent_name="memory_agent",
|
|
)
|
|
|
|
await memory.remember(
|
|
"The user is interested in machine learning",
|
|
type=MemoryType.FACT,
|
|
agent_name="memory_agent",
|
|
)
|
|
|
|
# Test memory recall
|
|
result = await Runner.run(
|
|
starting_agent=memory_enabled,
|
|
input="What do you remember about me?",
|
|
)
|
|
|
|
print(f"Memory recall: {result.final_output}")
|
|
|
|
# Generate reflection
|
|
reflection = await memory.reflect(memory_agent)
|
|
print(f"\nReflection: {reflection.content}")
|
|
|
|
|
|
async def parallel_network_example():
|
|
"""Example of parallel task execution in a network."""
|
|
print("\n=== Parallel Network Execution ===\n")
|
|
|
|
# Create network
|
|
network = AgentNetwork(
|
|
config=NetworkConfig(
|
|
name="Parallel Network",
|
|
enable_parallel_execution=True,
|
|
max_parallel_agents=3,
|
|
),
|
|
)
|
|
|
|
# Add agents
|
|
network.add_agent(research_agent)
|
|
network.add_agent(writer_agent)
|
|
network.add_agent(coder_agent)
|
|
|
|
# Define parallel tasks
|
|
tasks = [
|
|
{"input": "Research quantum computing basics", "agent": "research_agent"},
|
|
{"input": "Write a haiku about technology", "agent": "writer_agent"},
|
|
{"input": "Implement a fibonacci function", "agent": "coder_agent"},
|
|
]
|
|
|
|
print("Running 3 tasks in parallel...\n")
|
|
|
|
start_time = asyncio.get_event_loop().time()
|
|
results = await network.run_parallel(tasks)
|
|
duration = asyncio.get_event_loop().time() - start_time
|
|
|
|
for i, result in enumerate(results):
|
|
print(f"Task {i+1} result: {result.final_output[:100]}...")
|
|
|
|
print(f"\nTotal execution time: {duration:.2f}s")
|
|
|
|
|
|
async def main():
|
|
"""Run all examples."""
|
|
await basic_network_example()
|
|
await advanced_network_with_rules()
|
|
await orchestrated_workflow_example()
|
|
await memory_system_example()
|
|
await parallel_network_example()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|