@ai-group/chat-sdk 3.6.4 → 3.6.6

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.
@@ -49,6 +49,60 @@ var getMessageEventId = function getMessageEventId(messageItem) {
49
49
  var _messageItem$raw;
50
50
  return messageItem.eventId || ((_messageItem$raw = messageItem.raw) === null || _messageItem$raw === void 0 ? void 0 : _messageItem$raw.id);
51
51
  };
52
+ var getMessageInvocationId = function getMessageInvocationId(messageItem) {
53
+ var _messageItem$raw2;
54
+ return messageItem.invocationId || ((_messageItem$raw2 = messageItem.raw) === null || _messageItem$raw2 === void 0 ? void 0 : _messageItem$raw2.invocationId);
55
+ };
56
+ var deduplicateMessages = function deduplicateMessages(messageItems) {
57
+ var seenMessageIds = new Set();
58
+ var hasDuplicate = false;
59
+ var uniqueIdMessages = messageItems.filter(function (messageItem) {
60
+ if (seenMessageIds.has(messageItem.id)) {
61
+ hasDuplicate = true;
62
+ return false;
63
+ }
64
+ seenMessageIds.add(messageItem.id);
65
+ return true;
66
+ });
67
+ var botTextGroups = new Map();
68
+ uniqueIdMessages.forEach(function (messageItem) {
69
+ var invocationId = getMessageInvocationId(messageItem);
70
+ if (messageItem.role !== "bot" || !invocationId || typeof messageItem.text !== "string") return;
71
+ var normalizedText = messageItem.text.replace(/\s+/g, " ").trim();
72
+ if (!normalizedText) return;
73
+ var fileKey = (messageItem.fileData || []).map(function (file) {
74
+ return file.fileUri;
75
+ }).join("|");
76
+ var groupKey = "".concat(invocationId, "\0").concat(Boolean(messageItem.thought), "\0").concat(fileKey);
77
+ var group = botTextGroups.get(groupKey) || [];
78
+ group.push({
79
+ messageItem: messageItem,
80
+ normalizedText: normalizedText
81
+ });
82
+ botTextGroups.set(groupKey, group);
83
+ });
84
+ var redundantMessageIds = new Set();
85
+ botTextGroups.forEach(function (group) {
86
+ var completeTexts = [];
87
+ _toConsumableArray(group).sort(function (a, b) {
88
+ return b.normalizedText.length - a.normalizedText.length;
89
+ }).forEach(function (_ref) {
90
+ var messageItem = _ref.messageItem,
91
+ normalizedText = _ref.normalizedText;
92
+ if (completeTexts.some(function (completeText) {
93
+ return completeText.includes(normalizedText);
94
+ })) {
95
+ redundantMessageIds.add(messageItem.id);
96
+ hasDuplicate = true;
97
+ return;
98
+ }
99
+ completeTexts.push(normalizedText);
100
+ });
101
+ });
102
+ return hasDuplicate ? uniqueIdMessages.filter(function (messageItem) {
103
+ return !redundantMessageIds.has(messageItem.id);
104
+ }) : messageItems;
105
+ };
52
106
  var mapSessionMessages = function mapSessionMessages(sessionEvents) {
53
107
  var mapped = [];
54
108
  sessionEvents.forEach(function (item) {
@@ -145,12 +199,58 @@ var mapSessionMessages = function mapSessionMessages(sessionEvents) {
145
199
  });
146
200
  return mapped;
147
201
  };
202
+ var getComparableMessageContent = function getComparableMessageContent(messageItem) {
203
+ var _messageItem$text;
204
+ return JSON.stringify({
205
+ role: messageItem.role,
206
+ text: ((_messageItem$text = messageItem.text) === null || _messageItem$text === void 0 ? void 0 : _messageItem$text.replace(/\r\n/g, "\n").trim()) || "",
207
+ thought: Boolean(messageItem.thought),
208
+ inlineData: messageItem.inlineData || null,
209
+ fileData: messageItem.fileData || null,
210
+ functionCall: messageItem.functionCall || null,
211
+ functionResponse: messageItem.functionResponse || null,
212
+ executableCode: messageItem.executableCode || null,
213
+ codeExecutionResult: messageItem.codeExecutionResult || null
214
+ });
215
+ };
216
+ var isStreamMessageWithoutServerEventId = function isStreamMessageWithoutServerEventId(messageItem) {
217
+ var eventId = getMessageEventId(messageItem);
218
+ return Boolean(messageItem.invocationId) && (!eventId || eventId === messageItem.invocationId);
219
+ };
148
220
  var insertMissingSessionEvents = function insertMissingSessionEvents(currentMessages, sessionEvents) {
149
221
  var renderedEventIds = new Set(currentMessages.map(getMessageEventId).filter(Boolean));
222
+ var unmatchedStreamMessageIndexes = new Set(currentMessages.map(function (messageItem, index) {
223
+ return isStreamMessageWithoutServerEventId(messageItem) ? index : -1;
224
+ }).filter(function (index) {
225
+ return index >= 0;
226
+ }));
150
227
  var missingEvents = sessionEvents.filter(function (event) {
151
228
  var _event$content, _event$content2;
152
229
  var parts = (_event$content = event.content) === null || _event$content === void 0 ? void 0 : _event$content.parts;
153
- return Boolean(event.id) && ((_event$content2 = event.content) === null || _event$content2 === void 0 ? void 0 : _event$content2.role) === "model" && Array.isArray(parts) && parts.length > 0 && !renderedEventIds.has(event.id);
230
+ var canRender = Boolean(event.id) && ((_event$content2 = event.content) === null || _event$content2 === void 0 ? void 0 : _event$content2.role) === "model" && Array.isArray(parts) && parts.length > 0;
231
+ if (!canRender || renderedEventIds.has(event.id)) return false;
232
+
233
+ // 新版 SSE 包装数据没有事件 id,只能临时使用 invocationId。
234
+ // 用 invocationId + 完整渲染内容做一次性身份对齐,避免会话轮询重复插入;
235
+ // 同 invocation 下内容不同或后续出现的事件,仍然按独立 event.id 补入。
236
+ var eventMessages = mapSessionMessages([event]);
237
+ var matchedIndexes = [];
238
+ var isRenderedByStream = eventMessages.length > 0 && eventMessages.every(function (eventMessage) {
239
+ var comparableContent = getComparableMessageContent(eventMessage);
240
+ var matchedIndex = currentMessages.findIndex(function (currentMessage, index) {
241
+ return unmatchedStreamMessageIndexes.has(index) && !matchedIndexes.includes(index) && currentMessage.invocationId === eventMessage.invocationId && getComparableMessageContent(currentMessage) === comparableContent;
242
+ });
243
+ if (matchedIndex < 0) return false;
244
+ matchedIndexes.push(matchedIndex);
245
+ return true;
246
+ });
247
+ if (isRenderedByStream) {
248
+ matchedIndexes.forEach(function (index) {
249
+ return unmatchedStreamMessageIndexes.delete(index);
250
+ });
251
+ return false;
252
+ }
253
+ return true;
154
254
  });
155
255
  if (missingEvents.length === 0) return currentMessages;
156
256
  var missingMessages = mapSessionMessages(missingEvents);
@@ -159,10 +259,10 @@ var insertMissingSessionEvents = function insertMissingSessionEvents(currentMess
159
259
  return [event.id, index];
160
260
  }));
