Skip to content
チュートリアル14分で読めます

見る、止める、巻き戻す:Potatoのライブコーディングエージェント観察

Ollama、Anthropic API、Claude Agent SDKでライブコーディングエージェント観察をセットアップするチュートリアルです。一時停止、ロールバック、分岐、トラジェクトリのエクスポートを扱います。

Potato Team

ライブ観察は何が違うのか

コーディングエージェントの評価はたいてい事後に行われます。エージェントが実行されてトレースを出力し、レビュアーが後からその記録を細かく見ていく形です。ライブ観察は順序が逆です。アノテーターはエージェントの作業をリアルタイムで見守り、ファイルの編集、ターミナルコマンド、推論ステップをそれぞれ発生した時点で確認します。

これでできることが変わります。エージェントが誤った方向に進み始めたら、そこで時間を無駄にする前にアノテーターが介入できます。エージェントが次に進む前に一時停止してdiffをじっくり読むことも、平易な言葉で指示を送って進路を変えることもできます。私が一番役に立つと思っているのはロールバックです。過去の任意のチェックポイントまで巻き戻して、エージェントに別のアプローチを試させられます。こうして生まれる分岐は、まさに選好学習が必要とする種類のデータです。

これは静的なトレースアノテーションの代わりにはなりません。生まれるデータの種類が違います。予測可能なコストで大量のデータを集めたいなら静的アノテーションが向いています。狙いを絞ったデータが欲しいとき、エージェントの失敗の仕方を理解したいとき、分岐する選好ペアを作りたいときはライブ観察が向いています。

機能の完全なリファレンスはソースドキュメントを参照してください。

ライブコーディングエージェントのインターフェースはエージェントのアクションをリアルタイムでストリーミングし、作業中のコードdiffとターミナル出力を表示します。

リアルタイムのコードdiffとターミナル出力を表示するライブコーディングエージェントのインターフェースリアルタイムのdiff描画とターミナル出力を備えたライブコーディングエージェント観察

3つのバックエンド

Potatoにはライブ観察用のバックエンドが3つあります。いずれもコーディングエージェントをサンドボックス内で実行し、そのアクションを発生と同時にインターフェースへストリーミングします。

Ollama(完全ローカル)

Ollamaバックエンドは、APIキーもネットワーク通信も使わず、すべて手元のマシンで動きます。コードベースが機微な場合や、API料金をかけずに試したいだけの場合に選んでください。

まずOllamaをインストールし、ツール使用に対応したモデルを取得します。

bash
# Install Ollama
curl -fsSL https://ollama.ai/install.sh | sh
 
# Pull a coding-capable model
ollama pull qwen2.5-coder:32b
 
# Verify the model is available
ollama list

PotatoがOllamaバックエンドを使うように設定します。

yaml
# config.yaml
annotation_task_name: "Live Agent Observation - Ollama"
port: 8000
 
live_coding_agent:
  backend_type: ollama_tool_use
  ai_config:
    model: "qwen2.5-coder:32b"
    base_url: "http://localhost:11434"
    temperature: 0.2
    max_tokens: 4096
  working_dir: ./workspace       # Agent's working directory
  max_turns: 50
  sandbox_mode: container        # container (default) | bubblewrap | trusted
  sandbox_image: "python:3.11-slim"

Anthropic API(ツール使用付きのClaude)

Anthropic APIバックエンドは、ツール使用に対応したClaudeモデルに接続します。ほとんどのローカルモデルより推論とコード生成が強く、その代わりAPI呼び出しの費用がかかります。

bash
# Set your API key
export ANTHROPIC_API_KEY="sk-ant-..."
yaml
# config.yaml
annotation_task_name: "Live Agent Observation - Claude"
port: 8000
 
live_coding_agent:
  backend_type: anthropic_tool_use
  ai_config:
    model: "claude-sonnet-4-20250514"
    max_tokens: 8192
    temperature: 0.1
  system_prompt: >
    You are a coding agent. You will be given a task description and
    access to a codebase. Use the provided tools to read files, make
    edits, and run commands to complete the task. Think step by step
    and verify your changes by running tests.
  working_dir: ./workspace
  max_turns: 50
  sandbox_mode: container
  sandbox_image: "python:3.11-slim"

