Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
セッションは長時間実行されるインタラクションです。ほとんどのリアルタイムインタラクションはSSEイベントストリームを通じて行われますが、Webhookは主要な状態変化を通知します。
Webhookイベントは、完全なオブジェクトではなく、イベントのtypeとidを返します。Webhookイベントを受信したら、GET呼び出しでオブジェクトを直接取得する必要があります。これにより、再試行時に古いデータが配信されることを回避し、各配信を小さく保つことができます。
| イベント | トリガー |
|---|---|
session.status_run_started | エージェントの実行が開始されました。これはセッションステータスがrunningに遷移するたびにトリガーされます。 |
session.status_idled | エージェントが入力を待機しています。たとえば、ツール権限の承認や新しいユーザーメッセージなどです。 |
session.status_rescheduled | 一時的なエラーが発生し、セッションが自動的に再試行しています。 |
session.status_terminated | セッションが終端エラーに達しました。 |
session.thread_created | 新しいマルチエージェントスレッドが開かれました。これは、コーディネーターによって呼び出された追加のエージェントが作業を開始していることを意味します。 |
session.thread_idled | マルチエージェントインタラクション内のエージェントが入力を待機しています。 |
session.thread_terminated | マルチエージェントスレッドがアーカイブされました。 |
session.outcome_evaluation_ended | 単一のイテレーションに対するアウトカム評価が完了しました。 |
session.updated | セッションのプロパティが変更されました(たとえば、名前や設定が更新された場合)。 |
session.deleted | セッションが完全に削除されました。取得するオブジェクトが残っていないため、イベント自体を最終的なものとして扱ってください。 |
ConsoleでManage > Webhooksにアクセスしてください。
Webhookエンドポイントは以下で構成されます。
data.type値のリストです。エンドポイントは、サブスクライブしているイベントとテストイベントのみを受信します(配信動作を参照)。whsec_プレフィックス付きの32バイトのシークレットです。一度しか表示されないため、Webhook配信を検証するために安全に保管してください。すべての配信にはX-Webhook-Signatureヘッダーが含まれています。SDKのunwrap()ヘルパーを使用して、署名の検証とイベントの解析を一度に行います。署名が無効な場合、またはペイロードが5分以上古い場合は例外がスローされます。
ANTHROPIC_WEBHOOK_SIGNING_KEYに、エンドポイント作成時に表示されたwhsec_プレフィックス付きのシークレットを設定してください。
from flask import Flask, request
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_WEBHOOK_SIGNING_KEY from env
app = Flask(__name__)
@app.route("/webhook", methods=["POST"])
def webhook():
try:
# unwrap() は署名が無効な場合やペイロードが古い場合に例外を発生させます
event = client.beta.webhooks.unwrap(
request.get_data(as_text=True),
headers=dict(request.headers),
)
except Exception:
return "invalid signature", 400
if event.data.type == "session.status_idled":
print("session idled:", event.data.id)
# 他のイベントタイプを処理します
return "", 200ボディを解析し、data.typeで分岐して、IDでリソースを取得します。確認応答として任意の2xxを返してください。それ以外(3xxを含む)は失敗とみなされ、再試行がトリガーされます。
すべてのイベントペイロードは同じ構造を持ち、イベントタイプ、識別子、およびオブジェクトが作成されたタイムスタンプが含まれます。
{
"type": "event",
"id": "event_01ABC...",
"created_at": "2026-03-18T14:05:22Z",
"data": {
"type": "session.status_idled",
"id": "sesn_01XYZ...",
"organization_id": "8a3d2f1e-...",
"workspace_id": "c7b0e4d9-..."
}
}if event.data.type == "session.status_idled":
session = client.beta.sessions.retrieve(event.data.id)
notify_user(session)
return "", 204トップレベルのevent.idは、配信ごとではなくイベントごとに一意です。同じevent.idを2回受信した場合、それは再試行であり、破棄できます。
session.status_idledがsession.outcome_evaluation_endedより先に到着することがあります。順序が重要な場合は、created_atタイムスタンプを使用してソートしてください。event.idが配信されます。3xxは失敗として扱われます。エンドポイントが移動した場合は、ConsoleでURLを更新してください。disabled_reasonとともに自動的にdisabledに設定されます。問題を解決した後、Consoleで手動で再度有効にしてください。Was this page helpful?