161
261
  var getMessageOrder = function getMessageOrder(messageItem) {
162
- var _messageItem$timestam, _messageItem$raw2;
262
+ var _messageItem$timestam, _messageItem$raw3;
163
263
  var eventId = getMessageEventId(messageItem);
164
264
  if (eventId && eventOrder.has(eventId)) return eventOrder.get(eventId);
165
- var timestamp = (_messageItem$timestam = messageItem.timestamp) !== null && _messageItem$timestam !== void 0 ? _messageItem$timestam : (_messageItem$raw2 = messageItem.raw) === null || _messageItem$raw2 === void 0 ? void 0 : _messageItem$raw2.timestamp;
265
+ var timestamp = (_messageItem$timestam = messageItem.timestamp) !== null && _messageItem$timestam !== void 0 ? _messageItem$timestam : (_messageItem$raw3 = messageItem.raw) === null || _messageItem$raw3 === void 0 ? void 0 : _messageItem$raw3.timestamp;
166
266
  if (timestamp !== undefined) {
167
267
  var nextEventIndex = sessionEvents.findIndex(function (event) {
168
268
  return (event.timestamp || 0) > timestamp;
@@ -186,22 +286,22 @@ var insertMissingSessionEvents = function insertMissingSessionEvents(currentMess
186
286
 
187
287
  // 后台会话连接状态
188
288
 
189
- function useADKChat(_ref) {
289
+ function useADKChat(_ref2) {
190
290
  var _config$session$pollS, _config$session, _config$session$sessi, _config$session2;
191
- var _ref$url = _ref.url,
192
- url = _ref$url === void 0 ? window.location.origin : _ref$url,
193
- token = _ref.token,
194
- _ref$config = _ref.config,
195
- config = _ref$config === void 0 ? {} : _ref$config,
196
- _ref$type = _ref.type,
197
- type = _ref$type === void 0 ? "agentDebug" : _ref$type,
198
- _ref$enabled = _ref.enabled,
199
- enabled = _ref$enabled === void 0 ? true : _ref$enabled,
200
- strategies = _ref.strategies,
201
- onError = _ref.onError,
202
- onMessage = _ref.onMessage,
203
- onSuccess = _ref.onSuccess,
204
- onStream = _ref.onStream;
291
+ var _ref2$url = _ref2.url,
292
+ url = _ref2$url === void 0 ? window.location.origin : _ref2$url,
293
+ token = _ref2.token,
294
+ _ref2$config = _ref2.config,
295
+ config = _ref2$config === void 0 ? {} : _ref2$config,
296
+ _ref2$type = _ref2.type,
297
+ type = _ref2$type === void 0 ? "agentDebug" : _ref2$type,
298
+ _ref2$enabled = _ref2.enabled,
299
+ enabled = _ref2$enabled === void 0 ? true : _ref2$enabled,
300
+ strategies = _ref2.strategies,
301
+ onError = _ref2.onError,
302
+ onMessage = _ref2.onMessage,
303
+ onSuccess = _ref2.onSuccess,
304
+ onStream = _ref2.onStream;
205
305
  var _useState = useState(false),
206
306
  _useState2 = _slicedToArray(_useState, 2),
207
307
  loading = _useState2[0],
@@ -220,9 +320,9 @@ function useADKChat(_ref) {
220
320
  var tokenRef = useRef(token);
221
321
  tokenRef.current = token;
222
322
  // 应用配置
223
- var _ref2 = config || {},
224
- appNo = _ref2.appNo,
225
- showFirstSession = _ref2.showFirstSession;
323
+ var _ref3 = config || {},
324
+ appNo = _ref3.appNo,
325
+ showFirstSession = _ref3.showFirstSession;
226
326
  var pollSessionEvents = (_config$session$pollS = config === null || config === void 0 || (_config$session = config.session) === null || _config$session === void 0 ? void 0 : _config$session.pollSessionEvents) !== null && _config$session$pollS !== void 0 ? _config$session$pollS : true;
227
327
  var sessionEventsPollingInterval = Math.max((_config$session$sessi = config === null || config === void 0 || (_config$session2 = config.session) === null || _config$session2 === void 0 ? void 0 : _config$session2.sessionEventsPollingInterval) !== null && _config$session$sessi !== void 0 ? _config$session$sessi : DEFAULT_SESSION_EVENTS_POLLING_INTERVAL, 1000);
228
328
  var _useState5 = useState(null),
@@ -284,13 +384,14 @@ function useADKChat(_ref) {
284
384
  currentSessionIdRef.current = currentSessionId;
285
385
  var mergedMessages = useMemo(function () {
286
386
  var fnResMap = {};
287
- messages.forEach(function (msg) {
387
+ var uniqueMessages = deduplicateMessages(messages);
388
+ uniqueMessages.forEach(function (msg) {
288
389
  if (msg.functionResponse) {
289
390
  var _msg$functionResponse;
290
391
  fnResMap[(msg === null || msg === void 0 || (_msg$functionResponse = msg.functionResponse) === null || _msg$functionResponse === void 0 ? void 0 : _msg$functionResponse.id) || ""] = msg.functionResponse;
291
392
  }
292
393
  });
293
- return messages.map(function (msg) {
394
+ return uniqueMessages.map(function (msg) {
294
395
  if (msg.functionCall) {
295
396
  var _msg$functionCall;
296
397
  return _objectSpread(_objectSpread({}, msg), {}, {
@@ -646,7 +747,7 @@ function useADKChat(_ref) {
646
747
  content: rawData.data,
647
748
  invocationId: rawData.result.invocationId,
648
749
  sessionId: rawData.result.sessionId,
649
- id: rawData.result.invocationId
750
+ id: rawData.data.id || rawData.result.id || rawData.result.eventId || rawData.result.invocationId
650
751
  });
651
752
  }
652
753
  if (chunkJson.error) {
@@ -796,12 +897,12 @@ function useADKChat(_ref) {
796
897
 
797
898
  // 发送会话
798
899
  var startChat = /*#__PURE__*/function () {
799
- var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref3) {
800
- var _ref3$text, text, _ref3$files, files, functionResponse;
900
+ var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref4) {
901
+ var _ref4$text, text, _ref4$files, files, functionResponse;
801
902
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
802
903
  while (1) switch (_context2.prev = _context2.next) {
803
904
  case 0:
804
- _ref3$text = _ref3.text, text = _ref3$text === void 0 ? "" : _ref3$text, _ref3$files = _ref3.files, files = _ref3$files === void 0 ? [] : _ref3$files, functionResponse = _ref3.functionResponse;
905
+ _ref4$text = _ref4.text, text = _ref4$text === void 0 ? "" : _ref4$text, _ref4$files = _ref4.files, files = _ref4$files === void 0 ? [] : _ref4$files, functionResponse = _ref4.functionResponse;
805
906
  if (!(loadingRef.current || sendingRef.current)) {
806
907
  _context2.next = 3;
807
908
  break;
@@ -893,13 +994,13 @@ function useADKChat(_ref) {
893
994
  }, _callee2, null, [[8,, 11, 14]]);
894
995
  }));
895
996
  return function startChat(_x) {
896
- return _ref4.apply(this, arguments);
997
+ return _ref5.apply(this, arguments);
897
998
  };
898
999
  }();
899
1000
 
900
1001
  // 重新发送会话
901
1002
  var reChat = /*#__PURE__*/function () {
902
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
1003
+ var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
903
1004
  var lastUserIndex, newMessages, lastUserMessage, _lastUserMessage$text, text, _lastUserMessage$file, fileData;
904
1005
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
905
1006
  while (1) switch (_context3.prev = _context3.next) {
@@ -967,7 +1068,7 @@ function useADKChat(_ref) {
967
1068
  }, _callee3, null, [[14,, 17, 20]]);
968
1069
  }));
969
1070
  return function reChat() {
970
- return _ref5.apply(this, arguments);
1071
+ return _ref6.apply(this, arguments);
971
1072
  };
972
1073
  }();
973
1074
 
@@ -1031,7 +1132,7 @@ function useADKChat(_ref) {
1031
1132
 
1032
1133
  // 设置当前会话详情
1033
1134
  var setCurrentSession = /*#__PURE__*/function () {
1034
- var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(sessionId) {
1135
+ var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(sessionId) {
1035
1136
  var prevSessionId, bg, _yield$fetchSessionDe, data, result, _appInfo$onboardingIn3, _appInfo$onboardingIn4;
1036
1137
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
1037
1138
  while (1) switch (_context4.prev = _context4.next) {
@@ -1132,13 +1233,13 @@ function useADKChat(_ref) {
1132
1233
  }, _callee4, null, [[21,, 28, 32]]);
1133
1234
  }));
1134
1235
  return function setCurrentSession(_x2) {
1135
- return _ref6.apply(this, arguments);
1236
+ return _ref7.apply(this, arguments);
1136
1237
  };
1137
1238
  }();
1138
1239
 
1139
1240
  // 获取聊天记录
1140
1241
  var initAppConversations = /*#__PURE__*/function () {
1141
- var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
1242
+ var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
1142
1243
  var fetchDetail,
1143
1244
  _yield$fetchSessionLi,
1144
1245
  _yield$fetchSessionLi2,
@@ -1242,13 +1343,13 @@ function useADKChat(_ref) {
1242
1343
  }, _callee5, null, [[1, 13, 16, 19]]);
1243
1344
  }));
1244
1345
  return function initAppConversations() {
1245
- return _ref7.apply(this, arguments);
1346
+ return _ref8.apply(this, arguments);
1246
1347
  };
1247
1348
  }();
1248
1349
 
1249
1350
  // 删除会话
1250
1351
  var deleteSession = /*#__PURE__*/function () {
1251
- var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(sessionId) {
1352
+ var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(sessionId) {
1252
1353
  var _yield$closeSession, result;
1253
1354
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
1254
1355
  while (1) switch (_context6.prev = _context6.next) {
@@ -1286,13 +1387,13 @@ function useADKChat(_ref) {
1286
1387
  }, _callee6);
1287
1388
  }));
1288
1389
  return function deleteSession(_x3) {
1289
- return _ref8.apply(this, arguments);
1390
+ return _ref9.apply(this, arguments);
1290
1391
  };
1291
1392
  }();
1292
1393
 
1293
1394
  // 点赞/点踩
1294
1395
  var likeMessage = /*#__PURE__*/function () {
1295
- var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(invocationId, isLike, feedbackData) {
1396
+ var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(invocationId, isLike, feedbackData) {
1296
1397
  var _yield$addFeedback, result;
1297
1398
  return _regeneratorRuntime().wrap(function _callee7$(_context7) {
1298
1399
  while (1) switch (_context7.prev = _context7.next) {
@@ -1335,13 +1436,13 @@ function useADKChat(_ref) {
1335
1436
  }, _callee7);
1336
1437
  }));
1337
1438
  return function likeMessage(_x4, _x5, _x6) {
1338
- return _ref9.apply(this, arguments);
1439
+ return _ref10.apply(this, arguments);
1339
1440
  };
1340
1441
  }();
1341
1442
 
1342
1443
  // 更新会话名称
1343
1444
  var updateSession = /*#__PURE__*/function () {
1344
- var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(sessionId, title) {
1445
+ var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(sessionId, title) {
1345
1446
  var _yield$updateSessionT, result;
1346
1447
  return _regeneratorRuntime().wrap(function _callee8$(_context8) {
1347
1448
  while (1) switch (_context8.prev = _context8.next) {
@@ -1376,13 +1477,13 @@ function useADKChat(_ref) {
1376
1477
  }, _callee8);
1377
1478
  }));
1378
1479
  return function updateSession(_x7, _x8) {
1379
- return _ref10.apply(this, arguments);
1480
+ return _ref11.apply(this, arguments);
1380
1481
  };
1381
1482
  }();
1382
1483
 
1383
1484
  // 初始化应用
1384
1485
  var initConfig = /*#__PURE__*/function () {
1385
- var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
1486
+ var _ref12 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
1386
1487
  var _yield$fetchAppConfig, data, result;
1387
1488
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
1388
1489
  while (1) switch (_context9.prev = _context9.next) {
@@ -1433,7 +1534,7 @@ function useADKChat(_ref) {
1433
1534
  }, _callee9, null, [[0, 10, 13, 16]]);
1434
1535
  }));
1435
1536
  return function initConfig() {
1436
- return _ref11.apply(this, arguments);
1537
+ return _ref12.apply(this, arguments);
1437
1538
  };
1438
1539
  }();
1439
1540
 
@@ -1459,7 +1560,7 @@ function useADKChat(_ref) {
1459
1560
  var requesting = false;
1460
1561
  var pollingSessionId = currentSessionId;
1461
1562
  var poll = /*#__PURE__*/function () {
1462
- var _ref12 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
1563
+ var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
1463
1564
  var _yield$fetchSessionDe2, data, result;
1464
1565
  return _regeneratorRuntime().wrap(function _callee10$(_context10) {
1465
1566
  while (1) switch (_context10.prev = _context10.next) {
@@ -1502,7 +1603,7 @@ function useADKChat(_ref) {
1502
1603
  }, _callee10, null, [[3, 12, 14, 17]]);
1503
1604
  }));
1504
1605
  return function poll() {
1505
- return _ref12.apply(this, arguments);
1606
+ return _ref13.apply(this, arguments);
1506
1607
  };
1507
1608
  }();
1508
1609
  void poll();