Spaces:
Sleeping
Sleeping
| import os | |
| from typing import List | |
| from pydantic import BaseModel, Field | |
| from swarm_models import OpenAIFunctionCaller, OpenAIChat | |
| from swarms.structs.agent import Agent | |
| from swarms.structs.swarm_router import SwarmRouter | |
| from swarms.utils.loguru_logger import initialize_logger | |
| from swarms.structs.agents_available import showcase_available_agents | |
| logger = initialize_logger(log_folder="auto_swarm_builder") | |
| class AgentConfig(BaseModel): | |
| """Configuration for an individual agent in a swarm""" | |
| name: str = Field( | |
| description="The name of the agent", example="Research-Agent" | |
| ) | |
| description: str = Field( | |
| description="A description of the agent's purpose and capabilities", | |
| example="Agent responsible for researching and gathering information", | |
| ) | |
| system_prompt: str = Field( | |
| description="The system prompt that defines the agent's behavior", | |
| example="You are a research agent. Your role is to gather and analyze information...", | |
| ) | |
| # max_loops: int = Field( | |
| # description="Maximum number of reasoning loops the agent can perform", | |
| # example=3, | |
| # ) | |
| class SwarmConfig(BaseModel): | |
| """Configuration for a swarm of cooperative agents""" | |
| name: str = Field( | |
| description="The name of the swarm", | |
| example="Research-Writing-Swarm", | |
| ) | |
| description: str = Field( | |
| description="The description of the swarm's purpose and capabilities", | |
| example="A swarm of agents that work together to research topics and write articles", | |
| ) | |
| agents: List[AgentConfig] = Field( | |
| description="The list of agents that make up the swarm", | |
| example=[ | |
| AgentConfig( | |
| name="Research-Agent", | |
| description="Gathers information", | |
| system_prompt="You are a research agent...", | |
| ), | |
| AgentConfig( | |
| name="Writing-Agent", | |
| description="Writes content", | |
| system_prompt="You are a writing agent...", | |
| ), | |
| ], | |
| ) | |
| max_loops: int = Field( | |
| description="The maximum number of loops to run the swarm", | |
| example=1, | |
| ) | |
| # Get the OpenAI API key from the environment variable | |
| api_key = os.getenv("OPENAI_API_KEY") | |
| # Create an instance of the OpenAIChat class | |
| model = OpenAIChat( | |
| openai_api_key=api_key, model_name="gpt-4o-mini", temperature=0.1 | |
| ) | |
| BOSS_SYSTEM_PROMPT = """ | |
| Manage a swarm of worker agents to efficiently serve the user by deciding whether to create new agents or delegate tasks. Ensure operations are efficient and effective. | |
| ### Instructions: | |
| 1. **Task Assignment**: | |
| - Analyze available worker agents when a task is presented. | |
| - Delegate tasks to existing agents with clear, direct, and actionable instructions if an appropriate agent is available. | |
| - If no suitable agent exists, create a new agent with a fitting system prompt to handle the task. | |
| 2. **Agent Creation**: | |
| - Name agents according to the task they are intended to perform (e.g., "Twitter Marketing Agent"). | |
| - Provide each new agent with a concise and clear system prompt that includes its role, objectives, and any tools it can utilize. | |
| 3. **Efficiency**: | |
| - Minimize redundancy and maximize task completion speed. | |
| - Avoid unnecessary agent creation if an existing agent can fulfill the task. | |
| 4. **Communication**: | |
| - Be explicit in task delegation instructions to avoid ambiguity and ensure effective task execution. | |
| - Require agents to report back on task completion or encountered issues. | |
| 5. **Reasoning and Decisions**: | |
| - Offer brief reasoning when selecting or creating agents to maintain transparency. | |
| - Avoid using an agent if unnecessary, with a clear explanation if no agents are suitable for a task. | |
| # Output Format | |
| Present your plan in clear, bullet-point format or short concise paragraphs, outlining task assignment, agent creation, efficiency strategies, and communication protocols. | |
| # Notes | |
| - Preserve transparency by always providing reasoning for task-agent assignments and creation. | |
| - Ensure instructions to agents are unambiguous to minimize error. | |
| """ | |
| class AutoSwarmBuilder: | |
| """A class that automatically builds and manages swarms of AI agents. | |
| This class handles the creation, coordination and execution of multiple AI agents working | |
| together as a swarm to accomplish complex tasks. It uses a boss agent to delegate work | |
| and create new specialized agents as needed. | |
| Args: | |
| name (str): The name of the swarm | |
| description (str): A description of the swarm's purpose | |
| verbose (bool, optional): Whether to output detailed logs. Defaults to True. | |
| max_loops (int, optional): Maximum number of execution loops. Defaults to 1. | |
| """ | |
| def __init__( | |
| self, | |
| name: str = None, | |
| description: str = None, | |
| verbose: bool = True, | |
| max_loops: int = 1, | |
| ): | |
| self.name = name | |
| self.description = description | |
| self.verbose = verbose | |
| self.max_loops = max_loops | |
| self.agents_pool = [] | |
| logger.info( | |
| f"Initialized AutoSwarmBuilder: {name} {description}" | |
| ) | |
| # @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) | |
| def run(self, task: str, image_url: str = None, *args, **kwargs): | |
| """Run the swarm on a given task. | |
| Args: | |
| task (str): The task to be accomplished | |
| image_url (str, optional): URL of an image input if needed. Defaults to None. | |
| *args: Variable length argument list | |
| **kwargs: Arbitrary keyword arguments | |
| Returns: | |
| The output from the swarm's execution | |
| """ | |
| logger.info(f"Running swarm on task: {task}") | |
| agents = self._create_agents(task, image_url, *args, **kwargs) | |
| logger.info(f"Agents created {len(agents)}") | |
| logger.info("Routing task through swarm") | |
| output = self.swarm_router(agents, task, image_url) | |
| logger.info(f"Swarm execution complete with output: {output}") | |
| return output | |
| # @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) | |
| def _create_agents(self, task: str, *args, **kwargs): | |
| """Create the necessary agents for a task. | |
| Args: | |
| task (str): The task to create agents for | |
| *args: Variable length argument list | |
| **kwargs: Arbitrary keyword arguments | |
| Returns: | |
| list: List of created agents | |
| """ | |
| logger.info("Creating agents for task") | |
| model = OpenAIFunctionCaller( | |
| system_prompt=BOSS_SYSTEM_PROMPT, | |
| api_key=os.getenv("OPENAI_API_KEY"), | |
| temperature=0.1, | |
| base_model=SwarmConfig, | |
| ) | |
| agents_dictionary = model.run(task) | |
| logger.info(f"Agents dictionary: {agents_dictionary}") | |
| # Convert dictionary to SwarmConfig if needed | |
| if isinstance(agents_dictionary, dict): | |
| agents_dictionary = SwarmConfig(**agents_dictionary) | |
| # Set swarm config | |
| self.name = agents_dictionary.name | |
| self.description = agents_dictionary.description | |
| self.max_loops = getattr( | |
| agents_dictionary | |
| ) # Default to 1 if not set | |
| logger.info( | |
| f"Swarm config: {self.name}, {self.description}, {self.max_loops}" | |
| ) | |
| # Create agents from config | |
| agents = [] | |
| for agent_config in agents_dictionary.agents: | |
| # Convert dict to AgentConfig if needed | |
| if isinstance(agent_config, dict): | |
| agent_config = AgentConfig(**agent_config) | |
| agent = self.build_agent( | |
| agent_name=agent_config.name, | |
| agent_description=agent_config.description, | |
| agent_system_prompt=agent_config.system_prompt, | |
| ) | |
| agents.append(agent) | |
| # Showcasing available agents | |
| agents_available = showcase_available_agents( | |
| name=self.name, | |
| description=self.description, | |
| agents=agents, | |
| ) | |
| for agent in agents: | |
| agent.system_prompt += "\n" + agents_available | |
| return agents | |
| def build_agent( | |
| self, | |
| agent_name: str, | |
| agent_description: str, | |
| agent_system_prompt: str, | |
| max_loops: int = 1, | |
| ): | |
| """Build a single agent with the given specifications. | |
| Args: | |
| agent_name (str): Name of the agent | |
| agent_description (str): Description of the agent's purpose | |
| agent_system_prompt (str): The system prompt for the agent | |
| Returns: | |
| Agent: The constructed agent instance | |
| """ | |
| logger.info(f"Building agent: {agent_name}") | |
| agent = Agent( | |
| agent_name=agent_name, | |
| description=agent_description, | |
| system_prompt=agent_system_prompt, | |
| llm=model, | |
| max_loops=max_loops, | |
| autosave=True, | |
| dashboard=False, | |
| verbose=True, | |
| dynamic_temperature_enabled=True, | |
| saved_state_path=f"{agent_name}.json", | |
| user_name="swarms_corp", | |
| retry_attempts=1, | |
| context_length=200000, | |
| return_step_meta=False, | |
| output_type="str", # "json", "dict", "csv" OR "string" soon "yaml" and | |
| streaming_on=False, | |
| auto_generate_prompt=True, | |
| ) | |
| return agent | |
| # @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) | |
| def swarm_router( | |
| self, | |
| agents: List[Agent], | |
| task: str, | |
| image_url: str = None, | |
| *args, | |
| **kwargs, | |
| ): | |
| """Route tasks between agents in the swarm. | |
| Args: | |
| agents (List[Agent]): List of available agents | |
| task (str): The task to route | |
| image_url (str, optional): URL of an image input if needed. Defaults to None. | |
| *args: Variable length argument list | |
| **kwargs: Arbitrary keyword arguments | |
| Returns: | |
| The output from the routed task execution | |
| """ | |
| logger.info("Routing task through swarm") | |
| swarm_router_instance = SwarmRouter( | |
| name=self.name, | |
| description=self.description, | |
| agents=agents, | |
| swarm_type="auto", | |
| max_loops=1, | |
| ) | |
| return swarm_router_instance.run( | |
| self.name + " " + self.description + " " + task, | |
| ) | |
| example = AutoSwarmBuilder( | |
| name="ChipDesign-Swarm", | |
| description="A swarm of specialized AI agents collaborating on chip architecture, logic design, verification, and optimization to create novel semiconductor designs", | |
| max_loops=1, | |
| ) | |
| print( | |
| example.run( | |
| "Design a new AI accelerator chip optimized for transformer model inference. Consider the following aspects: 1) Overall chip architecture and block diagram 2) Memory hierarchy and interconnects 3) Processing elements and data flow 4) Power and thermal considerations 5) Physical layout recommendations -> " | |
| ) | |
| ) | |