Представьте себе руководителя аппарата, который исчезает каждый раз, когда вы даете ему крупный проект, и возвращается только после его завершения. Вы бы, вероятно, уволили его немедленно. Хороший руководитель аппарата продвигает проекты в фоновом режиме, оставаясь при этом на связи и информируя вас о ходе работы. Поскольку мы ставим перед агентами всё более масштабные цели, им требуются те же два свойства. Агент должен быть отзывчивым, немедленно реагируя на новую инструкцию с учетом всего предыдущего контекста, и продуктивным, выполняя множество крупных задач одновременно.
Архитектура, которую мы использовали для создания агентов в течение некоторого времени, не может удовлетворить оба требования. В стандартном цикле ReAct каждый вызов длительного инструмента блокирует цикл, и все остальные задачи выстраиваются в очередь. Вместо этого мы наблюдаем, как экосистема переходит к разделению на одного агента, который остается с пользователем, и фоновые процессы, выполняющие длительную работу. Claude Code по умолчанию запускает субагентов в фоновом режиме, OpenAI dots передает работу фоновым процессам, чтобы продвигаться по нескольким направлениям одновременно, а DeepSeek Harness построил своего суперагента вокруг маршрутизатора, который общается с людьми, и фоновых процессов, выполняющих задачи параллельно.
Мы внедряем этот шаблон в Deep Agents с помощью асинхронных субагентов. Оркестратор остается доступным для пользователя и поддерживает организованный контекст беседы, в то время как асинхронные субагенты работают как фоновые процессы и отчитываются о завершении. Объем работы, который может взять на себя агент, теперь растет вместе с количеством фоновых процессов, а не с длиной одного цикла.
Как работают асинхронные субагенты
Агент работает в цикле. Модель вызывает инструмент, ждет результата и решает, что делать дальше. Исторически инструменты и субагенты блокировали этот цикл до тех пор, пока не возвращали ответ, подобно коду, который по очереди ожидает каждый медленный вызов. Асинхронный субагент работает как задача, запущенная с помощью asyncio.create_task или Promise, который вы еще не ожидаете. Вызов возвращается немедленно, работа выполняется независимо в фоновом режиме, а результат приходит позже.
Асинхронная работа зависит от двух свойств системы:
- Пользователь может связаться с оркестратором. Оркестратор — это агент, с которым пользователь взаимодействует напрямую. Субагенты больше не удерживают его цикл, поэтому пользователь может связаться с ним, когда его собственный цикл не занят, вместо того чтобы ждать завершения каждого субагента.
- Задачи выполняются параллельно без блокировки. Оркестратор запускает субагентов по мере поступления работы, вместо того чтобы ждать завершения всей партии.
Оркестратор управляет асинхронными субагентами с помощью пяти инструментов:
- start_async_task запускает субагента в собственном потоке и немедленно возвращает управление.
- check_async_task получает статус задачи и, после ее завершения, результат.
- update_async_task отправляет запущенной задаче новые инструкции.
- cancel_async_task останавливает запущенную задачу.
- list_async_tasks выводит список всех задач и их статусов.
Управление запущенным субагентом отличается от взаимодействия с оркестратором. Когда оркестратор отправляет последующее обновление с помощью update_async_task, поле update_strategy в определении субагента определяет, что произойдет:
- "interrupt" (по умолчанию) останавливает текущее выполнение и перезапускает субагента с новой инструкцией. Используйте это для исправления, например: "используй Postgres вместо этого".
- "enqueue" удерживает последующее обновление до завершения текущего выполнения. Используйте это для дополнения, например: "запусти тесты, когда закончишь".
Как работают уведомления
Каждая незавершенная задача указана в системном промпте оркестратора, поэтому он всегда знает, что находится в процессе выполнения. Он может опрашивать состояние с помощью check_async_task, или задачи могут отчитываться самостоятельно:
- Если оркестратор занят, он проверяет свои незавершенные задачи перед каждым вызовом модели и получает результат в процессе работы.
- Если он простаивает, субагент «будит» его новым запуском.
- Если он приостановлен в ожидании подтверждения, подтверждение остается без изменений, и результат поступает, как только пользователь ответит.
Субагент, которому требуется подтверждение, отображается как ожидающий, и пользователь отвечает в собственном потоке субагента, не прерывая оркестратор. В Managed Deep Agents в Slack запрос отправляется обратно в исходный поток.
Мы ожидаем, что этот шаблон распространится за пределы субагентов на все инструменты в целом. OpenAI недавно добавила поддержку асинхронного вызова инструментов, где модель продолжает работать после вызова инструмента, а ваше приложение отправляет результат обратно в последующем запросе.
Использование асинхронных субагентов
Асинхронные субагенты доступны в Deep Agents для Python и JavaScript, а также в Managed Deep Agents, где для перевода субагента в асинхронный режим требуется всего одно поле:
В Managed Deep Agents каждый обслуживаемый агент также получает асинхронную копию субагента общего назначения, поэтому он может во время выполнения решать, выполнять делегированную работу на переднем или фоновом плане.
Уведомления о задачах находятся в бета-версии, поэтому API может измениться. В репозитории async-deep-agents есть работающий супервизор с субагентами-исследователями и программистами на Python и TypeScript.
Попробуйте асинхронные субагенты и дайте нам знать, что вы думаете, в GitHub issues или на форуме.












