s04
Sous-agents
Planification et coordinationClean Context Per Subtask
151 LOC5 outilsSubagent spawn with isolated messages[]
Subagents use independent messages[], keeping the main conversation clean
s01 > s02 > s03 > [ s04 ] s05 > s06 | s07 > s08 > s09 > s10 > s11 > s12
"Décomposez les grandes tâches ; chaque sous-tâche obtient un contexte propre" -- les sous-agents utilisent des messages[] indépendants, gardant la conversation principale propre.
Problème
Au fur et à mesure que l'agent travaille, son tableau de messages grandit. Chaque lecture de fichier, chaque sortie bash reste dans le contexte en permanence. "Quel framework de test ce projet utilise-t-il ?" pourrait nécessiter la lecture de 5 fichiers, mais le parent n'a besoin que de la réponse : "pytest."
Solution
Parent agent Subagent
+------------------+ +------------------+
| messages=[...] | | messages=[] | <-- fresh
| | dispatch | |
| tool: task | ----------> | while tool_use: |
| prompt="..." | | call tools |
| | summary | append results |
| result = "..." | <---------- | return last text |
+------------------+ +------------------+
Le contexte parent reste propre. Le contexte sous-agent est jeté.
Comment Ça Marche
- Le parent obtient un outil
task. L'enfant obtient tous les outils de base sauftask(pas de génération récursive).
PARENT_TOOLS = CHILD_TOOLS + [
{"name": "task",
"description": "Spawn a subagent with fresh context.",
"input_schema": {
"type": "object",
"properties": {"prompt": {"type": "string"}},
"required": ["prompt"],
}},
]
- Le sous-agent commence avec
messages=[]et exécute sa propre boucle. Seul le texte final retourne au parent.
def run_subagent(prompt: str) -> str:
sub_messages = [{"role": "user", "content": prompt}]
for _ in range(30): # safety limit
response = client.messages.create(
model=MODEL, system=SUBAGENT_SYSTEM,
messages=sub_messages,
tools=CHILD_TOOLS, max_tokens=8000,
)
sub_messages.append({"role": "assistant",
"content": response.content})
if response.stop_reason != "tool_use":
break
results = []
for block in response.content:
if block.type == "tool_use":
handler = TOOL_HANDLERS.get(block.name)
output = handler(**block.input)
results.append({"type": "tool_result",
"tool_use_id": block.id,
"content": str(output)[:50000]})
sub_messages.append({"role": "user", "content": results})
return "".join(
b.text for b in response.content if hasattr(b, "text")
) or "(no summary)"
L'historique complet de messages de l'enfant (possiblement 30+ appels d'outils) est jeté. Le parent reçoit un résumé d'un paragraphe comme un tool_result normal.
Qu'est-ce qui a Changé par Rapport à s03
| Composant | Avant (s03) | Après (s04) |
|---|---|---|
| Outils | 5 | 5 (base) + task (parent) |
| Contexte | Partagé unique | Isolation parent + enfant |
| Sous-agent | None | fonction run_subagent() |
| Retour | N/A | Texte de résumé seulement |
Essayer
python agents/s04_subagent.py
Utiliser une sous-tâche pour trouver quel framework de test ce projet utiliseDéléguer : lire tous les fichiers .py et résumer ce que chacun faitUtiliser une task pour créer un nouveau module, puis le vérifier d'ici
