概述
Webhook 是 Qoder Cloud Agents 提供的事件驱动推送机制。当 Agent、Session 等资源发生生命周期变化时,系统以 HTTP POST 方式将结构化事件推送到开发者注册的 URL,无需轮询即可实时获取状态变更。 核心特性:- 事件驱动推送 — 资源状态变更时主动通知,无需客户端轮询
- 信封结构 — 统一的
BetaWebhookEvent { id, created_at, data, type:"event" }格式 - 投递语义 — at-least-once 保证;HMAC-SHA256 签名验证;指数退避重试
- 通配符订阅 — 使用
*订阅所有事件类型,简化集成配置
Domain Types
本节定义 Webhook 事件的数据结构。每种事件类型的data 字段遵循统一的 object 格式,包含资源 ID、事件类型及事件特定的额外字段。
Session 生命周期事件
Webhook Session Created Event Data
-
WebhookSessionCreatedEventData object { id, type }-
id: string触发事件的 Session ID。 -
type: "session.created""session.created"
POST /sessions接口创建 Session 后,系统立即发送此事件。
-
Webhook Session Updated Event Data
-
WebhookSessionUpdatedEventData object { id, type }-
id: string触发事件的 Session ID。 -
type: "session.updated""session.updated"
-
Webhook Session Archived Event Data
-
WebhookSessionArchivedEventData object { id, type }-
id: string触发事件的 Session ID。 -
type: "session.archived""session.archived"
-
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 生命周期事件
Agent 事件在基础字段之外额外携带version 字段,标识 Agent 的配置版本号。
Webhook Agent Created Event Data
-
WebhookAgentCreatedEventData object { id, type, version }-
id: string触发事件的 Agent ID。 -
type: "agent.created""agent.created"
POST /agents接口创建 Agent 后,系统发送此事件。 -
version: integerAgent 版本号。首次创建时为1。
-
Webhook Agent Updated Event Data
-
WebhookAgentUpdatedEventData object { id, type, version }-
id: string触发事件的 Agent ID。 -
type: "agent.updated""agent.updated"
version递增。 -
version: integerAgent 版本号。
-
Webhook Agent Archived Event Data
-
WebhookAgentArchivedEventData object { id, type, version }-
id: string触发事件的 Agent ID。 -
type: "agent.archived""agent.archived"
-
version: integerAgent 版本号。
-
Webhook Agent Deleted Event Data
-
WebhookAgentDeletedEventData object { id, type, version }-
id: string触发事件的 Agent ID。 -
type: "agent.deleted""agent.deleted"
-
version: integerAgent 版本号。
-
Webhook Endpoint API
管理 Webhook 端点的 CRUD 接口。通过这些接口可以创建、查询、更新、删除 Webhook 端点,以及发送测试事件和控制端点的启用/禁用状态。 Base URL:
认证方式:
所有接口均需要在请求头中携带 Personal Access Token:
POST /webhook_endpoints
创建一个新的 Webhook 端点。 请求参数:
响应:
201 Created
注意: signing_secret 仅在创建时返回一次,请妥善保存。后续查询接口不会再次返回此字段。
状态码:
示例:
GET /webhook_endpoints
获取当前账户下所有 Webhook 端点列表。 请求参数: 无 响应:200 OK
示例:
GET /webhook_endpoints/{id}
获取指定 Webhook 端点的详细信息。 路径参数:
响应:
200 OK
返回单个端点对象,结构与列表接口中的元素一致。
状态码:
示例:
PUT /webhook_endpoints/{id}
更新指定 Webhook 端点的配置。 路径参数:
请求参数:
响应:
200 OK
返回更新后的完整端点对象。
状态码:
示例:
DELETE /webhook_endpoints/{id}
永久删除指定的 Webhook 端点。删除后所有未投递的事件将被丢弃。 路径参数:
响应:
204 No Content
状态码:
示例:
POST /webhook_endpoints/{id}/test
向指定端点发送一个测试事件,用于验证端点连通性和签名验证逻辑。 路径参数:
请求参数: 无
响应:
202 Accepted
状态码:
示例:
POST /webhook_endpoints/{id}/enable
启用一个被禁用的 Webhook 端点。启用后端点将重新接收事件推送。 路径参数:
请求参数: 无
响应:
200 OK
返回启用后的端点对象(active: true)。
状态码:
示例:
POST /webhook_endpoints/{id}/disable
禁用一个 Webhook 端点。禁用后端点将停止接收事件推送,但不会被删除。 路径参数:
请求参数: 无
响应:
200 OK
返回禁用后的端点对象(active: false)。
状态码:
示例:
GET /webhook_events
列出 Webhook 事件投递记录,用于审计和排查。 请求参数: 无 响应:200 OK
返回事件列表,包含事件的投递状态、时间戳等信息。
示例:
GET /webhook_events/{id}
获取单个 Webhook 事件的详细信息。 路径参数:
响应:
200 OK
状态码:
示例:
错误响应格式
所有接口在遇到错误时,返回统一的错误结构:注意: 鉴权层(如 Token 无效或缺失)返回的 401 响应可能不遵循上述业务错误结构,而是由网关直接返回。
Webhook Delivery(投递机制)
投递方式
系统通过 HTTP POST 将事件推送到注册的 URL,请求格式如下:- Method:
POST - Content-Type:
application/json - Body: JSON 格式的信封结构(详见信封结构详解)
请求头
每次投递包含以下 HTTP 请求头:签名验证
为确保事件来源的真实性和数据完整性,每次投递都携带 HMAC-SHA256 签名。开发者应在接收端验证签名后再处理事件。 签名格式:signing_secret— 创建端点时返回的密钥(whsec_前缀)t— 签名时的 Unix 时间戳(秒)raw_body— 请求体的原始字节内容(未经解析)
- 从
Webhook-SignatureHeader 中提取t和v1 - 检查时间戳是否在容忍窗口内(建议 600 秒),防止重放攻击
- 使用
signing_secret对"<t>.<raw_body>"计算 HMAC-SHA256 - 将计算结果与
v1进行恒时比较(timing-safe comparison)
签名验证代码示例
Node.js:重试策略
当投递失败时,系统采用指数退避策略进行重试:
共计 4 次尝试(1 次投递 + 3 次重试)。全部失败后事件进入死信队列。
响应码处理
自动降级
当某个端点的consecutive_fail 计数超过 20 时,系统将触发降级警告。建议开发者监控此指标,并在持续失败时检查:
- 端点 URL 是否可达
- SSL 证书是否有效
- 服务端是否正常响应
- 签名验证逻辑是否存在 Bug
Supported Event Types(完整清单)
事件类型总览
特殊事件类型
状态标记说明
信封结构详解
所有 Webhook 事件均使用统一的信封(envelope)结构进行封装投递。基础信封结构
Thread 事件信封
Thread 事件的data 中额外包含 session_thread_id 字段:
Agent 事件信封
Agent 事件的data 中额外包含 version 字段:
字段说明
幂等性处理
信封中的id 字段可作为去重键(deduplication key)。由于投递语义为 at-least-once,同一事件可能被多次推送。接收端应:
- 使用
id作为唯一键进行去重 - 在处理前检查该
id是否已被消费 - 确保事件处理逻辑的幂等性
规划中的事件(Coming Soon)
以下事件类型已在 API 设计层面完成对齐,将随各资源功能上线后逐步开放。具体时间线视产品需求确定。deployment.* (部署生命周期,6 个事件)
deployment_run.* (部署运行状态,3 个事件)
environment.* (环境管理,4 个事件)
memory_store.* (记忆存储,3 个事件)
vault.* (密钥库,3 个事件)
vault_credential.* (凭据管理,5 个事件)
附录 A:快速接入指南
步骤 1:创建 Webhook 端点
步骤 2:保存 signing_secret
从创建响应中获取signing_secret 并安全存储,后续验证签名时使用。
步骤 3:实现接收端
在您的服务中实现 Webhook 接收端点,确保:- 验证
Webhook-Signature签名 - 使用事件
id做幂等去重 - 返回
200 OK确认收到 - 异步处理业务逻辑(避免超时)