跳到正文

流程脚本 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 等字段。

退出路径与智能催问机制 ​

  1. 业务意图达成(status=exit):Chat 模型判定命中业务语义分支,结束对话并沿对应业务分支流转。
  2. 上下文感知静默催问与脱离判定(status=fallback):
    • 当用户在 silence_timeout_seconds 时长内保持静默未发声,触发首轮静默;
    • 系统不会播报呆板固定的单句录音,而是向对话上下文注入系统提示,驱动大模型结合上下文生成自然、简短的口语化提醒或追问,并实时流式分句播报;
    • 静默催问支持 Barge-in 用户随时插话打断;
    • 催问后用户若再次无应答(连续第 2 次静默),判定用户已脱离交互,退出并返回 { handle: "fallback", ... },沿 fallback 出口流转。
  3. 系统异常与不可恢复故障(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 剔除)。

文档与代码在同一仓库维护,现有 Markdown 是唯一内容源。