{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2025-09-15-the-rise-of-subagents/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "There is an increasing use of Subagents to reliably handle specific user goals. We can see this in tools like Claude Code and [Poke.com](http://poke.com/). A subagent is a specialized Agent that is purpose-built for a single, well-defined task. Subagents can be explicit, where a user or model defines them for reuse or implicit and dynamically defined. This addresses a key limitation of monolithic AI agents context pollution. When a single, big and complex agent handles many tasks, its context window, number of tools, can become cluttered and less reliable.\n\n## What are Subagents?\n\nSubagents are specialized AI agents. They are most of the time used in combination with an orchestrator, which delegates tasks to them. A subagent is just like a normal agent and has the same components. This includes a name for identification, a description of its capabilities, system instructions and a set of tools to interact with environments. It also has its own isolated context window.\n\nPython\n\n```python\n            ┌───────────────────┐\n            │    User Request   │\n            └─────────┬─────────┘\n                      │\n                      ▼\n        ┌───────────────────────────┐\n        │   Orchestrator Agent      │\n        │- Analyzes Request         │\n        │- Decomposes Task          │\n        │- Delegates to Subagents   │\n        └───────────┬───────────────┘\n                    │\n┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐\n                    │ Isolated Execution\n                    │\n        ┌───────────┴───────────┬──────────────────┐\n        ▼                       ▼                  ▼\n┌────────────────┐    ┌────────────────┐    ┌────────────────┐\n│ Subagent 1     │    │ Subagent 2     │    │ Subagent n...  │\n│- Own Context   │    │- Own Context   │    │- Own Context   │\n│- Own Tools     │    │- Own Tools     │    │- Own Tools     │\n│- Solves Task A │    │- Solves Task B │    │- Solves Task C │\n└───────┬────────┘    └─────────┬──────┘    └──────┬─────────┘\n        │                       │                  │\n        └───────────┬───────────┴──────────────────┘\n                    │\n                    ▼\n        ┌───────────────────────────┐\n        │   Orchestrator Agent      │\n        │- Synthesizes all results  │\n        └─────────────┬─────────────┘\n                      │\n                      ▼\n            ┌───────────────────┐\n            │   Final Answer    │\n            └───────────────────┘\n```\n\n### Explicit, User-Defined Subagents\n\nExplicit, User-defined Subagents are a permanent team of reusable specialists. Subagent can be defined in a static file or directly in code and the orchestrator uses them trough their name or when a prompt matches its `description`. Claude Code uses this method. The tools are manually listed in the definition, and the agent is stateless, meaning it starts fresh on every run.\n\n**Pros:**\n\n- You have full control over the agent's tools and behavior.\n- The agent's actions are very predictable and secure.\n- Reusable and easy to test in isolation\n\n**Cons:**\n\n- The system is rigid. You must update the definition file to add new tools.\n- The orchestrator must manage all the state between steps.\n- Hard to scale to hunderds of specialized task.\n\nHere is a pseudo-code snippet of a definition file, inspired from Claude Code:\n\nYAML\n\n```yaml\n---\nname: \"Code-Reviewer\"\ndescription: \"MUST BE USED for reviewing code against style guides and security practices.\"\ntools: ['file_read', 'search_code']\n---\nYou are an expert security code reviewer. Your purpose is to analyze code and identify vulnerabilities. Provide feedback in a numbered list.\n \n```\n\n### Implicit, On-the-Fly Subagents\n\nImplicit, On-the-Fly Subagents can be created temporary by an orchestrator to handle tasks as they come up. The orchestrator uses a tool (`send_message_to_agent`) to create and interact with the agent. The system dynamically assigns tools based on the user's natural language request from pre-defined pool which are needed to solve the task. Poke.com uses this method to created unlimited agents for specific user request. A key feature is that these agents can be stateful, e.g. keep context from previous runs when called with the same `agent_name`.\n\nHere is a pseudo-code snippet for how the orchestrator calls the agent:\n\nPython\n\n```python\n# The orchestrator calls this tool to create or reuse a subagent\nsend_message_to_agent(\n    agent_name=\"q3_report_email_draft\",\n    description=\"An agent specializing in drafting internal company communications, specifically for report summaries and team updates.\",\n    message=f\"\"\"Draft an email to the marketing team about the Q3 report.\n \n    TONE & STYLE:\n    - Professional yet approachable and optimistic.\n    - Be concise and data-driven. Avoid corporate jargon.\n    - IMPORTANT: Analyze my last 5 sent emails to the 'marketing-team@' mailing list to match my typical writing style, greeting, and sign-off.\n    \n    RULES & CONSTRAINTS:\n    - The subject line must be clear and engaging. Start with \"Q3 Report Highlights:\".\n    - Use bullet points to present the key metrics for scannability.\n    - Keep the total email length under 200 words.\n    - End with a clear call to action: ask the team to review the full report and send their feedback for the Q4 planning session by EOD Friday.\n    \"\"\"\n)\n```\n\n- **Pros:**\n  - The system is very flexible and requires no setup.\n  - Tools are selected based on the unique user task.\n  - Multi-step tasks are straightforward because the agent remembers its context.\n- **Cons:**\n  - The system is less predictable and you have less direct control.\n  - It might fail if it misunderstands the task and assigns the wrong tools.\n  - Harder to debug and reproduce failures since the agent’s configuration is generated dynamically.\n\n## Conclusion\n\nBoth predefined and on-the-fly subagents will see increased usage. Dynamic agents might find more adoption in general B2C applications. Predefined agents are a great fit for more structured and repeatable enterprise workflows.\n\n[Context Engineering is everything](https://www.philschmid.de/context-engineering). The key to success is giving the LLM the right information and tools at the right time. Using Subagents allows us to create a focused environment for the LLM with a clear, isolated context, specific system instructions, and a limited set of tools for the task. This improves performance and can reduce the cost of reaching the goal.\n\nBut even with a subagent architecture, [reliability is still a challenge](https://www.philschmid.de/agents-pass-at-k-pass-power-k) for agentic systems, breaking down a complex task into smaller subagent functions can make them easier to test and evaluate in isolation.\n\nModels are improving very fast. Don’t over-engineer a solution today that a simpler or better model can solve tomorrow.\n",
  "authors": [],
  "captured_at": "2026-09-27T19:29:15.293681927+00:00",
  "category": "programming",
  "content_html": "<p>There is an increasing use of Subagents to reliably handle specific user goals. We can see this in tools like Claude Code and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://poke.com/\">Poke.com</a>. A subagent is a specialized Agent that is purpose-built for a single, well-defined task. Subagents can be explicit, where a user or model defines them for reuse or implicit and dynamically defined. This addresses a key limitation of monolithic AI agents context pollution. When a single, big and complex agent handles many tasks, its context window, number of tools, can become cluttered and less reliable.</p>\n<h2>What are Subagents?</h2>\n<p>Subagents are specialized AI agents. They are most of the time used in combination with an orchestrator, which delegates tasks to them. A subagent is just like a normal agent and has the same components. This includes a name for identification, a description of its capabilities, system instructions and a set of tools to interact with environments. It also has its own isolated context window.</p>\n<p>Python</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\">            ┌───────────────────┐\n            │    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">User</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Request</span></span>   │\n            └─────────┬─────────┘\n                      │\n                      ▼\n        ┌───────────────────────────┐\n        │   <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Orchestrator</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Agent</span></span>      │\n        │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Analyzes</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Request</span></span>         │\n        │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Decomposes</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Task</span></span>          │\n        │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Delegates</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">to</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Subagents</span></span>   │\n        └───────────┬───────────────┘\n                    │\n┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐\n                    │ <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Isolated</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Execution</span></span>\n                    │\n        ┌───────────┴───────────┬──────────────────┐\n        ▼                       ▼                  ▼\n┌────────────────┐    ┌────────────────┐    ┌────────────────┐\n│ <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Subagent</span></span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">1</span>     │    │ <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Subagent</span></span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">2</span>     │    │ <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Subagent</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">n</span><span class=\"syntax-invalid syntax-illegal syntax-name syntax-python\">...</span></span>  │\n│<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Own</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Context</span></span>   │    │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Own</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Context</span></span>   │    │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Own</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Context</span></span>   │\n│<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Own</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Tools</span></span>     │    │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Own</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Tools</span></span>     │    │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Own</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Tools</span></span>     │\n│<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Solves</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Task</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">A</span></span> │    │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Solves</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Task</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">B</span></span> │    │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Solves</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Task</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">C</span></span> │\n└───────┬────────┘    └─────────┬──────┘    └──────┬─────────┘\n        │                       │                  │\n        └───────────┬───────────┴──────────────────┘\n                    │\n                    ▼\n        ┌───────────────────────────┐\n        │   <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Orchestrator</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Agent</span></span>      │\n        │<span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">-</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Synthesizes</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">all</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">results</span></span>  │\n        └─────────────┬─────────────┘\n                      │\n                      ▼\n            ┌───────────────────┐\n            │   <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Final</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Answer</span></span>    │\n            └───────────────────┘\n</span></span></code></pre>\n<h3>Explicit, User-Defined Subagents</h3>\n<p>Explicit, User-defined Subagents are a permanent team of reusable specialists. Subagent can be defined in a static file or directly in code and the orchestrator uses them trough their name or when a prompt matches its <code>description</code>. Claude Code uses this method. The tools are manually listed in the definition, and the agent is stateless, meaning it starts fresh on every run.</p>\n<p><strong>Pros:</strong></p>\n<ul>\n<li>You have full control over the agent's tools and behavior.</li>\n<li>The agent's actions are very predictable and secure.</li>\n<li>Reusable and easy to test in isolation</li>\n</ul>\n<p><strong>Cons:</strong></p>\n<ul>\n<li>The system is rigid. You must update the definition file to add new tools.</li>\n<li>The orchestrator must manage all the state between steps.</li>\n<li>Hard to scale to hunderds of specialized task.</li>\n</ul>\n<p>Here is a pseudo-code snippet of a definition file, inspired from Claude Code:</p>\n<p>YAML</p>\n<pre><code class=\"language-yaml\"><span class=\"code-snippet\" data-language=\"YAML\"><span class=\"syntax-source syntax-yaml\"><span class=\"syntax-entity syntax-other syntax-document syntax-begin syntax-yaml\">---</span>\n<span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\"><span class=\"syntax-entity syntax-name syntax-tag syntax-yaml\">name</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-mapping syntax-yaml\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-yaml\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-yaml\">&quot;</span>Code-Reviewer<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-yaml\">&quot;</span></span>\n<span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\"><span class=\"syntax-entity syntax-name syntax-tag syntax-yaml\">description</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-mapping syntax-yaml\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-yaml\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-yaml\">&quot;</span>MUST BE USED for reviewing code against style guides and security practices.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-yaml\">&quot;</span></span>\n<span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\"><span class=\"syntax-entity syntax-name syntax-tag syntax-yaml\">tools</span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-mapping syntax-yaml\">:</span> <span class=\"syntax-meta syntax-flow-sequence syntax-yaml\"><span class=\"syntax-punctuation syntax-definition syntax-sequence syntax-begin syntax-yaml\">[</span><span class=\"syntax-string syntax-quoted syntax-single syntax-yaml\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-yaml\">&#39;</span>file_read<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-yaml\">&#39;</span></span><span class=\"syntax-punctuation syntax-separator syntax-sequence syntax-yaml\">,</span> <span class=\"syntax-string syntax-quoted syntax-single syntax-yaml\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-yaml\">&#39;</span>search_code<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-yaml\">&#39;</span></span><span class=\"syntax-punctuation syntax-definition syntax-sequence syntax-end syntax-yaml\">]</span></span>\n<span class=\"syntax-entity syntax-other syntax-document syntax-begin syntax-yaml\">---</span>\n<span class=\"syntax-string syntax-unquoted syntax-plain syntax-out syntax-yaml\">You are an expert security code reviewer. Your purpose is to analyze code and identify vulnerabilities. Provide feedback in a numbered list.</span>\n \n</span></span></code></pre>\n<h3>Implicit, On-the-Fly Subagents</h3>\n<p>Implicit, On-the-Fly Subagents can be created temporary by an orchestrator to handle tasks as they come up. The orchestrator uses a tool (<code>send_message_to_agent</code>) to create and interact with the agent. The system dynamically assigns tools based on the user's natural language request from pre-defined pool which are needed to solve the task. Poke.com uses this method to created unlimited agents for specific user request. A key feature is that these agents can be stateful, e.g. keep context from previous runs when called with the same <code>agent_name</code>.</p>\n<p>Here is a pseudo-code snippet for how the orchestrator calls the agent:</p>\n<p>Python</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> The orchestrator calls this tool to create or reuse a subagent\n</span><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">send_message_to_agent</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n    <span class=\"syntax-variable syntax-parameter syntax-python\">agent_name</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">q3_report_email_draft<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n    <span class=\"syntax-variable syntax-parameter syntax-python\">description</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">An agent specializing in drafting internal company communications, specifically for report summaries and team updates.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n    <span class=\"syntax-variable syntax-parameter syntax-python\">message</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-storage syntax-type syntax-string syntax-python\">f</span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-block syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;&quot;&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-block syntax-python\">Draft an email to the marketing team about the Q3 report.\n \n    TONE &amp; STYLE:\n    - Professional yet approachable and optimistic.\n    - Be concise and data-driven. Avoid corporate jargon.\n    - IMPORTANT: Analyze my last 5 sent emails to the &#39;marketing-team@&#39; mailing list to match my typical writing style, greeting, and sign-off.\n    \n    RULES &amp; CONSTRAINTS:\n    - The subject line must be clear and engaging. Start with &quot;Q3 Report Highlights:&quot;.\n    - Use bullet points to present the key metrics for scannability.\n    - Keep the total email length under 200 words.\n    - End with a clear call to action: ask the team to review the full report and send their feedback for the Q4 planning session by EOD Friday.\n    <span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;&quot;&quot;</span></span></span>\n</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n</span></span></code></pre>\n<ul>\n<li><strong>Pros:</strong>\n<ul>\n<li>The system is very flexible and requires no setup.</li>\n<li>Tools are selected based on the unique user task.</li>\n<li>Multi-step tasks are straightforward because the agent remembers its context.</li>\n</ul>\n</li>\n<li><strong>Cons:</strong>\n<ul>\n<li>The system is less predictable and you have less direct control.</li>\n<li>It might fail if it misunderstands the task and assigns the wrong tools.</li>\n<li>Harder to debug and reproduce failures since the agent’s configuration is generated dynamically.</li>\n</ul>\n</li>\n</ul>\n<h2>Conclusion</h2>\n<p>Both predefined and on-the-fly subagents will see increased usage. Dynamic agents might find more adoption in general B2C applications. Predefined agents are a great fit for more structured and repeatable enterprise workflows.</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.philschmid.de/context-engineering\">Context Engineering is everything</a>. The key to success is giving the LLM the right information and tools at the right time. Using Subagents allows us to create a focused environment for the LLM with a clear, isolated context, specific system instructions, and a limited set of tools for the task. This improves performance and can reduce the cost of reaching the goal.</p>\n<p>But even with a subagent architecture, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.philschmid.de/agents-pass-at-k-pass-power-k\">reliability is still a challenge</a> for agentic systems, breaking down a complex task into smaller subagent functions can make them easier to test and evaluate in isolation.</p>\n<p>Models are improving very fast. Don’t over-engineer a solution today that a simpler or better model can solve tomorrow.</p>\n",
  "content_markdown": "There is an increasing use of Subagents to reliably handle specific user goals. We can see this in tools like Claude Code and [Poke.com](http://poke.com/). A subagent is a specialized Agent that is purpose-built for a single, well-defined task. Subagents can be explicit, where a user or model defines them for reuse or implicit and dynamically defined. This addresses a key limitation of monolithic AI agents context pollution. When a single, big and complex agent handles many tasks, its context window, number of tools, can become cluttered and less reliable.\n\n## What are Subagents?\n\nSubagents are specialized AI agents. They are most of the time used in combination with an orchestrator, which delegates tasks to them. A subagent is just like a normal agent and has the same components. This includes a name for identification, a description of its capabilities, system instructions and a set of tools to interact with environments. It also has its own isolated context window.\n\nPython\n\n```python\n            ┌───────────────────┐\n            │    User Request   │\n            └─────────┬─────────┘\n                      │\n                      ▼\n        ┌───────────────────────────┐\n        │   Orchestrator Agent      │\n        │- Analyzes Request         │\n        │- Decomposes Task          │\n        │- Delegates to Subagents   │\n        └───────────┬───────────────┘\n                    │\n┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐\n                    │ Isolated Execution\n                    │\n        ┌───────────┴───────────┬──────────────────┐\n        ▼                       ▼                  ▼\n┌────────────────┐    ┌────────────────┐    ┌────────────────┐\n│ Subagent 1     │    │ Subagent 2     │    │ Subagent n...  │\n│- Own Context   │    │- Own Context   │    │- Own Context   │\n│- Own Tools     │    │- Own Tools     │    │- Own Tools     │\n│- Solves Task A │    │- Solves Task B │    │- Solves Task C │\n└───────┬────────┘    └─────────┬──────┘    └──────┬─────────┘\n        │                       │                  │\n        └───────────┬───────────┴──────────────────┘\n                    │\n                    ▼\n        ┌───────────────────────────┐\n        │   Orchestrator Agent      │\n        │- Synthesizes all results  │\n        └─────────────┬─────────────┘\n                      │\n                      ▼\n            ┌───────────────────┐\n            │   Final Answer    │\n            └───────────────────┘\n```\n\n### Explicit, User-Defined Subagents\n\nExplicit, User-defined Subagents are a permanent team of reusable specialists. Subagent can be defined in a static file or directly in code and the orchestrator uses them trough their name or when a prompt matches its `description`. Claude Code uses this method. The tools are manually listed in the definition, and the agent is stateless, meaning it starts fresh on every run.\n\n**Pros:**\n\n- You have full control over the agent's tools and behavior.\n- The agent's actions are very predictable and secure.\n- Reusable and easy to test in isolation\n\n**Cons:**\n\n- The system is rigid. You must update the definition file to add new tools.\n- The orchestrator must manage all the state between steps.\n- Hard to scale to hunderds of specialized task.\n\nHere is a pseudo-code snippet of a definition file, inspired from Claude Code:\n\nYAML\n\n```yaml\n---\nname: \"Code-Reviewer\"\ndescription: \"MUST BE USED for reviewing code against style guides and security practices.\"\ntools: ['file_read', 'search_code']\n---\nYou are an expert security code reviewer. Your purpose is to analyze code and identify vulnerabilities. Provide feedback in a numbered list.\n \n```\n\n### Implicit, On-the-Fly Subagents\n\nImplicit, On-the-Fly Subagents can be created temporary by an orchestrator to handle tasks as they come up. The orchestrator uses a tool (`send_message_to_agent`) to create and interact with the agent. The system dynamically assigns tools based on the user's natural language request from pre-defined pool which are needed to solve the task. Poke.com uses this method to created unlimited agents for specific user request. A key feature is that these agents can be stateful, e.g. keep context from previous runs when called with the same `agent_name`.\n\nHere is a pseudo-code snippet for how the orchestrator calls the agent:\n\nPython\n\n```python\n# The orchestrator calls this tool to create or reuse a subagent\nsend_message_to_agent(\n    agent_name=\"q3_report_email_draft\",\n    description=\"An agent specializing in drafting internal company communications, specifically for report summaries and team updates.\",\n    message=f\"\"\"Draft an email to the marketing team about the Q3 report.\n \n    TONE & STYLE:\n    - Professional yet approachable and optimistic.\n    - Be concise and data-driven. Avoid corporate jargon.\n    - IMPORTANT: Analyze my last 5 sent emails to the 'marketing-team@' mailing list to match my typical writing style, greeting, and sign-off.\n    \n    RULES & CONSTRAINTS:\n    - The subject line must be clear and engaging. Start with \"Q3 Report Highlights:\".\n    - Use bullet points to present the key metrics for scannability.\n    - Keep the total email length under 200 words.\n    - End with a clear call to action: ask the team to review the full report and send their feedback for the Q4 planning session by EOD Friday.\n    \"\"\"\n)\n```\n\n- **Pros:**\n  - The system is very flexible and requires no setup.\n  - Tools are selected based on the unique user task.\n  - Multi-step tasks are straightforward because the agent remembers its context.\n- **Cons:**\n  - The system is less predictable and you have less direct control.\n  - It might fail if it misunderstands the task and assigns the wrong tools.\n  - Harder to debug and reproduce failures since the agent’s configuration is generated dynamically.\n\n## Conclusion\n\nBoth predefined and on-the-fly subagents will see increased usage. Dynamic agents might find more adoption in general B2C applications. Predefined agents are a great fit for more structured and repeatable enterprise workflows.\n\n[Context Engineering is everything](https://www.philschmid.de/context-engineering). The key to success is giving the LLM the right information and tools at the right time. Using Subagents allows us to create a focused environment for the LLM with a clear, isolated context, specific system instructions, and a limited set of tools for the task. This improves performance and can reduce the cost of reaching the goal.\n\nBut even with a subagent architecture, [reliability is still a challenge](https://www.philschmid.de/agents-pass-at-k-pass-power-k) for agentic systems, breaking down a complex task into smaller subagent functions can make them easier to test and evaluate in isolation.\n\nModels are improving very fast. Don’t over-engineer a solution today that a simpler or better model can solve tomorrow.\n",
  "dateCreated": "2026-09-27T19:29:15.293681927+00:00",
  "date_created": "2025-09-15T00:00:00+00:00",
  "date_modified": "2025-09-15T00:00:00+00:00",
  "date_published": "2025-09-15T00:00:00+00:00",
  "description": "The rise of subagents is a trend in the AI community. We are seeing more and more use of subagents to reliably handle specific user goals.",
  "external_url": "https://www.philschmid.de/the-rise-of-subagents",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/philschmid-de/2025/09/2025-09-15-the-rise-of-subagents.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/philschmid-de/2025/09/2025-09-15-the-rise-of-subagents.md"
  },
  "id": "urn:aggr:item:0bc559ef9933d39439550e849b5a9d4b762cda8b",
  "isBasedOn": {
    "@id": "https://www.philschmid.de/the-rise-of-subagents"
  },
  "mainEntity": {
    "@id": "https://www.philschmid.de/the-rise-of-subagents",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2025-09-15-the-rise-of-subagents/#webpage"
    },
    "dateModified": "2025-09-15T00:00:00+00:00",
    "datePublished": "2025-09-15T00:00:00+00:00",
    "headline": "The Rise of Subagents",
    "timeRequired": "PT4M",
    "url": "https://www.philschmid.de/the-rise-of-subagents",
    "wordCount": 855
  },
  "name": "Archived snapshot: The Rise of Subagents",
  "preview": null,
  "reading_minutes": 4,
  "replicated_at": null,
  "source": "philschmid-de",
  "source_name": "philschmid.de - RSS feed",
  "summary": "The rise of subagents is a trend in the AI community. We are seeing more and more use of subagents to reliably handle specific user goals.",
  "tags": [],
  "temporalCoverage": "2026-09-27T19:29:15.293681927+00:00",
  "title": "The Rise of Subagents",
  "url": "https://aggr.aymericbeaumet.com/items/philschmid-de/2025-09-15-the-rise-of-subagents/",
  "word_count": 855
}