Урок 08 · одновременно

Позвольте агенту работать самостоятельно, не блокируя его.

「Fire and forget — the agent doesn't block while the command runs.」

⏱ ~10 мин · 📝 3 интерактивных компонента · 🧑‍💻 На основе shareAI-lab · s08_background_tasks.py

Боль от блокировки звонков

Инструмент 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), фон не имеет смысла — вам все равно придется его ждать.
  • Интерактив

    Виджет 1 · Хронология · Основная тема + 2 темы

    Нажмите «Создать», чтобы передать работу в поток bg. Основной поток проверяет очередь уведомлений каждый тик. Посмотрите, как переплетаются три плавательные дорожки.

    🧠 Main (agent loop)
    ⚙ Background thread A
    (idle)
    ⚙ Background thread B
    (idle)
    queue: []
    Интерактив

    Виджет 2 · Выстрели и забудь Решение · 8 команд, какие из них стоит поддержать?

    Выберите передний план (синхронный и т. д.) или фон (асинхронный запуск) для каждой команды. Обратите внимание на два аспекта «стоит ли ждать результата» + «затраты времени».

    答对 0 / 8
    Интерактив

    Виджет 3 · Время слива · В каком раунде было видно уведомление

    Ключевое правило: основной поток опустошает очередь перед каждым вызовом LLM. Предложите вам 5 сценариев. Ответ: После выполнения бг-задачи, в каком раунде результаты попадут в поле зрения агента.

    答对 0 / 5