嵌入小部件
语音、潜在客户和持久化
小部件不仅仅是一个聊天框。它内联捕获潜在客户、转录语音、在重新加载时持久化, 并在操作员接管时显示实时的“人工在这里”状态。 本页涵盖每个功能以及如何配置它。
对话持久化
每个访客都会获得一个 anon_id(首次访问时写入 localStorage 的随机字符串)。
重新加载时,小部件使用相同的 anon_id 调用 /v1/widget/init,
如果最近一次对话少于 24 小时,服务器会恢复该对话。
Init 响应包括最后 30 条消息,因此聊天记录以访客离开的顺序重新水合。
“清除对话”按钮(在小部件标题中)在对话行上写入 cleared_at 时间戳 —
过去的消息保留在数据库中以用于分析 + 潜在客户链接,但不再向访客显示。
语音麦克风
输入区域的麦克风按钮让访客可以口述而不是打字。
小部件使用浏览器内置的 SpeechRecognition API — 没有服务器端语音模型。
录音时麦克风显示声纳环动画;再次点击停止并将转录文本插入输入框(如果已有文本则追加,因此您可以口述、编辑,然后再口述更多)。
没有 SpeechRecognition 的浏览器(Firefox、旧版 Safari)不显示麦克风按钮。
没有回退 — 该功能是机会性的。
潜在客户捕获
小部件可以内联收集联系信息,而无需强制访客离开对话。 潜在客户捕获在以下情况下触发:
kind=lead_capture的行为规则匹配。- 访客明确要求被联系(“有人能给我打电话吗?”,“给我发一封报价邮件”)。
- 您将 CTA 按钮连接到
lead_capture操作。
表单字段按智能体配置。默认是姓名 + 电子邮件;您可以添加电话、公司和自定义字段。
提交的潜在客户 POST 到 /v1/widget/leads(每个 JWT 速率限制)并立即出现在 /app/inbox(每工作区潜在客户列表)中。
基于意图的智能捕获
最新更新(commit 9190aa5)添加了基于意图的捕获:
小部件监视对话中暗示真实销售意图的短语 — 定价问题、“这适合…吗?”、“我可以演示…” —
并在几轮后主动提供潜在客户表单。
阈值和短语列表可按智能体调整。
人工接管
当工作区操作员在 /app/inbox 中认领对话时,
小部件接收 Reverb 事件(conversation.takeover)并更新聊天标题以显示“人工在这里”徽章。
从那时起,AI 保持暂停 — 每条访客消息都发送给操作员,每个操作员回复都流式传输给访客。
访客看到一个连续的线程;在幕后,消息 role 从 assistant 翻转到 human-agent 再返回。
请参阅 收件箱和人工接管 了解操作员端。
引用
每当智能体从检索源回答时,引用芯片会出现在消息下方。
点击一个在新标签页中打开源 URL。
芯片编号([1], [2])与响应文本中的内联引用匹配 —
关心的访客可以验证答案;不关心的访客看到干净的回复。
精选答案也可以包括可选的引用 URL — 当预设答案来自特定页面时有用。
流式传输
消息通过 Server-Sent Events 逐 token 流式传输。
小部件读取流并实时将 token 附加到 DOM。
如果流在中途出错(网络闪烁、LLM 超时),小部件在显示错误状态之前自动重试最多 3 次 —
即使重试也只出现一个用户气泡(commit a576e1c)。
品牌化
小部件页脚默认显示“由互客鱼提供支持”链接。
对于启用了 remove_branding 功能标志的计划的工作区,它被隐藏 —
请参阅 计费和计划。
品牌标签、URL 和徽标都来自平台管理员配置(config('branding.*') + 可选的 app_settings 单例覆盖),
因此自托管部署可以完全重新品牌化页脚。
存储
小部件使用 localStorage 用于:
anon_id— 持久访客标识符。- 对话清除状态(访客通过“清除”隐藏了哪些消息 ID)。
客户端不存储任何个人身份信息。JWT 本身存在于内存中 — 每次 init 时重新颁发。