# ai_chat_components **Repository Path**: wzcool/ai_chat_components ## Basic Information - **Project Name**: ai_chat_components - **Description**: AI chat components - **Primary Language**: TypeScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-22 - **Last Updated**: 2026-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ai-chat-components > AI 聊天组件库 - Vue 3 ChatBox 组件,支持流式输出 ## 安装 ```bash npm install ai-chat-components ``` ## 快速开始 ```vue ``` ## 调用示例 ### 1. 流式输出(模拟 SSE / WebSocket) ```vue ``` ### 2. 暗色主题 ```vue ``` ### 3. 启用 Markdown 渲染 ```vue ``` ### 4. 通过 ref 控制组件方法 ```vue ``` ### 5. 自定义插槽 ```vue ``` ### 6. 完整对话示例(含系统消息) ```vue ``` ## Props | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `messages` | `ChatMessage[]` | `[]` | 消息列表,结构见下方 [类型定义](#类型定义) | | `placeholder` | `String` | `'输入消息...'` | 输入框占位文字 | | `theme` | `String` | `'light'` | 主题,可选 `light` / `dark` | | `isLoading` | `Boolean` | `false` | 是否加载中 | | `disabled` | `Boolean` | `false` | 是否禁用输入 | | `showHeader` | `Boolean` | `true` | 是否显示消息头部 | | `showMessageActions` | `Boolean` | `true` | 是否显示消息操作按钮 | | `showFooter` | `Boolean` | `false` | 是否显示底部提示 | | `userAvatar` | `String` | `'👤'` | 用户头像,支持 emoji 或图片 URL | | `assistantAvatar` | `String` | `'🤖'` | 助手头像,支持 emoji 或图片 URL | | `userName` | `String` | `'我'` | 用户名称 | | `assistantName` | `String` | `'AI 助手'` | 助手名称 | | `emptyText` | `String` | `'开始一段新的对话吧'` | 空状态文字 | | `sendButtonText` | `String` | `'发送'` | 发送按钮文字 | | `copyButtonText` | `String` | `'复制'` | 复制按钮文字 | | `regenerateButtonText` | `String` | `'重新生成'` | 重新生成按钮文字 | | `footerText` | `String` | `'AI 生成内容仅供参考'` | 底部提示文字 | | `loadingText` | `String` | `'正在思考中...'` | 加载中提示文字 | | `useMarkdown` | `Boolean` | `false` | 是否启用 Markdown 渲染 | | `autoScroll` | `Boolean` | `true` | 是否自动滚动到底部 | | `primaryColor` | `String` | `'#6366f1'` | 主色调 | | `userBubbleColor` | `String` | `'#eef2ff'` | 用户气泡背景色 | | `aiBubbleColor` | `String` | `'#f9fafb'` | AI 气泡背景色 | | `textColor` | `String` | `'#1f2937'` | 文本颜色 | | `tools` | `ChatTool[]` | `[]` | 工具栏按钮列表,结构见 [类型定义](#类型定义) | ## Events | 事件 | 参数 | 说明 | |------|------|------| | `send` | `content: string` | 点击发送按钮或按 Enter 发送时触发 | | `copy` | `message: ChatMessage` | 点击复制按钮时触发 | | `regenerate` | `message: ChatMessage, index: number` | 点击重新生成按钮时触发 | | `stop` | - | 停止流式生成 | | `paste` | `event: ClipboardEvent` | 粘贴事件 | | `media-preview` | `media: MediaItem` | 点击媒体附件打开预览时触发 | ## Slots | 插槽 | 说明 | |------|------| | `avatar` | 自定义头像 | | `role-name` | 自定义角色名称 | | `time` | 自定义时间显示 | | `message-content` | 自定义消息内容 | | `message-actions` | 自定义消息操作按钮 | | `loading` | 自定义加载动画 | | `loading-text` | 自定义加载中提示文字 | | `empty` | 自定义空状态 | | `toolbar` | 自定义工具栏区域 | | `input-prepend` | 输入框前置内容 | | `send-icon` | 自定义发送按钮图标 | | `footer` | 自定义底部内容 | ### 自定义头像与名称 `userAvatar` / `assistantAvatar` 支持两种类型:**emoji 文本** 或 **图片 URL**(自动识别)。 ```vue ``` > 也可使用 `avatar` 和 `role-name` 插槽实现更灵活的自定义。 ### 7. 媒体附件与预览 消息可携带 `mediaList` 展示图片、视频、3D 模型。点击缩略图会打开预览弹窗。 ```vue ``` > **3D 模型预览**基于 `@google/model-viewer`,支持鼠标拖拽旋转、滚轮缩放、右键平移。加载失败自动显示 fallback 提示。 ### 8. 证据链文档 消息可携带 `evidenceList` 展示引用的文档证据。 ```vue ``` ### 9. 工具栏按钮 通过 `tools` prop 添加输入区上方的工具栏按钮,支持自定义图标和点击事件。 ```vue ``` > 也可使用 `toolbar` 插槽实现更灵活的自定义工具栏。 ### 10. 自定义文本与颜色 支持自定义所有按钮文案、加载提示、角色名称,以及主色调和气泡颜色。 ```vue ``` ## 类型定义 ### ChatMessage | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `role` | `'user' \| 'assistant' \| 'system'` | 是 | 消息角色 | | `content` | `string` | 是 | 消息文本内容 | | `timestamp` | `number` | 否 | 时间戳(毫秒) | | `streaming` | `boolean` | 否 | 是否流式输出中(内容逐步增长时设为 `true`) | | `loading` | `boolean` | 否 | 是否正在加载(AI 思考中,尚未开始输出) | | `hasAudio` | `boolean` | 否 | 是否有语音内容 | | `isPlaying` | `boolean` | 否 | 语音是否正在播放 | | `audioDuration` | `string` | 否 | 语音时长(如 `"0:32"`) | | `mediaList` | `MediaItem[]` | 否 | 多媒体资源列表(图片/视频/3D模型) | | `evidenceList` | `EvidenceItem[]` | 否 | 证据链文档列表 | ### MediaItem | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `mediaId` | `string \| number` | 是 | 媒体唯一 ID | | `type` | `'image' \| 'video' \| 'model3d'` | 是 | 媒体类型 | | `url` | `string` | 是 | 资源地址 | | `cover` | `string` | 否 | 视频/3D 模型的封面图 | | `name` | `string` | 否 | 媒体名称 | ### EvidenceItem | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `evId` | `string \| number` | 是 | 证据唯一 ID | | `iconType` | `'pdf' \| 'word' \| 'excel' \| 'txt' \| 'ppt' \| 'link'` | 是 | 文档图标类型 | | `docCount` | `number` | 是 | 文档数量 | | `title` | `string` | 是 | 证据标题 | | `desc` | `string` | 是 | 证据描述 | ### ChatTool | 属性 | 类型 | 必填 | 说明 | |------|------|------|------| | `label` | `string` | 是 | 按钮文本 | | `click` | `() => void` | 是 | 点击事件回调 | | `icon` | `string` | 否 | 图标(emoji 或 SVG) | | `disabled` | `boolean` | 否 | 是否禁用 | ## 方法 (通过 ref 调用) ```vue ``` | 方法 | 说明 | |------|------| | `scrollToBottom()` | 手动滚动到底部 | | `focus()` | 聚焦输入框 | | `setInputText(text)` | 设置输入框内容 | | `clearInput()` | 清空输入框 | ## License MIT