@myun/gimi-chat 0.9.73 → 0.9.75

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.
@@ -8,11 +8,13 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
8
8
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
9
9
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
10
10
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
11
- import React, { useMemo, useState } from "react";
11
+ import React, { useEffect, useMemo, useState } from "react";
12
12
  import { MMarkdown } from '@myun/gimi-design';
13
13
  import IconFont from "../../../iconfont-com";
14
+ import FileUpload from "../../../file-upload";
14
15
  import styles from "./index.module.css";
15
16
  import classNames from "classnames";
17
+ import { useTranslation } from "react-i18next";
16
18
 
17
19
  // 思考工具项组件
18
20
  var ThinkingToolItem = function ThinkingToolItem(_ref) {
@@ -22,12 +24,28 @@ var ThinkingToolItem = function ThinkingToolItem(_ref) {
22
24
  _useState2 = _slicedToArray(_useState, 2),
23
25
  showContent = _useState2[0],
24
26
  setShowContent = _useState2[1];
27
+ var _useState3 = useState(false),
28
+ _useState4 = _slicedToArray(_useState3, 2),
29
+ manual = _useState4[0],
30
+ setManual = _useState4[1]; // 用户是否手动操作过,手动后不再被状态覆盖
31
+
32
+ useEffect(function () {
33
+ if (!manual) {
34
+ setShowContent(item.status !== "COMPLETED");
35
+ }
36
+ }, [item.status, manual]);
37
+ var handleToggle = function handleToggle() {
38
+ setManual(true);
39
+ setShowContent(function (v) {
40
+ return !v;
41
+ });
42
+ };
25
43
  return /*#__PURE__*/React.createElement("div", {
26
44
  className: styles.toolItem
27
45
  }, /*#__PURE__*/React.createElement("div", {
28
46
  className: styles.toolItemLabel,
29
47
  onClick: function onClick() {
30
- return item.content && setShowContent(!showContent);
48
+ return item.content && handleToggle();
31
49
  }
32
50
  }, item.status === "COMPLETED" && /*#__PURE__*/React.createElement("img", {
33
51
  className: styles.toolIcon,
@@ -52,10 +70,10 @@ var ThinkingToolItem = function ThinkingToolItem(_ref) {
52
70
  var ToolItemCom = function ToolItemCom(_ref2) {
53
71
  var item = _ref2.item,
54
72
  customRender = _ref2.customRender;
55
- var _useState3 = useState(false),
56
- _useState4 = _slicedToArray(_useState3, 2),
57
- showContent = _useState4[0],
58
- setShowContent = _useState4[1];
73
+ var _useState5 = useState(false),
74
+ _useState6 = _slicedToArray(_useState5, 2),
75
+ showContent = _useState6[0],
76
+ setShowContent = _useState6[1];
59
77
  var content = useMemo(function () {
60
78
  var result = item.content || '';
61
79
  for (var depth = 0; depth < 2 && typeof result === 'string'; depth++) {
@@ -76,7 +94,7 @@ var ToolItemCom = function ToolItemCom(_ref2) {
76
94
  onClick: function onClick() {
77
95
  return item.content && setShowContent(!showContent);
78
96
  }
79
- }, item.status === "COMPLETED" && /*#__PURE__*/React.createElement("img", {
97
+ }, (item.status === "COMPLETED" || item.status === "FAILED") && /*#__PURE__*/React.createElement("img", {
80
98
  className: styles.toolIcon,
81
99
  src: "https://simg01.gaodunwangxiao.com/uploadfiles/tmp/upload/202609/07/e5347_20260907085700.png"
82
100
  }), /*#__PURE__*/React.createElement("div", {
@@ -140,17 +158,15 @@ var AskToolItem = function AskToolItem(_ref4) {
140
158
  _React$useState2 = _slicedToArray(_React$useState, 2),
141
159
  disabled = _React$useState2[0],
142
160
  setDisabled = _React$useState2[1];
143
- var _React$useState3 = React.useState(''),
144
- _React$useState4 = _slicedToArray(_React$useState3, 2),
145
- inputValue = _React$useState4[0],
146
- setInputValue = _React$useState4[1];
147
- var _useState5 = useState(false),
148
- _useState6 = _slicedToArray(_useState5, 2),
149
- showContent = _useState6[0],
150
- setShowContent = _useState6[1];
161
+ var _useState7 = useState(false),
162
+ _useState8 = _slicedToArray(_useState7, 2),
163
+ showContent = _useState8[0],
164
+ setShowContent = _useState8[1];
165
+ var _useTranslation = useTranslation(),
166
+ t = _useTranslation.t;
151
167
  var askTextMap = {
152
- RUNNING: "等待用户回答",
153
- COMPLETED: "用户已回答"
168
+ RUNNING: "等待人工确认",
169
+ COMPLETED: "用户已确认"
154
170
  };
155
171
  var _React$useMemo = React.useMemo(function () {
156
172
  var _item$data2, _detailInfo$questionC, _item$data3;
@@ -183,11 +199,6 @@ var AskToolItem = function AskToolItem(_ref4) {
183
199
  setDisabled(true);
184
200
  handleClickAskList(item, 'click', key, value);
185
201
  };
186
- var handleInputSubmit = function handleInputSubmit() {
187
- if (!inputValue.trim() || disabled) return;
188
- setDisabled(true);
189
- handleClickAskList(item, 'input', 'answer', inputValue.trim());
190
- };
191
202
  var optionRender = function optionRender(v) {
192
203
  return /*#__PURE__*/React.createElement("span", null, v.value ? v.value : v.key);
193
204
  };
@@ -225,7 +236,15 @@ var AskToolItem = function AskToolItem(_ref4) {
225
236
  return onAskItemClick(v.key, v.value || v.key);
226
237
  }
227
238
  }, optionRender(v));
228
- }))) : item.content && showContent && /*#__PURE__*/React.createElement("div", {
239
+ })), detailInfo.uploadFile && detailInfo.answerType === 0 && /*#__PURE__*/React.createElement("div", {
240
+ className: classNames(styles.showUpload)
241
+ }, /*#__PURE__*/React.createElement(FileUpload, null, /*#__PURE__*/React.createElement("div", {
242
+ className: classNames(styles.uploadIcon)
243
+ }, /*#__PURE__*/React.createElement(IconFont, {
244
+ type: "icon-shurukuang-webtianjia",
245
+ size: 26,
246
+ color: 'var(--theme-deepNeutral, #2E394C)'
247
+ }), /*#__PURE__*/React.createElement("span", null, t('askCard.fileUpload')))))) : item.content && showContent && /*#__PURE__*/React.createElement("div", {
229
248
  className: styles.toolItemContent
230
249
  }, /*#__PURE__*/React.createElement(MMarkdown, {
231
250
  content: item.content
@@ -134,6 +134,58 @@
134
134
  pointer-events: none;
135
135
  }
136
136
 
137
+ .showUpload {
138
+ width: fit-content;
139
+ min-width: 128px;
140
+ height: 44px;
141
+ flex-shrink: 0;
142
+ border-radius: 22px;
143
+ border: 1px solid var(--theme-softNeutral, #D9DCE5);
144
+ background: #fff;
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ cursor: pointer;
149
+ display: flex;
150
+ align-items: center;
151
+ padding: 0 12px;
152
+ box-sizing: border-box;
153
+ color: var(--theme-deepNeutral, #2E394C);
154
+ font-family: "PingFang SC";
155
+ font-size: 14px;
156
+ font-style: normal;
157
+ font-weight: 600;
158
+ line-height: normal;
159
+ }
160
+ .showUpload :global(.ant-upload) {
161
+ height: 100%;
162
+ }
163
+ .showUpload .uploadIcon {
164
+ height: 100%;
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 6px;
168
+ }
169
+ .showUpload .uploadIcon span {
170
+ white-space: nowrap;
171
+ }
172
+ .showUpload .disableFile {
173
+ border-radius: 22px;
174
+ border: 1px solid var(--theme-softNeutral, #D9DCE5);
175
+ background: #fff;
176
+ color: #ced3d9;
177
+ font-family: "PingFang SC";
178
+ font-size: 14px;
179
+ font-style: normal;
180
+ font-weight: 600;
181
+ line-height: normal;
182
+ }
183
+ .showUpload img {
184
+ width: 32px;
185
+ height: 32px;
186
+ flex-shrink: 0;
187
+ }
188
+
137
189
  @keyframes shine {
138
190
  0% {
139
191
  left: -60%;
@@ -303,9 +303,7 @@ var AnswerItem = function AnswerItem(_ref) {
303
303
  }
304
304
  } catch (error) {}
305
305
  newItem.content = askContent;
306
- newItem.data = _objectSpread(_objectSpread({}, newItem.data), {}, {
307
- data: eventData
308
- });
306
+ newItem.data = _objectSpread(_objectSpread({}, newItem.data), eventData.data);
309
307
  newItem.status = item.status === 'PENDING' ? 'RUNNING' : 'COMPLETED';
310
308
  newItem.confirmStatus = item.status === 'PENDING' ? 'RUNNING' : 'COMPLETED';
311
309
  }
@@ -198,8 +198,6 @@ var useChatActions = function useChatActions(showCopyId, inputModelRef, handleSe
198
198
  // if (messageList[messageList.length - 1]?.selectValue) {
199
199
  // return;
200
200
  // }
201
- console.log(item);
202
-
203
201
  // 根据 operation 类型获取答案内容
204
202
  var answerContent = '';
205
203
  if (operation === 'click') {
@@ -57,67 +57,80 @@ var NODE_STATUS_TEXTS = {
57
57
  'thinking': {
58
58
  'STARTED': '开始分析问题',
59
59
  'RUNNING': '正在分析问题',
60
- 'COMPLETED': '已完成分析'
60
+ 'COMPLETED': '已完成分析',
61
+ 'FAILED': '分析问题失败'
61
62
  },
62
63
  'knowledge': {
63
64
  'STARTED': '开始调用知识库检索',
64
65
  'RUNNING': '正在调用知识库检索',
65
- 'COMPLETED': '已调用知识库检索'
66
+ 'COMPLETED': '已调用知识库检索',
67
+ 'FAILED': '调用知识库检索失败'
66
68
  },
67
69
  "esKnowledge": {
68
70
  'STARTED': '开始调用知识库检索',
69
71
  'RUNNING': '正在调用知识库检索',
70
- 'COMPLETED': '已调用知识库检索'
72
+ 'COMPLETED': '已调用知识库检索',
73
+ 'FAILED': '调用知识库检索失败'
71
74
  },
72
75
  "mcp": {
73
76
  'STARTED': '开始调用技能',
74
77
  'RUNNING': '正在调用技能',
75
- 'COMPLETED': '已调用技能'
78
+ 'COMPLETED': '已调用技能',
79
+ 'FAILED': '调用技能失败'
76
80
  },
77
81
  "skillBase": {
78
82
  'STARTED': '开始调用技能',
79
83
  'RUNNING': '正在调用技能',
80
- 'COMPLETED': '已调用技能'
84
+ 'COMPLETED': '已调用技能',
85
+ 'FAILED': '调用技能失败'
81
86
  },
82
87
  "http": {
83
88
  'STARTED': '开始调用处理数据',
84
89
  'RUNNING': '正在调用处理数据',
85
- 'COMPLETED': '已调用处理数据'
90
+ 'COMPLETED': '已调用处理数据',
91
+ 'FAILED': '调用处理数据失败'
86
92
  },
87
93
  "loop": {
88
94
  'STARTED': '开始处理任务',
89
95
  'RUNNING': '正在处理任务',
90
- 'COMPLETED': '已处理任务'
96
+ 'COMPLETED': '已处理任务',
97
+ 'FAILED': '处理任务失败'
91
98
  },
92
99
  "intent": {
93
100
  'STARTED': '开始规划下一步处理方式',
94
101
  'RUNNING': '正在规划下一步处理方式',
95
- 'COMPLETED': '已规划下一步处理方式'
102
+ 'COMPLETED': '已规划下一步处理方式',
103
+ 'FAILED': '规划下一步处理方式失败'
96
104
  },
97
105
  "video": {
98
106
  'STARTED': '开始处理任务',
99
107
  'RUNNING': '正在处理任务',
100
- 'COMPLETED': '已处理任务'
108
+ 'COMPLETED': '已处理任务',
109
+ 'FAILED': '处理任务失败'
101
110
  },
102
111
  "talk": {
103
112
  'STARTED': '开始处理任务',
104
113
  'RUNNING': '正在处理任务',
105
- 'COMPLETED': '已处理任务'
114
+ 'COMPLETED': '已处理任务',
115
+ 'FAILED': '处理任务失败'
106
116
  },
107
117
  "image-text": {
108
118
  'STARTED': '开始处理任务',
109
119
  'RUNNING': '正在处理任务',
110
- 'COMPLETED': '已处理任务'
120
+ 'COMPLETED': '已处理任务',
121
+ 'FAILED': '处理任务失败'
111
122
  },
112
123
  "text": {
113
124
  'STARTED': '开始调用处理数据',
114
125
  'RUNNING': '正在调用处理数据',
115
- 'COMPLETED': '已调用处理数据'
126
+ 'COMPLETED': '已调用处理数据',
127
+ 'FAILED': '调用处理数据失败'
116
128
  },
117
129
  "llm": {
118
130
  'STARTED': '开始分析问题',
119
131
  'RUNNING': '正在分析问题',
120
- 'COMPLETED': '已完成分析'
132
+ 'COMPLETED': '已完成分析',
133
+ 'FAILED': '分析问题失败'
121
134
  }
122
135
 
123
136
  // 其他节点可继续添加自定义文案
@@ -557,7 +557,7 @@ var useCommonChatAPI = function useCommonChatAPI(props) {
557
557
  var lastToolList = _toConsumableArray(currentMessageList[currentMessageList.length - 1].toolList || []);
558
558
  if (lastToolList.findIndex(function (v) {
559
559
  return v.moduleType === 'end';
560
- }) < 0) {
560
+ }) < 0 && type === 'content') {
561
561
  lastToolList.push({
562
562
  moduleType: 'end',
563
563
  content: '',
@@ -1003,9 +1003,12 @@ var useCommonChatAPI = function useCommonChatAPI(props) {
1003
1003
  cleanVal,
1004
1004
  userChat,
1005
1005
  prevChatList,
1006
- _prevChatList,
1007
- lastItem,
1008
1006
  newChatList,
1007
+ lastItem,
1008
+ _lastItem$toolList,
1009
+ _lastItem$toolList2,
1010
+ lastAskTool,
1011
+ updatedToolList,
1009
1012
  _args10 = arguments;
1010
1013
  return _regeneratorRuntime().wrap(function _callee10$(_context10) {
1011
1014
  while (1) switch (_context10.prev = _context10.next) {
@@ -1057,27 +1060,55 @@ var useCommonChatAPI = function useCommonChatAPI(props) {
1057
1060
 
1058
1061
  // 根据isSystemAuto决定是否添加用户消息到列表
1059
1062
  prevChatList = messageListRef.current.slice();
1060
- if (!isSystemAuto) {
1061
- setMsgLoading(true);
1062
- if (((_prevChatList = prevChatList) === null || _prevChatList === void 0 ? void 0 : _prevChatList.length) > 1) {
1063
- lastItem = prevChatList[prevChatList.length - 1];
1064
- if (lastItem.moduleType === 'ask') {
1065
- prevChatList = [].concat(_toConsumableArray(prevChatList.slice(0, -1)), [_objectSpread(_objectSpread({}, prevChatList[prevChatList.length - 1]), {}, {
1066
- disableUploadFile: true
1067
- })]);
1068
- }
1069
- }
1070
- newChatList = [].concat(_toConsumableArray(prevChatList), [userChat]);
1071
- dispatch(setMessageList({
1072
- messageList: newChatList
1073
- }));
1074
- startChat(newChatList, isSystemAuto, conversationId, undefined, skipCreateNewMessage);
1075
- } else {
1076
- setMsgLoading(true);
1077
- // 系统自动上传,直接开始会话,不更新列表
1078
- startChat(_toConsumableArray(prevChatList), isSystemAuto, conversationId, undefined, skipCreateNewMessage);
1063
+ newChatList = [].concat(_toConsumableArray(prevChatList), [userChat]);
1064
+ if (isSystemAuto) {
1065
+ _context10.next = 40;
1066
+ break;
1079
1067
  }
1080
- case 25:
1068
+ setMsgLoading(true);
1069
+ if (!((prevChatList === null || prevChatList === void 0 ? void 0 : prevChatList.length) > 1)) {
1070
+ _context10.next = 36;
1071
+ break;
1072
+ }
1073
+ lastItem = prevChatList[prevChatList.length - 1];
1074
+ if (!(lastItem.moduleType === 'ask')) {
1075
+ _context10.next = 36;
1076
+ break;
1077
+ }
1078
+ lastAskTool = (_lastItem$toolList = lastItem.toolList) === null || _lastItem$toolList === void 0 ? void 0 : _lastItem$toolList.find(function (tool) {
1079
+ return tool.moduleType === 'ask';
1080
+ });
1081
+ if (lastAskTool) {
1082
+ _context10.next = 33;
1083
+ break;
1084
+ }
1085
+ return _context10.abrupt("return");
1086
+ case 33:
1087
+ updatedToolList = (_lastItem$toolList2 = lastItem.toolList) === null || _lastItem$toolList2 === void 0 ? void 0 : _lastItem$toolList2.map(function (tool) {
1088
+ return tool.id === lastAskTool.id ? _objectSpread(_objectSpread({}, tool), {}, {
1089
+ moduleType: "ask",
1090
+ status: 'COMPLETED',
1091
+ confirmStatus: "CONFIRMED",
1092
+ content: value
1093
+ }) : tool;
1094
+ });
1095
+ skipCreateNewMessage = true;
1096
+ newChatList = [].concat(_toConsumableArray(prevChatList.slice(0, -1)), [_objectSpread(_objectSpread({}, prevChatList[prevChatList.length - 1]), {}, {
1097
+ disableUploadFile: true,
1098
+ toolList: updatedToolList
1099
+ })]);
1100
+ case 36:
1101
+ dispatch(setMessageList({
1102
+ messageList: newChatList
1103
+ }));
1104
+ startChat(newChatList, isSystemAuto, conversationId, undefined, skipCreateNewMessage);
1105
+ _context10.next = 42;
1106
+ break;
1107
+ case 40:
1108
+ setMsgLoading(true);
1109
+ // 系统自动上传,直接开始会话,不更新列表
1110
+ startChat(_toConsumableArray(prevChatList), isSystemAuto, conversationId, undefined, skipCreateNewMessage);
1111
+ case 42:
1081
1112
  case "end":
1082
1113
  return _context10.stop();
1083
1114
  }
@@ -24,7 +24,6 @@ export interface ToolItem {
24
24
  * PARTIAL:部分同意;
25
25
  */
26
26
  confirmStatus?: "PENDING" | "CONFIRMED" | "REJECTED" | "PARTIAL";
27
- workflowAskResult?: any;
28
27
  }
29
28
  /**
30
29
  * 聊天消息主接口