订阅会话事件流
本接口用于通过 SSE(Server-Sent Events)订阅会话(Session)的事件,连接保持打开并持续推送事件。建议先订阅,再发送消息。
事件流包含两种帧:
- 完整事件帧:包含
event:、id:、data:三行,data为完整的事件对象。id可用于断线续传。 - 预览帧:传入
event_deltas[]时推送,没有id:行,不能用于续传。event_start表示某条事件开始生成,event_delta为增量内容,delta.index为内容块下标。同一条agent.message生成完后还会推送一条完整事件帧,内容以完整事件帧为准。
开始推送后出现的错误以 session.error 事件推送,HTTP 状态码不变。调用方读取过慢、单个连接积压超过 2000 条事件或 8 MiB 时,系统主动断开连接,调用方可用 Last-Event-ID 重连续传。会话被删除时,连接依次收到 session.status_terminated、session.deleted 和 global.disposed 事件后关闭。
完整事件帧中 data 的事件对象结构如下,不同事件类型返回的字段不同:
权限说明
使用 API Key 鉴权调用 API 流程,具体调用流程,请查看认证鉴权。
请求参数
固定为 text/event-stream。
断线续传时传入上次收到的事件标识,从该事件之后继续推送;不传时只推送订阅之后的新事件。
格式不正确或该事件不存在时,事件流推送 global.disposed 事件,并在 reason 中说明原因。
会话标识。
会话不存在时返回 404;会话不属于当前账号时返回 403。
需要推送预览帧的事件类型,可传多个,最多 100 个。
可选值:agent.message(逐段输出消息内容)、agent.thinking(推送思考开始提示)。
不传时只推送完整事件帧。也支持 event_deltas 写法。
显示子属性
隐藏子属性
GET /api/dma/v1/sessions/{session_id}/events/stream?event_deltas[]=agent.message HTTP/1.1
Host: api.dumate.cn
Authorization: Bearer <YOUR_API_KEY>
Accept: text/event-stream
示例代码
curl -g -N --location --request GET "https://api.dumate.cn/api/dma/v1/sessions/ses_gffe5e3caaadc6ffe126cMcNQZsyuhP/events/stream?event_deltas[]=agent.message" \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--header 'Accept: text/event-stream'
返回响应
固定为 text/event-stream。
事件标识,sevt_ 前缀。
事件类型。
用户事件:user.message、user.interrupt、user.tool_confirmation、user.custom_tool_result。
智能体事件:agent.message(回复消息)、agent.thinking(开始思考)、agent.tool_use / agent.tool_result(调用内置工具及其结果)、agent.mcp_tool_use / agent.mcp_tool_result(调用 MCP 工具及其结果)、agent.custom_tool_use(调用自定义工具,等待调用方回填)、agent.thread_message_sent / agent.thread_message_received(多 agent 场景下线程间消息)、agent.thread_context_compacted(上下文被压缩)。
会话事件:session.status_running、session.status_idle、session.status_rescheduled、session.status_terminated、session.updated(通过更新会话接口修改会话的 agent 配置时触发;修改 title、metadata、budget 不触发)、session.deleted、session.usage(累计用量快照)、session.error(运行出错)、session.thread_created、session.thread_status_running / _idle / _rescheduled / _terminated。
span 事件:span.model_request_start / span.model_request_end(一次模型请求开始、结束)。
处理时间,RFC 3339 格式,UTC。
内容块列表。
user.message、agent.message、agent.tool_result 等事件返回。
显示子属性
隐藏子属性
内容块,例如 {"type": "text", "text": "..."}。
显示子属性
隐藏子属性
会话进入空闲的原因。
仅 session.status_idle 返回。
显示子属性
隐藏子属性
停止原因。
可选值:end_turn(本轮正常结束,可以发送下一条消息)、requires_action(等待工具确认或工具结果)、retries_exhausted(重试耗尽或达到费用上限,查看 session.error;达到费用上限时错误类型为 billing_error)、refusal(模型拒答)。
等待确认或回填的事件标识,仅 stop_reason.type 为 requires_action 时返回。
显示子属性
隐藏子属性
停止详情;没有时为 null。
仅 session.status_idle 返回。
显示子属性
隐藏子属性
累计用量。
仅 session.usage 返回。
显示子属性
隐藏子属性
输入 token 数。
输出 token 数。
命中缓存的输入 token 数。
写入缓存的 token 数。
显示子属性
隐藏子属性
写入 1 小时缓存的输入 token 数。
写入 5 分钟缓存的输入 token 数。
服务端工具调用次数。
显示子属性
隐藏子属性
web_fetch 调用次数。
web_search 调用次数。
实际运行秒数。
费用。
显示子属性
隐藏子属性
金额,字符串格式。
货币,固定为 POINT(DuMate 积分)。
工具名称,例如 read。
仅 agent.tool_use、agent.mcp_tool_use、agent.custom_tool_use 返回。
工具输入参数。
仅 agent.tool_use、agent.mcp_tool_use、agent.custom_tool_use 返回。
显示子属性
隐藏子属性
权限判定结果,例如 allow。
仅 agent.tool_use、agent.mcp_tool_use 返回。
权限判定依据。
仅 agent.tool_use、agent.mcp_tool_use 返回。
显示子属性
隐藏子属性
生效的权限策略,例如 always_allow。
对应的 agent.tool_use 事件标识。
仅 agent.tool_result 返回。
是否执行失败。
agent.tool_result、span.model_request_end 返回。
对应的 span.model_request_start 事件标识。
仅 span.model_request_end 返回。
本次模型请求的用量。
仅 span.model_request_end 返回。
显示子属性
隐藏子属性
输入 token 数。
输出 token 数。
命中缓存的输入 token 数。
写入缓存的输入 token 数。
错误信息。
仅 session.error 返回。
显示子属性
隐藏子属性
错误类型。
可选值:unknown_error(未知错误)、model_overloaded_error(模型过载)、model_rate_limited_error(模型请求被限流)、model_request_failed_error(模型请求失败)、mcp_connection_failed_error(连接 MCP 服务失败)、mcp_authentication_failed_error(MCP 服务鉴权失败)、billing_error(额度不足)、credential_host_unreachable_error(凭证的目标域名被网络策略拦截)。
显示子属性
隐藏子属性
重试状态,仅 session.error 返回。可选值:retrying、exhausted、terminal。
MCP 服务名称,仅 agent.mcp_tool_use 返回。
对应的 agent.mcp_tool_use 事件标识,仅 agent.mcp_tool_result 返回。
线程标识,仅 session.thread_status_* 返回。
智能体名称,仅 session.thread_status_* 返回。
event: user.message
id: sevt_msg_g001a1c356cb9c001egSwADPkMC6ZRu
data: {"id":"sevt_msg_g001a1c356cb9c001egSwADPkMC6ZRu","type":"user.message","processed_at":"2026-11-10T02:43:27.898Z","content":[{"type":"text","text":"读一下这个文件,回复文件第一行"}]}
event: session.status_running
id: sevt_ee8e5fb34abe1b677c87cc6abcc1fff7e5cb569824c29ca278f34cb28715afb3
data: {"id":"sevt_ee8e5fb34abe1b677c87cc6abcc1fff7e5cb569824c29ca278f34cb28715afb3","type":"session.status_running","processed_at":"2026-11-10T02:43:27.898Z"}
event: event_start
data: {"type":"event_start","event":{"id":"sevt_prt_g001a1c356e4b50014ZzcOJ57z6ndm0","type":"agent.message"}}
event: event_delta
data: {"type":"event_delta","event_id":"sevt_prt_g001a1c356e4b50014ZzcOJ57z6ndm0","delta":{"type":"content_delta","index":0,"content":{"type":"text","text":"我会先读取这份附件并"}}}
event: agent.message
id: sevt_prt_g001a1c356e4b50014ZzcOJ57z6ndm0
data: {"id":"sevt_prt_g001a1c356e4b50014ZzcOJ57z6ndm0","type":"agent.message","processed_at":"2026-11-10T02:43:35.337Z","content":[{"type":"text","text":"我会先读取这份附件并定位到开头部分,再按你的要求回复对应内容。"}]}
event: session.status_idle
id: sevt_bff929d7346ed4c9eb57f993c082b1ca8e2f625b2a4df59978006f911f5ede7d
data: {"id":"sevt_bff929d7346ed4c9eb57f993c082b1ca8e2f625b2a4df59978006f911f5ede7d","type":"session.status_idle","processed_at":"2026-11-10T02:43:39.903Z","stop_reason":{"type":"end_turn"},"stop_details":null}
评价此篇文章
