byt-lingxiao-ai 0.3.11 → 0.3.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -0,0 +1,224 @@
1
+ # 凌霄AI智能对话组件
2
+
3
+ ## 项目介绍
4
+
5
+ 凌霄AI(byt-lingxiao-ai)是邦业科技开发的一款智能对话机器人组件库,基于Vue 2.0框架开发,提供了完整的智能对话功能,包括文本交互、语音识别、音频播放等功能。
6
+
7
+ ## 功能特性
8
+
9
+ - ✅ **智能对话**:支持与AI进行自然语言交互
10
+ - ✅ **语音识别**:集成WebSocket语音通信,支持实时语音输入
11
+ - ✅ **音频播放**:内置音频播放器,支持语音回复播放
12
+ - ✅ **流式消息**:支持服务器推送的流式消息处理
13
+ - ✅ **拖拽功能**:支持聊天窗口拖拽定位
14
+ - ✅ **响应式设计**:适配不同屏幕尺寸
15
+ - ✅ **自定义配置**:支持多种参数配置
16
+ - ✅ **思考过程可视化**:显示AI思考过程和用时
17
+
18
+ ## 技术栈
19
+
20
+ - **前端框架**:Vue 2.0
21
+ - **UI组件**:Element UI
22
+ - **通信协议**:WebSocket
23
+ - **音频处理**:Web Audio API
24
+ - **消息解析**:自定义流式消息解析器
25
+ - **构建工具**:Vue CLI
26
+
27
+ ## 安装
28
+
29
+ ### 使用npm安装
30
+
31
+ ```bash
32
+ npm install byt-lingxiao-ai --save
33
+ ```
34
+
35
+ ### 使用yarn安装
36
+
37
+ ```bash
38
+ yarn add byt-lingxiao-ai
39
+ ```
40
+
41
+ ## 使用
42
+
43
+ ### 基本用法
44
+
45
+ ```javascript
46
+ // 引入Vue
47
+ import Vue from 'vue'
48
+ import App from './App.vue'
49
+
50
+ // 引入Element UI
51
+ import ElementUI from 'element-ui'
52
+ import 'element-ui/lib/theme-chalk/index.css'
53
+
54
+ // 引入凌霄AI组件
55
+ import ChatWindow from 'byt-lingxiao-ai'
56
+
57
+ // 注册组件
58
+ Vue.use(ElementUI)
59
+ Vue.use(ChatWindow)
60
+
61
+ new Vue({
62
+ render: h => h(App)
63
+ }).$mount('#app')
64
+ ```
65
+
66
+ ```html
67
+ <!-- 在Vue组件中使用 -->
68
+ <template>
69
+ <div id="app">
70
+ <ChatWindow />
71
+ </div>
72
+ </template>
73
+ ```
74
+
75
+ ### 自定义配置
76
+
77
+ ```javascript
78
+ Vue.use(ChatWindow, {
79
+ title: '智能助手', // 组件标题
80
+ // 其他自定义配置
81
+ })
82
+ ```
83
+
84
+ ## API 文档
85
+
86
+ ### ChatWindow 组件
87
+
88
+ #### 组件属性
89
+
90
+ | 属性名 | 类型 | 默认值 | 说明 |
91
+ |--------|------|--------|------|
92
+ | appendToBody | Boolean | true | 是否将聊天窗口添加到body元素中 |
93
+
94
+ #### 事件
95
+
96
+ | 事件名 | 说明 |
97
+ |--------|------|
98
+ | send | 发送消息事件 |
99
+ | thinking-click | 思考过程点击事件 |
100
+ | overlay-click | 遮罩点击事件 |
101
+
102
+ ### 配置项
103
+
104
+ #### API_URL
105
+
106
+ 对话API接口地址,默认值:`/lingxiao-byt/api/v1/mcp/ask`
107
+
108
+ #### WS_URL
109
+
110
+ WebSocket连接地址,默认值:`ws://${window.location.host}/audio/ws`
111
+
112
+ #### AUDIO_URL
113
+
114
+ 音频文件地址,默认值:`/minio/lingxiaoai/byt.mp3`
115
+
116
+ #### TIME_JUMP_POINTS_URL
117
+
118
+ 音频时间跳转点配置文件地址,默认值:`/minio/lingxiaoai/timeJumpPoints.json`
119
+
120
+ ## 项目结构
121
+
122
+ ```
123
+ ├── components/ # 组件目录
124
+ │ ├── ChatAvatar.vue # AI头像组件
125
+ │ ├── ChatInputBox.vue # 输入框组件
126
+ │ ├── ChatMessageList.vue # 消息列表组件
127
+ │ ├── ChatRobot.vue # 机器人动画组件
128
+ │ ├── ChatWindow.vue # 主聊天窗口组件
129
+ │ ├── ChatWindowDialog.vue # 聊天窗口对话框
130
+ │ ├── ChatWindowHeader.vue # 聊天窗口头部
131
+ │ ├── UserMessage.vue # 用户消息组件
132
+ │ ├── AiMessage.vue # AI消息组件
133
+ │ ├── assets/ # 静态资源
134
+ │ ├── config/ # 配置文件
135
+ │ ├── mixins/ # 混合器
136
+ │ │ ├── audioMixin.js # 音频处理混合器
137
+ │ │ ├── messageMixin.js # 消息处理混合器
138
+ │ │ └── webSocketMixin.js # WebSocket通信混合器
139
+ │ └── utils/ # 工具函数
140
+ │ ├── Cookie.js # Cookie工具
141
+ │ ├── StreamParser.js # 流式消息解析器
142
+ │ ├── Uuid.js # UUID生成器
143
+ │ └── WorkletSource.js # Audio Worklet源码
144
+ ├── examples/ # 示例代码
145
+ ├── dist/ # 打包文件
146
+ ├── package.json # 项目配置
147
+ └── vue.config.js # Vue CLI配置
148
+ ```
149
+
150
+ ## 核心功能说明
151
+
152
+ ### 1. 消息处理流程
153
+
154
+ 1. 用户输入消息
155
+ 2. 调用 `handleSend` 方法发送消息
156
+ 3. 创建用户消息记录
157
+ 4. 创建AI回复消息记录
158
+ 5. 发送请求到API接口
159
+ 6. 使用 `StreamParser` 处理流式响应
160
+ 7. 实时更新AI回复内容
161
+
162
+ ### 2. 音频处理
163
+
164
+ - 使用 `audioMixin` 处理音频相关功能
165
+ - 支持麦克风录音
166
+ - 支持音频播放控制(播放、暂停、停止)
167
+ - 使用 WebSocket 实时传输音频数据
168
+
169
+ ### 3. WebSocket通信
170
+
171
+ - 建立WebSocket连接进行语音通信
172
+ - 支持自动重连机制
173
+ - 处理服务端推送的各种消息类型
174
+
175
+ ### 4. 拖拽功能
176
+
177
+ - 支持聊天窗口拖拽定位
178
+ - 限制窗口在视口范围内
179
+ - 平滑拖拽动画效果
180
+
181
+ ## 浏览器支持
182
+
183
+ - Chrome (推荐)
184
+ - Firefox
185
+ - Safari
186
+ - Edge
187
+
188
+ ## 开发与构建
189
+
190
+ ### 开发
191
+
192
+ ```bash
193
+ npm run serve
194
+ ```
195
+
196
+ ### 构建
197
+
198
+ ```bash
199
+ npm run build
200
+ ```
201
+
202
+ ## 许可证
203
+
204
+ MIT License
205
+
206
+ ## 作者信息
207
+
208
+ - 公司:邦业科技
209
+ - 邮箱:xuepengfei@bonyear.com
210
+
211
+ ## 更新日志
212
+
213
+ ### v0.3.12
214
+ - 修复了一些已知问题
215
+ - 优化了音频处理性能
216
+
217
+ ### v0.3.10
218
+ - 新增拖拽功能
219
+ - 优化了消息流式处理
220
+
221
+ ### v0.3.0
222
+ - 初始版本发布
223
+ - 支持基本的聊天功能
224
+ - 支持语音识别和音频播放
@@ -62,12 +62,15 @@ export default {
62
62
  // 重置解析器
63
63
  this.streamParser.reset();
64
64
 
65
+ const controller = new AbortController();
66
+
65
67
  try {
66
68
  const startTime = Date.now();
67
69
  const token = getCookie('bonyear-access_token') || `44e7f112-63f3-429d-908d-2c97ec380de2`;
68
70
 
69
71
  const response = await fetch(API_URL, {
70
72
  method: 'POST',
73
+ signal: controller.signal,
71
74
  headers: {
72
75
  'Content-Type': 'application/json',
73
76
  'Authorization': `Bearer ${token}`,
@@ -13,7 +13,7 @@ export default {
13
13
  methods: {
14
14
  initWebSocket() {
15
15
  try {
16
- this.ws = new WebSocket(this.wsUrl);
16
+ this.ws = new WebSocket('ws://10.2.233.41:9999');
17
17
  this.ws.binaryType = 'arraybuffer';
18
18
 
19
19
  this.ws.onopen = async () => {
@@ -31315,7 +31315,7 @@ const TIME_JUMP_POINTS_URL = '/minio/lingxiaoai/timeJumpPoints.json'; // 语音u
31315
31315
  methods: {
31316
31316
  initWebSocket() {
31317
31317
  try {
31318
- this.ws = new WebSocket(this.wsUrl);
31318
+ this.ws = new WebSocket('ws://10.2.233.41:9999');
31319
31319
  this.ws.binaryType = 'arraybuffer';
31320
31320
  this.ws.onopen = async () => {
31321
31321
  console.log('WebSocket 连接成功');
@@ -31613,11 +31613,13 @@ const getCookie = cname => {
31613
31613
 
31614
31614
  // 重置解析器
31615
31615
  this.streamParser.reset();
31616
+ const controller = new AbortController();
31616
31617
  try {
31617
31618
  const startTime = Date.now();
31618
31619
  const token = getCookie('bonyear-access_token') || `44e7f112-63f3-429d-908d-2c97ec380de2`;
31619
31620
  const response = await fetch(API_URL, {
31620
31621
  method: 'POST',
31622
+ signal: controller.signal,
31621
31623
  headers: {
31622
31624
  'Content-Type': 'application/json',
31623
31625
  'Authorization': `Bearer ${token}`