当前页

Round 机制与回调追踪

2026-05-12

功能简介

Round 是 AI Agent 交互链路的唯一标识符。 每一次用户说话或 API 调用,服务端都会生成一个 Round 值,后续所有相关回调(ASR 识别、LLM 回复、TTS 播报、状态变化、打断事件等)都携带这个 Round 值,让业务方能准确追踪"这次交互发生了什么"。

适用场景: AI 陪聊、语聊房、数字人、智能客服等需要追踪完整对话链路的场景。无论是用户主动发言、还是业务方主动触发 AI 回复,都能通过 Round 串联所有回调,轻松处理打断、排队等复杂情况。


核心概念:Round 是什么

Round 的定义

Round(轮次) 是服务端为每一次完整交互生成的升序序号,不会重复。

  • 一次交互 = 从"触发"到"结束"的完整链路
  • 触发来源:用户说话、调用 SendAgentInstanceLLM、调用 SendAgentInstanceTTS
  • 结束标志:AI 完成本轮回复(TTS 播报完成或 LLM 返回完成)

Round 的作用

Round 贯穿整个交互生命周期,所有回调事件都携带 Round 字段:

触发 → Round N 开始
  ├─ ASRResult (Round: N)        // ASR 开始识别结果
  ├─ LLMResult (Round: N)        // LLM 回复内容
  ├─ AgentInstanceStatus (Round: N)  // 状态变化(聆听→思考→说话→空闲)
  ├─ AgentInstanceMetaInfo (Round: N) // 元数据(音色、情绪等)
  └─ 结束 → Round N 完成

Round 的生成时机

触发来源Round 生成时机说明
用户说话检测到用户语音开始ASR 开始识别时,Round 已确定
SendAgentInstanceLLMAPI 请求成功服务端接收请求后立即分配 Round
SendAgentInstanceTTSAPI 请求成功服务端接收请求后立即分配 Round

功能示意图

数据流转总览

┌─────────────────────────────────────────────────────────────────┐
│                        触发来源                                  │
├───────────────────────┬─────────────────────────────────────────┤
│   用户主动说话         │   业务方调用 API                         │
│   (RTC 房间语音)        │   SendAgentInstanceLLM/TTS              │
└───────────┬───────────┴────────────────┬────────────────────────┘
            │                            │
            ▼                            ▼
    ┌────────────────────────────────────────┐
    │    ZEGO AI Agent 服务端                 │
    │    生成 Round (升序序号)                │
    └────────────────────────────────────────┘
                    │
        ┌───────────┼───────────┬───────────┐
        │           │           │           │
        ▼           ▼           ▼           ▼
  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
  │   ASR    │ │   LLM    │ │   TTS    │ │  Status  │
  │  Result  │ │  Result  │ │  Status  │ │  Change  │
  │ Round: N │ │ Round: N │ │ Round: N │ │ Round: N │
  └──────────┘ └──────────┘ └──────────┘ └──────────┘
        │           │           │           │
        └───────────┴───────────┴───────────┘
                    │
                    ▼
        ┌───────────────────────┐
        │   业务方服务端回调     │
        │   通过 Round 关联所有事件 │
        └───────────────────────┘

两种数据流转对比

【生成时机 1:用户主动说话】
用户:"今天天气怎么样?" (Round 5)
  ↓
服务端:ASR 识别 → LLM 思考 → TTS 播报
  ↓
回调序列:
  - ASRResult (Round: 5, 文本:"今天天气怎么样?")
  - AgentInstanceStatus (Round: 5, 状态:"Thinking")
  - LLMResult (Round: 5, 文本:"今天天气晴朗...")
  - AgentInstanceStatus (Round: 5, 状态:"Speaking")
  - AgentInstanceStatus (Round: 5, 状态:"Idle")

【生成时机 2:业务方调用 API】
业务方:SendAgentInstanceTTS("欢迎语") (Round 6)
  ↓
服务端:直接 TTS 播报
  ↓
回调序列:
  - AgentInstanceStatus (Round: 6, 状态:"Speaking")
  - AgentInstanceMetaInfo (Round: 6, 音色:"zh_female")
  - AgentInstanceStatus (Round: 6, 状态:"Idle")

获取全链路的 Round

客户端 SDK 回调

重要: 客户端可通过 ZEGO Express SDK 的试验性 API 回调获取 Round 信息,用于实现状态切换 UI(如"聆听中"、"思考中"、"说话中")。

Cmd 类型及 Data 字段

