Some tasks are cleaner to solve with several specialized agents working together than one agent trying to do everything - the same reasoning behind splitting a program into focused functions rather than one giant one.
Why split into multiple agents at all
A single agent juggling research, writing, and fact-checking in one prompt tends to do all three averagely. Three focused agents - a researcher, a writer, and a reviewer - each with a narrow, clear job, generally produce more reliable results, in the same way a specialized function is easier to get right than one that tries to do everything.
The orchestrator pattern
One common structure: a coordinating "orchestrator" agent breaks a task down and routes each sub-task to the right specialized agent, then combines their results:
# Conceptual shape:
def orchestrate(task):
plan = orchestrator.break_down(task)
results = []
for step in plan:
specialist = choose_agent(step)
results.append(specialist.run(step))
return orchestrator.combine(results)
Sequential vs parallel coordination
Some sub-tasks depend on each other's output and must run in order (research before writing). Others are independent and can run in parallel (checking three different sources at once) - recognizing which is which is most of the design work in a multi-agent system.
The real cost: more moving parts, more places to fail
Every additional agent is another place a task can go wrong, and coordination between agents adds real complexity and latency. Reach for multiple agents only when a task genuinely needs distinct areas of expertise - not by default, since a single well-designed agent handles most real tasks just fine.