概述
Shannon 通过服务器发送事件(Server-Sent Events, SSE)发出实时事件。本文档记录平台实际发出的 26 种事件类型、它们的结构以及发生时机。 事件提供:- 实时进度 - 实时跟踪任务执行
- 调试洞察 - LLM 提示词、工具调用、智能体推理
- 成本监控 - 实时跟踪 token 使用量和成本
- 多智能体协调 - 观察团队组建和协作
- 错误恢复 - 监控错误处理和恢复尝试
事件结构
所有事件遵循以下基础结构:基础字段
| 字段 | 类型 | 描述 |
|---|---|---|
workflow_id | string | 唯一的任务/工作流标识符 |
type | string | 事件类型(参见下面的目录) |
agent_id | string | 发出事件的智能体 |
message | string | 人类可读的事件描述 |
timestamp | ISO 8601 | 事件发生时间 |
seq | integer | 用于排序的序列号 |
stream_id | string | 用于重连的流标识符 |
data | object | 事件特定的载荷(可选) |
事件分类
事件被组织为逻辑分类:- 工作流事件 - 任务生命周期
- 智能体事件 - 智能体执行
- 工具事件 - 工具调用
- 模式事件 - 认知模式执行
- 团队事件 - 多智能体协调
- LLM 事件 - 语言模型交互
- 进度事件 - 任务进度和状态
- 系统事件 - 错误和系统状态
事件类型快速参考(权威)
| 事件类型 | 分类 | 描述 |
|---|---|---|
WORKFLOW_STARTED | 工作流 | 任务开始执行 |
WORKFLOW_COMPLETED | 工作流 | 任务成功完成 |
AGENT_STARTED | 智能体 | 智能体开始处理 |
AGENT_THINKING | 智能体 | 智能体推理/规划 |
AGENT_COMPLETED | 智能体 | 智能体成功完成 |
TOOL_INVOKED | 工具 | 调用工具 |
TOOL_OBSERVATION | 工具 | 智能体观察工具结果 |
TEAM_RECRUITED | 团队 | 组建多智能体团队 |
TEAM_RETIRED | 团队 | 解散团队 |
TEAM_STATUS | 团队 | 团队协调更新 |
DEPENDENCY_SATISFIED | 团队 | 依赖关系已解决 |
MESSAGE_SENT | 消息 | 智能体发送消息 |
MESSAGE_RECEIVED | 消息 | 智能体接收消息 |
LLM_PROMPT | LLM | 发送至 LLM 的提示 |
LLM_PARTIAL | LLM | 流式 LLM 输出 |
LLM_OUTPUT | LLM | 最终 LLM 输出 |
PROGRESS | 进度 | 通用进度更新 |
DATA_PROCESSING | 进度 | 处理/分析数据 |
WAITING | 进度 | 等待资源 |
ERROR_OCCURRED | 系统 | 错误发生 |
ERROR_RECOVERY | 系统 | 错误恢复尝试 |
APPROVAL_REQUESTED | 系统 | 需要人工批准 |
APPROVAL_DECISION | 系统 | 批准决策已做出 |
WORKSPACE_UPDATED | 系统 | 内存/上下文已更新 |
ROLE_ASSIGNED | 系统 | 智能体角色已分配 |
DELEGATION | 系统 | 任务已委托 |
WORKFLOW_FAILED、TOOL_COMPLETED、TOOL_FAILED、BUDGET_UPDATE 等事件不会由流式 API 发出。失败通过 ERROR_OCCURRED 表示;完成由 WORKFLOW_COMPLETED 表示。
工作流事件
与整体任务工作流相关的事件。WORKFLOW_STARTED
发出时机: 任务开始执行时 数据:query: 原始任务查询mode: 执行模式(SIMPLE、STANDARD、COMPLEX)session_id: 会话标识符estimated_complexity: 复杂度分数(0.0-1.0)
WORKFLOW_COMPLETED
发出时机: 任务成功完成时 数据:result: 最终任务结果duration_ms: 总执行时间total_tokens: 累计 token 使用量total_cost_usd: 总成本agents_used: 调用的智能体数量tools_invoked: 工具调用次数
精选示例
AGENT_THINKING
TOOL_INVOKED / TOOL_OBSERVATION
LLM_OUTPUT
ERROR_OCCURRED
APPROVAL_REQUESTED
BUDGET_EXCEEDED- 达到成本/token 限制TIMEOUT- 执行超时TOOL_EXECUTION_FAILED- 工具错误LLM_ERROR- LLM 提供商错误INVALID_INPUT- 格式错误的请求
智能体事件
与单个智能体执行相关的事件。AGENT_STARTED
发出时机: 智能体开始处理时 数据:AGENT_THINKING
发出时机: 智能体正在推理/处理(最频繁的事件) 数据:AGENT_COMPLETED
发出时机: 智能体完成其子任务时 数据:AGENT_FAILED
发出时机: 智能体遇到错误时 数据:工具事件
与工具调用相关的事件。TOOL_INVOKED
发出时机: 调用工具时 数据:TOOL_OBSERVATION
发出时机: 智能体观察工具结果时 数据:模式事件
模式选择与任务拆解事件不属于对外公开的流式事件架构,省略不表。团队事件
多智能体团队协调和管理。TEAM_RECRUITED
发出时机: 组建智能体团队进行执行时 数据:TEAM_RETIRED
发出时机: 任务完成后解散团队时 数据:TEAM_STATUS
发出时机: 多智能体团队协调的定期更新 数据:DEPENDENCY_SATISFIED
发出时机: 任务依赖关系已解决且可以继续执行时 数据:消息事件
智能体之间的通信。MESSAGE_SENT
发出时机: 智能体向另一个智能体发送消息时 数据:MESSAGE_RECEIVED
发出时机: 智能体接收消息时 数据:LLM 事件
用于调试和监控的语言模型交互事件。LLM_PROMPT
发出时机: 提示词发送到 LLM 时(为保护隐私已脱敏) 数据:LLM_PARTIAL
发出时机: 流式传输期间的增量 LLM 输出块 数据:LLM_OUTPUT
发出时机: 某个步骤的最终 LLM 输出 数据:TOOL_OBSERVATION
发出时机: 智能体观察工具结果时 数据:进度事件
用于用户反馈的任务进度和状态更新。PROGRESS
发出时机: 执行期间的通用进度更新 数据:DATA_PROCESSING
发出时机: 智能体正在处理或分析数据时 数据:WAITING
发出时机: 智能体正在等待资源或响应时 数据:系统事件
系统级事件和错误。ERROR_OCCURRED
发出时机: 执行期间发生系统错误时 数据:ERROR_RECOVERY
发出时机: 系统正在从错误中恢复时 数据:APPROVAL_REQUESTED
发出时机: 需要人工批准才能继续时 数据:APPROVAL_DECISION
发出时机: 人工做出批准决策时 数据:approved- 允许操作继续denied- 阻止操作timeout- 超时期间内未做决策
WORKSPACE_UPDATED
发出时机: 工作内存/上下文更新时 数据:ROLE_ASSIGNED
发出时机: 执行期间分配智能体角色时 数据:DELEGATION
发出时机: 任务委托给另一个智能体时 数据:事件排序
事件按序列号(seq)严格排序:
- 序列号单调递增
- 序列中无间隙(从 1 到 N 的每个数字)
- 来自同一工作流的事件始终正确排序
典型事件流程(简化)
事件持久化
事件存储在:- PostgreSQL: 永久事件日志
- Redis: 最近的事件(热缓存)
- 实时: SSE 流
事件可靠性和保证
排序保证
Shannon 在单个工作流内提供严格排序:- 事件按顺序编号(
seq字段) - 序列号无间隙(1、2、3、…)
- 来自同一工作流的事件始终按顺序到达
- 来自不同工作流的事件可能会交错
交付保证
- 至少一次交付: 事件可能会被多次交付(使用
seq进行去重) - 事件持久化: 所有事件存储在 PostgreSQL
event_logs表中 - 热缓存: 最近的事件缓存在 Redis 中以便快速检索
- 历史访问: 通过 REST API 查询过去的事件
流重连
如果 SSE 连接断开:事件保留期
| 存储 | 保留期 | 用途 |
|---|---|---|
| Redis | 1 小时 | 实时流式传输 |
| PostgreSQL | 90 天(默认) | 历史查询 |
| 归档 | 1 年以上(可选) | 长期审计 |