Claude Agent SDK(Claude Codeの全機能)

Claude Agent SDKバックエンドは3つの中で最も高機能で、Claude Codeのツール一式と自律的な挙動をすべて使えます。claude-agent-sdkパッケージが必要です。

bash
# Install the Claude Agent SDK
pip install claude-agent-sdk
yaml
# config.yaml
annotation_task_name: "Live Agent Observation - Claude Agent SDK"
port: 8000
 
live_coding_agent:
  backend_type: claude_sdk
  ai_config:
    model: "claude-sonnet-4-20250514"
  working_dir: ./workspace
  max_turns: 50                  # Maximum number of agent turns
  sandbox_mode: container
  sandbox_image: "node:20-slim"

アノテーションの流れ

サーバーが立ち上がると、ライブ観察のセッションはいくつかの段階を経て進みます。

セッションを始める

アノテーターがPotatoのインターフェースを開くと、タスク説明の入力欄が表示されます。エージェントに完了させたいタスクを貼り付けるか入力します。たとえば「新しい設定形式が原因で失敗しているtests/test_parser.pyのテストを直す」や「/api/usersエンドポイントにページネーションを追加する」などです。

bash
# Start the server
potato start config.yaml -p 8000

アノテーターが「Start Agent」をクリックすると、コーディングエージェントが作業を始めます。各アクションはCodingTraceDisplayパネルにリアルタイムで表示されます。

エージェントの作業を見守る

エージェントが動いている間、各ステップがトレースビューアに現れます。

  • 思考ステップは、エージェントの推論を示す折りたたみ可能なグレーのブロックとして表示されます。
  • ファイルの読み取りは、行番号とファイルパス付きのシンタックスハイライトされたコードブロックとして表示されます。
  • ファイルの編集は、赤と緑でハイライトされたunified diffとして表示されます。
  • ターミナルコマンドは、コマンド、出力、終了コードを含む暗色のターミナルブロックとして表示されます。
  • ファイルツリーは、ファイルが作成、変更、読み取りされるたびにサイドバーで更新されます。

上部の進捗表示には、現在のステップ番号と経過時間が出ます。エージェントの状態は「Thinking...」「Editing file...」「Running command...」などと表示されます。

一時停止と指示のコントロール

エージェントの実行中、アノテーターはコントロールバーから介入できます。

Pause:現在のステップが完了した時点でエージェントを止めます。再開するまで次のステップには進みません。エージェントが先に進む前にdiffやターミナル出力をじっくり確認したいときに使います。

Send Instruction:一時停止中(あるいは実行中でも)に自然言語のメッセージを入力すると、それがエージェントのコンテキストに挿入されます。たとえば「データベーススキーマは変更せず、マイグレーションを使ってください」や「変更する前に/var/log/app.logのエラーログを確認してください」といった具合です。

Resume:一時停止したエージェントの実行を再開します。

Stop:エージェントのセッションを完全に終了します。その時点までのトラジェクトリは保存されます。

アノテーターは、トレース表示と並べてPRMアノテーションでエージェントの作業を評価できます。

コーディングエージェントのトレースと並べたプロセス報酬アノテーションコーディングトレースと並べてステップ単位の正確性をラベル付けするPRMアノテーションインターフェース

コントロールバーはライブコーディングエージェントのビューアに付属しています。一時停止、再開、指示の挿入、停止、ロールバック、ブランチの切り替えは、インターフェースがライブエージェントのエンドポイントを通じて実行するセッション操作なので、設定で有効にするものはありません。

Gitベースのチェックポイントシステム

ロールバック、分岐、トラジェクトリのエクスポートはすべてチェックポイントシステムの上に成り立っています。このシステムは、エージェントがファイルを変更するたびにgitへコミットします。

仕組み

セッションが始まると、Potatoはサンドボックスのワークスペースにgitリポジトリを初期化します。既にある場合はそれを使います。ファイルを編集するたびに、構造化されたメッセージを付けて自動でコミットします。

text
[potato-checkpoint] Step 7: Edit src/parser.py
- Modified lines 45-52
- Agent reasoning: Fix the regex pattern to handle escaped quotes

