@ai-group/chat-sdk 3.4.5 → 3.5.0-alpha1
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/FolderTree/styles.js +2 -1
- package/dist/cjs/components/FolderTree/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +433 -389
- package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +22 -3
- package/dist/cjs/components/XAdkSender/index.js.map +2 -2
- package/dist/cjs/components/XAdkThoughtChain/styles.d.ts +0 -1
- package/dist/cjs/components/XAdkThoughtChain/styles.js +0 -9
- package/dist/cjs/components/XAdkThoughtChain/styles.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.js +2 -0
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/presets/xGroupAdk.js +0 -1
- package/dist/cjs/presets/xGroupAdk.js.map +2 -2
- package/dist/cjs/types/XAdkChatbot.d.ts +12 -0
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkSender.d.ts +6 -0
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/cjs/utils/umdEntry.d.ts +25 -1
- package/dist/cjs/utils/umdEntry.js +126 -41
- package/dist/cjs/utils/umdEntry.js.map +3 -3
- package/dist/esm/components/FolderTree/styles.js +1 -1
- package/dist/esm/components/FolderTree/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
- package/dist/esm/components/XAdkChatbot/index.js +69 -14
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +28 -5
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/components/XAdkThoughtChain/styles.d.ts +0 -1
- package/dist/esm/components/XAdkThoughtChain/styles.js +19 -20
- package/dist/esm/components/XAdkThoughtChain/styles.js.map +1 -1
- package/dist/esm/hooks/useADKChat.js +10 -6
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/presets/xGroupAdk.js +0 -1
- package/dist/esm/presets/xGroupAdk.js.map +1 -1
- package/dist/esm/types/XAdkChatbot.d.ts +12 -0
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +6 -0
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/esm/utils/umdEntry.d.ts +25 -1
- package/dist/esm/utils/umdEntry.js +162 -70
- package/dist/esm/utils/umdEntry.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -36,9 +36,88 @@ var import_react = require("react");
|
|
|
36
36
|
var import_client = __toESM(require("react-dom/client"));
|
|
37
37
|
var import_XAdkProvider = __toESM(require("../components/XAdkProvider"));
|
|
38
38
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
39
|
+
var SDKWrapper = (0, import_react.forwardRef)(
|
|
40
|
+
({
|
|
41
|
+
token: initialToken,
|
|
42
|
+
showSessionList,
|
|
43
|
+
allowUpload,
|
|
44
|
+
draggable,
|
|
45
|
+
clearBtnShow,
|
|
46
|
+
...rest
|
|
47
|
+
}, ref) => {
|
|
48
|
+
const [token, setToken] = (0, import_react.useState)(initialToken);
|
|
49
|
+
const providerRef = (0, import_react.createRef)();
|
|
50
|
+
(0, import_react.useImperativeHandle)(
|
|
51
|
+
ref,
|
|
52
|
+
() => ({
|
|
53
|
+
setToken,
|
|
54
|
+
startChat: (content) => {
|
|
55
|
+
var _a;
|
|
56
|
+
return (_a = providerRef.current) == null ? void 0 : _a.startChat(content);
|
|
57
|
+
},
|
|
58
|
+
stopChat: () => {
|
|
59
|
+
var _a;
|
|
60
|
+
return (_a = providerRef.current) == null ? void 0 : _a.stopChat();
|
|
61
|
+
},
|
|
62
|
+
reChat: () => {
|
|
63
|
+
var _a;
|
|
64
|
+
return (_a = providerRef.current) == null ? void 0 : _a.reChat();
|
|
65
|
+
},
|
|
66
|
+
clearChat: () => {
|
|
67
|
+
var _a;
|
|
68
|
+
return (_a = providerRef.current) == null ? void 0 : _a.clearChat();
|
|
69
|
+
},
|
|
70
|
+
deleteSession: (id) => {
|
|
71
|
+
var _a;
|
|
72
|
+
return (_a = providerRef.current) == null ? void 0 : _a.deleteSession(id);
|
|
73
|
+
},
|
|
74
|
+
updateSession: (id, title) => {
|
|
75
|
+
var _a;
|
|
76
|
+
return (_a = providerRef.current) == null ? void 0 : _a.updateSession(id, title);
|
|
77
|
+
},
|
|
78
|
+
getAppInfo: () => {
|
|
79
|
+
var _a;
|
|
80
|
+
return (_a = providerRef.current) == null ? void 0 : _a.getAppInfo();
|
|
81
|
+
},
|
|
82
|
+
getMessages: () => {
|
|
83
|
+
var _a;
|
|
84
|
+
return ((_a = providerRef.current) == null ? void 0 : _a.getMessages()) ?? [];
|
|
85
|
+
},
|
|
86
|
+
getSessions: () => {
|
|
87
|
+
var _a;
|
|
88
|
+
return ((_a = providerRef.current) == null ? void 0 : _a.getSessions()) ?? [];
|
|
89
|
+
},
|
|
90
|
+
setMessages: (msgs) => {
|
|
91
|
+
var _a;
|
|
92
|
+
return (_a = providerRef.current) == null ? void 0 : _a.setMessages(msgs);
|
|
93
|
+
},
|
|
94
|
+
setCurrentSession: (id) => {
|
|
95
|
+
var _a;
|
|
96
|
+
return (_a = providerRef.current) == null ? void 0 : _a.setCurrentSession(id);
|
|
97
|
+
},
|
|
98
|
+
setStateDelta: (delta) => {
|
|
99
|
+
var _a;
|
|
100
|
+
return (_a = providerRef.current) == null ? void 0 : _a.setStateDelta(delta);
|
|
101
|
+
}
|
|
102
|
+
}),
|
|
103
|
+
[providerRef]
|
|
104
|
+
);
|
|
105
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: providerRef, ...rest, token, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
106
|
+
import_XAdkProvider.default.DefaultLayout,
|
|
107
|
+
{
|
|
108
|
+
showSessionList,
|
|
109
|
+
allowUpload,
|
|
110
|
+
draggable,
|
|
111
|
+
clearBtnShow,
|
|
112
|
+
showFnCallDetail: true
|
|
113
|
+
}
|
|
114
|
+
) });
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
SDKWrapper.displayName = "SDKWrapper";
|
|
39
118
|
var XAiWebSDK = class {
|
|
40
119
|
constructor(container, props) {
|
|
41
|
-
this.
|
|
120
|
+
this.wrapperRef = (0, import_react.createRef)();
|
|
42
121
|
this.container = container;
|
|
43
122
|
this.props = props;
|
|
44
123
|
this.onError = props.onError;
|
|
@@ -53,34 +132,22 @@ var XAiWebSDK = class {
|
|
|
53
132
|
const allowUpload = config.allowUpload ?? false;
|
|
54
133
|
const draggable = config.draggable ?? true;
|
|
55
134
|
const clearBtnShow = ((_b = config.chatProps) == null ? void 0 : _b.clearBtnShow) ?? true;
|
|
135
|
+
const element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
136
|
+
SDKWrapper,
|
|
137
|
+
{
|
|
138
|
+
ref: this.wrapperRef,
|
|
139
|
+
...this.props,
|
|
140
|
+
showSessionList,
|
|
141
|
+
allowUpload,
|
|
142
|
+
draggable,
|
|
143
|
+
clearBtnShow
|
|
144
|
+
}
|
|
145
|
+
) });
|
|
56
146
|
if (import_client.default.createRoot) {
|
|
57
147
|
this.root = import_client.default.createRoot(this.container);
|
|
58
|
-
this.root.render(
|
|
59
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: this.providerRef, ...this.props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
-
import_XAdkProvider.default.DefaultLayout,
|
|
61
|
-
{
|
|
62
|
-
showSessionList,
|
|
63
|
-
allowUpload,
|
|
64
|
-
draggable,
|
|
65
|
-
clearBtnShow,
|
|
66
|
-
showFnCallDetail: true
|
|
67
|
-
}
|
|
68
|
-
) }) })
|
|
69
|
-
);
|
|
148
|
+
this.root.render(element);
|
|
70
149
|
} else {
|
|
71
|
-
import_client.default.render(
|
|
72
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: this.providerRef, ...this.props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
73
|
-
import_XAdkProvider.default.DefaultLayout,
|
|
74
|
-
{
|
|
75
|
-
showSessionList,
|
|
76
|
-
allowUpload,
|
|
77
|
-
draggable,
|
|
78
|
-
clearBtnShow,
|
|
79
|
-
showFnCallDetail: true
|
|
80
|
-
}
|
|
81
|
-
) }) }),
|
|
82
|
-
this.container
|
|
83
|
-
);
|
|
150
|
+
import_client.default.render(element, this.container);
|
|
84
151
|
}
|
|
85
152
|
}
|
|
86
153
|
unmount() {
|
|
@@ -151,6 +218,24 @@ var XAiWebSDK = class {
|
|
|
151
218
|
return this.initChatbot(props);
|
|
152
219
|
}
|
|
153
220
|
// ————对外暴露的方法————
|
|
221
|
+
/**
|
|
222
|
+
* 动态更新认证 token
|
|
223
|
+
*
|
|
224
|
+
* 用于 token 过期后刷新,更新后后续的 API 请求将使用新 token,无需重新初始化 SDK。
|
|
225
|
+
*
|
|
226
|
+
* @param token - 新的认证 token
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```javascript
|
|
230
|
+
* // 监听到 token 过期后
|
|
231
|
+
* const newToken = await refreshToken();
|
|
232
|
+
* sdk.setToken(newToken);
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
setToken(token) {
|
|
236
|
+
var _a;
|
|
237
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setToken(token);
|
|
238
|
+
}
|
|
154
239
|
/**
|
|
155
240
|
* 获取当前数据(聚合方法)
|
|
156
241
|
* @returns 应用信息、消息列表、会话列表
|
|
@@ -158,9 +243,9 @@ var XAiWebSDK = class {
|
|
|
158
243
|
getData() {
|
|
159
244
|
var _a, _b, _c;
|
|
160
245
|
return {
|
|
161
|
-
appInfo: (_a = this.
|
|
162
|
-
messages: (_b = this.
|
|
163
|
-
sessions: (_c = this.
|
|
246
|
+
appInfo: (_a = this.wrapperRef.current) == null ? void 0 : _a.getAppInfo(),
|
|
247
|
+
messages: (_b = this.wrapperRef.current) == null ? void 0 : _b.getMessages(),
|
|
248
|
+
sessions: (_c = this.wrapperRef.current) == null ? void 0 : _c.getSessions()
|
|
164
249
|
};
|
|
165
250
|
}
|
|
166
251
|
/**
|
|
@@ -169,7 +254,7 @@ var XAiWebSDK = class {
|
|
|
169
254
|
*/
|
|
170
255
|
getAppInfo() {
|
|
171
256
|
var _a;
|
|
172
|
-
return (_a = this.
|
|
257
|
+
return (_a = this.wrapperRef.current) == null ? void 0 : _a.getAppInfo();
|
|
173
258
|
}
|
|
174
259
|
/**
|
|
175
260
|
* 获取当前会话的消息列表
|
|
@@ -177,7 +262,7 @@ var XAiWebSDK = class {
|
|
|
177
262
|
*/
|
|
178
263
|
getMessages() {
|
|
179
264
|
var _a;
|
|
180
|
-
return (_a = this.
|
|
265
|
+
return (_a = this.wrapperRef.current) == null ? void 0 : _a.getMessages();
|
|
181
266
|
}
|
|
182
267
|
/**
|
|
183
268
|
* 获取会话列表
|
|
@@ -185,7 +270,7 @@ var XAiWebSDK = class {
|
|
|
185
270
|
*/
|
|
186
271
|
getSessions() {
|
|
187
272
|
var _a;
|
|
188
|
-
return (_a = this.
|
|
273
|
+
return (_a = this.wrapperRef.current) == null ? void 0 : _a.getSessions();
|
|
189
274
|
}
|
|
190
275
|
/**
|
|
191
276
|
* 设置消息列表
|
|
@@ -193,7 +278,7 @@ var XAiWebSDK = class {
|
|
|
193
278
|
*/
|
|
194
279
|
setMessages(msgs) {
|
|
195
280
|
var _a;
|
|
196
|
-
(_a = this.
|
|
281
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setMessages(msgs);
|
|
197
282
|
}
|
|
198
283
|
/**
|
|
199
284
|
* 发送消息
|
|
@@ -206,28 +291,28 @@ var XAiWebSDK = class {
|
|
|
206
291
|
*/
|
|
207
292
|
startChat(content) {
|
|
208
293
|
var _a;
|
|
209
|
-
(_a = this.
|
|
294
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.startChat(content);
|
|
210
295
|
}
|
|
211
296
|
/**
|
|
212
297
|
* 停止当前消息生成
|
|
213
298
|
*/
|
|
214
299
|
stopChat() {
|
|
215
300
|
var _a;
|
|
216
|
-
(_a = this.
|
|
301
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.stopChat();
|
|
217
302
|
}
|
|
218
303
|
/**
|
|
219
304
|
* 重新生成最后一条回复
|
|
220
305
|
*/
|
|
221
306
|
reChat() {
|
|
222
307
|
var _a;
|
|
223
|
-
(_a = this.
|
|
308
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.reChat();
|
|
224
309
|
}
|
|
225
310
|
/**
|
|
226
311
|
* 清空当前会话
|
|
227
312
|
*/
|
|
228
313
|
clearChat() {
|
|
229
314
|
var _a;
|
|
230
|
-
(_a = this.
|
|
315
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.clearChat();
|
|
231
316
|
}
|
|
232
317
|
/**
|
|
233
318
|
* 切换到指定会话
|
|
@@ -235,7 +320,7 @@ var XAiWebSDK = class {
|
|
|
235
320
|
*/
|
|
236
321
|
setCurrentSession(sessionId) {
|
|
237
322
|
var _a;
|
|
238
|
-
(_a = this.
|
|
323
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setCurrentSession(sessionId);
|
|
239
324
|
}
|
|
240
325
|
/**
|
|
241
326
|
* 删除指定会话
|
|
@@ -243,7 +328,7 @@ var XAiWebSDK = class {
|
|
|
243
328
|
*/
|
|
244
329
|
deleteSession(sessionId) {
|
|
245
330
|
var _a;
|
|
246
|
-
(_a = this.
|
|
331
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.deleteSession(sessionId);
|
|
247
332
|
}
|
|
248
333
|
/**
|
|
249
334
|
* 更新会话标题
|
|
@@ -252,7 +337,7 @@ var XAiWebSDK = class {
|
|
|
252
337
|
*/
|
|
253
338
|
updateSession(sessionId, title) {
|
|
254
339
|
var _a;
|
|
255
|
-
(_a = this.
|
|
340
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.updateSession(sessionId, title);
|
|
256
341
|
}
|
|
257
342
|
/**
|
|
258
343
|
* 设置自定义业务参数 (stateDelta)
|
|
@@ -261,7 +346,7 @@ var XAiWebSDK = class {
|
|
|
261
346
|
*/
|
|
262
347
|
setStateDelta(delta) {
|
|
263
348
|
var _a;
|
|
264
|
-
(_a = this.
|
|
349
|
+
(_a = this.wrapperRef.current) == null ? void 0 : _a.setStateDelta(delta);
|
|
265
350
|
}
|
|
266
351
|
};
|
|
267
352
|
window.XAiWebSDK = XAiWebSDK;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/utils/umdEntry.tsx"],
|
|
4
|
-
"sourcesContent": ["import { createRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import { createRef, useState, useImperativeHandle, forwardRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * 内部包装组件:管理 token 状态,支持运行时动态更新\n */\ninterface WrapperHandle extends XAdkProviderHandle {\n setToken: (token: string) => void;\n}\n\ninterface WrapperProps extends Omit<XAdkSDKProps, \"children\"> {\n showSessionList: boolean;\n allowUpload: boolean;\n draggable: boolean;\n clearBtnShow: boolean;\n}\n\nconst SDKWrapper = forwardRef<WrapperHandle, WrapperProps>(\n (\n {\n token: initialToken,\n showSessionList,\n allowUpload,\n draggable,\n clearBtnShow,\n ...rest\n },\n ref,\n ) => {\n const [token, setToken] = useState(initialToken);\n const providerRef = createRef<XAdkProviderHandle>();\n\n useImperativeHandle(\n ref,\n () => ({\n setToken,\n startChat: (content: SendContent) =>\n providerRef.current?.startChat(content),\n stopChat: () => providerRef.current?.stopChat(),\n reChat: () => providerRef.current?.reChat(),\n clearChat: () => providerRef.current?.clearChat(),\n deleteSession: (id: string) =>\n providerRef.current?.deleteSession(id),\n updateSession: (id: string, title: string) =>\n providerRef.current?.updateSession(id, title),\n getAppInfo: () => providerRef.current?.getAppInfo(),\n getMessages: () => providerRef.current?.getMessages() ?? [],\n getSessions: () => providerRef.current?.getSessions() ?? [],\n setMessages: (msgs: IMessage[]) =>\n providerRef.current?.setMessages(msgs),\n setCurrentSession: (id: string) =>\n providerRef.current?.setCurrentSession(id),\n setStateDelta: (delta: Record<string, any> | undefined) =>\n providerRef.current?.setStateDelta(delta),\n }),\n [providerRef],\n );\n\n return (\n <XAdkProvider ref={providerRef} {...rest} token={token}>\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n );\n },\n);\n\nSDKWrapper.displayName = \"SDKWrapper\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n *\n * // token 过期后动态更新\n * sdk.setToken('new-token');\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n wrapperRef = createRef<WrapperHandle>();\n\n // ———— hook ————\n onError?: (error: any) => void;\n\n onSuccess?: (appInfo: any) => void;\n\n onMessage?: (content: string, data: IMessage) => void;\n\n constructor(container: HTMLElement, props: XAdkSDKProps) {\n this.container = container;\n this.props = props;\n this.onError = props.onError;\n this.onSuccess = props.onSuccess;\n this.onMessage = props.onMessage;\n this.mount();\n }\n\n mount() {\n // 提取配置\n const { config = {} } = this.props;\n const showSessionList = config.session?.showSessionList ?? false;\n const allowUpload = config.allowUpload ?? false;\n const draggable = config.draggable ?? true;\n const clearBtnShow = config.chatProps?.clearBtnShow ?? true;\n\n const element = (\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <SDKWrapper\n ref={this.wrapperRef}\n {...this.props}\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n />\n </div>\n );\n\n if (ReactDOM.createRoot) {\n this.root = ReactDOM.createRoot(this.container);\n this.root.render(element);\n } else {\n // 兼容 React 17\n // @ts-ignore\n ReactDOM.render(element, this.container);\n }\n }\n\n unmount() {\n if (this.root && this.root.unmount) {\n this.root.unmount();\n }\n }\n\n /**\n * 初始化聊天机器人(推荐方式)\n *\n * @param props - SDK 配置参数\n * @returns XAiWebSDK 实例\n *\n * @example\n * ```javascript\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true // 显示会话列表\n * },\n * allowUpload: true, // 允许文件上传\n * chatProps: {\n * clearBtnShow: false // 隐藏清空按钮\n * }\n * },\n * componentProps: {\n * id: 'my-chatbot', // 容器 ID\n * width: '100%',\n * height: '600px'\n * }\n * });\n * ```\n */\n static initChatbot(props: XAdkSDKProps): XAiWebSDK {\n let container: HTMLElement;\n\n // 检查是否有指定的 componentProps.id\n if (props.componentProps?.id) {\n const existingContainer = document.getElementById(\n props.componentProps.id,\n );\n if (existingContainer) {\n container = existingContainer;\n } else {\n // 如果指定的 ID 不存在,创建新元素\n container = document.createElement(\"div\");\n container.id = props.componentProps.id;\n }\n } else {\n // 没有指定 ID,创建默认容器\n container = document.createElement(\"div\");\n container.id = \"xai-chatbot-container\";\n }\n\n // 设置容器样式 - 将除了 id 以外的所有属性都应用到容器\n if (props.componentProps) {\n const { id, ...styleProps } = props.componentProps;\n Object.assign(container.style, styleProps);\n }\n\n // 如果容器不在 DOM 中,添加到 body\n if (!container.parentNode) {\n document.body.appendChild(container);\n }\n\n return new XAiWebSDK(container, props);\n }\n\n /**\n * 兼容旧版本的静态方法\n * @deprecated 使用 initChatbot 替代\n */\n static create(props: XAdkSDKProps): XAiWebSDK {\n return this.initChatbot(props);\n }\n\n // ————对外暴露的方法————\n\n /**\n * 动态更新认证 token\n *\n * 用于 token 过期后刷新,更新后后续的 API 请求将使用新 token,无需重新初始化 SDK。\n *\n * @param token - 新的认证 token\n *\n * @example\n * ```javascript\n * // 监听到 token 过期后\n * const newToken = await refreshToken();\n * sdk.setToken(newToken);\n * ```\n */\n setToken(token: string) {\n this.wrapperRef.current?.setToken(token);\n }\n\n /**\n * 获取当前数据(聚合方法)\n * @returns 应用信息、消息列表、会话列表\n */\n getData() {\n return {\n appInfo: this.wrapperRef.current?.getAppInfo(),\n messages: this.wrapperRef.current?.getMessages(),\n sessions: this.wrapperRef.current?.getSessions(),\n };\n }\n\n /**\n * 获取应用信息\n * @returns 应用信息\n */\n getAppInfo() {\n return this.wrapperRef.current?.getAppInfo();\n }\n\n /**\n * 获取当前会话的消息列表\n * @returns 消息列表\n */\n getMessages() {\n return this.wrapperRef.current?.getMessages();\n }\n\n /**\n * 获取会话列表\n * @returns 会话列表\n */\n getSessions() {\n return this.wrapperRef.current?.getSessions();\n }\n\n /**\n * 设置消息列表\n * @param msgs - 要设置的消息数组\n */\n setMessages(msgs: IMessage[]) {\n this.wrapperRef.current?.setMessages(msgs);\n }\n\n /**\n * 发送消息\n * @param content - 消息内容\n *\n * @example\n * ```javascript\n * sdk.startChat({ text: 'Hello!' });\n * ```\n */\n startChat(content: SendContent) {\n this.wrapperRef.current?.startChat(content);\n }\n\n /**\n * 停止当前消息生成\n */\n stopChat() {\n this.wrapperRef.current?.stopChat();\n }\n\n /**\n * 重新生成最后一条回复\n */\n reChat() {\n this.wrapperRef.current?.reChat();\n }\n\n /**\n * 清空当前会话\n */\n clearChat() {\n this.wrapperRef.current?.clearChat();\n }\n\n /**\n * 切换到指定会话\n * @param sessionId - 会话 ID\n */\n setCurrentSession(sessionId: string) {\n this.wrapperRef.current?.setCurrentSession(sessionId);\n }\n\n /**\n * 删除指定会话\n * @param sessionId - 会话 ID\n */\n deleteSession(sessionId: string) {\n this.wrapperRef.current?.deleteSession(sessionId);\n }\n\n /**\n * 更新会话标题\n * @param sessionId - 会话 ID\n * @param title - 新标题\n */\n updateSession(sessionId: string, title: string) {\n this.wrapperRef.current?.updateSession(sessionId, title);\n }\n\n /**\n * 设置自定义业务参数 (stateDelta)\n * 设置后每次发送消息时会自动携带至后端\n * @param delta - 自定义参数,传入 undefined 可清除\n */\n setStateDelta(delta: Record<string, any> | undefined) {\n this.wrapperRef.current?.setStateDelta(delta);\n }\n}\n\n// 兼容 window 方式,也支持 new\n// @ts-ignore\nwindow.XAiWebSDK = XAiWebSDK;\n\n// 支持 ESModule/UMD 直接 import\nexport default XAiWebSDK;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["XAdkProvider", "ReactDOM"]
|
|
7
7
|
}
|
|
@@ -15,7 +15,7 @@ export var useStyles = withBasicStyles(function () {
|
|
|
15
15
|
emptyContainer: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
|
|
16
16
|
loadingContainer: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
|
|
17
17
|
treeNodeTitle: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n "]))),
|
|
18
|
-
moreIcon: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding:
|
|
18
|
+
moreIcon: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n "]))),
|
|
19
19
|
treeNodeTitleHover: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n "]))),
|
|
20
20
|
copyBtn: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n "])))
|
|
21
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","previewPanel","_templateObject6","previewTitle","_templateObject7","previewContent","_templateObject8","emptyContainer","_templateObject9","loadingContainer","_templateObject10","treeNodeTitle","_templateObject11","moreIcon","_templateObject12","treeNodeTitleHover","_templateObject13","copyBtn","_templateObject14"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 0;\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* 拖拽指示线:蓝色虚线 */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* 拖拽悬停目标:蓝色虚线边框 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* 拖拽中的节点半透明 */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding:
|
|
1
|
+
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","previewPanel","_templateObject6","previewTitle","_templateObject7","previewContent","_templateObject8","emptyContainer","_templateObject9","loadingContainer","_templateObject10","treeNodeTitle","_templateObject11","moreIcon","_templateObject12","treeNodeTitleHover","_templateObject13","copyBtn","_templateObject14"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 0;\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* 拖拽指示线:蓝色虚线 */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* 拖拽悬停目标:蓝色虚线边框 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* 拖拽中的节点半透明 */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n treeNodeTitleHover: css`\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n `,\n copyBtn: css`\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,6KAQb;IACDC,kBAAkB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,oIAOtB;IACDG,cAAc,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,qJAKlB;IACDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2IAMlB;IACDO,oBAAoB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,4mCAwCxB;IACDS,YAAY,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,mHAMhB;IACDW,YAAY,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,qPAUhB;IACDa,cAAc,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,gHAMlB;IACDe,cAAc,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,2GAKlB;IACDiB,gBAAgB,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,2GAKpB;IACDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,wHAKjB;IACDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,wQAaZ;IACDuB,kBAAkB,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,4EAItB;IACDyB,OAAO,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA;EAQd,CAAC;AAAA,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type { XAdkChatbotProps } from "../../types";
|
|
2
|
+
import type { XAdkChatbotProps, XAdkChatbotHandle } from "../../types";
|
|
3
3
|
/**
|
|
4
4
|
* XAdkChatbot - 增强版聊天组件
|
|
5
5
|
*
|
|
@@ -10,5 +10,5 @@ import type { XAdkChatbotProps } from "../../types";
|
|
|
10
10
|
* - ✅ 操作栏 (重试/复制/日志)
|
|
11
11
|
* - ✅ 欢迎页面 (agentName/agentIcon/description)
|
|
12
12
|
*/
|
|
13
|
-
declare const XAdkChatbot: React.
|
|
13
|
+
declare const XAdkChatbot: React.ForwardRefExoticComponent<XAdkChatbotProps & React.RefAttributes<XAdkChatbotHandle>>;
|
|
14
14
|
export default XAdkChatbot;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
2
|
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
|
-
import React, { useMemo, useCallback, useEffect, useRef } from "react";
|
|
3
|
+
import React, { useMemo, useCallback, useEffect, useRef, useImperativeHandle, forwardRef } from "react";
|
|
4
4
|
import { Button, Flex, Tooltip, message as antdMessage } from "antd";
|
|
5
5
|
import clsx from "clsx";
|
|
6
6
|
import { SwapRightOutlined, ReloadOutlined, CopyOutlined, InfoCircleOutlined } from "@ant-design/icons";
|
|
@@ -28,7 +28,7 @@ var scrollThreshold = 10;
|
|
|
28
28
|
* - ✅ 操作栏 (重试/复制/日志)
|
|
29
29
|
* - ✅ 欢迎页面 (agentName/agentIcon/description)
|
|
30
30
|
*/
|
|
31
|
-
var XAdkChatbot = function
|
|
31
|
+
var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
32
32
|
var _mergedStrategies$par;
|
|
33
33
|
var _ref$loading = _ref.loading,
|
|
34
34
|
loading = _ref$loading === void 0 ? false : _ref$loading,
|
|
@@ -55,6 +55,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
55
55
|
parseOptions = _ref.parseOptions,
|
|
56
56
|
_ref$initialized = _ref.initialized,
|
|
57
57
|
initialized = _ref$initialized === void 0 ? false : _ref$initialized,
|
|
58
|
+
sessionId = _ref.sessionId,
|
|
58
59
|
onFileClick = _ref.onFileClick,
|
|
59
60
|
renderFunctionCall = _ref.renderFunctionCall,
|
|
60
61
|
toolKindResolver = _ref.toolKindResolver,
|
|
@@ -66,6 +67,21 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
66
67
|
var userHasScrolledRef = useRef(false);
|
|
67
68
|
var messagesEndRef = useRef(null);
|
|
68
69
|
var prevInitializedRef = useRef(false);
|
|
70
|
+
var prevSessionIdRef = useRef(sessionId);
|
|
71
|
+
|
|
72
|
+
// 暴露命令式 API
|
|
73
|
+
var scrollToBottom = useCallback(function () {
|
|
74
|
+
var _messagesEndRef$curre;
|
|
75
|
+
var behavior = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "auto";
|
|
76
|
+
(_messagesEndRef$curre = messagesEndRef.current) === null || _messagesEndRef$curre === void 0 || _messagesEndRef$curre.scrollIntoView({
|
|
77
|
+
behavior: behavior
|
|
78
|
+
});
|
|
79
|
+
}, []);
|
|
80
|
+
useImperativeHandle(ref, function () {
|
|
81
|
+
return {
|
|
82
|
+
scrollToBottom: scrollToBottom
|
|
83
|
+
};
|
|
84
|
+
}, [scrollToBottom]);
|
|
69
85
|
var mergedStrategies = useMemo(function () {
|
|
70
86
|
return mergeChatStrategies(preset, strategies);
|
|
71
87
|
}, [preset, strategies]);
|
|
@@ -82,26 +98,59 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
82
98
|
useEffect(function () {
|
|
83
99
|
if (!initialized) return;
|
|
84
100
|
if (!messages.length) return;
|
|
85
|
-
if (prevInitializedRef.current) return;
|
|
101
|
+
if (prevInitializedRef.current) return;
|
|
86
102
|
prevInitializedRef.current = true;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
103
|
+
var el = listRef.current;
|
|
104
|
+
if (!el) return;
|
|
105
|
+
|
|
106
|
+
// 用 MutationObserver 监听 DOM 子树变化,等内容渲染稳定后置底
|
|
107
|
+
// 每次 DOM 变化都重新计时,确保所有异步渲染(Markdown、代码高亮、思维链等)完成后再滚动
|
|
108
|
+
var stableTimer;
|
|
109
|
+
var doScroll = function doScroll() {
|
|
110
|
+
var _messagesEndRef$curre2;
|
|
111
|
+
(_messagesEndRef$curre2 = messagesEndRef.current) === null || _messagesEndRef$curre2 === void 0 || _messagesEndRef$curre2.scrollIntoView({
|
|
91
112
|
behavior: "auto"
|
|
92
113
|
});
|
|
93
|
-
}
|
|
114
|
+
};
|
|
115
|
+
var observer = new MutationObserver(function () {
|
|
116
|
+
clearTimeout(stableTimer);
|
|
117
|
+
stableTimer = setTimeout(doScroll, 80);
|
|
118
|
+
});
|
|
119
|
+
observer.observe(el, {
|
|
120
|
+
childList: true,
|
|
121
|
+
subtree: true,
|
|
122
|
+
characterData: true
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// 立即执行一次,处理内容已经就绪的情况
|
|
126
|
+
doScroll();
|
|
127
|
+
// 兜底:最多等 500ms 后强制滚动并断开观察
|
|
128
|
+
var maxTimer = setTimeout(function () {
|
|
129
|
+
observer.disconnect();
|
|
130
|
+
doScroll();
|
|
131
|
+
}, 500);
|
|
94
132
|
return function () {
|
|
95
|
-
|
|
133
|
+
clearTimeout(stableTimer);
|
|
134
|
+
clearTimeout(maxTimer);
|
|
135
|
+
observer.disconnect();
|
|
96
136
|
};
|
|
97
137
|
}, [initialized, messages]);
|
|
98
138
|
|
|
139
|
+
// 会话切换时重置滚动状态,允许重新触发初始化置底
|
|
140
|
+
useEffect(function () {
|
|
141
|
+
if (sessionId === undefined) return; // 未传 sessionId 不处理
|
|
142
|
+
if (prevSessionIdRef.current === sessionId) return; // 同一会话不处理
|
|
143
|
+
prevSessionIdRef.current = sessionId;
|
|
144
|
+
prevInitializedRef.current = false;
|
|
145
|
+
userHasScrolledRef.current = false;
|
|
146
|
+
}, [sessionId]);
|
|
147
|
+
|
|
99
148
|
// 流式输出时滚动到底部
|
|
100
149
|
useEffect(function () {
|
|
101
|
-
var _messagesEndRef$
|
|
150
|
+
var _messagesEndRef$curre3;
|
|
102
151
|
if (!loading) return;
|
|
103
152
|
if (userHasScrolledRef.current) return;
|
|
104
|
-
(_messagesEndRef$
|
|
153
|
+
(_messagesEndRef$curre3 = messagesEndRef.current) === null || _messagesEndRef$curre3 === void 0 || _messagesEndRef$curre3.scrollIntoView({
|
|
105
154
|
behavior: "smooth"
|
|
106
155
|
});
|
|
107
156
|
}, [loading, messages]);
|
|
@@ -338,17 +387,22 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
338
387
|
var actionExtraNode = actionsExtra === null || actionsExtra === void 0 ? void 0 : actionsExtra(actionProps);
|
|
339
388
|
|
|
340
389
|
// 4. 渲染
|
|
390
|
+
var lastProcessIdx = nodes.findLastIndex(function (n) {
|
|
391
|
+
return n.type === "process";
|
|
392
|
+
});
|
|
341
393
|
return /*#__PURE__*/_jsxs("div", {
|
|
342
394
|
className: styles.botMsg,
|
|
343
395
|
children: [nodes.map(function (node, idx) {
|
|
344
396
|
if (node.type === "process") {
|
|
397
|
+
// 只有最后一个 process node 跟随 loading 状态,已完成的思维链不应显示 loading
|
|
398
|
+
var isLastProcess = idx === lastProcessIdx;
|
|
345
399
|
return /*#__PURE__*/_jsx(XAdkThoughtChain, {
|
|
346
|
-
loading: isGroupLoading,
|
|
400
|
+
loading: isLastProcess && isGroupLoading,
|
|
347
401
|
title: "\u601D\u7EF4\u94FE\u5DF2\u5B8C\u6210",
|
|
348
402
|
items: node.items,
|
|
349
403
|
showFnCallDetail: showFnCallDetail,
|
|
350
404
|
onConfirm: onConfirm,
|
|
351
|
-
defaultOpen: isGroupLoading,
|
|
405
|
+
defaultOpen: isLastProcess && isGroupLoading,
|
|
352
406
|
renderFunctionCall: renderFunctionCall,
|
|
353
407
|
toolKindResolver: function toolKindResolver(name) {
|
|
354
408
|
return resolveToolKind(name);
|
|
@@ -525,6 +579,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
|
|
|
525
579
|
})]
|
|
526
580
|
})
|
|
527
581
|
});
|
|
528
|
-
};
|
|
582
|
+
});
|
|
583
|
+
XAdkChatbot.displayName = "XAdkChatbot";
|
|
529
584
|
export default XAdkChatbot;
|
|
530
585
|
//# sourceMappingURL=index.js.map
|