{"id":299,"date":"2026-01-21T10:43:58","date_gmt":"2026-01-21T02:43:58","guid":{"rendered":"https:\/\/connectword.dpdns.org\/?p=299"},"modified":"2026-01-21T10:43:58","modified_gmt":"2026-01-21T02:43:58","slug":"a-coding-guide-to-anemoi-style-semi-centralized-agentic-systems-using-peer-to-peer-critic-loops-in-langgraph","status":"publish","type":"post","link":"https:\/\/connectword.dpdns.org\/?p=299","title":{"rendered":"A Coding Guide to Anemoi-Style Semi-Centralized Agentic Systems Using Peer-to-Peer Critic Loops in LangGraph"},"content":{"rendered":"<p>In this tutorial, we demonstrate how a semi-centralized Anemoi-style multi-agent system works by letting two peer agents negotiate directly without a manager or supervisor. We show how a Drafter and a Critic iteratively refine an output through peer-to-peer feedback, reducing coordination overhead while preserving quality. We implement this pattern end-to-end in Colab using LangGraph, focusing on clarity, control flow, and practical execution rather than abstract orchestration theory. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/Agentic%20AI%20Codes\/anemoi_semi_centralized_peer_critic_loop_langgraph_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">!pip -q install -U langgraph langchain-openai langchain-core\n\n\nimport os\nimport json\nfrom getpass import getpass\nfrom typing import TypedDict\n\n\nfrom langchain_openai import ChatOpenAI\nfrom langgraph.graph import StateGraph, END\n\n\nif not os.environ.get(\"OPENAI_API_KEY\"):\n   os.environ[\"OPENAI_API_KEY\"] = getpass(\"Enter OPENAI_API_KEY (hidden): \")\n\n\nMODEL = os.environ.get(\"OPENAI_MODEL\", \"gpt-4o-mini\")\nllm = ChatOpenAI(model=MODEL, temperature=0.2)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We set up the Colab environment by installing the required LangGraph and LangChain packages and securely collecting the OpenAI API key as a hidden input. We initialize the language model that will be shared by all agents, keeping the configuration minimal and reproducible. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/Agentic%20AI%20Codes\/anemoi_semi_centralized_peer_critic_loop_langgraph_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">class AnemoiState(TypedDict):\n   task: str\n   max_rounds: int\n   round: int\n   draft: str\n   critique: str\n   agreed: bool\n   final: str\n   trace: bool<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We define a typed state that acts as the shared communication surface between agents during negotiation. We explicitly track the task, draft, critique, agreement flag, and iteration count to keep the flow transparent and debuggable. This state obviates the need for a central manager or for implicit memory. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/Agentic%20AI%20Codes\/anemoi_semi_centralized_peer_critic_loop_langgraph_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">DRAFTER_SYSTEM = \"\"\"You are Agent A (Drafter) in a peer-to-peer loop.\nYou write a high-quality solution to the user's task.\nIf you receive critique, you revise decisively and incorporate it.\nReturn only the improved draft text.\"\"\"\n\n\ndef drafter_node(state: AnemoiState) -&gt; AnemoiState:\n   task = state[\"task\"]\n   critique = state.get(\"critique\", \"\").strip()\n   r = state.get(\"round\", 0) + 1\n\n\n   if critique:\n       user_msg = f\"\"\"TASK:\n{task}\n\n\nCRITIQUE:\n{critique}\n\n\nRevise the draft.\"\"\"\n   else:\n       user_msg = f\"\"\"TASK:\n{task}\n\n\nWrite the first draft.\"\"\"\n\n\n   draft = llm.invoke(\n       [\n           {\"role\": \"system\", \"content\": DRAFTER_SYSTEM},\n           {\"role\": \"user\", \"content\": user_msg},\n       ]\n   ).content.strip()\n\n\n   if state.get(\"trace\", False):\n       print(f\"n--- Drafter Round {r} ---n{draft}n\")\n\n\n   return {**state, \"round\": r, \"draft\": draft, \"agreed\": False}<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We implement the Drafter agent, which produces the initial response and revises it whenever peer feedback is available. We keep the Drafter focused purely on improving the user-facing draft, without awareness of control logic or termination conditions. It mirrors the Anemoi idea of agents optimizing locally while observing peer signals. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/Agentic%20AI%20Codes\/anemoi_semi_centralized_peer_critic_loop_langgraph_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">CRITIC_SYSTEM = \"\"\"You are Agent B (Critic).\nReturn strict JSON:\n{\"agree\": true\/false, \"critique\": \"...\"}\"\"\"\n\n\ndef critic_node(state: AnemoiState) -&gt; AnemoiState:\n   task = state[\"task\"]\n   draft = state.get(\"draft\", \"\")\n\n\n   raw = llm.invoke(\n       [\n           {\"role\": \"system\", \"content\": CRITIC_SYSTEM},\n           {\n               \"role\": \"user\",\n               \"content\": f\"TASK:n{task}nnDRAFT:n{draft}\",\n           },\n       ]\n   ).content.strip()\n\n\n   cleaned = raw.strip(\"```\").replace(\"json\", \"\").strip()\n\n\n   try:\n       data = json.loads(cleaned)\n       agree = bool(data.get(\"agree\", False))\n       critique = str(data.get(\"critique\", \"\")).strip()\n   except Exception:\n       agree = False\n       critique = raw\n\n\n   if state.get(\"trace\", False):\n       print(f\"--- Critic Decision ---nAGREE: {agree}n{critique}n\")\n\n\n   final = draft if agree else state.get(\"final\", \"\")\n   return {**state, \"agreed\": agree, \"critique\": critique, \"final\": final}<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We implement the Critic agent, which evaluates the draft and decides whether it is ready to ship or needs revision. We enforce a strict agree-or-revise decision to avoid vague feedback and ensure fast convergence. This peer evaluation step allows quality control without introducing a supervisory agent. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/Agentic%20AI%20Codes\/anemoi_semi_centralized_peer_critic_loop_langgraph_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">def continue_or_end(state: AnemoiState) -&gt; str:\n   if state.get(\"agreed\", False):\n       return \"end\"\n   if state.get(\"round\", 0) &gt;= state.get(\"max_rounds\", 3):\n       return \"force_ship\"\n   return \"loop\"\n\n\ndef force_ship_node(state: AnemoiState) -&gt; AnemoiState:\n   return {**state, \"final\": state.get(\"final\") or state.get(\"draft\", \"\")}\n\n\ngraph = StateGraph(AnemoiState)\ngraph.add_node(\"drafter\", drafter_node)\ngraph.add_node(\"critic\", critic_node)\ngraph.add_node(\"force_ship\", force_ship_node)\n\n\ngraph.set_entry_point(\"drafter\")\ngraph.add_edge(\"drafter\", \"critic\")\ngraph.add_conditional_edges(\n   \"critic\",\n   continue_or_end,\n   {\"loop\": \"drafter\", \"force_ship\": \"force_ship\", \"end\": END},\n)\ngraph.add_edge(\"force_ship\", END)\n\n\nanemoi_critic_loop = graph.compile()\n\n\ndemo_task = \"\"\"Explain the Anemoi semi-centralized agent pattern and why peer-to-peer critic loops reduce bottlenecks.\"\"\"\n\n\nresult = anemoi_critic_loop.invoke(\n   {\n       \"task\": demo_task,\n       \"max_rounds\": 3,\n       \"round\": 0,\n       \"draft\": \"\",\n       \"critique\": \"\",\n       \"agreed\": False,\n       \"final\": \"\",\n       \"trace\": False,\n   }\n)\n\n\nprint(\"n====================\")\nprint(\"<img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/16.0.1\/72x72\/2705.png\" alt=\"\u2705\" class=\"wp-smiley\" \/> FINAL OUTPUT\")\nprint(\"====================n\")\nprint(result[\"final\"])<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We assemble the LangGraph workflow that routes control between Drafter and Critic until agreement is reached or the maximum round limit is reached. We rely on simple conditional routing rather than centralized planning, thereby preserving the system\u2019s semi-centralized nature. Finally, we execute the graph and return the best available output to the user.<\/p>\n<p>In conclusion, we demonstrated that Anemoi-style peer negotiation is a practical alternative to manager-worker architectures, offering lower latency, reduced context bloat, and simpler agent coordination. By allowing agents to monitor and correct each other directly, we achieved convergence with fewer tokens and less orchestration complexity. In this tutorial, we provided a reusable blueprint for building scalable, semi-centralized agent systems. It lays the foundation for extending the pattern to multi-peer meshes, red-team loops, or protocol-based agent interoperability.<\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p>Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/Agentic%20AI%20Codes\/anemoi_semi_centralized_peer_critic_loop_langgraph_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.\u00a0Also,\u00a0feel free to follow us on\u00a0<strong><a href=\"https:\/\/x.com\/intent\/follow?screen_name=marktechpost\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Twitter<\/mark><\/a><\/strong>\u00a0and don\u2019t forget to join our\u00a0<strong><a href=\"https:\/\/www.reddit.com\/r\/machinelearningnews\/\" target=\"_blank\" rel=\"noreferrer noopener\">100k+ ML SubReddit<\/a><\/strong>\u00a0and Subscribe to\u00a0<strong><a href=\"https:\/\/www.aidevsignals.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">our Newsletter<\/a><\/strong>. Wait! are you on telegram?\u00a0<strong><a href=\"https:\/\/t.me\/machinelearningresearchnews\" target=\"_blank\" rel=\"noreferrer noopener\">now you can join us on telegram as well.<\/a><\/strong><\/p>\n<p>The post <a href=\"https:\/\/www.marktechpost.com\/2026\/01\/20\/a-coding-guide-to-anemoi-style-semi-centralized-agentic-systems-using-peer-to-peer-critic-loops-in-langgraph\/\">A Coding Guide to Anemoi-Style Semi-Centralized Agentic Systems Using Peer-to-Peer Critic Loops in LangGraph<\/a> appeared first on <a href=\"https:\/\/www.marktechpost.com\/\">MarkTechPost<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>In this tutorial, we demonstra&hellip;<\/p>\n","protected":false},"author":1,"featured_media":29,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-299","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts\/299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=299"}],"version-history":[{"count":0,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts\/299\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/media\/29"}],"wp:attachment":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}