Skip to main content
事件(Event)是你的应用与会话之间的唯一通信通道:用户消息、Agent 回复、工具调用与结果、状态变化,全部以事件形式流动,并在服务端持久化为事件历史。本页介绍事件类型、三个事件接口的用法,以及自定义工具、审批、打断等进阶场景。

事件类型

客户端 → 平台

平台 → 客户端

所有服务端事件都有全局唯一 idprocessed_at 时间戳,按处理顺序排列,构成可完整回读的事件历史。

集成事件

事件相关的三个接口:

SSE 实时流

连接语义:
  • live-only:流只转发连接建立后的实时事件,不回放历史。
  • 服务端每 15 秒发送 : ping 注释帧保活,客户端应忽略。
  • 收到 session.deleted 事件后服务端会主动关闭连接。
  • 每个 data: 载荷与事件列表接口返回的 Event JSON 结构相同。
断线后不要指望流从断点续推。记下已消费事件的 idprocessed_at,重新打开 SSE,再用列表接口按时间把缺口补上:
补历史与新流在时间边界上可能重叠,客户端按事件 id 去重。

增量预览(event deltas)

默认情况下,agent.message 在内容完整后才作为一条事件下发。若想在 UI 上做逐字流式渲染,用 event_deltas 查询参数订阅增量预览:
开启后,流上会先出现 event: event_start 帧({"type":"event_start","event":{...}}),随后若干 event: event_delta 帧携带 content_delta 增量;可订阅 agent.messageagent.thinking 两类。注意:
  • 预览帧自身没有 id / processed_at,不写入事件历史;缓冲完成后的完整事件(权威记录)随后照常下发,客户端应以完整事件对齐最终状态。
  • span.model_request_end 会关闭未收敛的预览。
  • 本接口的 query 参数白名单只有 event_deltas(及 beta);携带其他参数(types、limit 等)返回 400。

列出历史事件

参数:limit(默认 100)、order(默认 asc)、page(游标)、types(重复参数或逗号分隔,未知类型 400)。时间过滤用 created_at[gt]created_at[gte]created_at[lt]created_at[lte](按 processed_at 比较;尚未处理的事件不命中任何边界)。

处理自定义工具调用

Agent 调用自定义工具时的完整回路:
  1. 平台派发 agent.custom_tool_use 事件:含本次调用的 id、工具 name、按 input_schema 生成的 input 参数对象。
  2. 会话进入 idlesession.status_idle 的 stop_reason.type 为 requires_action,event_ids 列出全部等待中的调用。
  3. 你的应用执行工具逻辑。
  4. 回发 user.custom_tool_resultcustom_tool_use_id 必填(对应调用事件的 id);content 可选(至多 20 块,text / image / document);失败时置 is_error: true 并在 content 中说明错误。省略 content 即空结果,同样合法。
  5. 全部等待中的调用被解决后,会话回到 running,Agent 带着结果继续。

requires_action 期间的发送约束

  • 会话处于 idle(requires_action) 时,发送接口只接受 resolution 事件(user.custom_tool_result / user.tool_confirmation)与 user.interrupt;此时发 user.message 会整批被拒(400),消息不会排队。
  • resolution 匹配错误分三类:目标 ID 未知 / 跨会话 / 类型不匹配返回 404;目标已被解决或取消返回 409;同一批里两条 resolution 指向同一个等待事件,解析阶段直接 400。任一项失败整批拒绝、零写入。

打断与引导

  • running 期间:可以继续发送 user.message 与 user.interrupt。追加的消息排队到下一个循环边界生效,用于中途引导;interrupt 则要求 Agent 停下当前工作。
  • idle(requires_action) 期间:发送 user.interrupt 会取消整组等待中的自定义工具调用与审批请求;取消不产生逐条回执,以事件流中的下一条生命周期事件为准。
  • 恢复空闲会话:对处于 idle(end_turn) 的会话直接发送新的 user.message 即可继续,沙箱状态与对话历史都在。

会话事件数据加密

创建会话时加上 x-events-encrypted: true,业务内容型事件会按你在开放平台登记的密钥加密后再落库。开关只在创建时生效,之后不能改,也不会出现在 Session 响应里。 启用前先到开放平台用户中心提交日志加密密钥:https://bigmodel.cn/usercenter/safety-mgmt/logkeys 。创建时平台会先探测密钥:没有可用密钥或加密服务不可达,会返回 400,且不会创建会话。
取值必须是精确小写的 truefalse(省略等于 false)。True / 1 / yes 都会 400。

加密范围

同一会话可以同时有明文控制事件和加密业务事件。Agent 执行时平台会临时解密必要内容——这是降低落库暴露面的静态加密,不是平台自己也解不开的端到端零知识。

列表与流里长什么样

加密事件不会回明文 content,而是给一个独立信封。GET /v1/sessions/:id/events 与 SSE 都走同一套形状:
用你持有的客户密钥,按 version + salt 解密 data,即可还原原来的 payload。控制类事件仍然是普通 JSON,没有 encrypted 字段。

跟踪用量

两个粒度:span.model_request_end 事件携带该次模型请求的 model_usage;Session 对象的 usage 字段累计整个会话的 input_tokens / output_tokens / cache_read_input_tokens,随 GET /v1/sessions/:id 返回。

调试建议

  • UI 状态机以 session.status_* 事件为权威依据;不要仅凭一条 evaluated_permission: “ask” 的工具事件就渲染审批 UI,等待 idle(requires_action) 的 event_ids 确认。
  • 排查问题时优先回读事件历史(order=asc),完整的事件序列几乎总能还原现场。
  • 长连接注意处理 15 秒 ping 帧与网络中断重连;重连后先补齐缺口再继续消费流。

下一步

工具权限

工具审批的完整流程

管理会话

状态机与运维操作

本页对应 OpenAPI

Session:发送事件、列出事件、订阅实时事件