オープンソース
Collaborative Human Agent Protocol (CHAP)
Collaborative Human Agent Protocol (CHAP) (github.com)
要約
CHAP (Collaborative Human-Agent Protocol) は、人間とエージェントが協力して作業を行うためのプロトコルです。エージェントが作成したドラフトと人間の編集内容を、クエリ、再生、検証可能な「エンベロープ」として保存します。これにより、問題発生時の原因究明が容易になり、開発プロセスにおけるエージェントの意思決定の履歴を追跡・分析することが可能になります。
全文翻訳
Collaborative Human-Agent Protocol (CHAP)
人間とエージェントが協力して実際の作業を行うためのプロトコルです。ボットが何かを作成し、人間がそれを編集した場合、その編集はどこに保存されるのでしょうか?CHAPでは、クエリ、再生、そして6ヶ月後に検証できるエンベロープに保存されます。
インストール · 90秒ツアー · 12のシナリオ · このリポジトリについて · ペーパー
CHAPが存在する理由
エージェントが実際の作業を行っています。コードレビューのドラフト作成、チケットのトリアージ、和解案の提案、契約書のレビューなどです。人間はそれぞれを承認、編集、または拒否します。現在、その決定は、アプリケーションコード、チャットスレッド、チケットコメント、そしてあなたの頭の中に存在します。6週間後に問題が発生した場合、何が起こったのかを再構築するには45分かかり、半分は推測になります。CHAPは、それらの決定を置く場所を1つ、それらを置くための形状を1つ提供します。エージェントのドラフトは成果物です。人間の編集は、差分、根拠、およびあなたが制御するタグを持つ構造化された上書きです。すべてがコンテンツハッシュによって連鎖します。4つのUIにわたるログをgrepする代わりに、チェーンをクエリします。それが全体のピッチです。
90秒ツアー
ソロ開発者がCursorを使用してプルリクエストをレビューしています。ボットが「警告」をフラグ立てしますが、開発者はそれに同意しません。ここに、最初から最後まで、すべてのやり取りがあります。以下のクリップは、6つのラベル付きステップで約23秒実行されます。対応するコードはすぐ下にあります。そして、ここにコードがあります。すべての行です。以下の物語は、2つの言語で1つの連続したストーリーです。あなたが実際に使用するスタックを選んでください。
1. ワークスペースを起動します。SQLite永続化を備えた組み込みコーディネーター、2人の参加者、ワークスペース:
TypeScript
Python
```typescript
import { Coordinator } from "@brightbeamai/chap-coordinator";
import { SqliteStore } from "@brightbeamai/chap-coordinator/storage/sqlite";
const coord = new Coordinator({
store: new SqliteStore("./chap.db"),
});
coord.api.workspace.create({ workspace: "wsp_pr_reviews", profiles: ["core/1.0", "review/1.0"], });
coord.api.participant.join({ workspace: "wsp_pr_reviews", from: "human:me@local", type: "human", });
coord.api.participant.join({ workspace: "wsp_pr_reviews", from: "agent:cursor#v1", type: "agent", });
```
```python
from chap_coordinator import Coordinator
from chap_coordinator.storage.sqlite import SqliteStore
coord = Coordinator(store=SqliteStore("./chap.db"))
def send(method, params):
return coord.dispatch({
"jsonrpc": "2.0",
"id": method,
"method": method,
"params": params,
})
send("workspace.create", {
"workspace": "wsp_pr_reviews",
"profiles": ["core/1.0", "review/1.0"],
})
send("participant.join", {
"workspace": "wsp_pr_reviews",
"from": "human:me@local",
"type": "human",
})
send("participant.join", {
"workspace": "wsp_pr_reviews",
"from": "agent:cursor#v1",
"type": "agent",
})
```
2. ボットがドラフトを作成し、あなたが上書きします。既存のCursor統合をエンベロープを発行するように配線します:
TypeScript
Python
```typescript
// The bot's review is the output of a task.
const { task_id } = coord.api.task.create({
workspace: "wsp_pr_reviews",
from: "agent:cursor#v1",
assignee: "agent:cursor#v1",
kind: "code_review",
input: { pr_id: "PR-482" },
});
coord.api.task.complete({
workspace: "wsp_pr_reviews",
from: "agent:cursor#v1",
task_id,
output: cursorReview,
});
coord.api.review.request({
workspace: "wsp_pr_reviews",
from: "agent:cursor#v1",
task_id,
artefact: cursorReview,
to: "human:me@local",
});
// You disagree with one comment. Override it.
coord.api.decide.override({
workspace: "wsp_pr_reviews",
from: "human:me@local",
task_id,
intent_preserved: true,
diff: [{ op: "replace", path: "/comments/0/severity", value: "info" }],
rationale: "False positive. Framework " +
"convention, not a bug.",
tags: ["false-positive", "framework-pattern-misread"],
});
```
```python
# The bot's review is the output of a task.
r = send("task.create", {
"workspace": "wsp_pr_reviews",
"from": "agent:cursor#v1",
"assignee": "agent:cursor#v1",
"kind": "code_review",
"input": {"pr_id": "PR-482"},
})
task_id = r["result"]["task_id"]
send("task.complete", {
"workspace": "wsp_pr_reviews",
"from": "agent:cursor#v1",
"task_id": task_id,
"output": cursor_review,
})
send("review.request", {
"workspace": "wsp_pr_reviews",
"from": "agent:cursor#v1",
"task_id": task_id,
"artefact": cursor_review,
"to": "human:me@local",
})
# You disagree with one comment. Override it.
send("decide.override", {
"workspace": "wsp_pr_reviews",
"from": "human:me@local",
"task_id": task_id,
"intent_preserved": True,
"diff": [{"op": "replace", "path": "/comments/0/severity", "value": "info"}],
"rationale": "False positive. Framework "
"convention, not a bug.",
"tags": ["false-positive", "framework-pattern-misread"],
})
```
サーフェスについて。TypeScriptは型付きファサード(coord.api.*)を出荷するため、すべてのメソッドで完全なオートコンプリートとコンパイル時チェックが可能です。Pythonはサーフェス上にJSON-RPCエンベロープ形状(coord.dispatch({...}))を維持し、コンシューマーは呼び出しサイトに合わせて自由にラップします。send()ヘルパーは、Pythonテストで使用されるイディオムです。どちらのパスも同一のワイヤーバイトを生成します。監査チェーンは、どのクライアントが呼び出しを行ったかに関わらず、バイト単位で同一です。
3. 2ヶ月後、自分が何をしてきたかを分析します。ここでプロトコルがあなたに報います。リファレンスリポジトリは、両方の言語で監査チェーン(HTTP経由またはSQLiteファイルから直接)を読み取り、上書きをグループ化する分析スクリプトを出荷します。
# TypeScriptリファレンス、SQLiteStoreに対して(ステップ1から):
$ npm --prefix reference/core-plus-review run analyze -- --db ./chap.db wsp_pr_reviews
# Pythonリファレンス、同じ考え方:
$ python3 reference/python/analyze_overrides.py --db ./chap.db wsp_pr_reviews
Override Learning Report
========================
Total overrides: 47
By tag:
false-positive ████████████████ 31 (66%)
framework-pattern-misread ███████████ 22 (47%)
cosmetic-pref ████ 8 (17%)
Top file paths:
src/handlers/ 18 overrides
src/components/ 9 overrides
Cursorの次のプロンプトの改訂は、もはや推測ではありません。パターンを名前で引用します。
上書きエンベロープ、詳細
上書きエンベロープはCHAPで最も重要な形状です。すべてのフィールドにはジョブがあります:
最初の読書でほとんどの人が見落とす2つのフィールドは、intent_preservedとtagsです。intent_preservedは、洗練された上書き(人間はエージェントの決定に同意したが、その表現方法を書き直した)と、置換的な上書き(人間は異なる決定を下した)を区別します。これらは2つの異なる失敗モードであり、異なる修正を必要とします。あるポリシー条項の周りで高い洗練率が見られる場合、エージェントの取得がオフになっていることを意味します。同じ条項で高い置換率が見られる場合、ポリシー自体が曖昧であるか、エージェントのタスクコンテキストが間違っていることを意味します。tagsは、チームが合意した制御された語彙です。小さく保ってください。そこに入力したものは、3ヶ月後に集計する次元となり、「どのプロンプトを修正する必要があるか?」や「ボットが一貫して間違っているパスはどれか?」といった質問に答える際に役立ちます。
インストール
TypeScript / Node: npm install @brightbeamai/chap-coordinator
Python: pip install chap-coordinator
どちらのパスでも、Coreとreview/1.0プロファイル、および実行可能なリファレンスが得られます。TypeScriptリファレンスはreference/にあり、Pythonリファレンスはreference/python/にあります。TypeScriptライブラリはpackages/coordinator/にあり、Pythonライブラリはpackages/coordinator-py/にあります。5分間のハンズオンウォークスルー:examples/00-five-minute-start.md。
本日出荷されるもの
CHAP 0.2は公開ドラフトです。具体的には、このリポジトリには以下が含まれます:
仕様。Core(7つのメソッド、1つのエンベロープ、1つのワイヤーフォーマット)と11のオプションプロファイル。SPECIFICATION.mdで単一のドキュメントにまとめられているか、core/SPEC.mdおよびprofiles/から個別に読むことができます。
2つのリファレンス実装。どちらもCoreとすべてのプロファイルを含み、合計39のメソッドハンドラがあります。TypeScriptリファレンスはpackages/coordinator/にあり、HTTPサーバーはreference/core/およびreference/core-plus-review/にあり、ローカルLLMを備えた2つのブラウザセッションを持つ実行可能なプレイグラウンドはreference/playground/にあります。Pythonリファレンスはpackages/coordinator-py/にあり、HTTPサーバーはreference/python/にあります。どちらもコンフォーマンスハーネスに合格しています。