VisuGuide Chat SDK
第三方接入说明与在线 Demo。将聊天挂件嵌入您的网站,静态资源从 VisuGuide 官方 OSS 加载, 会话与 AI 能力由 VisuGuide 云端 API 提供。
在线 Demo
本页已按下方「方式一」加载 SDK,右下角为聊天入口(Demo 默认 siteKey=main):
siteKey 为接入站点编号,由 VisuGuide 平台分配(见下方「siteKey 说明」)。
本页 Demo 默认 siteKey=main;可通过 URL 覆盖,例如
?siteKey=your-code(平台分配的编号)。
手机调试控制台:访问 ?debug=1(加载 Eruda 浮层,可查看 console / network)。
视口宽度 ≤480px 时 Demo 会自动启用移动端模式(全屏比例、禁用拖拽、忽略桌面端位置缓存)。
手机端建议直接使用 H5 专用测试页(无文档侧栏,避免滚动冲突)。
OSS 静态资源
SDK 已部署在 VisuGuide 官方 OSS(传输加速),第三方无需自行构建,直接使用以下 URL:
官方基址
https://visuscience.oss-accelerate.aliyuncs.com/visuchatsdk/latest/
文件清单(须保持相对路径)
visuchatsdk/latest/
├── visu-chat.iife.min.js ← Script 标签接入(推荐)
├── visu-chat.css ← 必须引入
├── index.mjs ← Vue / React 等 ESM 接入
└── fonts/
└── material-symbols-outlined.woff2
| 文件 | 用途 |
|---|---|
visu-chat.iife.min.js |
浏览器直接执行,注册全局对象 window.VisuChat |
visu-chat.css |
组件样式(Shadow DOM 隔离,不污染宿主页面) |
index.mjs |
ES Module,供 Webpack / Vite 等打包工具 import |
fonts/*.woff2 |
图标字体,须与 CSS 保持目录相对关系 |
路径自动推断(IIFE 模式)
使用 <script src=".../visu-chat.iife.min.js"> 时,SDK 会根据脚本 URL
自动加载同目录下的 visu-chat.css 与 fonts/material-symbols-outlined.woff2,
一般无需设置 assetsBaseUrl。
集成方式
方式一:Script 标签(IIFE)— 推荐
适用于 PHP、Java 模板、WordPress、静态 HTML 等无前端构建的项目。
<!-- 1. 样式 -->
<link rel="stylesheet"
href="https://visuscience.oss-accelerate.aliyuncs.com/visuchatsdk/latest/visu-chat.css">
<!-- 2. 脚本 -->
<script
src="https://visuscience.oss-accelerate.aliyuncs.com/visuchatsdk/latest/visu-chat.iife.min.js"></script>
<!-- 3. 初始化 -->
<script>
var chat = VisuChat.init({
apiBase: 'https://visuguide.visuscience.com',
wsBase: 'https://ws.visuguide.visuscience.com',
siteKey: 'your-site-key', // 由 VisuGuide 分配
locale: 'zh-CN',
title: '在线客服',
});
</script>
方式二:ES Module
适用于 Vue、React、Next.js、Vite、Webpack 等现代前端项目。
import { init, destroy } from 'https://visuscience.oss-accelerate.aliyuncs.com/visuchatsdk/latest/index.mjs'
const chat = init({
apiBase: 'https://visuguide.visuscience.com',
wsBase: 'https://ws.visuguide.visuscience.com',
siteKey: 'your-site-key',
locale: 'zh-CN',
assetsBaseUrl: 'https://visuscience.oss-accelerate.aliyuncs.com/visuchatsdk/latest/',
})
// 组件卸载时
chat.destroy()
index.mjs 被打包进业务 bundle,SDK 无法自动推断 CSS/字体路径,必须设置
assetsBaseUrl 为 OSS 基址(以 / 结尾)。
方式三:下载到自有 CDN / 服务器
可将 visuchatsdk/latest/ 整个目录下载后部署到您自己的 CDN,替换 URL 即可,目录结构不变。
<link rel="stylesheet" href="https://your-cdn.com/visu-chat/visu-chat.css">
<script src="https://your-cdn.com/visu-chat/visu-chat.iife.min.js"></script>
<script>
VisuChat.init({
apiBase: 'https://visuguide.visuscience.com',
wsBase: 'https://ws.visuguide.visuscience.com',
siteKey: 'your-site-key',
assetsBaseUrl: 'https://your-cdn.com/visu-chat/', // 仅当 JS/CSS 不同目录时需要
});
</script>
siteKey 说明
siteKey 是 VisuGuide 平台为您分配的接入站点编号,
用于标识当前页面上的 SDK 挂载点。同一接入商若有多个站点(官网、产品页、网店等),
应使用不同的 siteKey,以便区分来源。
siteKey 与页面域名不是同一概念:域名用于 Origin 白名单校验(接入前须在平台登记);
siteKey 是业务编号,由 VisuGuide 分配后在 VisuChat.init() 中填写。
常见取值示例
| siteKey | 说明 | 典型场景 |
|---|---|---|
main | 主站 | 官方网站接入 |
product | 产品站 | 独立产品落地页 |
your-code | 平台分配编号 | 接入商专属代号,接入前向 VisuGuide 确认 |
未传 siteKey 时 SDK 默认 main。生产环境请使用平台为您指定的值,勿自行编造。
全局对象与实例方法
window.VisuChat(IIFE 加载后)
| 方法 | 说明 |
|---|---|
VisuChat.init(options) |
初始化并挂载挂件,返回实例。重复调用会自动销毁上一个实例(单例)。 |
VisuChat.destroy() |
销毁最近一次 init 创建的实例。 |
实例方法(init 返回值)
| 方法 | 返回值 | 说明 |
|---|---|---|
open() | void | 展开聊天面板 |
close() | void | 收起面板(不断开连接) |
isOpen() | boolean | 面板是否展开 |
setLanguage(locale) | void | 设置界面与 AI 回复语言(BCP 47,如 zh-CN、en)。外层站点切换语言时可调用以同步挂件;WebSocket 已连接时同步到后端 |
destroy() | void | 销毁挂件、断开连接、移除 DOM |
var chat = VisuChat.init({ apiBase: 'https://visuguide.visuscience.com', siteKey: 'your-site-key' });
document.getElementById('help-btn').onclick = function () { chat.open(); };
// 外层站点语言切换时同步挂件(示例)
function onSiteLanguageChange(locale) {
chat.setLanguage(locale);
}
window.addEventListener('beforeunload', function () { chat.destroy(); });
语言设置(setLanguage)
除 init({ locale }) 设置初始默认语言外,实例方法
setLanguage(locale) 可在运行时切换挂件 UI 与 AI 回复语言,适用于外层网站已有语言切换器的场景。
方法签名
chat.setLanguage(locale: string): void
参数
| 参数 | 类型 | 说明 |
|---|---|---|
locale | string | BCP 47 或 ISO 639-1 语言码,如 zh-CN、en、es、fr |
支持的语言
挂件 UI 与 AI 对话均支持以下 10 种语言(取主语言段,如 zh-CN → zh):
en · zh · es · fr · de · pt · it · ja · ru · ar
不支持的语言码会被忽略(开发环境控制台会 warn)。
行为说明
- 同步更新挂件 UI 文案(欢迎页、按钮、连接状态、表单标签等)及语言菜单选中态。
- 同步 AI 回复语言:WebSocket 已连接时发送
{ type: "set_language" };尚未连接时会在连上后自动补推。 - 访客仍可在挂件内「语言」菜单手动切换;两种方式均会写入 Session。
- 通过 API 切换时不会在聊天区插入「语言已切换」系统提示(与面板内手动切换不同)。
init({ locale }) 与 setLanguage 的区别
| 方式 | 时机 | 典型用途 |
|---|---|---|
init({ locale: 'zh-CN' }) |
挂载时 | 页面默认语言;未传则回退到浏览器语言或 en |
chat.setLanguage('en') |
挂载后的任意时刻 | 外层站点切换语言时同步挂件 |
接入示例
var chat = VisuChat.init({
apiBase: 'https://visuguide.visuscience.com',
wsBase: 'https://ws.visuguide.visuscience.com',
siteKey: 'your-site-key',
locale: 'zh-CN', // 初始默认
});
// 外层站点语言切换(示例:下拉框、i18n 库回调)
document.getElementById('site-lang').addEventListener('change', function (e) {
chat.setLanguage(e.target.value); // 如 'en-US'、'de'、'ja'
});
// Vue / React:在 locale 变化时调用
// watch(locale, (val) => chat.setLanguage(val))
VisuChat.init(options) 参数详解
传入配置对象。第三方接入 VisuGuide 生产环境时,apiBase、siteKey、wsBase 均为必填。
基础参数
| 参数 | 类型 | 默认 | 必填 | 说明 |
|---|---|---|---|---|
apiBase | string | — | 是 | HTTP API 根地址。统一使用 https://visuguide.visuscience.com |
siteKey | string | main | 是 | 接入站点编号,由 VisuGuide 分配。不同挂载页使用不同 key 可隔离会话。详见「siteKey 说明」。 |
wsBase | string | 同 apiBase | 见下方说明 | WebSocket 地址。SDK 自动转为 wss://。配置规则见「wsBase 配置说明」。 |
locale | string | en | 否 | 界面语言 BCP 47,如 zh-CN、en-US。仅设初始默认;运行时切换请用 chat.setLanguage()(见「语言设置」) |
wsBase 配置说明
VisuGuide 生产环境 apiBase(visuguide.visuscience.com)经 CDN / DCDN 加速,
WebSocket 无法经 CDN 转发,因此必须单独配置 wsBase 指向直连源站的子域名。
| 场景 | apiBase 是否经 CDN / DCDN | wsBase |
|---|---|---|
| VisuGuide 生产接入(当前默认) | 是 | 必填。使用 WS 子域名绕过 CDN,例如wsBase: 'https://ws.visuguide.visuscience.com' |
| 私有化 / 同源 / 直连源站 | 否 | 可选。可省略,SDK 默认与 apiBase 相同 |
界面参数
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
title | string | — | 聊天窗口顶部标题 |
subtitle | string | — | 顶部副标题(如在线状态、工作时间) |
launcherSizePx | number | 64 | 右下角 FAB 边长(16–96 px,超出自动修正) |
zIndex | number | 2147483000 | 挂件 DOM 层级;被全屏弹窗遮挡时可调大 |
position | right|left | right | 预留,面板对齐方向 |
布局参数
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
layout | floating|inline | floating | floating:视口角落浮层;inline:嵌入指定容器(如工具栏) |
container | HTMLElement | document.body | 挂载节点。inline 模式必须指定具体 DOM 元素 |
draggable | boolean | floating:true / inline:false | 是否允许拖拽 FAB 与聊天窗 |
资源路径
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
assetsBaseUrl | string | 自动推断 | CSS 与字体目录 URL(以 / 结尾)。JS/CSS 不在同目录时必须设置 |
panelSize 参数(面板尺寸)
控制聊天面板打开大小、放大尺寸、边界与本地记忆。所有字段可选。
VisuChat.init({
apiBase: 'https://visuguide.visuscience.com',
panelSize: {
openWidthRatio: 0.35,
openHeightRatio: 0.85,
minWidthPx: 360,
minHeightPx: 500,
maxWidthPx: 600,
persistLayout: true,
},
});
打开尺寸
| 参数 | 默认 | 说明 |
|---|---|---|
openWidthRatio | 0.4 | 初始宽度占视口比例(0.05–1) |
openHeightRatio | 0.9 | 初始高度占视口比例 |
openWidthPx | — | 初始宽度 px,设置后 ratio 失效 |
openHeightPx | — | 初始高度 px,设置后 ratio 失效 |
放大尺寸(用户点击放大按钮)
| 参数 | 默认 | 说明 |
|---|---|---|
enlargeWidthRatio | 0.8 | 放大后宽度占视口比例 |
enlargeHeightRatio | 0.9 | 放大后高度占视口比例 |
尺寸限制
| 参数 | 默认 | 说明 |
|---|---|---|
minWidthPx | 320 | 最小宽度 |
minHeightPx | 400 | 最小高度 |
maxWidthPx | — | 最大宽度,不设则仅受视口限制 |
maxHeightPx | — | 最大高度 |
absoluteMinHeightPx | 120 | 极小屏幕高度硬下限 |
closedWidthPx | 0 | 关闭时占位宽度,0 = FAB 宽度 |
closedHeightPx | 0 | 关闭时占位高度,0 = 仅 FAB |
记忆与存储
| 参数 | 默认 | 说明 |
|---|---|---|
persistLayout | true | 是否记住用户调整的尺寸与 FAB 位置(localStorage) |
layoutStorageKey | visu_chat_widget_layout_v2 | 存储键名;有 siteKey 时自动追加后缀 |
尺寸优先级:已保存的用户尺寸 → openWidthPx/openHeightPx → openWidthRatio/openHeightRatio × 视口 → min/max 约束。
nudge 参数(沉默跟进)
AI 回复后访客长时间未发言时,自动推送跟进话术。
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
enabled | boolean | true | 是否开启 |
firstDelayMs | number | 30000 | AI 回复后首次跟进延迟(毫秒) |
secondDelayMs | number | 45000 | 第二次跟进延迟 |
maxPerSilence | number | 2 | 每段沉默最多跟进次数;访客发消息后重新计数 |
VisuChat.init({
apiBase: 'https://visuguide.visuscience.com',
nudge: { enabled: false }, // 关闭跟进
});
服务地址与使用限制
聊天、会话、消息等功能均由 SDK 内部自动完成,第三方无需直接调用后端接口。
接入时只需正确配置 apiBase、wsBase 与 siteKey。
服务地址(VisuGuide 生产环境)
| 用途 | 地址 | 说明 |
|---|---|---|
| HTTP API | https://visuguide.visuscience.com |
init 中 apiBase;经 CDN / DCDN 加速 |
| WebSocket | https://ws.visuguide.visuscience.com |
init 中 wsBase;直连源站子域名,绕过 CDN |
使用限制
- siteKey:须使用 VisuGuide 平台分配的编号,与页面域名无关。
- Origin 白名单:您的网站域名须在 VisuGuide 平台登记,否则 API / WebSocket 会被拒绝。
- HTTPS:生产页面须 HTTPS,
apiBase/wsBase也须 HTTPS / WSS。 - wsBase 与 CDN:
apiBase经 CDN / DCDN 时,wsBase必填且须为未走 CDN 的子域名;仅当 API 直连源站、未加速时方可省略wsBase。 - 单例:同一页面仅一个挂件实例;重复
init会销毁前一个。 - 请勿绕过 SDK:鉴权由 SDK 内部处理,不支持第三方自行请求 API。
跨域与安全说明
您的页面域名与 OSS / API 域名不同,属于跨域访问:
| 资源 | 是否受浏览器 CORS 限制 | 要求 |
|---|---|---|
| JS(script 标签) | 否 | OSS 公共读即可 |
| CSS(link 标签) | 一般否 | OSS 公共读即可 |
| 字体 woff2 | 是 | VisuGuide 已在 OSS 配置 CORS,第三方无需额外操作 |
| HTTP API(fetch) | 是 | 须在平台登记您的站点 Origin |
| WebSocket | 是(Origin 校验) | 须在平台登记您的站点 Origin |
https://www.example.com)以加入白名单。
未登记域名会出现控制台 CORS / WebSocket 连接失败。
常见问题
siteKey 和域名是什么关系?
siteKey 是 VisuGuide 分配的站点编号(如 main、product),
用于标识 SDK 挂载点。页面域名(如 www.example.com)用于 Origin 白名单,
二者独立:先在平台登记域名,再使用分配的 siteKey 初始化 SDK。
同一域名多个页面怎么区分?
不同挂载点使用不同 siteKey 即可,会话相互隔离。
图标显示为英文文字而非图形?
字体未加载成功。检查 OSS 上 fonts/material-symbols-outlined.woff2 是否可访问,或联系 VisuGuide 确认 OSS CORS 配置。
控制台报 CORS error(API)?
您的站点 Origin 未在后端白名单中。请在 VisuGuide 平台登记域名后重试。
WebSocket 连不上?
VisuGuide 生产环境 apiBase 经 CDN 加速,wsBase 必须配置为
https://ws.visuguide.visuscience.com 等直连源站的子域名,不可与 CDN 加速域名相同。
同时检查 Origin 白名单是否已登记您的站点域名。
launcherSizePx 设置了没变化?
须在 VisuChat.init() 中传入,范围 16–96,修改后需刷新页面。
面板大小/位置异常?
可能受 localStorage 记忆影响。清除键名 visu_chat_widget_layout_v2 或 visu_chat_widget_layout_v2:您的siteKey,或设 panelSize.persistLayout: false。
聊天入口被全屏弹窗遮挡?
调大 zIndex(默认 2147483000)。
多站点共用域名,会话会串吗?
不会。使用不同 siteKey 即可隔离。
SPA 路由切换需要重新 init 吗?
一般不需要。用户登出等场景再调用 chat.destroy()。
外层网站有语言切换,如何同步挂件?
在站点切换语言时调用 chat.setLanguage(locale),例如
chat.setLanguage('en-US') 或 chat.setLanguage('de')。
详见上方「语言设置」章节。
如何只用代码打开、隐藏默认按钮?
可用 CSS 隐藏 [data-visu-chat-widget],再通过 chat.open() 程序化打开。
浏览器兼容性
| 浏览器 | 最低版本 |
|---|---|
| Chrome | 73+ |
| Edge | 79+ |
| Firefox | 63+ |
| Safari | 13.1+ |
| 移动端 Chrome / Safari | 对应桌面版要求 |
不支持 IE。