# 双向流式对话下行事件 本文介绍扣子 WebSocket 双向流式对话事件中的下行事件。 ## 对话连接成功 * **事件类型**:`chat.created` * **事件说明**:流式对话接口成功建立连接后服务端会发送此事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `chat.created`。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * 事件示例: ```JSON { "id": "7446668538246561xxxx", "event_type": "chat.created", "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 对话配置成功 * **事件类型**:`chat.updated` * **事件说明**:对话配置更新成功后,会返回最新的配置。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 客户端自行生成的事件 ID,方便定位问题。 | | event_type | String | 必选 | 固定为 `chat.updated`。 | | data | Object | 必选 | 事件数据,包含对话配置的详细信息。 | | data.chat_config | Object | 可选 | 对话配置。 | | data.chat_config.meta_data | Map | 可选 | 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。自定义键值对,应指定为 Map 对象格式。长度为 16 对键值对,其中键(key)的长度范围为 1~64 个字符,值(value)的长度范围为 1~512 个字符。 | | data.chat_config.custom_variables | Map | 可选 | 智能体中定义的变量。在智能体 prompt 中设置变量 {{key}} 后,可以通过该参数传入变量值,同时支持 Jinja2 语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 | | data.chat_config.extra_params | Map | 可选 | 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:`latitude`(纬度,此时值(Value)为纬度值,例如 39.9800718)、`longitude`(经度,此时值(Value)为经度值,例如 116.309314)。 | | data.chat_config.user_id | String | 可选 | 标识当前与智能体的用户,由使用方自行定义、生成与维护。`user_id` 用于标识对话中的不同用户,不同的 `user_id`,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串,例如 123,abc 等。 | | data.chat_config.conversation_id | String | 可选 | 标识对话发生在哪一次会话中。会话是智能体和用户之间的一段问答交互。一个会话包含一条或多条消息。对话是会话中对智能体的一次调用,智能体会将对话中产生的消息添加到会话中。可以使用已创建的会话,会话中已存在的消息将作为上下文传递给模型。创建会话的方式可参考创建会话。对于一问一答等不需要区分 conversation 的场合可不传该参数,系统会自动生成一个会话。不传的话会默认创建一个新的 conversation。 | | data.chat_config.auto_save_history | Boolean | 可选 | 是否保存本次对话记录。

* `true`:(默认)会话中保存本次对话记录,包括本次对话的模型回复结果、模型执行中间结果。
* `false`:会话中不保存本次对话记录,后续也无法通过任何方式查看本次对话信息、消息详情。在同一个会话中再次发起对话时,本次会话也不会作为上下文传递给模型。 | | data.chat_config.parameters | Map | 可选 | 设置对话流的输入参数。

* 对话流的输入参数 USER_INPUT 应在 additional_messages 中传入,在 parameters 中的 USER_INPUT 不生效。
* 如果 parameters 中未指定 CONVERSATION_NAME 或其他输入参数,则使用参数默认值运行对话流;如果指定了这些参数,则使用指定值。 | | data.input_audio | Object | 必选 | 输入音频格式。 | | data.input_audio.format | String | 必选 | 输入音频的格式,支持 `pcm`、`wav`、`ogg`。默认为 `wav`。 | | data.input_audio.codec | String | 必选 | 输入音频的编码,支持 `pcm`、`opus`。默认为 `pcm`。 | | data.input_audio.sample_rate | Integer | 必选 | 输入音频的采样率,默认 24000。 | | data.input_audio.channel | Integer | 必选 | 输入音频的声道数,默认是 1(单声道)。 | | data.input_audio.bit_depth | Integer | 必选 | 输入音频的位深,默认是 16。 | | data.output_audio | Object | 必选 | 输出音频格式。 | | data.output_audio.codec | String | 必选 | 输出音频编码,支持 `pcm`、`g711a`、`g711u`、`opus`、`mp3`。默认是 `pcm`。 | | data.output_audio.pcm_config | Object | 可选 | 当 `codec` 设置为 `opus` 时,不需要设置此字段。 | | data.output_audio.pcm_config.sample_rate | Integer | 可选 | 输出 `pcm` 音频的采样率,默认 24000。 | | data.output_audio.pcm_config.frame_size_ms | Float | 可选 | 输出每个 pcm 包的时长,单位 ms,默认不限制。 | | data.output_audio.pcm_config.limit_config | Object | 可选 | 输出音频限流配置,默认不限制。 | | data.output_audio.pcm_config.limit_config.period | Integer | 可选 | 周期的时长,单位为秒。例如设置为 10 秒,则以 10 秒作为一个周期。 | | data.output_audio.pcm_config.limit_config.max_frame_num | Integer | 可选 | 周期内,最大返回 pcm 包数量。 | | data.output_audio.opus_config | Object | 可选 | 当 `codec` 设置为 `pcm` 时,不需要设置此字段。 | | data.output_audio.opus_config.bitrate | Integer | 可选 | 输出 `opus` 的码率,默认 48000。 | | data.output_audio.opus_config.use_cbr | Boolean | 可选 | 输出 `opus` 是否使用 CBR 编码,默认为 `false`。 | | data.output_audio.opus_config.frame_size_ms | Float | 可选 | 输出 `opus` 的帧长,默认是 10。 | | data.output_audio.opus_config.limit_config | Object | 可选 | 输出音频限流配置。 | | data.output_audio.opus_config.limit_config.period | Integer | 可选 | 周期的时长,单位为秒。例如设置为 10 秒,则以 10 秒作为一个周期。 | | data.output_audio.opus_config.limit_config.max_frame_num | Integer | 可选 | 周期内最大返回的 Opus 帧数量。 | | data.output_audio.mp3_config | Object | 可选 | * 当 `codec` 设置为 `mp3` 时,用于配置 mp3 音频参数。
* 当 `codec` 设置为 `opus`、`pcm`、`g711a`、`g711u` 时,不需要设置此字段。 | | data.output_audio.mp3_config.sample_rate | Integer | 可选 | 输出 `mp3` 音频的采样率,默认是 44100。支持 32000,44100,48000。 | | data.output_audio.mp3_config.bit_rate | Integer | 可选 | 输出 `mp3` 音频的码率,支持 8000~1600000。 | | data.output_audio.loudness_rate | Integer | 可选 | 输出音频的音量,取值范围 [-50, 100],默认为 0。-50 表示 0.5 倍音量,100 表示 2 倍音量。 | | data.output_audio.speech_rate | Integer | 必选 | 输出音频的语速,取值范围 [-50, 100],默认为 0。-50 表示 0.5 倍速,100 表示 2 倍速。 | | data.output_audio.voice_id | String | 可选 | 输出音频的音色 ID。 | | data.output_audio.emotion_config | Object | 可选 | 设置多情感音色的情感和情感值,仅当 `voice_id` 为多情感音色时才支持该配置。 | | data.output_audio.emotion_config.emotion | String | 可选 | 设置多情感音色的情感类型。不同音色支持的情感范围不同,可以通过[系统音色列表](https://www.coze.cn/open/docs/dev_how_to_guides/sys_voice)查看各音色支持的情感。默认为空。枚举值如下:

* happy-开心
* sad-悲伤
* angry-生气
* surprised-惊讶
* fear-恐惧
* hate-厌恶
* excited-激动
* coldness-冷漠
* neutral-中性 | | data.output_audio.emotion_config.emotion_scale | Float | 可选 | 情感值用于量化情感的强度。数值越高,情感表达越强烈,例如: “开心” 的情感值 5 比 1 更显兴奋。
取值范围:1.0~5.0,默认值:4.0。 | | data.voice_processing_config | Object | 可选 | 语音处理能力配置。
仅扣子企业旗舰版支持该配置。
| | data.voice_processing_config.enable_ans | Boolean | 可选 | 主动噪声抑制。自动识别并过滤掉背景环境中的各种噪音(如键盘声、空调声、街道嘈杂声),让说话者的声音更清晰。
此功能与下面的 `enable_pdns`(声纹降噪)只能**二选一开启**,不能同时使用。 | | data.voice_processing_config.enable_pdns | Boolean | 可选 | 声纹降噪。专门针对**特定说话人**的声音进行优化,能更精准地保留目标人声。
此功能与上面的 `enable_ans`只能**二选一开启**,不能同时使用。
提供两种模式:

* 自动提取:设置简单,开箱即用。默认为该模式。**降噪生效稍微有延迟**,服务端需要先听你说一会儿话才能提取出你的声纹特征,在此期间降噪效果可能不佳。另外,提取声纹会受到用户说话场景影响,准确性上可能会弱于主动设置。
* 主动设置:**降噪效果更精准、更快速**,在对话开始时就立即生效。不过需要提前录制声纹并在 `voice_print_feature_id` 中设置声纹 ID。 | | data.voice_processing_config.voice_print_feature_id | String | 可选 | 目标说话人的声纹 ID。当你选择开启 `enable_pdns`(声纹降噪)并希望使用**主动设置**模式时,需要在此处填入你提前录制好的声纹 ID。 | | data.turn_detection | Object | 可选 | 转检测配置。 | | data.turn_detection.type | String | 可选 | 语音检测类型,用于控制语音交互的检测方式,枚举值:

* **server_vad** :自由对话模式,语音数据会传输到服务器端进行实时分析,服务器端的语音活动检测算法会判断用户是否在说话。
* **client_interrupt**:(默认)按键说话模式,由客户端控制语音的开始与结束。
* **semantic_vad**:采用语义判停的自由对话模式(**此功能仅对企业旗舰版用户开放**),由服务端识别说话人的说话的语义判断是否停止说话。 | | data.turn_detection.prefix_padding_ms | Integer | 可选 | `server_vad` 模式下,VAD 检测到语音之前要包含的音频量,单位为 ms。默认为 600ms。 | | data.turn_detection.silence_duration_ms | Integer | 可选 | `server_vad` 模式下,检测语音停止的静音持续时间,单位为 ms。默认为 500ms。 | | data.turn_detection.semantic_vad_config | Object | 可选 | `semantic_vad` 模式下,配置判定语音停止的语义检测策略。 | | data.turn_detection.semantic_vad_config.silence_threshold_ms | Integer | 可选 | 当用户暂停说话时,持续静音多久后,触发语义判停检测。单位为 ms。默认为 300ms。 | | data.turn_detection.semantic_vad_config.semantic_unfinished_wait_time_ms | Integer | 可选 | 当语义检测判断该语句未结束时,持续静音多久后,扣子认定语音结束。单位为 ms。默认为 500ms。 | | data.turn_detection.interrupt_config | Object | 可选 | `server_vad` 模式下,配置语音对话的打断策略。
默认采用发声即打断模式,即在检测到语音输入时会中断智能体的输出。 | | data.turn_detection.interrupt_config.mode | String | 可选 | 配置通过关键词打断,包括:

* `keyword_contains`模式下,说话内容**包含**关键词才会打断模型回复。例如关键词"扣子",用户正在说“你好呀扣子......” / “扣子你好呀”,模型回复都会被打断。
* `keyword_prefix`模式下,说话内容**前缀匹配**关键词才会打断模型回复。例如关键词"扣子",用户正在说“扣子你好呀......”,模型回复就会被打断,而用户说“你好呀扣子......”,模型回复不会被打断。

详细配置方法请参见[通过关键词打断语音对话](https://docs.coze.cn/api/open/docs/tutorial/keywords_interruption)。 | | data.turn_detection.interrupt_config.keywords | Array | 可选 | 打断的关键词配置,最多同时限制 5 个关键词,每个关键词限定长度在 6~24 个字节以内(2~8个汉字以内),不能有标点符号。 | | data.asr_config | Object | 可选 | 语音识别配置,包括热词和上下文信息,以便优化语音识别的准确性和相关性。 | | data.asr_config.hot_words | Array | 可选 | 请输入热词列表,以便提升这些词汇的识别准确率。如果设置的热词数量超出以下数量限制,超出部分将自动截断。

* `data.asr_config.stream_mode` 为`output_no_stream`时:hot_words 支持 5000 tokens。
* `data.asr_config.stream_mode` 为`bidirectional_stream`时: hot_words 支持 100 tokens。 | | data.asr_config.context | String | 可选 | 请输入上下文信息。
最多输入 800 个 Tokens,超出部分将自动截断。 | | data.asr_config.user_language | String | 可选 | 用户说话的语种,默认为 `common`。选项包括:

* common:大模型语音识别,支持中英文、上海话、闽南语,四川、陕西、粤语识别。
* 英语:en-US
* 日语:ja-JP
* 印尼语:id-ID
* 西班牙语:es-MX
* 葡萄牙语:pt-BR
* 德语:de-DE
* 法语:fr-FR
* 韩语:ko-KR
* 菲律宾语:fil-PH
* 马来语:ms-MY
* 泰语:th-TH
* 阿拉伯语:ar-SA | | data.asr_config.enable_ddc | Boolean | 可选 | 将语音转为文本时,是否启用语义顺滑。默认为 `true`。

* `true`:系统在进行语音处理时,会去掉识别结果中诸如 “啊”“嗯” 等语气词,使得输出的文本语义更加流畅自然,符合正常的语言表达习惯,尤其适用于对文本质量要求较高的场景,如正式的会议记录、新闻稿件生成等。
* `false`:系统不会对识别结果中的语气词进行处理,识别结果会保留原始的语气词。 | | data.asr_config.enable_itn | Boolean | 可选 | 将语音转为文本时,是否开启文本规范化(ITN)处理,将识别结果转换为更符合书面表达习惯的格式以提升可读性。默认为 `true`。
开启后,会将口语化数字转换为标准数字格式,示例:

* 将`两点十五分`转换为 `14:15`。
* 将`一百美元`转换为 `$100`。 | | data.asr_config.enable_punc | Boolean | 可选 | 将语音转为文本时,是否给文本加上标点符号。默认为 `true`。 | | data.asr_config.stream_mode | String | 可选 | ASR 识别的模式。

* `output_no_stream`:不会逐字返回语音识别结果,而是等整段语音结束后统一输出完整文本。异步语音消息场景中推荐使用该模式,会整合整句音频信息做上下文分析,减少实时截断导致的误差,提升准确率。
* `bidirectional_stream`(默认值):逐字的返回语音识别的结果。 | | data.asr_config.enable_nostream | Boolean | 可选 | 是否开启**二次识别模式**:

* `true`:会实时返回逐字识别的文本;当一句话结束时,会结合整句音频进行上下文分析并重新识别,生成优化后的识别结果并返回。这种机制既能满足客户实时上屏的需求,又能确保最终结果的识别准确率。
* `false`(默认值):仅进行一次实时识别,逐字返回文本,不会在一句话结束时重新识别分句,可能存在一定的识别误差。 | | data.asr_config.enable_emotion | Boolean | 可选 | 识别说话人的情绪。仅在 `data.asr_config.stream_mode` 为`output_no_stream`时生效。默认为`false`。
支持的情绪标签包括:

* `angry`:表示情绪为生气
* `happy`:表示情绪为开心
* `neutral`:表示情绪为平静或中性
* `sad`:表示情绪为悲伤
* `surprise`:表示情绪为惊讶 | | data.asr_config.enable_gender | Boolean | 可选 | 是否开启识别说话人的性别(male/female),仅在 `data.asr_config.stream_mode` 为`output_no_stream`时生效。默认为`false`。 | | data.asr_config.sensitive_words_filter | Object | 可选 | 敏感词过滤功能,支持以下 3 种过滤方式:

* 过滤系统敏感词,并替换为`*`。
* 过滤自定义敏感词,并替换为空。
* 过滤自定义敏感词,并替换为`*`。 | | data.asr_config.sensitive_words_filter.system_reserved_filter | Boolean | 可选 | 是否过滤系统自带的敏感词,并将匹配到的敏感词替换为`*`。(系统自带敏感词主要包含一些限制级词汇)。默认为`false`。 | | data.asr_config.sensitive_words_filter.filter_with_empty | Array | 可选 | 自定义需替换为空的敏感词列表。 | | data.asr_config.sensitive_words_filter.filter_with_signed | Array | 可选 | 自定义需替换为 `*` 的敏感词列表。 | | data.voice_print_config | Object | 可选 | 声纹识别配置。 | | data.voice_print_config.group_id | String | 可选 | 声纹组 ID。语音通话时,扣子会在该声纹组内进行查找匹配对应的声纹,当声纹匹配度高于 `score` 阈值,则认为是同一个人的声音。 | | data.voice_print_config.score | Integer | 可选 | 声纹匹配的命中阈值,即声音匹配度的最低标准。当声音匹配度达到或超过该阈值时,扣子才会认定声纹匹配成功。你可以根据应用的安全性要求进行自定义设置。如果匹配了多轮声纹,扣子会取相似度最高的一个。
取值范围:0~100,默认值:40。 | | data.voice_print_config.reuse_voice_info | Boolean | 可选 | 当本轮对话未命中任何声纹时,是否沿用历史声纹信息。

* `true`:未命中声纹时,智能体将返回上一次命中的声纹。适用于连续对话场景,当收音不好等情况导致声纹没能正确被识别时,保障对话的连贯性。
* `false`:(默认值)未命中声纹时,智能体返回空的声纹信息。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_id", "event_type": "chat.updated", "data": { "chat_config": { "auto_save_history": true, // 保存历史记录。默认 true "conversation_id": "xxxx", // conversation_id "user_id": "xxx", // 标识当前与智能体的用户,由使用方自行定义、生成与维护。user_id 用于标识对话中的不同用户,不同的 user_id,其对话的上下文消息、数据库等对话记忆数据互相隔离。如果不需要用户数据隔离,可将此参数固定为一个任意字符串 "meta_data": {}, // 附加信息,通常用于封装一些业务相关的字段。查看对话消息详情时,系统会透传此附加信息。 "custom_variables": {}, // 智能体中定义的变量。在智能体prompt中设置变量{{key}}后,可以通过该参数传入变量值,同时支持Jinja2语法。详细说明可参考变量示例。变量名只支持英文字母和下划线。 "extra_params": {}, // 附加参数,通常用于特殊场景下指定一些必要参数供模型判断,例如指定经纬度,并询问智能体此位置的天气。自定义键值对格式,其中键(key)仅支持设置为:latitude:纬度,此时值(Value)为纬度值,例如39.9800718。longitude:经度,此时值(Value)为经度值,例如116.309314。 "parameters": {"custom_var_1": "测试"} }, "input_audio": { // 输入音频格式 "format": "pcm", // 输入音频格式,支持 pcm/wav/ogg。默认 wav "codec": "pcm", // 输入音频编码。 pcm/opus。默认 pcm "sample_rate": 24000, // 采样率 "channel": 1, // 通道数 "bit_depth": 16 // 位深 }, "output_audio": { // 输出音频格式 "codec": "opus" // pcm/opus 输出音频格式, 默认 pcm "opus_config": { "bitrate": 48000, // 码率 "use_cbr": false, // 是否使用 cbr 编码 "frame_size_ms": 10, // 帧长(单位ms) "limit_config": { "period": 2, // 周期(单位 s) "max_frame_num": 300 // 周期内返回最大 opus 帧数量 } }, "speech_rate": 50, // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速 "voice_id": "7426720361733046281" } }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***", } } ``` ## 对话开始 * **事件类型**:`conversation.chat.created` * **事件说明**:创建对话的事件,表示对话开始。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.chat.created`。 | | data | Object | 必选 | 事件数据,包含对话的详细信息。 | | data.id | String | 必选 | 对话 ID,即对话的唯一标识。 | | data.conversation_id | String | 必选 | 会话 ID,即会话的唯一标识。 | | data.bot_id | String | 必选 | 要进行会话聊天的智能体 ID。 | | data.created_at | Integer | 可选 | 对话创建的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.last_error | Object | 可选 | 对话运行异常时,此字段中返回详细的错误信息,包括:

* Code:错误码。Integer 类型。0 表示成功,其他值表示失败。
* Msg:错误信息。String 类型。 | | data.meta_data | Map | 可选 | 创建消息时的附加消息,用于传入使用方的自定义数据,获取消息时也会返回此附加消息。自定义键值对,应指定为 Map 对象格式。长度为 16 对键值对,其中键(key)的长度范围为 1~64 个字符,值(value)的长度范围为 1~512 个字符。 | | data.status | String | 可选 | 对话的运行状态。取值为 `created`,即对话已创建。 | | data.usage | Object | 可选 | 本次对话消耗的 Token 信息。 | | data.usage.token_count | Integer | 可选 | 本次对话消耗的 Token 总数,包括 input 和 output 部分的消耗。 | | data.usage.output_count | Integer | 可选 | output 部分消耗的 Token 总数。 | | data.usage.input_count | Integer | 可选 | input 部分消耗的 Token 总数。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "744666853824656xxx", "event_type": "conversation.chat.created", "data": { "id": "123", "conversation_id": "123", "bot_id": "222", "created_at": 1710348675, "completed_at": null, "last_error": null, "meta_data": {}, "status": "created", "usage": null }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 对话正在处理 * **事件类型**:`conversation.chat.in_progress` * **事件说明**:服务端正在处理对话。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.chat.in_progress`。 | | data | Object | 必选 | 事件数据,包含对话的详细信息。 | | data.id | String | 必选 | 对话 ID,即对话的唯一标识。 | | data.conversation_id | String | 必选 | 会话 ID,即会话的唯一标识。 | | data.bot_id | String | 必选 | 要进行会话聊天的智能体 ID。 | | data.created_at | Integer | 可选 | 对话创建的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.last_error | Object | 可选 | 对话运行异常时,此字段中返回详细的错误信息,包括:

* Code:错误码。Integer 类型。0 表示成功,其他值表示失败。
* Msg:错误信息。String 类型。 | | data.meta_data | Map | 可选 | 创建消息时的附加消息,用于传入使用方的自定义数据,获取消息时也会返回此附加消息。自定义键值对,应指定为 Map 对象格式。长度为 16 对键值对,其中键(key)的长度范围为 1~64 个字符,值(value)的长度范围为 1~512 个字符。 | | data.status | String | 可选 | 对话的运行状态。取值为 `in_progress`,即智能体正在处理中。 | | data.usage | Object | 可选 | 本次对话消耗的 Token 信息。 | | data.usage.token_count | Integer | 可选 | 本次对话消耗的 Token 总数,包括 input 和 output 部分的消耗。 | | data.usage.output_count | Integer | 可选 | output 部分消耗的 Token 总数。 | | data.usage.input_count | Integer | 可选 | input 部分消耗的 Token 总数。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "744666853824656xxxx", "event_type": "conversation.chat.in_progress", "data": { "id": "123", "conversation_id": "123", "bot_id": "222", "created_at": 1710348675, "completed_at": null, "last_error": null, "meta_data": {}, "status": "in_progress", "usage": null }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 增量消息 * **事件类型**:`conversation.message.delta` * **事件说明**:增量消息,通常是 `type=answer` 时的增量消息。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.message.delta`。 | | data | Object | 必选 | 事件数据,包含消息的详细信息。 | | data.id | String | 必选 | Message ID,即消息的唯一标识。 | | data.conversation_id | String | 必选 | 此消息所在的会话 ID。 | | data.bot_id | String | 必选 | 编写此消息的智能体 ID。此参数仅在对话产生的消息中返回。 | | data.chat_id | String | 必选 | Chat ID。此参数仅在对话产生的消息中返回。 | | data.meta_data | Map | 可选 | 创建消息时的附加消息,获取消息时也会返回此附加消息。 | | data.role | String | 必选 | 发送这条消息的实体。取值:

* `user`:代表该条消息内容是用户发送的。
* `assistant`:代表该条消息内容是智能体发送的。 | | data.content | String | 必选 | 消息的内容,支持纯文本、多模态(文本、图片、文件混合输入)、卡片等多种类型的内容。 | | data.content_type | String | 必选 | 消息内容的类型,取值包括:

* `text`:文本。
* `object_string`:多模态内容,即文本和文件的组合、文本和图片的组合。
* `card`:卡片。此枚举值仅在接口响应中出现,不支持作为入参。、 | | data.type | String | 必选 | 消息类型。取值包括:

* `question`:用户输入内容。
* `answer`:智能体返回给用户的消息内容,支持增量返回。如果工作流绑定了 message 节点,可能会存在多 answer 场景,此时可以用流式返回的结束标志来判断所有 answer 完成。
* `function_call`:智能体对话过程中调用函数(function call)的中间结果。
* `tool_output`:调用工具(function call)后返回的结果。
* `tool_response`:调用工具(function call)后返回的结果。
* `verbose`:多 answer 场景下,服务端会返回一个 verbose 包,对应的 content 为 JSON 格式,`content.msg_type = generate_answer_finish` 代表全部 answer 回复完成。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.message.delta", "data": { "id": "msg_006", "role": "assistant", "type": "answer", "content": "你好你好", "content_type": "text", "chat_id": "123", "conversation_id": "123", "bot_id": "222" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 增量语音字幕 * **事件类型:** `conversation.audio.sentence_start` * **事件说明**:一条新的字幕句子,后续的 `conversation.audio.delta` 增量语音均属于当前字幕句子,可能有多个增量语音共同对应此句字幕的文字内容。 * **事件结构:** | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.audio.sentence_start`。 | | data | Object | 必选 | 事件数据对象,包含增量语音的字幕内容。 | | data.text | String | 必选 | 新字幕句子的文本内容,后续相关 `conversation.audio.delta` 增量语音均对应此文本。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.audio.sentence_start", "data": { "text": "你好呀。" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 增量语音 * **事件类型**:`conversation.audio.delta` * **事件说明**:增量语音,通常是 `type=answer` 时的增量语音。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.audio.delta`。 | | data | Object | 必选 | 事件数据,包含消息的详细信息。 | | data.id | String | 必选 | Message ID,即消息的唯一标识。 | | data.conversation_id | String | 必选 | 此消息所在的会话 ID。 | | data.bot_id | String | 必选 | 编写此消息的智能体 ID。此参数仅在对话产生的消息中返回。 | | data.chat_id | String | 必选 | Chat ID。此参数仅在对话产生的消息中返回。 | | data.meta_data | Map | 可选 | 创建消息时的附加消息,获取消息时也会返回此附加消息。 | | data.role | String | 必选 | 发送这条消息的实体。取值:

* `user`:代表该条消息内容是用户发送的。
* `assistant`:代表该条消息内容是智能体发送的。 | | data.content | String | 必选 | 语音二进制 base64 后的字符串。 | | data.content_type | String | 必选 | 固定为 audio。 | | data.type | String | 必选 | 消息类型。取值包括:

* `question`:用户输入内容。
* `answer`:智能体返回给用户的消息内容,支持增量返回。如果工作流绑定了 message 节点,可能会存在多 answer 场景,此时可以用流式返回的结束标志来判断所有 answer 完成。
* `function_call`:智能体对话过程中调用函数(function call)的中间结果。
* `tool_output`:调用工具(function call)后返回的结果。
* `tool_response`:调用工具(function call)后返回的结果。
* `verbose`:多 answer 场景下,服务端会返回一个 verbose 包,对应的 content 为 JSON 格式,`content.msg_type = generate_answer_finish` 代表全部 answer 回复完成。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.audio.delta", "data": { "id": "msg_006", "role": "assistant", "type": "answer", "content": "base64audio", "content_type": "audio", "chat_id": "123", "conversation_id": "123", "bot_id": "222" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 消息完成 * **事件类型**:`conversation.message.completed` * **事件说明**:消息已回复完成。此时事件中带有所有 `message.delta` 的拼接结果,且每个消息均为 `completed` 状态。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.message.completed`。 | | data | Object | 必选 | 事件数据,包含对话的详细信息。 | | data.id | String | 必选 | 对话 ID,即对话的唯一标识。 | | data.conversation_id | String | 必选 | 此消息所在的会话 ID。 | | data.bot_id | String | 必选 | 编写此消息的智能体 ID。此参数仅在对话产生的消息中返回。 | | data.chat_id | String | 必选 | Chat ID。此参数仅在对话产生的消息中返回。 | | data.meta_data | Map | 必选 | 创建消息时的附加消息,用于传入使用方的自定义数据,获取消息时也会返回此附加消息。 | | data.role | String | 必选 | 发送这条消息的实体。取值:

* `user`:代表该条消息内容是用户发送的。
* `assistant`:代表该条消息内容是智能体发送的。 | | data.content | String | 必选 | 消息的内容,支持纯文本、多模态(文本、图片、文件混合输入)、卡片等多种类型的内容。当 content_type 为 `object_string`时,content 的结构和详细参数说明请参见[object_string object](https://docs.coze.cn/api/open/docs/developer_guides/chat_v3#ff7MfGyngc)。 | | data.content_type | String | 必选 | 消息内容的类型,取值包括:

* `text`:文本。
* `object_string`:多模态内容,即文本和文件的组合、文本和图片的组合。
* `card`:卡片。此枚举值仅在接口响应中出现,不支持作为入参。 | | data.type | String | 必选 | 消息类型。取值包括:

* `question`:用户输入内容。
* `answer`:智能体返回给用户的消息内容,支持增量返回。如果工作流绑定了 message 节点,可能会存在多 answer 场景,此时可以用流式返回的结束标志来判断所有 answer 完成。
* `function_call`:智能体对话过程中调用函数(function call)的中间结果。
* `tool_output`:调用工具(function call)后返回的结果。
* `tool_response`:调用工具(function call)后返回的结果。
* `verbose`:多 answer 场景下,服务端会返回一个 verbose 包,对应的 content 为 JSON 格式,`content.msg_type = generate_answer_finish` 代表全部 answer 回复完成。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.message.completed", "data": { "id": "msg_002", "role": "assistant", "type": "function_call", "content": "{\"name\":\"toutiaosousuo-search\",\"arguments\":{\"cursor\":0,\"input_query\":\"今天的体育新闻\",\"plugin_id\":7281192623887548473,\"api_id\":7288907006982012986,\"plugin_type\":1}}", "content_type": "text", "chat_id": "123", "conversation_id": "123", "bot_id": "222" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 语音回复完成 * **事件类型**:`conversation.audio.completed` * **事件说明**:音频回复完成。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.audio.completed`。 | | data | Object | 必选 | 事件数据,包含对话的详细信息。 | | data.id | String | 必选 | Message ID,即消息的唯一标识。 | | data.conversation_id | String | 必选 | 此消息所在的会话 ID。 | | data.bot_id | String | 必选 | 编写此消息的智能体 ID。此参数仅在对话产生的消息中返回。 | | data.chat_id | String | 必选 | Chat ID。此参数仅在对话产生的消息中返回。 | | data.meta_data | Map | 必选 | 创建消息时的附加消息,获取消息时也会返回此附加消息。 | | data.role | String | 必选 | 发送这条消息的实体。取值:

* `user`:代表该条消息内容是用户发送的。
* `assistant`:代表该条消息内容是智能体发送的。 | | data.content | String | 必选 | 消息的内容,支持纯文本、多模态(文本、图片、文件混合输入)、卡片等多种类型的内容。 | | data.content_type | String | 必选 | 消息内容的类型,取值包括:

* `text`:文本。
* `object_string`:多模态内容,即文本和文件的组合、文本和图片的组合。
* `card`:卡片。此枚举值仅在接口响应中出现,不支持作为入参。 | | data.type | String | 必选 | 消息类型。取值包括:

* `question`:用户输入内容。
* `answer`:智能体返回给用户的消息内容,支持增量返回。如果工作流绑定了 message 节点,可能会存在多 answer 场景,此时可以用流式返回的结束标志来判断所有 answer 完成。
* `function_call`:智能体对话过程中调用函数(function call)的中间结果。
* `tool_output`:调用工具(function call)后返回的结果。
* `tool_response`:调用工具(function call)后返回的结果。
* `verbose`:多 answer 场景下,服务端会返回一个 verbose 包,对应的 content 为 JSON 格式,`content.msg_type = generate_answer_finish` 代表全部 answer 回复完成。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.audio.completed", "data": { "id": "msg_002", "role": "assistant", "type": "function_call", "content": "{\"name\":\"toutiaosousuo-search\",\"arguments\":{\"cursor\":0,\"input_query\":\"今天的体育新闻\",\"plugin_id\":7281192623887548473,\"api_id\":7288907006982012986,\"plugin_type\":1}}", "content_type": "audio", "chat_id": "123", "conversation_id": "123", "bot_id": "222" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 对话完成 * **事件类型**:`conversation.chat.completed` * **事件说明**:表示对话已完成。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.chat.completed`。 | | data | Object | 必选 | 事件数据,包含对话的详细信息。 | | data.id | String | 必选 | 对话 ID,即对话的唯一标识。 | | data.conversation_id | String | 必选 | 会话 ID,即会话的唯一标识。 | | data.bot_id | String | 必选 | 要进行会话聊天的智能体 ID。 | | data.created_at | Integer | 可选 | 对话创建的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.completed_at | Integer | 可选 | 对话结束的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.last_error | Object | 可选 | 对话运行异常时,此字段中返回详细的错误信息,包括:

* Code:错误码。Integer 类型。0 表示成功,其他值表示失败。
* Msg:错误信息。String 类型。 | | data.meta_data | Map | 可选 | 创建消息时的附加消息,用于传入使用方的自定义数据,获取消息时也会返回此附加消息。自定义键值对,应指定为 Map 对象格式。长度为 16 对键值对,其中键(key)的长度范围为 1~64 个字符,值(value)的长度范围为 1~512 个字符。 | | data.status | String | 可选 | 对话的运行状态。取值为 `completed`,即智能体已完成处理,本次对话结束。 | | data.usage | Object | 可选 | 对话的 Token 使用情况。 | | data.usage.token_count | Integer | 可选 | 本次对话消耗的 Token 总数,包括 input 和 output 部分的消耗。 | | data.usage.output_count | Integer | 可选 | output 部分消耗的 Token 总数。 | | data.usage.input_count | Integer | 可选 | input 部分消耗的 Token 总数。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.chat.completed", "data": { "id": "123", "chat_id": "123", "conversation_id": "123", "bot_id": "222", "created_at": 1710348675, "completed_at": 1710348675, "last_error": null, "meta_data": {}, "status": "completed", "usage": { "token_count": 3397, "output_tokens": 1173, "input_tokens": 2224 } }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 对话失败 * **事件类型**:`conversation.chat.failed` * **事件说明**:此事件用于标识对话失败。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `conversation.chat.failed`。 | | data | Object | 必选 | 事件数据,包含对话的详细信息。 | | data.id | String | 必选 | 对话 ID,即对话的唯一标识。 | | data.conversation_id | String | 必选 | 会话 ID,即会话的唯一标识。 | | data.bot_id | String | 必选 | 要进行会话聊天的智能体 ID。 | | data.created_at | Integer | 可选 | 对话创建的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.failed_at | Integer | 可选 | 对话失败的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.last_error | Object | 可选 | 对话运行异常时,此字段中返回详细的错误信息,包括:

* Code:错误码。Integer 类型。0 表示成功,其他值表示失败。
* Msg:错误信息。String 类型。 | | data.meta_data | Map | 可选 | 创建消息时的附加消息,用于传入使用方的自定义数据,获取消息时也会返回此附加消息。自定义键值对,应指定为 Map 对象格式。长度为 16 对键值对,其中键(key)的长度范围为 1~64 个字符,值(value)的长度范围为 1~512 个字符。 | | data.status | String | 可选 | 对话的运行状态。取值为 `failed`,即对话失败。 | | data.usage | Object | 可选 | 对话的 Token 使用情况。 | | data.usage.token_count | Integer | 可选 | 本次对话消耗的 Token 总数,包括 input 和 output 部分的消耗。 | | data.usage.output_count | Integer | 可选 | output 部分消耗的 Token 总数。 | | data.usage.input_count | Integer | 可选 | input 部分消耗的 Token 总数。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.chat.failed", "data": { "id": "123", "chat_id": "123", "conversation_id": "123", "bot_id": "222", "created_at": 1710348675, "failed_at": 1710348675, "last_error": { "code": 1, "msg": "发生异常" }, "meta_data": {}, "status": "failed", "usage": { "token_count": 3397, "output_tokens": 1173, "input_tokens": 2224 } }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 发生错误 * **事件类型**:`error` * **事件说明**:对话过程中的错误事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `error`。 | | data | Object | 必选 | 事件数据,包含错误信息。 | | data.code | Integer | 必选 | 错误码。 | | data.msg | String | 必选 | 错误信息。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "error", "data": { "code": 1, "msg": "发生异常" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## `input_audio_buffer` 提交成功 * **事件类型**:`input_audio_buffer.completed` * **事件说明**:流式提交的音频完成后,返回此事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 客户端自行生成的事件 ID,方便定位问题。 | | event_type | String | 必选 | 固定为 `input_audio_buffer.completed`。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_id", "event_type": "input_audio_buffer.completed", "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## `input_audio_buffer` 清除成功 * **事件类型**:`input_audio_buffer.cleared` * **事件说明**:清除缓冲区音频成功后,返回此事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 客户端自行生成的事件 ID,方便定位问题。 | | event_type | String | 必选 | 固定为 `input_audio_buffer.cleared`。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_id", "event_type": "input_audio_buffer.cleared", "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 上下文清除完成 * **事件类型**:`conversation.cleared` * **事件说明**:清除上下文成功后,返回此事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 客户端自行生成的事件 ID,方便定位问题。 | | event_type | String | 必选 | 固定为 `conversation.cleared`。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_id", "event_type": "conversation.cleared", "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 智能体输出中断 * **事件类型**:`conversation.chat.canceled` * **事件说明**:客户端提交 `conversation.chat.cancel` 事件,服务端完成中断后,将返回此事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 客户端自行生成的事件 ID,方便定位问题。 | | event_type | String | 必选 | 必填 `conversation.chat.canceled`。 | | data | Object | 可选 | | | data.code | int | 可选 | 输出中断类型枚举值,包括
1: 被用户*语音说话打断* 2: *用户主动 cancel* 3: *手动提交对话内容* | | data.msg | String | 可选 | 智能体输出中断的详细说明 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_id", "event_type": "conversation.chat.canceled", "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 用户语音识别字幕 * **事件类型**:`conversation.audio_transcript.update` * **事件说明**:用户语音识别的中间值,每次返回都是全量文本。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 必填 `conversation.audio_transcript.update`。 | | data | Object | 必选 | 事件数据,包含语音识别的中间值。 | | data.content | String | 必选 | 语音识别的中间值。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.audio_transcript.update", "data": { "content": "今天的" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 用户语音识别完成 * **事件类型**:`conversation.audio_transcript.completed` * **事件说明**:用户语音识别完成。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 必填 `conversation.audio_transcript.completed`。 | | data | Object | 必选 | 事件数据,包含语音识别的最终结果。 | | data.content | String | 必选 | 语音识别的最终结果。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "event_1", "event_type": "conversation.audio_transcript.completed", "data": { "content": "今天的天气怎么样?" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 端插件请求 * **事件类型**:`conversation.chat.requires_action` * **事件说明**:对话中断,需要使用方上报工具的执行结果。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 必填 `conversation.chat.requires_action`。 | | data | Object | 必选 | 事件数据,包含对话的详细信息。 | | data.id | String | 必选 | 对话 ID,即对话的唯一标识。 | | data.conversation_id | String | 必选 | 会话 ID,即会话的唯一标识。 | | data.bot_id | String | 必选 | 要进行会话聊天的智能体 ID。 | | data.created_at | Integer | 可选 | 对话创建的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.completed_at | Integer | 可选 | 对话完成的时间。格式为 10 位的 Unixtime 时间戳,单位为秒。 | | data.last_error | Object | 可选 | 对话运行异常时,此字段中返回详细的错误信息,包括:

* Code:错误码。Integer 类型。0 表示成功,其他值表示失败。
* Msg:错误信息。String 类型。 | | data.meta_data | Map | 可选 | 创建消息时的附加消息,用于传入使用方的自定义数据,获取消息时也会返回此附加消息。自定义键值对,应指定为 Map 对象格式。长度为 16 对键值对,其中键(key)的长度范围为 1~64 个字符,值(value)的长度范围为 1~512 个字符。 | | data.status | String | 可选 | 对话的运行状态。取值为 `requires_action`,表示对话需要用户操作。 | | data.usage | Object | 可选 | 对话的 Token 使用情况。 | | data.usage.token_count | Integer | 可选 | 本次对话消耗的 Token 总数,包括 input 和 output 部分的消耗。 | | data.usage.output_count | Integer | 可选 | output 部分消耗的 Token 总数。 | | data.usage.input_count | Integer | 可选 | input 部分消耗的 Token 总数。 | | data.required_action | Object | 可选 | 需要执行的额外操作。 | | data.required_action.type | String | 可选 | 额外操作的类型,枚举值为 `submit_tool_outputs`。 | | data.required_action.submit_tool_outputs | Object | 可选 | 需要提交的结果详情,通过提交接口上传,并可以继续聊天。 | | data.required_action.submit_tool_outputs.tool_calls | Array | 可选 | 具体上报信息详情。 | | data.required_action.submit_tool_outputs.tool_calls[].id | String | 可选 | 上报运行结果的 ID。 | | data.required_action.submit_tool_outputs.tool_calls[].type | String | 可选 | 工具类型,枚举值为 `function`。 | | data.required_action.submit_tool_outputs.tool_calls[].function | Object | 可选 | 执行方法 `function` 的定义。 | | data.required_action.submit_tool_outputs.tool_calls[].function.name | String | 可选 | 方法名。 | | data.required_action.submit_tool_outputs.tool_calls[].function.arguments | String | 可选 | 方法参数。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "7446668538246561821", "event_type": "conversation.chat.requires_action", "data": { "id": "7434369946098090003", "conversation_id": "7434368393420996671", "bot_id": "7379165428687536166", "created_at": 1730949143, "completed_at": 1730949146, "last_error": { "code": 0, "msg": "" }, "status": "requires_action", "usage": { "token_count": 0, "output_count": 0, "input_count": 0 }, "required_action": { "type": "submit_tool_outputs", "submit_tool_outputs": { "tool_calls": [ { "id": "BUJJS0JKQ0dHR0VeFkNCQF5HEEZBXhJFEUJeEhFCRkESSktDREISSUI=", "type": "function", "function": { "name": "get_current_temperature", "arguments":"{\'location\":\'深圳\'}" }, "require_info": null } ] } }, "section_id": "7434368393420996671" }, "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 用户开始说话 * **事件类型**:`input_audio_buffer.speech_started` * **事件说明**:此事件表示服务端识别到用户正在说话。只有在 `server_vad` 模式下,才会返回此事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `input_audio_buffer.speech_started`。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "7446668538246561xxxx", "event_type": "input_audio_buffer.speech_started", "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ``` ## 用户结束说话 * **事件类型**:`input_audio_buffer.speech_stopped` * **事件说明**:此事件表示服务端识别到用户已停止说话。只有在 `server_vad` 模式下,才会返回此事件。 * **事件结构**: | **参数** | **类型** | **是否必选** | **说明** | | --- | --- | --- | --- | | id | String | 必选 | 服务端生成的唯一 ID。 | | event_type | String | 必选 | 固定为 `input_audio_buffer.speech_stopped`。 | | detail | Object | 必选 | 事件详情。 | | detail.logid | String | 必选 | 本次请求的日志 ID。如果遇到异常报错场景,且反复重试仍然报错,可以根据此 logid 及错误码联系扣子团队获取帮助。详细说明可参考获取帮助和技术支持。 | * **事件示例**: ```JSON { "id": "7446668538246561xxxx", "event_type": "input_audio_buffer.speech_stopped", "detail": { "logid": "20241210152726467C48D89D6DB2F3***" } } ```