{
"cells": [
{
"cell_type": "markdown",
"id": "90a9efb6",
"metadata": {
"papermill": {
"duration": 0.017646,
"end_time": "2026-05-27T05:18:35.463747+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:35.446101+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"# 05 · Multi-Agent Systems — supervisor + role-specialised agents\n",
"\n",
"> **TL;DR.** A team of agents — each with its own role (system prompt) and tools — collaborates on tasks too broad for any single agent. A **Supervisor** agent reads the conversation history and routes work to the next specialist. After all specialists contribute, a **Writer** synthesises the team's findings into a final report.\n",
">\n",
"> **Reach for it when** the task spans several domains (research with finance + news + technical angles; legal analysis with citations + interpretation + drafting; software development with PM + dev + QA roles).\n",
"> **Avoid when** one focused agent suffices — multi-agent multiplies cost and introduces coordination failure modes.\n",
"\n",
"| Property | Value |\n",
"|---|---|\n",
"| Origin | LangGraph supervisor pattern ([tutorial](https://langchain-ai.github.io/langgraph/tutorials/multi_agent/agent_supervisor/)); conceptual ancestors: AutoGen (Microsoft 2023), CrewAI (2023) |\n",
"| Coordination style | Centralised — single Supervisor routes between specialists |\n",
"| External tools needed? | Optional; specialists typically use web search |\n",
"| Memory across episodes? | No |\n",
"| Composability | Each specialist is a `ToolUse` sub-agent — architectures compose |\n",
"| Default roster | News / Technical / Financial specialists + Writer |\n",
"\n",
"This is the first notebook where you'll see **specialisation as a quality lever** — three focused agents almost always produce a richer report than one generalist asked to \"cover everything\"."
]
},
{
"cell_type": "markdown",
"id": "c8827207",
"metadata": {
"papermill": {
"duration": 0.009927,
"end_time": "2026-05-27T05:18:35.487835+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:35.477908+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 2 · Architecture at a glance\n",
"\n",
"```mermaid\n",
"flowchart LR\n",
" A([user task]) --> S{Supervisor
structured-output
routing decision}\n",
" S -->|news not covered| N[News specialist
ToolUse + news prompt]\n",
" S -->|technical not covered| T[Technical specialist
ToolUse + tech prompt]\n",
" S -->|financial not covered| F[Financial specialist
ToolUse + finance prompt]\n",
" S -->|all done| W[Writer
synthesises final report]\n",
" S -->|writer done| Z([final report])\n",
" N --> S\n",
" T --> S\n",
" F --> S\n",
" W --> S\n",
"\n",
" style S fill:#fff3e0,stroke:#f57c00\n",
" style W fill:#e8f5e9,stroke:#388e3c\n",
"```\n",
"\n",
"**Star topology.** The Supervisor is the only node every other node connects to. Each specialist runs, returns its findings, and hands control back. The Supervisor's structured-output decision picks the next specialist (or `writer`, or `FINISH`)."
]
},
{
"cell_type": "markdown",
"id": "20183d95",
"metadata": {
"papermill": {
"duration": 0.010862,
"end_time": "2026-05-27T05:18:35.511465+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:35.500603+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 3 · Theory\n",
"\n",
"### 3.1 · Why a team beats one big agent\n",
"\n",
"There are three measurable wins from role specialisation:\n",
"\n",
"1. **Focused context.** Each specialist's system prompt narrows the search space. The Financial agent looks for revenue, margins, market cap. The News agent looks for dated events. A generalist agent has to think about *everything*, and tends to produce hedged, surface-level coverage of each topic.\n",
"\n",
"2. **Tool specialisation.** In production, specialists carry *different* tools. The Financial agent has a stock-quote API. The Technical agent has access to docs/RAG over your codebase. The News agent has web search + a recency filter. Forcing one agent to learn when to use each tool is harder than giving each agent the right tool from the start.\n",
"\n",
"3. **Inspectability.** Each specialist's output is a separately-labelled artifact in the trace. When the final report is wrong, you immediately see *which specialist's finding* was wrong. Debugging a monolithic agent's output requires re-reading the whole conversation.\n",
"\n",
"### 3.2 · The supervisor protocol\n",
"\n",
"The Supervisor is the *coordination protocol*. Three common variants:\n",
"\n",
"| Variant | Who picks the next agent? | Best for |\n",
"|---|---|---|\n",
"| **Manager-style** *(this notebook)* | Central Supervisor LLM | Fixed roster, predictable routing |\n",
"| **Hierarchical** | Supervisors-of-supervisors | Very large teams (15+ agents) |\n",
"| **Blackboard** (notebook 07) | No central coordinator — agents subscribe to shared state and self-elect | Dynamic teams, opportunistic collaboration |\n",
"| **Sequential pipeline** | Hard-coded order | Tasks with strict step dependencies |\n",
"\n",
"Manager-style is the right default — it's predictable, easy to reason about, and the Supervisor's reasoning is itself a useful artifact in the trace.\n",
"\n",
"### 3.3 · The structured-output decision\n",
"\n",
"The Supervisor returns a typed object:\n",
"\n",
"```python\n",
"class _SupervisorDecision(BaseModel):\n",
" next: Literal[\"news\", \"technical\", \"financial\", \"writer\", \"FINISH\"]\n",
" reason: str\n",
"```\n",
"\n",
"`with_structured_output` ensures the model can only pick from the valid roster — no parsing, no validation, no \"the Supervisor said 'maybe ask the financial guy?'\" footgun. The `reason` field is a one-sentence rationale, useful for trace inspection.\n",
"\n",
"### 3.4 · Why a separate Writer node?\n",
"\n",
"You *could* let the last specialist write the final report. But three problems:\n",
"\n",
"- **Recency bias.** The last specialist's findings dominate the report; earlier specialists' work gets paraphrased away.\n",
"- **Role contamination.** A News specialist asked to write the final report tends to make the *whole* report sound like news.\n",
"- **No synthesis incentive.** Each specialist's output is a bullet list; the Writer's job is to weave them into prose.\n",
"\n",
"A dedicated Writer with a neutral synthesis prompt produces noticeably better reports. The cost (one extra LLM call) is small relative to the rest of the pipeline.\n",
"\n",
"### 3.5 · Where Multi-Agent sits\n",
"\n",
"| Pattern | Coordination | Specialisation | Use when |\n",
"|---|---|---|---|\n",
"| Single ReAct (nb 03) | none | none | one focused query |\n",
"| Planning (nb 04) | static plan | none | task has obvious steps |\n",
"| **Multi-Agent** *(this notebook)* | **central supervisor** | **role-based** | task spans domains |\n",
"| Blackboard (nb 07) | distributed | role-based | opportunistic, dynamic team |\n",
"| Meta-Controller (nb 11) | router over architectures | architecture-based | one of: ReAct / Planning / RAG fits per task |\n",
"| Ensemble (nb 13) | parallel + aggregator | perspective-based | want diverse opinions |\n",
"\n",
"### 3.6 · What goes wrong (you'll see in § 9)\n",
"\n",
"1. **Role drift.** The News specialist returns financial figures because \"interest in earnings\" is *news*-adjacent. Mitigation: harder system prompt + an LLMJudge that scores each output's *role-fitness*.\n",
"2. **Supervisor loops.** Supervisor routes specialist X, specialist X already acted, Supervisor routes X again. Mitigation: track who's contributed in state (we do this) and refuse repeats.\n",
"3. **Writer hallucination.** Writer adds \"facts\" the specialists didn't provide. Mitigation: prompt explicitly forbids it; verify with a separate evidence-check pass (PEV notebook 06).\n",
"4. **Cost blowup.** N specialists × M tool calls each = O(N·M) LLM calls. Cap `specialist_rounds` and team size.\n"
]
},
{
"cell_type": "markdown",
"id": "1b2db2ed",
"metadata": {
"papermill": {
"duration": 0.012023,
"end_time": "2026-05-27T05:18:35.534628+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:35.522605+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 4 · Setup"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "94c8e54f",
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-27T05:18:35.563967Z",
"iopub.status.busy": "2026-05-27T05:18:35.562938Z",
"iopub.status.idle": "2026-05-27T05:18:37.389246Z",
"shell.execute_reply": "2026-05-27T05:18:37.389246Z"
},
"papermill": {
"duration": 1.84725,
"end_time": "2026-05-27T05:18:37.393620+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:35.546370+00:00",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"
Provider: nebius · Model: meta-llama/Llama-3.3-70B-Instruct ─────────────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[1;36mProvider: nebius · Model: meta-llama/Llama-\u001b[0m\u001b[1;36m3.3\u001b[0m\u001b[1;36m-70B-Instruct\u001b[0m \u001b[92m─────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Specialists in default roster: news, technical, financial \n",
"\n"
],
"text/plain": [
"Specialists in default roster: \u001b[1mnews, technical, financial\u001b[0m \n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from agentic_architectures import get_llm, enable_langsmith, settings\n",
"from agentic_architectures.architectures import MultiAgent\n",
"from agentic_architectures.architectures.multi_agent import DEFAULT_SPECIALISTS\n",
"from agentic_architectures.ui import print_md, print_header, print_step\n",
"\n",
"enable_langsmith()\n",
"print_header(f\"Provider: {settings.llm_provider} · Model: {settings.llm_model}\")\n",
"print_md(f\"Specialists in default roster: **{', '.join(DEFAULT_SPECIALISTS.keys())}**\")"
]
},
{
"cell_type": "markdown",
"id": "3011b949",
"metadata": {
"papermill": {
"duration": 0.008801,
"end_time": "2026-05-27T05:18:37.413857+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:37.405056+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 5 · Library walkthrough\n",
"\n",
"Source: [`src/agentic_architectures/architectures/multi_agent.py`](../src/agentic_architectures/architectures/multi_agent.py).\n",
"\n",
"Five key pieces:\n",
"\n",
"1. **`DEFAULT_SPECIALISTS`** — a `dict[str, str]` mapping specialist name → role system prompt. Easy to override: pass `MultiAgent(specialists={\"law\": \"...\", \"math\": \"...\"})`.\n",
"2. **`_supervisor`** — uses `with_structured_output(_SupervisorDecision)` to pick the next agent. Also includes a *safety clamp*: if the supervisor LLM picks a specialist who's already contributed (a common failure), the code overrides to the next remaining specialist.\n",
"3. **`_make_specialist_node(name)`** — factory that creates one graph node per specialist, each delegating to its own `ToolUse` sub-agent with the specialist's prompt.\n",
"4. **`_writer`** — final synthesis node that reads ALL specialist outputs and writes a structured report. Explicit prompt rules: use headings, preserve URLs, don't add unverified facts.\n",
"5. **`build`** — wires the star topology: Supervisor → specialist → Supervisor → next specialist → … → Writer → Supervisor → END."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7ce0a7ed",
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-27T05:18:37.448813Z",
"iopub.status.busy": "2026-05-27T05:18:37.445606Z",
"iopub.status.idle": "2026-05-27T05:18:37.472783Z",
"shell.execute_reply": "2026-05-27T05:18:37.469337Z"
},
"papermill": {
"duration": 0.045945,
"end_time": "2026-05-27T05:18:37.475148+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:37.429203+00:00",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Default specialist roster:\n",
" - news: You are a NEWS specialist. Find recent news, announcements, press coverage. Focu...\n",
" - technical: You are a TECHNICAL/PRODUCT specialist. Find concrete product details, specifica...\n",
" - financial: You are a FINANCIAL specialist. Find revenue, growth, market cap, stock performa...\n"
]
}
],
"source": [
"from agentic_architectures.architectures import multi_agent as ma_mod\n",
"print('Default specialist roster:')\n",
"for name, prompt in ma_mod.DEFAULT_SPECIALISTS.items():\n",
" print(f' - {name}: {prompt[:80]}...')"
]
},
{
"cell_type": "markdown",
"id": "147591d5",
"metadata": {
"papermill": {
"duration": 0.013671,
"end_time": "2026-05-27T05:18:37.497640+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:37.483969+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 6 · State\n",
"\n",
"The state has four real fields:\n",
"\n",
"| Field | Type | Set by | Reducer |\n",
"|---|---|---|---|\n",
"| `task` | `str` | caller | replace |\n",
"| `specialist_outputs` | `list[dict]` | each specialist | **append** (`operator.add`) |\n",
"| `next` | `str` | `_supervisor` | replace |\n",
"| `next_reason` | `str` | `_supervisor` | replace |\n",
"| `final_report` | `str` | `_writer` | replace |\n",
"\n",
"The `specialist_outputs` list uses `operator.add` so each specialist's contribution is *appended* rather than overwriting. The supervisor reads this list to know who's already contributed."
]
},
{
"cell_type": "markdown",
"id": "72f0f57a",
"metadata": {
"papermill": {
"duration": 0.012618,
"end_time": "2026-05-27T05:18:37.523959+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:37.511341+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 7 · Build the graph\n",
"\n",
"The compiled graph has one supervisor node + one node per specialist + a writer node. Compare this star topology to ReAct's linear topology — the supervisor sits at the centre of all edges."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "632577ea",
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-27T05:18:37.552953Z",
"iopub.status.busy": "2026-05-27T05:18:37.552953Z",
"iopub.status.idle": "2026-05-27T05:18:43.448574Z",
"shell.execute_reply": "2026-05-27T05:18:43.446549Z"
},
"papermill": {
"duration": 5.916967,
"end_time": "2026-05-27T05:18:43.454407+00:00",
"exception": false,
"start_time": "2026-05-27T05:18:37.537440+00:00",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"__start__
]):::first\n", "\tsupervisor(supervisor)\n", "\tnews(news)\n", "\ttechnical(technical)\n", "\tfinancial(financial)\n", "\twriter(writer)\n", "\t__end__([__end__
]):::last\n", "\t__start__ --> supervisor;\n", "\tfinancial --> supervisor;\n", "\tnews --> supervisor;\n", "\tsupervisor -. END .-> __end__;\n", "\tsupervisor -.-> financial;\n", "\tsupervisor -.-> news;\n", "\tsupervisor -.-> technical;\n", "\tsupervisor -.-> writer;\n", "\ttechnical --> supervisor;\n", "\twriter --> supervisor;\n", "\tclassDef default fill:#f2f0ff,line-height:1.2\n", "\tclassDef first fill-opacity:0\n", "\tclassDef last fill:#bfb6fc\n", "\n" ] } ], "source": [ "from IPython.display import Image, display\n", "\n", "arch = MultiAgent(specialist_rounds=4)\n", "graph = arch.build()\n", "display(Image(graph.get_graph().draw_mermaid_png()))\n", "print(arch.diagram())" ] }, { "cell_type": "markdown", "id": "42845fb0", "metadata": { "papermill": { "duration": 0.014758, "end_time": "2026-05-27T05:18:43.479597+00:00", "exception": false, "start_time": "2026-05-27T05:18:43.464839+00:00", "status": "completed" }, "tags": [] }, "source": [ "## 8 · Live run\n", "\n", "Concrete task: a market profile of a publicly-traded company. This naturally splits across all three default specialists: News (recent events), Technical (products), Financial (numbers)." ] }, { "cell_type": "code", "execution_count": 4, "id": "93f46676", "metadata": { "execution": { "iopub.execute_input": "2026-05-27T05:18:43.513752Z", "iopub.status.busy": "2026-05-27T05:18:43.513752Z", "iopub.status.idle": "2026-05-27T05:19:51.386432Z", "shell.execute_reply": "2026-05-27T05:19:51.384675Z" }, "papermill": { "duration": 67.896095, "end_time": "2026-05-27T05:19:51.392111+00:00", "exception": false, "start_time": "2026-05-27T05:18:43.496016+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "Final report ──────────────────────────────────────────────────────────────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[1;36mFinal report\u001b[0m \u001b[92m──────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
News \n", "\n", "Tesla Inc. has experienced significant market fluctuations over the last 12 months, with its stock price plunging \n", "by more than 5% after announcing disappointing electric vehicle delivery numbers \n", "(https://finance.yahoo.com/markets/stocks/articles/tesla-just-delivered-terrible-news-175100537.html). The company \n", "is also exploring a potential merger with SpaceX, while Elon Musk defends its reputation amid political backlash \n", "(https://finance.yahoo.com/quote/TSLA). Additionally, Tesla's stock has been closely watched by investors, with its\n", "value sinking as the market gained, closing at $438.07 and marking a -2.59% move from the previous day \n", "(https://finance.yahoo.com/news/tesla-tsla-stock-sinks-market-224504106.html), and it is worth exploring what lies \n", "ahead for the stock (https://finance.yahoo.com/news/tesla-inc-tsla-attracting-investor-140004096.html). \n", "\n", "Technical \n", "\n", "Tesla's model lineup includes the Model S, Model 3, Model X, Model Y, Cybertruck, Semi, and Roadster \n", "(https://www.tesla.com/models). The Model S has a range of up to 405 miles on a single charge, while the Model 3 \n", "has a range of up to 326 miles (https://www.tesla.com/models). Furthermore, Tesla's Autopilot technology is an \n", "advanced driver-assistance system (ADAS) that enables semi-autonomous driving (https://www.tesla.com/autopilot). \n", "\n", "Financial \n", "\n", "Tesla Inc. has a market capitalization of $2.15T (https://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics) and a \n", "revenue per share of $0.94 (https://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics). The company's free cash \n", "flow (FCF) margin is 6.86% (https://finance.yahoo.com/news/teslas-strong-fcf-margins-could-133002586.html), with a \n", "total gross margin of over 20.1% for the quarter \n", "(https://finance.yahoo.com/news/tesla-inc-tsla-q4-2025-050329216.html), and its revenue reached $28.1 billion \n", "(https://finance.yahoo.com/news/tsla-q3-deep-dive-ai-053113035.html). Overall, Tesla Inc. remains a closely watched\n", "and innovative player in the electric vehicle market, with a strong financial position and cutting-edge technology.\n", "\n" ], "text/plain": [ "\u001b[1;35mNews\u001b[0m \n", "\n", "Tesla Inc. has experienced significant market fluctuations over the last 12 months, with its stock price plunging \n", "by more than 5% after announcing disappointing electric vehicle delivery numbers \n", "(https://finance.yahoo.com/markets/stocks/articles/tesla-just-delivered-terrible-news-175100537.html). The company \n", "is also exploring a potential merger with SpaceX, while Elon Musk defends its reputation amid political backlash \n", "(https://finance.yahoo.com/quote/TSLA). Additionally, Tesla's stock has been closely watched by investors, with its\n", "value sinking as the market gained, closing at $438.07 and marking a -2.59% move from the previous day \n", "(https://finance.yahoo.com/news/tesla-tsla-stock-sinks-market-224504106.html), and it is worth exploring what lies \n", "ahead for the stock (https://finance.yahoo.com/news/tesla-inc-tsla-attracting-investor-140004096.html). \n", "\n", "\u001b[1;35mTechnical\u001b[0m \n", "\n", "Tesla's model lineup includes the Model S, Model 3, Model X, Model Y, Cybertruck, Semi, and Roadster \n", "(https://www.tesla.com/models). The Model S has a range of up to 405 miles on a single charge, while the Model 3 \n", "has a range of up to 326 miles (https://www.tesla.com/models). Furthermore, Tesla's Autopilot technology is an \n", "advanced driver-assistance system (ADAS) that enables semi-autonomous driving (https://www.tesla.com/autopilot). \n", "\n", "\u001b[1;35mFinancial\u001b[0m \n", "\n", "Tesla Inc. has a market capitalization of $2.15T (https://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics) and a \n", "revenue per share of $0.94 (https://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics). The company's free cash \n", "flow (FCF) margin is 6.86% (https://finance.yahoo.com/news/teslas-strong-fcf-margins-could-133002586.html), with a \n", "total gross margin of over 20.1% for the quarter \n", "(https://finance.yahoo.com/news/tesla-inc-tsla-q4-2025-050329216.html), and its revenue reached $28.1 billion \n", "(https://finance.yahoo.com/news/tsla-q3-deep-dive-ai-053113035.html). Overall, Tesla Inc. remains a closely watched\n", "and innovative player in the electric vehicle market, with a strong financial position and cutting-edge technology.\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/html": [ "
3/3 specialists contributed · Writer ran: True ──────────────────────────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[1;36m3\u001b[0m\u001b[1;36m/\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;36m specialists contributed · Writer ran: \u001b[0m\u001b[1;3;36mTrue\u001b[0m \u001b[92m──────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "TASK = (\n", " \"Write a short market profile of Tesla Inc. covering: \"\n", " \"(1) recent news from the last 12 months, \"\n", " \"(2) technical/product details (model lineup, key tech), \"\n", " \"(3) financial highlights (revenue, market cap, margin). \"\n", " \"Each section must cite at least 1 source URL.\"\n", ")\n", "\n", "result = arch.run(TASK)\n", "\n", "print_header(\"Final report\")\n", "print_md(result.output)\n", "print()\n", "print_header(\n", " f\"{result.metadata['specialists_invoked']}/{result.metadata['specialists_available']} \"\n", " f\"specialists contributed · Writer ran: {result.metadata['has_writer_output']}\"\n", ")" ] }, { "cell_type": "markdown", "id": "1d7c0715", "metadata": { "papermill": { "duration": 0.010035, "end_time": "2026-05-27T05:19:51.420430+00:00", "exception": false, "start_time": "2026-05-27T05:19:51.410395+00:00", "status": "completed" }, "tags": [] }, "source": [ "### 8.0 · What just happened, briefly\n", "\n", "Look at the **specialists_invoked** count above:\n", "\n", "- **`3/3`** — every specialist contributed. Best case; the Supervisor cycled through the whole team before handing to the Writer.\n", "- **`2/3` or `1/3`** — Supervisor finalized early. Either it judged the missing specialist's domain wasn't relevant, OR it routed to the Writer too soon (a failure mode — see § 9).\n", "- **`0/3`** — total failure; Supervisor went straight to FINISH without any team work.\n", "\n", "§ 9 below quantifies the specialist contributions and flags any pathologies." ] }, { "cell_type": "markdown", "id": "fb151d44", "metadata": { "papermill": { "duration": 0.011533, "end_time": "2026-05-27T05:19:51.451894+00:00", "exception": false, "start_time": "2026-05-27T05:19:51.440361+00:00", "status": "completed" }, "tags": [] }, "source": [ "### 8.1 · Specialist contributions in order" ] }, { "cell_type": "code", "execution_count": 5, "id": "f5bf4ebd", "metadata": { "execution": { "iopub.execute_input": "2026-05-27T05:19:51.484847Z", "iopub.status.busy": "2026-05-27T05:19:51.484847Z", "iopub.status.idle": "2026-05-27T05:19:51.561472Z", "shell.execute_reply": "2026-05-27T05:19:51.559815Z" }, "papermill": { "duration": 0.093027, "end_time": "2026-05-27T05:19:51.563500+00:00", "exception": false, "start_time": "2026-05-27T05:19:51.470473+00:00", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
› [1] SPECIALIST: NEWS\n", "\n" ], "text/plain": [ "\u001b[1;35m›\u001b[0m \u001b[1m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m]\u001b[0m\u001b[1m SPECIALIST: NEWS\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Here are some recent news items about Tesla Inc. from the last 12 months:\n", "* Tesla's stock price plunged by more than 5% after the company announced a disappointing set of electric vehicle \n", "(EV) delivery numbers \n", "(https://finance.yahoo.com/markets/stocks/articles/tesla-just-delivered-terrible-news-175100537.html)\n", "* Tesla is exploring a potential merger with SpaceX, while Elon Musk continues to defend\n", "\n" ], "text/plain": [ "Here are some recent news items about Tesla Inc. from the last \u001b[1;36m12\u001b[0m months:\n", "* Tesla's stock price plunged by more than \u001b[1;36m5\u001b[0m% after the company announced a disappointing set of electric vehicle \n", "\u001b[1m(\u001b[0mEV\u001b[1m)\u001b[0m delivery numbers \n", "\u001b[1m(\u001b[0m\u001b[4;94mhttps://finance.yahoo.com/markets/stocks/articles/tesla-just-delivered-terrible-news-175100537.html\u001b[0m\u001b[4;94m)\u001b[0m\n", "* Tesla is exploring a potential merger with SpaceX, while Elon Musk continues to defend\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/html": [ "
› [2] SPECIALIST: TECHNICAL\n", "\n" ], "text/plain": [ "\u001b[1;35m›\u001b[0m \u001b[1m[\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m]\u001b[0m\u001b[1m SPECIALIST: TECHNICAL\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Here are 3-5 concrete technical facts about Tesla Inc.'s model lineup and key tech:\n", "* Tesla's model lineup includes the Model S, Model 3, Model X, Model Y, Cybertruck, Semi, and Roadster. (Source: \n", "https://www.tesla.com/models)\n", "* The Model S has a range of up to 405 miles on a single charge, while the Model 3 has a range of up to 326 miles. \n", "(Source: https://www.tesla.com/models)\n", "* Tesla's Autopilot\n", "\n" ], "text/plain": [ "Here are \u001b[1;36m3\u001b[0m-\u001b[1;36m5\u001b[0m concrete technical facts about Tesla Inc.'s model lineup and key tech:\n", "* Tesla's model lineup includes the Model S, Model \u001b[1;36m3\u001b[0m, Model X, Model Y, Cybertruck, Semi, and Roadster. \u001b[1m(\u001b[0mSource: \n", "\u001b[4;94mhttps://www.tesla.com/models\u001b[0m\u001b[4;94m)\u001b[0m\n", "* The Model S has a range of up to \u001b[1;36m405\u001b[0m miles on a single charge, while the Model \u001b[1;36m3\u001b[0m has a range of up to \u001b[1;36m326\u001b[0m miles. \n", "\u001b[1m(\u001b[0mSource: \u001b[4;94mhttps://www.tesla.com/models\u001b[0m\u001b[4;94m)\u001b[0m\n", "* Tesla's Autopilot\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/html": [ "
› [3] SPECIALIST: FINANCIAL\n", "\n" ], "text/plain": [ "\u001b[1;35m›\u001b[0m \u001b[1m[\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1m]\u001b[0m\u001b[1m SPECIALIST: FINANCIAL\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Here are 3-5 concrete financial facts about Tesla Inc. with source URLs:\n", "* Market cap: $2.15T (https://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics)\n", "* Revenue per share (ttm): $0.94 (https://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics)\n", "* Free cash flow (FCF) margin: 6.86% \n", "(https://finance.yahoo.com/news/teslas-strong-fcf-margins-could-133002586.html)\n", "* Total Gross Margin: Over 20.1% for\n", "\n" ], "text/plain": [ "Here are \u001b[1;36m3\u001b[0m-\u001b[1;36m5\u001b[0m concrete financial facts about Tesla Inc. with source URLs:\n", "* Market cap: $\u001b[1;36m2.\u001b[0m15T \u001b[1m(\u001b[0m\u001b[4;94mhttps://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics\u001b[0m\u001b[4;94m)\u001b[0m\n", "* Revenue per share \u001b[1m(\u001b[0mttm\u001b[1m)\u001b[0m: $\u001b[1;36m0.94\u001b[0m \u001b[1m(\u001b[0m\u001b[4;94mhttps://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics\u001b[0m\u001b[4;94m)\u001b[0m\n", "* Free cash flow \u001b[1m(\u001b[0mFCF\u001b[1m)\u001b[0m margin: \u001b[1;36m6.86\u001b[0m% \n", "\u001b[1m(\u001b[0m\u001b[4;94mhttps://finance.yahoo.com/news/teslas-strong-fcf-margins-could-133002586.html\u001b[0m\u001b[4;94m)\u001b[0m\n", "* Total Gross Margin: Over \u001b[1;36m20.1\u001b[0m% for\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "text/html": [ "
› [4] WRITER (final report)\n", "\n" ], "text/plain": [ "\u001b[1;35m›\u001b[0m \u001b[1m[\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1m]\u001b[0m\u001b[1m WRITER \u001b[0m\u001b[1m(\u001b[0m\u001b[1mfinal report\u001b[0m\u001b[1m)\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
### News\n",
"Tesla Inc. has experienced significant market fluctuations over the last 12 months, with its stock price plunging \n",
"by more than 5% after announcing disappointing electric vehicle delivery numbers \n",
"(https://finance.yahoo.com/markets/stocks/articles/tesla-just-delivered-terrible-news-175100537.html). The company \n",
"is also exploring a potential merger with SpaceX, while Elon Musk defends its rep\n",
"\n"
],
"text/plain": [
"### News\n",
"Tesla Inc. has experienced significant market fluctuations over the last \u001b[1;36m12\u001b[0m months, with its stock price plunging \n",
"by more than \u001b[1;36m5\u001b[0m% after announcing disappointing electric vehicle delivery numbers \n",
"\u001b[1m(\u001b[0m\u001b[4;94mhttps://finance.yahoo.com/markets/stocks/articles/tesla-just-delivered-terrible-news-175100537.html\u001b[0m\u001b[4;94m)\u001b[0m\u001b[4;94m.\u001b[0m The company \n",
"is also exploring a potential merger with SpaceX, while Elon Musk defends its rep\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"for i, t in enumerate(result.trace, 1):\n",
" if t['type'] == 'specialist':\n",
" print_step(f\"[{i}] SPECIALIST: {t['specialist'].upper()}\", t['content'][:400])\n",
" elif t['type'] == 'writer':\n",
" print_step(f\"[{i}] WRITER (final report)\", t['content'][:400])\n",
" print()"
]
},
{
"cell_type": "markdown",
"id": "5dd9084f",
"metadata": {
"papermill": {
"duration": 0.018764,
"end_time": "2026-05-27T05:19:51.600346+00:00",
"exception": false,
"start_time": "2026-05-27T05:19:51.581582+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 9 · What we just observed\n",
"\n",
"The cells above are live. Below: a breakdown of the **actual** Multi-Agent coordination Nebius-hosted Llama-3.3-70B produced on this run.\n",
"\n",
"### 9.1 · Quantitative summary\n",
"\n",
"| Metric | Value |\n",
"|---|---|\n",
"| Specialists invoked | **3** / 3 |\n",
"| Routing order | news → technical → financial → writer |\n",
"| Final report length | 2556 chars |\n",
"| URLs preserved in report | 12 |\n",
"\n",
"### 9.2 · Specialist contributions\n",
"\n",
"| # | Role | Output snippet |\n",
"|---|---|---|\n",
"| 1 | news | Here are some recent news items about Tesla Inc. from the last 12 months: * Tesla's stock price plunged by more than 5% after the company announced a disappointing set of electric vehicle (EV) deliver… |\n",
"| 2 | technical | Here are 3-5 concrete technical facts about Tesla Inc.'s model lineup and key tech: * Tesla's model lineup includes the Model S, Model 3, Model X, Model Y, Cybertruck, Semi, and Roadster. (Source: htt… |\n",
"| 3 | financial | Here are 3-5 concrete financial facts about Tesla Inc. with source URLs: * Market cap: $2.15T (https://nz.finance.yahoo.com/quote/TSLA.TO/key-statistics) * Revenue per share (ttm): $0.94 (https://nz.f… |\n",
"\n",
"### 9.3 · Pathologies / patterns surfaced in this run\n",
"\n",
"- **Full team coverage.** All 3 specialists contributed once each — the supervisor protocol worked as designed.\n",
"\n",
"### 9.4 · The final report (verbatim)\n",
"\n",
"> News \n",
"> \n",
"> Tesla Inc. has experienced significant market fluctuations over the last 12 months, with its stock price plunging \n",
"> by more than 5% after announcing disappointing electric vehicle delivery numbers \n",
"> (https://finance.yahoo.com/markets/stocks/articles/tesla-just-delivered-terrible-news-175100537.html). The company \n",
"> is also exploring a potential merger with SpaceX, while Elon Musk defends its reputation amid political backlash \n",
"> (https://finance.ya…\n",
"\n",
"### 9.5 · The takeaway\n",
"\n",
"Multi-Agent wins when *specialisation* genuinely narrows each agent's job. The signs of a healthy run: **full team coverage** (all specialists contributed), **no role drift** (each output stays in its lane), **all URLs preserved** by the Writer. When any of those fail, the cost of coordination isn't being earned back by quality."
]
},
{
"cell_type": "markdown",
"id": "29531323",
"metadata": {
"papermill": {
"duration": 0.015968,
"end_time": "2026-05-27T05:19:51.633250+00:00",
"exception": false,
"start_time": "2026-05-27T05:19:51.617282+00:00",
"status": "completed"
},
"tags": []
},
"source": [
"## 10 · Try other providers / customise the team\n",
"\n",
"Multi-Agent needs **structured output** (for the Supervisor's decision). Same gating as Planning.\n",
"\n",
"This cell ALSO demonstrates customising the specialist roster — a 2-agent team (`legal` + `medical`) for a different domain task."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "9815fa34",
"metadata": {
"execution": {
"iopub.execute_input": "2026-05-27T05:19:51.673985Z",
"iopub.status.busy": "2026-05-27T05:19:51.673985Z",
"iopub.status.idle": "2026-05-27T05:20:34.914331Z",
"shell.execute_reply": "2026-05-27T05:20:34.912589Z"
},
"papermill": {
"duration": 43.271164,
"end_time": "2026-05-27T05:20:34.923096+00:00",
"exception": false,
"start_time": "2026-05-27T05:19:51.651932+00:00",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[skip] openai: no API key in .env\n",
"[skip] anthropic: no API key in .env\n"
]
},
{
"data": {
"text/html": [
"Custom 2-specialist team: medical + legal ─────────────────────────────────────────────────────────────────────────\n", "\n" ], "text/plain": [ "\u001b[1;36mCustom \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;36m-specialist team: medical + legal\u001b[0m \u001b[92m─────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "### Medical\n", "GLP-1 agonists, such as Ozempic, have been shown to have significant clinical benefits in the treatment of type 2 diabetes and obesity. Recent regulatory developments include the FDA approval of Ozempic for the treatment of type 2 diabetes in 2017, and the EMA approval in 2018. Clinical developments include the publication of several studies demonstrating the efficacy and safety of GLP-1 agonists in improving glycemic control, weight loss, and cardiovascular outcomes. Sources: https://www.nih.gov/, https://www.who.int/.\n", "\n", "### Legal\n", "The recent regulatory and clinical developments aro\n", " specialists used: ['legal', 'medical']\n" ] } ], "source": [ "from agentic_architectures.llm.factory import provider_supports_structured_output\n", "\n", "for p in [\"openai\", \"anthropic\"]:\n", " key = settings.api_key_for(p)\n", " if key is None or not key.get_secret_value():\n", " print(f\"[skip] {p}: no API key in .env\")\n", " continue\n", " if not provider_supports_structured_output(p):\n", " print(f\"[skip] {p}: no structured output\")\n", " continue\n", " print_header(f\"Re-running Multi-Agent on {p}\")\n", " r = MultiAgent(llm=get_llm(provider=p), specialist_rounds=4).run(\n", " \"Briefly profile Microsoft's most recent fiscal year on news + technical + financial.\"\n", " )\n", " print(r.output[:400])\n", " print(f\" specialists: {r.state['specialists_used']}\")\n", " print()\n", "\n", "# Custom 2-specialist team for a different domain\n", "print_header(\"Custom 2-specialist team: medical + legal\")\n", "custom = MultiAgent(\n", " specialists={\n", " \"medical\": \"You are a MEDICAL specialist. Find the clinical / treatment angle. Cite sources.\",\n", " \"legal\": \"You are a LEGAL specialist. Find the regulatory / liability angle. Cite sources.\",\n", " },\n", " specialist_rounds=4,\n", ")\n", "r = custom.run(\"What are the recent regulatory and clinical developments around GLP-1 agonists like Ozempic?\")\n", "print(r.output[:600])\n", "print(f\" specialists used: {r.state['specialists_used']}\")" ] }, { "cell_type": "markdown", "id": "a21b33d2", "metadata": { "papermill": { "duration": 0.026943, "end_time": "2026-05-27T05:20:34.974330+00:00", "exception": false, "start_time": "2026-05-27T05:20:34.947387+00:00", "status": "completed" }, "tags": [] }, "source": [ "## 11 · Failure modes, safety, extensions\n", "\n", "### 11.1 · Where this breaks\n", "\n", "| Failure | Mechanism | Mitigation |\n", "|---|---|---|\n", "| **Role drift** | News agent returns financial figures because \"earnings\" reads as news | Tighter role prompts; an LLMJudge that scores output role-fitness |\n", "| **Supervisor loop** | Supervisor picks a specialist who already contributed | Track covered specialists in state + clamp the decision (we do both) |\n", "| **Premature writer** | Supervisor routes to writer before all specialists contribute | The default supervisor prompt explicitly forbids this; still happens occasionally |\n", "| **Writer hallucination** | Writer adds \"facts\" the specialists didn't provide | Explicit prompt rule + downstream PEV-style verifier (nb 06) |\n", "| **Cost blowup** | N specialists × M tool rounds = O(N·M) LLM calls | Cap `specialist_rounds` (default 3) and team size |\n", "| **Coordination overhead** | Supervisor LLM call per round adds latency | Use a small fast model for the supervisor only; specialists stay on the main model |\n", "\n", "### 11.2 · Production safety\n", "\n", "- **Cap roster size.** 3-5 specialists is the sweet spot. Beyond that, coordination cost dominates.\n", "- **Distinct tools per specialist.** Don't bind the same Tavily tool to all specialists if you can avoid it — bind a specialised tool (a stock-quote API for Financial, a docs RAG retriever for Technical).\n", "- **Sandbox specialist outputs.** A specialist that returns adversarial text could prompt-inject the Writer. Sanitize or escape before passing to the next role.\n", "\n", "### 11.3 · Three extensions\n", "\n", "1. **Different LLM per specialist.** A small fast model for the News specialist (lots of skimming, low reasoning); a larger model for the Financial specialist (precision matters). Pass `llm=` per specialist when wrapping `ToolUse`.\n", "2. **Add a Reviewer specialist.** After the Writer's first draft, a Reviewer agent critiques and the Writer revises — that's Reflection (notebook 01) layered on top of Multi-Agent.\n", "3. **Parallel specialist invocation.** If specialists' findings are independent (no cross-references), run them concurrently via `langgraph.graph.parallel` for a big latency win.\n", "\n", "### 11.4 · What to read next\n", "\n", "- [**07 · Blackboard**](./07_blackboard.ipynb) — multi-agent **without** a central supervisor; agents self-elect.\n", "- [**11 · Meta-Controller**](./11_meta_controller.ipynb) — supervisor that routes between *architectures*, not specialists.\n", "- [**13 · Ensemble**](./13_ensemble.ipynb) — many agents tackle the *same* problem in parallel; aggregator merges.\n", "- [**28 · Multi-Agent Debate**](./28_agent_debate.ipynb) — adversarial multi-agent that converges via critique.\n", "\n", "### 11.5 · References\n", "\n", "1. Wu, Q. et al. *AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation.* 2023. [arXiv:2308.08155](https://arxiv.org/abs/2308.08155)\n", "2. LangGraph multi-agent tutorial — [official docs](https://langchain-ai.github.io/langgraph/tutorials/multi_agent/agent_supervisor/)\n", "3. CrewAI framework — [crewai.com](https://www.crewai.com)\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.0" }, "papermill": { "default_parameters": {}, "duration": 124.22292, "end_time": "2026-05-27T05:20:36.343717+00:00", "environment_variables": {}, "exception": null, "input_path": "all-agentic-architectures/notebooks/05_multi_agent.ipynb", "output_path": "all-agentic-architectures/notebooks/05_multi_agent.ipynb", "parameters": {}, "start_time": "2026-05-27T05:18:32.120797+00:00", "version": "2.7.0" } }, "nbformat": 4, "nbformat_minor": 5 }