外观
3种交互模式
模式由 VaGlowInput.vue 右下角下拉切换,循环顺序 智能交互 → 专家问答 → 系统导览。
AI 回答中 / 演示进行中(modeLocked)禁用切换,避免中途打断;若在回答中切换,切换提示会暂存在回答结束后追加到消息列表末尾。
三种模式下,输入框左下角按钮会呈现不同内容:
| 模式 | 左下角按钮 | 下拉内容 |
|---|---|---|
| 智能交互 | 猜你想问 | 接口分页返回的推荐问题,右上角"换一批"翻页(末页回到第一页) |
| 专家问答 | 选择知识库 | 知识库分类列表(进入模式时懒加载一次) |
| 系统导览 | 演示指令 | 内置问答库的 10 条指令(由 demoQA.js 动态生成) |
一、智能交互(interactive)

面向业务数据问答的 Agent 模式,走后端 SSE 流式接口。
请求:
GET {VITE_APP_BASE_API}/ai/chat/stream?message=xxx,非首次追加&sessionId=xxx;请求头带Authorization: Bearer {token}。多轮记忆:后端在
type=done事件中返回sessionId,前端缓存后下次请求回传;清空对话视为新会话,重置sessionId。事件处理(
streamAiChatReply,实现位于core/aiChatStream.js):事件 type 前端行为 answer拼接正文,实时渲染;复位工具调用状态 tool_call不显示内容,指示器显示"正在调用工具" tool_response不显示内容,指示器显示"查询结果处理中" done结束流,提取 { timeCost, sessionId };不展示耗时协议兼容:同时支持
data:{"type":..}、event:+data:行、answer{...}类型前缀、以及若依{code, data:{...}}多层包装(用deepFind递归取值)。空闲看门狗:30 秒(
STREAM_IDLE_TIMEOUT_MS)内无任何数据到达则abort整个请求;超时且无任何正文时提示"对话超时、请稍后重试"。边收边播:短回答在流式过程中不会发出任何 TTS 请求,实际由流结束时的
flush收尾统一播报;只有长回答才会中途播报。
二、专家问答(expert)

面向知识库 + 联网检索的深度问答,走 Dify 风格 SSE 接口。
请求:
POST /ai/orchestrate/chat/stream,请求体由buildExpertChatPayload构造(含query、responseMode: 'streaming'、model、knowledge、internalData、externalSearch)。事件处理(
handleDifyStreamEvent):事件 前端行为 retrieval_status/search_status状态文本写入独立字段 retrievalStatusText,不混入正式回答search联网搜索结果,渲染为可折叠引用卡片(默认折叠),同步推给移动端 message/agent_message正式回答文本累加 message_end立即终止读取(不等后端关连接),避免 reader.read()挂起think一期不展示 知识库:左下角下拉选择分类(接口
/ai/kb/categories/chat-options);移动端选中的分类通过 COMMAND 的knowledgeCategory字段 piggyback 传给大屏,优先级更高。语音播报:流结束后对完整回答做一次 TTS 分段播报(不边收边播)。
三、系统导览(demo)

面向大屏演示汇报的确定性模式:不调用大模型生成回答,全部走本地内置脚本,保证演示稳定、可复现。
处理流程(doSendDemoMessage,实现位于 core/demoTour.js):
- 精确匹配内置问答库(
demoList.some(item => item.question === content))→ 播放内置多段回复 + 派发functionTool动作; - 未精确匹配 → 不回复内置内容,改由 NLU 语义识别结果驱动,避免与 NLU 重复回答。
段落播放特性:
- 每段先启动音频(优先播放本地预生成 MP3,
public/audios/*.mp3;无音频或加载失败duration=0时回退实时 TTS),同时以打字机逐字输出文本,用Promise.all([typewriter, audio.ended])保证音字同步; - 打字机默认固定 35ms/字;开启"文字跟随音频"后按音频时长反推间隔(
(duration*1000)/字数,下限 15ms); - 段间停顿 220ms;每段播放完后派发该段携带的
functionTool; - 用户点击"禁止播报"/"打断播报"后,
broadcastAborted置位,剩余文字一次性输出并立即结束后续段落与工具派发。
10 条内置指令与 NLU 动作映射,见 内置演示脚本。
四、三模式横向对比
| 维度 | 智能交互 | 专家问答 | 系统导览 |
|---|---|---|---|
| 数据来源 | 后端 Agent(含工具调用) | 知识库 + 联网搜索 + DeepSeek | 前端内置脚本 + NLU |
| 后端依赖 | 高 | 高 | 仅 NLU(演示指令完全离线) |
| 回答可控性 | 中 | 低 | 高(确定性) |
| 大屏联动 | 通过 NLU 动作映射 | 通过 NLU 动作映射 | functionTool 写死 + NLU |
| 语音播报 | 边收边播(受 280 字攒字门槛限制) | 全文播报 | 本地 MP3 优先,回退 TTS |
| 多轮上下文 | sessionId | conversationId: null(单轮) | 无 |
| 面板行为 | 常驻 | 常驻 | 回答中自动折叠 |