From 6741c8f9810e3d7ce7a6bcdda9d1ff9ae211a6b6 Mon Sep 17 00:00:00 2001 From: Aksh Parekh Date: Fri, 14 Nov 2025 23:34:25 -0800 Subject: [PATCH] [BUG-FIX] Swarm Router Bug Fix --- docs/quickstart.md | 8 +++--- docs/swarms/examples/swarm_router.md | 39 +++++++++++++++++++++------- docs/swarms/structs/index.md | 8 +++--- swarms/structs/swarm_router.py | 34 ++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 17 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 1780748a..e04d9d57 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -290,14 +290,14 @@ task = "Write a short story about a robot who discovers music." # --- Example 1: SequentialWorkflow --- # Agents run one after another in a chain: Writer -> Editor -> Reviewer. print("Running a Sequential Workflow...") -sequential_router = SwarmRouter(swarm_type=SwarmType.SequentialWorkflow, agents=agents) +sequential_router = SwarmRouter(swarm_type="SequentialWorkflow", agents=agents) sequential_output = sequential_router.run(task) print(f"Final Sequential Output:\n{sequential_output}\n") # --- Example 2: ConcurrentWorkflow --- # All agents receive the same initial task and run at the same time. print("Running a Concurrent Workflow...") -concurrent_router = SwarmRouter(swarm_type=SwarmType.ConcurrentWorkflow, agents=agents) +concurrent_router = SwarmRouter(swarm_type="ConcurrentWorkflow", agents=agents) concurrent_outputs = concurrent_router.run(task) # This returns a dictionary of each agent's output for agent_name, output in concurrent_outputs.items(): @@ -312,9 +312,9 @@ aggregator = Agent( model_name="gpt-4o-mini" ) moa_router = SwarmRouter( - swarm_type=SwarmType.MixtureOfAgents, + swarm_type="MixtureOfAgents", agents=agents, - aggregator_agent=aggregator, # MoA requires an aggregator + aggregator_agent=aggregator, ) aggregated_output = moa_router.run(task) print(f"Final Aggregated Output:\n{aggregated_output}\n") diff --git a/docs/swarms/examples/swarm_router.md b/docs/swarms/examples/swarm_router.md index 7caa875c..b404bc57 100644 --- a/docs/swarms/examples/swarm_router.md +++ b/docs/swarms/examples/swarm_router.md @@ -29,7 +29,7 @@ GROQ_API_KEY="" ```python from swarms import Agent -from swarms.structs.swarm_router import SwarmRouter, SwarmType +from swarms.structs.swarm_router import SwarmRouter # Initialize specialized agents data_extractor_agent = Agent( @@ -61,7 +61,7 @@ sequential_router = SwarmRouter( name="SequentialRouter", description="Process tasks in sequence", agents=[data_extractor_agent, summarizer_agent, financial_analyst_agent], - swarm_type=SwarmType.SequentialWorkflow, + swarm_type="SequentialWorkflow", max_loops=1 ) @@ -76,7 +76,7 @@ concurrent_router = SwarmRouter( name="ConcurrentRouter", description="Process tasks concurrently", agents=[data_extractor_agent, summarizer_agent, financial_analyst_agent], - swarm_type=SwarmType.ConcurrentWorkflow, + swarm_type="ConcurrentWorkflow", max_loops=1 ) @@ -91,8 +91,8 @@ rearrange_router = SwarmRouter( name="RearrangeRouter", description="Dynamically rearrange agents for optimal task processing", agents=[data_extractor_agent, summarizer_agent, financial_analyst_agent], - swarm_type=SwarmType.AgentRearrange, - flow=f"{data_extractor_agent.agent_name} -> {summarizer_agent.agent_name} -> {financial_analyst_agent.agent_name}", + swarm_type="AgentRearrange", + rearrange_flow=f"{data_extractor_agent.agent_name} -> {summarizer_agent.agent_name} -> {financial_analyst_agent.agent_name}", max_loops=1 ) @@ -107,7 +107,7 @@ mixture_router = SwarmRouter( name="MixtureRouter", description="Combine multiple expert agents", agents=[data_extractor_agent, summarizer_agent, financial_analyst_agent], - swarm_type=SwarmType.MixtureOfAgents, + swarm_type="MixtureOfAgents", max_loops=1 ) @@ -137,7 +137,7 @@ router = SwarmRouter( name="CustomRouter", description="Custom router configuration", agents=[data_extractor_agent, summarizer_agent, financial_analyst_agent], - swarm_type=SwarmType.SequentialWorkflow, + swarm_type="SequentialWorkflow", max_loops=3, autosave=True, verbose=True, @@ -145,6 +145,27 @@ router = SwarmRouter( ) ``` +# SwarmType Reference + +## Valid SwarmType Values + +| Value | Description | +|-------|-------------| +| `"SequentialWorkflow"` | Execute agents in sequence | +| `"ConcurrentWorkflow"` | Execute agents concurrently | +| `"AgentRearrange"` | Dynamically rearrange agent execution order | +| `"MixtureOfAgents"` | Combine outputs from multiple agents | +| `"GroupChat"` | Enable group chat between agents | +| `"MultiAgentRouter"` | Route tasks to appropriate agents | +| `"AutoSwarmBuilder"` | Automatically build swarm configuration | +| `"HiearchicalSwarm"` | Hierarchical agent organization | +| `"MajorityVoting"` | Use majority voting for decisions | +| `"MALT"` | Multi-Agent Learning and Training | +| `"CouncilAsAJudge"` | Council-based evaluation system | +| `"InteractiveGroupChat"` | Interactive group chat with agents | +| `"HeavySwarm"` | Heavy swarm for complex tasks | +| `"auto"` | Automatically select swarm type | + # Best Practices ## Choose the appropriate swarm type based on your task requirements: @@ -187,7 +208,7 @@ Here's a complete example showing how to use SwarmRouter in a real-world scenari ```python import os from swarms import Agent -from swarms.structs.swarm_router import SwarmRouter, SwarmType +from swarms.structs.swarm_router import SwarmRouter # Initialize specialized agents research_agent = Agent( @@ -216,7 +237,7 @@ router = SwarmRouter( name="ResearchAnalysisRouter", description="Process research and analysis tasks", agents=[research_agent, analysis_agent, summary_agent], - swarm_type=SwarmType.SequentialWorkflow, + swarm_type="SequentialWorkflow", max_loops=1, verbose=True ) diff --git a/docs/swarms/structs/index.md b/docs/swarms/structs/index.md index f556ae3f..5604e372 100644 --- a/docs/swarms/structs/index.md +++ b/docs/swarms/structs/index.md @@ -186,14 +186,14 @@ task = "Write a short story about a robot who discovers music." # --- Example 1: SequentialWorkflow --- # Agents run one after another in a chain: Writer -> Editor -> Reviewer. print("Running a Sequential Workflow...") -sequential_router = SwarmRouter(swarm_type=SwarmType.SequentialWorkflow, agents=agents) +sequential_router = SwarmRouter(swarm_type="SequentialWorkflow", agents=agents) sequential_output = sequential_router.run(task) print(f"Final Sequential Output:\n{sequential_output}\n") # --- Example 2: ConcurrentWorkflow --- # All agents receive the same initial task and run at the same time. print("Running a Concurrent Workflow...") -concurrent_router = SwarmRouter(swarm_type=SwarmType.ConcurrentWorkflow, agents=agents) +concurrent_router = SwarmRouter(swarm_type="ConcurrentWorkflow", agents=agents) concurrent_outputs = concurrent_router.run(task) # This returns a dictionary of each agent's output for agent_name, output in concurrent_outputs.items(): @@ -208,9 +208,9 @@ aggregator = Agent( model_name="gpt-4o-mini" ) moa_router = SwarmRouter( - swarm_type=SwarmType.MixtureOfAgents, + swarm_type="MixtureOfAgents", agents=agents, - aggregator_agent=aggregator, # MoA requires an aggregator + aggregator_agent=aggregator, ) aggregated_output = moa_router.run(task) print(f"Final Aggregated Output:\n{aggregated_output}\n") diff --git a/swarms/structs/swarm_router.py b/swarms/structs/swarm_router.py index b5f3fd2c..15b1500d 100644 --- a/swarms/structs/swarm_router.py +++ b/swarms/structs/swarm_router.py @@ -272,6 +272,40 @@ class SwarmRouter: "SwarmRouter: Swarm type cannot be 'none'. Check the docs for all the swarm types available. https://docs.swarms.world/en/latest/swarms/structs/swarm_router/" ) + # Validate swarm type is a valid string + valid_swarm_types = [ + "AgentRearrange", + "MixtureOfAgents", + "SequentialWorkflow", + "ConcurrentWorkflow", + "GroupChat", + "MultiAgentRouter", + "AutoSwarmBuilder", + "HiearchicalSwarm", + "auto", + "MajorityVoting", + "MALT", + "CouncilAsAJudge", + "InteractiveGroupChat", + "HeavySwarm", + "BatchedGridWorkflow", + ] + + if not isinstance(self.swarm_type, str): + raise SwarmRouterConfigError( + f"SwarmRouter: swarm_type must be a string, not {type(self.swarm_type).__name__}. " + f"Valid types are: {', '.join(valid_swarm_types)}. " + "Use swarm_type='SequentialWorkflow' (string), NOT SwarmType.SequentialWorkflow. " + "See https://docs.swarms.world/en/latest/swarms/structs/swarm_router/" + ) + + if self.swarm_type not in valid_swarm_types: + raise SwarmRouterConfigError( + f"SwarmRouter: Invalid swarm_type '{self.swarm_type}'. " + f"Valid types are: {', '.join(valid_swarm_types)}. " + "See https://docs.swarms.world/en/latest/swarms/structs/swarm_router/" + ) + if ( self.swarm_type != "HeavySwarm" and self.agents is None