multi-agent / multi_agent_swarm.py
AgentisLabs's picture
Upload folder using huggingface_hub
3790276 verified
raw
history blame
7.4 kB
from swarm import Swarm, Agent
from swarm.repl import run_demo_loop
import os
from dotenv import load_dotenv
from openai import OpenAI
from rich.console import Console
from rich.panel import Panel
from rich.text import Text
from exa_py import Exa
import json
load_dotenv() # This loads the variables from .env
# Initialize the OpenAI client
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# Initialize the Swarm client with the OpenAI client
client = Swarm(client=openai_client)
# Initialize the Exa client
exa_client = Exa(api_key=os.getenv("EXA_API_KEY"))
def transfer_to_executor(enhanced_prompt):
print(f"\nEnhancer Agent output:\n{enhanced_prompt}")
return executor_agent, {"prompt": enhanced_prompt}
def transfer_to_planner(executed_response):
print(f"\nExecutor Agent output:\n{executed_response}")
return planner_agent, {"response": executed_response}
def transfer_to_checker(executed_response):
print(f"\nExecutor Agent output:\n{executed_response}")
return checker_agent, {"response": executed_response}
def transfer_to_enhancer(checked_response):
print(f"\nChecker Agent output:\n{checked_response}")
return enhancer_agent, {"response": checked_response}
def search_internet(query, num_results=5):
results = exa_client.search(query, num_results=num_results)
formatted_results = []
for result in results:
formatted_results.append(f"Title: {result.title}\nURL: {result.url}\nSnippet: {result.snippet}\n")
return "\n".join(formatted_results)
def transfer_to_internet_search(query):
print(f"\nTransferring to Internet Search Agent with query:\n{query}")
return internet_search_agent, {"query": query}
enhancer_agent = Agent(
name="Enhancer",
instructions="""You are an agent that enhances user prompts. Your task is to:
1. Reword the user's input to be more clear, specific, and thorough.
2. Determine if the query requires internet search or not.
3. If internet search is required, call the transfer_to_internet_search function with the enhanced query.
4. If not, return the enhanced prompt with the following instructions prepended:
[Instructions for the next agent:
1. Begin by enclosing all thoughts within <thinking> tags, exploring multiple angles and approaches.
2. Break down the solution into clear steps within <step> tags.
3. Use <count> tags after each step to show the remaining budget. Stop when reaching 0.
4. Continuously adjust your reasoning based on intermediate results and reflections.
5. Regularly evaluate progress using <reflection> tags.
6. Synthesize the final answer within <answer> tags, providing a clear, concise summary.
7. Conclude with a final reflection on the overall solution.]
Ensure these instructions are clearly separated from the enhanced user prompt.""",
functions=[transfer_to_executor, transfer_to_internet_search],
)
clarifier_agent = Agent(
name="Clarifier",
instructions="You are an agent that clarifies and enhances user prompts. Reword the user's input to be more clear, specific, and thorough. Ask for additional information if needed.",
functions=[transfer_to_executor],
)
executor_agent = Agent(
name="Executor",
instructions="You are an agent that executes enhanced prompts. Provide a detailed, well-thought-out response to the enhanced question or request.",
functions=[transfer_to_planner],
)
checker_agent = Agent(
name="Checker",
instructions="You are an agent that checks responses for correctness. If correct, approve it. If not, edit and improve it. Always provide your reasoning.",
functions=[transfer_to_enhancer],
)
planner_agent = Agent(
name="Planner",
instructions="You are an agent that creates action plans based on the user's request and the executor's response. Provide a step-by-step plan with resources and instructions for the user to follow up on their request.",
functions=[],
)
internet_search_agent = Agent(
name="Internet Search",
instructions="You are an agent that searches the internet for relevant information. Use the search_internet function to find information, then summarize and present the findings. Always include the source URLs in your response.",
functions=[search_internet, transfer_to_executor],
)
if __name__ == "__main__":
console = Console()
console.print(Panel("Starting Multi-Agent Swarm. Type 'exit' to quit.", style="bold green"))
while True:
user_input = console.input("\n[bold cyan]User:[/bold cyan] ")
if user_input.lower() == 'exit':
break
console.print(Panel(f"[bold cyan]User input:[/bold cyan]\n{user_input}", border_style="cyan"))
# Enhancer Agent
enhanced_response = client.run(enhancer_agent, messages=[{"role": "user", "content": user_input}])
if enhanced_response.messages:
last_message = enhanced_response.messages[-1]
function_call = last_message.get("function_call")
if function_call and isinstance(function_call, dict) and function_call.get("name") == "transfer_to_internet_search":
# Internet Search Agent
search_query = function_call.get("arguments", {}).get("query", user_input)
search_response = client.run(internet_search_agent, messages=[{"role": "user", "content": search_query}])
search_results = search_response.messages[-1]["content"] if search_response.messages else "No search results."
console.print(Panel(f"[bold blue]Internet Search Results:[/bold blue]\n{search_results}", border_style="blue"))
# Pass search results to Executor Agent
executed_response = client.run(executor_agent, messages=[
{"role": "user", "content": user_input},
{"role": "assistant", "content": f"Based on the internet search, here are the results:\n\n{search_results}\n\nPlease provide a detailed response to the user's query using this information."}
])
else:
enhanced_prompt = last_message.get("content", user_input)
console.print(Panel(f"[bold green]Enhanced Prompt:[/bold green]\n{enhanced_prompt}", border_style="green"))
# Executor Agent
executed_response = client.run(executor_agent, messages=[{"role": "user", "content": enhanced_prompt}])
else:
console.print(Panel("[bold red]Error: Enhancer Agent returned no response.[/bold red]", border_style="red"))
continue
executed_output = executed_response.messages[-1]["content"]
console.print(Panel(f"[bold yellow]Executor Response:[/bold yellow]\n{executed_output}", border_style="yellow"))
# Planner Agent
plan_response = client.run(planner_agent, messages=[
{"role": "user", "content": user_input},
{"role": "assistant", "content": executed_output},
{"role": "user", "content": "Based on this information, create an action plan with resources and instructions."}
])
action_plan = plan_response.messages[-1]["content"]
console.print(Panel(f"[bold magenta]Action Plan:[/bold magenta]\n{action_plan}", border_style="magenta"))
console.print("\n[bold blue]Process Complete[/bold blue]")