通过 HTTP Webhook 订阅 Cloud Agents 生命周期事件,包括端点管理、投递行为与支持的事件目录。
一、概述
Webhook 是 Qoder Cloud Agents 提供的事件驱动推送机制。当 Agent、Session 等资源发生生命周期变化时,系统以 HTTP POST 方式将结构化事件推送到开发者注册的 URL,无需轮询即可实时获取状态变更。
核心特性:
- 事件驱动推送 — 资源状态变更时主动通知,无需客户端轮询
- 信封结构 — 统一的
BetaWebhookEvent { id, created_at, data, type:"event" }格式 - 投递语义 — at-least-once 保证;指数退避重试
| 场景 | 说明 |
|---|---|
| 异步任务完成通知 | Session 执行完毕后触发下游流程 |
| Agent 配置变更审计 | 记录 Agent 创建/更新/删除操作 |
| 多 Agent 协作编排 | Thread 状态变更驱动子任务调度 |
| 运维监控告警 | 连续失败计数超阈值时告警 |
二、Domain Types
本节定义 Webhook 事件的数据结构。每种事件类型的 data 字段遵循统一的 object 格式,包含资源 ID、事件类型及事件特定的额外字段。
Session 生命周期事件
Webhook Session Updated Event Data
-
WebhookSessionUpdatedEventData object { id, type }-
id: string触发事件的 Session ID。 -
type: "session.updated""session.updated"
-
Webhook Session Deleted Event Data
-
WebhookSessionDeletedEventData object { id, type }-
id: string触发事件的 Session ID。 -
type: "session.deleted""session.deleted"
-
Session 状态事件
Webhook Session Status Run Started Event Data
-
WebhookSessionStatusRunStartedEventData object { id, type }-
id: string触发事件的 Session ID。 -
type: "session.status_run_started""session.status_run_started"
-
Webhook Session Status Idled Event Data
-
WebhookSessionStatusIdledEventData object { id, type }-
id: string触发事件的 Session ID。 -
type: "session.status_idled""session.status_idled"
-
Session Thread 事件
适用于多 Agent 协作场景。Thread 事件在 Session 事件基础上额外携带 session_thread_id 字段,标识具体的执行线程。
Webhook Session Thread Created Event Data
-
WebhookSessionThreadCreatedEventData object { id, type, session_thread_id }-
id: string触发事件的 Session ID。 -
type: "session.thread_created""session.thread_created"
-
session_thread_id: string所属的 Session Thread ID。
-
Webhook Session Thread Idled Event Data
-
WebhookSessionThreadIdledEventData object { id, type, session_thread_id }-
id: string触发事件的 Session ID。 -
type: "session.thread_idled""session.thread_idled"
-
session_thread_id: string所属的 Session Thread ID。
-
Webhook Session Thread Terminated Event Data
-
WebhookSessionThreadTerminatedEventData object { id, type, session_thread_id }-
id: string触发事件的 Session ID。 -
type: "session.thread_terminated""session.thread_terminated"
-
session_thread_id: string所属的 Session Thread ID。
-
Agent 生命周期事件
Webhook Agent Created Event Data
-
WebhookAgentCreatedEventData object { id, type }-
id: string触发事件的 Agent ID。 -
type: "agent.created""agent.created"
POST /agents接口创建 Agent 后,系统发送此事件。
-
Webhook Agent Updated Event Data
-
WebhookAgentUpdatedEventData object { id, type }-
id: string触发事件的 Agent ID。 -
type: "agent.updated""agent.updated"
-
Webhook Agent Archived Event Data
-
WebhookAgentArchivedEventData object { id, type }-
id: string触发事件的 Agent ID。 -
type: "agent.archived""agent.archived"
-
Webhook Agent Deleted Event Data
-
WebhookAgentDeletedEventData object { id, type }-
id: string触发事件的 Agent ID。 -
type: "agent.deleted""agent.deleted"
-
Deployment Run 事件
Deployment Run 事件的 id 为 Deployment Run ID。
WebhookDeploymentRunStartedEventData object { id, type: "deployment_run.started" }WebhookDeploymentRunSucceededEventData object { id, type: "deployment_run.succeeded" }WebhookDeploymentRunFailedEventData object { id, type: "deployment_run.failed" }
三、Webhook Endpoint API
管理 Webhook 端点的 CRUD 接口。通过这些接口可以创建、查询、更新、删除 Webhook 端点,以及发送测试事件和控制端点的启用/禁用状态。
Base URL:
| 区域 | 地址 |
|---|---|
| Global | https://api.qoder.com/api/v1/cloud |
| CN | https://api.qoder.com.cn/api/v1/cloud |
POST /webhook_endpoints
创建一个新的 Webhook 端点。
请求参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | 是 | 接收事件推送的公网 HTTPS URL,必须使用 443 端口 |
description | string | 否 | 端点描述,便于管理识别 |
events | string[] | 是 | 订阅的具名事件类型列表,可选值见第五节 |
201 Created
注意: signing_secret 仅在创建时返回一次,请安全保存。
状态码:
| 状态码 | 说明 |
|---|---|
| 201 | 创建成功 |
| 400 | 请求参数无效(如 URL 不是公网 HTTPS 443 地址、事件类型不合法) |
| 401 | 未授权,Token 无效或过期 |
| 422 | 语义错误(如 URL 重复注册) |
GET /webhook_endpoints
获取当前账户下所有 Webhook 端点列表。
请求参数: 无
响应: 200 OK
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 端点唯一标识 |
url | string | 接收事件的 URL |
description | string | 端点描述 |
events | string[] | 订阅的事件类型列表 |
active | boolean | 是否启用 |
consecutive_fail | integer | 连续投递失败次数 |
last_success_at | string | 最近一次成功投递时间(RFC 3339) |
last_failure_at | string | 最近一次投递失败时间(RFC 3339),无失败记录时为 null |
created_at | string | 创建时间(RFC 3339) |
updated_at | string | 最近更新时间(RFC 3339) |
GET /webhook_endpoints/{id}
获取指定 Webhook 端点的详细信息。
路径参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id | string | Webhook 端点 ID |
200 OK
返回单个端点对象,结构与列表接口中的元素一致。
状态码:
| 状态码 | 说明 |
|---|---|
| 200 | 成功 |
| 404 | 端点不存在 |
PUT /webhook_endpoints/{id}
更新指定 Webhook 端点的配置。
路径参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id | string | Webhook 端点 ID |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | 否 | 更新接收事件推送的公网 HTTPS 443 URL |
description | string | 否 | 更新端点描述 |
events | string[] | 否 | 更新订阅的具名事件类型列表 |
200 OK
返回更新后的完整端点对象。
状态码:
| 状态码 | 说明 |
|---|---|
| 200 | 更新成功 |
| 400 | 请求参数无效 |
| 404 | 端点不存在 |
DELETE /webhook_endpoints/{id}
永久删除指定的 Webhook 端点。删除后所有未投递的事件将被丢弃。
路径参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id | string | Webhook 端点 ID |
204 No Content
状态码:
| 状态码 | 说明 |
|---|---|
| 204 | 删除成功 |
| 404 | 端点不存在 |
POST /webhook_endpoints/{id}/test
向指定端点发送一个测试事件,用于验证端点连通性和 Payload 处理逻辑。
路径参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id | string | Webhook 端点 ID |
202 Accepted
| 字段 | 类型 | 说明 |
|---|---|---|
event_id | integer | 测试事件的内部 ID |
delivery_rows | integer | 事件发布的消息分区数 |
| 状态码 | 说明 |
|---|---|
| 202 | 测试事件已发送 |
| 404 | 端点不存在 |
POST /webhook_endpoints/{id}/enable
启用一个被禁用的 Webhook 端点。启用后端点将重新接收事件推送。
路径参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id | string | Webhook 端点 ID |
200 OK
返回启用后的端点对象(active: true)。
状态码:
| 状态码 | 说明 |
|---|---|
| 200 | 启用成功 |
| 404 | 端点不存在 |
POST /webhook_endpoints/{id}/disable
禁用一个 Webhook 端点。禁用后端点将停止接收事件推送,但不会被删除。
路径参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id | string | Webhook 端点 ID |
200 OK
返回禁用后的端点对象(active: false)。
状态码:
| 状态码 | 说明 |
|---|---|
| 200 | 禁用成功 |
| 404 | 端点不存在 |
GET /webhook_events
列出 Webhook 事件投递记录,用于审计和排查。
请求参数: 无
响应: 200 OK
返回事件列表,包含事件的投递状态、时间戳等信息。
示例:
GET /webhook_events/{id}
获取单个 Webhook 事件的详细信息。
路径参数:
| 参数 | 类型 | 说明 |
|---|---|---|
id | string | Webhook 事件 ID |
200 OK
状态码:
| 状态码 | 说明 |
|---|---|
| 200 | 成功 |
| 404 | 事件不存在 |
错误响应格式
所有接口在遇到错误时,返回统一的错误结构:
| 字段 | 类型 | 说明 |
|---|---|---|
error.message | string | 人类可读的错误描述 |
error.type | string | 错误分类(如 invalid_request_error、not_found_error) |
request_id | string | 请求追踪 ID,用于排查问题时提供给支持团队 |
type | string | 固定值 "error" |
注意: 鉴权层(如 Token 无效或缺失)返回的 401 响应可能不遵循上述业务错误结构,而是由网关直接返回。
四、Webhook Delivery(投递机制)
投递方式
系统通过 HTTP POST 将事件推送到注册的 URL,请求格式如下:
- Method:
POST - Content-Type:
application/json - Body: JSON 格式的信封结构(详见第六节)
请求头
每次投递包含以下 HTTP 请求头:
| Header | 说明 |
|---|---|
Content-Type | application/json |
User-Agent | QoderCloudAgents-Webhook/1.0 |
重试策略
当投递失败时,系统采用指数退避策略进行重试:
| 尝试次数 | 延迟 | 说明 |
|---|---|---|
| 第 1 次 | 立即 | 首次投递 |
| 第 2 次 | 1 秒 | 第一次重试 |
| 第 3 次 | 5 秒 | 第二次重试 |
| 第 4 次 | 30 秒 | 最终重试 |
响应码处理
| 响应码范围 | 处理方式 |
|---|---|
| 2xx | 投递成功,事件标记为已送达 |
| 4xx | 不重试,事件标记为已丢弃(客户端错误应由开发者修复) |
| 5xx | 触发重试(服务端临时故障) |
| 超时 | 触发重试(默认超时 30 秒) |
自动降级
当某个端点的 consecutive_fail 计数超过 20 时,系统将触发降级警告。建议开发者监控此指标,并在持续失败时检查:
- 端点 URL 是否可达
- SSL 证书是否有效
- 服务端是否正常响应
五、Supported Event Types
当前可订阅并拥有真实发送链路的事件如下。events 只能使用表中的具名事件。
| 事件类型 | data 额外字段 | 触发条件 |
|---|---|---|
session.updated | — | Session 元数据被修改 |
session.deleted | — | Session 被永久删除 |
session.status_run_started | — | Agent 开始一轮运行 |
session.status_idled | — | Turn 执行完成,回到 idle 状态 |
session.thread_created | session_thread_id | 新的 Session Thread 被创建 |
session.thread_idled | session_thread_id | Thread 执行结束进入 idle |
session.thread_terminated | session_thread_id | Thread 被终止 |
agent.created | — | Agent 被创建 |
agent.updated | — | Agent 配置被更新 |
agent.archived | — | Agent 被归档 |
agent.deleted | — | Agent 被删除 |
deployment_run.started | — | 一次 Deployment Run 开始执行 |
deployment_run.succeeded | — | 一次 Deployment Run 执行成功 |
deployment_run.failed | — | 一次 Deployment Run 执行失败 |
六、信封结构详解
所有 Webhook 事件均使用统一的信封(envelope)结构进行封装投递。
基础信封结构
Thread 事件信封
Thread 事件的 data 中额外包含 session_thread_id 字段:
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 事件唯一标识,以 whe_ 开头;同一事件重试时保持不变 |
created_at | string | 事件创建时间,RFC 3339 UTC 格式 |
type | string | 固定值 "event",标识这是一个事件信封 |
data | object | 事件负载,包含触发资源的信息 |
data.id | string | 触发事件的资源 ID(如 Session、Agent 或 Deployment Run ID) |
data.type | string | 事件类型字符串,如 "session.status_idled"、"agent.updated" |
data.session_thread_id | string | (仅 Thread 事件)所属的 Session Thread ID |
幂等性处理
信封中的 id 字段可作为去重键(deduplication key)。由于投递语义为 at-least-once,同一事件可能被多次推送。接收端应:
- 使用
id作为唯一键进行去重 - 在处理前检查该
id是否已被消费 - 确保事件处理逻辑的幂等性
附录 A:快速接入指南
步骤 1:创建 Webhook 端点
步骤 2:实现接收端
在您的服务中实现 Webhook 接收端点,确保:
- 解析 JSON Payload,并根据
type处理对应事件 - 使用事件
id做幂等去重 - 返回
200 OK确认收到 - 异步处理业务逻辑(避免超时)
步骤 3:发送测试事件
步骤 4:验证并上线
确认测试事件接收正常后,即可投入生产使用。
附录 B:最佳实践
| 实践 | 说明 |
|---|---|
| 幂等处理 | 使用事件 id 去重,防止重复消费 |
| 快速响应 | 接收端应在 5 秒内返回 2xx,耗时逻辑异步处理 |
| 精确订阅 | 仅订阅需要的事件类型,减少不必要的网络开销 |
| 监控告警 | 监控 consecutive_fail 指标,及时发现投递异常 |