Cmd类型Data 字段说明
1用户说话状态SpeakStatus, UserIdSpeakStatus: 1=说话开始,2=说话结束
3ASR 文本Text, MessageId, UserId, StartFlag, EndFlag增量下发 ASR 识别结果
4LLM 应答Text, MessageId, EndFlag增量下发 LLM 回复
6智能体状态Status, OldStatus, ReasonStatus: 0=空闲,1=聆听,2=思考,3=说话
102元数据信息Object元数据信息(音色、情绪、动作等)

回调字段说明(关键字段)

所有回调事件的公共字段:

{
  "Timestamp": 1765510379,           // 秒级时间戳
  "TimestampMs": 1765510379113,      // 毫秒级时间戳
  "SeqId": 278800715,                // 包序列号,保证有序性,不保证连续性
  "Round": 510359002,                // 【核心】对话轮次,升序生成,不保证连续性
  "Cmd": 1,                          // 命令类型
  "Data": { ... }                    // 具体内容,见下表
}

详细文档

完整 API 说明参考:智能体实例 SDK 端回调


服务端回调

回调类型列表

回调事件回调时机用途
ASRResult用户说话识别完成获取 ASR 识别文本
LLMResultLLM 生成回复获取 AI 回复内容
AgentInstanceStatus状态变化追踪 AI 当前状态(聆听/思考/说话/空闲)
AgentInstanceMetaInfo开始播报获取元数据(音色、情绪、动作等)
Interrupted被打断处理打断逻辑
UserSpeakAction用户开始/结束说话检测用户发言
AgentSpeakActionAI 开始/结束说话检测 AI 发言
UserAudioData用户开始说话获取对应轮次的音频数据
Exception发生错误错误处理

回调字段说明(关键字段)

所有回调事件的公共字段:

{
  "Event": "ASRResult",           // 事件类型
  "RoomId": "room_123",               // 房间 ID
  "AgentUserId": "agent_user_001",    // Agent 用户 ID
  "Sequence": 1234567890,             // 事件序列号(全局递增)
  "Timestamp": 1746619200000,         // 时间戳(毫秒)
  "Data": {
    "Round": 5,                         // 【核心】轮次序号
    ...
  }                     // 事件具体数据
}

详细文档

完整说明参考:服务端回调


获取全链路 Round 示例


常见问题

Q1: Round 何时生成?

A: 每次新交互触发时生成,包括:

  • 用户开始说话
  • 调用 SendAgentInstanceLLM
  • 调用 SendAgentInstanceTTS

打断场景下,新交互触发新 Round,旧 Round 终止。

Q2: Round 会重复吗?

A: 不会。Round 升序生成,不会重复。

Q3: 如何调试 Round 关联问题?

A: 建议业务方在日志中记录每个回调的 Round 值,按 Round 分组查看:

[Round 5] ASRResult: "用户提问内容"
[Round 5] LLMResult: "AI 回复内容"
[Round 5] Status: Speaking → Idle

如发现 Round 不连续或事件缺失,检查:

  1. 回调配置是否开启(CallbackConfig)
  2. 网络是否正常(回调是否丢失)

Q4: Round 和 Sequence 有什么区别?

A:

  • Round:标识"哪一次交互",同一交互的所有事件 Round 相同
  • Sequence:标识"事件的全局顺序",所有事件严格递增

业务方用 Round 关联同一交互的事件,用 Sequence 检测事件是否丢失。

Q5: 打断时,被中断的 Round 还会收到 LLMResult 吗?

A: 不会。打断时,如果 LLM 还在生成,服务端会停止生成,不会回调 LLMResult

业务方应在收到 Interrupted 事件后,清理被中断 Round 的 pending 状态。


附录:回调配置示例

创建 Agent 实例时,开启相关回调:

{
  "Action": "CreateAgentInstance",
  "AppId": 1234567890,
  "AgentId": "agent_001",
  "UserId": "user_001",
  "RTC": {
    "RoomId": "room_123",
    "AgentStreamId": "stream_001",
    "AgentUserId": "agent_user_001",
    "UserStreamId": "user_stream_001"
  },
  "CallbackConfig": {
    "ASRResult": 1,              // 开启 ASR 回调
    "LLMResult": 1,              // 开启 LLM 回调
    "Interrupted": 1,            // 开启打断回调
    "UserSpeakAction": 1,        // 开启用户说话回调
    "AgentSpeakAction": 1,       // 开启 AI 说话回调
    "AgentInstanceStatus": 1     // 开启状态回调
  }
}

上一篇

AI 播报时获取 MetaInfo

下一篇

角色扮演 System Prompt