Lesson 11 · 協力

自分で仕事を探すエージェント

「エージェントが自ら仕事を見つけます。」命令を送信するのに人間は必要ありません。作業自体はタスクボードから取得されます。

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

「目覚める」から「自分の仕事を見つける」まで

s09 / s10 のチームメイトはパッシブです。メールボックスが機能し始める前に、誰かがメールボックスを介してメッセージを送信する必要があります。完了するとアイドル状態になり、再びウェイクアップされます。

S11 の自律的なチームメイト アクティブ: 仕事がなくても実際には止まりません。 .tasks/ ディレクトリを 5 秒ごとにスキャンします。所有されていないタスクが見つかると、claim_task がそれを要求して作業を開始します。

Teammate lifecycle:
  +-------+
  | spawn |
  +---+---+
      |
      v
  +-------+
  | WORK  | <-- LLM tool_use 循环
  +---+---+
      |
      | stop_reason != tool_use OR tool_use("idle")
      v
  +-------+
  | IDLE  | poll 每 5s,共 12 次 = 60s 超时
  +---+---+
      |
      +--> inbox 有新消息?  → resume WORK
      |
      +--> scan .tasks/,发现未认领 → claim → resume WORK
      |
      +--> 60s 什么都没等到 → status = shutdown,线程退出

自動請求・タスクボードから「受注」

コア機能:

def scan_unclaimed_tasks() -> list:
    unclaimed = []
    for f in sorted(TASKS_DIR.glob("task_*.json")):
        task = json.loads(f.read_text())
        if (task.get("status") == "pending"
                and not task.get("owner")
                and not task.get("blockedBy")):
            unclaimed.append(task)
    return unclaimed

3 つのフィルタ = 保留中 + 所有者なし + ブロック対象なし。どちらも欠かせないものです。

要求アクション自体には、2 つのエージェントが同じ未要求タスクを同時に取得することを防ぐためのロック (_claim_lock) があります。ロックを再度読み取り、所有者がまだ空かどうかを確認し、「in_progress」マークと所有者をディスクに書き込みます。

複数のエージェントをシミュレートしてタスクボードを同時にスキャンします

3 人のチームメイトがアイドル状態にあり、3 つのタスクが要求を待っています。 「次のラウンドをスキャン」をクリックして、誰が最初にそれを獲得するかを確認します。

アイデンティティの再注入 · 圧縮後も自分が誰であるかがわかります

s06 は、auto_compact がメッセージを概要に置き換えると述べました。自律エージェントは、数時間実行した後でも簡単にトリガーできます。圧縮後は、モデルはその名前や役割を認識しません。

S11 のコツ: 新しいタスクを要求するときに、len(messages) ≤ 3 (圧縮されたばかりであることを示す) の場合、ヘッダーに ID ブロックを自動的に挿入します。

if len(messages) <= 3:
    messages.insert(0, {
        "role": "user",
        "content": f"<identity>You are 'alice', role: coder, team: my-team. Continue your work.</identity>",
    })
    messages.insert(1, {"role":"assistant", "content": f"I am alice. Continuing."})

このモードはアイデンティティ再注入と呼ばれます。これは、人工的に構築された一連の対話を使用して「モデルに自分が誰であるかを伝える」ことで、キャラクターの感覚を取り戻すことができます。

Interactive

Widget 1 · タスク スキャナー - 3 人のエージェントが 3 つのタスクを取得します

アリス/ボブ/チャーリーはみんな暇です。 「スキャン」をクリックして、最初の未申請タスクを誰が申請しているかをアルファベット順で確認します。

.tasks/ 目录
Teammates 状态
所有人都 idle,等着扫
Interactive

Widget 2 · ID ドリフト · 圧縮後、エージェントはまだ自分自身を覚えていますか?

「あなたは誰ですか?」に対するエージェントの回答の比較シミュレーション コンテキスト圧縮の前後。 ID を再注入しないとどうなりますか?

没有 identity 重注入
有 identity 重注入
Interactive

Widget 3 · 自律型 vs 支援型 · どの役割が自律型に適しているか

このロールに自律サイクルを実行させるか、受動的にスタンバイ状態にするかを決定します。 「制御不能のコスト」と「人間の介入の頻度」を考えてみましょう。

答对 0 / 5