結果として、トラジェクトリのステップと1対1で対応する直線的なコミット履歴ができます。各チェックポイントは、その時点のワークスペースの状態をすべて記録しています。

bash
# You can inspect checkpoints directly with git
cd workspace/
git log --oneline
 
# Output:
# f8a2c1d [potato-checkpoint] Step 12: Edit tests/test_parser.py
# 3b7e9f0 [potato-checkpoint] Step 10: Edit src/parser.py
# a1c4d8e [potato-checkpoint] Step 8: Edit src/parser.py
# 9e2f6b3 [potato-checkpoint] Step 5: Edit src/config.py
# 7d0a3c1 [potato-checkpoint] Step 0: Initial state

ロールバック

「Rollback」をクリックし、ドロップダウンから過去の任意のチェックポイントを選びます。Potatoはgit checkoutでワークスペースをその状態に戻し、トラジェクトリの表示も合わせて巻き戻します。その後エージェントは、コンテキストをそのステップまで切り詰めた状態でそこから再開します。

エージェントが誤った方向に進んだのを見たときに使います。そのまま走らせて時間を浪費させる代わりに、最後に良かった状態まで巻き戻して再挑戦させます。より良い方向へ促す指示を添えてもかまいません。

トラジェクトリの分岐

分岐は、両方の経路を残すロールバックです。巻き戻したあとエージェントが別の道を進むと、Potatoは名前付きのgitブランチを作り、両方のトラジェクトリを追跡します。

text
Step 0 → Step 1 → Step 2 → Step 3 → Step 4 (Branch A: original path)
                          ↘
                           Step 3' → Step 4' → Step 5' (Branch B: after rollback)

任意のチェックポイントから分岐でき、トラジェクトリの木全体を組み上げられます。これは選好学習に役立ちます。分岐のペアはどれもそれ自体がラベル付きの比較になっているからです。Branch Aが誤りだと判断したから巻き戻したのであり、分岐点から先はBranch Bが選好された経路になります。

分岐にも設定は要りません。ロールバックした後にエージェントが別の経路を進むとPotatoがブランチを作り、セッションの残りの間、両方のトラジェクトリを追跡します。

エクスポート形式

ライブセッションは詳細なトラジェクトリデータを生成します。何を訓練するかに応じて、いくつかの形でエクスポートできます。

直線的なトラジェクトリのエクスポート

各分岐を独立したトラジェクトリとしてエクスポートします。

bash
python -m potato.export \
  -c config.yaml \
  -f trajectory_correction \
  -o ./training_data/
json
{
  "session_id": "session_001",
  "branch": "branch-A",
  "task": "Fix the failing test in tests/test_parser.py",
  "steps": [
    {"step_idx": 0, "type": "file_read", "path": "tests/test_parser.py", "...": "..."},
    {"step_idx": 1, "type": "thinking", "content": "The test expects..."},
    {"step_idx": 2, "type": "file_edit", "path": "src/parser.py", "diff": "..."},
    {"step_idx": 3, "type": "bash_command", "command": "pytest tests/test_parser.py"}
  ],
  "human_interventions": [
    {"after_step": 2, "type": "instruction", "content": "Use a migration instead"}
  ],
  "rollback_from_step": null,
  "outcome": "resolved"
}

分岐からの選好ペア

分岐のペアを、DPOやRLHF用の選好データとしてエクスポートします。

これも同じエクスポーターが書き出します。出力ディレクトリのtrajectory_dpo.jsonlに分岐の比較が選好ペアとして入り、trajectory_sft.jsonlとtrajectory_corrections.jsonも並んで出力されます。

bash
python -m potato.export \
  -c config.yaml \
  -f trajectory_correction \
  -o ./training_data/
json
{
  "session_id": "session_001",
  "task": "Fix the failing test in tests/test_parser.py",
  "branch_point_step": 2,
  "branch_point_reason": "Agent started modifying the wrong file",
  "rejected_branch": "branch-A",
  "rejected_steps": [
    {"step_idx": 3, "type": "file_edit", "path": "src/wrong_file.py", "...": "..."},
    {"step_idx": 4, "type": "bash_command", "command": "pytest", "exit_code": 1}
  ],
  "chosen_branch": "branch-B",
  "chosen_steps": [
    {"step_idx": 3, "type": "file_edit", "path": "src/parser.py", "...": "..."},
    {"step_idx": 4, "type": "bash_command", "command": "pytest", "exit_code": 0}
  ]
}

ライブ観察からのPRMラベル

ロールバックした地点はたいてい最初のエラーのステップなので、ライブ観察とPRMラベリングを組み合わせられます。

bash
python -m potato.export \
  -c config.yaml \
  -f coding_eval \
  -o ./training_data/ \
  --option types=prm

ここでは、ロールバックの起点になったステップが最初のエラーとしてラベル付けされ、新しい分岐のステップは受け入れたものなので正しいとラベル付けされます。

コードレビューのデータセット

アノテーターの指示とロールバックの理由を、コードレビューの訓練データとしてエクスポートします。

bash
python -m potato.export \
  -c config.yaml \
  -f coding_eval \
  -o ./training_data/ \
  --option types=code_review

通しのクイックスタート

何もない状態からOllamaのセッションを動かすまでの全手順です。

bash
# 1. Install Potato with live agent support
pip install potato-annotation[live-agents]
 
# 2. Install and start Ollama
curl -fsSL https://ollama.ai/install.sh | sh
ollama pull qwen2.5-coder:32b
 
# 3. Set up a workspace with a repo to work on
mkdir -p workspace/
git clone https://github.com/example/test-project workspace/repo
 
# 4. Create the config file
cat > config.yaml << 'YAML'
annotation_task_name: "Live Agent Observation"
port: 8000
 
live_coding_agent:
  backend_type: ollama_tool_use
  ai_config:
    model: "qwen2.5-coder:32b"
    base_url: "http://localhost:11434"
    temperature: 0.2
  working_dir: ./workspace/repo
  max_turns: 50
  sandbox_mode: trusted
 
annotation_schemes:
  - annotation_type: radio
    name: outcome
    description: "Final outcome"
    labels:
      - name: "resolved"
        text: "Task Fully Resolved"
      - name: "partial"
        text: "Partially Resolved"
      - name: "failed"
        text: "Failed"
 
  - annotation_type: text
    name: notes
    description: "Session Notes"
    placeholder: "Key observations about agent behavior..."
    label_requirement:
      required: false
 
output_annotation_dir: "./output/"
export_annotation_format: jsonl
 
user_config:
  allow_all_users: false
  users:
    - "observer1"
YAML
 
# 5. Start Potato
potato start config.yaml -p 8000
 
# 6. Open http://localhost:8000 in your browser

ログイン後、「/api/usersのPOSTエンドポイントに入力バリデーションを追加する」のようなタスクを貼り付けて「Start Agent」をクリックします。作業を見守り、おかしいと思ったら一時停止し、指示を送って方向を修正し、ロールバックして別のアプローチを試してください。終わったら結果を評価し、メモを残します。

実践上のコツ

明確で範囲の定まったタスクから始める。 ちょうどよいのは、エージェントが5〜15分で終える程度の作業です。これより短いとアノテーションに値するだけのトラジェクトリが得られず、大幅に長いとアノテーターが疲弊します。

本番ではサンドボックスを有効にしておく。 sandbox_mode: containerがデフォルトで、エージェントをホストから隔離します。bubblewrapはより軽量なLinux向けの選択肢です。trustedはエージェントのツール呼び出しをマシン上で直接実行するので、信頼できるモデルを相手に開発している間だけにとどめるべきです。

ロールバックの理由を記録する。 設定でこれを強制する仕組みはないので、アノテーターのルールにしてください。分岐点ごとに、何がまずかったかを短いメモで残します。このメモはそれ自体が有用な訓練シグナルになり、選好データの質も上げます。

複数のバックエンドを比較する。 同じタスクをOllama、Anthropic API、Claude Agent SDKで実行すると、エージェント横断の選好データが得られます。変わるのは設定のバックエンド部分だけなので、準備は簡単です。

こまめにエクスポートする。 最後にまとめてではなく、セッションごとにエクスポートを実行してください。何かがクラッシュしたときの損失が小さくなり、作業を進めながらデータの品質を確認できます。