Позвольте агенту работать самостоятельно, не блокируя его.
「Fire and forget — the agent doesn't block while the command runs.」
Боль от блокировки звонков
Инструмент bash в S02 является синхронным: subprocess.run(..., timeout=120). Выполнение такой команды, как npm install, занимает 90 секунд, а весь цикл агента зависает на 90 секунд. Пользователь смотрит на терминал, не зная, завис он или работает.
Решение проблемы s08: дайте агенту инструмент background_run. Он немедленно возвращает task_id, и команда запускается в другом потоке. Агент продолжает работать в цикле и делать другие вещи; когда задача bg завершена, результаты добавляются в очередь уведомлений.
def запустить(self, команда: str) -> str: Task_id = str(uuid.uuid4())[:8] self.tasks[task_id] = {"статус":"running", ...} thread = threading.Thread(target=self._execute, args=(task_id, команда), daemon=True) поток.start() return f"Фоновая задача {task_id} запущена" # Немедленно вернуться
Как вернуть результат агенту?
Ключом является потокобезопасная очередь: когда поток bg завершается, он добавляется в очередь; перед каждым вызовом LLM основным потоком очередь опорожняется, а уведомление о завершении вставляется в сообщения как пользовательские сообщения.
def agent_loop(сообщения): в то время как True: # Сливать уведомления о фоновом режиме перед каждым вызовом LLM notifs = BG.drain_notifications() if уведомления: messages.append({ "роль": "пользователь", "content": f"<background-results>{notif_text}</background-results>", }) ответ = client.messages.create(...) ...
Таким образом, агент создает задачу bg в N-м раунде. Когда задача будет выполнена в раунде N+3, следующий вызов LLM автоматически принесет результаты — модель узнает, когда увидит блок <background-results>: «О, эта задача завершена, я продолжу».
Демо-шкала времени
Следующий виджет позволяет моделировать: основной поток тикает каждую секунду (имитируя такт цикла агента); вы можете создать задачу bg в любое время. Посмотрите, как две подсказки встречаются в «точке слива».
Какие команды следует размещать в фоновом режиме?
Не все команды следует переводить в фоновый режим. Есть два критерия:
<ол>cat file.txt, за которым сразу следует grep), фон не имеет смысла — вам все равно придется его ждать.