Skip to main content
Back to timeline
langchain.comSource publication:

Deep Agents makes subagents async: the orchestrator answers whenever its own loop is free while long tasks run in parallel

Synopsis

Deep Agents adds async subagents: an orchestrator stays in the foreground talking to the user and organizing context, while subagents run long tasks as background workers and report back on completion. Previously, in a standard ReAct loop, each long tool call blocked the loop and every other task queued behind it; now subagents no longer hold the orchestrator's loop, the user can reach it whenever its own loop isn't busy, and the work an agent can take on grows with the number of background workers rather than the length of one loop.

Source-provided article image: Agents Are Going Async
langchain.com

Interpretation

As agents take on bigger goals, they need to be both responsive to the user and productive across many long tasks at once. The standard ReAct loop used to build agents for a long time cannot meet both: each long tool call blocks the loop and every other task queues behind it. The same split is appearing across the ecosystem: Claude Code runs subagents in the background by default, OpenAI's dots hand work to background workers to make progress on several things at once, and DeepSeek Harness built its super agent around a router that talks to people plus background workers that run tasks in parallel.

An orchestrator stays available to the user and keeps the conversation's context organized, while async subagents run as background workers and report back when they finish. An async subagent works like a task started with asyncio.create_task or a Promise not yet awaited: the call returns right away, the work runs independently in the background, and the result comes back later. The orchestrator manages async subagents with five tools: start_async_task starts a subagent on its own thread and returns right away, check_async_task gets a task's status and its result once finished, update_async_task sends a running task new instructions, cancel_async_task stops a running task, and list_async_tasks lists every task and its status.

A follow-up sent to a running subagent is handled according to the update_strategy field on that subagent's definition. interrupt, the default, stops the current run and restarts the subagent with the new instruction, for a correction such as using Postgres instead; enqueue holds the follow-up until the current run finishes, for an addition such as running the tests when done. Every unfinished task is listed in the orchestrator's system prompt; a busy orchestrator checks its unfinished tasks before each model call and picks up results mid-run, an idle one is woken by the subagent with a new run, and one paused on an approval leaves the approval alone while the result arrives once the user answers.

Perspective

Async subagents are available in Deep Agents for Python and JavaScript and in Managed Deep Agents, where making a subagent async takes one field; task notifications are in beta and the API may still change.

Task notifications are in beta, so the API may still change; the publisher's expectation that the async pattern generalizes to tools across the board is a projection, not a verified result.