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_ 为前缀的密钥。它只显示一次,因此请安全存储以用于验证 Webhook 传递。每次传递都带有 X-Webhook-Signature 标头。使用 SDK 的 unwrap() 辅助函数可一步完成签名验证和事件解析。如果签名无效或负载超过五分钟,它会抛出异常。
将 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,则说明是重试,可以将其丢弃。
session.status_idled 也可能在 session.outcome_evaluation_ended 之前到达。如果顺序很重要,请使用 created_at 时间戳进行排序。event.id。3xx 被视为失败。如果您的端点迁移了,请在 Console 中更新 URL。disabled 并附带机器可读的 disabled_reason;如果主机名解析为私有 IP 或端点返回重定向,则会立即禁用。解决问题后,请在 Console 中手动重新启用。Was this page helpful?