@flexem/chat-box 1.0.0
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 +638 -0
- package/miniprogram_dist/TEST_CASES.md +256 -0
- package/miniprogram_dist/assets/icons/icon-arrow-down.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-arrow-up.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-avatar-default.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-back.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-camera.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-close.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-copy.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-delete.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-edit-msg.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-edit.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-file.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-image.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-keyboard.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-menu.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-play-voice.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-plus.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-regenerate.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-thinking.svg +1 -0
- package/miniprogram_dist/assets/icons/icon-voice.svg +1 -0
- package/miniprogram_dist/components/attachment/index.js +169 -0
- package/miniprogram_dist/components/attachment/index.json +4 -0
- package/miniprogram_dist/components/attachment/index.wxml +40 -0
- package/miniprogram_dist/components/attachment/index.wxss +119 -0
- package/miniprogram_dist/components/input-bar/index.js +934 -0
- package/miniprogram_dist/components/input-bar/index.json +6 -0
- package/miniprogram_dist/components/input-bar/index.wxml +132 -0
- package/miniprogram_dist/components/input-bar/index.wxss +324 -0
- package/miniprogram_dist/components/message/index.js +988 -0
- package/miniprogram_dist/components/message/index.json +4 -0
- package/miniprogram_dist/components/message/index.wxml +285 -0
- package/miniprogram_dist/components/message/index.wxss +575 -0
- package/miniprogram_dist/components/sidebar/index.js +506 -0
- package/miniprogram_dist/components/sidebar/index.json +4 -0
- package/miniprogram_dist/components/sidebar/index.wxml +137 -0
- package/miniprogram_dist/components/sidebar/index.wxss +264 -0
- package/miniprogram_dist/index.js +1316 -0
- package/miniprogram_dist/index.json +8 -0
- package/miniprogram_dist/index.wxml +172 -0
- package/miniprogram_dist/index.wxss +291 -0
- package/miniprogram_dist/package.json +5 -0
- package/miniprogram_dist/utils/api.js +474 -0
- package/miniprogram_dist/utils/audio.js +860 -0
- package/miniprogram_dist/utils/storage.js +168 -0
- package/package.json +27 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 封装模块
|
|
3
|
+
* 与 AiChatWeb 后端接口对接
|
|
4
|
+
*
|
|
5
|
+
* 配置说明:
|
|
6
|
+
* - idsServiceUrl: IDS 认证服务地址,用于获取 serviceUrls
|
|
7
|
+
* - aiChatUrl: 主要 AI 聊天 API 地址(从 serviceUrls 获取)
|
|
8
|
+
* - ossServiceUrl: OSS/七牛云服务地址(从 serviceUrls 获取)
|
|
9
|
+
* - blobStorageDownloadServiceUrl: 文件下载服务地址(从 serviceUrls 获取)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// 缓存的服务配置
|
|
13
|
+
let cachedServiceUrls = null;
|
|
14
|
+
|
|
15
|
+
// 生成唯一消息ID(GUID格式)
|
|
16
|
+
function generateMsgId() {
|
|
17
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
|
18
|
+
const r = Math.random() * 16 | 0;
|
|
19
|
+
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
20
|
+
return v.toString(16);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// 请求封装
|
|
25
|
+
function request(options) {
|
|
26
|
+
const { url, method = 'GET', data, header = {}, token } = options;
|
|
27
|
+
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
wx.request({
|
|
30
|
+
url,
|
|
31
|
+
method,
|
|
32
|
+
data,
|
|
33
|
+
header: {
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
'X-Access-Token': token ? `Bearer ${token}` : '',
|
|
36
|
+
...header
|
|
37
|
+
},
|
|
38
|
+
success: (res) => {
|
|
39
|
+
if (res.statusCode === 401) {
|
|
40
|
+
reject({ code: 401, message: '请登录后使用' });
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
44
|
+
// 处理新旧API响应格式
|
|
45
|
+
const result = res.data;
|
|
46
|
+
if (result && typeof result === 'object' && 'code' in result) {
|
|
47
|
+
if (result.code === 0 || result.code === 200) {
|
|
48
|
+
resolve(result.data);
|
|
49
|
+
} else if (result.code === 401) {
|
|
50
|
+
reject({ code: 401, message: '请登录后使用' });
|
|
51
|
+
} else {
|
|
52
|
+
reject({ code: result.code, message: result.message || '请求失败' });
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
resolve(result);
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
reject({ code: res.statusCode, message: res.data?.message || '请求失败' });
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
fail: (err) => {
|
|
62
|
+
reject({ code: -1, message: err.errMsg || '网络错误' });
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 获取对话列表
|
|
70
|
+
*/
|
|
71
|
+
function getChatSessions(baseUrl, token, page = 1, pageSize = 20) {
|
|
72
|
+
return request({
|
|
73
|
+
url: `${baseUrl}/app/sessions/paging?current_page=${page}&page_size=${pageSize}`,
|
|
74
|
+
method: 'GET',
|
|
75
|
+
token
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 创建新对话
|
|
81
|
+
*/
|
|
82
|
+
function createChatSession(baseUrl, token, title = '新对话', configs = {}) {
|
|
83
|
+
return request({
|
|
84
|
+
url: `${baseUrl}/app/sessions`,
|
|
85
|
+
method: 'POST',
|
|
86
|
+
data: {
|
|
87
|
+
title: title.substring(0, 30),
|
|
88
|
+
configs: {
|
|
89
|
+
defaultDeepThinking: configs.deepThinking || false,
|
|
90
|
+
defaultWebSearch: configs.webSearch || false
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
token
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 重命名对话
|
|
99
|
+
*/
|
|
100
|
+
function renameChatSession(baseUrl, token, sessionId, newTitle) {
|
|
101
|
+
return request({
|
|
102
|
+
url: `${baseUrl}/app/sessions/modify-title`,
|
|
103
|
+
method: 'POST',
|
|
104
|
+
data: {
|
|
105
|
+
id: sessionId,
|
|
106
|
+
title: newTitle.substring(0, 30)
|
|
107
|
+
},
|
|
108
|
+
token
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 删除对话
|
|
114
|
+
*/
|
|
115
|
+
function deleteChatSession(baseUrl, token, sessionId, userId) {
|
|
116
|
+
return request({
|
|
117
|
+
url: `${baseUrl}/app/sessions/${sessionId}`,
|
|
118
|
+
method: 'DELETE',
|
|
119
|
+
data: {
|
|
120
|
+
session_id: sessionId,
|
|
121
|
+
current_user_id: userId
|
|
122
|
+
},
|
|
123
|
+
token
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 获取聊天历史记录
|
|
129
|
+
*/
|
|
130
|
+
function getChatHistories(baseUrl, token, sessionId, page = 1, pageSize = 20) {
|
|
131
|
+
return request({
|
|
132
|
+
url: `${baseUrl}/app/chat-histories/mine?session_id=${sessionId}¤t_page=${page}&page_size=${pageSize}`,
|
|
133
|
+
method: 'GET',
|
|
134
|
+
token
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* 删除指定时间后的聊天记录(用于重新生成)
|
|
140
|
+
*/
|
|
141
|
+
function deleteChatHistoriesByTime(baseUrl, token, sessionId, chatHistoryTime) {
|
|
142
|
+
return request({
|
|
143
|
+
url: `${baseUrl}/app/chat-histories/delete_by_time`,
|
|
144
|
+
method: 'POST',
|
|
145
|
+
data: {
|
|
146
|
+
session_id: sessionId,
|
|
147
|
+
chat_history_time: chatHistoryTime
|
|
148
|
+
},
|
|
149
|
+
token
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 发送聊天消息(SSE 流式传输)
|
|
155
|
+
* 微信小程序不支持原生SSE,使用 requestTask 模拟
|
|
156
|
+
*/
|
|
157
|
+
function sendChatMessage(options) {
|
|
158
|
+
const {
|
|
159
|
+
baseUrl,
|
|
160
|
+
token,
|
|
161
|
+
sessionId,
|
|
162
|
+
messages,
|
|
163
|
+
settings = {},
|
|
164
|
+
onMessage,
|
|
165
|
+
onComplete,
|
|
166
|
+
onError
|
|
167
|
+
} = options;
|
|
168
|
+
|
|
169
|
+
const msgId = generateMsgId();
|
|
170
|
+
|
|
171
|
+
// 构建请求数据
|
|
172
|
+
const requestData = {
|
|
173
|
+
messages: messages.map(msg => {
|
|
174
|
+
const messageObj = {
|
|
175
|
+
content: msg.content,
|
|
176
|
+
role: msg.role
|
|
177
|
+
};
|
|
178
|
+
// 只有当有附件时才添加 attachments 字段
|
|
179
|
+
if (msg.attachments && msg.attachments.length > 0) {
|
|
180
|
+
messageObj.attachments = msg.attachments;
|
|
181
|
+
}
|
|
182
|
+
return messageObj;
|
|
183
|
+
}),
|
|
184
|
+
session_id: sessionId,
|
|
185
|
+
msg_id: msgId,
|
|
186
|
+
chat_setting: {
|
|
187
|
+
deep_thinking: settings.deepThinking || false,
|
|
188
|
+
online_search: settings.webSearch || false
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
let fullContent = '';
|
|
193
|
+
let thinkingText = '';
|
|
194
|
+
let hasError = false; // 标记是否已发生错误,防止 onComplete 被调用
|
|
195
|
+
|
|
196
|
+
const requestTask = wx.request({
|
|
197
|
+
url: `${baseUrl}/app/api/chatstream`,
|
|
198
|
+
method: 'POST',
|
|
199
|
+
data: requestData,
|
|
200
|
+
header: {
|
|
201
|
+
'Content-Type': 'application/json',
|
|
202
|
+
'Accept': 'text/event-stream',
|
|
203
|
+
'Cache-Control': 'no-cache',
|
|
204
|
+
'X-Access-Token': `Bearer ${token}`
|
|
205
|
+
},
|
|
206
|
+
enableChunked: true,
|
|
207
|
+
success: () => {
|
|
208
|
+
// 如果已经发生错误,不再调用 onComplete
|
|
209
|
+
if (hasError) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (onComplete) {
|
|
213
|
+
onComplete({
|
|
214
|
+
content: fullContent,
|
|
215
|
+
thinkingText: thinkingText,
|
|
216
|
+
msgId: msgId
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
fail: (err) => {
|
|
221
|
+
// 检查是否是用户主动中止的请求
|
|
222
|
+
const isAborted = err.errMsg && (
|
|
223
|
+
err.errMsg.includes('abort') ||
|
|
224
|
+
err.errMsg.includes('cancel')
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
if (onError && !isAborted) {
|
|
228
|
+
hasError = true;
|
|
229
|
+
onError({ code: -1, message: err.errMsg || '发送失败' });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
// 监听数据块
|
|
235
|
+
requestTask.onChunkReceived((res) => {
|
|
236
|
+
try {
|
|
237
|
+
const text = arrayBufferToString(res.data);
|
|
238
|
+
const lines = text.split('\n');
|
|
239
|
+
|
|
240
|
+
lines.forEach(line => {
|
|
241
|
+
if (line.startsWith('data: ')) {
|
|
242
|
+
const data = line.substring(6);
|
|
243
|
+
if (data === '[DONE]') {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
const json = JSON.parse(data);
|
|
248
|
+
if (json.error) {
|
|
249
|
+
hasError = true; // 标记错误,防止 onComplete 被调用
|
|
250
|
+
if (onError) {
|
|
251
|
+
onError({ code: -1, message: json.error });
|
|
252
|
+
}
|
|
253
|
+
} else if (json.ai) {
|
|
254
|
+
fullContent += json.ai;
|
|
255
|
+
if (onMessage) {
|
|
256
|
+
onMessage({
|
|
257
|
+
content: fullContent,
|
|
258
|
+
delta: json.ai,
|
|
259
|
+
isStreaming: true
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
} else if (json.thinking) {
|
|
263
|
+
thinkingText += json.thinking;
|
|
264
|
+
}
|
|
265
|
+
} catch (e) {
|
|
266
|
+
// 忽略解析错误
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
} catch (e) {
|
|
271
|
+
console.error('解析响应数据失败', e);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
return {
|
|
276
|
+
abort: () => requestTask.abort(),
|
|
277
|
+
msgId: msgId
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* ArrayBuffer 转字符串
|
|
283
|
+
*/
|
|
284
|
+
function arrayBufferToString(buffer) {
|
|
285
|
+
const uint8Array = new Uint8Array(buffer);
|
|
286
|
+
let str = '';
|
|
287
|
+
for (let i = 0; i < uint8Array.length; i++) {
|
|
288
|
+
str += String.fromCharCode(uint8Array[i]);
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
return decodeURIComponent(escape(str));
|
|
292
|
+
} catch (e) {
|
|
293
|
+
return str;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* 获取服务 URLs 配置
|
|
299
|
+
* @param {string} idsServiceUrl - IDS 服务地址
|
|
300
|
+
* @param {string} token - 用户 Token
|
|
301
|
+
* @returns {Promise<Object>} - 包含 aiChatUrl, ossServiceUrl, blobStorageDownloadServiceUrl 等
|
|
302
|
+
*/
|
|
303
|
+
async function getServiceUrls(idsServiceUrl, token) {
|
|
304
|
+
if (cachedServiceUrls) {
|
|
305
|
+
return cachedServiceUrls;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const result = await request({
|
|
309
|
+
url: `${idsServiceUrl}/api/aiChatWeb/serviceUrls`,
|
|
310
|
+
method: 'GET',
|
|
311
|
+
token
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
cachedServiceUrls = result;
|
|
315
|
+
return result;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* 清除服务配置缓存
|
|
320
|
+
*/
|
|
321
|
+
function clearServiceUrlsCache() {
|
|
322
|
+
cachedServiceUrls = null;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* 获取七牛上传 Token
|
|
327
|
+
* @param {string} ossServiceUrl - OSS 服务地址
|
|
328
|
+
* @param {string} token - 用户 Token
|
|
329
|
+
* @returns {Promise<string>} - 七牛上传 token 字符串
|
|
330
|
+
*/
|
|
331
|
+
function getQiniuToken(ossServiceUrl, token) {
|
|
332
|
+
return new Promise((resolve, reject) => {
|
|
333
|
+
wx.request({
|
|
334
|
+
url: `${ossServiceUrl}/api/app/externalStorage/tickets`,
|
|
335
|
+
method: 'POST',
|
|
336
|
+
header: {
|
|
337
|
+
'Content-Type': 'application/json',
|
|
338
|
+
'X-Access-Token': token ? `Bearer ${token}` : ''
|
|
339
|
+
},
|
|
340
|
+
success: (res) => {
|
|
341
|
+
if (res.statusCode === 401) {
|
|
342
|
+
reject({ code: 401, message: '请登录后使用' });
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
346
|
+
// API 直接返回 token 字符串
|
|
347
|
+
resolve(res.data);
|
|
348
|
+
} else {
|
|
349
|
+
reject({ code: res.statusCode, message: res.data?.message || '获取上传凭证失败' });
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
fail: (err) => {
|
|
353
|
+
reject({ code: -1, message: err.errMsg || '网络错误' });
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* 上传文件到七牛云
|
|
361
|
+
*/
|
|
362
|
+
function uploadFile(options) {
|
|
363
|
+
const { filePath, uploadToken, key, onProgress, onSuccess, onError } = options;
|
|
364
|
+
|
|
365
|
+
const uploadTask = wx.uploadFile({
|
|
366
|
+
url: 'https://up-z2.qiniup.com',
|
|
367
|
+
filePath: filePath,
|
|
368
|
+
name: 'file',
|
|
369
|
+
formData: {
|
|
370
|
+
token: uploadToken,
|
|
371
|
+
key: key
|
|
372
|
+
},
|
|
373
|
+
success: (res) => {
|
|
374
|
+
if (res.statusCode === 200) {
|
|
375
|
+
try {
|
|
376
|
+
const data = JSON.parse(res.data);
|
|
377
|
+
if (onSuccess) {
|
|
378
|
+
onSuccess(data);
|
|
379
|
+
}
|
|
380
|
+
} catch (e) {
|
|
381
|
+
if (onError) {
|
|
382
|
+
onError({ message: '解析上传结果失败' });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
} else {
|
|
386
|
+
if (onError) {
|
|
387
|
+
onError({ message: '上传失败' });
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
fail: (err) => {
|
|
392
|
+
if (onError) {
|
|
393
|
+
onError(err);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
uploadTask.onProgressUpdate((res) => {
|
|
399
|
+
if (onProgress) {
|
|
400
|
+
onProgress(res.progress);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
return uploadTask;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* 解析文件内容
|
|
409
|
+
*/
|
|
410
|
+
function parseFileContent(baseUrl, token, fileUrl) {
|
|
411
|
+
return request({
|
|
412
|
+
url: `${baseUrl}/app/tempFile/parse`,
|
|
413
|
+
method: 'POST',
|
|
414
|
+
data: { url: fileUrl },
|
|
415
|
+
token
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* 获取聊天设置
|
|
421
|
+
*/
|
|
422
|
+
function getChatSetting(baseUrl, token) {
|
|
423
|
+
return request({
|
|
424
|
+
url: `${baseUrl}/app/chat-setting`,
|
|
425
|
+
method: 'GET',
|
|
426
|
+
token
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* 自动生成会话标题
|
|
432
|
+
*/
|
|
433
|
+
function updateSessionTitle(baseUrl, token, msgId, userQuestion, aiAnswer) {
|
|
434
|
+
return request({
|
|
435
|
+
url: `${baseUrl}/app/sessions/title`,
|
|
436
|
+
method: 'POST',
|
|
437
|
+
data: {
|
|
438
|
+
id: msgId,
|
|
439
|
+
user_question: userQuestion,
|
|
440
|
+
ai_answer: aiAnswer
|
|
441
|
+
},
|
|
442
|
+
token
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* 搜索对话和聊天记录
|
|
448
|
+
*/
|
|
449
|
+
function searchChats(baseUrl, token, keyword) {
|
|
450
|
+
return request({
|
|
451
|
+
url: `${baseUrl}/app/chat-session/search?content=${encodeURIComponent(keyword)}`,
|
|
452
|
+
method: 'GET',
|
|
453
|
+
token
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
module.exports = {
|
|
458
|
+
generateMsgId,
|
|
459
|
+
getServiceUrls,
|
|
460
|
+
clearServiceUrlsCache,
|
|
461
|
+
getChatSessions,
|
|
462
|
+
createChatSession,
|
|
463
|
+
renameChatSession,
|
|
464
|
+
deleteChatSession,
|
|
465
|
+
getChatHistories,
|
|
466
|
+
deleteChatHistoriesByTime,
|
|
467
|
+
sendChatMessage,
|
|
468
|
+
getQiniuToken,
|
|
469
|
+
uploadFile,
|
|
470
|
+
parseFileContent,
|
|
471
|
+
getChatSetting,
|
|
472
|
+
updateSessionTitle,
|
|
473
|
+
searchChats
|
|
474
|
+
};
|