@ai-group/chat-sdk 0.2.5

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 (80) hide show
  1. package/README.md +239 -0
  2. package/dist/esm/assets/arrow-down.png +0 -0
  3. package/dist/esm/assets/arrow-up.png +0 -0
  4. package/dist/esm/assets/chatKnowledge.png +0 -0
  5. package/dist/esm/assets/completed-black.png +0 -0
  6. package/dist/esm/assets/completed.png +0 -0
  7. package/dist/esm/assets/document-black.png +0 -0
  8. package/dist/esm/assets/document.png +0 -0
  9. package/dist/esm/assets/document.svg +16 -0
  10. package/dist/esm/assets/empty.png +0 -0
  11. package/dist/esm/assets/group.png +0 -0
  12. package/dist/esm/assets/qa-black.png +0 -0
  13. package/dist/esm/assets/qa.png +0 -0
  14. package/dist/esm/assets/skillNo-black.png +0 -0
  15. package/dist/esm/assets/skillNo.png +0 -0
  16. package/dist/esm/assets/tools-black.png +0 -0
  17. package/dist/esm/assets/tools.png +0 -0
  18. package/dist/esm/client/base.js +2 -0
  19. package/dist/esm/client/base.js.map +1 -0
  20. package/dist/esm/client/restClient.js +2 -0
  21. package/dist/esm/client/restClient.js.map +1 -0
  22. package/dist/esm/client/wsClient.js +2 -0
  23. package/dist/esm/client/wsClient.js.map +1 -0
  24. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js +562 -0
  25. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js.map +1 -0
  26. package/dist/esm/components/XAiChatbot/index.js +586 -0
  27. package/dist/esm/components/XAiChatbot/index.js.map +1 -0
  28. package/dist/esm/components/XAiChatbot/styles.js +62 -0
  29. package/dist/esm/components/XAiChatbot/styles.js.map +1 -0
  30. package/dist/esm/components/XAiProvider/XAiProvider.stories.js +297 -0
  31. package/dist/esm/components/XAiProvider/XAiProvider.stories.js.map +1 -0
  32. package/dist/esm/components/XAiProvider/index.js +128 -0
  33. package/dist/esm/components/XAiProvider/index.js.map +1 -0
  34. package/dist/esm/components/XAiSDK.js +29 -0
  35. package/dist/esm/components/XAiSDK.js.map +1 -0
  36. package/dist/esm/components/XAiWebSDKWrapper.js +42 -0
  37. package/dist/esm/components/XAiWebSDKWrapper.js.map +1 -0
  38. package/dist/esm/context/AiProviderContext.js +62 -0
  39. package/dist/esm/context/AiProviderContext.js.map +1 -0
  40. package/dist/esm/context/ThemeContext.js +8 -0
  41. package/dist/esm/context/ThemeContext.js.map +1 -0
  42. package/dist/esm/hooks/useAgentGenerator.js +536 -0
  43. package/dist/esm/hooks/useAgentGenerator.js.map +1 -0
  44. package/dist/esm/hooks/useEventStreamRequest.js +229 -0
  45. package/dist/esm/hooks/useEventStreamRequest.js.map +1 -0
  46. package/dist/esm/hooks/useProviderContext.js +115 -0
  47. package/dist/esm/hooks/useProviderContext.js.map +1 -0
  48. package/dist/esm/hooks/useXAiSDK.js +49 -0
  49. package/dist/esm/hooks/useXAiSDK.js.map +1 -0
  50. package/dist/esm/index.js +11 -0
  51. package/dist/esm/index.js.map +1 -0
  52. package/dist/esm/services/api.js +73 -0
  53. package/dist/esm/services/api.js.map +1 -0
  54. package/dist/esm/styles/common.js +106 -0
  55. package/dist/esm/styles/common.js.map +1 -0
  56. package/dist/esm/styles/markdown.js +12 -0
  57. package/dist/esm/styles/markdown.js.map +1 -0
  58. package/dist/esm/types/XAiChatbot.js +2 -0
  59. package/dist/esm/types/XAiChatbot.js.map +1 -0
  60. package/dist/esm/types/XAiMessage.js +65 -0
  61. package/dist/esm/types/XAiMessage.js.map +1 -0
  62. package/dist/esm/types/XAiProvider.js +4 -0
  63. package/dist/esm/types/XAiProvider.js.map +1 -0
  64. package/dist/esm/types/index.js +4 -0
  65. package/dist/esm/types/index.js.map +1 -0
  66. package/dist/esm/types/mdx.d.ts +18 -0
  67. package/dist/esm/utils/chat.js +976 -0
  68. package/dist/esm/utils/chat.js.map +1 -0
  69. package/dist/esm/utils/index.js +19 -0
  70. package/dist/esm/utils/index.js.map +1 -0
  71. package/dist/esm/utils/providerManager.js +70 -0
  72. package/dist/esm/utils/providerManager.js.map +1 -0
  73. package/dist/esm/utils/request.example.js +379 -0
  74. package/dist/esm/utils/request.example.js.map +1 -0
  75. package/dist/esm/utils/request.js +491 -0
  76. package/dist/esm/utils/request.js.map +1 -0
  77. package/dist/esm/utils/umdEntry.js +109 -0
  78. package/dist/esm/utils/umdEntry.js.map +1 -0
  79. package/dist/umd/chat-sdk.min.js +1 -0
  80. package/package.json +71 -0
@@ -0,0 +1,586 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ // 文件: components/XAiChatbot/index.tsx
3
+
4
+ import React, { useRef, useState, useMemo } from 'react';
5
+ import { Button, Space, Spin, Tooltip, Popover } from 'antd';
6
+ import { Bubble, Sender, Prompts } from '@ant-design/x';
7
+ import { ArrowUpOutlined, ClearOutlined, UserOutlined, RedoOutlined, CopyOutlined, DeleteOutlined } from '@ant-design/icons';
8
+ import clsx from 'clsx';
9
+ import MarkdownIt from 'markdown-it';
10
+ import reactHtmlParser from 'react-html-parser';
11
+ import MarkdownGlobalStyle from "../../styles/markdown";
12
+ import { MessageStatus, MessageRole } from "../../types/XAiMessage";
13
+ import emptyIcon from "../../assets/empty.png";
14
+ import groupIcon from "../../assets/group.png";
15
+ import arrowUp from "../../assets/arrow-up.png";
16
+ import arrowDown from "../../assets/arrow-down.png";
17
+ import { useChatbotContext } from "../../hooks/useProviderContext";
18
+ import { useStyles, GlobalStyle } from "./styles";
19
+ import { jsx as _jsx } from "react/jsx-runtime";
20
+ import { Fragment as _Fragment } from "react/jsx-runtime";
21
+ import { jsxs as _jsxs } from "react/jsx-runtime";
22
+ var md = new MarkdownIt({
23
+ html: true,
24
+ linkify: true,
25
+ typographer: true
26
+ });
27
+
28
+ // 自定义 link_open 渲染规则
29
+ var defaultRender = md.renderer.rules.link_open || function (tokens, idx, options, env, self) {
30
+ return self.renderToken(tokens, idx, options);
31
+ };
32
+
33
+ // a 标签打开规则
34
+ md.renderer.rules.link_open = function (tokens, idx, options, env, self) {
35
+ // 添加 target="_blank"
36
+ var aIndex = tokens[idx].attrIndex('target');
37
+ if (aIndex < 0) {
38
+ tokens[idx].attrPush(['target', '_blank']);
39
+ } else {
40
+ tokens[idx].attrs[aIndex][1] = '_blank';
41
+ }
42
+ // 添加 rel="noopener noreferrer"
43
+ var relIndex = tokens[idx].attrIndex('rel');
44
+ if (relIndex < 0) {
45
+ tokens[idx].attrPush(['rel', 'noopener noreferrer']);
46
+ } else {
47
+ tokens[idx].attrs[relIndex][1] = 'noopener noreferrer';
48
+ }
49
+ return defaultRender(tokens, idx, options, env, self);
50
+ };
51
+ // 默认消息功能区
52
+ var defaultActions = [{
53
+ key: 'redo',
54
+ icon: /*#__PURE__*/_jsx(RedoOutlined, {}),
55
+ tooltip: '重新生成'
56
+ }, {
57
+ key: 'copy',
58
+ icon: /*#__PURE__*/_jsx(CopyOutlined, {}),
59
+ tooltip: '复制'
60
+ }, {
61
+ key: 'delete',
62
+ icon: /*#__PURE__*/_jsx(DeleteOutlined, {}),
63
+ tooltip: '删除'
64
+ }];
65
+ var XAiChatbot = function XAiChatbot(props) {
66
+ // 使用新的 Hook 来处理 Provider 上下文
67
+ var _useChatbotContext = useChatbotContext(props),
68
+ mergedProps = _useChatbotContext.mergedProps;
69
+ var _mergedProps$navbarSh = mergedProps.navbarShow,
70
+ navbarShow = _mergedProps$navbarSh === void 0 ? false : _mergedProps$navbarSh,
71
+ navbar = mergedProps.navbar,
72
+ _mergedProps$renderNa = mergedProps.renderNavbar,
73
+ renderNavbar = _mergedProps$renderNa === void 0 ? null : _mergedProps$renderNa,
74
+ _mergedProps$loading = mergedProps.loading,
75
+ propLoading = _mergedProps$loading === void 0 ? false : _mergedProps$loading,
76
+ messageTooltip = mergedProps.messageTooltip,
77
+ avatar = mergedProps.avatar,
78
+ userAvatar = mergedProps.userAvatar,
79
+ propMessages = mergedProps.messages,
80
+ _mergedProps$text = mergedProps.text,
81
+ text = _mergedProps$text === void 0 ? '' : _mergedProps$text,
82
+ _mergedProps$emptySta = mergedProps.emptyStateImage,
83
+ emptyStateImage = _mergedProps$emptySta === void 0 ? emptyIcon : _mergedProps$emptySta,
84
+ _mergedProps$emptySta2 = mergedProps.emptyStateText,
85
+ emptyStateText = _mergedProps$emptySta2 === void 0 ? '我的智能体' : _mergedProps$emptySta2,
86
+ _mergedProps$messageA = mergedProps.messageActions,
87
+ messageActions = _mergedProps$messageA === void 0 ? defaultActions : _mergedProps$messageA,
88
+ onMessagesActionsCallback = mergedProps.onMessagesActionsCallback,
89
+ onSuggestMessageClick = mergedProps.onSuggestMessageClick,
90
+ onSend = mergedProps.onSend,
91
+ onClear = mergedProps.onClear,
92
+ onStop = mergedProps.onStop;
93
+
94
+ // 如果在 Provider 中,使用 Provider 的状态
95
+ var messages = mergedProps.messages || propMessages || [];
96
+ var loading = mergedProps.loading || propLoading;
97
+ var _useState = useState(false),
98
+ _useState2 = _slicedToArray(_useState, 2),
99
+ disabled = _useState2[0],
100
+ _setDisabled = _useState2[1]; // 是否禁止输入
101
+ var _useState3 = useState(text),
102
+ _useState4 = _slicedToArray(_useState3, 2),
103
+ content = _useState4[0],
104
+ setContent = _useState4[1]; // 输入框文本
105
+ var _useState5 = useState(''),
106
+ _useState6 = _slicedToArray(_useState5, 2),
107
+ mode = _useState6[0],
108
+ _setMode = _useState6[1]; // todo 模式
109
+ var _useState7 = useState(false),
110
+ _useState8 = _slicedToArray(_useState7, 2),
111
+ fileUploading = _useState8[0],
112
+ setFileUploading = _useState8[1]; // 文件上传进度条
113
+ var _useState9 = useState(false),
114
+ _useState10 = _slicedToArray(_useState9, 2),
115
+ clearPopoverVisible = _useState10[0],
116
+ setClearPopoverVisible = _useState10[1]; // 气泡卡片显隐藏
117
+ var styles = useStyles();
118
+
119
+ // 消息功能区组件
120
+ var FooterActions = function FooterActions(_ref) {
121
+ var data = _ref.data;
122
+ return /*#__PURE__*/_jsx("div", {
123
+ className: clsx(styles.flex, styles.gap(13)),
124
+ children: messageActions.map(function (action, index) {
125
+ return /*#__PURE__*/_jsx(Tooltip, {
126
+ title: action.tooltip,
127
+ children: /*#__PURE__*/_jsx("span", {
128
+ className: styles.cursor('pointer'),
129
+ onClick: function onClick() {
130
+ return onMessagesActionsCallback === null || onMessagesActionsCallback === void 0 ? void 0 : onMessagesActionsCallback(index, data);
131
+ },
132
+ children: action.icon
133
+ })
134
+ }, action.key);
135
+ })
136
+ });
137
+ };
138
+
139
+ // 消息底部区域
140
+ var MessageFooter = function MessageFooter(_ref2) {
141
+ var data = _ref2.data;
142
+ return /*#__PURE__*/_jsxs(_Fragment, {
143
+ children: [messageTooltip === null || messageTooltip === void 0 ? void 0 : messageTooltip(data), /*#__PURE__*/_jsx(FooterActions, {
144
+ data: data
145
+ })]
146
+ });
147
+ };
148
+
149
+ // 聊天角色
150
+ var rolesObject = {
151
+ assistant: {
152
+ placement: 'start',
153
+ avatar: {
154
+ icon: avatar || /*#__PURE__*/_jsx(UserOutlined, {}),
155
+ style: {
156
+ background: '#fde3cf'
157
+ }
158
+ },
159
+ typing: {
160
+ step: 5,
161
+ interval: 20
162
+ },
163
+ style: {
164
+ maxWidth: 600
165
+ }
166
+ },
167
+ user: {
168
+ placement: 'end',
169
+ avatar: {
170
+ icon: userAvatar || /*#__PURE__*/_jsx(UserOutlined, {}),
171
+ style: {
172
+ background: '#87d068'
173
+ }
174
+ }
175
+ },
176
+ suggestion: {
177
+ placement: 'start',
178
+ avatar: {
179
+ icon: /*#__PURE__*/_jsx(UserOutlined, {}),
180
+ style: {
181
+ visibility: 'hidden'
182
+ }
183
+ },
184
+ variant: 'borderless'
185
+ }
186
+ };
187
+
188
+ // ActionHeader 组件
189
+ var ActionHeader = function ActionHeader(_ref3) {
190
+ var _first$extra;
191
+ var _ref3$thinks = _ref3.thinks,
192
+ thinks = _ref3$thinks === void 0 ? [] : _ref3$thinks,
193
+ renderActionHeader = _ref3.renderActionHeader;
194
+ var _useState11 = useState(false),
195
+ _useState12 = _slicedToArray(_useState11, 2),
196
+ expanded = _useState12[0],
197
+ setExpanded = _useState12[1];
198
+ if (!thinks || thinks.length === 0) return null;
199
+ if (renderActionHeader) {
200
+ return renderActionHeader({
201
+ thinks: thinks,
202
+ expanded: expanded,
203
+ onToggle: function onToggle() {
204
+ return setExpanded(function (v) {
205
+ return !v;
206
+ });
207
+ }
208
+ });
209
+ }
210
+ // 默认渲染
211
+ var first = thinks[0];
212
+ var name = first.name;
213
+ var icon = (first === null || first === void 0 ? void 0 : first.icon) || (first === null || first === void 0 || (_first$extra = first.extra) === null || _first$extra === void 0 ? void 0 : _first$extra.icon);
214
+ return /*#__PURE__*/_jsxs("div", {
215
+ className: styles.actionHeaderWrapper,
216
+ children: [!expanded && /*#__PURE__*/_jsxs("div", {
217
+ className: styles.actionHeaderItem,
218
+ onClick: function onClick() {
219
+ return setExpanded(function (v) {
220
+ return !v;
221
+ });
222
+ },
223
+ children: [icon && /*#__PURE__*/_jsx("img", {
224
+ src: icon,
225
+ alt: "icon",
226
+ className: styles.actionHeaderIcon
227
+ }), /*#__PURE__*/_jsx("span", {
228
+ className: styles.actionHeaderText,
229
+ children: name
230
+ }), /*#__PURE__*/_jsx("img", {
231
+ alt: "\u5C55\u5F00icon",
232
+ src: arrowDown,
233
+ className: styles.w('16px')
234
+ })]
235
+ }), expanded && /*#__PURE__*/_jsxs("div", {
236
+ className: styles.actionHeaderDetail,
237
+ children: [/*#__PURE__*/_jsxs("div", {
238
+ className: styles.actionDetailTitle,
239
+ onClick: function onClick() {
240
+ return setExpanded(function (v) {
241
+ return !v;
242
+ });
243
+ },
244
+ children: [/*#__PURE__*/_jsx("img", {
245
+ src: groupIcon,
246
+ alt: "",
247
+ className: clsx(styles.w(14))
248
+ }), /*#__PURE__*/_jsx("div", {
249
+ className: clsx(styles.flex1, styles.pl(10)),
250
+ children: "\u9690\u85CF\u8FD0\u884C\u8FC7\u7A0B"
251
+ }), /*#__PURE__*/_jsx("img", {
252
+ alt: "\u6536\u8D77icon",
253
+ src: arrowUp,
254
+ className: styles.w('16px')
255
+ })]
256
+ }), thinks.map(function (action, idx) {
257
+ var _action$extra, _action$extra2, _action$extra3;
258
+ var thinkIcon = (action === null || action === void 0 ? void 0 : action.expandIcon) || (action === null || action === void 0 || (_action$extra = action.extra) === null || _action$extra === void 0 ? void 0 : _action$extra.expandIcon) || (action === null || action === void 0 || (_action$extra2 = action.extra) === null || _action$extra2 === void 0 ? void 0 : _action$extra2.icon) || (action === null || action === void 0 ? void 0 : action.icon);
259
+ var thinkCost = (action === null || action === void 0 ? void 0 : action.cost) || (action === null || action === void 0 || (_action$extra3 = action.extra) === null || _action$extra3 === void 0 ? void 0 : _action$extra3.cost);
260
+ return /*#__PURE__*/_jsxs("div", {
261
+ className: styles.actionHeaderDetailItem,
262
+ children: [thinkIcon && /*#__PURE__*/_jsx("img", {
263
+ src: thinkIcon,
264
+ alt: "icon",
265
+ className: styles.actionHeaderIcon
266
+ }), /*#__PURE__*/_jsx("span", {
267
+ children: action === null || action === void 0 ? void 0 : action.name
268
+ }), /*#__PURE__*/_jsx("span", {
269
+ className: styles.actionHeaderCost,
270
+ children: thinkCost ? "".concat(thinkCost, "s") : ''
271
+ })]
272
+ }, action.uniqueId || idx);
273
+ })]
274
+ })]
275
+ });
276
+ };
277
+
278
+ // 触发发送
279
+ var handleSend = function handleSend() {
280
+ if (content.trim()) {
281
+ // 直接使用合并后的 onSend,自动处理 Provider 和独立模式
282
+ onSend === null || onSend === void 0 || onSend('text', content);
283
+ setContent(''); // 发送后清空输入框内容
284
+ }
285
+ };
286
+
287
+ // 导航栏
288
+ var NavBar = function NavBar() {
289
+ if (renderNavbar) {
290
+ return renderNavbar();
291
+ }
292
+ if (navbar !== null && navbar !== void 0 && navbar.title) {
293
+ return /*#__PURE__*/_jsxs("header", {
294
+ className: styles.navbar,
295
+ children: [navbar.avatar && /*#__PURE__*/_jsx("img", {
296
+ src: navbar.avatar,
297
+ className: styles.avatar,
298
+ alt: ""
299
+ }), /*#__PURE__*/_jsxs("div", {
300
+ children: [/*#__PURE__*/_jsx("div", {
301
+ className: styles.title,
302
+ children: navbar.title
303
+ }), /*#__PURE__*/_jsx("div", {
304
+ className: styles.subtitle,
305
+ children: navbar.subtitle
306
+ })]
307
+ })]
308
+ });
309
+ }
310
+ return /*#__PURE__*/_jsx(_Fragment, {});
311
+ };
312
+
313
+ // 文件上传按钮引用
314
+ var fileInputRef = useRef(null);
315
+
316
+ // 停止生成
317
+ var handleStopGenerate = function handleStopGenerate() {
318
+ onStop === null || onStop === void 0 || onStop();
319
+ };
320
+
321
+ // 选择文件
322
+ var handleFileSelect = function handleFileSelect() {};
323
+
324
+ // 点击清除按钮
325
+ var handleClear = function handleClear() {
326
+ setClearPopoverVisible(true);
327
+ };
328
+
329
+ // 取消清除
330
+ var cancelClear = function cancelClear() {
331
+ setClearPopoverVisible(false);
332
+ };
333
+
334
+ // 确认清除
335
+ var confirmClear = function confirmClear() {
336
+ setContent('');
337
+ onClear === null || onClear === void 0 || onClear();
338
+ setClearPopoverVisible(false);
339
+ };
340
+
341
+ // 清空按钮提示文案
342
+ var clearConfirmContent = /*#__PURE__*/_jsxs("div", {
343
+ className: styles.p('2px'),
344
+ children: [/*#__PURE__*/_jsx("p", {
345
+ className: clsx(styles.mb(14), styles.mt(0)),
346
+ children: "\u786E\u8BA4\u6E05\u9664\u6240\u6709\u804A\u5929\u8BB0\u5F55\u5E76\u91CD\u7F6E\u4F1A\u8BDD\uFF01"
347
+ }), /*#__PURE__*/_jsxs("div", {
348
+ className: styles.popoverFooter,
349
+ children: [/*#__PURE__*/_jsx(Button, {
350
+ size: "small",
351
+ onClick: cancelClear,
352
+ children: "\u53D6\u6D88"
353
+ }), /*#__PURE__*/_jsx(Button, {
354
+ size: "small",
355
+ type: "primary",
356
+ danger: true,
357
+ onClick: confirmClear,
358
+ children: "\u786E\u8BA4"
359
+ })]
360
+ })]
361
+ });
362
+
363
+ // 自定义上传按钮
364
+ var uploadButton = /*#__PURE__*/_jsx("div", {
365
+ className: styles.flexCenterGap2,
366
+ children: /*#__PURE__*/_jsxs(Tooltip, {
367
+ placement: "top",
368
+ title: mode === 'single_agent_skill_mode' ? '工作流模式不支持上传文件' : '支持图片、文档等上传',
369
+ children: [fileUploading ? /*#__PURE__*/_jsx(Spin, {
370
+ size: "small"
371
+ }) : /*#__PURE__*/_jsx("i", {
372
+ className: mode === 'single_agent_skill_mode' ? styles.iconZengjiaDisabled : styles.iconZengjiaNormal,
373
+ onClick: function onClick() {
374
+ if (mode !== 'single_agent_skill_mode' && fileInputRef.current) {
375
+ var _fileInputRef$current;
376
+ (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 || _fileInputRef$current.click();
377
+ }
378
+ }
379
+ }), /*#__PURE__*/_jsx("input", {
380
+ type: "file",
381
+ ref: fileInputRef,
382
+ onChange: handleFileSelect,
383
+ style: {
384
+ display: 'none'
385
+ },
386
+ accept: "*/*",
387
+ disabled: fileUploading || mode === 'single_agent_skill_mode'
388
+ })]
389
+ })
390
+ });
391
+
392
+ // 空状态
393
+ var EmptyState = useMemo(function () {
394
+ return function () {
395
+ return /*#__PURE__*/_jsxs("div", {
396
+ className: styles.emptyWrapper,
397
+ children: [/*#__PURE__*/_jsx("img", {
398
+ src: emptyStateImage,
399
+ alt: "\u7A7A\u72B6\u6001\u56FE\u6807",
400
+ className: styles.emptyImg
401
+ }), /*#__PURE__*/_jsx("div", {
402
+ className: clsx(styles.text(16), styles.weight(600), styles.textColor('#343434')),
403
+ children: emptyStateText
404
+ })]
405
+ })
406
+ // eslint-disable-next-line react-hooks/exhaustive-deps
407
+ ;
408
+ };
409
+ }, [emptyStateImage, emptyStateText]);
410
+ return /*#__PURE__*/_jsxs(_Fragment, {
411
+ children: [/*#__PURE__*/_jsx(GlobalStyle, {}), /*#__PURE__*/_jsx(MarkdownGlobalStyle, {}), /*#__PURE__*/_jsxs("div", {
412
+ className: styles.wrapper,
413
+ children: [navbarShow && /*#__PURE__*/_jsx(NavBar, {}), /*#__PURE__*/_jsx("div", {
414
+ className: styles.messageContainer,
415
+ children: messages !== null && messages !== void 0 && messages.length ? /*#__PURE__*/_jsx(Bubble.List, {
416
+ roles: rolesObject,
417
+ items: messages.map(function (msg) {
418
+ var _ref4 = msg,
419
+ id = _ref4.id,
420
+ role = _ref4.role,
421
+ status = _ref4.status,
422
+ type = _ref4.type,
423
+ _ref4$thinks = _ref4.thinks,
424
+ thinks = _ref4$thinks === void 0 ? [] : _ref4$thinks,
425
+ _ref4$extra = _ref4.extra,
426
+ extra = _ref4$extra === void 0 ? {
427
+ noFooter: false
428
+ } : _ref4$extra;
429
+ return {
430
+ key: id,
431
+ role: role,
432
+ loading: status === MessageStatus.init,
433
+ header: function header() {
434
+ return /*#__PURE__*/_jsx(ActionHeader, {
435
+ thinks: thinks
436
+ });
437
+ },
438
+ content: function () {
439
+ // 文本消息
440
+ if (type === 'TextMessage') {
441
+ var _msg$content2;
442
+ // 用户消息
443
+ if (role === 'user') {
444
+ var _msg$content;
445
+ return /*#__PURE__*/_jsx("div", {
446
+ className: "markdown-body",
447
+ style: {
448
+ minWidth: 0,
449
+ maxWidth: 600,
450
+ background: '#D8E0FD'
451
+ },
452
+ children: (_msg$content = msg.content) === null || _msg$content === void 0 ? void 0 : _msg$content.text
453
+ });
454
+ }
455
+ // 输出html字符串
456
+ var html = md.render(((_msg$content2 = msg.content) === null || _msg$content2 === void 0 ? void 0 : _msg$content2.text) || '');
457
+ // 生成React节点
458
+ var htmlString = reactHtmlParser(html);
459
+ return /*#__PURE__*/_jsx(_Fragment, {
460
+ children: /*#__PURE__*/_jsx("div", {
461
+ className: "markdown-body",
462
+ style: {
463
+ minWidth: 0,
464
+ maxWidth: 600
465
+ },
466
+ children: htmlString
467
+ })
468
+ });
469
+ }
470
+ // 图片类型
471
+ if (type === 'ImageMessage') {
472
+ var _msg$content3;
473
+ return /*#__PURE__*/_jsx("div", {
474
+ style: {
475
+ minWidth: 0,
476
+ maxWidth: 600
477
+ },
478
+ children: /*#__PURE__*/_jsx("img", {
479
+ src: (_msg$content3 = msg.content) === null || _msg$content3 === void 0 ? void 0 : _msg$content3.bytes,
480
+ alt: "",
481
+ style: {
482
+ maxWidth: 680
483
+ }
484
+ })
485
+ });
486
+ }
487
+ // 提示类型
488
+ if (type === 'SuggestionMessage') {
489
+ return /*#__PURE__*/_jsx(Prompts, {
490
+ vertical: true,
491
+ items: msg.content,
492
+ onItemClick: function onItemClick(info) {
493
+ onSuggestMessageClick === null || onSuggestMessageClick === void 0 || onSuggestMessageClick(info.data, id, 'text');
494
+ if (info.data.description) {
495
+ onSend === null || onSend === void 0 || onSend('text', info.data.description);
496
+ }
497
+ }
498
+ });
499
+ }
500
+ // 其他类型...
501
+ return null;
502
+ }(),
503
+ footer: function footer() {
504
+ return extra.noFooter ? null : role === MessageRole.assistant && status !== MessageStatus.failed && /*#__PURE__*/_jsx(_Fragment, {
505
+ children: /*#__PURE__*/_jsx(MessageFooter, {
506
+ data: msg
507
+ })
508
+ });
509
+ }
510
+ };
511
+ })
512
+ }) : /*#__PURE__*/_jsx(EmptyState, {})
513
+ }), /*#__PURE__*/_jsx("div", {
514
+ className: styles.chatFooter,
515
+ children: /*#__PURE__*/_jsxs("div", {
516
+ className: clsx(styles.flex, styles.gap(8)),
517
+ children: [/*#__PURE__*/_jsx(Popover, {
518
+ content: clearConfirmContent,
519
+ title: "\u786E\u8BA4\u6E05\u7A7A\u5BF9\u8BDD",
520
+ trigger: "click",
521
+ open: clearPopoverVisible,
522
+ onOpenChange: setClearPopoverVisible,
523
+ children: /*#__PURE__*/_jsx("div", {
524
+ className: styles.clearBtn,
525
+ style: {
526
+ border: '1px solid #E4E7EC'
527
+ },
528
+ onClick: handleClear,
529
+ children: /*#__PURE__*/_jsx(ClearOutlined, {
530
+ className: styles.text(16)
531
+ })
532
+ })
533
+ }), /*#__PURE__*/_jsx(Sender, {
534
+ value: content
535
+ // submitType="shiftEnter"
536
+ ,
537
+ className: styles.sendWrapper,
538
+ placeholder: "\u7EE7\u7EED\u5BF9\u8BDD...",
539
+ disabled: disabled,
540
+ loading: loading,
541
+ actions: function actions(_, info) {
542
+ var _info$components = info.components,
543
+ SendButton = _info$components.SendButton,
544
+ LoadingButton = _info$components.LoadingButton;
545
+ return /*#__PURE__*/_jsxs(Space, {
546
+ size: "small",
547
+ children: [/*#__PURE__*/_jsx("div", {
548
+ className: styles.w(20)
549
+ }), mode !== 'single_agent_skill_mode' && uploadButton, mode === 'meta_agent_mode' && /*#__PURE__*/_jsx("div", {
550
+ className: styles.flexCenterGap2,
551
+ style: {
552
+ visibility: 'hidden'
553
+ },
554
+ children: /*#__PURE__*/_jsx("i", {
555
+ className: styles.iconHuihuarenqun
556
+ })
557
+ }), /*#__PURE__*/_jsx("div", {
558
+ className: styles.divider
559
+ }), loading ? /*#__PURE__*/_jsx(LoadingButton, {
560
+ onClick: handleStopGenerate,
561
+ className: styles.stopButton
562
+ }) : /*#__PURE__*/_jsx(SendButton, {
563
+ className: styles.sendButton,
564
+ type: "primary",
565
+ icon: /*#__PURE__*/_jsx(ArrowUpOutlined, {
566
+ className: styles.text(20)
567
+ }),
568
+ disabled: disabled
569
+ })]
570
+ });
571
+ },
572
+ onChange: function onChange(v) {
573
+ setContent(v);
574
+ },
575
+ onSubmit: handleSend,
576
+ onCancel: function onCancel() {
577
+ handleStopGenerate();
578
+ }
579
+ })]
580
+ })
581
+ })]
582
+ })]
583
+ });
584
+ };
585
+ export default XAiChatbot;
586
+ //# sourceMappingURL=index.js.map