流程脚本 chat 节点
chat 节点在节点内部执行持续 ASR、流式 Chat SSE、分句 TTS 和插话打断,退出后按 handle 回到主流程。
json
{
"id": "chat-sales",
"type": "chat",
"data": {
"role": "金牌汽车销售顾问",
"opening_prompt": "您好 {customer_name},您可以直接告诉我需求。",
"goodbye_prompt": "好的,那就不打扰您了,祝您生活愉快,再见!",
"system_prompt": "你是一名热情专业的汽车销售顾问,针对用户预算推荐合适车型...",
"branches": [{ "key": "done", "desc": "诉求已解决或用户明确结束" }],
"silence_timeout_seconds": 5,
"disable_thinking": true,
"max_tokens": 256,
"interruptible": true,
"save_as": "chat_result"
}
}出口分支契约
- 语义分支:每个配置在
branches中的业务分支均需有一条同名sourceHandle连线。 - 统一兜底出口:包含一个固定的
fallback(兜底/未决)出口连线。 - 保留字保护:业务语义分支禁止使用
fallback、timeout、error保留 key。 - 向后兼容性:存量脚本中既有的
timeout与error出口连线继续自动兼容放行。运行时引擎与试运行模拟器在触发兜底时,若画布未配置fallback出边,会自动平滑回退匹配至现有的timeout或error连线,确保老脚本免改动稳定运行。
字段说明与缺省
- Voice Agent 角色与提示词(Flow-Centric 内联架构):
role:助手定位/角色画像(如金牌汽车销售顾问)。画布节点副标题联动展示;未配置system_prompt时,引擎自动接入 Voice Agent 规范化组装算法composeSystemPrompt生成严格适配电话对话基线、防 Markdown、防幻觉的完整系统提示词。system_prompt:自定义系统提示词,优先级高于role的自动生成,支持{var}变量插值。goodbye_prompt:挂机告别语(如好的,那就不打扰您了,祝您生活愉快,再见!)。通话引擎原生集成挂机意图识别(isHangupIntent),用户在对话中表达再见/明确拒绝时,优先播报告别语并优雅退出。chat_profile:引用的外部对话策略 key,在内联 Prompt 模式下可省略。
- 推理与延时控制:
disable_thinking:布尔值,缺省为true。电话语音场景下默认禁用深度思考流(自动向 DeepSeek/Qwen 注入思考抑制参数),消灭漫长的首字推理延迟。max_tokens:单轮最大生成 token 数,只接受正整数,缺省为256。temperature:采样温度(浮点数,0.0~1.0),缺省0.7。
- 对话控制:
opening_prompt:节点开场引导语,支持{var}变量插值。branches:业务语义分支数组,至少一项且每项均含key+desc,重复 key 或空 desc 会导致校验失败。silence_timeout_seconds:静默等待时长(秒),可选,只接受 2~60 之间的整数,缺省值为5秒。控制用户每轮未开口时的 ASR 超时时间。interruptible:布尔值,缺省为true。设为false时用户发声不打断播报,也不取消当轮 SSE 流。save_as:保存节点执行结果变量名前缀,注册.status、.exitKey、.turnCount、.summary、.lastUserText、.lastAssistantText和.reason等字段。
退出路径与智能催问机制
- 业务意图达成(
status=exit):Chat 模型判定命中业务语义分支,结束对话并沿对应业务分支流转。 - 上下文感知静默催问与脱离判定(
status=fallback):- 当用户在
silence_timeout_seconds时长内保持静默未发声,触发首轮静默; - 系统不会播报呆板固定的单句录音,而是向对话上下文注入系统提示,驱动大模型结合上下文生成自然、简短的口语化提醒或追问,并实时流式分句播报;
- 静默催问支持 Barge-in 用户随时插话打断;
- 催问后用户若再次无应答(连续第 2 次静默),判定用户已脱离交互,退出并返回
{ handle: "fallback", ... },沿fallback出口流转。
- 当用户在
- 系统异常与不可恢复故障(
status=fallback):ASR 识别彻底失效、大模型 SSE 链路中断或返回非法状态时,统一退出并沿fallback出口流转,避免通话卡死挂起。
交互打断与分句播报
节点内持续 ASR 固定使用 bargeInTrigger: "partial":只有非空 partial / final transcript 才会停止当前 TTS、取消旧 SSE 并进入新一轮。空 speech-start、纯空白 partial 或只有 VAD flags 的事件不会打断分句播放。每个 TTS chunk 会记录序号、字符数、完成状态、interruptedBy 和 stopReason。同一通电话的 chat 节点共享由 callflow-esl 维护的历史消息队列(保留最近 20 条消息,超出部分按 FIFO 剔除)。