@ai-group/chat-sdk 1.0.9 → 1.0.11

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 (45) hide show
  1. package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js +0 -16
  2. package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js.map +2 -2
  3. package/dist/cjs/components/XAiChatbot/index.js +4 -6
  4. package/dist/cjs/components/XAiChatbot/index.js.map +2 -2
  5. package/dist/cjs/components/XAiChatbot/styles.js +1 -0
  6. package/dist/cjs/components/XAiChatbot/styles.js.map +2 -2
  7. package/dist/cjs/components/XAiProvider/XAiProvider.stories.js +2 -2
  8. package/dist/cjs/components/XAiProvider/XAiProvider.stories.js.map +1 -1
  9. package/dist/cjs/hooks/useAgentGenerator.d.ts +20 -16
  10. package/dist/cjs/hooks/useAgentGenerator.js +384 -266
  11. package/dist/cjs/hooks/useAgentGenerator.js.map +3 -3
  12. package/dist/cjs/types/XAiChatbot.d.ts +2 -1
  13. package/dist/cjs/types/XAiChatbot.js.map +1 -1
  14. package/dist/cjs/types/XAiMessage.d.ts +2 -16
  15. package/dist/cjs/types/XAiMessage.js.map +2 -2
  16. package/dist/cjs/types/node.d.ts +10 -0
  17. package/dist/cjs/types/node.js +18 -0
  18. package/dist/cjs/types/node.js.map +7 -0
  19. package/dist/cjs/utils/workflowNode.d.ts +2 -0
  20. package/dist/cjs/utils/workflowNode.js +169 -0
  21. package/dist/cjs/utils/workflowNode.js.map +7 -0
  22. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js +0 -15
  23. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js.map +1 -1
  24. package/dist/esm/components/XAiChatbot/index.js +4 -20
  25. package/dist/esm/components/XAiChatbot/index.js.map +1 -1
  26. package/dist/esm/components/XAiChatbot/styles.js +1 -1
  27. package/dist/esm/components/XAiChatbot/styles.js.map +1 -1
  28. package/dist/esm/components/XAiProvider/XAiProvider.stories.js +2 -2
  29. package/dist/esm/components/XAiProvider/XAiProvider.stories.js.map +1 -1
  30. package/dist/esm/hooks/useAgentGenerator.d.ts +20 -16
  31. package/dist/esm/hooks/useAgentGenerator.js +541 -339
  32. package/dist/esm/hooks/useAgentGenerator.js.map +1 -1
  33. package/dist/esm/types/XAiChatbot.d.ts +2 -1
  34. package/dist/esm/types/XAiChatbot.js.map +1 -1
  35. package/dist/esm/types/XAiMessage.d.ts +2 -16
  36. package/dist/esm/types/XAiMessage.js +0 -4
  37. package/dist/esm/types/XAiMessage.js.map +1 -1
  38. package/dist/esm/types/node.d.ts +10 -0
  39. package/dist/esm/types/node.js +2 -0
  40. package/dist/esm/types/node.js.map +1 -0
  41. package/dist/esm/utils/workflowNode.d.ts +2 -0
  42. package/dist/esm/utils/workflowNode.js +141 -0
  43. package/dist/esm/utils/workflowNode.js.map +1 -0
  44. package/dist/umd/chat-sdk.min.js +1 -1
  45. package/package.json +1 -1
@@ -44,7 +44,10 @@ var import_request = require("../utils/request");
44
44
  var import_utils = require("../utils/index");
45
45
  var import_constants = require("../constants");
46
46
  var import_api = require("../services/api");
47
+ var import_workflowNode = require("../utils/workflowNode");
47
48
  var import_document = __toESM(require("../assets/document.png"));
49
+ var import_completed = __toESM(require("../assets/completed.png"));
50
+ var import_completed_black = __toESM(require("../assets/completed-black.png"));
48
51
  var import_document_black = __toESM(require("../assets/document-black.png"));
49
52
  var import_qa = __toESM(require("../assets/qa.png"));
50
53
  var import_qa_black = __toESM(require("../assets/qa-black.png"));
