Lesson 08 · 同時

エージェントをブロックせずにエージェントを単独で実行させます。

「起動したら忘れる - コマンドの実行中、エージェントはブロックしません。」

⏱ 約 10 分 · 📝 3 つのインタラクティブ要素 · 🧑‍💻 出典 shareAI-lab · s08_background_tasks.py

通話をブロックする苦痛

S02 の bash ツールは同期です: subprocess.run(..., timeout=120)npm install のようなコマンドの実行には 90 秒かかり、エージェント ループ全体が 90 秒間停止します。ユーザーは、端末がハングアップしているのか、動作しているのかわからず、端末を見つめます。

s08 の解決策: エージェントに background_run ツールを提供します。すぐに task_id が返され、コマンドは別のスレッドで実行されます。エージェントはループを続けて他のことを行います。 bg タスクが完了すると、 結果が通知キューに追加されます。

def run(self, command: str) -> str:
    task_id = str(uuid.uuid4())[:8]
    self.tasks[task_id] = {"status":"running", ...}
    thread = threading.Thread(target=self._execute, args=(task_id, command), daemon=True)
    thread.start()
    return f"Background task {task_id} started"   # 立即返回

結果をエージェントに返すにはどうすればよいですか?

重要なのはスレッドセーフなキューです。BG スレッドが完了すると、キューに追加されます。 メインスレッドによる各 LLM 呼び出しの前にキューが空になり、完了通知がユーザーメッセージとしてメッセージに詰め込まれます。

def agent_loop(messages):
    while True:
        # Drain bg notifications before each LLM call
        notifs = BG.drain_notifications()
        if notifs:
            messages.append({
                "role": "user",
                "content": f"<background-results>{notif_text}</background-results>",
            })
        response = client.messages.create(...)
        ...

このようにして、エージェントは N 番目のラウンドで bg タスクを生成します。タスクが N+3 ラウンドで完了すると、次の LLM 呼び出しで自動的に結果が返されます。モデルは <background-results> ブロックを見たときに「ああ、そのタスクは終了したので、続行します。」と認識します。

タイムラインのデモ

次のウィジェットを使用すると、メイン スレッドが毎秒動作します (エージェントのサイクル ビートをシミュレートします)。 bg タスクはいつでも生成できます。 2 つの手がかりが「流出点」でどのように出会うかに注目してください。

どのコマンドをバックグラウンドに配置する必要がありますか?

すべてのコマンドをバックグラウンドにスローする必要はありません。基準は 2 つあります:

<オル>
  • 時間がかかる: 数秒以内の同期実行はより簡単で、キューを維持する必要がなくなります。
  • 結果の重要性: 結果が次のステップですぐに使用される場合 (例: cat file.txt の直後に grep が続く)、背景は意味がありません。それでも待機する必要があります。
  • Interactive

    Widget 1 · タイムライン · メインスレッド + 2 つの bg スレッド

    「スポーン」をクリックして、作業を bg スレッドにディスパッチします。メインスレッドはティックごとに通知キューをチェックします。 3 つのスイム レーンがどのように絡み合っているかを見てください。

    🧠 Main (agent loop)
    ⚙ Background thread A
    (idle)
    ⚙ Background thread B
    (idle)
    queue: []
    Interactive

    Widget 2 · Fire & Forget Judgment · 8 つのコマンド、どれが支持する価値がありますか?

    コマンドごとにフォアグラウンド (同期など) またはバックグラウンド (非同期スポーン) を選択します。 「結果を待つべきか」+「時間がかかる」という2つの側面に注目してください。

    答对 0 / 8
    Interactive

    Widget 3 · 排出タイミング・通知が表示されたラウンド

    重要なルール: メインスレッドは、各 LLM 呼び出しのにキューを排出します。 5つのシナリオを教えてください。回答: bg タスクが完了した後、どのラウンドで結果がエージェントの視野に入りますか。

    答对 0 / 5