# ChatbotSDK — 前端对接文档
> P0 核心链路 ✅ | P1 体验增强 ✅ | P2 运营完善 ✅ | 版本:1.2.0 | 更新日期:2026-06-26
---
## 一、快速开始
### 最简接入(3 行代码)
```html
```
引入后在页面右下角出现悬浮客服按钮,点击即可对话。
### 完整配置接入
```html
```
### 集成到现有项目
SDK 产物位于 `client/dist/` 目录:
| 文件 | 大小 | 说明 |
|------|------|------|
| `chatbot-sdk.js` | 93KB | 未压缩开发版(含 sourcemap) |
| `chatbot-sdk.min.js` | 45KB | 压缩生产版(gzip ~15KB) |
**部署路径:** 将 `.min.js` 文件上传到后端 `static/sdk/` 目录或任意 CDN。
---
## 二、SDKConfig 完整参数
| 参数 | 类型 | 必传 | 默认值 | 阶段 | 说明 |
|------|------|------|--------|------|------|
| `integrateId` | `string \| number` | ✅ | — | P0 | 集成标识 → 后端 `roleId`(客服角色 ID,决定 AI 人设和知识库范围) |
| `requestDomain` | `string` | ✅ | — | P0 | 后端 API 域名 |
| `userId` | `string` | ❌ | — | P0 | 宿主用户标识 → 后端 `accountId` |
| `roleId` | `number` | ❌ | — | P0 | 客服角色 ID |
| `categoryId` | `number` | ❌ | — | P1 | 默认知识库分类 |
| `showCategorySwitch` | `boolean` | ❌ | `false` | P1 | 是否显示知识库下拉切换 |
| `title` | `string` | ❌ | `"AI 智能助手"` | P0 | 弹窗标题 |
| `width` | `number` | ❌ | `380` | P0 | 弹窗宽度(px) |
| `position` | `string` | ❌ | `"right-bottom"` | P0 | 悬浮按钮位置 |
| `primaryColor` | `string` | ❌ | `"#4F46E5"` | P0 | 主色调 |
| `launcherIcon` | `string` | ❌ | SVG 图标 | P0 | 悬浮按钮图标 |
| `showClear` | `boolean` | ❌ | `true` | P0 | 是否显示清空按钮 |
| `streaming` | `boolean` | ❌ | `true` | P0 | 是否启用 SSE 流式输出 |
| `locale` | `string` | ❌ | `"zh-CN"` | P2 | 界面语言:`zh-CN` / `en` |
| `debug` | `boolean` | ❌ | `true` | P0 | 是否输出调试日志 |
---
## 三、公开 API
| 方法 | 阶段 | 说明 |
|------|------|------|
| `ChatbotSDK.init(config)` | P0 | 初始化 SDK |
| `ChatbotSDK.destroy()` | P0 | 销毁实例(清理 DOM + 样式 + 事件) |
| `ChatbotSDK.open()` | P0 | 打开聊天窗口 |
| `ChatbotSDK.close()` | P0 | 关闭聊天窗口 |
| `ChatbotSDK.toggle()` | P0 | 切换窗口显示/隐藏 |
| `ChatbotSDK.clearHistory()` | P0 | 清空当前会话 |
---
## 四、P1 体验增强功能
### 4.1 SSE 流式打字机效果
默认开启(`streaming: true`),AI 回复逐字输出,支持:
- 流式追加到气泡,实时滚动到底部
- 流中断兜底:保留已接收内容 + 灰色提示
- 无流内容时自动降级为同步请求
### 4.2 Markdown 渲染
AI 回复支持 Markdown 格式渲染,包括:
- 代码块(深色背景 ` ``` ` 语法)
- 行内代码(`` `code` ``)
- 标题(`##` `###` 等)
- 粗体(`**text**`)、斜体(`*text*`)、删除线(`~~text~~`)
- 有序/无序列表
- 链接(`[text](url)`,仅允许 http/https 协议)
- 引用块(`>` )
- 水平线(`---`)
> **XSS 安全**:所有非代码块内容先转义 HTML,再转换 Markdown 语法为安全 HTML 标签。代码块内容同样转义。
### 4.3 知识库联动
开启 `showCategorySwitch: true` 后,输入区上方出现知识库分类下拉框:
```html
ChatbotSDK.init({
integrateId: 'my-app',
requestDomain: 'https://ai.example.com',
showCategorySwitch: true, // 显示分类下拉框
categoryId: 5, // 默认选中分类
});
```
- 选择分类后,后续对话自动走 RAG 增强接口(`/ai/assistant_app/chat/rag/sse`)
- 选择「全部分类」则走普通流式接口
- 分类数据从 `/category/tree` 接口动态加载,支持树形缩进显示
### 4.4 RAG 引用来源展示
使用 RAG 对话后,AI 气泡底部自动展示引用来源卡片:
```
┌─────────────────────────────────┐
│ 📚 3 条参考来源 ▼ │
├─────────────────────────────────┤
│ 员工手册.pdf │
│ 员工可以享受年假... │
│ 员工手册.pdf · 分块 #3 · 85% │
│ │
│ HR制度.md │
│ 年假计算规则如下... │
│ HR制度.md · 分块 #1 · 72% │
└─────────────────────────────────┘
```
- 默认折叠,只显示标题行,点击展开/折叠
- 显示文档名称、摘要、来源文件、分块编号、相关度
- 来源数据从 `/ai/assistant_app/rag/sources` 接口获取
---
## 五、P2 运营完善功能
### 5.1 多语言国际化
支持 `zh-CN`(中文)和 `en`(英文)两种语言:
```html
ChatbotSDK.init({
integrateId: 'my-app',
requestDomain: 'https://ai.example.com',
locale: 'en', // 英文界面
});
```
国际化覆盖范围:
- 弹窗标题、输入框占位符、发送按钮
- 最小化/关闭按钮提示
- 清空对话按钮及确认弹窗
- Loading 状态文字
- 所有错误提示(网络/超时/服务器/跨域等)
- 知识库下拉框默认选项
- RAG 引用来源标题
- 历史会话面板文本
### 5.2 会话管理面板
弹窗头部新增时钟图标按钮,点击展开历史会话面板:
- 展示当前用户的历史会话列表(从 `/conversation/list` 接口获取)
- 支持导出会话(下载文本文件)
- 支持删除会话(二次确认)
- 空状态提示
### 5.3 控制台日志体系
SDK 全流程结构化日志,带 `[ChatbotSDK]` 前缀:
| 生命周期 | 日志内容 |
|----------|---------|
| `init()` | `初始化完成 integrateId={} requestDomain={}` |
| `sendMessage()` | `发送消息 integrateId={} length={}` |
| `收到回复` | `AI 回复 integrateId={} length={} duration={}ms` |
| `流式完成` | `流式回复完成 integrateId={} length={} duration={}ms` |
| `请求失败` | `请求失败 integrateId={} status={} message={}` |
| `clearHistory()` | `清空会话 integrateId={}` |
| `destroy()` | `销毁实例 integrateId={}` |
| `分类切换` | `切换知识库分类 categoryId={}` |
- `config.debug = false` 关闭 info/warn 日志,error 始终输出
- 内置性能计时器,自动记录 AI 回复耗时
---
## 六、对接的后端接口
### P0 — 基础对话
```
GET /ai/assistant_app/chat/sync
GET /ai/assistant_app/chat/sse
```
### P1 — 知识库联动
```
GET /ai/assistant_app/chat/rag/sse # RAG 增强流式对话
GET /ai/assistant_app/rag/sources # RAG 引用来源
GET /category/tree # 分类树(下拉框数据源)
GET /category/list # 分类列表
```
### P2 — 会话管理
```
GET /conversation/list # 会话列表
GET /conversation/{id}/messages # 会话消息
DELETE /conversation/{id} # 删除会话
GET /conversation/{id}/export # 导出会话
```
---
## 七、参数映射关系
**核心映射(SDK → 后端):**
| SDK 入参 | 后端参数 | 说明 |
|----------|----------|------|
| `integrateId` | `roleId` | 客服角色 ID(决定 AI 人设和知识库检索范围) |
| `userId` | `accountId` | 客户账号 ID(账号可绑定角色,绑定后服务端覆盖 roleId) |
| (自动管理) | `chatId` | 对话 ID(自动从 `/conversation/list` 获取或生成,格式 `sdk_时间戳_随机串`) |
**chatId 自动管理逻辑:**
1. SDK 初始化时,查询 `/conversation/list?accountId={userId}&roleId={integrateId}`
2. 有匹配会话 → 使用最新会话的 `conversationId` 作为 `chatId`
3. 无匹配会话 → 自动生成新 `chatId`(格式:`sdk_时间戳_随机串`)
4. `chatId` 缓存在 localStorage(key: `csk_chatId_{integrateId}_{userId}`)
5. `clearHistory()` 会生成新的 `chatId`,开始全新对话
---
## 八、CSS 命名空间隔离
所有 DOM 元素的 class/id 均使用 `csk-` 前缀,不会与宿主页面样式冲突:
| 元素 | ID/Class |
|------|----------|
| 悬浮按钮 | `#csk-launcher` `.csk-launcher` |
| 聊天弹窗 | `#csk-window` `.csk-window` |
| 消息区 | `#csk-messages` `.csk-messages` |
| 输入框 | `#csk-input` `.csk-input` |
| 发送按钮 | `#csk-send-btn` `.csk-send-btn` |
| 知识库下拉 | `#csk-category-select` `.csk-category-select` |
| 历史面板 | `.csk-history-panel` |
| 样式标签 | `style[data-csk-sdk]` |
z-index 分层:悬浮按钮 9998,弹窗 9999。
---
## 九、localStorage 缓存
缓存 key 格式:`csk_history_{integrateId}`
数据结构:
```json
{
"messages": [
{
"id": "uuid",
"role": "user|ai",
"content": "消息内容",
"timestamp": 1700000000000,
"sources": []
}
],
"updatedAt": 1700000000000
}
```
- 消息上限 200 条,超出自动裁剪最早 50 条
- 按 `integrateId` 隔离,不同接入方互不影响
- `init()` 时自动恢复历史消息
- RAG 引用来源同步缓存到 `sources` 字段
---
## 十、错误处理
所有错误不抛异常、不阻塞宿主页面,仅 `console.error` 输出。
| 错误场景 | 中文提示 | 英文提示 |
|----------|---------|---------|
| 网络断开 | 网络连接失败,请检查网络 | Network connection failed |
| 请求超时 | 请求超时,请稍后重试 | Request timed out |
| HTTP 500 | 服务器异常,请稍后重试 | Server error |
| 跨域阻断 | 跨域请求被拦截... | CORS request blocked... |
| HTTP 401 | 鉴权失败,请联系管理员 | Authentication failed |
| HTTP 403 | 无访问权限 | Access denied |
| 流中断 | 回复被中断 | Response interrupted |
---
## 十一、技术栈
- **语言**:TypeScript → ES2017
- **打包**:Rollup → IIFE 格式
- **压缩**:Terser
- **Markdown**:内置轻量级渲染器(零外部依赖)
- **国际化**:内置 i18n 字典
- **浏览器兼容**:Chrome 70+, Firefox 70+, Safari 13+, Edge 79+
- **产物大小**:`.min.js` ~45KB(gzip ~15KB)
---
## 十二、开发与构建
```bash
# 进入 SDK 工程目录
cd client/
# 安装依赖
npm install
# 构建(输出到 dist/)
npm run build
# 开发模式(watch)
npm run dev
```
源码结构:
```
client/
├── src/
│ ├── index.ts # 入口:window.ChatbotSDK 挂载
│ ├── types.ts # TypeScript 类型定义
│ ├── config.ts # 配置解析 + 参数校验
│ ├── logger.ts # 日志模块(P2 增强:计时+生命周期)
│ ├── storage.ts # localStorage 封装
│ ├── api.ts # HTTP 封装 + SSE 流式 + P1 RAG + P2 会话
│ ├── dom.ts # DOM 构建 + 拖拽 + P1 来源/分类 + P2 面板
│ ├── styles.ts # CSS 注入 + 主题 + P1 Markdown/来源 + P2 面板
│ ├── chat.ts # 对话核心 + P1 Markdown/RAG + P2 i18n
│ ├── markdown.ts # P1 轻量级 Markdown 渲染器
│ ├── i18n.ts # P2 多语言国际化
│ └── utils.ts # UUID、防抖、XSS 转义
├── dist/ # 构建产物
├── package.json
├── tsconfig.json
├── rollup.config.js
└── README.md
```
---
## 十三、功能路线图
| 阶段 | 状态 | 内容 |
|------|------|------|
| **P0 核心链路** | ✅ 已完成 | 项目骨架、配置校验、样式注入、悬浮按钮+弹窗、HTTP 通信、对话核心、本地缓存、打包构建 |
| **P1 体验增强** | ✅ 已完成 | SSE 流式打字机、Markdown 渲染、知识库下拉切换、RAG 引用来源展示、UI 全配置化、弹窗拖拽 |
| **P2 运营完善** | ✅ 已完成 | 多语言国际化(zh-CN/en)、控制台日志体系、会话管理面板(列表/导出/删除) |
| **可选扩展** | 🔜 待定 | 知识库管理嵌入(`showAdminPanel`)、更多语言、主题皮肤 |
---
## 十四、验证测试
访问 `http://localhost:9090/sdk/test.html` 运行自动化验证。
测试覆盖(22 个用例):
| 编号 | 阶段 | 功能 |
|------|------|------|
| T1-T13 | P0 | 全局挂载、参数校验、DOM 创建、open/close、默认值、主题色、位置、destroy、缓存、API 对话 |
| T14-T19 | P1 | Markdown 样式、知识库分类切换、RAG 来源样式、RAG SSE 接口、RAG 来源接口、分类树接口 |
| T20-T22 | P2 | 多语言国际化、会话管理面板、会话列表接口 |