@ai-group/chat-sdk 0.2.5

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.
Files changed (80) hide show
  1. package/README.md +239 -0
  2. package/dist/esm/assets/arrow-down.png +0 -0
  3. package/dist/esm/assets/arrow-up.png +0 -0
  4. package/dist/esm/assets/chatKnowledge.png +0 -0
  5. package/dist/esm/assets/completed-black.png +0 -0
  6. package/dist/esm/assets/completed.png +0 -0
  7. package/dist/esm/assets/document-black.png +0 -0
  8. package/dist/esm/assets/document.png +0 -0
  9. package/dist/esm/assets/document.svg +16 -0
  10. package/dist/esm/assets/empty.png +0 -0
  11. package/dist/esm/assets/group.png +0 -0
  12. package/dist/esm/assets/qa-black.png +0 -0
  13. package/dist/esm/assets/qa.png +0 -0
  14. package/dist/esm/assets/skillNo-black.png +0 -0
  15. package/dist/esm/assets/skillNo.png +0 -0
  16. package/dist/esm/assets/tools-black.png +0 -0
  17. package/dist/esm/assets/tools.png +0 -0
  18. package/dist/esm/client/base.js +2 -0
  19. package/dist/esm/client/base.js.map +1 -0
  20. package/dist/esm/client/restClient.js +2 -0
  21. package/dist/esm/client/restClient.js.map +1 -0
  22. package/dist/esm/client/wsClient.js +2 -0
  23. package/dist/esm/client/wsClient.js.map +1 -0
  24. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js +562 -0
  25. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js.map +1 -0
  26. package/dist/esm/components/XAiChatbot/index.js +586 -0
  27. package/dist/esm/components/XAiChatbot/index.js.map +1 -0
  28. package/dist/esm/components/XAiChatbot/styles.js +62 -0
  29. package/dist/esm/components/XAiChatbot/styles.js.map +1 -0
  30. package/dist/esm/components/XAiProvider/XAiProvider.stories.js +297 -0
  31. package/dist/esm/components/XAiProvider/XAiProvider.stories.js.map +1 -0
  32. package/dist/esm/components/XAiProvider/index.js +128 -0
  33. package/dist/esm/components/XAiProvider/index.js.map +1 -0
  34. package/dist/esm/components/XAiSDK.js +29 -0
  35. package/dist/esm/components/XAiSDK.js.map +1 -0
  36. package/dist/esm/components/XAiWebSDKWrapper.js +42 -0
  37. package/dist/esm/components/XAiWebSDKWrapper.js.map +1 -0
  38. package/dist/esm/context/AiProviderContext.js +62 -0
  39. package/dist/esm/context/AiProviderContext.js.map +1 -0
  40. package/dist/esm/context/ThemeContext.js +8 -0
  41. package/dist/esm/context/ThemeContext.js.map +1 -0
  42. package/dist/esm/hooks/useAgentGenerator.js +536 -0
  43. package/dist/esm/hooks/useAgentGenerator.js.map +1 -0
  44. package/dist/esm/hooks/useEventStreamRequest.js +229 -0
  45. package/dist/esm/hooks/useEventStreamRequest.js.map +1 -0
  46. package/dist/esm/hooks/useProviderContext.js +115 -0
  47. package/dist/esm/hooks/useProviderContext.js.map +1 -0
  48. package/dist/esm/hooks/useXAiSDK.js +49 -0
  49. package/dist/esm/hooks/useXAiSDK.js.map +1 -0
  50. package/dist/esm/index.js +11 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/esm/services/api.js +73 -0
  53. package/dist/esm/services/api.js.map +1 -0
  54. package/dist/esm/styles/common.js +106 -0
  55. package/dist/esm/styles/common.js.map +1 -0
  56. package/dist/esm/styles/markdown.js +12 -0
  57. package/dist/esm/styles/markdown.js.map +1 -0
  58. package/dist/esm/types/XAiChatbot.js +2 -0
  59. package/dist/esm/types/XAiChatbot.js.map +1 -0
  60. package/dist/esm/types/XAiMessage.js +65 -0
  61. package/dist/esm/types/XAiMessage.js.map +1 -0
  62. package/dist/esm/types/XAiProvider.js +4 -0
  63. package/dist/esm/types/XAiProvider.js.map +1 -0
  64. package/dist/esm/types/index.js +4 -0
  65. package/dist/esm/types/index.js.map +1 -0
  66. package/dist/esm/types/mdx.d.ts +18 -0
  67. package/dist/esm/utils/chat.js +976 -0
  68. package/dist/esm/utils/chat.js.map +1 -0
  69. package/dist/esm/utils/index.js +19 -0
  70. package/dist/esm/utils/index.js.map +1 -0
  71. package/dist/esm/utils/providerManager.js +70 -0
  72. package/dist/esm/utils/providerManager.js.map +1 -0
  73. package/dist/esm/utils/request.example.js +379 -0
  74. package/dist/esm/utils/request.example.js.map +1 -0
  75. package/dist/esm/utils/request.js +491 -0
  76. package/dist/esm/utils/request.js.map +1 -0
  77. package/dist/esm/utils/umdEntry.js +109 -0
  78. package/dist/esm/utils/umdEntry.js.map +1 -0
  79. package/dist/umd/chat-sdk.min.js +1 -0
  80. package/package.json +71 -0
