Wichtigste Erkenntnisse
- Während Agents größere Ziele verfolgen, müssen sie für den Nutzer erreichbar bleiben und gleichzeitig an vielen langen Aufgaben Fortschritte erzielen.
- Asynchrone Subagents teilen einen Agenten in einen Orchestrator, der für den Nutzer erreichbar bleibt, und in Subagents auf, die Aufgaben im Hintergrund ausführen und nach Abschluss an den Orchestrator zurückmelden.
- Hintergrundarbeit wird zum Standard für Agent-Infrastruktur, von Coding-Agents wie Claude Code bis hin zu persönlichen Agents wie OpenAIs dots.
Stellen Sie sich einen Chef vom Dienst vor, der jedes Mal verschwindet, wenn man ihm ein großes Projekt übergibt, und erst zurückkommt, wenn es abgeschlossen ist. Man würde ihn wahrscheinlich sofort entlassen. Ein guter Chef vom Dienst treibt Projekte im Hintergrund voran, bleibt erreichbar und hält einen unterwegs auf dem Laufenden. Wenn wir von Agents verlangen, dass sie auf größere Ziele hinarbeiten, brauchen sie dieselben zwei Eigenschaften. Ein Agent muss reaktionsschnell sein, also eine neue Anweisung sofort mit dem Kontext aller vorherigen Anweisungen umsetzen, und produktiv, also bei vielen großen Aufgaben gleichzeitig Fortschritte machen.
Die Architektur, mit der wir seit einiger Zeit Agents bauen, kann beide Anforderungen nicht erfüllen. In einer standardmäßigen ReAct-Schleife blockiert jeder lange Tool-Aufruf die Schleife, und jede andere Aufgabe reiht sich dahinter ein. Stattdessen beobachten wir, dass sich das Ökosystem auf eine Aufteilung zwischen einem Agenten, der beim Nutzer bleibt, und Hintergrund-Workern, die die lange Arbeit erledigen, einigen wird. Claude Code führt Subagents standardmäßig im Hintergrund aus, OpenAIs dots geben Arbeit an Hintergrund-Worker weiter, um bei mehreren Dingen gleichzeitig Fortschritte zu machen, und DeepSeek Harness hatte seinen Super-Agenten um einen Router aufgebaut, der mit Menschen kommuniziert, und Hintergrund-Worker, die Aufgaben parallel ausführen.
Wir bringen dieses Muster in Deep Agents mit asynchronen Subagents. Ein Orchestrator bleibt für den Nutzer erreichbar und hält den Kontext der Konversation geordnet, während asynchrone Subagents als Hintergrund-Worker laufen und sich nach Abschluss zurückmelden. Die Arbeitsmenge, die der Agent übernehmen kann, wächst dann mit der Anzahl der Hintergrund-Worker statt mit der Länge einer einzelnen Schleife.
Wie asynchrone Subagents funktionieren
Ein Agent läuft in einer Schleife. Das Modell ruft ein Tool auf, wartet auf das Ergebnis und entscheidet, was als Nächstes zu tun ist. Historisch blockierten Tools und Subagents diese Schleife, bis sie zurückkehrten, wie Code, der jeden langsamen Aufruf nacheinander awaited. Ein asynchroner Subagent funktioniert wie eine mit asyncio.create_task gestartete Aufgabe oder ein Promise , den man noch nicht awaited. Der Aufruf kehrt sofort zurück, die Arbeit läuft unabhängig im Hintergrund, und das Ergebnis kommt später zurück.
Asynchrone Arbeit hängt von zwei Eigenschaften des Systems ab:
- Der Nutzer kann den Orchestrator erreichen. Der Orchestrator ist der Agent, mit dem der Nutzer direkt interagiert. Subagents blockieren seine Schleife nicht mehr, sodass der Nutzer ihn jederzeit erreichen kann, wenn seine eigene Schleife nicht beschäftigt ist, statt zu warten, bis jeder Subagent fertig ist.
- Aufgaben laufen parallel, ohne zu blockieren. Der Orchestrator startet Subagents, sobald Arbeit ankommt, statt zu warten, bis ein ganzer Stapel zurückkehrt.
Der Orchestrator verwaltet asynchrone Subagents mit fünf Tools:
start_async_taskstartet einen Subagenten in einem eigenen Thread und kehrt sofort zurück.check_async_taskruft den Status einer Aufgabe ab und nach Abschluss deren Ergebnis ab.update_async_tasksendet einer laufenden Aufgabe neue Anweisungen.cancel_async_taskstoppt eine laufende Aufgabe.list_async_taskslistet jede Aufgabe und ihren Status auf.
Das Steuern eines laufenden Subagenten ist etwas anderes als den Orchestrator zu erreichen. Wenn der Orchestrator ein Follow-up mit update_async_tasksendet, entscheidet das update_strategy -Feld in der Definition dieses Subagenten, was passiert:
"interrupt"(der Standard) stoppt den aktuellen Lauf und startet den Subagenten mit der neuen Anweisung neu. Verwenden Sie dies für eine Korrektur wie "verwende stattdessen Postgres.""enqueue"hält das Follow-up zurück, bis der aktuelle Lauf abgeschlossen ist. Verwenden Sie dies für eine Ergänzung wie "führe die Tests aus, wenn du fertig bist."
Wie Benachrichtigungen funktionieren
Jede unvollendete Aufgabe wird im Systemprompt des Orchestrators aufgeführt, sodass er immer weiß, was gerade in Arbeit ist. Er kann mit check_async_task abfragen, oder Aufgaben können von sich aus zurückmelden:
- Wenn der Orchestrator beschäftigtist, prüft er seine unvollendeten Aufgaben vor jedem Modellaufruf und nimmt das Ergebnis während des Laufs auf.
- Wenn er inaktivist, weckt der Subagent ihn mit einem neuen Lauf.
- Wenn er pausiert auf eine Freigabe wartet, bleibt die Freigabe unangetastet, und das Ergebnis trifft ein, sobald der Nutzer antwortet.
Ein Subagent, der eine Freigabe benötigt, erscheint als waiting, und der Nutzer antwortet im eigenen Thread des Subagenten, ohne den Orchestrator zu unterbrechen. In Managed Deep Agents auf Slack wird die Anfrage in den ursprünglichen Thread zurückgeschickt.
Wir erwarten, dass sich dieses Muster über Subagents hinaus auf Tools im Allgemeinen verallgemeinern lässt. OpenAI hat kürzlich Unterstützung für asynchrones Tool-Aufrufenhinzugefügt, bei dem das Modell nach dem Aufruf eines Tools weiterarbeitet und Ihre Anwendung das Ergebnis in einer späteren Anfrage zurücksendet.
Asynchrone Subagents verwenden
Asynchrone Subagents sind in Deep Agents für Python und JavaScriptsowie in Managed Deep Agentsverfügbar, wobei dort das Asynchron-Machen eines Subagents nur ein Feld erfordert:
from managed_deepagents import define_deep_agent
agent = define_deep_agent(
name="research-assistant",
model="openai:gpt-5.5",
subagents=[
{
"name": "researcher",
"description": "Researches a topic in the background.",
"system_prompt": "Research the topic and report your findings.",
"async": True,
},
],
)In Managed Deep Agents erhält jeder ausgelieferte Agent außerdem eine asynchrone Kopie des general-purpose Subagent, sodass er zur Laufzeit entscheiden kann, ob delegierte Arbeit im Vordergrund oder im Hintergrund ausgeführt wird.
Task-Benachrichtigungen befinden sich in der Beta, daher kann sich die API noch ändern. Das Repo async-deep-agents enthält einen funktionierenden Supervisor mit Researcher- und Coder-Subagents in Python und TypeScript.
Probieren Sie asynchrone Subagents aus und teilen Sie uns Ihre Meinung in den GitHub Issues oder im Forum mit..