@@ -58,7 +61,11 @@ var ActionType = /* @__PURE__ */ ((ActionType2) => {
58
61
  ActionType2["invokeToolStart"] = "INVOKE_AGENT_TOOL_START";
59
62
  ActionType2["invokeToolEnd"] = "INVOKE_AGENT_TOOL_END";
60
63
  ActionType2["reasoning"] = "REASONING";
64
+ ActionType2["reasoningStart"] = "REASONING_START";
61
65
  ActionType2["reasoningEnd"] = "REASONING_END";
66
+ ActionType2["componentStart"] = "COMPONENT_START";
67
+ ActionType2["componentStream"] = "COMPONENT_STREAM";
68
+ ActionType2["componentEnd"] = "COMPONENT_END";
62
69
  ActionType2["suggest"] = "FOLLOW_UP";
63
70
  ActionType2["response"] = "RESPONSE";
64
71
  ActionType2["finish"] = "FINISHED";
@@ -75,14 +82,303 @@ var ActionAvailability = /* @__PURE__ */ ((ActionAvailability2) => {
75
82
  ActionAvailability2["remote"] = "remote";
76
83
  return ActionAvailability2;
77
84
  })(ActionAvailability || {});
78
- var useAgentGenerator = ({
79
- url,
80
- token,
81
- config,
82
- onError,
83
- onMessage,
84
- onSuccess
85
- }) => {
85
+ var MessageProcessor = class {
86
+ constructor(textSpeed = 60) {
87
+ this.textSpeed = textSpeed;
88
+ }
89
+ // 获取知识图标
90
+ getKnowledgeIcons(knowledgeType) {
91
+ return knowledgeType === "DOCUMENT" ? { icon: import_document.default, expandIcon: import_document_black.default } : { icon: import_qa.default, expandIcon: import_qa_black.default };
92
+ }
93
+ // 获取工具图标
94
+ getToolIcons(toolType) {
95
+ return toolType === "SKILL" ? { icon: import_skillNo.default, expandIcon: import_skillNo_black.default } : { icon: import_tools.default, expandIcon: import_tools_black.default };
96
+ }
97
+ // 获取工作流图标(暂时不做区分)
98
+ getWorkflowIcon() {
99
+ return { icon: import_skillNo.default, expandIcon: import_skillNo_black.default };
100
+ }
101
+ // 更新执行时间
102
+ updateExecutionCost(messages, messageIndex, uniqueId, cost) {
103
+ const msg = messages[messageIndex];
104
+ if (msg == null ? void 0 : msg.execute) {
105
+ const execution = msg.execute.find((item) => item.id === uniqueId);
106
+ if (execution) {
107
+ execution.extra.cost = cost ? (cost / 1e3).toFixed(2) : 0;
108
+ }
109
+ }
110
+ }
111
+ // 查找最后一个待处理的AI消息
112
+ findLastPendingAIMessage(messages) {
113
+ for (let i = messages.length - 1; i >= 0; i--) {
114
+ const msg = messages[i];
115
+ if (msg.role === import_XAiMessage.MessageRole.assistant && msg.type === "TextMessage" && (msg.status === "init" || msg.status === "pending")) {
116
+ return [i, msg];
117
+ }
118
+ }
119
+ return [-1, null];
120
+ }
121
+ // 创建新的AI消息
122
+ createNewAIMessage() {
123
+ return {
124
+ id: (0, import_uuid.v4)(),
125
+ type: "TextMessage",
126
+ createdAt: /* @__PURE__ */ new Date(),
127
+ role: import_XAiMessage.MessageRole.assistant,
128
+ content: { text: "" },
129
+ execute: [],
130
+ thinks: "",
131
+ status: import_XAiMessage.MessageStatus.init
132
+ };
133
+ }
134
+ // 确保存在待处理的AI消息
135
+ ensureAIMessageExists(messages) {
136
+ const [index, existingMsg] = this.findLastPendingAIMessage(messages);
137
+ if (index !== -1 && existingMsg) {
138
+ return [[...messages], index, { ...existingMsg }];
139
+ }
140
+ const newMessage = this.createNewAIMessage();
141
+ const newMessages = [...messages, newMessage];
142
+ return [newMessages, newMessages.length - 1, newMessage];
143
+ }
144
+ // 处理建议
145
+ handleSuggestion(messages, data) {
146
+ var _a;
147
+ const { content } = data;
148
+ const newMessages = [...messages];
149
+ const suggestIndex = newMessages.findIndex((item) => item.type === "SuggestionMessage");
150
+ if (suggestIndex === -1) {
151
+ const newSuggestion = {
152
+ id: (0, import_uuid.v4)(),
153
+ type: "SuggestionMessage",
154
+ createdAt: /* @__PURE__ */ new Date(),
155
+ status: import_XAiMessage.MessageStatus.done,
156
+ role: import_XAiMessage.MessageRole.suggestion,
157
+ content: [{ key: (0, import_uuid.v4)(), description: content }]
158
+ };
159
+ newMessages.push(newSuggestion);
160
+ } else {
161
+ const suggestion = newMessages[suggestIndex];
162
+ (_a = suggestion == null ? void 0 : suggestion.content) == null ? void 0 : _a.push({
163
+ key: (0, import_uuid.v4)(),
164
+ description: content
165
+ });
166
+ }
167
+ return newMessages;
168
+ }
169
+ // 处理思考过程
170
+ handleReasoning(messages, data) {
171
+ const { content } = data;
172
+ const [newMessages, index, aiMsg] = this.ensureAIMessageExists(messages);
173
+ const updatedMsg = {
174
+ ...aiMsg,
175
+ thinks: (aiMsg.thinks || "") + content,
176
+ status: aiMsg.status === import_XAiMessage.MessageStatus.init ? import_XAiMessage.MessageStatus.pending : aiMsg.status
177
+ };
178
+ const updatedMessages = [...newMessages];
179
+ updatedMessages[index] = updatedMsg;
180
+ return updatedMessages;
181
+ }
182
+ // 处理思考过程结束
183
+ handleReasoningEnd(messages) {
184
+ const [newMessages, index, aiMsg] = this.ensureAIMessageExists(messages);
185
+ const updatedMsg = {
186
+ ...aiMsg,
187
+ thinks: (aiMsg.thinks || "") + "\n",
188
+ status: aiMsg.status === import_XAiMessage.MessageStatus.init ? import_XAiMessage.MessageStatus.pending : aiMsg.status
189
+ };
190
+ const updatedMessages = [...newMessages];
191
+ updatedMessages[index] = updatedMsg;
192
+ return updatedMessages;
193
+ }
194
+ // 处理知识库调用开始
195
+ handleRecallKnowledgeStart(messages, data) {
196
+ const [newMessages, index, aiMsg] = this.ensureAIMessageExists(messages);
197
+ const { uniqueId = (0, import_uuid.v4)(), args, knowledgeType } = (data == null ? void 0 : data.data) || {};
198
+ aiMsg.execute = aiMsg.execute || [];
199
+ const icons = this.getKnowledgeIcons(knowledgeType);
200
+ aiMsg.execute.push({
201
+ id: uniqueId,
202
+ createdAt: /* @__PURE__ */ new Date(),
203
+ type: "ActionExecutionMessage",
204
+ name: knowledgeType === "DOCUMENT" ? "已搜索文档知识库" : "已搜索问答知识库",
205
+ arguments: args,
206
+ extra: {
207
+ ...data,
208
+ ...icons
209
+ }
210
+ });
211
+ newMessages[index] = aiMsg;
212
+ return newMessages;
213
+ }
214
+ // 处理知识库调用结束
215
+ handleRecallKnowledgeEnd(messages, data) {
216
+ var _a;
217
+ const [index, _aiMsg] = this.findLastPendingAIMessage(messages);
218
+ if (index === -1)
219
+ return messages;
220
+ const newMessages = [...messages];
221
+ this.updateExecutionCost(newMessages, index, (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.uniqueId, data.cost);
222
+ return newMessages;
223
+ }
224
+ // 处理工具调用开始
225
+ handleInvokeToolStart(messages, data) {
226
+ const [newMessages, index, aiMsg] = this.ensureAIMessageExists(messages);
227
+ const { uniqueId = (0, import_uuid.v4)(), args, toolType } = (data == null ? void 0 : data.data) || {};
228
+ aiMsg.execute = aiMsg.execute || [];
229
+ const icons = this.getToolIcons(toolType);
230
+ aiMsg.execute.push({
231
+ id: uniqueId,
232
+ createdAt: /* @__PURE__ */ new Date(),
233
+ type: "ActionExecutionMessage",
234
+ name: toolType === "SKILL" ? "已调用工作流" : "已调用工具",
235
+ arguments: args,
236
+ extra: {
237
+ ...data,
238
+ ...icons
239
+ }
240
+ });
241
+ newMessages[index] = aiMsg;
242
+ return newMessages;
243
+ }
244
+ // 处理工具调用结束
245
+ handleInvokeToolEnd(messages, data) {
246
+ var _a;
247
+ const [index, _aiMsg] = this.findLastPendingAIMessage(messages);
248
+ if (index === -1)
249
+ return messages;
250
+ const newMessages = [...messages];
251
+ this.updateExecutionCost(newMessages, index, (_a = data == null ? void 0 : data.data) == null ? void 0 : _a.uniqueId, data.cost);
252
+ return newMessages;
253
+ }
254
+ // 处理工作流组件开始
255
+ handleComponentStart(messages, data) {
256
+ var _a;
257
+ const [newMessages, index, aiMsg] = this.ensureAIMessageExists(messages);
258
+ const { content } = data;
259
+ const { nodeId, args, componentType } = content;
260
+ const { name } = (0, import_workflowNode.getNodeTemplate)(componentType);
261
+ (_a = aiMsg == null ? void 0 : aiMsg.execute) == null ? void 0 : _a.push({
262
+ id: nodeId || (0, import_uuid.v4)(),
263
+ createdAt: /* @__PURE__ */ new Date(),
264
+ type: "ActionExecutionMessage",
265
+ name: name ? `已调用${name}组件` : "已调用工作流组件",
266
+ arguments: args,
267
+ extra: {
268
+ ...data,
269
+ ...this.getWorkflowIcon()
270
+ }
271
+ });
272
+ newMessages[index] = aiMsg;
273
+ return newMessages;
274
+ }
275
+ // 处理工作流组件结束
276
+ handleComponentEnd(messages, data) {
277
+ var _a;
278
+ const [index, _aiMsg] = this.findLastPendingAIMessage(messages);
279
+ if (index === -1)
280
+ return messages;
281
+ const newMessages = [...messages];
282
+ this.updateExecutionCost(newMessages, index, (_a = data == null ? void 0 : data.content) == null ? void 0 : _a.nodeId, data.cost);
283
+ return newMessages;
284
+ }
285
+ // 处理响应正文
286
+ handleResponse(messages, data) {
287
+ const [newMessages, index, aiMsg] = this.ensureAIMessageExists(messages);
288
+ const { contentType, content, success, errorMsg } = data;
289
+ if (success) {
290
+ if (aiMsg.status === import_XAiMessage.MessageStatus.init) {
291
+ aiMsg.status = import_XAiMessage.MessageStatus.pending;
292
+ }
293
+ if (contentType === "TEXT" && "text" in aiMsg.content) {
294
+ aiMsg.content.text += content;
295
+ }
296
+ } else {
297
+ aiMsg.status = import_XAiMessage.MessageStatus.failed;
298
+ aiMsg.content.text = `<span style="color: red;">❌ ${errorMsg}</span>`;
299
+ }
300
+ newMessages[index] = aiMsg;
301
+ return newMessages;
302
+ }
303
+ // 处理完成
304
+ handleFinish(messages, data) {
305
+ var _a;
306
+ const [index, _aiMsg] = this.findLastPendingAIMessage(messages);
307
+ if (index === -1)
308
+ return messages;
309
+ const newMessages = [...messages];
310
+ const msg = newMessages[index];
311
+ msg.execute = msg.execute || [];
312
+ msg.execute.push({
313
+ id: ((_a = data == null ? void 0 : data.data) == null ? void 0 : _a.uniqueId) || (0, import_uuid.v4)(),
314
+ createdAt: /* @__PURE__ */ new Date(),
315
+ type: "ActionExecutionMessage",
316
+ name: "运行完毕",
317
+ extra: {
318
+ ...data,
319
+ cost: (data == null ? void 0 : data.cost) ? ((data == null ? void 0 : data.cost) / 1e3).toFixed(2) : 0,
320
+ icon: import_completed.default,
321
+ expandIcon: import_completed_black.default
322
+ }
323
+ });
324
+ msg.status = import_XAiMessage.MessageStatus.done;
325
+ return newMessages;
326
+ }
327
+ // 处理响应数据
328
+ processResponse(messages, responseData) {
329
+ if (!(responseData == null ? void 0 : responseData.content) && !(responseData == null ? void 0 : responseData.data))
330
+ return messages;
331
+ let response = responseData.data || responseData.content;
332
+ if (typeof response === "string") {
333
+ response = (0, import_utils.safeJsonParse)(response, {
334
+ action: "RESPONSE" /* response */,
335
+ data: {
336
+ contentType: "TEXT",
337
+ content: "解析响应数据时出错,请重试",
338
+ success: false,
339
+ errorMsg: "响应数据格式错误"
340
+ }
341
+ });
342
+ }
343
+ const { action, data = {} } = response;
344
+ switch (action) {
345
+ case "FOLLOW_UP" /* suggest */:
346
+ return this.handleSuggestion(messages, data);
347
+ case "REASONING" /* reasoning */:
348
+ return this.handleReasoning(messages, data);
349
+ case "REASONING_END" /* reasoningEnd */:
350
+ return this.handleReasoningEnd(messages);
351
+ case "COMPONENT_START" /* componentStart */:
352
+ return this.handleComponentStart(messages, data);
353
+ case "COMPONENT_END" /* componentEnd */:
354
+ return this.handleComponentEnd(messages, data);
355
+ case "RECALL_KNOWLEDGE_START" /* recallKnowledgeStart */:
356
+ return this.handleRecallKnowledgeStart(messages, data);
357
+ case "RECALL_KNOWLEDGE_END" /* recallKnowledgeEnd */:
358
+ return this.handleRecallKnowledgeEnd(messages, data);
359
+ case "INVOKE_AGENT_TOOL_START" /* invokeToolStart */:
360
+ return this.handleInvokeToolStart(messages, data);
361
+ case "INVOKE_AGENT_TOOL_END" /* invokeToolEnd */:
362
+ return this.handleInvokeToolEnd(messages, data);
363
+ case "RESPONSE" /* response */:
364
+ return this.handleResponse(messages, data);
365
+ case "FINISHED" /* finish */:
366
+ return this.handleFinish(messages, data);
367
+ default:
368
+ return messages;
369
+ }
370
+ }
371
+ };
372
+ var useAgentGenerator = (params) => {
373
+ const {
374
+ url,
375
+ token,
376
+ config,
377
+ onError,
378
+ onMessage,
379
+ onSuccess,
380
+ ...rest
381
+ } = params;
86
382
  const textSpeed = 60;
87
383
  const [messages, setMessages] = (0, import_react.useState)([]);
88
384
  const [sessionList, setSessionList] = (0, import_react.useState)([]);
@@ -91,6 +387,7 @@ var useAgentGenerator = ({
91
387
  const [appInfo, setAppInfo] = (0, import_react.useState)(null);
92
388
  const requestInfo = (0, import_react.useRef)({});
93
389
  const { appNo, pt, tc } = config || {};
390
+ const messageProcessor = (0, import_react.useMemo)(() => new MessageProcessor(textSpeed), [textSpeed]);
94
391
  (0, import_react.useEffect)(() => {
95
392
  if (url && config) {
96
393
  const initConfig = async () => {
@@ -134,321 +431,142 @@ var useAgentGenerator = ({
134
431
  }
135
432
  });
136
433
  (0, import_react.useEffect)(() => {
137
- if (!responseData || !responseData.content || !responseData.data)
434
+ if (!responseData)
138
435
  return;
139
- let response = responseData.data || responseData.content;
140
- if (typeof response === "string") {
141
- response = (0, import_utils.safeJsonParse)(response, {
142
- action: "RESPONSE" /* response */,
143
- data: {
144
- contentType: "TEXT",
145
- content: "解析响应数据时出错,请重试",
146
- success: false,
147
- errorMsg: "响应数据格式错误"
148
- }
149
- });
150
- }
151
- setMessages((prevMessages) => {
152
- var _a, _b, _c;
153
- let newMessages = [...prevMessages];
154
- const { action, data } = response;
155
- const { uniqueId, contentType, content, toolType, args, knowledgeType, success = true, errorMsg } = data || {};
156
- if (action === "FOLLOW_UP" /* suggest */) {
157
- const suggestMessageIndex = messages.findIndex((item) => item.type === "SuggestionMessage");
158
- if (suggestMessageIndex === -1) {
159
- const newMessage = {
160
- id: (0, import_uuid.v4)(),
161
- type: "SuggestionMessage",
162
- createdAt: /* @__PURE__ */ new Date(),
163
- status: import_XAiMessage.MessageStatus.done,
164
- role: import_XAiMessage.MessageRole.suggestion,
165
- content: [{
166
- key: (0, import_uuid.v4)(),
167
- description: content
168
- }]
169
- };
170
- newMessages.push(newMessage);
171
- } else {
172
- const suggestMsg = newMessages[suggestMessageIndex];
173
- if (suggestMsg == null ? void 0 : suggestMsg.content) {
174
- suggestMsg.content.push({
175
- key: (0, import_uuid.v4)(),
176
- description: content
177
- });
178
- }
179
- }
180
- return newMessages;
181
- }
182
- const lastAIMsgIndex = [...prevMessages].findLastIndex(
183
- (m) => m.role === import_XAiMessage.MessageRole.assistant && m.type === "TextMessage" && (m.status === "init" || m.status === "pending")
184
- );
185
- const realIndex = lastAIMsgIndex === -1 ? -1 : prevMessages.length - 1 - lastAIMsgIndex;
186
- const lastAIMsg = realIndex !== -1 ? prevMessages[realIndex] : null;
187
- let aiMsg;
188
- if (!lastAIMsg) {
189
- aiMsg = {
190
- id: (0, import_uuid.v4)(),
191
- type: "TextMessage",
192
- createdAt: /* @__PURE__ */ new Date(),
193
- role: import_XAiMessage.MessageRole.assistant,
194
- content: { text: "" },
195
- execute: [],
196
- status: import_XAiMessage.MessageStatus.init
197
- };
198
- newMessages.push(aiMsg);
199
- } else if (lastAIMsg.type === "TextMessage") {
200
- aiMsg = { ...lastAIMsg };
201
- } else if (lastAIMsg.type === "ImageMessage") {
202
- aiMsg = void 0;
203
- }
204
- if (!aiMsg) {
205
- return newMessages;
206
- }
207
- switch (action) {
208
- case "REASONING_END" /* reasoningEnd */:
209
- aiMsg.thinks += "/n";
210
- break;
211
- case "REASONING" /* reasoning */:
212
- aiMsg.thinks += content;
213
- break;
214
- case "RECALL_KNOWLEDGE_START" /* recallKnowledgeStart */:
215
- aiMsg.execute = aiMsg.execute || [];
216
- aiMsg.execute.push({
217
- id: uniqueId,
218
- createdAt: /* @__PURE__ */ new Date(),
219
- type: "ActionExecutionMessage",
220
- name: knowledgeType === "DOCUMENT" ? "已搜索文档知识库" : "已搜索问答知识库",
221
- arguments: args,
222
- extra: {
223
- ...data,
224
- icon: knowledgeType === "DOCUMENT" ? import_document.default : import_qa.default,
225
- expandIcon: knowledgeType === "DOCUMENT" ? import_document_black.default : import_qa_black.default
226
- }
227
- });
228
- break;
229
- case "RECALL_KNOWLEDGE_END" /* recallKnowledgeEnd */: {
230
- const recallKnowledgeMsg = (_a = aiMsg.execute) == null ? void 0 : _a.find((item) => item.id === uniqueId);
231
- if (recallKnowledgeMsg) {
232
- recallKnowledgeMsg.extra.cost = (data == null ? void 0 : data.cost) ? ((data == null ? void 0 : data.cost) / 1e3).toFixed(2) : 0;
233
- }
234
- break;
235
- }
236
- case "INVOKE_AGENT_TOOL_START" /* invokeToolStart */:
237
- aiMsg.execute = aiMsg.execute || [];
238
- aiMsg.execute.push({
239
- id: uniqueId,
240
- createdAt: /* @__PURE__ */ new Date(),
241
- type: "ActionExecutionMessage",
242
- name: toolType === "SKILL" ? "已调用工作流" : "已调用工具",
243
- arguments: args,
244
- extra: {
245
- ...data,
246
- icon: toolType === "SKILL" ? import_skillNo.default : import_tools.default,
247
- expandIcon: toolType === "SKILL" ? import_skillNo_black.default : import_tools_black.default
248
- }
249
- });
250
- break;
251
- case "INVOKE_AGENT_TOOL_END" /* invokeToolEnd */: {
252
- const invokeToolMsg = (_b = aiMsg.execute) == null ? void 0 : _b.find((item) => item.id === uniqueId);
253
- if (invokeToolMsg) {
254
- invokeToolMsg.extra.cost = (data == null ? void 0 : data.cost) ? ((data == null ? void 0 : data.cost) / 1e3).toFixed(2) : 0;
255
- }
256
- break;
257
- }
258
- case "RESPONSE" /* response */:
259
- if (success) {
260
- if (aiMsg.status === import_XAiMessage.MessageStatus.init) {
261
- aiMsg.status = import_XAiMessage.MessageStatus.pending;
262
- }
263
- if (contentType === "TEXT" && "text" in aiMsg.content) {
264
- aiMsg.content.text += content;
265
- }
266
- } else {
267
- aiMsg.status = import_XAiMessage.MessageStatus.failed;
268
- aiMsg.content.text = `<span style="color: red;">❌ ${errorMsg}</span>`;
269
- }
270
- break;
271
- case "FINISHED" /* finish */:
272
- aiMsg.status = import_XAiMessage.MessageStatus.done;
273
- onMessage == null ? void 0 : onMessage((_c = aiMsg == null ? void 0 : aiMsg.content) == null ? void 0 : _c.text, aiMsg);
274
- initAppConversations(false);
275
- break;
276
- }
277
- if (lastAIMsg && lastAIMsg.type === "TextMessage") {
278
- newMessages[realIndex] = aiMsg;
279
- } else if (!lastAIMsg) {
280
- if (newMessages.length > 0 && newMessages[newMessages.length - 1].type === "TextMessage") {
281
- newMessages[newMessages.length - 1] = aiMsg;
282
- } else {
283
- newMessages = [...newMessages, aiMsg];
284
- }
285
- }
286
- return newMessages;
287
- });
288
- }, [responseData]);
289
- const setMessage = async (messageType, content) => {
436
+ setMessages(
437
+ (prev) => messageProcessor.processResponse(prev, responseData)
438
+ );
439
+ }, [responseData, messageProcessor]);
440
+ const setMessage = (0, import_react.useCallback)(async (messageType, content) => {
290
441
  switch (messageType) {
291
442
  case "prologue": {
292
443
  setMessages((prev) => {
293
- const prologueMessageIndex = prev.findIndex((item) => {
444
+ const prologueIndex = prev.findIndex((item) => {
294
445
  var _a;
295
446
  return (_a = item.extra) == null ? void 0 : _a.prologue;
296
447
  });
297
- if (prologueMessageIndex === -1) {
448
+ if (prologueIndex === -1) {
298
449
  const newMessage = {
299
450
  type: "TextMessage",
300
451
  id: (0, import_uuid.v4)(),
301
452
  createdAt: /* @__PURE__ */ new Date(),
302
453
  role: import_XAiMessage.MessageRole.assistant,
303
454
  status: import_XAiMessage.MessageStatus.done,
304
- content: {
305
- text: content
306
- },
307
- extra: {
308
- prologue: true,
309
- noFooter: true
310
- }
455
+ content: { text: content },
456
+ extra: { prologue: true, noFooter: true }
311
457
  };
312
458
  return [newMessage, ...prev];
313
459
  }
314
- return prev.map((item) => {
315
- var _a;
316
- if (((_a = item.extra) == null ? void 0 : _a.prologue) && item.content && "text" in item.content) {
317
- item.content.text = content;
460
+ return prev.map(
461
+ (item) => {
462
+ var _a;
463
+ return ((_a = item.extra) == null ? void 0 : _a.prologue) && item.content && "text" in item.content ? { ...item, content: { text: content } } : item;
318
464
  }
319
- return item;
320
- });
465
+ );
321
466
  });
322
467
  break;
323
468
  }
324
469
  case "suggest": {
325
470
  setMessages((prev) => {
326
- const suggestMessageIndex = prev.findIndex((item) => item.type === "SuggestionMessage");
327
- if (suggestMessageIndex === -1) {
328
- const prologueMessageIndex = prev.findIndex((item) => {
329
- var _a;
330
- return (_a = item.extra) == null ? void 0 : _a.prologue;
331
- });
332
- const newMessage = {
333
- id: (0, import_uuid.v4)(),
334
- type: "SuggestionMessage",
335
- createdAt: /* @__PURE__ */ new Date(),
336
- status: import_XAiMessage.MessageStatus.done,
337
- role: import_XAiMessage.MessageRole.suggestion,
338
- content
339
- };
340
- if (prologueMessageIndex === -1) {
341
- return [newMessage, ...prev];
342
- }
471
+ const suggestIndex = prev.findIndex((item) => item.type === "SuggestionMessage");
472
+ const prologueIndex = prev.findIndex((item) => {
473
+ var _a;
474
+ return (_a = item.extra) == null ? void 0 : _a.prologue;
475
+ });
476
+ const newSuggestion = {
477
+ id: (0, import_uuid.v4)(),
478
+ type: "SuggestionMessage",
479
+ createdAt: /* @__PURE__ */ new Date(),
480
+ status: import_XAiMessage.MessageStatus.done,
481
+ role: import_XAiMessage.MessageRole.suggestion,
482
+ content
483
+ };
484
+ if (suggestIndex === -1) {
343
485
  const newMessages = [...prev];
344
- newMessages.splice(prologueMessageIndex + 1, 0, newMessage);
486
+ const insertIndex = prologueIndex === -1 ? 0 : prologueIndex + 1;
487
+ newMessages.splice(insertIndex, 0, newSuggestion);
345
488
  return newMessages;
346
489
  }
347
- return prev.map((item) => {
348
- if (item.type === "SuggestionMessage") {
349
- item.content = content;
350
- }
351
- return item;
352
- });
490
+ return prev.map(
491
+ (item) => item.type === "SuggestionMessage" ? { ...item, content } : item
492
+ );
353
493
  });
354
494
  break;
355
495
  }
356
496
  default:
357
- break;
497
+ console.warn(`Unknown message type: ${messageType}`);
358
498
  }
359
- };
360
- const chat = async (content) => {
361
- let newMessage;
362
- let inputs_msg;
363
- if (typeof content === "string") {
364
- newMessage = {
499
+ }, []);
500
+ const chat = async (content, extra, insert = true) => {
501
+ if (insert) {
502
+ const newMessage = {
365
503
  type: "TextMessage",
366
504
  id: (0, import_uuid.v4)(),
367
505
  createdAt: /* @__PURE__ */ new Date(),
368
506
  role: import_XAiMessage.MessageRole.user,
369
507
  status: import_XAiMessage.MessageStatus.done,
370
- content: {
371
- text: content
372
- }
508
+ extra,
509
+ content: { text: content }
373
510
  };
374
- } else {
375
- newMessage = {
376
- type: "TextMessage",
377
- id: (0, import_uuid.v4)(),
378
- createdAt: /* @__PURE__ */ new Date(),
379
- role: import_XAiMessage.MessageRole.user,
380
- status: import_XAiMessage.MessageStatus.done,
381
- content: {
382
- text: content
383
- },
384
- ...content
385
- };
386
- }
387
- if (typeof newMessage.content === "object" && "text" in newMessage.content && typeof newMessage.content.text === "string") {
388
- inputs_msg = newMessage.content.text;
389
- } else {
390
- inputs_msg = "";
511
+ setMessages((prev) => {
512
+ const newMessages = prev.filter((item) => item.type !== "SuggestionMessage");
513
+ newMessages.push(newMessage);
514
+ return newMessages;
515
+ });
391
516
  }
392
- setMessages((prev) => {
393
- const suggestMessageIndex = messages.findIndex((item) => item.type === "SuggestionMessage");
394
- if (suggestMessageIndex !== -1) {
395
- prev.splice(suggestMessageIndex, 1);
396
- }
397
- prev.push(newMessage);
398
- return prev;
399
- });
517
+ let requestBody = {
518
+ appParams: {
519
+ inputs_msg: content
520
+ },
521
+ sessionId: currentSessionId
522
+ };
400
523
  start(
401
524
  `${url}/appouter/${appNo}/sendMsg?pt=${pt}&tc=${tc}`,
402
- {
403
- appParams: {
404
- inputs_msg
405
- },
406
- sessionId: currentSessionId
407
- },
525
+ requestBody,
408
526
  {
409
527
  Authorization: `Bearer ${token}`
410
528
  }
411
529
  );
412
530
  };
413
- const reChat = () => {
414
- setMessages((prevMessages) => {
415
- const lastAIMsgIndex = [...prevMessages].findLastIndex(
531
+ const reChat = (0, import_react.useCallback)(() => {
532
+ setMessages((prev) => {
533
+ var _a;
534
+ const newMessages = [...prev];
535
+ const lastAIIndex = newMessages == null ? void 0 : newMessages.findLastIndex(
416
536
  (m) => m.role === import_XAiMessage.MessageRole.assistant && m.type === "TextMessage"
417
537
  );
418
- const newMessages = [...prevMessages];
419
- if (lastAIMsgIndex !== -1) {
420
- const realIndex = newMessages.length - 1 - lastAIMsgIndex;
421
- newMessages.splice(realIndex, 1);
538
+ if (lastAIIndex !== -1) {
539
+ newMessages.splice(lastAIIndex, 1);
422
540
  }
423
- const suggestMessageIndex = newMessages.findIndex((item) => item.type === "SuggestionMessage");
424
- if (suggestMessageIndex !== -1) {
425
- newMessages.splice(suggestMessageIndex, 1);
541
+ const suggestIndex = newMessages.findIndex((item) => item.type === "SuggestionMessage");
542
+ if (suggestIndex !== -1) {
543
+ newMessages.splice(suggestIndex, 1);
426
544
  }
427
- const lastUserMsg = [...newMessages].findLast(
545
+ const lastUserMsg = newMessages.findLast(
428
546
  (m) => m.role === import_XAiMessage.MessageRole.user && m.type === "TextMessage"
429
547
  );
430
- if (lastUserMsg && lastUserMsg.content && typeof lastUserMsg.content.text === "string") {
431
- chat(lastUserMsg.content.text);
548
+ if ((_a = lastUserMsg == null ? void 0 : lastUserMsg.content) == null ? void 0 : _a.text) {
549
+ setTimeout(() => {
550
+ chat(lastUserMsg.content.text, lastUserMsg.extra, false);
551
+ }, 0);
432
552
  }
433
553
  return newMessages;
434
554
  });
435
- };
555
+ }, [chat]);
436
556
  const stopChat = () => {
437
557
  stop();
438
- setMessages((prevMessages) => {
439
- const newMessages = [...prevMessages];
440
- newMessages.forEach((m) => {
441
- if (m.status === import_XAiMessage.MessageStatus.pending) {
442
- m.status = import_XAiMessage.MessageStatus.done;
443
- } else if (m.status === import_XAiMessage.MessageStatus.init) {
444
- if (m.type === "TextMessage") {
445
- m.content.text = '<span style="color: #cbcbcb;">用户已取消</span>';
558
+ setMessages(
559
+ (prev) => prev.map((m) => {
560
+ if (m.status === import_XAiMessage.MessageStatus.pending || m.status === import_XAiMessage.MessageStatus.init) {
561
+ const newMsg = { ...m, status: import_XAiMessage.MessageStatus.done };
562
+ if (m.type === "TextMessage" && m.status === import_XAiMessage.MessageStatus.init) {
563
+ newMsg.content.text = '<span style="color: #cbcbcb;">用户已取消</span>';
446
564
  }
447
- m.status = import_XAiMessage.MessageStatus.done;
565
+ return newMsg;
448
566
  }
449
- });
450
- return newMessages;
451
- });
567
+ return m;
568
+ })
569
+ );
452
570
  };
453
571
  const formatMessages = (data, init = false) => {
454
572
  setMessages((prev) => {