@@ -0,0 +1,536 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
3
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
4
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
5
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
6
+ import { useState, useEffect, useRef } from 'react';
7
+ import { v4 as uuidV4 } from 'uuid';
8
+ import { useEventStreamRequest } from "./useEventStreamRequest";
9
+ import { MessageRole, MessageStatus } from "../types/XAiMessage";
10
+ import { request } from "../utils/request";
11
+ import { safeJsonParse } from "../utils";
12
+ import { fetchAppConfig } from "../services/api";
13
+ // 图标
14
+ import documentIcon from "../assets/document.png";
15
+ import completedIcon from "../assets/completed.png";
16
+ import completedExpandIcon from "../assets/completed-black.png";
17
+ import documentExpandIcon from "../assets/document-black.png";
18
+ import qaIcon from "../assets/qa.png";
19
+ import qaExpandIcon from "../assets/qa-black.png";
20
+ import skillNoIcon from "../assets/skillNo.png";
21
+ import skillNoExpandIcon from "../assets/skillNo-black.png";
22
+ import toolIcon from "../assets/tools.png";
23
+ import toolExpandIcon from "../assets/tools-black.png";
24
+
25
+ // contents 类型
26
+
27
+ // —————————————— 接口字段定义 ————————————
28
+ export var ActionType = /*#__PURE__*/function (ActionType) {
29
+ ActionType["recallKnowledgeStart"] = "RECALL_KNOWLEDGE_START";
30
+ ActionType["recallKnowledgeEnd"] = "RECALL_KNOWLEDGE_END";
31
+ ActionType["invokeToolStart"] = "INVOKE_AGENT_TOOL_START";
32
+ ActionType["invokeToolEnd"] = "INVOKE_AGENT_TOOL_END";
33
+ ActionType["response"] = "RESPONSE";
34
+ ActionType["finish"] = "FINISHED";
35
+ return ActionType;
36
+ }({}); // 结束
37
+ export var ProcessStatus = /*#__PURE__*/function (ProcessStatus) {
38
+ ProcessStatus["start"] = "START";
39
+ ProcessStatus["end"] = "END";
40
+ return ProcessStatus;
41
+ }({});
42
+ export var ActionAvailability = /*#__PURE__*/function (ActionAvailability) {
43
+ ActionAvailability["disabled"] = "disabled";
44
+ ActionAvailability["enabled"] = "enabled";
45
+ ActionAvailability["remote"] = "remote";
46
+ return ActionAvailability;
47
+ }({}); // 远程可用
48
+
49
+ // 临时定义,后续可完善
50
+
51
+ /**
52
+ * 工具/动作定义
53
+ */
54
+
55
+ var useAgentGenerator = function useAgentGenerator(_ref) {
56
+ var url = _ref.url,
57
+ token = _ref.token,
58
+ config = _ref.config;
59
+ var textSpeed = 60;
60
+ var _useState = useState([]),
61
+ _useState2 = _slicedToArray(_useState, 2),
62
+ messages = _useState2[0],
63
+ setMessages = _useState2[1];
64
+ var _useState3 = useState(null),
65
+ _useState4 = _slicedToArray(_useState3, 2),
66
+ appInfo = _useState4[0],
67
+ setAppInfo = _useState4[1];
68
+ var requestInfo = useRef({});
69
+ var _ref2 = config || {},
70
+ appNo = _ref2.appNo,
71
+ pt = _ref2.pt,
72
+ tc = _ref2.tc;
73
+
74
+ // 初始化时获取配置
75
+ useEffect(function () {
76
+ if (url && config) {
77
+ var initConfig = /*#__PURE__*/function () {
78
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
79
+ var result;
80
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
81
+ while (1) switch (_context.prev = _context.next) {
82
+ case 0:
83
+ _context.prev = 0;
84
+ _context.next = 3;
85
+ return fetchAppConfig(_objectSpread({
86
+ url: url
87
+ }, config));
88
+ case 3:
89
+ result = _context.sent;
90
+ if (result.success) {
91
+ setAppInfo(result.data);
92
+ } else {
93
+ console.error('获取聊天配置失败', result.message);
94
+ }
95
+ _context.next = 10;
96
+ break;
97
+ case 7:
98
+ _context.prev = 7;
99
+ _context.t0 = _context["catch"](0);
100
+ console.error('获取聊天配置失败', _context.t0);
101
+ case 10:
102
+ case "end":
103
+ return _context.stop();
104
+ }
105
+ }, _callee, null, [[0, 7]]);
106
+ }));
107
+ return function initConfig() {
108
+ return _ref3.apply(this, arguments);
109
+ };
110
+ }();
111
+ initConfig();
112
+ }
113
+ // eslint-disable-next-line react-hooks/exhaustive-deps
114
+ }, [url, config]);
115
+ var _useEventStreamReques = useEventStreamRequest({
116
+ streaming: true,
117
+ textSpeed: textSpeed,
118
+ onClose: function onClose() {
119
+ // close的时机有可能在setMessages之前,所以需要延迟一下
120
+ setTimeout(function () {
121
+ var _requestInfo$current, _requestInfo$current2;
122
+ if ((_requestInfo$current = requestInfo.current) !== null && _requestInfo$current !== void 0 && _requestInfo$current.sensitiveWords && (_requestInfo$current2 = requestInfo.current) !== null && _requestInfo$current2 !== void 0 && _requestInfo$current2.requestId) {
123
+ request.post(url);
124
+ }
125
+ }, 500);
126
+ },
127
+ onOpen: function onOpen(res) {
128
+ console.log('res-----open:', res);
129
+ }
130
+ }),
131
+ start = _useEventStreamReques.start,
132
+ loading = _useEventStreamReques.loading,
133
+ responseData = _useEventStreamReques.responseData,
134
+ stop = _useEventStreamReques.stop;
135
+
136
+ // 数据更新
137
+ useEffect(function () {
138
+ if (!responseData || !responseData.content || !responseData.data) return;
139
+ var response = responseData.data || responseData.content;
140
+ if (typeof response === 'string') {
141
+ response = safeJsonParse(response, {
142
+ action: ActionType.response,
143
+ data: {
144
+ contentType: 'TEXT',
145
+ content: '解析响应数据时出错,请重试',
146
+ success: false,
147
+ errorMsg: '响应数据格式错误'
148
+ }
149
+ });
150
+ }
151
+ setMessages(function (prevMessages) {
152
+ // 找到最后一条 AI 消息
153
+ var lastAIMsgIndex = _toConsumableArray(prevMessages).reverse().findIndex(function (m) {
154
+ return m.role === MessageRole.assistant && m.type === 'TextMessage' && (m.status === 'init' || m.status === 'pending');
155
+ });
156
+ var realIndex = lastAIMsgIndex === -1 ? -1 : prevMessages.length - 1 - lastAIMsgIndex;
157
+ var lastAIMsg = realIndex !== -1 ? prevMessages[realIndex] : null;
158
+ var newMessages = _toConsumableArray(prevMessages);
159
+ var aiMsg;
160
+ if (!lastAIMsg) {
161
+ aiMsg = {
162
+ id: uuidV4(),
163
+ type: 'TextMessage',
164
+ createdAt: new Date(),
165
+ role: MessageRole.assistant,
166
+ content: {
167
+ text: ''
168
+ },
169
+ thinks: [],
170
+ status: MessageStatus.init
171
+ };
172
+ newMessages.push(aiMsg);
173
+ } else if (lastAIMsg.type === 'TextMessage') {
174
+ aiMsg = _objectSpread({}, lastAIMsg);
175
+ } else if (lastAIMsg.type === 'ImageMessage') {
176
+ aiMsg = undefined;
177
+ }
178
+
179
+ // 消息类型判断
180
+ var _response = response,
181
+ action = _response.action,
182
+ data = _response.data;
183
+ var uniqueId = data.uniqueId,
184
+ contentType = data.contentType,
185
+ content = data.content,
186
+ toolType = data.toolType,
187
+ args = data.args,
188
+ knowledgeType = data.knowledgeType,
189
+ _data$success = data.success,
190
+ success = _data$success === void 0 ? true : _data$success,
191
+ errorMsg = data.errorMsg;
192
+
193
+ // 如果 aiMsg 为 undefined,则跳过处理
194
+ if (!aiMsg) {
195
+ return newMessages;
196
+ }
197
+ switch (action) {
198
+ case ActionType.recallKnowledgeStart:
199
+ aiMsg.thinks = aiMsg.thinks || [];
200
+ aiMsg.thinks.push({
201
+ id: uniqueId,
202
+ createdAt: new Date(),
203
+ type: 'ActionExecutionMessage',
204
+ name: knowledgeType === 'DOCUMENT' ? '已搜索文档知识库' : '已搜索问答知识库',
205
+ arguments: args,
206
+ extra: _objectSpread(_objectSpread({}, data), {}, {
207
+ icon: knowledgeType === 'DOCUMENT' ? documentIcon : qaIcon,
208
+ expandIcon: knowledgeType === 'DOCUMENT' ? documentExpandIcon : qaExpandIcon
209
+ })
210
+ });
211
+ break;
212
+ case ActionType.recallKnowledgeEnd:
213
+ {
214
+ var _aiMsg$thinks;
215
+ // 需要给之前的recallKnowledgeStart添加cost - 通过uniqueId关联
216
+ var recallKnowledgeMsg = (_aiMsg$thinks = aiMsg.thinks) === null || _aiMsg$thinks === void 0 ? void 0 : _aiMsg$thinks.find(function (item) {
217
+ return item.id === uniqueId;
218
+ });
219
+ if (recallKnowledgeMsg) {
220
+ recallKnowledgeMsg.extra.cost = data !== null && data !== void 0 && data.cost ? ((data === null || data === void 0 ? void 0 : data.cost) / 1000).toFixed(2) : 0;
221
+ }
222
+ break;
223
+ }
224
+ case ActionType.invokeToolStart:
225
+ aiMsg.thinks = aiMsg.thinks || [];
226
+ aiMsg.thinks.push({
227
+ id: uniqueId,
228
+ createdAt: new Date(),
229
+ type: 'ActionExecutionMessage',
230
+ name: toolType === 'SKILL' ? '已调用工作流' : '已调用工具',
231
+ arguments: args,
232
+ extra: _objectSpread(_objectSpread({}, data), {}, {
233
+ icon: toolType === 'SKILL' ? skillNoIcon : toolIcon,
234
+ expandIcon: toolType === 'SKILL' ? skillNoExpandIcon : toolExpandIcon
235
+ })
236
+ });
237
+ break;
238
+ case ActionType.invokeToolEnd:
239
+ {
240
+ var _aiMsg$thinks2;
241
+ // 需要给之前的invokeToolStart添加cost - 通过uniqueId关联
242
+ var invokeToolMsg = (_aiMsg$thinks2 = aiMsg.thinks) === null || _aiMsg$thinks2 === void 0 ? void 0 : _aiMsg$thinks2.find(function (item) {
243
+ return item.id === uniqueId;
244
+ });
245
+ if (invokeToolMsg) {
246
+ invokeToolMsg.extra.cost = data !== null && data !== void 0 && data.cost ? ((data === null || data === void 0 ? void 0 : data.cost) / 1000).toFixed(2) : 0;
247
+ }
248
+ break;
249
+ }
250
+ case ActionType.response:
251
+ if (success) {
252
+ // 正常渲染
253
+ if (aiMsg.status === MessageStatus.init) {
254
+ aiMsg.status = MessageStatus.pending;
255
+ }
256
+ if (contentType === 'TEXT' && 'text' in aiMsg.content) {
257
+ aiMsg.content.text += content;
258
+ }
259
+ } else {
260
+ // 调用失败
261
+ aiMsg.status = MessageStatus.failed;
262
+ aiMsg.content.text = "<span style=\"color: red;\">\u274C ".concat(errorMsg, "</span>");
263
+ }
264
+ break;
265
+ case ActionType.finish:
266
+ aiMsg.thinks = aiMsg.thinks || [];
267
+ aiMsg.thinks.push({
268
+ id: uniqueId,
269
+ createdAt: new Date(),
270
+ type: 'ActionExecutionMessage',
271
+ name: '运行完毕',
272
+ extra: _objectSpread(_objectSpread({}, data), {}, {
273
+ cost: data !== null && data !== void 0 && data.cost ? ((data === null || data === void 0 ? void 0 : data.cost) / 1000).toFixed(2) : 0,
274
+ icon: completedIcon,
275
+ expandIcon: completedExpandIcon
276
+ })
277
+ });
278
+ aiMsg.status = MessageStatus.done;
279
+ break;
280
+ // 其他类型略
281
+ }
282
+
283
+ // 更新消息数组
284
+ if (lastAIMsg && lastAIMsg.type === 'TextMessage') {
285
+ newMessages[realIndex] = aiMsg;
286
+ } else if (!lastAIMsg && aiMsg) {
287
+ // 只有 newMessages 最后一条是 TextMessage 时才替换,否则 push
288
+ if (newMessages.length > 0 && newMessages[newMessages.length - 1].type === 'TextMessage') {
289
+ newMessages[newMessages.length - 1] = aiMsg;
290
+ } else {
291
+ // 只 push TextMessage,不替换非 TextMessage
292
+ newMessages = [].concat(_toConsumableArray(newMessages), [aiMsg]);
293
+ }
294
+ }
295
+ return newMessages;
296
+ });
297
+
298
+ // eslint-disable-next-line react-hooks/exhaustive-deps
299
+ }, [responseData]);
300
+
301
+ // 添加对话(非普通对话)
302
+ var setMessage = /*#__PURE__*/function () {
303
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(messageType, content) {
304
+ var prologueMessageIndex, newMessage, suggestMessageIndex, _newMessage;
305
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
306
+ while (1) switch (_context2.prev = _context2.next) {
307
+ case 0:
308
+ _context2.t0 = messageType;
309
+ _context2.next = _context2.t0 === 'prologue' ? 3 : _context2.t0 === 'suggest' ? 6 : 9;
310
+ break;
311
+ case 3:
312
+ prologueMessageIndex = messages.findIndex(function (item) {
313
+ var _item$extra;
314
+ return (_item$extra = item.extra) === null || _item$extra === void 0 ? void 0 : _item$extra.prologue;
315
+ });
316
+ if (prologueMessageIndex === -1) {
317
+ newMessage = {
318
+ type: 'TextMessage',
319
+ id: uuidV4(),
320
+ createdAt: new Date(),
321
+ role: MessageRole.assistant,
322
+ status: MessageStatus.done,
323
+ content: {
324
+ text: content
325
+ },
326
+ extra: {
327
+ prologue: true,
328
+ noFooter: true
329
+ }
330
+ };
331
+ setMessages(function (prev) {
332
+ return [].concat(_toConsumableArray(prev), [newMessage]);
333
+ });
334
+ } else {
335
+ setMessages(function (prev) {
336
+ return prev.map(function (item) {
337
+ var _item$extra2;
338
+ if ((_item$extra2 = item.extra) !== null && _item$extra2 !== void 0 && _item$extra2.prologue && item.content && 'text' in item.content) {
339
+ item.content.text = content;
340
+ }
341
+ return item;
342
+ });
343
+ });
344
+ }
345
+ return _context2.abrupt("break", 10);
346
+ case 6:
347
+ suggestMessageIndex = messages.findIndex(function (item) {
348
+ return item.type === 'SuggestionMessage';
349
+ });
350
+ if (suggestMessageIndex === -1) {
351
+ _newMessage = {
352
+ id: uuidV4(),
353
+ type: 'SuggestionMessage',
354
+ createdAt: new Date(),
355
+ status: MessageStatus.done,
356
+ role: MessageRole.suggestion,
357
+ content: content
358
+ };
359
+ setMessages(function (prev) {
360
+ return [].concat(_toConsumableArray(prev), [_newMessage]);
361
+ });
362
+ } else {
363
+ setMessages(function (prev) {
364
+ return prev.map(function (item) {
365
+ if (item.type === 'SuggestionMessage') {
366
+ item.content = content;
367
+ }
368
+ return item;
369
+ });
370
+ });
371
+ }
372
+ return _context2.abrupt("break", 10);
373
+ case 9:
374
+ return _context2.abrupt("break", 10);
375
+ case 10:
376
+ case "end":
377
+ return _context2.stop();
378
+ }
379
+ }, _callee2);
380
+ }));
381
+ return function setMessage(_x, _x2) {
382
+ return _ref4.apply(this, arguments);
383
+ };
384
+ }();
385
+
386
+ // 简单对话
387
+ var chat = /*#__PURE__*/function () {
388
+ var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(content) {
389
+ var newMessage;
390
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
391
+ while (1) switch (_context3.prev = _context3.next) {
392
+ case 0:
393
+ newMessage = {
394
+ type: 'TextMessage',
395
+ id: uuidV4(),
396
+ createdAt: new Date(),
397
+ role: MessageRole.user,
398
+ status: MessageStatus.done,
399
+ content: {
400
+ text: content
401
+ }
402
+ };
403
+ setMessages(function (prev) {
404
+ // 若存在对话建议,先删除对话建议
405
+ var suggestMessageIndex = messages.findIndex(function (item) {
406
+ return item.type === 'SuggestionMessage';
407
+ });
408
+ if (suggestMessageIndex !== -1) {
409
+ prev.splice(suggestMessageIndex, 1);
410
+ }
411
+ // 插入用户消息
412
+ prev.push(newMessage);
413
+ return prev;
414
+ });
415
+ start("".concat(url, "/appouter/").concat(appNo, "/sendMsg?pt=").concat(pt, "&tc=").concat(tc), {
416
+ appParams: {
417
+ inputs_msg: content
418
+ }
419
+ }, {
420
+ Authorization: "Bearer ".concat(token)
421
+ });
422
+ case 3:
423
+ case "end":
424
+ return _context3.stop();
425
+ }
426
+ }, _callee3);
427
+ }));
428
+ return function chat(_x3) {
429
+ return _ref5.apply(this, arguments);
430
+ };
431
+ }();
432
+
433
+ // 重新生成方法
434
+ var reChat = function reChat() {
435
+ setMessages(function (prevMessages) {
436
+ // 1. 删除最新一条 AI 消息
437
+ var lastAIMsgIndex = _toConsumableArray(prevMessages).reverse().findIndex(function (m) {
438
+ return m.role === MessageRole.assistant && m.type === 'TextMessage';
439
+ });
440
+ var newMessages = _toConsumableArray(prevMessages);
441
+ if (lastAIMsgIndex !== -1) {
442
+ var realIndex = newMessages.length - 1 - lastAIMsgIndex;
443
+ newMessages.splice(realIndex, 1);
444
+ }
445
+
446
+ // 2. 若存在对话建议,先删除对话建议
447
+ var suggestMessageIndex = messages.findIndex(function (item) {
448
+ return item.type === 'SuggestionMessage';
449
+ });
450
+ if (suggestMessageIndex !== -1) {
451
+ newMessages.splice(suggestMessageIndex, 1);
452
+ }
453
+
454
+ // 3. 找到最新一条用户消息,且类型为 TextMessage
455
+ var lastUserMsg = _toConsumableArray(newMessages).reverse().find(function (m) {
456
+ return m.role === MessageRole.user && m.type === 'TextMessage';
457
+ });
458
+ if (lastUserMsg && lastUserMsg.content && typeof lastUserMsg.content.text === 'string') {
459
+ // 重新发起 chat
460
+ chat(lastUserMsg.content.text);
461
+ }
462
+ return newMessages;
463
+ });
464
+ };
465
+ var stopChat = function stopChat() {
466
+ stop();
467
+ setMessages(function (prevMessages) {
468
+ // 找到我所有进行中的消息,并设置为结束
469
+ var newMessages = _toConsumableArray(prevMessages);
470
+ newMessages.forEach(function (m) {
471
+ if (m.status === MessageStatus.pending) {
472
+ m.status = MessageStatus.done;
473
+ } else if (m.status === MessageStatus.init) {
474
+ if (m.type === 'TextMessage') {
475
+ m.content.text = '<span style="color: #cbcbcb;">用户已取消</span>';
476
+ }
477
+ m.status = MessageStatus.done;
478
+ }
479
+ });
480
+ return newMessages;
481
+ });
482
+ };
483
+
484
+ // 初始化应用
485
+ useEffect(function () {
486
+ if (appInfo) {
487
+ var _appInfo$onboardingIn = appInfo.onboardingInfo,
488
+ onboardingInfo = _appInfo$onboardingIn === void 0 ? {} : _appInfo$onboardingIn;
489
+ // eslint-disable-next-line camelcase
490
+ var _ref6 = onboardingInfo || {},
491
+ _ref6$suggested_quest = _ref6.suggested_questions,
492
+ suggested_questions = _ref6$suggested_quest === void 0 ? [] : _ref6$suggested_quest,
493
+ _ref6$prologue = _ref6.prologue,
494
+ prologue = _ref6$prologue === void 0 ? '' : _ref6$prologue;
495
+ if (prologue) {
496
+ setMessage('prologue', prologue);
497
+ } else {
498
+ setMessages(function (prev) {
499
+ return prev.filter(function (item) {
500
+ var _item$extra3;
501
+ return !((_item$extra3 = item.extra) !== null && _item$extra3 !== void 0 && _item$extra3.prologue);
502
+ });
503
+ });
504
+ }
505
+ if (suggested_questions.length > 0) {
506
+ var suggestMessages = suggested_questions.map(function (item, index) {
507
+ return {
508
+ key: index + 1,
509
+ description: item
510
+ };
511
+ });
512
+ setMessage('suggest', suggestMessages);
513
+ } else {
514
+ setMessages(function (prev) {
515
+ return prev.filter(function (item) {
516
+ return !(item.type === 'SuggestionMessage');
517
+ });
518
+ });
519
+ }
520
+ }
521
+ // eslint-disable-next-line react-hooks/exhaustive-deps
522
+ }, [appInfo]);
523
+ return {
524
+ appInfo: appInfo,
525
+ messages: messages,
526
+ loading: loading,
527
+ content: responseData.content,
528
+ reChat: reChat,
529
+ chat: chat,
530
+ setMessage: setMessage,
531
+ setMessages: setMessages,
532
+ stopChat: stopChat
533
+ };
534
+ };
535
+ export default useAgentGenerator;
536
+ //# sourceMappingURL=useAgentGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","useEffect","useRef","v4","uuidV4","useEventStreamRequest","MessageRole","MessageStatus","request","safeJsonParse","fetchAppConfig","documentIcon","completedIcon","completedExpandIcon","documentExpandIcon","qaIcon","qaExpandIcon","skillNoIcon","skillNoExpandIcon","toolIcon","toolExpandIcon","ActionType","ProcessStatus","ActionAvailability","useAgentGenerator","_ref","url","token","config","textSpeed","_useState","_useState2","_slicedToArray","messages","setMessages","_useState3","_useState4","appInfo","setAppInfo","requestInfo","_ref2","appNo","pt","tc","initConfig","_ref3","_asyncToGenerator","_regeneratorRuntime","mark","_callee","result","wrap","_callee$","_context","prev","next","_objectSpread","sent","success","data","console","error","message","t0","stop","apply","arguments","_useEventStreamReques","streaming","onClose","setTimeout","_requestInfo$current","_requestInfo$current2","current","sensitiveWords","requestId","post","onOpen","res","log","start","loading","responseData","content","response","action","contentType","errorMsg","prevMessages","lastAIMsgIndex","_toConsumableArray","reverse","findIndex","m","role","assistant","type","status","realIndex","length","lastAIMsg","newMessages","aiMsg","id","createdAt","Date","text","thinks","init","push","undefined","_response","uniqueId","toolType","args","knowledgeType","_data$success","recallKnowledgeStart","name","extra","icon","expandIcon","recallKnowledgeEnd","_aiMsg$thinks","recallKnowledgeMsg","find","item","cost","toFixed","invokeToolStart","invokeToolEnd","_aiMsg$thinks2","invokeToolMsg","pending","failed","concat","finish","done","setMessage","_ref4","_callee2","messageType","prologueMessageIndex","newMessage","suggestMessageIndex","_newMessage","_callee2$","_context2","_item$extra","prologue","noFooter","map","_item$extra2","abrupt","suggestion","_x","_x2","chat","_ref5","_callee3","_callee3$","_context3","user","splice","appParams","inputs_msg","Authorization","_x3","reChat","lastUserMsg","stopChat","forEach","_appInfo$onboardingIn","onboardingInfo","_ref6","_ref6$suggested_quest","suggested_questions","_ref6$prologue","filter","_item$extra3","suggestMessages","index","key","description"],"sources":["../../../src/hooks/useAgentGenerator.ts"],"sourcesContent":["import { useState, useEffect, useRef } from 'react';\nimport { v4 as uuidV4 } from 'uuid';\nimport { useEventStreamRequest } from '@/hooks/useEventStreamRequest';\nimport { MessageRole, MessageStatus, TextMessage, Messages } from '@/types/XAiMessage';\nimport { request } from '@/utils/request';\nimport { safeJsonParse } from '@/utils/index';\nimport { fetchAppConfig } from '@/services/api';\n// 图标\nimport documentIcon from '@/assets/document.png';\nimport completedIcon from '@/assets/completed.png';\nimport completedExpandIcon from '@/assets/completed-black.png';\nimport documentExpandIcon from '@/assets/document-black.png';\nimport qaIcon from '@/assets/qa.png';\nimport qaExpandIcon from '@/assets/qa-black.png';\nimport skillNoIcon from '@/assets/skillNo.png';\nimport skillNoExpandIcon from '@/assets/skillNo-black.png';\nimport toolIcon from '@/assets/tools.png';\nimport toolExpandIcon from '@/assets/tools-black.png';\n\nexport type ContentType = 'TEXT' | 'IMAGE' | 'FILE';\n\nexport interface ImageUrl {\n url: string;\n name: string;\n}\n\nexport interface FileUrl {\n url: string;\n fileName: string;\n suffix: string;\n}\n\nexport interface Content {\n text?: string;\n imageUrl?: ImageUrl;\n fileUrl?: FileUrl;\n}\n\nexport interface ContentDef {\n description: string;\n contentType: ContentType;\n content: Content;\n}\n// contents 类型\nexport type Contents = ContentDef[];\n\n// —————————————— 接口字段定义 ————————————\nexport enum ActionType {\n recallKnowledgeStart = 'RECALL_KNOWLEDGE_START', // 知识库召回开始\n recallKnowledgeEnd = 'RECALL_KNOWLEDGE_END', // 知识库召回结束\n invokeToolStart = 'INVOKE_AGENT_TOOL_START', // 开始调用工具\n invokeToolEnd = 'INVOKE_AGENT_TOOL_END', // 调用工具完成\n response = 'RESPONSE', // 响应\n finish = 'FINISHED', // 结束\n}\n\nexport enum ProcessStatus {\n start = 'START',\n end = 'END',\n}\n\nexport enum ActionAvailability {\n disabled = 'disabled', // 不可用\n enabled = 'enabled', // 可用\n remote = 'remote', // 远程可用\n}\n\nexport type ThinkStep = any; // 临时定义,后续可完善\n\n/**\n* 工具/动作定义\n*/\nexport interface Action {\n name: string; // 名称\n description: string; // 描述\n jsonSchema: string; // 参数JSON Schema\n available?: ActionAvailability; // 可用性\n}\n\nconst useAgentGenerator = ({ url, token, config }: { url: string; token: string; config: any }) => {\n const textSpeed = 60;\n\n const [messages, setMessages] = useState<Messages[]>([]);\n const [appInfo, setAppInfo] = useState<any>(null);\n const requestInfo = useRef<{ requestId?: string; sensitiveWords?: string[] }>({});\n\n const { appNo, pt, tc } = config || {};\n\n // 初始化时获取配置\n useEffect(() => {\n if (url && config) {\n const initConfig = async () => {\n try {\n const result = await fetchAppConfig({ url, ...config });\n if (result.success) {\n setAppInfo(result.data);\n } else {\n console.error('获取聊天配置失败', result.message);\n }\n } catch (error) {\n console.error('获取聊天配置失败', error);\n }\n };\n initConfig();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, config]);\n\n const { start, loading, responseData, stop } = useEventStreamRequest({\n streaming: true,\n textSpeed,\n onClose: () => {\n // close的时机有可能在setMessages之前,所以需要延迟一下\n setTimeout(() => {\n if (requestInfo.current?.sensitiveWords && requestInfo.current?.requestId) {\n request.post(url);\n }\n }, 500);\n },\n onOpen(res) {\n console.log('res-----open:', res);\n },\n });\n\n // 数据更新\n useEffect(() => {\n if (!responseData || !responseData.content || !responseData.data) return;\n\n let response = responseData.data || responseData.content;\n if (typeof response === 'string') {\n response = safeJsonParse(response, {\n action: ActionType.response,\n data: {\n contentType: 'TEXT',\n content: '解析响应数据时出错,请重试',\n success: false,\n errorMsg: '响应数据格式错误',\n },\n });\n }\n\n setMessages((prevMessages) => {\n // 找到最后一条 AI 消息\n const lastAIMsgIndex = [...prevMessages].reverse().findIndex(\n (m) => m.role === MessageRole.assistant && m.type === 'TextMessage' && (m.status === 'init' || m.status === 'pending'),\n );\n const realIndex = lastAIMsgIndex === -1 ? -1 : prevMessages.length - 1 - lastAIMsgIndex;\n const lastAIMsg = realIndex !== -1 ? prevMessages[realIndex] : null;\n\n let newMessages = [...prevMessages];\n let aiMsg: TextMessage | undefined;\n\n if (!lastAIMsg) {\n aiMsg = {\n id: uuidV4(),\n type: 'TextMessage',\n createdAt: new Date(),\n role: MessageRole.assistant,\n content: { text: '' },\n thinks: [],\n status: MessageStatus.init,\n };\n newMessages.push(aiMsg);\n } else if (lastAIMsg.type === 'TextMessage') {\n aiMsg = { ...lastAIMsg };\n } else if (lastAIMsg.type === 'ImageMessage') {\n aiMsg = undefined;\n }\n\n // 消息类型判断\n const { action, data } = response;\n const { uniqueId, contentType, content, toolType, args, knowledgeType, success = true, errorMsg } = data;\n\n // 如果 aiMsg 为 undefined,则跳过处理\n if (!aiMsg) {\n return newMessages;\n }\n\n switch (action) {\n case ActionType.recallKnowledgeStart:\n aiMsg.thinks = aiMsg.thinks || [];\n aiMsg.thinks.push({\n id: uniqueId,\n createdAt: new Date(),\n type: 'ActionExecutionMessage',\n name: knowledgeType === 'DOCUMENT' ? '已搜索文档知识库' : '已搜索问答知识库',\n arguments: args,\n extra: {\n ...data,\n icon: knowledgeType === 'DOCUMENT' ? documentIcon : qaIcon,\n expandIcon: knowledgeType === 'DOCUMENT' ? documentExpandIcon : qaExpandIcon,\n },\n });\n break;\n case ActionType.recallKnowledgeEnd: {\n // 需要给之前的recallKnowledgeStart添加cost - 通过uniqueId关联\n const recallKnowledgeMsg = aiMsg.thinks?.find((item) => item.id === uniqueId);\n if (recallKnowledgeMsg) {\n recallKnowledgeMsg.extra.cost = data?.cost ? (data?.cost / 1000).toFixed(2) : 0;\n }\n break;\n }\n case ActionType.invokeToolStart:\n aiMsg.thinks = aiMsg.thinks || [];\n aiMsg.thinks.push({\n id: uniqueId,\n createdAt: new Date(),\n type: 'ActionExecutionMessage',\n name: toolType === 'SKILL' ? '已调用工作流' : '已调用工具',\n arguments: args,\n extra: {\n ...data,\n icon: toolType === 'SKILL' ? skillNoIcon : toolIcon,\n expandIcon: toolType === 'SKILL' ? skillNoExpandIcon : toolExpandIcon,\n },\n });\n break;\n case ActionType.invokeToolEnd: {\n // 需要给之前的invokeToolStart添加cost - 通过uniqueId关联\n const invokeToolMsg = aiMsg.thinks?.find((item) => item.id === uniqueId);\n if (invokeToolMsg) {\n invokeToolMsg.extra.cost = data?.cost ? (data?.cost / 1000).toFixed(2) : 0;\n }\n break;\n }\n case ActionType.response:\n if (success) {\n // 正常渲染\n if (aiMsg.status === MessageStatus.init) {\n aiMsg.status = MessageStatus.pending;\n }\n if (contentType === 'TEXT' && 'text' in aiMsg.content) {\n aiMsg.content.text += content;\n }\n } else {\n // 调用失败\n aiMsg.status = MessageStatus.failed;\n aiMsg.content.text = `<span style=\"color: red;\">❌ ${errorMsg}</span>`;\n }\n break;\n case ActionType.finish:\n aiMsg.thinks = aiMsg.thinks || [];\n aiMsg.thinks.push({\n id: uniqueId,\n createdAt: new Date(),\n type: 'ActionExecutionMessage',\n name: '运行完毕',\n extra: {\n ...data,\n cost: data?.cost ? (data?.cost / 1000).toFixed(2) : 0,\n icon: completedIcon,\n expandIcon: completedExpandIcon,\n },\n });\n aiMsg.status = MessageStatus.done;\n break;\n // 其他类型略\n }\n\n // 更新消息数组\n if (lastAIMsg && lastAIMsg.type === 'TextMessage') {\n newMessages[realIndex] = aiMsg;\n } else if (!lastAIMsg && aiMsg) {\n // 只有 newMessages 最后一条是 TextMessage 时才替换,否则 push\n if (newMessages.length > 0 && newMessages[newMessages.length - 1].type === 'TextMessage') {\n newMessages[newMessages.length - 1] = aiMsg;\n } else {\n // 只 push TextMessage,不替换非 TextMessage\n newMessages = [...newMessages, aiMsg];\n }\n }\n return newMessages;\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [responseData]);\n\n // 添加对话(非普通对话)\n const setMessage = async (messageType: string, content: any) => {\n switch (messageType) {\n case 'prologue': {\n const prologueMessageIndex = messages.findIndex((item) => item.extra?.prologue);\n if (prologueMessageIndex === -1) {\n const newMessage: Messages = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.assistant,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n extra: {\n prologue: true,\n noFooter: true,\n },\n };\n setMessages((prev) => [...prev, newMessage]);\n } else {\n setMessages((prev) => prev.map((item) => {\n if (item.extra?.prologue && item.content && 'text' in item.content) {\n item.content.text = content;\n }\n return item;\n }));\n }\n break;\n }\n case 'suggest': {\n const suggestMessageIndex = messages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex === -1) {\n const newMessage: Messages = {\n id: uuidV4(),\n type: 'SuggestionMessage',\n createdAt: new Date(),\n status: MessageStatus.done,\n role: MessageRole.suggestion,\n content,\n };\n setMessages((prev) => [...prev, newMessage]);\n } else {\n setMessages((prev) => prev.map((item) => {\n if (item.type === 'SuggestionMessage') {\n item.content = content;\n }\n return item;\n }));\n }\n break;\n }\n default:\n break;\n }\n };\n\n // 简单对话\n const chat = async (content: any) => {\n const newMessage: Messages = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.user,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n };\n\n setMessages((prev) => {\n // 若存在对话建议,先删除对话建议\n const suggestMessageIndex = messages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex !== -1) {\n prev.splice(suggestMessageIndex, 1);\n }\n // 插入用户消息\n prev.push(newMessage);\n return prev;\n });\n\n start(\n `${url}/appouter/${appNo}/sendMsg?pt=${pt}&tc=${tc}`,\n {\n appParams: {\n inputs_msg: content,\n },\n },\n {\n Authorization: `Bearer ${token}`,\n },\n );\n };\n\n // 重新生成方法\n const reChat = () => {\n setMessages((prevMessages) => {\n // 1. 删除最新一条 AI 消息\n const lastAIMsgIndex = [...prevMessages].reverse().findIndex(\n (m) => m.role === MessageRole.assistant && m.type === 'TextMessage',\n );\n const newMessages = [...prevMessages];\n if (lastAIMsgIndex !== -1) {\n const realIndex = newMessages.length - 1 - lastAIMsgIndex;\n newMessages.splice(realIndex, 1);\n }\n\n // 2. 若存在对话建议,先删除对话建议\n const suggestMessageIndex = messages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex !== -1) {\n newMessages.splice(suggestMessageIndex, 1);\n }\n\n // 3. 找到最新一条用户消息,且类型为 TextMessage\n const lastUserMsg = [...newMessages].reverse().find(\n (m) => m.role === MessageRole.user && m.type === 'TextMessage',\n ) as TextMessage | undefined;\n if (lastUserMsg && lastUserMsg.content && typeof lastUserMsg.content.text === 'string') {\n // 重新发起 chat\n chat(lastUserMsg.content.text);\n }\n\n return newMessages;\n });\n };\n\n const stopChat = () => {\n stop();\n setMessages((prevMessages) => {\n // 找到我所有进行中的消息,并设置为结束\n const newMessages = [...prevMessages];\n newMessages.forEach((m) => {\n if (m.status === MessageStatus.pending) {\n m.status = MessageStatus.done;\n } else if (m.status === MessageStatus.init) {\n if (m.type === 'TextMessage') {\n m.content.text = '<span style=\"color: #cbcbcb;\">用户已取消</span>';\n }\n m.status = MessageStatus.done;\n }\n });\n return newMessages;\n });\n };\n\n // 初始化应用\n useEffect(() => {\n if (appInfo) {\n const { onboardingInfo = {} } = appInfo;\n // eslint-disable-next-line camelcase\n const { suggested_questions = [], prologue = '' } = onboardingInfo || {};\n\n if (prologue) {\n setMessage('prologue', prologue);\n } else {\n setMessages((prev) => prev.filter((item) => !item.extra?.prologue));\n }\n\n if (suggested_questions.length > 0) {\n const suggestMessages = suggested_questions.map((item: string, index: number) => ({\n key: index + 1,\n description: item,\n }));\n setMessage('suggest', suggestMessages);\n } else {\n setMessages((prev) => prev.filter((item) => !(item.type === 'SuggestionMessage')));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appInfo]);\n\n return {\n appInfo,\n messages,\n loading,\n content: responseData.content,\n reChat,\n chat,\n setMessage,\n setMessages,\n stopChat,\n };\n};\n\nexport default useAgentGenerator;\n"],"mappings":"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"}