验证 Webhook 请求来源,并可靠处理可能重复投递的事件。
Webhook 当前为 Beta 功能,接口、字段和行为可能在后续版本中调整。
HTTP 请求
事件发生后,Qoder Cloud Agents 会向 Endpoint URL 发送 HTTP POST 请求:
| Header | 说明 |
|---|---|
Webhook-ID | 事件 ID。相同事件重试时保持不变,可用作消费幂等键。 |
Webhook-Event-Type | 事件类型。 |
Webhook-Timestamp | 生成签名时的 Unix 秒时间戳。 |
Webhook-Signature | 请求签名,当前格式为 v1,<base64>。 |
2xx 表示处理成功。建议先完成验签并将事件写入自己的可靠队列,再快速返回响应。
事件结构
Forward 业务事件使用统一信封:
| 字段 | 类型 | 说明 |
|---|---|---|
type | string | 固定为 event。 |
id | string | Webhook 事件 ID,与 Webhook-ID 相同。 |
created_at | string | 事件发生时间,RFC 3339 格式。 |
data.type | string | 事件类型,与 Webhook-Event-Type 相同。 |
data.id | string | 发生事件的资源 ID。 |
data.schema_version | integer | 事件数据版本,当前为 1。 |
Schedule 事件
forward.schedule.created
Schedule 创建成功时发送:
trigger_policy_type 和 next_trigger_at 仅在有对应值时返回。
forward.schedule_run.succeeded
Schedule Run 成功完成时发送。data.status 为 completed。
forward.schedule_run.failed
Schedule Run 执行失败时发送。结构与成功事件相同,data.status 为 failed,并可能包含 error_type:
Managed Agents 资源事件
Forward 也支持订阅 Session、Session Thread、Agent、Environment、Memory Store、Vault 和 Vault Credential 事件。完整事件名及触发时机见支持的公开事件。
这些事件使用相同的外层信封,但 data 仅携带资源引用,不包含 Schedule 事件的 schema_version、业务状态或结果正文。例如,会话进入空闲状态:
| 事件类别 | data.id | 额外字段 |
|---|---|---|
session.status_*、session.updated、session.deleted | Session ID | 无。 |
session.thread_* | 所属 Session ID | session_thread_id:具体线程 ID。 |
agent.* | Managed Agent ID | 无。 |
environment.* | Environment ID | 无。 |
memory_store.* | Memory Store ID | 无。 |
vault.* | Vault ID | 无。 |
vault_credential.* | Vault Credential ID | vault_id:所属 Vault ID。 |
* 仅用于归类,不是可填写到 events 的前缀通配符。收到通知后,可按资源 ID 查询当前详情;删除事件对应的资源可能已无法查询。session.status_idled 不等同于业务成功,应结合会话输出和状态判断。
webhook.test 不使用上述资源事件结构,测试载荷见发送测试事件。
签名校验
创建 Endpoint 时返回的 signing_secret 用于验证请求签名。签名内容由以下三部分组成:
Webhook-Timestamp与当前时间的偏差不超过 5 分钟。Webhook-Signature至少包含一个验签成功的v1签名。- 已处理过的
Webhook-ID不再重复执行有副作用的业务操作。
重试与幂等
Webhook 使用至少一次投递语义。网络失败、超时或接收端返回非 2xx 时,系统可能重试同一事件。
- 使用
Webhook-ID去重,不要使用请求到达时间生成幂等键。 - 同一个
Webhook-ID的重复请求应返回成功,且不得重复执行副作用。 - 处理失败时返回非
2xx;处理成功或已处理过时返回2xx。

