temporality
Изменить страницу↗
Инженерные документы

Асинхронные операции агента (background run_command)

Долгие команды (yarn install, docker build, большой тест-сьют) больше не связывают агенту руки: команда уходит в фон, агент продолжает работать, а результат приходит автоматически — как дополнение в разговор.

#Как это работает

#Запуск: run_command с background: true

{"command": ["bash", "-lc", "yarn install"], "background": true, "timeout_sec": 900}

Модель мгновенно получает ответ вида:

Started in background as operation <operation_id>. Do not wait idle: continue
with other work, and the result (exit code + output tail) will arrive
automatically as a follow-up message. The operation times out after 900 s.
Use kill_operation to cancel it.

Команда исполняется в том же run-контейнере песочницы, вывод стримится в живую консоль операции (в трейсе строка run_command остаётся открытой — с шейдером текущего вывода, как у обычной команды во время исполнения).

#Ожидание и уведомление

Когда модель завершает ход без вызовов тулов, а в фоне что-то ещё работает, ран не завершается: workflow ждёт первое разрешение фоновой операции (завершение, падение, таймаут) или заметку человека. Разрешившиеся операции дренируются пачкой, и в разговор вставляется один батч-отчёт:

[Background operations report]
- <operation_id> finished: exit_code=0 (4m12s)
  output tail:
  exit_code=0
  added 1284 packages in 42s

Still running in the background:
- <operation_id> `docker build -t app .` (running 2m10s, timeout 900s)

Incorporate these results and continue.

Модель получает новый ход, обрабатывает результат и продолжает. Цикл повторяется, пока фон не опустеет и модель не даст финальный ответ.

Если модель уже закончила работу, а фон работает — ран живёт, пока операции не завершатся или не упрутся в свой timeout_sec; исходы журналируются (tool.completed с background: true), но лишних ходов модель не тратит (форс-финал ждёт фоновые операции перед завершением рана).

#Отмена: kill_operation

{"operation_id": "<operation_id>"}

Убивает дерево процессов команды внутри контейнера (TERM, пауза, KILL). Идентичность процесса проверяется по маркеру __TEMPORALITY_OP в его окружении — переиспользованный pid не может привести к убийству постороннего процесса. Финальное состояние отменённой операции приходит обычным уведомлением (exit_code=137 или 143).

#Механика и надёжность

#Ограничения v1