[{"data":1,"prerenderedAt":1803},["ShallowReactive",2],{"article-multi-agent-frameworks-comparison":3},{"id":4,"title":5,"body":6,"date":1786,"description":1787,"extension":1788,"meta":1789,"navigation":326,"path":1790,"readingTime":1791,"seo":1792,"stem":1793,"tags":1794,"__hash__":1802},"articles\u002Fblog\u002Fmulti-agent-frameworks-comparison.en.md","Multi-Agent Frameworks: Who Orchestrates Whom",{"type":7,"value":8,"toc":1761},"minimark",[9,14,18,21,24,28,153,156,160,163,168,171,178,184,190,194,197,205,208,212,215,218,222,225,228,231,235,238,241,245,248,251,255,258,262,266,269,272,275,278,281,514,525,531,534,537,540,809,812,815,820,823,826,829,1189,1192,1195,1198,1203,1205,1208,1211,1214,1219,1222,1225,1228,1231,1234,1239,1242,1245,1248,1252,1255,1258,1261,1264,1490,1493,1497,1698,1702,1708,1714,1720,1726,1732,1738,1742,1745,1748,1751,1754,1757],[10,11,13],"h2",{"id":12},"why-multi-agent-systems-matter","Why Multi-Agent Systems Matter",[15,16,17],"p",{},"Imagine assigning one person to write an article, conduct research, create illustrations, and edit the text. They'll get it done — slowly, with constant context switching, but they'll manage. Now imagine assigning each of those four tasks to a dedicated specialist, working in parallel. The result will be faster and likely higher quality.",[15,19,20],{},"Multi-agent AI systems operate on the same principle. Instead of a single LLM agent doing everything, you deploy multiple agents with distinct roles. One searches for information, another writes code, a third validates the output. The framework handles orchestration — who does what, how they communicate, and what happens when something goes wrong.",[15,22,23],{},"In 2025–2026, this idea moved from experimental prototypes into production. There are dozens of frameworks on GitHub, each with its own philosophy. I selected six that are actually used in practice and dissected them thoroughly.",[10,25,27],{"id":26},"what-were-comparing","What We're Comparing",[29,30,31,53],"table",{},[32,33,34],"thead",{},[35,36,37,41,44,47,50],"tr",{},[38,39,40],"th",{},"Framework",[38,42,43],{},"Author",[38,45,46],{},"Stars",[38,48,49],{},"License",[38,51,52],{},"Latest Release",[54,55,56,74,91,107,122,137],"tbody",{},[35,57,58,62,65,68,71],{},[59,60,61],"td",{},"Hermes Agent",[59,63,64],{},"NousResearch",[59,66,67],{},"164k",[59,69,70],{},"Apache 2.0",[59,72,73],{},"2026-05",[35,75,76,79,82,85,88],{},[59,77,78],{},"CrewAI",[59,80,81],{},"crewAI Inc",[59,83,84],{},"52k",[59,86,87],{},"MIT",[59,89,90],{},"2026-05-18",[35,92,93,96,99,102,104],{},[59,94,95],{},"LangGraph",[59,97,98],{},"LangChain",[59,100,101],{},"33k",[59,103,87],{},[59,105,106],{},"2026-05-22",[35,108,109,112,115,118,120],{},[59,110,111],{},"CAMEL-AI",[59,113,114],{},"camel-ai",[59,116,117],{},"17k",[59,119,70],{},[59,121,73],{},[35,123,124,127,130,133,135],{},[59,125,126],{},"AG2",[59,128,129],{},"ag2ai (ex-AutoGen)",[59,131,132],{},"4.6k",[59,134,70],{},[59,136,73],{},[35,138,139,142,145,148,150],{},[59,140,141],{},"OpenPlanter",[59,143,144],{},"ShinMegamiBoson",[59,146,147],{},"1.6k",[59,149,87],{},[59,151,152],{},"2026-03",[15,154,155],{},"All are Python-based. All are open source. But that's where the similarities end.",[10,157,159],{"id":158},"key-features-and-what-they-mean","Key Features (And What They Mean)",[15,161,162],{},"Before diving into comparisons, let's clarify the terminology. The same words appear across framework docs and comparison tables, but they often mean very different things.",[164,165,167],"h3",{"id":166},"orchestration-single-multi-parallel","Orchestration (Single \u002F Multi \u002F Parallel)",[15,169,170],{},"This is the heart of any multi-agent framework — how agents coordinate their work.",[15,172,173,177],{},[174,175,176],"strong",{},"Single"," — one agent, one task. Essentially a standard LLM call. OpenPlanter works exactly this way: you run a chain, but there are no truly parallel agents inside it.",[15,179,180,183],{},[174,181,182],{},"Multi"," — multiple agents, but they take turns or follow a leader-follower pattern. AG2, CrewAI, and CAMEL-AI use this approach. One agent can delegate a task to another, but they don't pull simultaneously.",[15,185,186,189],{},[174,187,188],{},"Parallel"," — agents genuinely work in parallel, with checkpoints and conditional routing. LangGraph leads here: its DAG (Directed Acyclic Graph) allows branching and merging execution flows. Hermes Agent also supports multi-agent coordination via a Kanban board with task dependencies.",[164,191,193],{"id":192},"shared-memory","Shared Memory",[15,195,196],{},"Can agents see each other's context? This is critical for complex pipelines where one agent's output becomes another's input.",[15,198,199,200,204],{},"AG2 implements this via ",[201,202,203],"code",{},"context_variables"," — a shared dictionary that all agents in a Group Chat read from and write to. CrewAI and LangGraph also support shared state. CAMEL-AI provides shared memory through its Workforce pattern.",[15,206,207],{},"Hermes Agent has partial shared memory — issue #377 proposes a scratchpad pattern, but it remains open. Kanban tasks enable data exchange via metadata and comments, but that's not the same as a real-time shared memory pool.",[164,209,211],{"id":210},"communication","Communication",[15,213,214],{},"How do agents talk to each other? All six frameworks use internal communication — messages are passed within the framework, not through an external API. This works fine for most cases, but becomes a problem when you need to connect agents across different systems.",[15,216,217],{},"That's where the A2A protocol comes in (more on that below).",[164,219,221],{"id":220},"adversarial-debate","Adversarial Debate",[15,223,224],{},"One agent generates a response, another critiques it. If the critic finds issues, the first agent revises. This is a powerful pattern for improving quality: essentially code review for LLM output.",[15,226,227],{},"AG2 implements this through Group Chat with LLM handoffs. CAMEL-AI goes further — its RolePlaying pattern was designed from the start for adversarial debate. Hermes Agent has partial support via PR #20158 (Adversarial Debate Mode).",[15,229,230],{},"CrewAI, LangGraph, and OpenPlanter lack built-in debate. You can emulate it with additional agents and custom prompts, but it doesn't work out of the box.",[164,232,234],{"id":233},"inception-prompting","Inception Prompting",[15,236,237],{},"Self-improving prompts — an agent analyzes its own output and adjusts its system prompt for the next attempt. Sounds like sci-fi, but CAMEL-AI implements this through Inception Prompting from its original research paper (NeurIPS 2023).",[15,239,240],{},"AG2 has partial support via system messages. None of the others offer this.",[164,242,244],{"id":243},"adaptive-retry","Adaptive Retry",[15,246,247],{},"What happens when an agent makes a mistake? The simple option is to retry the same request. The smart option is to analyze the error, switch models, adjust the prompt, and only then retry.",[15,249,250],{},"Hermes Agent plans Adaptive Retry with model escalation ladder (issue #30587, PR #30620). CrewAI and LangGraph have retry mechanisms. AG2, CAMEL-AI, and OpenPlanter do not.",[164,252,254],{"id":253},"managed-runtime","Managed Runtime",[15,256,257],{},"Do you need to manage the infrastructure your agents run on? CrewAI and LangGraph offer managed solutions — cloud environments where agents are pre-deployed and configured. AG2 and Hermes Agent are partial: you can self-host, but there are some runtime management contracts. CAMEL-AI and OpenPlanter are fully self-hosted.",[10,259,261],{"id":260},"framework-by-framework","Framework by Framework",[164,263,265],{"id":264},"ag2-ex-autogen","AG2 (ex-AutoGen)",[15,267,268],{},"AG2 is the rebranded AutoGen from Microsoft, now living under the ag2ai organization. It's the most mature framework in terms of orchestration.",[15,270,271],{},"AG2 offers five coordination patterns: AutoPattern (LLM selects the next speaker), RoundRobin (circular rotation), Random (random selection), Manual (human chooses), and Default (explicit handoffs with conditions). This flexibility lets you build virtually any topology.",[15,273,274],{},"AG2's main advantage is native A2A support since version 0.10. You expose your agent as an A2A server, and agents from other frameworks can connect to it. As of today, AG2 is the only major framework with out-of-the-box A2A support compatible with the v1.0 specification.",[15,276,277],{},"Weaknesses: no quality gates (agents don't validate subordinate output quality), no persistent profiles, no CLI interface — only a Python library. If you need \"agent as a service\" with CLI and plugins, AG2 isn't the answer.",[15,279,280],{},"Here's what orchestration looks like in AG2:",[282,283,288],"pre",{"className":284,"code":285,"language":286,"meta":287,"style":287},"language-python shiki shiki-themes github-light catppuccin-mocha","from autogen import ConversableAgent, GroupChat, GroupChatManager\n\ncoder = ConversableAgent(\"coder\", system_message=\"You write Python code.\")\nreviewer = ConversableAgent(\"reviewer\", system_message=\"You review code and find bugs.\")\nwriter = ConversableAgent(\"writer\", system_message=\"You write documentation.\")\n\ngroupchat = GroupChat(\n    agents=[coder, reviewer, writer],\n    messages=[],\n    speaker_selection_method=\"auto\",  # LLM chooses who speaks next\n)\nmanager = GroupChatManager(groupchat=groupchat)\n","python","",[201,289,290,321,328,362,388,414,419,432,459,470,487,492],{"__ignoreMap":287},[291,292,295,299,303,306,309,313,316,318],"span",{"class":293,"line":294},"line",1,[291,296,298],{"class":297},"saXKZ","from",[291,300,302],{"class":301},"slTIY"," autogen ",[291,304,305],{"class":297},"import",[291,307,308],{"class":301}," ConversableAgent",[291,310,312],{"class":311},"s_QEy",",",[291,314,315],{"class":301}," GroupChat",[291,317,312],{"class":311},[291,319,320],{"class":301}," GroupChatManager\n",[291,322,324],{"class":293,"line":323},2,[291,325,327],{"emptyLinePlaceholder":326},true,"\n",[291,329,331,334,338,341,344,348,350,354,356,359],{"class":293,"line":330},3,[291,332,333],{"class":301},"coder ",[291,335,337],{"class":336},"s_Q3D","=",[291,339,308],{"class":340},"sPNDc",[291,342,343],{"class":311},"(",[291,345,347],{"class":346},"sG7gF","\"coder\"",[291,349,312],{"class":311},[291,351,353],{"class":352},"s-dMd"," system_message",[291,355,337],{"class":336},[291,357,358],{"class":346},"\"You write Python code.\"",[291,360,361],{"class":311},")\n",[291,363,365,368,370,372,374,377,379,381,383,386],{"class":293,"line":364},4,[291,366,367],{"class":301},"reviewer ",[291,369,337],{"class":336},[291,371,308],{"class":340},[291,373,343],{"class":311},[291,375,376],{"class":346},"\"reviewer\"",[291,378,312],{"class":311},[291,380,353],{"class":352},[291,382,337],{"class":336},[291,384,385],{"class":346},"\"You review code and find bugs.\"",[291,387,361],{"class":311},[291,389,391,394,396,398,400,403,405,407,409,412],{"class":293,"line":390},5,[291,392,393],{"class":301},"writer ",[291,395,337],{"class":336},[291,397,308],{"class":340},[291,399,343],{"class":311},[291,401,402],{"class":346},"\"writer\"",[291,404,312],{"class":311},[291,406,353],{"class":352},[291,408,337],{"class":336},[291,410,411],{"class":346},"\"You write documentation.\"",[291,413,361],{"class":311},[291,415,417],{"class":293,"line":416},6,[291,418,327],{"emptyLinePlaceholder":326},[291,420,422,425,427,429],{"class":293,"line":421},7,[291,423,424],{"class":301},"groupchat ",[291,426,337],{"class":336},[291,428,315],{"class":340},[291,430,431],{"class":311},"(\n",[291,433,435,438,440,443,446,448,451,453,456],{"class":293,"line":434},8,[291,436,437],{"class":352},"    agents",[291,439,337],{"class":336},[291,441,442],{"class":311},"[",[291,444,445],{"class":301},"coder",[291,447,312],{"class":311},[291,449,450],{"class":301}," reviewer",[291,452,312],{"class":311},[291,454,455],{"class":301}," writer",[291,457,458],{"class":311},"],\n",[291,460,462,465,467],{"class":293,"line":461},9,[291,463,464],{"class":352},"    messages",[291,466,337],{"class":336},[291,468,469],{"class":311},"[],\n",[291,471,473,476,478,481,483],{"class":293,"line":472},10,[291,474,475],{"class":352},"    speaker_selection_method",[291,477,337],{"class":336},[291,479,480],{"class":346},"\"auto\"",[291,482,312],{"class":311},[291,484,486],{"class":485},"skkvY","  # LLM chooses who speaks next\n",[291,488,490],{"class":293,"line":489},11,[291,491,361],{"class":311},[291,493,495,498,500,503,505,508,510,512],{"class":293,"line":494},12,[291,496,497],{"class":301},"manager ",[291,499,337],{"class":336},[291,501,502],{"class":340}," GroupChatManager",[291,504,343],{"class":311},[291,506,507],{"class":352},"groupchat",[291,509,337],{"class":336},[291,511,507],{"class":301},[291,513,361],{"class":311},[15,515,516,517,520,521,524],{},"DefaultPattern gives even more control — explicit transition conditions between agents using ",[201,518,519],{},"OnCondition"," and ",[201,522,523],{},"LLMCondition",". It's like a state machine, except agents replace states.",[15,526,527,530],{},[174,528,529],{},"When to choose:"," You need flexible orchestration with A2A interoperability across different frameworks.",[164,532,78],{"id":533},"crewai",[15,535,536],{},"CrewAI is the most popular framework after Hermes. 52k stars, MIT license, simple API. Its philosophy centers on \"role-based teams\": you define agents with roles (researcher, writer, analyst), assign them tasks, and CrewAI orchestrates execution.",[15,538,539],{},"CrewAI looks roughly like this:",[282,541,543],{"className":284,"code":542,"language":286,"meta":287,"style":287},"from crewai import Agent, Task, Crew\n\nresearcher = Agent(\n    role=\"Research Analyst\",\n    goal=\"Find relevant data on the topic\",\n    backstory=\"You are an expert researcher with 10 years of experience.\",\n)\nwriter = Agent(\n    role=\"Content Writer\",\n    goal=\"Write a clear, engaging article\",\n    backstory=\"You are a skilled technical writer.\",\n)\n\nresearch_task = Task(description=\"Research the topic\", agent=researcher)\nwrite_task = Task(description=\"Write the article\", agent=writer)\n\ncrew = Crew(agents=[researcher, writer], tasks=[research_task, write_task])\nresult = crew.kickoff()\n",[201,544,545,567,571,582,595,607,619,623,633,644,655,666,670,675,707,737,742,789],{"__ignoreMap":287},[291,546,547,549,552,554,557,559,562,564],{"class":293,"line":294},[291,548,298],{"class":297},[291,550,551],{"class":301}," crewai ",[291,553,305],{"class":297},[291,555,556],{"class":301}," Agent",[291,558,312],{"class":311},[291,560,561],{"class":301}," Task",[291,563,312],{"class":311},[291,565,566],{"class":301}," Crew\n",[291,568,569],{"class":293,"line":323},[291,570,327],{"emptyLinePlaceholder":326},[291,572,573,576,578,580],{"class":293,"line":330},[291,574,575],{"class":301},"researcher ",[291,577,337],{"class":336},[291,579,556],{"class":340},[291,581,431],{"class":311},[291,583,584,587,589,592],{"class":293,"line":364},[291,585,586],{"class":352},"    role",[291,588,337],{"class":336},[291,590,591],{"class":346},"\"Research Analyst\"",[291,593,594],{"class":311},",\n",[291,596,597,600,602,605],{"class":293,"line":390},[291,598,599],{"class":352},"    goal",[291,601,337],{"class":336},[291,603,604],{"class":346},"\"Find relevant data on the topic\"",[291,606,594],{"class":311},[291,608,609,612,614,617],{"class":293,"line":416},[291,610,611],{"class":352},"    backstory",[291,613,337],{"class":336},[291,615,616],{"class":346},"\"You are an expert researcher with 10 years of experience.\"",[291,618,594],{"class":311},[291,620,621],{"class":293,"line":421},[291,622,361],{"class":311},[291,624,625,627,629,631],{"class":293,"line":434},[291,626,393],{"class":301},[291,628,337],{"class":336},[291,630,556],{"class":340},[291,632,431],{"class":311},[291,634,635,637,639,642],{"class":293,"line":461},[291,636,586],{"class":352},[291,638,337],{"class":336},[291,640,641],{"class":346},"\"Content Writer\"",[291,643,594],{"class":311},[291,645,646,648,650,653],{"class":293,"line":472},[291,647,599],{"class":352},[291,649,337],{"class":336},[291,651,652],{"class":346},"\"Write a clear, engaging article\"",[291,654,594],{"class":311},[291,656,657,659,661,664],{"class":293,"line":489},[291,658,611],{"class":352},[291,660,337],{"class":336},[291,662,663],{"class":346},"\"You are a skilled technical writer.\"",[291,665,594],{"class":311},[291,667,668],{"class":293,"line":494},[291,669,361],{"class":311},[291,671,673],{"class":293,"line":672},13,[291,674,327],{"emptyLinePlaceholder":326},[291,676,678,681,683,685,687,690,692,695,697,700,702,705],{"class":293,"line":677},14,[291,679,680],{"class":301},"research_task ",[291,682,337],{"class":336},[291,684,561],{"class":340},[291,686,343],{"class":311},[291,688,689],{"class":352},"description",[291,691,337],{"class":336},[291,693,694],{"class":346},"\"Research the topic\"",[291,696,312],{"class":311},[291,698,699],{"class":352}," agent",[291,701,337],{"class":336},[291,703,704],{"class":301},"researcher",[291,706,361],{"class":311},[291,708,710,713,715,717,719,721,723,726,728,730,732,735],{"class":293,"line":709},15,[291,711,712],{"class":301},"write_task ",[291,714,337],{"class":336},[291,716,561],{"class":340},[291,718,343],{"class":311},[291,720,689],{"class":352},[291,722,337],{"class":336},[291,724,725],{"class":346},"\"Write the article\"",[291,727,312],{"class":311},[291,729,699],{"class":352},[291,731,337],{"class":336},[291,733,734],{"class":301},"writer",[291,736,361],{"class":311},[291,738,740],{"class":293,"line":739},16,[291,741,327],{"emptyLinePlaceholder":326},[291,743,745,748,750,753,755,758,760,762,764,766,768,771,774,776,778,781,783,786],{"class":293,"line":744},17,[291,746,747],{"class":301},"crew ",[291,749,337],{"class":336},[291,751,752],{"class":340}," Crew",[291,754,343],{"class":311},[291,756,757],{"class":352},"agents",[291,759,337],{"class":336},[291,761,442],{"class":311},[291,763,704],{"class":301},[291,765,312],{"class":311},[291,767,455],{"class":301},[291,769,770],{"class":311},"],",[291,772,773],{"class":352}," tasks",[291,775,337],{"class":336},[291,777,442],{"class":311},[291,779,780],{"class":301},"research_task",[291,782,312],{"class":311},[291,784,785],{"class":301}," write_task",[291,787,788],{"class":311},"])\n",[291,790,792,795,797,800,803,806],{"class":293,"line":791},18,[291,793,794],{"class":301},"result ",[291,796,337],{"class":336},[291,798,799],{"class":301}," crew",[291,801,802],{"class":311},".",[291,804,805],{"class":340},"kickoff",[291,807,808],{"class":311},"()\n",[15,810,811],{},"Two modes: sequential (tasks execute one after another) and hierarchical (manager delegates to workers). Managed runtime available — you can run it in CrewAI's cloud. Adaptive retry is built in.",[15,813,814],{},"Weaknesses: no adversarial debate, limited support for complex DAGs (this isn't LangGraph), restricted state persistence. A2A support exists only through community adapters; there's no native implementation.",[15,816,817,819],{},[174,818,529],{}," You need a quick start with an intuitive role-based model. Typical use case: \"researcher finds information, writer produces a report, reviewer checks it.\"",[164,821,95],{"id":822},"langgraph",[15,824,825],{},"LangGraph is a layer on top of LangChain that transforms call chains into a graph. Each node is a processing step; edges define transition conditions. You can branch, merge, checkpoint, and insert human-in-the-loop approval points.",[15,827,828],{},"Here's a schematic view of what the graph looks like:",[282,830,832],{"className":284,"code":831,"language":286,"meta":287,"style":287},"from langgraph.graph import StateGraph\n\ndef research(state):\n    return {\"data\": call_llm(\"Research: \" + state[\"topic\"])}\n\ndef write(state):\n    return {\"draft\": call_llm(\"Write about: \" + state[\"data\"])}\n\ndef review(state):\n    approved = call_llm(\"Is this good? \" + state[\"draft\"])\n    return {\"approved\": \"yes\" in approved.lower()}\n\ngraph = StateGraph(dict)\ngraph.add_node(\"research\", research)\ngraph.add_node(\"write\", write)\ngraph.add_node(\"review\", review)\ngraph.add_edge(\"research\", \"write\")\ngraph.add_conditional_edges(\"review\", lambda s: \"end\" if s[\"approved\"] else \"write\")\n",[201,833,834,851,855,873,915,919,932,965,969,982,1011,1039,1043,1060,1081,1100,1119,1139],{"__ignoreMap":287},[291,835,836,838,841,843,846,848],{"class":293,"line":294},[291,837,298],{"class":297},[291,839,840],{"class":301}," langgraph",[291,842,802],{"class":311},[291,844,845],{"class":301},"graph ",[291,847,305],{"class":297},[291,849,850],{"class":301}," StateGraph\n",[291,852,853],{"class":293,"line":323},[291,854,327],{"emptyLinePlaceholder":326},[291,856,857,860,864,866,870],{"class":293,"line":330},[291,858,859],{"class":297},"def",[291,861,863],{"class":862},"siMrf"," research",[291,865,343],{"class":311},[291,867,869],{"class":868},"sO2U0","state",[291,871,872],{"class":311},"):\n",[291,874,875,878,881,884,887,890,892,895,898,901,903,906,910,912],{"class":293,"line":364},[291,876,877],{"class":297},"    return",[291,879,880],{"class":311}," {",[291,882,883],{"class":346},"\"data\"",[291,885,886],{"class":311},":",[291,888,889],{"class":340}," call_llm",[291,891,343],{"class":311},[291,893,894],{"class":346},"\"Research: \"",[291,896,897],{"class":336}," +",[291,899,900],{"class":868}," state",[291,902,442],{"class":311},[291,904,905],{"class":346},"\"",[291,907,909],{"class":908},"sdETa","topic",[291,911,905],{"class":346},[291,913,914],{"class":311},"])}\n",[291,916,917],{"class":293,"line":390},[291,918,327],{"emptyLinePlaceholder":326},[291,920,921,923,926,928,930],{"class":293,"line":416},[291,922,859],{"class":297},[291,924,925],{"class":862}," write",[291,927,343],{"class":311},[291,929,869],{"class":868},[291,931,872],{"class":311},[291,933,934,936,938,941,943,945,947,950,952,954,956,958,961,963],{"class":293,"line":421},[291,935,877],{"class":297},[291,937,880],{"class":311},[291,939,940],{"class":346},"\"draft\"",[291,942,886],{"class":311},[291,944,889],{"class":340},[291,946,343],{"class":311},[291,948,949],{"class":346},"\"Write about: \"",[291,951,897],{"class":336},[291,953,900],{"class":868},[291,955,442],{"class":311},[291,957,905],{"class":346},[291,959,960],{"class":908},"data",[291,962,905],{"class":346},[291,964,914],{"class":311},[291,966,967],{"class":293,"line":434},[291,968,327],{"emptyLinePlaceholder":326},[291,970,971,973,976,978,980],{"class":293,"line":461},[291,972,859],{"class":297},[291,974,975],{"class":862}," review",[291,977,343],{"class":311},[291,979,869],{"class":868},[291,981,872],{"class":311},[291,983,984,987,989,991,993,996,998,1000,1002,1004,1007,1009],{"class":293,"line":472},[291,985,986],{"class":301},"    approved ",[291,988,337],{"class":336},[291,990,889],{"class":340},[291,992,343],{"class":311},[291,994,995],{"class":346},"\"Is this good? \"",[291,997,897],{"class":336},[291,999,900],{"class":868},[291,1001,442],{"class":311},[291,1003,905],{"class":346},[291,1005,1006],{"class":908},"draft",[291,1008,905],{"class":346},[291,1010,788],{"class":311},[291,1012,1013,1015,1017,1020,1022,1025,1028,1031,1033,1036],{"class":293,"line":489},[291,1014,877],{"class":297},[291,1016,880],{"class":311},[291,1018,1019],{"class":346},"\"approved\"",[291,1021,886],{"class":311},[291,1023,1024],{"class":346}," \"yes\"",[291,1026,1027],{"class":297}," in",[291,1029,1030],{"class":301}," approved",[291,1032,802],{"class":311},[291,1034,1035],{"class":340},"lower",[291,1037,1038],{"class":311},"()}\n",[291,1040,1041],{"class":293,"line":494},[291,1042,327],{"emptyLinePlaceholder":326},[291,1044,1045,1047,1049,1052,1054,1058],{"class":293,"line":672},[291,1046,845],{"class":301},[291,1048,337],{"class":336},[291,1050,1051],{"class":340}," StateGraph",[291,1053,343],{"class":311},[291,1055,1057],{"class":1056},"smIoM","dict",[291,1059,361],{"class":311},[291,1061,1062,1065,1067,1070,1072,1075,1077,1079],{"class":293,"line":677},[291,1063,1064],{"class":301},"graph",[291,1066,802],{"class":311},[291,1068,1069],{"class":340},"add_node",[291,1071,343],{"class":311},[291,1073,1074],{"class":346},"\"research\"",[291,1076,312],{"class":311},[291,1078,863],{"class":301},[291,1080,361],{"class":311},[291,1082,1083,1085,1087,1089,1091,1094,1096,1098],{"class":293,"line":709},[291,1084,1064],{"class":301},[291,1086,802],{"class":311},[291,1088,1069],{"class":340},[291,1090,343],{"class":311},[291,1092,1093],{"class":346},"\"write\"",[291,1095,312],{"class":311},[291,1097,925],{"class":301},[291,1099,361],{"class":311},[291,1101,1102,1104,1106,1108,1110,1113,1115,1117],{"class":293,"line":739},[291,1103,1064],{"class":301},[291,1105,802],{"class":311},[291,1107,1069],{"class":340},[291,1109,343],{"class":311},[291,1111,1112],{"class":346},"\"review\"",[291,1114,312],{"class":311},[291,1116,975],{"class":301},[291,1118,361],{"class":311},[291,1120,1121,1123,1125,1128,1130,1132,1134,1137],{"class":293,"line":744},[291,1122,1064],{"class":301},[291,1124,802],{"class":311},[291,1126,1127],{"class":340},"add_edge",[291,1129,343],{"class":311},[291,1131,1074],{"class":346},[291,1133,312],{"class":311},[291,1135,1136],{"class":346}," \"write\"",[291,1138,361],{"class":311},[291,1140,1141,1143,1145,1148,1150,1152,1154,1157,1160,1162,1165,1168,1170,1172,1174,1177,1179,1182,1185,1187],{"class":293,"line":791},[291,1142,1064],{"class":301},[291,1144,802],{"class":311},[291,1146,1147],{"class":340},"add_conditional_edges",[291,1149,343],{"class":311},[291,1151,1112],{"class":346},[291,1153,312],{"class":311},[291,1155,1156],{"class":297}," lambda",[291,1158,1159],{"class":868}," s",[291,1161,886],{"class":311},[291,1163,1164],{"class":346}," \"end\"",[291,1166,1167],{"class":297}," if",[291,1169,1159],{"class":868},[291,1171,442],{"class":311},[291,1173,905],{"class":346},[291,1175,1176],{"class":908},"approved",[291,1178,905],{"class":346},[291,1180,1181],{"class":311},"]",[291,1183,1184],{"class":297}," else",[291,1186,1136],{"class":346},[291,1188,361],{"class":311},[15,1190,1191],{},"Its strength lies in stateful workflows with checkpoints. If an agent fails at step 7 of 12, you can roll back to step 6 and continue. This is rare among multi-agent frameworks. Human-in-the-loop is also well implemented — you can insert a \"pause\" into the graph for human confirmation before proceeding.",[15,1193,1194],{},"33k stars, MIT license, managed runtime via LangGraph Cloud. Adaptive retry is supported.",[15,1196,1197],{},"Weaknesses: no built-in adversarial debate, no inception prompting, A2A only through community efforts. LangGraph focuses more on workflow orchestration than on \"agents arguing with each other.\"",[15,1199,1200,1202],{},[174,1201,529],{}," Complex multi-step pipelines with branching, checkpoints, and human-in-the-loop. If you need a \"processing graph with rollback capability,\" LangGraph is your answer.",[164,1204,111],{"id":114},[15,1206,1207],{},"CAMEL-AI is the most research-oriented framework. Born as an academic project (NeurIPS 2023, arXiv:2303.17760), it retains its research DNA to this day.",[15,1209,1210],{},"CAMEL-AI offers two unique patterns: RolePlaying (two agents play roles and debate until reaching consensus) and Inception Prompting (an agent improves its prompts based on previous attempts). The Workforce pattern implements shared memory for agent teams.",[15,1212,1213],{},"17k stars, Apache 2.0 license. Downsides include no managed runtime, no adaptive retry, and no A2A support. The framework is geared more toward experimentation than production use.",[15,1215,1216,1218],{},[174,1217,529],{}," Research tasks requiring adversarial debate and inception prompting. If you're studying how LLM agents can argue and self-improve, CAMEL-AI is the place.",[164,1220,61],{"id":1221},"hermes-agent",[15,1223,1224],{},"Hermes Agent by NousResearch isn't quite a framework in the traditional sense. It's a CLI-first system with a Kanban board, profiles, skills, and plugins. With 164k stars, it's the most popular on this list.",[15,1226,1227],{},"The philosophy differs: Hermes addresses the application layer (tasks, memory, skills, CLI) rather than the framework layer (Python SDK for writing agents). The Kanban board with dependencies serves as orchestration: tasks block, unblock, and transfer between agent profiles.",[15,1229,1230],{},"Shared memory is partial, adversarial debate is partial (PR #20158), adaptive retry is in development (PR #30620). A2A implementation exists (PR #4135, +2831 lines, 71 tests) but hasn't been merged.",[15,1232,1233],{},"Hermes' greatest strength is its ecosystem. Persistent profiles (isolated configuration, memory, and skills per agent), Skills system (procedural memory), Holographic Memory (hybrid search combining FTS5 + semantic embeddings). No other framework offers anything comparable.",[15,1235,1236,1238],{},[174,1237,529],{}," You need a CLI system with persistent agents, tasks, and skills. Hermes isn't a \"library for writing agents\" — it's a \"platform for running agents as services.\"",[164,1240,141],{"id":1241},"openplanter",[15,1243,1244],{},"OpenPlanter is the smallest framework in this roundup. 1.6k stars, single orchestration, no shared memory, no debate, no retry. Essentially, it's a wrapper for sequential LLM calls with minimal orchestration.",[15,1246,1247],{},"I wouldn't recommend it for production. But if you need a simple scaffold for experiments, OpenPlanter could be a starting point. Sometimes \"less is more\" works.",[10,1249,1251],{"id":1250},"the-a2a-protocol-why-it-matters","The A2A Protocol: Why It Matters",[15,1253,1254],{},"Google introduced the A2A (Agent-to-Agent) protocol in April 2025. The concept is straightforward: MCP answers \"what tools are available?\" while A2A answers \"who can help?\"",[15,1256,1257],{},"Key concepts: Agent Card (JSON description of agent capabilities, analogous to MCP's tool list), Task (unit of work), Message (communication within a task), Artifact (result). Streaming via SSE is supported.",[15,1259,1260],{},"Native A2A support currently exists in: AG2 (since v0.10), Google ADK (from day one), Pydantic AI. Community adapters are available for CrewAI and LangChain. Hermes Agent has a complete implementation, but PR #4135 remains unmerged.",[15,1262,1263],{},"Why does this matter? Because multi-agent frameworks are islands. Your CrewAI agent can't easily call an AG2 agent. A2A solves this: expose your agent as an A2A server, and any framework with an A2A client can reach it.",[282,1265,1267],{"className":284,"code":1266,"language":286,"meta":287,"style":287},"# AG2: exposing an agent as an A2A server\nfrom autogen import ConversableAgent, LLMConfig\nfrom autogen.a2a import A2aAgentServer\n\nagent = ConversableAgent(\n    name=\"coder\",\n    system_message=\"Expert Python developer\",\n    llm_config=LLMConfig({\"model\": \"gpt-4o-mini\"}),\n)\nserver = A2aAgentServer(agent).build()\n# uvicorn server:server --port 8000\n\n# Connecting from another process\nfrom autogen.a2a import A2aRemoteAgent\nremote = A2aRemoteAgent(url=\"http:\u002F\u002Flocalhost:8000\", name=\"coder\")\nawait local_agent.a_initiate_chat(recipient=remote, message=\"Write a CSV parser\")\n",[201,1268,1269,1274,1289,1306,1310,1321,1332,1344,1368,1372,1395,1400,1404,1409,1424,1455],{"__ignoreMap":287},[291,1270,1271],{"class":293,"line":294},[291,1272,1273],{"class":485},"# AG2: exposing an agent as an A2A server\n",[291,1275,1276,1278,1280,1282,1284,1286],{"class":293,"line":323},[291,1277,298],{"class":297},[291,1279,302],{"class":301},[291,1281,305],{"class":297},[291,1283,308],{"class":301},[291,1285,312],{"class":311},[291,1287,1288],{"class":301}," LLMConfig\n",[291,1290,1291,1293,1296,1298,1301,1303],{"class":293,"line":330},[291,1292,298],{"class":297},[291,1294,1295],{"class":301}," autogen",[291,1297,802],{"class":311},[291,1299,1300],{"class":301},"a2a ",[291,1302,305],{"class":297},[291,1304,1305],{"class":301}," A2aAgentServer\n",[291,1307,1308],{"class":293,"line":364},[291,1309,327],{"emptyLinePlaceholder":326},[291,1311,1312,1315,1317,1319],{"class":293,"line":390},[291,1313,1314],{"class":301},"agent ",[291,1316,337],{"class":336},[291,1318,308],{"class":340},[291,1320,431],{"class":311},[291,1322,1323,1326,1328,1330],{"class":293,"line":416},[291,1324,1325],{"class":352},"    name",[291,1327,337],{"class":336},[291,1329,347],{"class":346},[291,1331,594],{"class":311},[291,1333,1334,1337,1339,1342],{"class":293,"line":421},[291,1335,1336],{"class":352},"    system_message",[291,1338,337],{"class":336},[291,1340,1341],{"class":346},"\"Expert Python developer\"",[291,1343,594],{"class":311},[291,1345,1346,1349,1351,1354,1357,1360,1362,1365],{"class":293,"line":434},[291,1347,1348],{"class":352},"    llm_config",[291,1350,337],{"class":336},[291,1352,1353],{"class":340},"LLMConfig",[291,1355,1356],{"class":311},"({",[291,1358,1359],{"class":346},"\"model\"",[291,1361,886],{"class":311},[291,1363,1364],{"class":346}," \"gpt-4o-mini\"",[291,1366,1367],{"class":311},"}),\n",[291,1369,1370],{"class":293,"line":461},[291,1371,361],{"class":311},[291,1373,1374,1377,1379,1382,1384,1387,1390,1393],{"class":293,"line":472},[291,1375,1376],{"class":301},"server ",[291,1378,337],{"class":336},[291,1380,1381],{"class":340}," A2aAgentServer",[291,1383,343],{"class":311},[291,1385,1386],{"class":301},"agent",[291,1388,1389],{"class":311},").",[291,1391,1392],{"class":340},"build",[291,1394,808],{"class":311},[291,1396,1397],{"class":293,"line":489},[291,1398,1399],{"class":485},"# uvicorn server:server --port 8000\n",[291,1401,1402],{"class":293,"line":494},[291,1403,327],{"emptyLinePlaceholder":326},[291,1405,1406],{"class":293,"line":672},[291,1407,1408],{"class":485},"# Connecting from another process\n",[291,1410,1411,1413,1415,1417,1419,1421],{"class":293,"line":677},[291,1412,298],{"class":297},[291,1414,1295],{"class":301},[291,1416,802],{"class":311},[291,1418,1300],{"class":301},[291,1420,305],{"class":297},[291,1422,1423],{"class":301}," A2aRemoteAgent\n",[291,1425,1426,1429,1431,1434,1436,1439,1441,1444,1446,1449,1451,1453],{"class":293,"line":709},[291,1427,1428],{"class":301},"remote ",[291,1430,337],{"class":336},[291,1432,1433],{"class":340}," A2aRemoteAgent",[291,1435,343],{"class":311},[291,1437,1438],{"class":352},"url",[291,1440,337],{"class":336},[291,1442,1443],{"class":346},"\"http:\u002F\u002Flocalhost:8000\"",[291,1445,312],{"class":311},[291,1447,1448],{"class":352}," name",[291,1450,337],{"class":336},[291,1452,347],{"class":346},[291,1454,361],{"class":311},[291,1456,1457,1460,1463,1465,1468,1470,1473,1475,1478,1480,1483,1485,1488],{"class":293,"line":739},[291,1458,1459],{"class":297},"await",[291,1461,1462],{"class":301}," local_agent",[291,1464,802],{"class":311},[291,1466,1467],{"class":340},"a_initiate_chat",[291,1469,343],{"class":311},[291,1471,1472],{"class":352},"recipient",[291,1474,337],{"class":336},[291,1476,1477],{"class":301},"remote",[291,1479,312],{"class":311},[291,1481,1482],{"class":352}," message",[291,1484,337],{"class":336},[291,1486,1487],{"class":346},"\"Write a CSV parser\"",[291,1489,361],{"class":311},[15,1491,1492],{},"A2A and MCP aren't competitors — they're complementary protocols. MCP gives agents tools; A2A gives agents colleagues. Together, they form a complete stack for multi-agent systems.",[10,1494,1496],{"id":1495},"summary-table","Summary Table",[29,1498,1499,1519],{},[32,1500,1501],{},[35,1502,1503,1506,1509,1511,1513,1515,1517],{},[38,1504,1505],{},"Feature",[38,1507,1508],{},"Hermes",[38,1510,126],{},[38,1512,78],{},[38,1514,95],{},[38,1516,111],{},[38,1518,141],{},[54,1520,1521,1541,1561,1578,1595,1612,1629,1647,1664,1681],{},[35,1522,1523,1526,1529,1531,1533,1536,1538],{},[59,1524,1525],{},"Orchestration",[59,1527,1528],{},"multi",[59,1530,1528],{},[59,1532,1528],{},[59,1534,1535],{},"parallel",[59,1537,1528],{},[59,1539,1540],{},"single",[35,1542,1543,1546,1549,1552,1554,1556,1558],{},[59,1544,1545],{},"Shared memory",[59,1547,1548],{},"partial",[59,1550,1551],{},"✅",[59,1553,1551],{},[59,1555,1551],{},[59,1557,1551],{},[59,1559,1560],{},"❌",[35,1562,1563,1566,1568,1570,1572,1574,1576],{},[59,1564,1565],{},"Adversarial debate",[59,1567,1548],{},[59,1569,1551],{},[59,1571,1560],{},[59,1573,1560],{},[59,1575,1551],{},[59,1577,1560],{},[35,1579,1580,1583,1585,1587,1589,1591,1593],{},[59,1581,1582],{},"Inception prompting",[59,1584,1560],{},[59,1586,1548],{},[59,1588,1560],{},[59,1590,1560],{},[59,1592,1551],{},[59,1594,1560],{},[35,1596,1597,1600,1602,1604,1606,1608,1610],{},[59,1598,1599],{},"Adaptive retry",[59,1601,1548],{},[59,1603,1560],{},[59,1605,1551],{},[59,1607,1551],{},[59,1609,1560],{},[59,1611,1560],{},[35,1613,1614,1617,1619,1621,1623,1625,1627],{},[59,1615,1616],{},"Managed runtime",[59,1618,1548],{},[59,1620,1548],{},[59,1622,1551],{},[59,1624,1551],{},[59,1626,1560],{},[59,1628,1560],{},[35,1630,1631,1634,1636,1639,1641,1643,1645],{},[59,1632,1633],{},"A2A protocol",[59,1635,1548],{},[59,1637,1638],{},"✅ native",[59,1640,1548],{},[59,1642,1548],{},[59,1644,1560],{},[59,1646,1560],{},[35,1648,1649,1652,1654,1656,1658,1660,1662],{},[59,1650,1651],{},"CLI",[59,1653,1551],{},[59,1655,1560],{},[59,1657,1560],{},[59,1659,1560],{},[59,1661,1560],{},[59,1663,1560],{},[35,1665,1666,1669,1671,1673,1675,1677,1679],{},[59,1667,1668],{},"Persistent profiles",[59,1670,1551],{},[59,1672,1560],{},[59,1674,1560],{},[59,1676,1560],{},[59,1678,1560],{},[59,1680,1560],{},[35,1682,1683,1686,1688,1690,1692,1694,1696],{},[59,1684,1685],{},"Skills\u002Fmemory",[59,1687,1551],{},[59,1689,1560],{},[59,1691,1560],{},[59,1693,1560],{},[59,1695,1560],{},[59,1697,1560],{},[10,1699,1701],{"id":1700},"recommendations","Recommendations",[15,1703,1704,1707],{},[174,1705,1706],{},"Quick start with role-based teams"," → CrewAI. Simple API, managed runtime, MIT license. Ideal for MVPs and prototypes.",[15,1709,1710,1713],{},[174,1711,1712],{},"Complex stateful pipelines"," → LangGraph. DAGs with checkpoints, conditional routing, human-in-the-loop. If your workflow involves branching and requires rollback capability, this is it.",[15,1715,1716,1719],{},[174,1717,1718],{},"A2A interoperability and flexible orchestration"," → AG2. The only major framework with native A2A v1.0 support. Five coordination patterns. If you're building a system where agents from different frameworks must communicate, choose AG2.",[15,1721,1722,1725],{},[174,1723,1724],{},"Research and experimentation"," → CAMEL-AI. RolePlaying, Inception Prompting, academic approach. Best choice for studying how LLM agents argue and learn.",[15,1727,1728,1731],{},[174,1729,1730],{},"Platform for persistent agents"," → Hermes Agent. CLI, Kanban, profiles, skills, holographic memory. Not a framework for writing agents, but an operating system for running them.",[15,1733,1734,1737],{},[174,1735,1736],{},"Simple experiments"," → OpenPlanter. Minimal scaffold, nothing extra.",[10,1739,1741],{"id":1740},"whats-next","What's Next",[15,1743,1744],{},"Multi-agent frameworks are moving toward interoperability. A2A will become the de facto standard — too many major players already support it. MCP + A2A will deliver a complete stack: tools for agents and agents for agents.",[15,1746,1747],{},"Hermes Agent stands out by solving the problem at a different level. While other frameworks debate orchestration patterns, Hermes builds infrastructure for persistent agents with memory, skills, and tasks. It's like the difference between \"an HTTP request library\" and \"a web server with plugins.\"",[15,1749,1750],{},"AG2 has quietly become the most mature framework for production multi-agent systems. Five coordination patterns, native A2A, context variables. If Microsoft reclaims the AutoGen brand or ag2ai secures significant funding, CrewAI and LangGraph could face serious pressure.",[15,1752,1753],{},"CAMEL-AI remains a research project, and that's perfectly fine. Not everything needs to be production-ready. Inception Prompting and RolePlaying represent a future that still lives in the lab.",[15,1755,1756],{},"Choose a framework based on your task, not the hype. And remember: a multi-agent system isn't a silver bullet. If one agent handles the job, don't add four more just for show.",[1758,1759,1760],"style",{},"html pre.shiki code .saXKZ, html code.shiki .saXKZ{--shiki-light:#D73A49;--shiki-dark:#CBA6F7}html pre.shiki code .slTIY, html code.shiki .slTIY{--shiki-light:#24292E;--shiki-dark:#CDD6F4}html pre.shiki code .s_QEy, html code.shiki .s_QEy{--shiki-light:#24292E;--shiki-dark:#9399B2}html pre.shiki code .s_Q3D, html code.shiki .s_Q3D{--shiki-light:#D73A49;--shiki-dark:#94E2D5}html pre.shiki code .sPNDc, html code.shiki .sPNDc{--shiki-light:#24292E;--shiki-dark:#89B4FA}html pre.shiki code .sG7gF, html code.shiki .sG7gF{--shiki-light:#032F62;--shiki-dark:#A6E3A1}html pre.shiki code .s-dMd, html code.shiki .s-dMd{--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic}html pre.shiki code .skkvY, html code.shiki .skkvY{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#9399B2;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .siMrf, html code.shiki .siMrf{--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic}html pre.shiki code .sO2U0, html code.shiki .sO2U0{--shiki-light:#24292E;--shiki-light-font-style:inherit;--shiki-dark:#EBA0AC;--shiki-dark-font-style:italic}html pre.shiki code .sdETa, html code.shiki .sdETa{--shiki-light:#032F62;--shiki-light-font-style:inherit;--shiki-dark:#A6E3A1;--shiki-dark-font-style:italic}html pre.shiki code .smIoM, html code.shiki .smIoM{--shiki-light:#005CC5;--shiki-light-font-style:inherit;--shiki-dark:#CBA6F7;--shiki-dark-font-style:italic}",{"title":287,"searchDepth":323,"depth":323,"links":1762},[1763,1764,1765,1774,1782,1783,1784,1785],{"id":12,"depth":323,"text":13},{"id":26,"depth":323,"text":27},{"id":158,"depth":323,"text":159,"children":1766},[1767,1768,1769,1770,1771,1772,1773],{"id":166,"depth":330,"text":167},{"id":192,"depth":330,"text":193},{"id":210,"depth":330,"text":211},{"id":220,"depth":330,"text":221},{"id":233,"depth":330,"text":234},{"id":243,"depth":330,"text":244},{"id":253,"depth":330,"text":254},{"id":260,"depth":323,"text":261,"children":1775},[1776,1777,1778,1779,1780,1781],{"id":264,"depth":330,"text":265},{"id":533,"depth":330,"text":78},{"id":822,"depth":330,"text":95},{"id":114,"depth":330,"text":111},{"id":1221,"depth":330,"text":61},{"id":1241,"depth":330,"text":141},{"id":1250,"depth":323,"text":1251},{"id":1495,"depth":323,"text":1496},{"id":1700,"depth":323,"text":1701},{"id":1740,"depth":323,"text":1741},"2026-06-01","A comparison of six multi-agent AI system frameworks — AG2, CrewAI, LangGraph, CAMEL-AI, Hermes Agent, and OpenPlanter. Architecture, features, and real-world differences.","md",{},"\u002Fblog\u002Fmulti-agent-frameworks-comparison.en",null,{"title":5,"description":1787},"blog\u002Fmulti-agent-frameworks-comparison.en",[1795,1796,1797,1798,1799,1800,533,822,1801,114,1221],"multi-agent","ai","frameworks","comparison","a2a","orchestration","ag2","77odJT1Xse31FROA9lWALyDebA3Syyv8c5Mi0GDhs8A",1780777846247]