@ai-group/chat-sdk 3.6.3 → 3.6.4
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/dist/cjs/components/FileGallery/index.d.ts +0 -30
- package/dist/cjs/components/FileGallery/index.js +287 -209
- package/dist/cjs/components/FileGallery/index.js.map +2 -2
- package/dist/cjs/components/FileGallery/styles.d.ts +5 -0
- package/dist/cjs/components/FileGallery/styles.js +106 -0
- package/dist/cjs/components/FileGallery/styles.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.js +3 -2
- package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +1 -0
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.js +347 -156
- package/dist/cjs/hooks/useADKChat.js.map +3 -3
- package/dist/cjs/types/FileGallery.d.ts +41 -0
- package/dist/cjs/types/FileGallery.js.map +1 -1
- package/dist/cjs/types/XAdkProvider.d.ts +4 -0
- package/dist/cjs/types/XAdkProvider.js.map +1 -1
- package/dist/esm/components/FileGallery/index.d.ts +0 -30
- package/dist/esm/components/FileGallery/index.js +362 -364
- package/dist/esm/components/FileGallery/index.js.map +1 -1
- package/dist/esm/components/FileGallery/styles.d.ts +5 -0
- package/dist/esm/components/FileGallery/styles.js +10 -2
- package/dist/esm/components/FileGallery/styles.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Sender.js +5 -3
- package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +1 -0
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.js +300 -129
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/types/FileGallery.d.ts +41 -0
- package/dist/esm/types/FileGallery.js.map +1 -1
- package/dist/esm/types/XAdkProvider.d.ts +4 -0
- package/dist/esm/types/XAdkProvider.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
2
2
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
|
-
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
4
3
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
4
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
5
5
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
6
6
|
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
7
7
|
import { useEffect, useCallback, useMemo, useRef, useState } from "react";
|
|
@@ -44,10 +44,150 @@ var combineTextParts = function combineTextParts(parts) {
|
|
|
44
44
|
}
|
|
45
45
|
return result;
|
|
46
46
|
};
|
|
47
|
+
var DEFAULT_SESSION_EVENTS_POLLING_INTERVAL = 10000;
|
|
48
|
+
var getMessageEventId = function getMessageEventId(messageItem) {
|
|
49
|
+
var _messageItem$raw;
|
|
50
|
+
return messageItem.eventId || ((_messageItem$raw = messageItem.raw) === null || _messageItem$raw === void 0 ? void 0 : _messageItem$raw.id);
|
|
51
|
+
};
|
|
52
|
+
var mapSessionMessages = function mapSessionMessages(sessionEvents) {
|
|
53
|
+
var mapped = [];
|
|
54
|
+
sessionEvents.forEach(function (item) {
|
|
55
|
+
if (!item || !item.content || !Array.isArray(item.content.parts)) return;
|
|
56
|
+
// 后端为异步任务插入的用户事件仅用于关联任务,不在页面展示。
|
|
57
|
+
if (item.author === "user" && item.content.parts.some(function (part) {
|
|
58
|
+
return part.task;
|
|
59
|
+
})) return;
|
|
60
|
+
var role = (item.content.role || "").toLowerCase() === "user" ? "user" : "bot";
|
|
61
|
+
var parts = item.content.parts.filter(function (part) {
|
|
62
|
+
if (!part) return false;
|
|
63
|
+
return Boolean(part.text || part.inlineData || part.functionCall || part.functionResponse || part.fileData || part.executableCode || part.codeExecutionResult || part.errorMessage);
|
|
64
|
+
});
|
|
65
|
+
if (parts.length === 0) return;
|
|
66
|
+
var textParts = parts.filter(function (part) {
|
|
67
|
+
return part.text || part.errorMessage || part.inlineData;
|
|
68
|
+
});
|
|
69
|
+
var fileDataParts = parts.filter(function (part) {
|
|
70
|
+
return part.fileData;
|
|
71
|
+
});
|
|
72
|
+
var otherParts = parts.filter(function (part) {
|
|
73
|
+
return !part.text && !part.errorMessage && !part.inlineData && !part.fileData;
|
|
74
|
+
});
|
|
75
|
+
if (textParts.length > 0 || fileDataParts.length > 0) {
|
|
76
|
+
var messageItem = {
|
|
77
|
+
id: v4(),
|
|
78
|
+
author: item.author,
|
|
79
|
+
invocationId: item.invocationId,
|
|
80
|
+
eventId: item.id,
|
|
81
|
+
timestamp: item.timestamp,
|
|
82
|
+
isLike: item.isLike,
|
|
83
|
+
role: role,
|
|
84
|
+
modelCode: item.modelCode,
|
|
85
|
+
usageMetadata: item.usageMetadata,
|
|
86
|
+
finishReason: item.finishReason,
|
|
87
|
+
raw: item
|
|
88
|
+
};
|
|
89
|
+
textParts.forEach(function (part) {
|
|
90
|
+
if (part.inlineData) {
|
|
91
|
+
messageItem.inlineData = {
|
|
92
|
+
displayName: part.inlineData.displayName,
|
|
93
|
+
data: part.inlineData.data,
|
|
94
|
+
mimeType: part.inlineData.mimeType
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (part.text) {
|
|
98
|
+
messageItem.text = (messageItem.text ? "".concat(messageItem.text, "\n") : "") + part.text;
|
|
99
|
+
if (typeof part.thought !== "undefined") messageItem.thought = part.thought;
|
|
100
|
+
}
|
|
101
|
+
if (part.errorMessage) {
|
|
102
|
+
messageItem.text = (messageItem.text ? "".concat(messageItem.text, "\n") : "") + part.errorMessage;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
if (fileDataParts.length > 0) {
|
|
106
|
+
messageItem.fileData = fileDataParts.map(function (part) {
|
|
107
|
+
return {
|
|
108
|
+
displayName: part.fileData.displayName || "",
|
|
109
|
+
fileUri: part.fileData.fileUri,
|
|
110
|
+
mimeType: part.fileData.mimeType
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
mapped.push(messageItem);
|
|
115
|
+
}
|
|
116
|
+
otherParts.forEach(function (part) {
|
|
117
|
+
var messageItem = {
|
|
118
|
+
id: v4(),
|
|
119
|
+
author: item.author,
|
|
120
|
+
invocationId: item.invocationId,
|
|
121
|
+
eventId: item.id,
|
|
122
|
+
timestamp: item.timestamp,
|
|
123
|
+
isLike: item.isLike,
|
|
124
|
+
role: role,
|
|
125
|
+
modelCode: item.modelCode,
|
|
126
|
+
usageMetadata: item.usageMetadata,
|
|
127
|
+
finishReason: item.finishReason,
|
|
128
|
+
raw: item
|
|
129
|
+
};
|
|
130
|
+
if (part.functionCall) messageItem.functionCall = part.functionCall;
|
|
131
|
+
if (part.executableCode) messageItem.executableCode = part.executableCode;
|
|
132
|
+
if (part.codeExecutionResult) messageItem.codeExecutionResult = part.codeExecutionResult;
|
|
133
|
+
if (part.functionResponse) {
|
|
134
|
+
var functionCallMessage = mapped.find(function (currentMessage) {
|
|
135
|
+
var _currentMessage$funct, _part$functionRespons;
|
|
136
|
+
return ((_currentMessage$funct = currentMessage.functionCall) === null || _currentMessage$funct === void 0 ? void 0 : _currentMessage$funct.id) === ((_part$functionRespons = part.functionResponse) === null || _part$functionRespons === void 0 ? void 0 : _part$functionRespons.id);
|
|
137
|
+
});
|
|
138
|
+
if (functionCallMessage) {
|
|
139
|
+
functionCallMessage.functionResponse = part.functionResponse;
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
mapped.push(messageItem);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
return mapped;
|
|
147
|
+
};
|
|
148
|
+
var insertMissingSessionEvents = function insertMissingSessionEvents(currentMessages, sessionEvents) {
|
|
149
|
+
var renderedEventIds = new Set(currentMessages.map(getMessageEventId).filter(Boolean));
|
|
150
|
+
var missingEvents = sessionEvents.filter(function (event) {
|
|
151
|
+
var _event$content, _event$content2;
|
|
152
|
+
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);
|
|
154
|
+
});
|
|
155
|
+
if (missingEvents.length === 0) return currentMessages;
|
|
156
|
+
var missingMessages = mapSessionMessages(missingEvents);
|
|
157
|
+
if (missingMessages.length === 0) return currentMessages;
|
|
158
|
+
var eventOrder = new Map(sessionEvents.map(function (event, index) {
|
|
159
|
+
return [event.id, index];
|
|
160
|
+
}));
|
|
161
|
+
var getMessageOrder = function getMessageOrder(messageItem) {
|
|
162
|
+
var _messageItem$timestam, _messageItem$raw2;
|
|
163
|
+
var eventId = getMessageEventId(messageItem);
|
|
164
|
+
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;
|
|
166
|
+
if (timestamp !== undefined) {
|
|
167
|
+
var nextEventIndex = sessionEvents.findIndex(function (event) {
|
|
168
|
+
return (event.timestamp || 0) > timestamp;
|
|
169
|
+
});
|
|
170
|
+
return nextEventIndex < 0 ? sessionEvents.length + 0.5 : nextEventIndex - 0.5;
|
|
171
|
+
}
|
|
172
|
+
return Number.POSITIVE_INFINITY;
|
|
173
|
+
};
|
|
174
|
+
var nextMessages = _toConsumableArray(currentMessages);
|
|
175
|
+
missingMessages.forEach(function (messageItem) {
|
|
176
|
+
var targetOrder = getMessageOrder(messageItem);
|
|
177
|
+
var insertIndex = nextMessages.findIndex(function (currentMessage) {
|
|
178
|
+
var currentOrder = getMessageOrder(currentMessage);
|
|
179
|
+
return Number.isFinite(currentOrder) && currentOrder > targetOrder;
|
|
180
|
+
});
|
|
181
|
+
if (insertIndex < 0) insertIndex = nextMessages.length;
|
|
182
|
+
nextMessages.splice(insertIndex, 0, messageItem);
|
|
183
|
+
});
|
|
184
|
+
return nextMessages;
|
|
185
|
+
};
|
|
47
186
|
|
|
48
187
|
// 后台会话连接状态
|
|
49
188
|
|
|
50
189
|
function useADKChat(_ref) {
|
|
190
|
+
var _config$session$pollS, _config$session, _config$session$sessi, _config$session2;
|
|
51
191
|
var _ref$url = _ref.url,
|
|
52
192
|
url = _ref$url === void 0 ? window.location.origin : _ref$url,
|
|
53
193
|
token = _ref.token,
|
|
@@ -65,7 +205,12 @@ function useADKChat(_ref) {
|
|
|
65
205
|
var _useState = useState(false),
|
|
66
206
|
_useState2 = _slicedToArray(_useState, 2),
|
|
67
207
|
loading = _useState2[0],
|
|
68
|
-
|
|
208
|
+
setLoadingState = _useState2[1];
|
|
209
|
+
var loadingRef = useRef(false);
|
|
210
|
+
var setLoading = useCallback(function (nextLoading) {
|
|
211
|
+
loadingRef.current = nextLoading;
|
|
212
|
+
setLoadingState(nextLoading);
|
|
213
|
+
}, []);
|
|
69
214
|
var _useState3 = useState(false),
|
|
70
215
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
71
216
|
sessionLoading = _useState4[0],
|
|
@@ -78,6 +223,8 @@ function useADKChat(_ref) {
|
|
|
78
223
|
var _ref2 = config || {},
|
|
79
224
|
appNo = _ref2.appNo,
|
|
80
225
|
showFirstSession = _ref2.showFirstSession;
|
|
226
|
+
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
|
+
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);
|
|
81
228
|
var _useState5 = useState(null),
|
|
82
229
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
83
230
|
appInfo = _useState6[0],
|
|
@@ -122,6 +269,10 @@ function useADKChat(_ref) {
|
|
|
122
269
|
_useState20 = _slicedToArray(_useState19, 2),
|
|
123
270
|
messages = _useState20[0],
|
|
124
271
|
setMessages = _useState20[1];
|
|
272
|
+
var pendingSessionEventsRef = useRef(null);
|
|
273
|
+
var sessionEventsFlushTimerRef = useRef(null);
|
|
274
|
+
var sessionEventsSyncingRef = useRef(false);
|
|
275
|
+
var sessionDetailLoadingRef = useRef(false);
|
|
125
276
|
// 用户自定义业务参数 (stateDelta),每次发送请求时携带
|
|
126
277
|
var stateDeltaRef = useRef(undefined);
|
|
127
278
|
|
|
@@ -151,6 +302,52 @@ function useADKChat(_ref) {
|
|
|
151
302
|
}, [messages]);
|
|
152
303
|
var textMsgRef = useRef(null);
|
|
153
304
|
var eventDataRef = useRef(new Map());
|
|
305
|
+
var cancelSessionEventsFlush = useCallback(function () {
|
|
306
|
+
if (sessionEventsFlushTimerRef.current === null) return;
|
|
307
|
+
clearTimeout(sessionEventsFlushTimerRef.current);
|
|
308
|
+
sessionEventsFlushTimerRef.current = null;
|
|
309
|
+
}, []);
|
|
310
|
+
var flushPendingSessionEvents = useCallback(function () {
|
|
311
|
+
var pending = pendingSessionEventsRef.current;
|
|
312
|
+
var replyInProgress = loadingRef.current || sendingRef.current || textMsgRef.current !== null;
|
|
313
|
+
if (!pending || replyInProgress || pending.sessionId !== currentSessionIdRef.current) return;
|
|
314
|
+
var previewMessages = insertMissingSessionEvents(messagesRef.current, pending.events);
|
|
315
|
+
pendingSessionEventsRef.current = null;
|
|
316
|
+
if (previewMessages === messagesRef.current) return;
|
|
317
|
+
sessionEventsSyncingRef.current = true;
|
|
318
|
+
setLoading(true);
|
|
319
|
+
sessionEventsFlushTimerRef.current = setTimeout(function () {
|
|
320
|
+
sessionEventsFlushTimerRef.current = null;
|
|
321
|
+
if (pending.sessionId === currentSessionIdRef.current) {
|
|
322
|
+
setMessages(function (prev) {
|
|
323
|
+
var nextMessages = insertMissingSessionEvents(prev, pending.events);
|
|
324
|
+
messagesRef.current = nextMessages;
|
|
325
|
+
return nextMessages;
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
sessionEventsSyncingRef.current = false;
|
|
329
|
+
setLoading(false);
|
|
330
|
+
}, 0);
|
|
331
|
+
}, [setLoading]);
|
|
332
|
+
var syncSessionEvents = useCallback(function (events, targetSessionId) {
|
|
333
|
+
if (targetSessionId !== currentSessionIdRef.current) return;
|
|
334
|
+
pendingSessionEventsRef.current = {
|
|
335
|
+
sessionId: targetSessionId,
|
|
336
|
+
events: events
|
|
337
|
+
};
|
|
338
|
+
flushPendingSessionEvents();
|
|
339
|
+
}, [flushPendingSessionEvents]);
|
|
340
|
+
useEffect(function () {
|
|
341
|
+
pendingSessionEventsRef.current = null;
|
|
342
|
+
cancelSessionEventsFlush();
|
|
343
|
+
if (sessionEventsSyncingRef.current) {
|
|
344
|
+
sessionEventsSyncingRef.current = false;
|
|
345
|
+
setLoading(false);
|
|
346
|
+
}
|
|
347
|
+
}, [cancelSessionEventsFlush, currentSessionId, setLoading]);
|
|
348
|
+
useEffect(function () {
|
|
349
|
+
if (!loading) flushPendingSessionEvents();
|
|
350
|
+
}, [flushPendingSessionEvents, loading]);
|
|
154
351
|
|
|
155
352
|
// 插入消息
|
|
156
353
|
var insertMessage = useCallback(function (msg) {
|
|
@@ -345,9 +542,9 @@ function useADKChat(_ref) {
|
|
|
345
542
|
|
|
346
543
|
// 处理建议类消息
|
|
347
544
|
var processFollowupPart = useCallback(function (event) {
|
|
348
|
-
var _event$
|
|
545
|
+
var _event$content3;
|
|
349
546
|
// 获取建议类消息的文本内容
|
|
350
|
-
var part = (event === null || event === void 0 || (_event$
|
|
547
|
+
var part = (event === null || event === void 0 || (_event$content3 = event.content) === null || _event$content3 === void 0 || (_event$content3 = _event$content3.parts) === null || _event$content3 === void 0 ? void 0 : _event$content3[0]) || null;
|
|
351
548
|
var text = (part === null || part === void 0 ? void 0 : part.text) || "";
|
|
352
549
|
storeEvents(part, event);
|
|
353
550
|
if (text) {
|
|
@@ -605,7 +802,7 @@ function useADKChat(_ref) {
|
|
|
605
802
|
while (1) switch (_context2.prev = _context2.next) {
|
|
606
803
|
case 0:
|
|
607
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;
|
|
608
|
-
if (!(
|
|
805
|
+
if (!(loadingRef.current || sendingRef.current)) {
|
|
609
806
|
_context2.next = 3;
|
|
610
807
|
break;
|
|
611
808
|
}
|
|
@@ -707,7 +904,7 @@ function useADKChat(_ref) {
|
|
|
707
904
|
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
708
905
|
while (1) switch (_context3.prev = _context3.next) {
|
|
709
906
|
case 0:
|
|
710
|
-
if (!(
|
|
907
|
+
if (!(loadingRef.current || sendingRef.current)) {
|
|
711
908
|
_context3.next = 2;
|
|
712
909
|
break;
|
|
713
910
|
}
|
|
@@ -791,7 +988,7 @@ function useADKChat(_ref) {
|
|
|
791
988
|
|
|
792
989
|
// 使用建议问题
|
|
793
990
|
var suggestChat = function suggestChat(text) {
|
|
794
|
-
if (
|
|
991
|
+
if (loadingRef.current) return;
|
|
795
992
|
if (!text.trim()) return;
|
|
796
993
|
setSuggestedQuestions([]);
|
|
797
994
|
startChat({
|
|
@@ -802,11 +999,14 @@ function useADKChat(_ref) {
|
|
|
802
999
|
// 停止会话(只中断前台连接)
|
|
803
1000
|
var stopChat = useCallback(function () {
|
|
804
1001
|
var _ctrl$current;
|
|
1002
|
+
pendingSessionEventsRef.current = null;
|
|
1003
|
+
cancelSessionEventsFlush();
|
|
1004
|
+
sessionEventsSyncingRef.current = false;
|
|
805
1005
|
(_ctrl$current = ctrl.current) === null || _ctrl$current === void 0 || _ctrl$current.abort();
|
|
806
1006
|
ctrl.current = null;
|
|
807
1007
|
setLoading(false);
|
|
808
1008
|
textMsgRef.current = null;
|
|
809
|
-
}, []);
|
|
1009
|
+
}, [cancelSessionEventsFlush, setLoading]);
|
|
810
1010
|
|
|
811
1011
|
// 清除/重置会话
|
|
812
1012
|
var clearChat = function clearChat() {
|
|
@@ -821,118 +1021,13 @@ function useADKChat(_ref) {
|
|
|
821
1021
|
};
|
|
822
1022
|
|
|
823
1023
|
// 格式化会话记录
|
|
824
|
-
var formatMessages = function
|
|
1024
|
+
var formatMessages = useCallback(function (sessionEvents) {
|
|
825
1025
|
var isReplace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
826
|
-
var mapped =
|
|
827
|
-
messages.forEach(function (item) {
|
|
828
|
-
if (!item || !item.content || !Array.isArray(item.content.parts)) return;
|
|
829
|
-
var role = (item.content.role || "").toLowerCase() === "user" ? "user" : "bot";
|
|
830
|
-
var parts = Array.isArray(item.content.parts) ? item.content.parts.filter(function (p) {
|
|
831
|
-
if (!p) return false;
|
|
832
|
-
return Boolean(p.text || p.inlineData || p.functionCall || p.functionResponse || p.fileData || p.executableCode || p.codeExecutionResult || p.errorMessage);
|
|
833
|
-
}) : [];
|
|
834
|
-
if (parts.length === 0) return;
|
|
835
|
-
|
|
836
|
-
// 将同一条历史消息的 text/fileData parts 合并到一条 IMessage,避免拆分显示
|
|
837
|
-
var textParts = parts.filter(function (p) {
|
|
838
|
-
return p.text || p.errorMessage || p.inlineData;
|
|
839
|
-
});
|
|
840
|
-
var fileDataParts = parts.filter(function (p) {
|
|
841
|
-
return p.fileData;
|
|
842
|
-
});
|
|
843
|
-
var otherParts = parts.filter(function (p) {
|
|
844
|
-
return !p.text && !p.errorMessage && !p.inlineData && !p.fileData;
|
|
845
|
-
});
|
|
846
|
-
|
|
847
|
-
// 如果有 text/fileData,合并为一条消息
|
|
848
|
-
if (textParts.length > 0 || fileDataParts.length > 0) {
|
|
849
|
-
var msg = {
|
|
850
|
-
id: v4(),
|
|
851
|
-
author: item.author,
|
|
852
|
-
invocationId: item.invocationId,
|
|
853
|
-
eventId: item.id,
|
|
854
|
-
timestamp: item.timestamp,
|
|
855
|
-
isLike: item.isLike,
|
|
856
|
-
role: role,
|
|
857
|
-
modelCode: item.modelCode,
|
|
858
|
-
usageMetadata: item.usageMetadata,
|
|
859
|
-
finishReason: item.finishReason,
|
|
860
|
-
raw: item
|
|
861
|
-
};
|
|
862
|
-
var _iterator4 = _createForOfIteratorHelper(textParts),
|
|
863
|
-
_step4;
|
|
864
|
-
try {
|
|
865
|
-
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
866
|
-
var part = _step4.value;
|
|
867
|
-
if (part.inlineData) {
|
|
868
|
-
msg.inlineData = {
|
|
869
|
-
displayName: part.inlineData.displayName,
|
|
870
|
-
data: part.inlineData.data,
|
|
871
|
-
mimeType: part.inlineData.mimeType
|
|
872
|
-
};
|
|
873
|
-
}
|
|
874
|
-
if (part.text) {
|
|
875
|
-
msg.text = (msg.text ? msg.text + "\n" : "") + part.text;
|
|
876
|
-
if (typeof part.thought !== "undefined") msg.thought = part.thought;
|
|
877
|
-
}
|
|
878
|
-
if (part.errorMessage) {
|
|
879
|
-
msg.text = (msg.text ? msg.text + "\n" : "") + part.errorMessage;
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
} catch (err) {
|
|
883
|
-
_iterator4.e(err);
|
|
884
|
-
} finally {
|
|
885
|
-
_iterator4.f();
|
|
886
|
-
}
|
|
887
|
-
if (fileDataParts.length > 0) {
|
|
888
|
-
msg.fileData = fileDataParts.map(function (part) {
|
|
889
|
-
return {
|
|
890
|
-
displayName: part.fileData.displayName || "",
|
|
891
|
-
fileUri: part.fileData.fileUri,
|
|
892
|
-
mimeType: part.fileData.mimeType
|
|
893
|
-
};
|
|
894
|
-
});
|
|
895
|
-
}
|
|
896
|
-
mapped.push(msg);
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
// 处理其他类型的 parts(functionCall、executableCode 等)
|
|
900
|
-
otherParts.forEach(function (part) {
|
|
901
|
-
var msg = {
|
|
902
|
-
id: v4(),
|
|
903
|
-
author: item.author,
|
|
904
|
-
invocationId: item.invocationId,
|
|
905
|
-
eventId: item.id,
|
|
906
|
-
timestamp: item.timestamp,
|
|
907
|
-
isLike: item.isLike,
|
|
908
|
-
role: role,
|
|
909
|
-
modelCode: item.modelCode,
|
|
910
|
-
usageMetadata: item.usageMetadata,
|
|
911
|
-
finishReason: item.finishReason,
|
|
912
|
-
raw: item
|
|
913
|
-
};
|
|
914
|
-
if (part.functionCall) msg.functionCall = part.functionCall;
|
|
915
|
-
if (part.executableCode) msg.executableCode = part.executableCode;
|
|
916
|
-
if (part.codeExecutionResult) msg.codeExecutionResult = part.codeExecutionResult;
|
|
917
|
-
// 补全函数调用结果
|
|
918
|
-
if (part.functionResponse) {
|
|
919
|
-
// 通过 functionCall.id 寻找对应的函数调用消息,在那条消息上添加functionResponse
|
|
920
|
-
var functionCallMsg = mapped.find(function (msg) {
|
|
921
|
-
var _msg$functionCall2, _part$functionRespons;
|
|
922
|
-
return ((_msg$functionCall2 = msg.functionCall) === null || _msg$functionCall2 === void 0 ? void 0 : _msg$functionCall2.id) === ((_part$functionRespons = part.functionResponse) === null || _part$functionRespons === void 0 ? void 0 : _part$functionRespons.id);
|
|
923
|
-
});
|
|
924
|
-
if (functionCallMsg) {
|
|
925
|
-
functionCallMsg.functionResponse = part.functionResponse;
|
|
926
|
-
}
|
|
927
|
-
return;
|
|
928
|
-
}
|
|
929
|
-
mapped.push(msg);
|
|
930
|
-
});
|
|
931
|
-
});
|
|
1026
|
+
var mapped = mapSessionMessages(sessionEvents);
|
|
932
1027
|
setMessages(function (prev) {
|
|
933
|
-
return isReplace ? mapped : [].concat(_toConsumableArray(prev), mapped);
|
|
1028
|
+
return isReplace ? mapped : [].concat(_toConsumableArray(prev), _toConsumableArray(mapped));
|
|
934
1029
|
});
|
|
935
|
-
};
|
|
1030
|
+
}, []);
|
|
936
1031
|
|
|
937
1032
|
// 设置当前会话详情
|
|
938
1033
|
var setCurrentSession = /*#__PURE__*/function () {
|
|
@@ -942,7 +1037,7 @@ function useADKChat(_ref) {
|
|
|
942
1037
|
while (1) switch (_context4.prev = _context4.next) {
|
|
943
1038
|
case 0:
|
|
944
1039
|
if (!sessionId) {
|
|
945
|
-
_context4.next =
|
|
1040
|
+
_context4.next = 34;
|
|
946
1041
|
break;
|
|
947
1042
|
}
|
|
948
1043
|
if (!(sessionId === currentSessionId)) {
|
|
@@ -951,6 +1046,13 @@ function useADKChat(_ref) {
|
|
|
951
1046
|
}
|
|
952
1047
|
return _context4.abrupt("return");
|
|
953
1048
|
case 3:
|
|
1049
|
+
pendingSessionEventsRef.current = null;
|
|
1050
|
+
cancelSessionEventsFlush();
|
|
1051
|
+
if (sessionEventsSyncingRef.current) {
|
|
1052
|
+
sessionEventsSyncingRef.current = false;
|
|
1053
|
+
setLoading(false);
|
|
1054
|
+
}
|
|
1055
|
+
|
|
954
1056
|
// 1. 将当前会话挂起到后台(不中断 SSE 连接)
|
|
955
1057
|
prevSessionId = currentSessionId;
|
|
956
1058
|
if (ctrl.current) {
|
|
@@ -977,7 +1079,7 @@ function useADKChat(_ref) {
|
|
|
977
1079
|
// 2. 尝试从后台恢复目标会话
|
|
978
1080
|
bg = backgroundRef.current.get(sessionId);
|
|
979
1081
|
if (!bg) {
|
|
980
|
-
_context4.next =
|
|
1082
|
+
_context4.next = 18;
|
|
981
1083
|
break;
|
|
982
1084
|
}
|
|
983
1085
|
setMessages(bg.messages);
|
|
@@ -988,18 +1090,20 @@ function useADKChat(_ref) {
|
|
|
988
1090
|
setInitialized(true);
|
|
989
1091
|
backgroundRef.current.delete(sessionId);
|
|
990
1092
|
return _context4.abrupt("return");
|
|
991
|
-
case
|
|
1093
|
+
case 18:
|
|
992
1094
|
// 3. 后台没有目标 session,走 API 加载(原有逻辑)
|
|
993
1095
|
setInitialized(false);
|
|
994
1096
|
setCurrentSessionId(sessionId);
|
|
995
|
-
|
|
1097
|
+
sessionDetailLoadingRef.current = true;
|
|
1098
|
+
_context4.prev = 21;
|
|
1099
|
+
_context4.next = 24;
|
|
996
1100
|
return fetchSessionDetail({
|
|
997
1101
|
url: url,
|
|
998
1102
|
appNo: appNo,
|
|
999
1103
|
sessionId: sessionId,
|
|
1000
1104
|
token: tokenRef.current
|
|
1001
1105
|
});
|
|
1002
|
-
case
|
|
1106
|
+
case 24:
|
|
1003
1107
|
_yield$fetchSessionDe = _context4.sent;
|
|
1004
1108
|
data = _yield$fetchSessionDe.data;
|
|
1005
1109
|
result = _yield$fetchSessionDe.result;
|
|
@@ -1011,16 +1115,21 @@ function useADKChat(_ref) {
|
|
|
1011
1115
|
setSuggestedQuestions((appInfo === null || appInfo === void 0 || (_appInfo$onboardingIn4 = appInfo.onboardingInfo) === null || _appInfo$onboardingIn4 === void 0 ? void 0 : _appInfo$onboardingIn4.suggested_questions) || []);
|
|
1012
1116
|
}
|
|
1013
1117
|
}
|
|
1118
|
+
case 28:
|
|
1119
|
+
_context4.prev = 28;
|
|
1120
|
+
sessionDetailLoadingRef.current = false;
|
|
1014
1121
|
setInitialized(true);
|
|
1015
|
-
_context4.
|
|
1122
|
+
return _context4.finish(28);
|
|
1123
|
+
case 32:
|
|
1124
|
+
_context4.next = 35;
|
|
1016
1125
|
break;
|
|
1017
|
-
case
|
|
1126
|
+
case 34:
|
|
1018
1127
|
setCurrentSessionId(v4());
|
|
1019
|
-
case
|
|
1128
|
+
case 35:
|
|
1020
1129
|
case "end":
|
|
1021
1130
|
return _context4.stop();
|
|
1022
1131
|
}
|
|
1023
|
-
}, _callee4);
|
|
1132
|
+
}, _callee4, null, [[21,, 28, 32]]);
|
|
1024
1133
|
}));
|
|
1025
1134
|
return function setCurrentSession(_x2) {
|
|
1026
1135
|
return _ref6.apply(this, arguments);
|
|
@@ -1104,7 +1213,7 @@ function useADKChat(_ref) {
|
|
|
1104
1213
|
} else {
|
|
1105
1214
|
// 服务端业务错误,透传原始 code + message 给接入方自行处理
|
|
1106
1215
|
onError === null || onError === void 0 || onError({
|
|
1107
|
-
code: (result === null || result === void 0 ? void 0 : result.code) ||
|
|
1216
|
+
code: (result === null || result === void 0 ? void 0 : result.code) || "UNKNOWN_ERROR",
|
|
1108
1217
|
message: (result === null || result === void 0 ? void 0 : result.message) || "获取会话列表失败",
|
|
1109
1218
|
raw: result
|
|
1110
1219
|
});
|
|
@@ -1299,7 +1408,7 @@ function useADKChat(_ref) {
|
|
|
1299
1408
|
} else {
|
|
1300
1409
|
// 服务端业务错误,透传原始 code + message
|
|
1301
1410
|
onError === null || onError === void 0 || onError({
|
|
1302
|
-
code: result.code ||
|
|
1411
|
+
code: result.code || "UNKNOWN_ERROR",
|
|
1303
1412
|
message: result.message || "获取应用配置失败",
|
|
1304
1413
|
raw: result
|
|
1305
1414
|
});
|
|
@@ -1343,10 +1452,72 @@ function useADKChat(_ref) {
|
|
|
1343
1452
|
}
|
|
1344
1453
|
}, [appInfo]);
|
|
1345
1454
|
|
|
1455
|
+
// 轮询当前会话详情,空闲时补入后端异步任务产生的模型消息。
|
|
1456
|
+
useEffect(function () {
|
|
1457
|
+
if (!enabled || !initialized || !pollSessionEvents || !appNo || !currentSessionId) return;
|
|
1458
|
+
var disposed = false;
|
|
1459
|
+
var requesting = false;
|
|
1460
|
+
var pollingSessionId = currentSessionId;
|
|
1461
|
+
var poll = /*#__PURE__*/function () {
|
|
1462
|
+
var _ref12 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
|
|
1463
|
+
var _yield$fetchSessionDe2, data, result;
|
|
1464
|
+
return _regeneratorRuntime().wrap(function _callee10$(_context10) {
|
|
1465
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
1466
|
+
case 0:
|
|
1467
|
+
if (!(requesting || sessionDetailLoadingRef.current)) {
|
|
1468
|
+
_context10.next = 2;
|
|
1469
|
+
break;
|
|
1470
|
+
}
|
|
1471
|
+
return _context10.abrupt("return");
|
|
1472
|
+
case 2:
|
|
1473
|
+
requesting = true;
|
|
1474
|
+
_context10.prev = 3;
|
|
1475
|
+
_context10.next = 6;
|
|
1476
|
+
return fetchSessionDetail({
|
|
1477
|
+
url: url,
|
|
1478
|
+
appNo: appNo,
|
|
1479
|
+
sessionId: pollingSessionId,
|
|
1480
|
+
token: tokenRef.current
|
|
1481
|
+
});
|
|
1482
|
+
case 6:
|
|
1483
|
+
_yield$fetchSessionDe2 = _context10.sent;
|
|
1484
|
+
data = _yield$fetchSessionDe2.data;
|
|
1485
|
+
result = _yield$fetchSessionDe2.result;
|
|
1486
|
+
if (!disposed && (result === null || result === void 0 ? void 0 : result.code) === API_SUCCESS_CODE && Array.isArray(data)) {
|
|
1487
|
+
syncSessionEvents(data, pollingSessionId);
|
|
1488
|
+
}
|
|
1489
|
+
_context10.next = 14;
|
|
1490
|
+
break;
|
|
1491
|
+
case 12:
|
|
1492
|
+
_context10.prev = 12;
|
|
1493
|
+
_context10.t0 = _context10["catch"](3);
|
|
1494
|
+
case 14:
|
|
1495
|
+
_context10.prev = 14;
|
|
1496
|
+
requesting = false;
|
|
1497
|
+
return _context10.finish(14);
|
|
1498
|
+
case 17:
|
|
1499
|
+
case "end":
|
|
1500
|
+
return _context10.stop();
|
|
1501
|
+
}
|
|
1502
|
+
}, _callee10, null, [[3, 12, 14, 17]]);
|
|
1503
|
+
}));
|
|
1504
|
+
return function poll() {
|
|
1505
|
+
return _ref12.apply(this, arguments);
|
|
1506
|
+
};
|
|
1507
|
+
}();
|
|
1508
|
+
void poll();
|
|
1509
|
+
var timer = window.setInterval(poll, sessionEventsPollingInterval);
|
|
1510
|
+
return function () {
|
|
1511
|
+
disposed = true;
|
|
1512
|
+
window.clearInterval(timer);
|
|
1513
|
+
};
|
|
1514
|
+
}, [appNo, currentSessionId, enabled, initialized, pollSessionEvents, sessionEventsPollingInterval, syncSessionEvents, url]);
|
|
1515
|
+
|
|
1346
1516
|
// 组件卸载时清理所有连接(前台 + 后台)
|
|
1347
1517
|
useEffect(function () {
|
|
1348
1518
|
return function () {
|
|
1349
1519
|
var _ctrl$current2;
|
|
1520
|
+
cancelSessionEventsFlush();
|
|
1350
1521
|
(_ctrl$current2 = ctrl.current) === null || _ctrl$current2 === void 0 || _ctrl$current2.abort();
|
|
1351
1522
|
backgroundRef.current.forEach(function (bg) {
|
|
1352
1523
|
var _bg$ctrl;
|
|
@@ -1354,7 +1525,7 @@ function useADKChat(_ref) {
|
|
|
1354
1525
|
});
|
|
1355
1526
|
backgroundRef.current.clear();
|
|
1356
1527
|
};
|
|
1357
|
-
}, []);
|
|
1528
|
+
}, [cancelSessionEventsFlush]);
|
|
1358
1529
|
return {
|
|
1359
1530
|
appInfo: appInfo,
|
|
1360
1531
|
startChat: startChat,
|