Skip to main content

概述

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"
      Session 被成功创建时触发。通过 POST /sessions 接口创建 Session 后,系统立即发送此事件。

Webhook Session Updated Event Data

  • WebhookSessionUpdatedEventData object { id, type }
    • id: string 触发事件的 Session ID。
    • type: "session.updated"
      • "session.updated"
      Session 元数据(如 title、metadata 等)被修改时触发。

Webhook Session Archived Event Data

  • WebhookSessionArchivedEventData object { id, type }
    • id: string 触发事件的 Session ID。
    • type: "session.archived"
      • "session.archived"
      Session 被归档时触发。归档后 Session 不再接受新消息,但历史数据仍可查询。

Webhook Session Deleted Event Data

  • WebhookSessionDeletedEventData object { id, type }
    • id: string 触发事件的 Session ID。
    • type: "session.deleted"
      • "session.deleted"
      Session 被永久删除时触发。删除后该 Session 的所有数据将不可恢复。

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"
      Agent 开始一轮运行时触发。标志着 Session 进入 running 状态,正在执行用户指令。

Webhook Session Status Idled Event Data

  • WebhookSessionStatusIdledEventData object { id, type }
    • id: string 触发事件的 Session ID。
    • type: "session.status_idled"
      • "session.status_idled"
      一轮 turn 执行完成,Session 回到 idle 状态时触发。此时可安全地读取 Session 的最新输出。

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 被创建时触发。常见于子 Agent 协作场景中,主 Agent 派生子线程执行任务。
    • 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 一轮执行结束进入 idle 状态时触发。表示该线程已完成当前任务,可读取结果。
    • 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 被终止时触发。Thread 终止后不可恢复,需创建新 Thread 继续工作。
    • 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"
      Agent 被成功创建时触发。通过 POST /agents 接口创建 Agent 后,系统发送此事件。
    • version: integer Agent 版本号。首次创建时为 1

Webhook Agent Updated Event Data

  • WebhookAgentUpdatedEventData object { id, type, version }
    • id: string 触发事件的 Agent ID。
    • type: "agent.updated"
      • "agent.updated"
      Agent 配置被更新时触发。每次更新 version 递增。
    • version: integer Agent 版本号。

Webhook Agent Archived Event Data

  • WebhookAgentArchivedEventData object { id, type, version }
    • id: string 触发事件的 Agent ID。
    • type: "agent.archived"
      • "agent.archived"
      Agent 被归档时触发。归档后 Agent 不再接受新的 Session 创建请求。
    • version: integer Agent 版本号。

Webhook Agent Deleted Event Data

  • WebhookAgentDeletedEventData object { id, type, version }
    • id: string 触发事件的 Agent ID。
    • type: "agent.deleted"
      • "agent.deleted"
      Agent 被删除时触发。删除后该 Agent 的所有配置数据将不可恢复。
    • version: integer Agent 版本号。

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 — 请求体的原始字节内容(未经解析)
验证步骤:
  1. Webhook-Signature Header 中提取 tv1
  2. 检查时间戳是否在容忍窗口内(建议 600 秒),防止重放攻击
  3. 使用 signing_secret"<t>.<raw_body>" 计算 HMAC-SHA256
  4. 将计算结果与 v1 进行恒时比较(timing-safe comparison)

签名验证代码示例

Node.js:
Python:
Go:

重试策略

当投递失败时,系统采用指数退避策略进行重试: 共计 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,同一事件可能被多次推送。接收端应:
  1. 使用 id 作为唯一键进行去重
  2. 在处理前检查该 id 是否已被消费
  3. 确保事件处理逻辑的幂等性

规划中的事件(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 接收端点,确保:
  1. 验证 Webhook-Signature 签名
  2. 使用事件 id 做幂等去重
  3. 返回 200 OK 确认收到
  4. 异步处理业务逻辑(避免超时)

步骤 4:发送测试事件

步骤 5:验证并上线

确认测试事件接收正常后,即可投入生产使用。

附录 B:最佳实践