@myun/gimi-chat 0.9.44 → 0.9.46

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 (52) hide show
  1. package/dist/apis/useApi.d.ts +6 -0
  2. package/dist/apis/useApi.js +45 -1
  3. package/dist/components/ai-chat-dialogue/index copy.js +1 -1
  4. package/dist/components/ai-chat-dialogue/index.js +4 -2
  5. package/dist/components/answer-item/component/artifacts/index.d.ts +13 -0
  6. package/dist/components/answer-item/component/artifacts/index.js +52 -0
  7. package/dist/components/answer-item/component/artifacts/index.module.css +24 -0
  8. package/dist/components/answer-item/component/tool-list/index.d.ts +7 -0
  9. package/dist/components/answer-item/component/tool-list/index.js +97 -0
  10. package/dist/components/answer-item/component/tool-list/index.module.css +92 -0
  11. package/dist/components/answer-item/index.d.ts +2 -1
  12. package/dist/components/answer-item/index.js +160 -7
  13. package/dist/components/answer-item/index.module.css +24 -0
  14. package/dist/components/ask-card/index.d.ts +1 -1
  15. package/dist/components/chat-input/extension/index.d.ts +1 -0
  16. package/dist/components/chat-input/extension/index.js +2 -1
  17. package/dist/components/chat-input/extension/skill/MentionList.d.ts +30 -0
  18. package/dist/components/chat-input/extension/skill/MentionList.js +181 -0
  19. package/dist/components/chat-input/extension/skill/ReferSlot.d.ts +3 -0
  20. package/dist/components/chat-input/extension/skill/ReferSlot.js +100 -0
  21. package/dist/components/chat-input/extension/skill/data.d.ts +10 -0
  22. package/dist/components/chat-input/extension/skill/data.js +49 -0
  23. package/dist/components/chat-input/extension/skill/index.d.ts +7 -0
  24. package/dist/components/chat-input/extension/skill/index.js +5 -0
  25. package/dist/components/chat-input/extension/skill/index.less +100 -0
  26. package/dist/components/chat-input/extension/skill/suggestion.d.ts +14 -0
  27. package/dist/components/chat-input/extension/skill/suggestion.js +173 -0
  28. package/dist/components/chat-input/index.js +64 -16
  29. package/dist/components/file-card/index.js +2 -1
  30. package/dist/components/file-card/index.module.css +1 -0
  31. package/dist/components/knowledge-trace/tryWatch.js +8 -1
  32. package/dist/components/message-list/index.js +15 -3
  33. package/dist/components/message-list/index.module.css +3 -0
  34. package/dist/components/message-list/skill-tag/index.d.ts +5 -0
  35. package/dist/components/message-list/skill-tag/index.js +24 -0
  36. package/dist/components/message-list/skill-tag/index.module.css +22 -0
  37. package/dist/components/templates/CommonChat.js +3 -1
  38. package/dist/hooks/useChatActions.d.ts +2 -1
  39. package/dist/hooks/useChatActions.js +41 -3
  40. package/dist/hooks/useChatStream.d.ts +6 -1
  41. package/dist/hooks/useChatStream.js +96 -5
  42. package/dist/hooks/useCommonChatAPI.d.ts +1 -1
  43. package/dist/hooks/useCommonChatAPI.js +190 -54
  44. package/dist/i18n/locales/en-US.d.ts +3 -0
  45. package/dist/i18n/locales/en-US.js +10 -7
  46. package/dist/i18n/locales/zh-CN.d.ts +3 -0
  47. package/dist/i18n/locales/zh-CN.js +4 -1
  48. package/dist/interfaces/chatMessage.d.ts +38 -0
  49. package/dist/umd/index.min.js +1 -1
  50. package/dist/utils/tools.d.ts +6 -0
  51. package/dist/utils/tools.js +31 -0
  52. package/package.json +3 -2
@@ -24,6 +24,8 @@ import { FileStatus } from "../../interfaces/fileInterface";
24
24
  import useChatActions from "../../hooks/useChatActions";
25
25
  import CopyButton from "../message-actions/CopyButton";
26
26
  import { Virtuoso } from 'react-virtuoso';
27
+ import { MMarkdown } from '@myun/gimi-design';
28
+ import SkillTag from "./skill-tag";
27
29
  var MessageItem = /*#__PURE__*/React.memo(function (props) {
28
30
  var _v$quoteTeachModelLis, _v$quoteProductList, _v$messageFilesList;
29
31
  var v = props.v,
@@ -41,6 +43,7 @@ var MessageItem = /*#__PURE__*/React.memo(function (props) {
41
43
  handleClickPromptWord = props.handleClickPromptWord,
42
44
  handleShowCourse = props.handleShowCourse,
43
45
  handleClickAskList = props.handleClickAskList,
46
+ handleClickConfirm = props.handleClickConfirm,
44
47
  playTTSByText = props.playTTSByText,
45
48
  stopTTSByText = props.stopTTSByText,
46
49
  isPlaying = props.isPlaying,
@@ -73,7 +76,13 @@ var MessageItem = /*#__PURE__*/React.memo(function (props) {
73
76
  quoteTeachModelList: v.quoteTeachModelList
74
77
  }), v.content && /*#__PURE__*/React.createElement("div", {
75
78
  className: styles.title
76
- }, replaceBraces(v.content)), v.messageFiles && /*#__PURE__*/React.createElement("div", {
79
+ }, /*#__PURE__*/React.createElement(MMarkdown, {
80
+ content: replaceBraces(v.content) || '',
81
+ customRender: [{
82
+ type: 'skilltool',
83
+ component: SkillTag
84
+ }]
85
+ })), v.messageFiles && /*#__PURE__*/React.createElement("div", {
77
86
  className: styles.listBox
78
87
  }, /*#__PURE__*/React.createElement(UploadList, {
79
88
  isMessage: true,
@@ -102,6 +111,7 @@ var MessageItem = /*#__PURE__*/React.memo(function (props) {
102
111
  handleClickPromptWord: handleClickPromptWord,
103
112
  handleShowCourse: handleShowCourse,
104
113
  handleClickAskList: handleClickAskList,
114
+ handleClickConfirm: handleClickConfirm,
105
115
  playTTSByText: playTTSByText,
106
116
  stopTTSByText: stopTTSByText,
107
117
  isVoicePlaying: isPlaying,
@@ -170,7 +180,8 @@ var MessageList = function MessageList(_ref) {
170
180
  // 使用 chatActions hook 提供的函数
171
181
  var showOpera = chatActions.showOpera,
172
182
  showCommend = chatActions.showCommend,
173
- handleClickAskList = chatActions.handleClickAskList;
183
+ handleClickAskList = chatActions.handleClickAskList,
184
+ handleClickConfirm = chatActions.handleClickConfirm;
174
185
  var handleClickPromptWord = React.useCallback(function (prompt) {
175
186
  handleSend(prompt);
176
187
  }, [handleSend]);
@@ -279,6 +290,7 @@ var MessageList = function MessageList(_ref) {
279
290
  handleClickPromptWord: handleClickPromptWord,
280
291
  handleShowCourse: handleShowCourse,
281
292
  handleClickAskList: handleClickAskList,
293
+ handleClickConfirm: handleClickConfirm,
282
294
  playTTSByText: playTTSByText,
283
295
  stopTTSByText: stopTTSByText,
284
296
  isPlaying: isPlaying,
@@ -294,7 +306,7 @@ var MessageList = function MessageList(_ref) {
294
306
  onCurrentTraceVideoClick: onCurrentTraceVideoClick,
295
307
  curPlayer: curPlayer
296
308
  });
297
- }, [chatUI, hideUserMessage, showOpera, onCopyCallback, onSucessExcel, onFailureExcel, onRetryExcel, showCommend, handleClickPromptWord, handleShowCourse, handleClickAskList, playTTSByText, stopTTSByText, isPlaying, onRegenerateClick, enableCopy, enableLike, enableUnLike, enableRegenerate, enableVoicePlay, onDownloadCallback, reasoningTitle, model, handleReTry, onLikeCallback, onUnLikeCallback]);
309
+ }, [chatUI, hideUserMessage, showOpera, onCopyCallback, onSucessExcel, onFailureExcel, onRetryExcel, showCommend, handleClickPromptWord, handleShowCourse, handleClickAskList, handleClickConfirm, playTTSByText, stopTTSByText, isPlaying, onRegenerateClick, enableCopy, enableLike, enableUnLike, enableRegenerate, enableVoicePlay, onDownloadCallback, reasoningTitle, model, handleReTry, onLikeCallback, onUnLikeCallback]);
298
310
  return /*#__PURE__*/React.createElement("div", {
299
311
  className: classNames(styles.main),
300
312
  style: buildStyle()
@@ -54,6 +54,9 @@
54
54
  align-self: flex-end;
55
55
  overflow-x: auto;
56
56
  }
57
+ .main .textWrap .textItem.question .title p {
58
+ margin: 0 !important;
59
+ }
57
60
  .main .textWrap .textItem.question .listBox {
58
61
  display: flex;
59
62
  flex-direction: row-reverse;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ declare const SkillTag: ({ value }: {
3
+ value: string;
4
+ }) => React.JSX.Element;
5
+ export default SkillTag;
@@ -0,0 +1,24 @@
1
+ import React, { useMemo } from 'react';
2
+ import styles from "./index.module.css";
3
+ var SkillTag = function SkillTag(_ref) {
4
+ var value = _ref.value;
5
+ console.log(value);
6
+ var item = useMemo(function () {
7
+ try {
8
+ return JSON.parse(value);
9
+ } catch (e) {
10
+ console.error('[skill-tag] parse value error:', e);
11
+ return {};
12
+ }
13
+ }, [value]);
14
+ return /*#__PURE__*/React.createElement("div", {
15
+ className: styles.skillItem
16
+ }, /*#__PURE__*/React.createElement("img", {
17
+ src: item.imageUrl || '',
18
+ className: styles.icon,
19
+ alt: ""
20
+ }), /*#__PURE__*/React.createElement("span", {
21
+ className: styles.name
22
+ }, item.toolName || ''));
23
+ };
24
+ export default SkillTag;
@@ -0,0 +1,22 @@
1
+ .skillItem {
2
+ display: inline-block;
3
+ height: 24px;
4
+ padding: 0 8px;
5
+ height: 24px;
6
+ border-radius: 10px;
7
+ margin-right: 6px;
8
+ background-color: #E3E3E1;
9
+ line-height: 20px;
10
+ }
11
+ .skillItem .icon {
12
+ width: 14px;
13
+ height: 14px;
14
+ margin-right: 4px;
15
+ vertical-align: middle;
16
+ }
17
+ .skillItem .name {
18
+ font-size: 14px;
19
+ color: var(--theme-deepNeutral, #221813);
20
+ font-weight: 500;
21
+ vertical-align: middle;
22
+ }
@@ -261,7 +261,9 @@ var CommonChat = /*#__PURE__*/React.forwardRef(function (props, ref) {
261
261
  width: '100%'
262
262
  }
263
263
  }, /*#__PURE__*/React.createElement(AiLoading, null)), /*#__PURE__*/React.createElement(MessageList, _extends({
264
- chatList: messageList || defaultMessages,
264
+ chatList: messageList || defaultMessages
265
+ // chatList={defaultMessages}
266
+ ,
265
267
  handleSend: handleSend,
266
268
  platform: platform,
267
269
  inputModelRef: inputModelRef,
@@ -7,6 +7,7 @@ export declare const usePureChatActions: () => {
7
7
  declare const useChatActions: (showCopyId: number | null, inputModelRef: React.MutableRefObject<any>, handleSend: (val: string, agent?: any, isSystemAuto?: boolean) => void) => {
8
8
  showOpera: (id: number) => boolean;
9
9
  showCommend: (id: number) => boolean;
10
- handleClickAskList: (item: any, operation: string, key: string, value?: string | undefined) => void;
10
+ handleClickAskList: (item: any, operation: string, key: string, value?: string | undefined, inputModel?: any) => void;
11
+ handleClickConfirm: (item: any, confirmed: boolean) => void;
11
12
  };
12
13
  export default useChatActions;
@@ -187,13 +187,13 @@ var useChatActions = function useChatActions(showCopyId, inputModelRef, handleSe
187
187
  * 点击问询列表
188
188
  */
189
189
  var handleClickAskList = React.useMemo(function () {
190
- return debounce(function (item, operation, key, value) {
190
+ return debounce(function (item, operation, key, value, inputModel) {
191
191
  var _messageList8;
192
192
  var messageList = messageListRef.current;
193
193
  if ((_messageList8 = messageList[messageList.length - 1]) !== null && _messageList8 !== void 0 && _messageList8.selectValue) {
194
194
  return;
195
195
  }
196
- var _inputModel = _defineProperty({}, "".concat(item.id, ".").concat(operation), key);
196
+ var _inputModel = inputModel || _defineProperty({}, "".concat(item.id, ".").concat(operation), key);
197
197
  inputModelRef.current = _inputModel;
198
198
  var newMessageList = updateLastMessage(messageList, function (lastMessage) {
199
199
  return _objectSpread(_objectSpread({}, lastMessage), {}, {
@@ -206,10 +206,48 @@ var useChatActions = function useChatActions(showCopyId, inputModelRef, handleSe
206
206
  handleSend(value || '');
207
207
  }, 100);
208
208
  }, [handleSend, inputModelRef, dispatch]);
209
+
210
+ /**
211
+ * 确认/拒绝工具调用
212
+ * 绕开 ask 的 selectValue 防重逻辑,直接组装 user_confirm inputModel 发送
213
+ */
214
+ var handleClickConfirm = React.useCallback(function (item, confirmed) {
215
+ var _lastMessage$toolList, _item$data, _item$data2;
216
+ // 1. 更新最后一条消息的 toolList,把这条 user_confirm 改成已确认/已拒绝
217
+ var currentMessageList = messageListRef.current;
218
+ var lastMessage = currentMessageList[currentMessageList.length - 1];
219
+ var updatedToolList = (_lastMessage$toolList = lastMessage.toolList) === null || _lastMessage$toolList === void 0 ? void 0 : _lastMessage$toolList.map(function (tool) {
220
+ return tool.id === item.id ? _objectSpread(_objectSpread({}, tool), {}, {
221
+ moduleType: "user_confirm",
222
+ status: 'COMPLETED',
223
+ confirmStatus: confirmed ? "CONFIRMED" : "REJECTED"
224
+ }) : tool;
225
+ });
226
+ var updatedMessageList = [].concat(_toConsumableArray(currentMessageList.slice(0, -1)), [_objectSpread(_objectSpread({}, lastMessage), {}, {
227
+ toolList: updatedToolList
228
+ })]);
229
+ dispatch(setMessageList({
230
+ messageList: updatedMessageList
231
+ }));
232
+
233
+ // 2. 组装 inputModel 并发送
234
+ var inputModel = {
235
+ user_confirm: {
236
+ askingEventId: (_item$data = item.data) === null || _item$data === void 0 ? void 0 : _item$data.askingEventId,
237
+ confirmResults: [{
238
+ toolCallId: ((_item$data2 = item.data) === null || _item$data2 === void 0 || (_item$data2 = _item$data2.toolCalls) === null || _item$data2 === void 0 || (_item$data2 = _item$data2[0]) === null || _item$data2 === void 0 ? void 0 : _item$data2.id) || '',
239
+ confirmed: confirmed
240
+ }]
241
+ }
242
+ };
243
+ inputModelRef.current = inputModel;
244
+ handleSend('', undefined, true, undefined, true); // skipCreateNewMessage: true 复用当前消息
245
+ }, [handleSend, inputModelRef, dispatch]);
209
246
  return {
210
247
  showOpera: showOpera,
211
248
  showCommend: showCommend,
212
- handleClickAskList: handleClickAskList
249
+ handleClickAskList: handleClickAskList,
250
+ handleClickConfirm: handleClickConfirm
213
251
  };
214
252
  };
215
253
  export default useChatActions;
@@ -1,10 +1,15 @@
1
1
  /// <reference types="react" />
2
+ export declare const TOOL_MODULE_TYPES: string[];
3
+ export declare const MODULE_TYPE_NAMES: Record<string, string>;
4
+ export declare const getToolNameByStatus: (moduleType: string, status?: string) => string;
2
5
  interface StreamChatCallbacks {
3
6
  onSseOpen?: (response: Response) => void;
4
7
  onDataReceived?: (response: string, type: 'content' | 'reasoningContent') => void;
5
- onComplete?: (response: any, type: string, reasoningResponse?: string) => void;
8
+ onComplete?: (response: any, type: string, reasoningResponse?: string, dataObj?: any) => void;
6
9
  onErrorComplete?: () => void;
7
10
  onMCPToolsStream?: (dataObj: any) => void;
11
+ onToolStream?: (dataObj: any) => void;
12
+ onArtifactStream?: (dataObj: any) => void;
8
13
  }
9
14
  /**
10
15
  * 处理流式聊天逻辑
@@ -15,6 +15,76 @@ import { useLastEventId } from "./useLastEventId";
15
15
  import { useAppSelector, useAppDispatch } from "../store/hooks";
16
16
  import { setIsMsgRecieving } from "../store/slices/gimiMenuSlice";
17
17
  import { getTimeZone } from "../utils/tools";
18
+
19
+ // 需要展示为工具调用的模块类型
20
+ export var TOOL_MODULE_TYPES = ['tool_invocation', 'tool_result', "thinking"
21
+ // 'start', 'llm', 'knowledge', 'video', 'image-text',
22
+ // 'input', 'if-select', 'intent', 'talk', 'text',
23
+ // 'video-caption', 'summary', 'loop', 'skillBase',
24
+ // 'break', 'http', 'esKnowledge', 'mcp'
25
+ ];
26
+
27
+ // 所有需要进入处理流程的模块类型(包括工具类型 + 特殊处理类型)
28
+ var PROCESSABLE_MODULE_TYPES = [].concat(TOOL_MODULE_TYPES, ['end', 'ask', 'skill', 'tool_call', 'artifact', 'user_confirm', 'COMPLETED']);
29
+
30
+ // 模块类型到工具名称的映射
31
+ export var MODULE_TYPE_NAMES = {
32
+ 'start': '开始节点',
33
+ 'end': '结束节点',
34
+ 'llm': '模型节点',
35
+ 'knowledge': '知识库节点',
36
+ 'video': '视频节点',
37
+ 'image-text': '图文节点',
38
+ 'input': '输入节点',
39
+ 'if-select': '选择节点',
40
+ 'intent': '意图识别节点',
41
+ 'talk': '讨论节点',
42
+ 'ask': '问答节点',
43
+ 'text': '文本处理节点',
44
+ 'video-caption': '视频字幕节点',
45
+ 'summary': '章节总结节点',
46
+ 'loop': '循环节点',
47
+ 'skill': '技能节点',
48
+ 'skillBase': '通用技能节点',
49
+ 'break': '终止循环节点',
50
+ 'http': 'HTTP节点',
51
+ 'esKnowledge': '知识库节点',
52
+ 'mcp': 'MCP节点'
53
+ };
54
+
55
+ // 根据 moduleType 和 status 生成 toolName
56
+ export var getToolNameByStatus = function getToolNameByStatus(moduleType, status) {
57
+ // thinking 类型定制文案
58
+ if (moduleType === 'thinking') {
59
+ if (status === 'STARTED') {
60
+ return '开始分析问题';
61
+ } else if (status === 'RUNNING') {
62
+ return '正在分析问题';
63
+ } else if (status === 'COMPLETED') {
64
+ return '已完成分析';
65
+ }
66
+ return '深度思考';
67
+ }
68
+ var baseName = MODULE_TYPE_NAMES[moduleType] || moduleType;
69
+ if (!status) {
70
+ return baseName;
71
+ }
72
+
73
+ // 根据状态生成描述
74
+ if (status === 'STARTED') {
75
+ return "\u5F00\u59CB\u8FD0\u884C".concat(baseName);
76
+ } else if (status === 'COMPLETED') {
77
+ return "".concat(baseName, "\u8FD0\u884C\u5B8C\u6210");
78
+ } else if (status === 'RUNNING') {
79
+ return "".concat(baseName, "\u8FD0\u884C\u4E2D");
80
+ } else if (status === 'PENDING') {
81
+ return "".concat(baseName, "\u7B49\u5F85\u4E2D");
82
+ } else if (status === 'FAILED') {
83
+ return "".concat(baseName, "\u8FD0\u884C\u5931\u8D25");
84
+ } else {
85
+ return baseName;
86
+ }
87
+ };
18
88
  /**
19
89
  * 处理流式聊天逻辑
20
90
  */
@@ -65,6 +135,8 @@ export var useChatStream = function useChatStream(platform) {
65
135
  onComplete,
66
136
  onErrorComplete,
67
137
  onMCPToolsStream,
138
+ onToolStream,
139
+ onArtifactStream,
68
140
  signal,
69
141
  currentLastEventId,
70
142
  url,
@@ -78,7 +150,7 @@ export var useChatStream = function useChatStream(platform) {
78
150
  callbacks = _args.length > 2 && _args[2] !== undefined ? _args[2] : {};
79
151
  method = _args.length > 3 ? _args[3] : undefined;
80
152
  requestUrl = _args.length > 4 ? _args[4] : undefined;
81
- onSseOpen = callbacks.onSseOpen, onDataReceived = callbacks.onDataReceived, onComplete = callbacks.onComplete, onErrorComplete = callbacks.onErrorComplete, onMCPToolsStream = callbacks.onMCPToolsStream; // 中止之前的请求
153
+ onSseOpen = callbacks.onSseOpen, onDataReceived = callbacks.onDataReceived, onComplete = callbacks.onComplete, onErrorComplete = callbacks.onErrorComplete, onMCPToolsStream = callbacks.onMCPToolsStream, onToolStream = callbacks.onToolStream, onArtifactStream = callbacks.onArtifactStream; // 中止之前的请求
82
154
  if (esAbortRef.current) {
83
155
  esAbortRef.current.abort();
84
156
  }
@@ -131,6 +203,7 @@ export var useChatStream = function useChatStream(platform) {
131
203
  dispatch(setIsMsgRecieving({
132
204
  isMsgRecieving: true
133
205
  }));
206
+ console.log('[onmessage] 收到消息:', event.data);
134
207
  if (!(event !== null && event !== void 0 && event.data) || ignoreOnMessageRef.current) {
135
208
  return;
136
209
  }
@@ -142,7 +215,7 @@ export var useChatStream = function useChatStream(platform) {
142
215
  if (messageId && event.id) {
143
216
  saveLastEventId(messageId, event.id);
144
217
  }
145
- if (data.status === 0 && data.result && ['end', 'ask', 'skill', 'tool_call', 'COMPLETED'].includes(_dataObj.moduleType) && !_dataObj.ERROR) {
218
+ if (data.status === 0 && data.result && PROCESSABLE_MODULE_TYPES.includes(_dataObj.moduleType) && !_dataObj.ERROR) {
146
219
  if (_dataObj.status === 'RUNNING' && _dataObj.moduleType === 'end') {
147
220
  if (_dataObj.content && !_dataObj.reasoningContent) {
148
221
  fullResponse += _dataObj.content;
@@ -155,15 +228,32 @@ export var useChatStream = function useChatStream(platform) {
155
228
  if (_dataObj.moduleType === 'tool_call') {
156
229
  onMCPToolsStream === null || onMCPToolsStream === void 0 || onMCPToolsStream(_dataObj);
157
230
  }
231
+
232
+ // 工具调用
233
+ if (TOOL_MODULE_TYPES.includes(_dataObj.moduleType)) {
234
+ onToolStream === null || onToolStream === void 0 || onToolStream(_dataObj);
235
+ }
236
+ // 生成产物
237
+ if (_dataObj.moduleType === 'artifact' && _dataObj.status === 'COMPLETED') {
238
+ onArtifactStream === null || onArtifactStream === void 0 || onArtifactStream(_dataObj);
239
+ }
240
+
241
+ // 问答确认
158
242
  if ((_dataObj.moduleType === 'ask' || _dataObj.moduleType === 'skill') && _dataObj.status === 'PENDING') {
159
243
  onComplete === null || onComplete === void 0 || onComplete(_dataObj, _dataObj.moduleType);
160
244
  return;
161
245
  }
162
- if (_dataObj.status === 'COMPLETED' && _dataObj.moduleType === 'end' || _dataObj.moduleType === 'COMPLETED') {
163
- removeLastEventId(messageId);
164
- onComplete === null || onComplete === void 0 || onComplete(fullResponse, _dataObj.moduleType, reasoningResponse);
246
+ // 确认模式
247
+ if (_dataObj.moduleType === 'user_confirm' && _dataObj.status === 'ASKING') {
248
+ onComplete === null || onComplete === void 0 || onComplete(_dataObj, _dataObj.moduleType);
165
249
  return;
166
250
  }
251
+ } else if (_dataObj.moduleType === 'agent' && _dataObj.status === 'STARTED') {
252
+ onToolStream === null || onToolStream === void 0 || onToolStream(_dataObj);
253
+ } else if (_dataObj.moduleType === 'agent' && _dataObj.status === 'COMPLETED' || _dataObj.type === 'WORKFLOW_COMPLETED') {
254
+ removeLastEventId(messageId);
255
+ onComplete === null || onComplete === void 0 || onComplete(fullResponse, 'end', reasoningResponse, _dataObj);
256
+ return;
167
257
  } else if (_dataObj.ERROR || _dataObj.moduleType === 'FAILED') {
168
258
  var isRefresh = parseInt(_dataObj.status, 10) === 10002026;
169
259
  if (isRefresh) {
@@ -207,6 +297,7 @@ export var useChatStream = function useChatStream(platform) {
207
297
  dispatch(setIsMsgRecieving({
208
298
  isMsgRecieving: false
209
299
  }));
300
+ esAbortRef.current = null; // 清空,避免残留
210
301
  console.log('流式结束');
211
302
  }
212
303
  }));
@@ -33,7 +33,7 @@ declare const useCommonChatAPI: (props: IHookProps) => {
33
33
  getContentMessageList: (pageIndex?: number, curPageSize?: number) => Promise<void>;
34
34
  hasMore: React.MutableRefObject<boolean>;
35
35
  loadMore: () => void;
36
- handleSend: (val: string, agent?: any, isSystemAuto?: boolean, conversationId?: number) => Promise<void>;
36
+ handleSend: (val: string, agent?: any, isSystemAuto?: boolean, conversationId?: number, skipCreateNewMessage?: boolean) => Promise<void>;
37
37
  scrollBottomForce: (animate?: boolean | undefined) => void;
38
38
  showBackBottom: boolean;
39
39
  isScrolling: boolean;