@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.
- package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js +0 -16
- package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js.map +2 -2
- package/dist/cjs/components/XAiChatbot/index.js +4 -6
- package/dist/cjs/components/XAiChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAiChatbot/styles.js +1 -0
- package/dist/cjs/components/XAiChatbot/styles.js.map +2 -2
- package/dist/cjs/components/XAiProvider/XAiProvider.stories.js +2 -2
- package/dist/cjs/components/XAiProvider/XAiProvider.stories.js.map +1 -1
- package/dist/cjs/hooks/useAgentGenerator.d.ts +20 -16
- package/dist/cjs/hooks/useAgentGenerator.js +384 -266
- package/dist/cjs/hooks/useAgentGenerator.js.map +3 -3
- package/dist/cjs/types/XAiChatbot.d.ts +2 -1
- package/dist/cjs/types/XAiChatbot.js.map +1 -1
- package/dist/cjs/types/XAiMessage.d.ts +2 -16
- package/dist/cjs/types/XAiMessage.js.map +2 -2
- package/dist/cjs/types/node.d.ts +10 -0
- package/dist/cjs/types/node.js +18 -0
- package/dist/cjs/types/node.js.map +7 -0
- package/dist/cjs/utils/workflowNode.d.ts +2 -0
- package/dist/cjs/utils/workflowNode.js +169 -0
- package/dist/cjs/utils/workflowNode.js.map +7 -0
- package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js +0 -15
- package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js.map +1 -1
- package/dist/esm/components/XAiChatbot/index.js +4 -20
- package/dist/esm/components/XAiChatbot/index.js.map +1 -1
- package/dist/esm/components/XAiChatbot/styles.js +1 -1
- package/dist/esm/components/XAiChatbot/styles.js.map +1 -1
- package/dist/esm/components/XAiProvider/XAiProvider.stories.js +2 -2
- package/dist/esm/components/XAiProvider/XAiProvider.stories.js.map +1 -1
- package/dist/esm/hooks/useAgentGenerator.d.ts +20 -16
- package/dist/esm/hooks/useAgentGenerator.js +541 -339
- package/dist/esm/hooks/useAgentGenerator.js.map +1 -1
- package/dist/esm/types/XAiChatbot.d.ts +2 -1
- package/dist/esm/types/XAiChatbot.js.map +1 -1
- package/dist/esm/types/XAiMessage.d.ts +2 -16
- package/dist/esm/types/XAiMessage.js +0 -4
- package/dist/esm/types/XAiMessage.js.map +1 -1
- package/dist/esm/types/node.d.ts +10 -0
- package/dist/esm/types/node.js +2 -0
- package/dist/esm/types/node.js.map +1 -0
- package/dist/esm/utils/workflowNode.d.ts +2 -0
- package/dist/esm/utils/workflowNode.js +141 -0
- package/dist/esm/utils/workflowNode.js.map +1 -0
- package/dist/umd/chat-sdk.min.js +1 -1
- 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
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
434
|
+
if (!responseData)
|
|
138
435
|
return;
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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(
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
item.content.text
|
|
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
|
-
|
|
320
|
-
});
|
|
465
|
+
);
|
|
321
466
|
});
|
|
322
467
|
break;
|
|
323
468
|
}
|
|
324
469
|
case "suggest": {
|
|
325
470
|
setMessages((prev) => {
|
|
326
|
-
const
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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
|
-
|
|
486
|
+
const insertIndex = prologueIndex === -1 ? 0 : prologueIndex + 1;
|
|
487
|
+
newMessages.splice(insertIndex, 0, newSuggestion);
|
|
345
488
|
return newMessages;
|
|
346
489
|
}
|
|
347
|
-
return prev.map(
|
|
348
|
-
|
|
349
|
-
|
|
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
|
-
|
|
497
|
+
console.warn(`Unknown message type: ${messageType}`);
|
|
358
498
|
}
|
|
359
|
-
};
|
|
360
|
-
const chat = async (content) => {
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
}
|
|
508
|
+
extra,
|
|
509
|
+
content: { text: content }
|
|
373
510
|
};
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
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((
|
|
415
|
-
|
|
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
|
-
|
|
419
|
-
|
|
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
|
|
424
|
-
if (
|
|
425
|
-
newMessages.splice(
|
|
541
|
+
const suggestIndex = newMessages.findIndex((item) => item.type === "SuggestionMessage");
|
|
542
|
+
if (suggestIndex !== -1) {
|
|
543
|
+
newMessages.splice(suggestIndex, 1);
|
|
426
544
|
}
|
|
427
|
-
const lastUserMsg =
|
|
545
|
+
const lastUserMsg = newMessages.findLast(
|
|
428
546
|
(m) => m.role === import_XAiMessage.MessageRole.user && m.type === "TextMessage"
|
|
429
547
|
);
|
|
430
|
-
if (lastUserMsg
|
|
431
|
-
|
|
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(
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
m.status
|
|
443
|
-
|
|
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
|
-
|
|
565
|
+
return newMsg;
|
|
448
566
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
567
|
+
return m;
|
|
568
|
+
})
|
|
569
|
+
);
|
|
452
570
|
};
|
|
453
571
|
const formatMessages = (data, init = false) => {
|
|
454
572
|
setMessages((prev) => {
|