本地 RAG 知识库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

270 lines
8.3 KiB

/**
* ChatbotSDK 核心类型定义
*
* 关键参数映射(SDK → 后端):
* integrateId → roleId(客服角色 ID,决定 AI 人设和知识库范围)
* userId → accountId(客户账号 ID,账号可绑定角色)
* chatId → 自动管理(从 /conversation/list 获取或自动生成,是对话唯一标识)
*/
/** SDK 初始化配置 */
export interface SDKConfig {
// === 必传参数 ===
/** 集成标识 → 后端 roleId 参数(客服角色 ID),决定 AI 人设和知识库检索范围 */
integrateId: string | number;
/** 后端 API 域名 */
requestDomain: string;
// === 用户标识 ===
/** 宿主用户标识 → 后端 accountId 参数(客户账号 ID),账号可绑定角色 */
userId?: string;
// === 鉴权配置 ===
/** SDK JWT Token(从 /open-api/auth/token 换取),用于访问 /ai/** 接口 */
token?: string;
/** 可用客服角色列表(与 token 配套使用,决定用户可选择哪些角色) */
roles?: Array<{ id: string | number; key?: string; name?: string }>;
// === 知识库 ===
/** 默认知识库分类 ID */
categoryId?: number;
/** 是否显示知识库下拉切换 */
showCategorySwitch?: boolean;
// === UI 配置 ===
/** 弹窗标题文字,默认 "AI 智能助手" */
title?: string;
/** 弹窗宽度(px),默认 380 */
width?: number;
/** 弹窗高度(px),默认 520,最小 300 */
height?: number;
/** 保密声明 HTML 内容。提供后直接渲染(不走后端拉取),传空串 '' 彻底隐藏,传 undefined 则从后端拉取 */
disclaimer?: string;
/** 悬浮按钮位置,默认 "right-bottom" */
position?: 'left-bottom' | 'right-bottom';
/** 主色调,默认 "#4F46E5" */
primaryColor?: string;
/** 悬浮按钮图标(可传 URL 或 SVG 字符串),默认使用极光粒子动画图标 */
launcherIcon?: string;
/** 是否显示新对话按钮,默认 true */
showClear?: boolean;
/** 是否显示管理面板,默认 false */
showAdminPanel?: boolean;
/** 欢迎态快捷问题列表,点击即自动发送,默认空数组 */
quickReplies?: string[];
/** 是否在 AI 回复后展示推荐问题(suggest-message-list),默认 true */
suggestions?: boolean;
/** 主题模式,默认 'light' */
theme?: 'light' | 'dark';
/** 是否显示首访提示气泡(延迟 1.5s 弹出),默认 true */
showTeaser?: boolean;
/** 提示气泡文字,留空则使用 i18n 默认值 */
teaserText?: string;
/** 是否允许用户拖拽缩放窗口(右下角手柄),默认 true。移动端(≤480px)强制全屏时忽略 */
resizable?: boolean;
// === 水印 ===
/** 聊天窗口水印文字(浅色背景平铺),不传则不显示。建议传入用户ID、工号等标识信息 */
watermark?: string;
// === 行为配置 ===
/** 是否启用流式输出,默认 true */
streaming?: boolean;
/**
* 是否启用 RAG 知识库检索对话,默认 true。
* 开启后对话将使用 /chat/rag/sse 接口,后端会根据角色绑定的知识库分类自动检索。
* 如果角色未绑定知识库,后端自动降级为普通对话,不会报错。
*/
enableRag?: boolean;
/** RAG 查询重写策略,默认 "REWRITE"(在 enableRag=true 时生效) */
rewriteStrategy?: 'NONE' | 'REWRITE' | 'TRANSLATION' | 'COMPRESSION' | 'MULTI_QUERY';
/** 界面语言,默认 "zh-CN" */
locale?: string;
/** 是否输出调试日志,默认 true */
debug?: boolean;
// === 通知配置 ===
/** 弹窗关闭时收到新消息是否播放提示音,默认 false */
sound?: boolean;
/** 弹窗关闭时收到新消息是否发送桌面通知,默认 false */
notification?: boolean;
// === 生命周期回调 ===
/** SDK 内部异常回调(网络错误、SSE 解析失败等),宿主可接入监控 */
onError?: (error: { message: string; code: string; detail?: unknown }) => void;
/** SDK 初始化完成回调 */
onReady?: () => void;
/** 收到新 AI 消息回调 */
onMessage?: (msg: ChatMessage) => void;
}
/** 解析后的完整配置(所有可选字段已填充默认值) */
export interface ResolvedConfig {
/** 集成标识(同时也是 roleId,客服角色 ID) */
integrateId: string;
/** 后端 API 域名 */
requestDomain: string;
/** 客户账号 ID → 后端 accountId */
userId?: string;
/** SDK JWT Token → 访问 /ai/** 接口的认证头 */
token?: string;
/** 可用客服角色列表 */
roles?: Array<{ id: string | number; key?: string; name?: string }>;
/** 知识库分类 ID */
categoryId?: number;
/** 是否显示知识库切换 */
showCategorySwitch: boolean;
/** 弹窗标题 */
title: string;
/** 弹窗宽度 */
width: number;
/** 弹窗高度 */
height: number;
/** 保密声明 HTML 内容(来自 SDKConfig 或后端动态拉取) */
disclaimer?: string;
/** 位置 */
position: 'left-bottom' | 'right-bottom';
/** 主色调 */
primaryColor: string;
/** 悬浮按钮图标 */
launcherIcon: string;
/** 显示新对话按钮 */
showClear: boolean;
/** 显示管理面板 */
showAdminPanel: boolean;
/** 欢迎态快捷问题列表 */
quickReplies: string[];
/** 是否在 AI 回复后展示推荐问题 */
suggestions: boolean;
/** 主题模式 */
theme: 'light' | 'dark';
/** 是否显示首访提示气泡 */
showTeaser: boolean;
/** 提示气泡文字 */
teaserText: string;
/** 是否允许用户拖拽缩放窗口 */
resizable: boolean;
/** 水印文字,不传则不显示 */
watermark?: string;
/** 流式输出 */
streaming: boolean;
/** 是否启用 RAG 知识库检索 */
enableRag: boolean;
/** RAG 查询重写策略 */
rewriteStrategy: string;
/** 界面语言 */
locale: string;
/** 调试日志 */
debug: boolean;
/** 提示音 */
sound: boolean;
/** 桌面通知 */
notification: boolean;
/** 异常回调 */
onError?: (error: { message: string; code: string; detail?: unknown }) => void;
/** 初始化完成回调 */
onReady?: () => void;
/** 新消息回调 */
onMessage?: (msg: ChatMessage) => void;
/** 当前对话 ID(自动管理,从 /conversation/list 获取或自动生成) */
chatId: string;
}
/** 聊天消息 */
export interface ChatMessage {
/** 消息唯一 ID */
id: string;
/** 角色:user 或 ai */
role: 'user' | 'ai';
/** 消息文本内容 */
content: string;
/** 时间戳(毫秒) */
timestamp: number;
/** 可选:RAG 引用来源 */
sources?: RagSource[];
/** 可选:用户反馈 'up' | 'down',预留后端对接位 */
feedback?: 'up' | 'down';
/** 可选:点踩原因分类(仅 feedback='down' 时有效) */
feedbackReason?: 'inaccurate' | 'irrelevant' | 'incomplete' | 'other';
/** 可选:点踩补充说明 */
feedbackComment?: string;
}
/** RAG 引用来源 */
export interface RagSource {
documentId: string;
title: string;
sourceName: string;
chunkIndex: number;
score: number;
snippet: string;
}
/** 知识库分类节点(树形结构) */
export interface CategoryNode {
id: string;
name: string;
parentId?: string;
children?: CategoryNode[];
}
/** 知识库分类平铺项 */
export interface CategoryItem {
id: string;
name: string;
parentId?: string;
}
/** 会话摘要 */
export interface ConversationSummary {
id: string;
chatId: string;
accountId?: string;
roleId?: number;
roleName?: string;
messageCount?: number;
lastMessageTime?: number;
createdAt?: number;
}
/** 会话详情 */
export interface ConversationDetail {
id: string;
chatId: string;
accountId?: string;
messages: ChatMessage[];
}
/** 本地缓存数据结构 */
export interface CacheData {
messages: ChatMessage[];
updatedAt: number;
chatId?: string;
}
/** SDK 公开 API 接口 */
export interface ChatbotSDKInstance {
/** 初始化 SDK */
init(config: SDKConfig): void;
/** 销毁 SDK 实例 */
destroy(): void;
/** 打开聊天窗口 */
open(): void;
/** 关闭聊天窗口 */
close(): void;
/** 切换窗口显示/隐藏 */
toggle(): void;
/** 开启新对话(生成新的 chatId) */
clearHistory(): void;
}
/** 后端 API 响应通用结构 */
export interface ApiResponse<T = unknown> {
success: boolean;
message?: string;
data?: T;
total?: number;
page?: number;
size?: number;
pages?: number;
}