@ai-group/chat-sdk 1.0.8 → 1.0.9

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.
@@ -80,13 +80,12 @@ var ActionHeader = ({ execute = [], thinks = "" }) => {
80
80
  const styles2 = (0, import_styles.useStyles)();
81
81
  const [expanded, setExpanded] = (0, import_react.useState)(true);
82
82
  const [executeExpanded, setExecuteExpanded] = (0, import_react.useState)(false);
83
- console.log("ActionHeader debug:", { thinks, executeLength: execute.length });
84
83
  if (!thinks && (!execute || execute.length === 0))
85
84
  return null;
86
85
  const last = execute[execute.length - 1] || {};
87
86
  const { name } = last;
88
87
  const icon = (last == null ? void 0 : last.icon) || ((_a = last == null ? void 0 : last.extra) == null ? void 0 : _a.icon);
89
- return /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionHeaderWrapper }, !expanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionTitle, onClick: () => setExpanded((v) => !v) }, /* @__PURE__ */ import_react.default.createElement("img", { src: import_think.default, alt: "icon", className: styles2.actionHeaderIcon }), /* @__PURE__ */ import_react.default.createElement("span", { className: styles2.flex1 }, "运行过程"), /* @__PURE__ */ import_react.default.createElement("img", { alt: "展开icon", src: import_arrow_down.default, className: styles2.w("16px") })), expanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionHeaderDetail }, /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionDetailTitle, onClick: () => setExpanded((v) => !v) }, /* @__PURE__ */ import_react.default.createElement("img", { src: import_think.default, alt: "", className: (0, import_clsx.default)(styles2.w(14)) }), /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_clsx.default)(styles2.flex1, styles2.pl(10)) }, "隐藏运行过程"), /* @__PURE__ */ import_react.default.createElement("img", { alt: "收起icon", src: import_arrow_up.default, className: styles2.w("16px") })), thinks && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionDetailContent }, /* @__PURE__ */ import_react.default.createElement("span", null, thinks)), execute && execute.length > 0 && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, !executeExpanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeHiddenWrapper, onClick: () => setExecuteExpanded((v) => !v) }, icon && /* @__PURE__ */ import_react.default.createElement("img", { src: icon, alt: "icon", className: styles2.h(20) }), /* @__PURE__ */ import_react.default.createElement("span", { className: styles2.flex1 }, name), /* @__PURE__ */ import_react.default.createElement("img", { alt: "工具icon", src: import_arrow_down_blue.default, className: styles2.w("16px") })), executeExpanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeWrapper }, /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeTitle, onClick: () => setExecuteExpanded((v) => !v) }, /* @__PURE__ */ import_react.default.createElement("img", { src: import_group.default, alt: "icon", className: styles2.executeHeaderIcon }), /* @__PURE__ */ import_react.default.createElement("span", { className: styles2.flex1 }, "隐藏运行详情"), /* @__PURE__ */ import_react.default.createElement("img", { alt: "展开详情icon", src: import_arrow_up.default, className: styles2.w("16px") })), /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeContent }, execute.map((action, idx) => {
88
+ return /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionHeaderWrapper }, !expanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionTitle, onClick: () => setExpanded((v) => !v) }, /* @__PURE__ */ import_react.default.createElement("img", { src: import_think.default, alt: "icon", className: styles2.actionHeaderIcon }), /* @__PURE__ */ import_react.default.createElement("span", { className: styles2.flex1 }, "运行过程"), /* @__PURE__ */ import_react.default.createElement("img", { alt: "展开icon", src: import_arrow_down.default, className: styles2.w("16px") })), expanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionHeaderDetail }, /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionDetailTitle, onClick: () => setExpanded((v) => !v) }, /* @__PURE__ */ import_react.default.createElement("img", { src: import_think.default, alt: "", className: (0, import_clsx.default)(styles2.w(14)) }), /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_clsx.default)(styles2.flex1, styles2.pl(10)) }, "隐藏运行过程"), /* @__PURE__ */ import_react.default.createElement("img", { alt: "收起icon", src: import_arrow_up.default, className: styles2.w("16px") })), thinks && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.actionDetailContent, style: { whiteSpace: "pre-line" } }, thinks), execute && execute.length > 0 && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, !executeExpanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeHiddenWrapper, onClick: () => setExecuteExpanded((v) => !v) }, icon && /* @__PURE__ */ import_react.default.createElement("img", { src: icon, alt: "icon", className: styles2.h(20) }), /* @__PURE__ */ import_react.default.createElement("span", { className: styles2.flex1 }, name), /* @__PURE__ */ import_react.default.createElement("img", { alt: "工具icon", src: import_arrow_down_blue.default, className: styles2.w("16px") })), executeExpanded && /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeWrapper }, /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeTitle, onClick: () => setExecuteExpanded((v) => !v) }, /* @__PURE__ */ import_react.default.createElement("img", { src: import_group.default, alt: "icon", className: styles2.executeHeaderIcon }), /* @__PURE__ */ import_react.default.createElement("span", { className: styles2.flex1 }, "隐藏运行详情"), /* @__PURE__ */ import_react.default.createElement("img", { alt: "展开详情icon", src: import_arrow_up.default, className: styles2.w("16px") })), /* @__PURE__ */ import_react.default.createElement("div", { className: styles2.executeContent }, execute.map((action, idx) => {
90
89
  var _a2, _b, _c;
91
90
  const thinkIcon2 = (action == null ? void 0 : action.expandIcon) || ((_a2 = action == null ? void 0 : action.extra) == null ? void 0 : _a2.expandIcon) || ((_b = action == null ? void 0 : action.extra) == null ? void 0 : _b.icon) || (action == null ? void 0 : action.icon);
92
91
  const thinkCost = (action == null ? void 0 : action.cost) || ((_c = action == null ? void 0 : action.extra) == null ? void 0 : _c.cost);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiChatbot/index.tsx"],
4
- "sourcesContent": ["// 文件: components/XAiChatbot/index.tsx\n\nimport React, {\n useRef,\n useState,\n useMemo,\n} from 'react';\nimport {\n Tooltip,\n GetProp,\n} from 'antd';\nimport {\n Bubble,\n Prompts,\n} from '@ant-design/x';\nimport {\n UserOutlined,\n RedoOutlined,\n CopyOutlined,\n DeleteOutlined,\n} from '@ant-design/icons';\nimport clsx from 'clsx';\nimport MarkdownIt from 'markdown-it';\nimport reactHtmlParser from 'react-html-parser';\nimport MarkdownGlobalStyle from '@/styles/markdown';\nimport {\n MessageStatus,\n MessageRole,\n Messages,\n} from '@/types/XAiMessage';\nimport {\n XAiChatbotProps,\n ActionItem,\n} from '@/types/XAiChatbot';\nimport emptyIcon from '@/assets/empty.png';\nimport arrowUp from '@/assets/arrow-up.png';\nimport arrowDown from '@/assets/arrow-down.png';\nimport thinkIcon from '@/assets/think.png';\nimport groupIcon from '@/assets/group.png';\nimport arrowDownBlue from '@/assets/arrow-down-blue.png';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { useStyles, GlobalStyle } from './styles';\nimport XAiSender from '../XAiSender';\n\nconst styles = useStyles();\n\nconst md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: true,\n});\n\n// 自定义 link_open 渲染规则\nconst defaultRender = md.renderer.rules.link_open || ((tokens, idx, options, env, self) => {\n return self.renderToken(tokens, idx, options);\n});\n\n// a 标签打开规则\nmd.renderer.rules.link_open = (tokens, idx, options, env, self) => {\n // 添加 target=\"_blank\"\n const aIndex = tokens[idx].attrIndex('target');\n if (aIndex < 0) {\n tokens[idx].attrPush(['target', '_blank']);\n } else {\n tokens[idx].attrs![aIndex][1] = '_blank';\n }\n // 添加 rel=\"noopener noreferrer\"\n const relIndex = tokens[idx].attrIndex('rel');\n if (relIndex < 0) {\n tokens[idx].attrPush(['rel', 'noopener noreferrer']);\n } else {\n tokens[idx].attrs![relIndex][1] = 'noopener noreferrer';\n }\n return defaultRender(tokens, idx, options, env, self);\n};\n\nexport interface ActionHeaderProps {\n execute: any[];\n thinks: string,\n}\n\n// ActionHeader 组件\nexport const ActionHeader: React.FC<ActionHeaderProps> = ({ execute = [], thinks = '' }) => {\n const styles = useStyles();\n const [expanded, setExpanded] = useState(true);\n const [executeExpanded, setExecuteExpanded] = useState(false);\n \n console.log('ActionHeader debug:', { thinks, executeLength: execute.length });\n\n // 关键修复:只要有思考内容或执行过程就显示,不要同时要求两者都有\n if (!thinks && (!execute || execute.length === 0)) return null;\n\n const last = execute[execute.length - 1] || {};\n const { name } = last;\n const icon = last?.icon || last?.extra?.icon;\n\n return (\n <div className={styles.actionHeaderWrapper}>\n {!expanded && (\n <div className={styles.actionTitle} onClick={() => setExpanded(v => !v)}>\n <img src={thinkIcon} alt=\"icon\" className={styles.actionHeaderIcon} />\n <span className={styles.flex1}>运行过程</span>\n <img alt=\"展开icon\" src={arrowDown} className={styles.w('16px')} />\n </div>\n )}\n {expanded && (\n <div className={styles.actionHeaderDetail}>\n <div className={styles.actionDetailTitle} onClick={() => setExpanded(v => !v)}>\n <img src={thinkIcon} alt=\"\" className={clsx(styles.w(14))} />\n <div className={clsx(styles.flex1, styles.pl(10))}>隐藏运行过程</div>\n <img alt=\"收起icon\" src={arrowUp} className={styles.w('16px')} />\n </div>\n \n {thinks && (\n <div className={styles.actionDetailContent}>\n <span>{thinks}</span>\n </div>\n )}\n \n {execute && execute.length > 0 && (\n <>\n {!executeExpanded && (\n <div className={styles.executeHiddenWrapper} onClick={() => setExecuteExpanded(v => !v)}>\n {icon && <img src={icon} alt=\"icon\" className={styles.h(20)} />}\n <span className={styles.flex1}>{name}</span>\n <img alt=\"工具icon\" src={arrowDownBlue} className={styles.w('16px')} />\n </div>\n )}\n {executeExpanded && (\n <div className={styles.executeWrapper}>\n <div className={styles.executeTitle} onClick={() => setExecuteExpanded(v => !v)}>\n <img src={groupIcon} alt=\"icon\" className={styles.executeHeaderIcon} />\n <span className={styles.flex1}>隐藏运行详情</span>\n <img alt=\"展开详情icon\" src={arrowUp} className={styles.w('16px')} />\n </div>\n <div className={styles.executeContent}>\n {execute.map((action: any, idx: number) => {\n const thinkIcon = action?.expandIcon || action?.extra?.expandIcon || action?.extra?.icon || action?.icon;\n const thinkCost = action?.cost || action?.extra?.cost;\n return (\n <div key={action.uniqueId || idx} className={styles.actionHeaderDetailItem}>\n {thinkIcon && <img src={thinkIcon} alt=\"icon\" className={styles.actionHeaderIcon} />}\n <span>{action?.name}</span>\n <span className={styles.actionHeaderCost}>{thinkCost ? `${thinkCost}s` : ''}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n\n// 默认消息功能区\nconst defaultActions: ActionItem[] = [\n {\n key: 'redo',\n icon: <RedoOutlined />,\n tooltip: '重新生成',\n },\n {\n key: 'copy',\n icon: <CopyOutlined />,\n tooltip: '复制',\n },\n {\n key: 'delete',\n icon: <DeleteOutlined />,\n tooltip: '删除',\n },\n];\n\n\nconst XAiChatbot: React.FC<XAiChatbotProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n\n const {\n navbarShow = false,\n navbar,\n renderNavbar = null,\n clearBtnShow = true,\n inputShow = true,\n // renderMessageContent,\n // quickReplies = [],\n // quickRepliesVisible = true,\n // onQuickReplyClick,\n loading: propLoading = false,\n messageTooltip,\n avatar,\n userAvatar,\n messages: propMessages,\n text = '',\n footerTips = '',\n empty = null,\n emptyStateImage = emptyIcon,\n emptyStateText = '我的智能体',\n messageActions = defaultActions,\n onMessagesActionsCallback,\n // 点击帮助消息\n onSuggestMessageClick,\n onSend,\n onClear,\n onStop,\n providerId,\n // 消息顶部\n messageTop,\n } = mergedProps;\n\n // 如果在 Provider 中,使用 Provider 的状态\n const messages = mergedProps.messages || propMessages || [];\n const loading = mergedProps.loading || propLoading;\n\n const [content, setContent] = useState<string>(text); // 输入框文本\n const lastMessageId = useRef<string>('');\n const isScriptScrolling = useRef<boolean>(false);\n const chatId = providerId ? `za-chatbot-container-${providerId}` : 'za-chatbot-container';\n\n // 滚动到最底部\n const scrollToBottom = () => {\n isScriptScrolling.current = true;\n setTimeout(() => {\n const mainChatWrapper = document.getElementById(chatId);\n if (mainChatWrapper) {\n mainChatWrapper.scrollTop = mainChatWrapper?.scrollHeight;\n }\n isScriptScrolling.current = false;\n }, 0);\n };\n\n // 消息功能区组件\n const FooterActions: React.FC<{ data: Messages; lastMessage: boolean }> = ({ data, lastMessage = false }) => (\n <div className={clsx(styles.flex, styles.gap(13))}>\n {messageActions.map((action: ActionItem, index: number) => {\n if (!lastMessage && action.key === 'redo') return null;\n return (\n <Tooltip key={action.key} title={action.tooltip}>\n <span className={styles.cursor('pointer')} onClick={() => onMessagesActionsCallback?.(index, data)}>\n {action.icon}\n </span>\n </Tooltip>\n );\n })}\n </div>\n );\n\n // 消息底部区域\n const MessageFooter: React.FC<{ data: Messages; lastMessage: boolean }> = ({ data, lastMessage = false }) => (\n <>\n {messageTooltip?.(data)}\n <FooterActions data={data} lastMessage={lastMessage} />\n </>\n );\n\n // 聊天角色\n const rolesObject: GetProp<typeof Bubble.List, 'roles'> = {\n assistant: {\n placement: 'start',\n avatar: { icon: avatar || <UserOutlined className={clsx(styles.bg('#fde3cf'), styles.userAvatar)} /> },\n typing: { step: 5, interval: 20 },\n style: {\n maxWidth: 600,\n },\n classNames: {\n content: 'assistant-content',\n },\n },\n user: {\n placement: 'end',\n avatar: { icon: userAvatar || <UserOutlined className={clsx(styles.bg('#87d068'), styles.userAvatar)} /> },\n classNames: {\n content: 'user-content',\n },\n },\n suggestion: {\n placement: 'start',\n avatar: { icon: <UserOutlined />, style: { visibility: 'hidden' } },\n variant: 'borderless',\n },\n };\n\n // 触发发送\n const handleSend = (type: string, content: string) => {\n if (content.trim()) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSend?.(type, content);\n setContent(''); // 发送后清空输入框内容\n scrollToBottom();\n }\n };\n\n // 输出内容\n const handleChange = (content: string) => {\n setContent(content);\n }\n\n // 停止生成\n const handleStop = () => {\n onStop?.();\n }\n\n // 导航栏\n const NavBar: React.FC = () => {\n if (renderNavbar) {\n return renderNavbar();\n } if (navbar?.title) {\n return (\n <header className={styles.navbar}>\n {navbar.avatar && <img src={navbar.avatar} className={styles.avatar} alt=\"\" />}\n <div>\n <div className={styles.title}>{navbar.title}</div>\n <div className={styles.subtitle}>{navbar.subtitle}</div>\n </div>\n </header>\n );\n }\n return <></>;\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n };\n\n // 空状态\n const EmptyState = useMemo(() => () => (\n empty ? empty : <div className={styles.emptyWrapper}>\n <img src={emptyStateImage} alt=\"空状态图标\" className={styles.emptyImg} />\n <div className={clsx(styles.text(16), styles.weight(600), styles.textColor('#343434'))}>{emptyStateText}</div>\n </div>\n // eslint-disable-next-line react-hooks/exhaustive-deps\n ), [emptyStateImage, emptyStateText]);\n\n return (\n <>\n <GlobalStyle />\n <MarkdownGlobalStyle />\n <div id=\"x-ai-chatbot\" className={styles.wrapper}>\n { navbarShow && <NavBar /> }\n {/** 消息容器 */}\n <div className={styles.messageContainer}>\n {/* 消息列表主体 */}\n {\n messages?.length\n ? (\n <Bubble.List\n id={chatId}\n roles={rolesObject}\n className={styles.messageList}\n items={messages.map((msg: any) => {\n const { id, role, status, type, execute = [], thinks = '', extra = { noFooter: false } } = msg as Messages;\n // 最后一条 AI消息标识\n if (role === MessageRole.assistant) {\n lastMessageId.current = id;\n }\n // 会话内容\n const bubbleContent: any = {\n key: id,\n role,\n loading: status === MessageStatus.init,\n header: (() => messageTop || \n <ActionHeader\n execute={execute}\n thinks={thinks}\n />),\n content: (() => {\n // 文本消息\n if (type === 'TextMessage') {\n // 用户消息\n if (role === 'user') {\n return (\n <div\n className=\"markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {msg.content?.text}\n </div>\n );\n }\n // 输出html字符串\n const html = md.render(msg.content?.text || '');\n // 生成React节点\n const htmlString = reactHtmlParser(html);\n return (\n <>\n <div\n className=\"markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {htmlString}\n </div>\n </>\n );\n }\n // 图片类型\n if (type === 'ImageMessage') {\n return (\n <div style={{ minWidth: 0, maxWidth: 600 }}>\n <img src={msg.content?.bytes} alt=\"\" style={{ maxWidth: 680 }} />\n </div>\n );\n }\n // 提示类型\n if (type === 'SuggestionMessage') {\n return (\n <Prompts\n vertical\n items={msg.content as any}\n onItemClick={(info) => {\n onSuggestMessageClick?.(info.data, id, 'text');\n if (info.data.description) {\n onSend?.('text', info.data.description as string);\n }\n }}\n />\n );\n }\n // 其他类型...\n return null;\n })(),\n };\n\n if (!extra.noFooter) {\n bubbleContent.footer = (() => {\n return (\n role === MessageRole.assistant && status !== MessageStatus.failed && (\n <>\n <MessageFooter data={msg as Messages} lastMessage={lastMessageId.current === id} />\n </>\n )\n );\n });\n }\n\n return bubbleContent;\n })}\n />\n )\n : (\n <EmptyState />\n )\n }\n </div>\n {/* 输入框 */}\n { inputShow && <XAiSender\n value={content}\n loading={loading}\n footerTips={footerTips}\n clearBtnShow={clearBtnShow}\n onChange={handleChange}\n onSubmit={handleSend}\n onStop={handleStop}\n onClear={confirmClear}\n /> }\n </div>\n </>\n );\n};\n\nexport default XAiChatbot;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// 文件: components/XAiChatbot/index.tsx\n\nimport React, {\n useRef,\n useState,\n useMemo,\n} from 'react';\nimport {\n Tooltip,\n GetProp,\n} from 'antd';\nimport {\n Bubble,\n Prompts,\n} from '@ant-design/x';\nimport {\n UserOutlined,\n RedoOutlined,\n CopyOutlined,\n DeleteOutlined,\n} from '@ant-design/icons';\nimport clsx from 'clsx';\nimport MarkdownIt from 'markdown-it';\nimport reactHtmlParser from 'react-html-parser';\nimport MarkdownGlobalStyle from '@/styles/markdown';\nimport {\n MessageStatus,\n MessageRole,\n Messages,\n} from '@/types/XAiMessage';\nimport {\n XAiChatbotProps,\n ActionItem,\n} from '@/types/XAiChatbot';\nimport emptyIcon from '@/assets/empty.png';\nimport arrowUp from '@/assets/arrow-up.png';\nimport arrowDown from '@/assets/arrow-down.png';\nimport thinkIcon from '@/assets/think.png';\nimport groupIcon from '@/assets/group.png';\nimport arrowDownBlue from '@/assets/arrow-down-blue.png';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { useStyles, GlobalStyle } from './styles';\nimport XAiSender from '../XAiSender';\n\nconst styles = useStyles();\n\nconst md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: true,\n});\n\n// 自定义 link_open 渲染规则\nconst defaultRender = md.renderer.rules.link_open || ((tokens, idx, options, env, self) => {\n return self.renderToken(tokens, idx, options);\n});\n\n// a 标签打开规则\nmd.renderer.rules.link_open = (tokens, idx, options, env, self) => {\n // 添加 target=\"_blank\"\n const aIndex = tokens[idx].attrIndex('target');\n if (aIndex < 0) {\n tokens[idx].attrPush(['target', '_blank']);\n } else {\n tokens[idx].attrs![aIndex][1] = '_blank';\n }\n // 添加 rel=\"noopener noreferrer\"\n const relIndex = tokens[idx].attrIndex('rel');\n if (relIndex < 0) {\n tokens[idx].attrPush(['rel', 'noopener noreferrer']);\n } else {\n tokens[idx].attrs![relIndex][1] = 'noopener noreferrer';\n }\n return defaultRender(tokens, idx, options, env, self);\n};\n\nexport interface ActionHeaderProps {\n execute: any[];\n thinks: string,\n}\n\n// ActionHeader 组件\nexport const ActionHeader: React.FC<ActionHeaderProps> = ({ execute = [], thinks = '' }) => {\n const styles = useStyles();\n const [expanded, setExpanded] = useState(true);\n const [executeExpanded, setExecuteExpanded] = useState(false);\n\n // 关键修复:只要有思考内容或执行过程就显示,不要同时要求两者都有\n if (!thinks && (!execute || execute.length === 0)) return null;\n\n const last = execute[execute.length - 1] || {};\n const { name } = last;\n const icon = last?.icon || last?.extra?.icon;\n\n return (\n <div className={styles.actionHeaderWrapper}>\n {!expanded && (\n <div className={styles.actionTitle} onClick={() => setExpanded(v => !v)}>\n <img src={thinkIcon} alt=\"icon\" className={styles.actionHeaderIcon} />\n <span className={styles.flex1}>运行过程</span>\n <img alt=\"展开icon\" src={arrowDown} className={styles.w('16px')} />\n </div>\n )}\n {expanded && (\n <div className={styles.actionHeaderDetail}>\n <div className={styles.actionDetailTitle} onClick={() => setExpanded(v => !v)}>\n <img src={thinkIcon} alt=\"\" className={clsx(styles.w(14))} />\n <div className={clsx(styles.flex1, styles.pl(10))}>隐藏运行过程</div>\n <img alt=\"收起icon\" src={arrowUp} className={styles.w('16px')} />\n </div>\n \n {thinks && (\n <div className={styles.actionDetailContent} style={{ whiteSpace: 'pre-line' }}>\n {thinks}\n </div>\n )}\n \n {execute && execute.length > 0 && (\n <>\n {!executeExpanded && (\n <div className={styles.executeHiddenWrapper} onClick={() => setExecuteExpanded(v => !v)}>\n {icon && <img src={icon} alt=\"icon\" className={styles.h(20)} />}\n <span className={styles.flex1}>{name}</span>\n <img alt=\"工具icon\" src={arrowDownBlue} className={styles.w('16px')} />\n </div>\n )}\n {executeExpanded && (\n <div className={styles.executeWrapper}>\n <div className={styles.executeTitle} onClick={() => setExecuteExpanded(v => !v)}>\n <img src={groupIcon} alt=\"icon\" className={styles.executeHeaderIcon} />\n <span className={styles.flex1}>隐藏运行详情</span>\n <img alt=\"展开详情icon\" src={arrowUp} className={styles.w('16px')} />\n </div>\n <div className={styles.executeContent}>\n {execute.map((action: any, idx: number) => {\n const thinkIcon = action?.expandIcon || action?.extra?.expandIcon || action?.extra?.icon || action?.icon;\n const thinkCost = action?.cost || action?.extra?.cost;\n return (\n <div key={action.uniqueId || idx} className={styles.actionHeaderDetailItem}>\n {thinkIcon && <img src={thinkIcon} alt=\"icon\" className={styles.actionHeaderIcon} />}\n <span>{action?.name}</span>\n <span className={styles.actionHeaderCost}>{thinkCost ? `${thinkCost}s` : ''}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n\n// 默认消息功能区\nconst defaultActions: ActionItem[] = [\n {\n key: 'redo',\n icon: <RedoOutlined />,\n tooltip: '重新生成',\n },\n {\n key: 'copy',\n icon: <CopyOutlined />,\n tooltip: '复制',\n },\n {\n key: 'delete',\n icon: <DeleteOutlined />,\n tooltip: '删除',\n },\n];\n\n\nconst XAiChatbot: React.FC<XAiChatbotProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n\n const {\n navbarShow = false,\n navbar,\n renderNavbar = null,\n clearBtnShow = true,\n inputShow = true,\n // renderMessageContent,\n // quickReplies = [],\n // quickRepliesVisible = true,\n // onQuickReplyClick,\n loading: propLoading = false,\n messageTooltip,\n avatar,\n userAvatar,\n messages: propMessages,\n text = '',\n footerTips = '',\n empty = null,\n emptyStateImage = emptyIcon,\n emptyStateText = '我的智能体',\n messageActions = defaultActions,\n onMessagesActionsCallback,\n // 点击帮助消息\n onSuggestMessageClick,\n onSend,\n onClear,\n onStop,\n providerId,\n // 消息顶部\n messageTop,\n } = mergedProps;\n\n // 如果在 Provider 中,使用 Provider 的状态\n const messages = mergedProps.messages || propMessages || [];\n const loading = mergedProps.loading || propLoading;\n\n const [content, setContent] = useState<string>(text); // 输入框文本\n const lastMessageId = useRef<string>('');\n const isScriptScrolling = useRef<boolean>(false);\n const chatId = providerId ? `za-chatbot-container-${providerId}` : 'za-chatbot-container';\n\n // 滚动到最底部\n const scrollToBottom = () => {\n isScriptScrolling.current = true;\n setTimeout(() => {\n const mainChatWrapper = document.getElementById(chatId);\n if (mainChatWrapper) {\n mainChatWrapper.scrollTop = mainChatWrapper?.scrollHeight;\n }\n isScriptScrolling.current = false;\n }, 0);\n };\n\n // 消息功能区组件\n const FooterActions: React.FC<{ data: Messages; lastMessage: boolean }> = ({ data, lastMessage = false }) => (\n <div className={clsx(styles.flex, styles.gap(13))}>\n {messageActions.map((action: ActionItem, index: number) => {\n if (!lastMessage && action.key === 'redo') return null;\n return (\n <Tooltip key={action.key} title={action.tooltip}>\n <span className={styles.cursor('pointer')} onClick={() => onMessagesActionsCallback?.(index, data)}>\n {action.icon}\n </span>\n </Tooltip>\n );\n })}\n </div>\n );\n\n // 消息底部区域\n const MessageFooter: React.FC<{ data: Messages; lastMessage: boolean }> = ({ data, lastMessage = false }) => (\n <>\n {messageTooltip?.(data)}\n <FooterActions data={data} lastMessage={lastMessage} />\n </>\n );\n\n // 聊天角色\n const rolesObject: GetProp<typeof Bubble.List, 'roles'> = {\n assistant: {\n placement: 'start',\n avatar: { icon: avatar || <UserOutlined className={clsx(styles.bg('#fde3cf'), styles.userAvatar)} /> },\n typing: { step: 5, interval: 20 },\n style: {\n maxWidth: 600,\n },\n classNames: {\n content: 'assistant-content',\n },\n },\n user: {\n placement: 'end',\n avatar: { icon: userAvatar || <UserOutlined className={clsx(styles.bg('#87d068'), styles.userAvatar)} /> },\n classNames: {\n content: 'user-content',\n },\n },\n suggestion: {\n placement: 'start',\n avatar: { icon: <UserOutlined />, style: { visibility: 'hidden' } },\n variant: 'borderless',\n },\n };\n\n // 触发发送\n const handleSend = (type: string, content: string) => {\n if (content.trim()) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSend?.(type, content);\n setContent(''); // 发送后清空输入框内容\n scrollToBottom();\n }\n };\n\n // 输出内容\n const handleChange = (content: string) => {\n setContent(content);\n }\n\n // 停止生成\n const handleStop = () => {\n onStop?.();\n }\n\n // 导航栏\n const NavBar: React.FC = () => {\n if (renderNavbar) {\n return renderNavbar();\n } if (navbar?.title) {\n return (\n <header className={styles.navbar}>\n {navbar.avatar && <img src={navbar.avatar} className={styles.avatar} alt=\"\" />}\n <div>\n <div className={styles.title}>{navbar.title}</div>\n <div className={styles.subtitle}>{navbar.subtitle}</div>\n </div>\n </header>\n );\n }\n return <></>;\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n };\n\n // 空状态\n const EmptyState = useMemo(() => () => (\n empty ? empty : <div className={styles.emptyWrapper}>\n <img src={emptyStateImage} alt=\"空状态图标\" className={styles.emptyImg} />\n <div className={clsx(styles.text(16), styles.weight(600), styles.textColor('#343434'))}>{emptyStateText}</div>\n </div>\n // eslint-disable-next-line react-hooks/exhaustive-deps\n ), [emptyStateImage, emptyStateText]);\n\n return (\n <>\n <GlobalStyle />\n <MarkdownGlobalStyle />\n <div id=\"x-ai-chatbot\" className={styles.wrapper}>\n { navbarShow && <NavBar /> }\n {/** 消息容器 */}\n <div className={styles.messageContainer}>\n {/* 消息列表主体 */}\n {\n messages?.length\n ? (\n <Bubble.List\n id={chatId}\n roles={rolesObject}\n className={styles.messageList}\n items={messages.map((msg: any) => {\n const { id, role, status, type, execute = [], thinks = '', extra = { noFooter: false } } = msg as Messages;\n // 最后一条 AI消息标识\n if (role === MessageRole.assistant) {\n lastMessageId.current = id;\n }\n // 会话内容\n const bubbleContent: any = {\n key: id,\n role,\n loading: status === MessageStatus.init,\n header: (() => messageTop || \n <ActionHeader\n execute={execute}\n thinks={thinks}\n />),\n content: (() => {\n // 文本消息\n if (type === 'TextMessage') {\n // 用户消息\n if (role === 'user') {\n return (\n <div\n className=\"markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {msg.content?.text}\n </div>\n );\n }\n // 输出html字符串\n const html = md.render(msg.content?.text || '');\n // 生成React节点\n const htmlString = reactHtmlParser(html);\n return (\n <>\n <div\n className=\"markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {htmlString}\n </div>\n </>\n );\n }\n // 图片类型\n if (type === 'ImageMessage') {\n return (\n <div style={{ minWidth: 0, maxWidth: 600 }}>\n <img src={msg.content?.bytes} alt=\"\" style={{ maxWidth: 680 }} />\n </div>\n );\n }\n // 提示类型\n if (type === 'SuggestionMessage') {\n return (\n <Prompts\n vertical\n items={msg.content as any}\n onItemClick={(info) => {\n onSuggestMessageClick?.(info.data, id, 'text');\n if (info.data.description) {\n onSend?.('text', info.data.description as string);\n }\n }}\n />\n );\n }\n // 其他类型...\n return null;\n })(),\n };\n\n if (!extra.noFooter) {\n bubbleContent.footer = (() => {\n return (\n role === MessageRole.assistant && status !== MessageStatus.failed && (\n <>\n <MessageFooter data={msg as Messages} lastMessage={lastMessageId.current === id} />\n </>\n )\n );\n });\n }\n\n return bubbleContent;\n })}\n />\n )\n : (\n <EmptyState />\n )\n }\n </div>\n {/* 输入框 */}\n { inputShow && <XAiSender\n value={content}\n loading={loading}\n footerTips={footerTips}\n clearBtnShow={clearBtnShow}\n onChange={handleChange}\n onSubmit={handleSend}\n onStop={handleStop}\n onClear={confirmClear}\n /> }\n </div>\n </>\n );\n};\n\nexport default XAiChatbot;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAIO;AACP,kBAGO;AACP,eAGO;AACP,mBAKO;AACP,kBAAiB;AACjB,yBAAuB;AACvB,+BAA4B;AAC5B,sBAAgC;AAChC,wBAIO;AAKP,mBAAsB;AACtB,sBAAoB;AACpB,wBAAsB;AACtB,mBAAsB;AACtB,mBAAsB;AACtB,6BAA0B;AAC1B,gCAAkC;AAClC,oBAAuC;AACvC,uBAAsB;AAEtB,IAAM,aAAS,yBAAU;AAEzB,IAAM,KAAK,IAAI,mBAAAA,QAAW;AAAA,EACxB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AACf,CAAC;AAGD,IAAM,gBAAgB,GAAG,SAAS,MAAM,cAAc,CAAC,QAAQ,KAAK,SAAS,KAAK,SAAS;AACzF,SAAO,KAAK,YAAY,QAAQ,KAAK,OAAO;AAC9C;AAGA,GAAG,SAAS,MAAM,YAAY,CAAC,QAAQ,KAAK,SAAS,KAAK,SAAS;AAEjE,QAAM,SAAS,OAAO,GAAG,EAAE,UAAU,QAAQ;AAC7C,MAAI,SAAS,GAAG;AACd,WAAO,GAAG,EAAE,SAAS,CAAC,UAAU,QAAQ,CAAC;AAAA,EAC3C,OAAO;AACL,WAAO,GAAG,EAAE,MAAO,MAAM,EAAE,CAAC,IAAI;AAAA,EAClC;AAEA,QAAM,WAAW,OAAO,GAAG,EAAE,UAAU,KAAK;AAC5C,MAAI,WAAW,GAAG;AAChB,WAAO,GAAG,EAAE,SAAS,CAAC,OAAO,qBAAqB,CAAC;AAAA,EACrD,OAAO;AACL,WAAO,GAAG,EAAE,MAAO,QAAQ,EAAE,CAAC,IAAI;AAAA,EACpC;AACA,SAAO,cAAc,QAAQ,KAAK,SAAS,KAAK,IAAI;AACtD;AAQO,IAAM,eAA4C,CAAC,EAAE,UAAU,CAAC,GAAG,SAAS,GAAG,MAAM;AAlF5F;AAmFE,QAAMC,cAAS,yBAAU;AACzB,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,IAAI;AAC7C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAAS,KAAK;AAG5D,MAAI,CAAC,WAAW,CAAC,WAAW,QAAQ,WAAW;AAAI,WAAO;AAE1D,QAAM,OAAO,QAAQ,QAAQ,SAAS,CAAC,KAAK,CAAC;AAC7C,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,QAAO,6BAAM,WAAQ,kCAAM,UAAN,mBAAa;AAExC,SACE,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,uBACpB,CAAC,YACA,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,aAAa,SAAS,MAAM,YAAY,OAAK,CAAC,CAAC,KACpE,6BAAAC,QAAA,cAAC,SAAI,KAAK,aAAAC,SAAW,KAAI,QAAO,WAAWF,QAAO,kBAAkB,GACpE,6BAAAC,QAAA,cAAC,UAAK,WAAWD,QAAO,SAAO,MAAI,GACnC,6BAAAC,QAAA,cAAC,SAAI,KAAI,UAAS,KAAK,kBAAAE,SAAW,WAAWH,QAAO,EAAE,MAAM,GAAG,CACjE,GAED,YACC,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,sBACrB,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,mBAAmB,SAAS,MAAM,YAAY,OAAK,CAAC,CAAC,KAC1E,6BAAAC,QAAA,cAAC,SAAI,KAAK,aAAAC,SAAW,KAAI,IAAG,eAAW,YAAAE,SAAKJ,QAAO,EAAE,EAAE,CAAC,GAAG,GAC3D,6BAAAC,QAAA,cAAC,SAAI,eAAW,YAAAG,SAAKJ,QAAO,OAAOA,QAAO,GAAG,EAAE,CAAC,KAAG,QAAM,GACzD,6BAAAC,QAAA,cAAC,SAAI,KAAI,UAAS,KAAK,gBAAAI,SAAS,WAAWL,QAAO,EAAE,MAAM,GAAG,CAC/D,GAEC,UACC,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,qBAAqB,OAAO,EAAE,YAAY,WAAW,KACzE,MACH,GAGD,WAAW,QAAQ,SAAS,KAC3B,6BAAAC,QAAA,2BAAAA,QAAA,gBACG,CAAC,mBACA,6BAAAA,QAAA,cAAC,SAAI,WAAWD,QAAO,sBAAsB,SAAS,MAAM,mBAAmB,OAAK,CAAC,CAAC,KACnF,QAAQ,6BAAAC,QAAA,cAAC,SAAI,KAAK,MAAM,KAAI,QAAO,WAAWD,QAAO,EAAE,EAAE,GAAG,GAC7D,6BAAAC,QAAA,cAAC,UAAK,WAAWD,QAAO,SAAQ,IAAK,GACrC,6BAAAC,QAAA,cAAC,SAAI,KAAI,UAAS,KAAK,uBAAAK,SAAe,WAAWN,QAAO,EAAE,MAAM,GAAG,CACrE,GAED,mBACC,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,kBACrB,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,cAAc,SAAS,MAAM,mBAAmB,OAAK,CAAC,CAAC,KAC5E,6BAAAC,QAAA,cAAC,SAAI,KAAK,aAAAM,SAAW,KAAI,QAAO,WAAWP,QAAO,mBAAmB,GACrE,6BAAAC,QAAA,cAAC,UAAK,WAAWD,QAAO,SAAO,QAAM,GACrC,6BAAAC,QAAA,cAAC,SAAI,KAAI,YAAW,KAAK,gBAAAI,SAAS,WAAWL,QAAO,EAAE,MAAM,GAAG,CACjE,GACA,6BAAAC,QAAA,cAAC,SAAI,WAAWD,QAAO,kBACpB,QAAQ,IAAI,CAAC,QAAa,QAAgB;AAtI/D,QAAAQ,KAAA;AAuIsB,UAAMN,cAAY,iCAAQ,iBAAcM,MAAA,iCAAQ,UAAR,gBAAAA,IAAe,iBAAc,sCAAQ,UAAR,mBAAe,UAAQ,iCAAQ;AACpG,UAAM,aAAY,iCAAQ,WAAQ,sCAAQ,UAAR,mBAAe;AACjD,WACE,6BAAAP,QAAA,cAAC,SAAI,KAAK,OAAO,YAAY,KAAK,WAAWD,QAAO,0BACjDE,cAAa,6BAAAD,QAAA,cAAC,SAAI,KAAKC,YAAW,KAAI,QAAO,WAAWF,QAAO,kBAAkB,GAClF,6BAAAC,QAAA,cAAC,cAAM,iCAAQ,IAAK,GACpB,6BAAAA,QAAA,cAAC,UAAK,WAAWD,QAAO,oBAAmB,YAAY,GAAG,eAAe,EAAG,CAC9E;AAAA,EAEJ,CAAC,CACH,CACF,CAEJ,CAEJ,CAEJ;AAEJ;AAGA,IAAM,iBAA+B;AAAA,EACnC;AAAA,IACE,KAAK;AAAA,IACL,MAAM,6BAAAC,QAAA,cAAC,+BAAa;AAAA,IACpB,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,MAAM,6BAAAA,QAAA,cAAC,+BAAa;AAAA,IACpB,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,MAAM,6BAAAA,QAAA,cAAC,iCAAe;AAAA,IACtB,SAAS;AAAA,EACX;AACF;AAGA,IAAM,aAAwC,CAAC,UAAU;AAEvD,QAAM,EAAE,YAAY,QAAI,6CAAkB,KAAK;AAE/C,QAAM;AAAA,IACJ,aAAa;AAAA,IACb;AAAA,IACA,eAAe;AAAA,IACf,eAAe;AAAA,IACf,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,IAKZ,SAAS,cAAc;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,kBAAkB,aAAAQ;AAAA,IAClB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,EACF,IAAI;AAGJ,QAAM,WAAW,YAAY,YAAY,gBAAgB,CAAC;AAC1D,QAAM,UAAU,YAAY,WAAW;AAEvC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAiB,IAAI;AACnD,QAAM,oBAAgB,qBAAe,EAAE;AACvC,QAAM,wBAAoB,qBAAgB,KAAK;AAC/C,QAAM,SAAS,aAAa,wBAAwB,eAAe;AAGnE,QAAM,iBAAiB,MAAM;AAC3B,sBAAkB,UAAU;AAC5B,eAAW,MAAM;AACf,YAAM,kBAAkB,SAAS,eAAe,MAAM;AACtD,UAAI,iBAAiB;AACnB,wBAAgB,YAAY,mDAAiB;AAAA,MAC/C;AACA,wBAAkB,UAAU;AAAA,IAC9B,GAAG,CAAC;AAAA,EACN;AAGA,QAAM,gBAAoE,CAAC,EAAE,MAAM,cAAc,MAAM,MACrG,6BAAAR,QAAA,cAAC,SAAI,eAAW,YAAAG,SAAK,OAAO,MAAM,OAAO,IAAI,EAAE,CAAC,KAC7C,eAAe,IAAI,CAAC,QAAoB,UAAkB;AACzD,QAAI,CAAC,eAAe,OAAO,QAAQ;AAAQ,aAAO;AAClD,WACE,6BAAAH,QAAA,cAAC,uBAAQ,KAAK,OAAO,KAAK,OAAO,OAAO,WACtC,6BAAAA,QAAA,cAAC,UAAK,WAAW,OAAO,OAAO,SAAS,GAAG,SAAS,MAAM,uEAA4B,OAAO,SAC1F,OAAO,IACV,CACF;AAAA,EAEJ,CAAC,CACH;AAIF,QAAM,gBAAoE,CAAC,EAAE,MAAM,cAAc,MAAM,MACrG,6BAAAA,QAAA,2BAAAA,QAAA,gBACG,iDAAiB,OAClB,6BAAAA,QAAA,cAAC,iBAAc,MAAY,aAA0B,CACvD;AAIF,QAAM,cAAoD;AAAA,IACxD,WAAW;AAAA,MACT,WAAW;AAAA,MACX,QAAQ,EAAE,MAAM,UAAU,6BAAAA,QAAA,cAAC,6BAAa,eAAW,YAAAG,SAAK,OAAO,GAAG,SAAS,GAAG,OAAO,UAAU,GAAG,EAAG;AAAA,MACrG,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG;AAAA,MAChC,OAAO;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,MACA,YAAY;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,WAAW;AAAA,MACX,QAAQ,EAAE,MAAM,cAAc,6BAAAH,QAAA,cAAC,6BAAa,eAAW,YAAAG,SAAK,OAAO,GAAG,SAAS,GAAG,OAAO,UAAU,GAAG,EAAG;AAAA,MACzG,YAAY;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,YAAY;AAAA,MACV,WAAW;AAAA,MACX,QAAQ,EAAE,MAAM,6BAAAH,QAAA,cAAC,+BAAa,GAAI,OAAO,EAAE,YAAY,SAAS,EAAE;AAAA,MAClE,SAAS;AAAA,IACX;AAAA,EACF;AAGA,QAAM,aAAa,CAAC,MAAcS,aAAoB;AACpD,QAAIA,SAAQ,KAAK,GAAG;AAElB,uCAAS,MAAMA;AACf,iBAAW,EAAE;AACb,qBAAe;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,eAAe,CAACA,aAAoB;AACxC,eAAWA,QAAO;AAAA,EACpB;AAGA,QAAM,aAAa,MAAM;AACvB;AAAA,EACF;AAGA,QAAM,SAAmB,MAAM;AAC7B,QAAI,cAAc;AAChB,aAAO,aAAa;AAAA,IACtB;AAAE,QAAI,iCAAQ,OAAO;AACnB,aACE,6BAAAT,QAAA,cAAC,YAAO,WAAW,OAAO,UACvB,OAAO,UAAU,6BAAAA,QAAA,cAAC,SAAI,KAAK,OAAO,QAAQ,WAAW,OAAO,QAAQ,KAAI,IAAG,GAC5E,6BAAAA,QAAA,cAAC,aACC,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,SAAQ,OAAO,KAAM,GAC5C,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,YAAW,OAAO,QAAS,CACpD,CACF;AAAA,IAEJ;AACA,WAAO,6BAAAA,QAAA,2BAAAA,QAAA,cAAE;AAAA,EACX;AAGA,QAAM,eAAe,MAAM;AACzB;AAAA,EACF;AAGA,QAAM,iBAAa,sBAAQ,MAAM,MAC/B,QAAQ,QAAQ,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,gBACrC,6BAAAA,QAAA,cAAC,SAAI,KAAK,iBAAiB,KAAI,SAAQ,WAAW,OAAO,UAAU,GACnE,6BAAAA,QAAA,cAAC,SAAI,eAAW,YAAAG,SAAK,OAAO,KAAK,EAAE,GAAG,OAAO,OAAO,GAAG,GAAG,OAAO,UAAU,SAAS,CAAC,KAAI,cAAe,CAC1G,GAEC,CAAC,iBAAiB,cAAc,CAAC;AAEpC,SACE,6BAAAH,QAAA,2BAAAA,QAAA,gBACE,6BAAAA,QAAA,cAAC,+BAAY,GACb,6BAAAA,QAAA,cAAC,gBAAAU,SAAA,IAAoB,GACrB,6BAAAV,QAAA,cAAC,SAAI,IAAG,gBAAe,WAAW,OAAO,WACrC,cAAc,6BAAAA,QAAA,cAAC,YAAO,GAExB,6BAAAA,QAAA,cAAC,SAAI,WAAW,OAAO,qBAGrB,qCAAU,UAEN,6BAAAA,QAAA;AAAA,IAAC,gBAAO;AAAA,IAAP;AAAA,MACC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,WAAW,OAAO;AAAA,MAClB,OAAO,SAAS,IAAI,CAAC,QAAa;AAChC,cAAM,EAAE,IAAI,MAAM,QAAQ,MAAM,UAAU,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,UAAU,MAAM,EAAE,IAAI;AAE3F,YAAI,SAAS,8BAAY,WAAW;AAClC,wBAAc,UAAU;AAAA,QAC1B;AAEA,cAAM,gBAAqB;AAAA,UACzB,KAAK;AAAA,UACL;AAAA,UACA,SAAS,WAAW,gCAAc;AAAA,UAClC,QAAS,MAAM,cACb,6BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UACF,UAAU,MAAM;AAhXpC;AAkXsB,gBAAI,SAAS,eAAe;AAE1B,kBAAI,SAAS,QAAQ;AACnB,uBACE,6BAAAA,QAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,UAAU;AAAA,oBACZ;AAAA;AAAA,mBAEC,SAAI,YAAJ,mBAAa;AAAA,gBAChB;AAAA,cAEJ;AAEA,oBAAM,OAAO,GAAG,SAAO,SAAI,YAAJ,mBAAa,SAAQ,EAAE;AAE9C,oBAAM,iBAAa,yBAAAW,SAAgB,IAAI;AACvC,qBACE,6BAAAX,QAAA,2BAAAA,QAAA,gBACE,6BAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,UAAU;AAAA,kBACZ;AAAA;AAAA,gBAEC;AAAA,cACH,CACF;AAAA,YAEJ;AAEA,gBAAI,SAAS,gBAAgB;AAC3B,qBACE,6BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,UAAU,GAAG,UAAU,IAAI,KACvC,6BAAAA,QAAA,cAAC,SAAI,MAAK,SAAI,YAAJ,mBAAa,OAAO,KAAI,IAAG,OAAO,EAAE,UAAU,IAAI,GAAG,CACjE;AAAA,YAEJ;AAEA,gBAAI,SAAS,qBAAqB;AAChC,qBACE,6BAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAQ;AAAA,kBACR,OAAO,IAAI;AAAA,kBACX,aAAa,CAAC,SAAS;AACrB,mFAAwB,KAAK,MAAM,IAAI;AACvC,wBAAI,KAAK,KAAK,aAAa;AACzB,uDAAS,QAAQ,KAAK,KAAK;AAAA,oBAC7B;AAAA,kBACF;AAAA;AAAA,cACF;AAAA,YAEJ;AAEA,mBAAO;AAAA,UACT,GAAG;AAAA,QACL;AAEA,YAAI,CAAC,MAAM,UAAU;AACnB,wBAAc,SAAU,MAAM;AAC5B,mBACE,SAAS,8BAAY,aAAa,WAAW,gCAAc,UACzD,6BAAAA,QAAA,2BAAAA,QAAA,gBACE,6BAAAA,QAAA,cAAC,iBAAc,MAAM,KAAiB,aAAa,cAAc,YAAY,IAAI,CACnF;AAAA,UAGN;AAAA,QACF;AAEA,eAAO;AAAA,MACT,CAAC;AAAA;AAAA,EACH,IAGA,6BAAAA,QAAA,cAAC,gBAAW,CAGlB,GAEE,aAAa,6BAAAA,QAAA;AAAA,IAAC,iBAAAY;AAAA,IAAA;AAAA,MACd,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA;AAAA,EACX,CACF,CACF;AAEJ;AAEA,IAAO,qBAAQ;",
6
6
  "names": ["MarkdownIt", "styles", "React", "thinkIcon", "arrowDown", "clsx", "arrowUp", "arrowDownBlue", "groupIcon", "_a", "emptyIcon", "content", "MarkdownGlobalStyle", "reactHtmlParser", "XAiSender"]
7
7
  }
@@ -200,6 +200,8 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
200
200
  font-size: 14px;
201
201
  color: #767985;
202
202
  line-height: 20px;
203
+ display: inline-block;
204
+ white-space: 'pre-line';
203
205
  `,
204
206
  actionHeaderWrapper: import_css.css`
205
207
  margin-bottom: 12px;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiChatbot/styles.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport { css } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles, primaryBlue, lightBlue, darkGray, lightGray, borderGray } from '@/styles/common';\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n wrapper: css`\n display: flex;\n flex-direction: column;\n // max-height: 812px;\n min-height: 300px;\n max-width: 800px;\n width: 100%;\n height: 100%;\n min-width: 375px;\n // background-color: #fff;\n // border: 1px solid rgba(80,96,122,.15);\n border-radius: 12px;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n `,\n\n navbar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px 16px;\n border-bottom: 1px solid ${borderGray};\n // background-color: #fff;\n `,\n\n userAvatar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n width: 32px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n `,\n\n avatar: css`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n border: 1px solid ${borderGray};\n `,\n\n title: css`\n font-weight: 600;\n font-size: 16px;\n color: ${darkGray};\n `,\n\n subtitle: css`\n font-size: 12px;\n color: ${lightGray};\n margin-top: 2px;\n `,\n\n messageContainer: css`\n flex: 1;\n overflow-y: auto;\n padding: 16px 0;\n // background-color: #fff;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n position: relative;\n `,\n\n messageList: css`\n padding: 0 16px;\n `,\n\n emptyWrapper: css`\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: '#222';\n user-select: none;\n `,\n\n emptyImg: css`\n width: 60px;\n height: 60px;\n border-radius: 8px;\n margin-bottom: 16px;\n `,\n\n message: css`\n max-width: 70%;\n padding: 10px 14px;\n border-radius: 20px;\n background-color: ${lightBlue};\n color: ${darkGray};\n font-size: 14px;\n line-height: 1.4;\n word-break: break-word;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n `,\n\n messageRight: css`\n align-self: flex-end;\n background-color: ${primaryBlue};\n color: white;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 20px;\n border-top-left-radius: 20px;\n border-top-right-radius: 20px;\n `,\n\n quickReplies: css`\n display: flex;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n overflow-x: auto;\n `,\n\n replyItem: css`\n padding: 6px 12px;\n font-size: 13px;\n border: 1px solid ${primaryBlue};\n border-radius: 20px;\n background-color: #fff;\n color: ${primaryBlue};\n cursor: pointer;\n white-space: nowrap;\n user-select: none;\n transition: all 0.2s ease;\n \n &:hover {\n background-color: ${primaryBlue};\n color: #fff;\n }\n `,\n\n highlight: css`\n background-color: ${primaryBlue};\n color: white;\n border-color: ${primaryBlue};\n `,\n\n inputBar: css`\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n `,\n\n input: css`\n flex: 1;\n padding: 8px 12px;\n border: 1px solid ${borderGray};\n border-radius: 20px;\n font-size: 14px;\n outline: none;\n \n &:focus {\n border-color: ${primaryBlue};\n box-shadow: 0 0 3px ${primaryBlue};\n }\n `,\n actionDetailContent: css`\n border-left: 1px solid #C1C3CD;\n padding-right: 16px;\n padding-left: 11px;\n margin-bottom: 12px;\n margin-left: 25px;\n font-weight: 400;\n font-size: 14px;\n color: #767985;\n line-height: 20px;\n `,\n actionHeaderWrapper: css`\n margin-bottom: 12px;\n `,\n actionHeaderIcon: css`\n height: 14px;\n margin-right: 5px;\n `,\n actionHeaderDetail: css`\n background: #F3F5FA;\n border-radius: 8px;\n overflow: hidden;\n `,\n actionDetailTitle: css`\n display: flex;\n align-items: center;\n padding: 0 16px;\n box-sizing: border-box;\n background: #EDEFF5;\n height: 32px;\n margin-bottom: 12px;\n cursor: pointer;\n `,\n executeHeaderIcon: css`\n height: 12px;\n padding-right: 10px !important;\n `,\n actionTitle: css`\n display: flex;\n align-items: center;\n padding: 0 16px;\n box-sizing: border-box;\n background: #EDEFF5;\n height: 32px;\n margin-bottom: 12px;\n cursor: pointer;\n border-radius: 8px;\n min-width: 200px;\n `,\n actionHeaderDetailItem: css`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n padding: 0 16px;\n margin-bottom: 12px;\n color: #949494;\n `,\n actionHeaderCost: css`\n margin-left: auto;\n color: #888;\n font-size: 12px;\n min-width: 32px;\n text-align: right;\n `,\n executeHiddenWrapper: css`\n background: #FFFFFF;\n border-radius: 8px;\n margin: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n height: 40px;\n box-sizing: border-box;\n padding: 0px 16px;\n font-size: 14px;\n margin-bottom: 12px;\n color: #3961F2;\n `,\n executeTitle: css`\n display: flex;\n align-items: center;\n padding: 6px 16px;\n height: 40px;\n box-sizing: border-box;\n cursor: pointer;\n `,\n executeContent: css`\n border-top: 1px solid rgba(0,0,0,0.08);\n padding-top: 10px;\n `,\n executeWrapper: css`\n background: #FFFFFF;\n border-radius: 8px;\n padding-bottom: 1px;\n margin: 12px;\n `,\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-bubble-footer {\n display: flex;\n align-items: center;\n min-width: 0,\n max-width: 600,\n /* 你想覆盖的其他样式 */\n }\n\n .ant-sender-content {\n textarea {\n word-break: break-all;\n }\n }\n\n .ant-avatar {\n background-color: transparent;\n }\n\n .ant-sender-actions-list {\n margin-left: -40px;\n }\n\n .ant-sender {\n box-shadow: none !important;\n }\n\n .ant-prompts-item {\n padding-block: 8px !important;\n }\n\n /* 用户消息气泡背景色 */\n .ant-bubble .user-content {\n background-color: #D8E0FD;\n }\n\n /* 助手消息气泡背景色 */\n .ant-bubble .assistant-content {\n background-color: transparent;\n padding: 0;\n }\n `}\n />\n);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React from 'react';\nimport { css } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles, primaryBlue, lightBlue, darkGray, lightGray, borderGray } from '@/styles/common';\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n wrapper: css`\n display: flex;\n flex-direction: column;\n // max-height: 812px;\n min-height: 300px;\n max-width: 800px;\n width: 100%;\n height: 100%;\n min-width: 375px;\n // background-color: #fff;\n // border: 1px solid rgba(80,96,122,.15);\n border-radius: 12px;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n `,\n\n navbar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px 16px;\n border-bottom: 1px solid ${borderGray};\n // background-color: #fff;\n `,\n\n userAvatar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n width: 32px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n `,\n\n avatar: css`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n border: 1px solid ${borderGray};\n `,\n\n title: css`\n font-weight: 600;\n font-size: 16px;\n color: ${darkGray};\n `,\n\n subtitle: css`\n font-size: 12px;\n color: ${lightGray};\n margin-top: 2px;\n `,\n\n messageContainer: css`\n flex: 1;\n overflow-y: auto;\n padding: 16px 0;\n // background-color: #fff;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n position: relative;\n `,\n\n messageList: css`\n padding: 0 16px;\n `,\n\n emptyWrapper: css`\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: '#222';\n user-select: none;\n `,\n\n emptyImg: css`\n width: 60px;\n height: 60px;\n border-radius: 8px;\n margin-bottom: 16px;\n `,\n\n message: css`\n max-width: 70%;\n padding: 10px 14px;\n border-radius: 20px;\n background-color: ${lightBlue};\n color: ${darkGray};\n font-size: 14px;\n line-height: 1.4;\n word-break: break-word;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n `,\n\n messageRight: css`\n align-self: flex-end;\n background-color: ${primaryBlue};\n color: white;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 20px;\n border-top-left-radius: 20px;\n border-top-right-radius: 20px;\n `,\n\n quickReplies: css`\n display: flex;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n overflow-x: auto;\n `,\n\n replyItem: css`\n padding: 6px 12px;\n font-size: 13px;\n border: 1px solid ${primaryBlue};\n border-radius: 20px;\n background-color: #fff;\n color: ${primaryBlue};\n cursor: pointer;\n white-space: nowrap;\n user-select: none;\n transition: all 0.2s ease;\n \n &:hover {\n background-color: ${primaryBlue};\n color: #fff;\n }\n `,\n\n highlight: css`\n background-color: ${primaryBlue};\n color: white;\n border-color: ${primaryBlue};\n `,\n\n inputBar: css`\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n `,\n\n input: css`\n flex: 1;\n padding: 8px 12px;\n border: 1px solid ${borderGray};\n border-radius: 20px;\n font-size: 14px;\n outline: none;\n \n &:focus {\n border-color: ${primaryBlue};\n box-shadow: 0 0 3px ${primaryBlue};\n }\n `,\n actionDetailContent: css`\n border-left: 1px solid #C1C3CD;\n padding-right: 16px;\n padding-left: 11px;\n margin-bottom: 12px;\n margin-left: 25px;\n font-weight: 400;\n font-size: 14px;\n color: #767985;\n line-height: 20px;\n display: inline-block;\n white-space: 'pre-line';\n `,\n actionHeaderWrapper: css`\n margin-bottom: 12px;\n `,\n actionHeaderIcon: css`\n height: 14px;\n margin-right: 5px;\n `,\n actionHeaderDetail: css`\n background: #F3F5FA;\n border-radius: 8px;\n overflow: hidden;\n `,\n actionDetailTitle: css`\n display: flex;\n align-items: center;\n padding: 0 16px;\n box-sizing: border-box;\n background: #EDEFF5;\n height: 32px;\n margin-bottom: 12px;\n cursor: pointer;\n `,\n executeHeaderIcon: css`\n height: 12px;\n padding-right: 10px !important;\n `,\n actionTitle: css`\n display: flex;\n align-items: center;\n padding: 0 16px;\n box-sizing: border-box;\n background: #EDEFF5;\n height: 32px;\n margin-bottom: 12px;\n cursor: pointer;\n border-radius: 8px;\n min-width: 200px;\n `,\n actionHeaderDetailItem: css`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n padding: 0 16px;\n margin-bottom: 12px;\n color: #949494;\n `,\n actionHeaderCost: css`\n margin-left: auto;\n color: #888;\n font-size: 12px;\n min-width: 32px;\n text-align: right;\n `,\n executeHiddenWrapper: css`\n background: #FFFFFF;\n border-radius: 8px;\n margin: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n height: 40px;\n box-sizing: border-box;\n padding: 0px 16px;\n font-size: 14px;\n margin-bottom: 12px;\n color: #3961F2;\n `,\n executeTitle: css`\n display: flex;\n align-items: center;\n padding: 6px 16px;\n height: 40px;\n box-sizing: border-box;\n cursor: pointer;\n `,\n executeContent: css`\n border-top: 1px solid rgba(0,0,0,0.08);\n padding-top: 10px;\n `,\n executeWrapper: css`\n background: #FFFFFF;\n border-radius: 8px;\n padding-bottom: 1px;\n margin: 12px;\n `,\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-bubble-footer {\n display: flex;\n align-items: center;\n min-width: 0,\n max-width: 600,\n /* 你想覆盖的其他样式 */\n }\n\n .ant-sender-content {\n textarea {\n word-break: break-all;\n }\n }\n\n .ant-avatar {\n background-color: transparent;\n }\n\n .ant-sender-actions-list {\n margin-left: -40px;\n }\n\n .ant-sender {\n box-shadow: none !important;\n }\n\n .ant-prompts-item {\n padding-block: 8px !important;\n }\n\n /* 用户消息气泡背景色 */\n .ant-bubble .user-content {\n background-color: #D8E0FD;\n }\n\n /* 助手消息气泡背景色 */\n .ant-bubble .assistant-content {\n background-color: transparent;\n padding: 0;\n }\n `}\n />\n);\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_react", "React", "globalCss"]
7
7
  }
@@ -28,6 +28,7 @@ export declare enum ActionType {
28
28
  invokeToolStart = "INVOKE_AGENT_TOOL_START",// 开始调用工具
29
29
  invokeToolEnd = "INVOKE_AGENT_TOOL_END",// 调用工具完成
30
30
  reasoning = "REASONING",// 思考过程
31
+ reasoningEnd = "REASONING_END",// 思考结束
31
32
  suggest = "FOLLOW_UP",// 用户提示
32
33
  response = "RESPONSE",// 响应
33
34
  finish = "FINISHED"
@@ -58,6 +58,7 @@ var ActionType = /* @__PURE__ */ ((ActionType2) => {
58
58
  ActionType2["invokeToolStart"] = "INVOKE_AGENT_TOOL_START";
59
59
  ActionType2["invokeToolEnd"] = "INVOKE_AGENT_TOOL_END";
60
60
  ActionType2["reasoning"] = "REASONING";
61
+ ActionType2["reasoningEnd"] = "REASONING_END";
61
62
  ActionType2["suggest"] = "FOLLOW_UP";
62
63
  ActionType2["response"] = "RESPONSE";
63
64
  ActionType2["finish"] = "FINISHED";
@@ -204,6 +205,9 @@ var useAgentGenerator = ({
204
205
  return newMessages;
205
206
  }
206
207
  switch (action) {
208
+ case "REASONING_END" /* reasoningEnd */:
209
+ aiMsg.thinks += "/n";
210
+ break;
207
211
  case "REASONING" /* reasoning */:
208
212
  aiMsg.thinks += content;
209
213
  break;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useAgentGenerator.ts"],
4
- "sourcesContent": ["import { useState, useEffect, useRef } from 'react';\nimport { v4 as uuidV4 } from 'uuid';\nimport { useEventStreamRequest } from '@/hooks/useEventStreamRequest';\nimport { MessageRole, MessageStatus, TextMessage, SuggestionMessage, Messages } from '@/types/XAiMessage';\nimport { Error, ErrorCode, Success, SuccessCode, sessionData } from '@/types';\nimport { request } from '@/utils/request';\nimport { safeJsonParse } from '@/utils/index';\nimport { SESSION_PAGE_SIZE } from '@/constants';\nimport { fetchAppConfig, fetchSessionList, fetchSessionDetail, delSessionId, updateSessionTitle } from '@/services/api';\n// 图标\nimport documentIcon from '@/assets/document.png';\nimport documentExpandIcon from '@/assets/document-black.png';\nimport qaIcon from '@/assets/qa.png';\nimport qaExpandIcon from '@/assets/qa-black.png';\nimport skillNoIcon from '@/assets/skillNo.png';\nimport skillNoExpandIcon from '@/assets/skillNo-black.png';\nimport toolIcon from '@/assets/tools.png';\nimport toolExpandIcon from '@/assets/tools-black.png';\n\nexport type ContentType = 'TEXT' | 'IMAGE' | 'FILE';\n\nexport interface ImageUrl {\n url: string;\n name: string;\n}\n\nexport interface FileUrl {\n url: string;\n fileName: string;\n suffix: string;\n}\n\nexport interface Content {\n text?: string;\n imageUrl?: ImageUrl;\n fileUrl?: FileUrl;\n}\n\nexport interface ContentDef {\n description: string;\n contentType: ContentType;\n content: Content;\n}\n// contents 类型\nexport type Contents = ContentDef[];\n\n// —————————————— 接口字段定义 ————————————\nexport enum ActionType {\n recallKnowledgeStart = 'RECALL_KNOWLEDGE_START', // 知识库召回开始\n recallKnowledgeEnd = 'RECALL_KNOWLEDGE_END', // 知识库召回结束\n invokeToolStart = 'INVOKE_AGENT_TOOL_START', // 开始调用工具\n invokeToolEnd = 'INVOKE_AGENT_TOOL_END', // 调用工具完成\n reasoning = 'REASONING', // 思考过程\n suggest = 'FOLLOW_UP', // 用户提示\n response = 'RESPONSE', // 响应\n finish = 'FINISHED', // 结束\n}\n\nexport enum ProcessStatus {\n start = 'START',\n end = 'END',\n}\n\nexport enum ActionAvailability {\n disabled = 'disabled', // 不可用\n enabled = 'enabled', // 可用\n remote = 'remote', // 远程可用\n}\n\nexport type ThinkStep = any; // 临时定义,后续可完善\n\n/**\n* 工具/动作定义\n*/\nexport interface Action {\n name: string; // 名称\n description: string; // 描述\n jsonSchema: string; // 参数JSON Schema\n available?: ActionAvailability; // 可用性\n error?: Error; // 错误信息\n}\n\nexport interface UseAgentGeneratorProps {\n url: string;\n token: string;\n config: any;\n onError?: (error: Error) => void;\n onSuccess?: (data: Success) => void;\n onMessage?: (content: string, data: Messages) => void;\n}\nconst useAgentGenerator = ({\n url,\n token,\n config,\n onError,\n onMessage,\n onSuccess,\n}: UseAgentGeneratorProps) => {\n const textSpeed = 60;\n // 聊天记录\n const [messages, setMessages] = useState<Messages[]>([]);\n // 聊天记录分页设置\n // const [messagePagination, setMessagePagination] = useState({ total: 0, pageNum: 1, pageSize: 999 });\n // 会话记录\n const [sessionList, setSessionList] = useState<sessionData[]>([]);\n // 会话请求是否加载中\n // const [sessionLoading, setSessionLoading] = useState<boolean>(false);\n // 会话分页设置\n const [sessionPagination, setSessionPagination] = useState({ total: 0, pageNum: 1, pageSize: SESSION_PAGE_SIZE });\n // 当前会话\n const [currentSessionId, setCurrentSessionId] = useState<string>('');\n // 应用 配置\n const [appInfo, setAppInfo] = useState<any>(null);\n // 请求 配置\n const requestInfo = useRef<{ requestId?: string; sensitiveWords?: string[] }>({});\n\n const { appNo, pt, tc } = config || {};\n\n // 初始化时获取配置\n useEffect(() => {\n if (url && config) {\n const initConfig = async () => {\n try {\n const result = await fetchAppConfig({ url, ...config });\n if (result.success) {\n setAppInfo(result.data);\n\n // 成功回调\n onSuccess?.({\n code: SuccessCode.APP_CONFIG_INIT_SUCCESS,\n message: '初始化配置成功',\n });\n } else {\n onError?.({\n code: (result.code as ErrorCode) || ErrorCode.APP_NOT_FOUND,\n message: result.message || '获取应用配置失败',\n });\n }\n } catch (error) {\n onError?.({\n code: ErrorCode.API_ERROR,\n message: '获取应用配置失败',\n });\n }\n };\n initConfig();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, config]);\n\n const { start, loading, responseData, stop } = useEventStreamRequest({\n streaming: true,\n textSpeed,\n onClose: () => {\n // close的时机有可能在setMessages之前,所以需要延迟一下\n setTimeout(() => {\n if (requestInfo.current?.sensitiveWords && requestInfo.current?.requestId) {\n request.post(url);\n }\n }, 500);\n },\n onOpen(res) {\n console.log('res-----open:', res);\n },\n });\n\n // 数据更新\n useEffect(() => {\n if (!responseData || !responseData.content || !responseData.data) return;\n\n let response = responseData.data || responseData.content;\n if (typeof response === 'string') {\n response = safeJsonParse(response, {\n action: ActionType.response,\n data: {\n contentType: 'TEXT',\n content: '解析响应数据时出错,请重试',\n success: false,\n errorMsg: '响应数据格式错误',\n },\n });\n }\n\n setMessages((prevMessages) => {\n let newMessages = [...prevMessages];\n // 消息类型判断\n const { action, data } = response;\n const { uniqueId, contentType, content, toolType, args, knowledgeType, success = true, errorMsg } = data || {};\n\n // 建议类信息 特殊处理\n if (action === ActionType.suggest) {\n const suggestMessageIndex = messages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex === -1) {\n const newMessage: SuggestionMessage = {\n id: uuidV4(),\n type: 'SuggestionMessage',\n createdAt: new Date(),\n status: MessageStatus.done,\n role: MessageRole.suggestion,\n content: [{\n key: uuidV4(),\n description: content,\n }],\n };\n // 插到末尾\n newMessages.push(newMessage);\n } else {\n const suggestMsg = newMessages[suggestMessageIndex] as SuggestionMessage;\n if (suggestMsg?.content) {\n suggestMsg.content.push({\n key: uuidV4(),\n description: content,\n });\n }\n }\n return newMessages;\n }\n\n // 找到最后一条 AI 消息\n const lastAIMsgIndex = [...prevMessages].findLastIndex(\n (m) => m.role === MessageRole.assistant && m.type === 'TextMessage' && (m.status === 'init' || m.status === 'pending'),\n );\n const realIndex = lastAIMsgIndex === -1 ? -1 : prevMessages.length - 1 - lastAIMsgIndex;\n const lastAIMsg = realIndex !== -1 ? prevMessages[realIndex] : null;\n\n let aiMsg: TextMessage | undefined;\n\n if (!lastAIMsg) {\n aiMsg = {\n id: uuidV4(),\n type: 'TextMessage',\n createdAt: new Date(),\n role: MessageRole.assistant,\n content: { text: '' },\n execute: [],\n status: MessageStatus.init,\n };\n newMessages.push(aiMsg);\n } else if (lastAIMsg.type === 'TextMessage') {\n aiMsg = { ...lastAIMsg };\n } else if (lastAIMsg.type === 'ImageMessage') {\n aiMsg = undefined;\n }\n\n // 如果 aiMsg 为 undefined,则跳过处理\n if (!aiMsg) {\n return newMessages;\n }\n\n switch (action) {\n // 思考过程\n case ActionType.reasoning:\n aiMsg.thinks += content;\n break;\n // 开始搜索知识库\n case ActionType.recallKnowledgeStart:\n aiMsg.execute = aiMsg.execute || [];\n aiMsg.execute.push({\n id: uniqueId,\n createdAt: new Date(),\n type: 'ActionExecutionMessage',\n name: knowledgeType === 'DOCUMENT' ? '已搜索文档知识库' : '已搜索问答知识库',\n arguments: args,\n extra: {\n ...data,\n icon: knowledgeType === 'DOCUMENT' ? documentIcon : qaIcon,\n expandIcon: knowledgeType === 'DOCUMENT' ? documentExpandIcon : qaExpandIcon,\n },\n });\n break;\n // 知识库搜索结束\n case ActionType.recallKnowledgeEnd: {\n // 需要给之前的recallKnowledgeStart添加cost - 通过uniqueId关联\n const recallKnowledgeMsg = aiMsg.execute?.find((item) => item.id === uniqueId);\n if (recallKnowledgeMsg) {\n recallKnowledgeMsg.extra.cost = data?.cost ? (data?.cost / 1000).toFixed(2) : 0;\n }\n break;\n }\n // 调用工具\n case ActionType.invokeToolStart:\n aiMsg.execute = aiMsg.execute || [];\n aiMsg.execute.push({\n id: uniqueId,\n createdAt: new Date(),\n type: 'ActionExecutionMessage',\n name: toolType === 'SKILL' ? '已调用工作流' : '已调用工具',\n arguments: args,\n extra: {\n ...data,\n icon: toolType === 'SKILL' ? skillNoIcon : toolIcon,\n expandIcon: toolType === 'SKILL' ? skillNoExpandIcon : toolExpandIcon,\n },\n });\n break;\n // 工具调用结束\n case ActionType.invokeToolEnd: {\n // 需要给之前的invokeToolStart添加cost - 通过uniqueId关联\n const invokeToolMsg = aiMsg.execute?.find((item) => item.id === uniqueId);\n if (invokeToolMsg) {\n invokeToolMsg.extra.cost = data?.cost ? (data?.cost / 1000).toFixed(2) : 0;\n }\n break;\n }\n // 回答正文\n case ActionType.response:\n if (success) {\n // 正常渲染\n if (aiMsg.status === MessageStatus.init) {\n aiMsg.status = MessageStatus.pending;\n }\n if (contentType === 'TEXT' && 'text' in aiMsg.content) {\n aiMsg.content.text += content;\n }\n } else {\n // 调用失败\n aiMsg.status = MessageStatus.failed;\n aiMsg.content.text = `<span style=\"color: red;\">❌ ${errorMsg}</span>`;\n }\n break;\n case ActionType.finish:\n // aiMsg.execute = aiMsg.execute || [];\n // aiMsg.execute.push({\n // id: uniqueId,\n // createdAt: new Date(),\n // type: 'ActionExecutionMessage',\n // name: '运行完毕',\n // extra: {\n // ...data,\n // cost: data?.cost ? (data?.cost / 1000).toFixed(2) : 0,\n // icon: completedIcon,\n // expandIcon: completedExpandIcon,\n // },\n // });\n aiMsg.status = MessageStatus.done;\n // 收到一条完整,触发收到消息回调\n onMessage?.(aiMsg?.content?.text ,aiMsg);\n // 重新获取历史对话列表\n initAppConversations(false);\n break;\n // 其他类型略\n }\n\n // 更新消息数组\n if (lastAIMsg && lastAIMsg.type === 'TextMessage') {\n newMessages[realIndex] = aiMsg;\n } else if (!lastAIMsg) {\n // 只有 newMessages 最后一条是 TextMessage 时才替换,否则 push\n if (newMessages.length > 0 && newMessages[newMessages.length - 1].type === 'TextMessage') {\n newMessages[newMessages.length - 1] = aiMsg;\n } else {\n // 只 push TextMessage,不替换非 TextMessage\n newMessages = [...newMessages, aiMsg];\n }\n }\n return newMessages;\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [responseData]);\n\n // 添加对话(非交互触发)\n const setMessage = async (messageType: string, content: any) => {\n switch (messageType) {\n case 'prologue': {\n setMessages((prev) => {\n const prologueMessageIndex = prev.findIndex((item) => item.extra?.prologue);\n if (prologueMessageIndex === -1) {\n const newMessage: Messages = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.assistant,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n extra: {\n prologue: true,\n noFooter: true,\n },\n };\n return [newMessage, ...prev];\n }\n return prev.map((item) => {\n if (item.extra?.prologue && item.content && 'text' in item.content) {\n item.content.text = content;\n }\n return item;\n });\n });\n break;\n }\n case 'suggest': {\n setMessages((prev) => {\n const suggestMessageIndex = prev.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex === -1) {\n const prologueMessageIndex = prev.findIndex((item) => item.extra?.prologue);\n const newMessage: Messages = {\n id: uuidV4(),\n type: 'SuggestionMessage',\n createdAt: new Date(),\n status: MessageStatus.done,\n role: MessageRole.suggestion,\n content,\n };\n if (prologueMessageIndex === -1) {\n // 如果没有开场白,则插入到最前面\n return [newMessage, ...prev];\n }\n // 如果有开场白,则插到开场白后面\n const newMessages = [...prev];\n newMessages.splice(prologueMessageIndex + 1, 0, newMessage);\n return newMessages;\n }\n return prev.map((item) => {\n if (item.type === 'SuggestionMessage') {\n item.content = content;\n }\n return item;\n });\n });\n break;\n }\n default:\n break;\n }\n };\n\n // 简单对话\n const chat = async (content: any) => {\n let newMessage: Messages;\n let inputs_msg;\n if (typeof content === 'string') {\n newMessage = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.user,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n };\n } else {\n newMessage = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.user,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n ...content,\n }\n }\n\n if (typeof newMessage.content === 'object' && 'text' in newMessage.content && typeof newMessage.content.text === 'string') {\n inputs_msg = newMessage.content.text;\n } else {\n inputs_msg = '';\n }\n\n setMessages((prev) => {\n // 若存在对话建议,先删除对话建议\n const suggestMessageIndex = messages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex !== -1) {\n prev.splice(suggestMessageIndex, 1);\n }\n // 插入用户消息\n prev.push(newMessage);\n return prev;\n });\n\n start(\n `${url}/appouter/${appNo}/sendMsg?pt=${pt}&tc=${tc}`,\n {\n appParams: {\n inputs_msg,\n },\n sessionId: currentSessionId,\n },\n {\n Authorization: `Bearer ${token}`,\n },\n );\n };\n\n // 重新生成方法\n const reChat = () => {\n setMessages((prevMessages) => {\n // 1. 删除最新一条 AI 消息\n const lastAIMsgIndex = [...prevMessages].findLastIndex(\n (m) => m.role === MessageRole.assistant && m.type === 'TextMessage',\n );\n const newMessages = [...prevMessages];\n if (lastAIMsgIndex !== -1) {\n const realIndex = newMessages.length - 1 - lastAIMsgIndex;\n newMessages.splice(realIndex, 1);\n }\n\n // 2. 若存在对话建议,先删除对话建议\n const suggestMessageIndex = newMessages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex !== -1) {\n newMessages.splice(suggestMessageIndex, 1);\n }\n\n // 3. 找到最新一条用户消息,且类型为 TextMessage\n const lastUserMsg = [...newMessages].findLast(\n (m) => m.role === MessageRole.user && m.type === 'TextMessage',\n ) as TextMessage | undefined;\n if (lastUserMsg && lastUserMsg.content && typeof lastUserMsg.content.text === 'string') {\n // 重新发起 chat\n chat(lastUserMsg.content.text);\n }\n\n return newMessages;\n });\n };\n\n // 停止对话\n const stopChat = () => {\n stop();\n setMessages((prevMessages) => {\n // 找到我所有进行中的消息,并设置为结束\n const newMessages = [...prevMessages];\n newMessages.forEach((m) => {\n if (m.status === MessageStatus.pending) {\n m.status = MessageStatus.done;\n } else if (m.status === MessageStatus.init) {\n if (m.type === 'TextMessage') {\n m.content.text = '<span style=\"color: #cbcbcb;\">用户已取消</span>';\n }\n m.status = MessageStatus.done;\n }\n });\n return newMessages;\n });\n };\n\n // 初始化历史记录\n const formatMessages = (data: any, init = false) => {\n setMessages((prev) => {\n const initMessagesList: Messages[] = [];\n data.forEach((item: any) => {\n const { content, messageTime, role } = item || {};\n\n if (role === 'USER') {\n const newMessage: Messages = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: messageTime,\n role: MessageRole.user,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n };\n\n initMessagesList.push(newMessage);\n } else if (role === 'AI') {\n const newMessage: TextMessage = {\n id: uuidV4(),\n type: 'TextMessage',\n createdAt: messageTime,\n role: MessageRole.assistant,\n content: { text: content },\n execute: [],\n status: MessageStatus.done,\n };\n\n initMessagesList.push(newMessage);\n }\n });\n\n if (init) {\n return [...initMessagesList];\n }\n return [...prev, ...initMessagesList];\n });\n };\n\n // 初始化开场白\n const initPrologue = async () => {\n const { onboardingInfo = {} } = appInfo;\n // eslint-disable-next-line camelcase\n const { suggested_questions = [], prologue = '' } = onboardingInfo || {};\n\n // 初始化开场白\n if (prologue) {\n setMessage('prologue', prologue);\n } else {\n setMessages((prev) => prev.filter((item) => !item.extra?.prologue));\n }\n\n // 过滤空内容\n const formatSuggests = suggested_questions.filter((item: string) => item);\n\n if (formatSuggests.length > 0) {\n const suggestMessages = formatSuggests.map((item: string, index: number) => ({\n key: index + 1,\n description: item,\n }));\n // 页面为空时展示开场白预设问题\n const hasMessages = messages.some((item) => (!item.extra?.prologue && item.type !== 'SuggestionMessage'));\n if (!hasMessages) {\n setMessage('suggest', suggestMessages);\n }\n } else {\n setMessages((prev) => prev.filter((item) => !(item.type === 'SuggestionMessage')));\n }\n };\n\n // 获取聊天记录\n const initAppConversations = async (fetchDetail: boolean = false) => {\n try {\n const result = await fetchSessionList({\n url,\n appNo,\n pt,\n tc,\n token,\n pageNum: sessionPagination.pageNum,\n pageSize: sessionPagination.pageSize,\n });\n\n if (result?.success) {\n const resultData = result?.data?.data || [];\n if (resultData.length > 0) {\n const formatSessions = resultData.map((item) => {\n return {\n key: item.sessionId,\n label: item.title || '新对话',\n timestamp: new Date(item.gmtCreated).getTime(),\n messages: [],\n meta: {\n ...item,\n }\n };\n });\n\n setSessionList(formatSessions);\n // 设置分页信息\n setSessionPagination({ pageNum: result?.data?.pageNum, pageSize: result?.data?.pageSize, total: result?.data?.totalCount })\n const { sessionId } = resultData[0];\n fetchDetail && setCurrentSessionDetail(sessionId);\n } else {\n // 页面报错 初始化\n setSessionList([]);\n setCurrentSessionId(uuidV4());\n initPrologue();\n }\n // 成功回调\n onSuccess?.({\n code: SuccessCode.APP_MESSAGES_INIT_SUCCESS,\n message: '初始化聊天记录成功',\n });\n } else {\n initPrologue();\n }\n } catch {\n //\n }\n };\n\n // 设置当前会话详情\n const setCurrentSessionDetail = async (sessionId: string) => {\n if (sessionId) {\n if (sessionId === currentSessionId) {\n return;\n }\n setCurrentSessionId(sessionId); // 设置当前会话 id;\n const sessionResult = await fetchSessionDetail({\n url,\n appNo,\n pt,\n tc,\n sessionId,\n token,\n });\n\n if (sessionResult?.success) {\n const sessionsData = (sessionResult?.data as any)?.list?.reduce((acc: any[], cur: any) => {\n return [...acc, ...(cur.sessionMessages || [])];\n }, []);\n\n if (sessionsData.length > 0) {\n formatMessages(sessionsData, true);\n }\n }\n } else {\n // 兼容 无 session异常\n setCurrentSessionId(uuidV4());\n }\n }\n\n // 删除会话\n const deleteSession = async (sessionId: string) => {\n if (!sessionId) return;\n const result = await delSessionId({\n url,\n appNo,\n pt,\n tc,\n sessionId,\n token,\n });\n if (result?.success) {\n // 删除成功后,重新获取会话列表\n initAppConversations(false);\n // 如果删除的是当前会话,则创建新的会话\n if (sessionId === currentSessionId) {\n createNewChat();\n }\n }\n }\n\n // 更新会话名称\n const updateSession = async (sessionId: string, title: string) => {\n if (!sessionId && !title) return;\n const result = await updateSessionTitle({\n url,\n appNo,\n pt,\n tc,\n title,\n sessionId,\n token,\n });\n if (result?.success) {\n // 编辑成功后,重新获取会话列表\n initAppConversations(false);\n }\n }\n\n\n // 生成新对话\n const createNewChat = () => {\n stopChat(); // 停止聊天\n setMessages([]); // 清空所有消息\n initPrologue(); // 初始化开场白和预置问题\n setCurrentSessionId(uuidV4()); // 设置会话 id\n }\n\n // 初始化应用\n useEffect(() => {\n if (appInfo) {\n // 初始化历史数据\n initAppConversations(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appInfo]);\n\n return {\n appInfo,\n messages,\n loading,\n content: responseData.content,\n sessionList,\n currentSessionId,\n sessionPagination,\n initAppConversations,\n reChat,\n chat,\n createNewChat,\n setCurrentSessionId,\n setCurrentSessionDetail,\n updateSession,\n deleteSession,\n setMessage,\n setMessages,\n stopChat,\n initPrologue,\n };\n};\n\nexport default useAgentGenerator;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { useState, useEffect, useRef } from 'react';\nimport { v4 as uuidV4 } from 'uuid';\nimport { useEventStreamRequest } from '@/hooks/useEventStreamRequest';\nimport { MessageRole, MessageStatus, TextMessage, SuggestionMessage, Messages } from '@/types/XAiMessage';\nimport { Error, ErrorCode, Success, SuccessCode, sessionData } from '@/types';\nimport { request } from '@/utils/request';\nimport { safeJsonParse } from '@/utils/index';\nimport { SESSION_PAGE_SIZE } from '@/constants';\nimport { fetchAppConfig, fetchSessionList, fetchSessionDetail, delSessionId, updateSessionTitle } from '@/services/api';\n// 图标\nimport documentIcon from '@/assets/document.png';\nimport documentExpandIcon from '@/assets/document-black.png';\nimport qaIcon from '@/assets/qa.png';\nimport qaExpandIcon from '@/assets/qa-black.png';\nimport skillNoIcon from '@/assets/skillNo.png';\nimport skillNoExpandIcon from '@/assets/skillNo-black.png';\nimport toolIcon from '@/assets/tools.png';\nimport toolExpandIcon from '@/assets/tools-black.png';\n\nexport type ContentType = 'TEXT' | 'IMAGE' | 'FILE';\n\nexport interface ImageUrl {\n url: string;\n name: string;\n}\n\nexport interface FileUrl {\n url: string;\n fileName: string;\n suffix: string;\n}\n\nexport interface Content {\n text?: string;\n imageUrl?: ImageUrl;\n fileUrl?: FileUrl;\n}\n\nexport interface ContentDef {\n description: string;\n contentType: ContentType;\n content: Content;\n}\n// contents 类型\nexport type Contents = ContentDef[];\n\n// —————————————— 接口字段定义 ————————————\nexport enum ActionType {\n recallKnowledgeStart = 'RECALL_KNOWLEDGE_START', // 知识库召回开始\n recallKnowledgeEnd = 'RECALL_KNOWLEDGE_END', // 知识库召回结束\n invokeToolStart = 'INVOKE_AGENT_TOOL_START', // 开始调用工具\n invokeToolEnd = 'INVOKE_AGENT_TOOL_END', // 调用工具完成\n reasoning = 'REASONING', // 思考过程\n reasoningEnd = 'REASONING_END', // 思考结束\n suggest = 'FOLLOW_UP', // 用户提示\n response = 'RESPONSE', // 响应\n finish = 'FINISHED', // 结束\n}\n\nexport enum ProcessStatus {\n start = 'START',\n end = 'END',\n}\n\nexport enum ActionAvailability {\n disabled = 'disabled', // 不可用\n enabled = 'enabled', // 可用\n remote = 'remote', // 远程可用\n}\n\nexport type ThinkStep = any; // 临时定义,后续可完善\n\n/**\n* 工具/动作定义\n*/\nexport interface Action {\n name: string; // 名称\n description: string; // 描述\n jsonSchema: string; // 参数JSON Schema\n available?: ActionAvailability; // 可用性\n error?: Error; // 错误信息\n}\n\nexport interface UseAgentGeneratorProps {\n url: string;\n token: string;\n config: any;\n onError?: (error: Error) => void;\n onSuccess?: (data: Success) => void;\n onMessage?: (content: string, data: Messages) => void;\n}\nconst useAgentGenerator = ({\n url,\n token,\n config,\n onError,\n onMessage,\n onSuccess,\n}: UseAgentGeneratorProps) => {\n const textSpeed = 60;\n // 聊天记录\n const [messages, setMessages] = useState<Messages[]>([]);\n // 聊天记录分页设置\n // const [messagePagination, setMessagePagination] = useState({ total: 0, pageNum: 1, pageSize: 999 });\n // 会话记录\n const [sessionList, setSessionList] = useState<sessionData[]>([]);\n // 会话请求是否加载中\n // const [sessionLoading, setSessionLoading] = useState<boolean>(false);\n // 会话分页设置\n const [sessionPagination, setSessionPagination] = useState({ total: 0, pageNum: 1, pageSize: SESSION_PAGE_SIZE });\n // 当前会话\n const [currentSessionId, setCurrentSessionId] = useState<string>('');\n // 应用 配置\n const [appInfo, setAppInfo] = useState<any>(null);\n // 请求 配置\n const requestInfo = useRef<{ requestId?: string; sensitiveWords?: string[] }>({});\n\n const { appNo, pt, tc } = config || {};\n\n // 初始化时获取配置\n useEffect(() => {\n if (url && config) {\n const initConfig = async () => {\n try {\n const result = await fetchAppConfig({ url, ...config });\n if (result.success) {\n setAppInfo(result.data);\n\n // 成功回调\n onSuccess?.({\n code: SuccessCode.APP_CONFIG_INIT_SUCCESS,\n message: '初始化配置成功',\n });\n } else {\n onError?.({\n code: (result.code as ErrorCode) || ErrorCode.APP_NOT_FOUND,\n message: result.message || '获取应用配置失败',\n });\n }\n } catch (error) {\n onError?.({\n code: ErrorCode.API_ERROR,\n message: '获取应用配置失败',\n });\n }\n };\n initConfig();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, config]);\n\n const { start, loading, responseData, stop } = useEventStreamRequest({\n streaming: true,\n textSpeed,\n onClose: () => {\n // close的时机有可能在setMessages之前,所以需要延迟一下\n setTimeout(() => {\n if (requestInfo.current?.sensitiveWords && requestInfo.current?.requestId) {\n request.post(url);\n }\n }, 500);\n },\n onOpen(res) {\n console.log('res-----open:', res);\n },\n });\n\n // 数据更新\n useEffect(() => {\n if (!responseData || !responseData.content || !responseData.data) return;\n\n let response = responseData.data || responseData.content;\n if (typeof response === 'string') {\n response = safeJsonParse(response, {\n action: ActionType.response,\n data: {\n contentType: 'TEXT',\n content: '解析响应数据时出错,请重试',\n success: false,\n errorMsg: '响应数据格式错误',\n },\n });\n }\n\n setMessages((prevMessages) => {\n let newMessages = [...prevMessages];\n // 消息类型判断\n const { action, data } = response;\n const { uniqueId, contentType, content, toolType, args, knowledgeType, success = true, errorMsg } = data || {};\n\n // 建议类信息 特殊处理\n if (action === ActionType.suggest) {\n const suggestMessageIndex = messages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex === -1) {\n const newMessage: SuggestionMessage = {\n id: uuidV4(),\n type: 'SuggestionMessage',\n createdAt: new Date(),\n status: MessageStatus.done,\n role: MessageRole.suggestion,\n content: [{\n key: uuidV4(),\n description: content,\n }],\n };\n // 插到末尾\n newMessages.push(newMessage);\n } else {\n const suggestMsg = newMessages[suggestMessageIndex] as SuggestionMessage;\n if (suggestMsg?.content) {\n suggestMsg.content.push({\n key: uuidV4(),\n description: content,\n });\n }\n }\n return newMessages;\n }\n\n // 找到最后一条 AI 消息\n const lastAIMsgIndex = [...prevMessages].findLastIndex(\n (m) => m.role === MessageRole.assistant && m.type === 'TextMessage' && (m.status === 'init' || m.status === 'pending'),\n );\n const realIndex = lastAIMsgIndex === -1 ? -1 : prevMessages.length - 1 - lastAIMsgIndex;\n const lastAIMsg = realIndex !== -1 ? prevMessages[realIndex] : null;\n\n let aiMsg: TextMessage | undefined;\n\n if (!lastAIMsg) {\n aiMsg = {\n id: uuidV4(),\n type: 'TextMessage',\n createdAt: new Date(),\n role: MessageRole.assistant,\n content: { text: '' },\n execute: [],\n status: MessageStatus.init,\n };\n newMessages.push(aiMsg);\n } else if (lastAIMsg.type === 'TextMessage') {\n aiMsg = { ...lastAIMsg };\n } else if (lastAIMsg.type === 'ImageMessage') {\n aiMsg = undefined;\n }\n\n // 如果 aiMsg 为 undefined,则跳过处理\n if (!aiMsg) {\n return newMessages;\n }\n\n switch (action) {\n // 思考过程\n case ActionType.reasoningEnd:\n aiMsg.thinks += '/n';\n break;\n case ActionType.reasoning:\n aiMsg.thinks += content;\n break;\n // 开始搜索知识库\n case ActionType.recallKnowledgeStart:\n aiMsg.execute = aiMsg.execute || [];\n aiMsg.execute.push({\n id: uniqueId,\n createdAt: new Date(),\n type: 'ActionExecutionMessage',\n name: knowledgeType === 'DOCUMENT' ? '已搜索文档知识库' : '已搜索问答知识库',\n arguments: args,\n extra: {\n ...data,\n icon: knowledgeType === 'DOCUMENT' ? documentIcon : qaIcon,\n expandIcon: knowledgeType === 'DOCUMENT' ? documentExpandIcon : qaExpandIcon,\n },\n });\n break;\n // 知识库搜索结束\n case ActionType.recallKnowledgeEnd: {\n // 需要给之前的recallKnowledgeStart添加cost - 通过uniqueId关联\n const recallKnowledgeMsg = aiMsg.execute?.find((item) => item.id === uniqueId);\n if (recallKnowledgeMsg) {\n recallKnowledgeMsg.extra.cost = data?.cost ? (data?.cost / 1000).toFixed(2) : 0;\n }\n break;\n }\n // 调用工具\n case ActionType.invokeToolStart:\n aiMsg.execute = aiMsg.execute || [];\n aiMsg.execute.push({\n id: uniqueId,\n createdAt: new Date(),\n type: 'ActionExecutionMessage',\n name: toolType === 'SKILL' ? '已调用工作流' : '已调用工具',\n arguments: args,\n extra: {\n ...data,\n icon: toolType === 'SKILL' ? skillNoIcon : toolIcon,\n expandIcon: toolType === 'SKILL' ? skillNoExpandIcon : toolExpandIcon,\n },\n });\n break;\n // 工具调用结束\n case ActionType.invokeToolEnd: {\n // 需要给之前的invokeToolStart添加cost - 通过uniqueId关联\n const invokeToolMsg = aiMsg.execute?.find((item) => item.id === uniqueId);\n if (invokeToolMsg) {\n invokeToolMsg.extra.cost = data?.cost ? (data?.cost / 1000).toFixed(2) : 0;\n }\n break;\n }\n // 回答正文\n case ActionType.response:\n if (success) {\n // 正常渲染\n if (aiMsg.status === MessageStatus.init) {\n aiMsg.status = MessageStatus.pending;\n }\n if (contentType === 'TEXT' && 'text' in aiMsg.content) {\n aiMsg.content.text += content;\n }\n } else {\n // 调用失败\n aiMsg.status = MessageStatus.failed;\n aiMsg.content.text = `<span style=\"color: red;\">❌ ${errorMsg}</span>`;\n }\n break;\n case ActionType.finish:\n // aiMsg.execute = aiMsg.execute || [];\n // aiMsg.execute.push({\n // id: uniqueId,\n // createdAt: new Date(),\n // type: 'ActionExecutionMessage',\n // name: '运行完毕',\n // extra: {\n // ...data,\n // cost: data?.cost ? (data?.cost / 1000).toFixed(2) : 0,\n // icon: completedIcon,\n // expandIcon: completedExpandIcon,\n // },\n // });\n aiMsg.status = MessageStatus.done;\n // 收到一条完整,触发收到消息回调\n onMessage?.(aiMsg?.content?.text ,aiMsg);\n // 重新获取历史对话列表\n initAppConversations(false);\n break;\n // 其他类型略\n }\n\n // 更新消息数组\n if (lastAIMsg && lastAIMsg.type === 'TextMessage') {\n newMessages[realIndex] = aiMsg;\n } else if (!lastAIMsg) {\n // 只有 newMessages 最后一条是 TextMessage 时才替换,否则 push\n if (newMessages.length > 0 && newMessages[newMessages.length - 1].type === 'TextMessage') {\n newMessages[newMessages.length - 1] = aiMsg;\n } else {\n // 只 push TextMessage,不替换非 TextMessage\n newMessages = [...newMessages, aiMsg];\n }\n }\n return newMessages;\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [responseData]);\n\n // 添加对话(非交互触发)\n const setMessage = async (messageType: string, content: any) => {\n switch (messageType) {\n case 'prologue': {\n setMessages((prev) => {\n const prologueMessageIndex = prev.findIndex((item) => item.extra?.prologue);\n if (prologueMessageIndex === -1) {\n const newMessage: Messages = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.assistant,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n extra: {\n prologue: true,\n noFooter: true,\n },\n };\n return [newMessage, ...prev];\n }\n return prev.map((item) => {\n if (item.extra?.prologue && item.content && 'text' in item.content) {\n item.content.text = content;\n }\n return item;\n });\n });\n break;\n }\n case 'suggest': {\n setMessages((prev) => {\n const suggestMessageIndex = prev.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex === -1) {\n const prologueMessageIndex = prev.findIndex((item) => item.extra?.prologue);\n const newMessage: Messages = {\n id: uuidV4(),\n type: 'SuggestionMessage',\n createdAt: new Date(),\n status: MessageStatus.done,\n role: MessageRole.suggestion,\n content,\n };\n if (prologueMessageIndex === -1) {\n // 如果没有开场白,则插入到最前面\n return [newMessage, ...prev];\n }\n // 如果有开场白,则插到开场白后面\n const newMessages = [...prev];\n newMessages.splice(prologueMessageIndex + 1, 0, newMessage);\n return newMessages;\n }\n return prev.map((item) => {\n if (item.type === 'SuggestionMessage') {\n item.content = content;\n }\n return item;\n });\n });\n break;\n }\n default:\n break;\n }\n };\n\n // 简单对话\n const chat = async (content: any) => {\n let newMessage: Messages;\n let inputs_msg;\n if (typeof content === 'string') {\n newMessage = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.user,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n };\n } else {\n newMessage = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: new Date(),\n role: MessageRole.user,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n ...content,\n }\n }\n\n if (typeof newMessage.content === 'object' && 'text' in newMessage.content && typeof newMessage.content.text === 'string') {\n inputs_msg = newMessage.content.text;\n } else {\n inputs_msg = '';\n }\n\n setMessages((prev) => {\n // 若存在对话建议,先删除对话建议\n const suggestMessageIndex = messages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex !== -1) {\n prev.splice(suggestMessageIndex, 1);\n }\n // 插入用户消息\n prev.push(newMessage);\n return prev;\n });\n\n start(\n `${url}/appouter/${appNo}/sendMsg?pt=${pt}&tc=${tc}`,\n {\n appParams: {\n inputs_msg,\n },\n sessionId: currentSessionId,\n },\n {\n Authorization: `Bearer ${token}`,\n },\n );\n };\n\n // 重新生成方法\n const reChat = () => {\n setMessages((prevMessages) => {\n // 1. 删除最新一条 AI 消息\n const lastAIMsgIndex = [...prevMessages].findLastIndex(\n (m) => m.role === MessageRole.assistant && m.type === 'TextMessage',\n );\n const newMessages = [...prevMessages];\n if (lastAIMsgIndex !== -1) {\n const realIndex = newMessages.length - 1 - lastAIMsgIndex;\n newMessages.splice(realIndex, 1);\n }\n\n // 2. 若存在对话建议,先删除对话建议\n const suggestMessageIndex = newMessages.findIndex((item) => item.type === 'SuggestionMessage');\n if (suggestMessageIndex !== -1) {\n newMessages.splice(suggestMessageIndex, 1);\n }\n\n // 3. 找到最新一条用户消息,且类型为 TextMessage\n const lastUserMsg = [...newMessages].findLast(\n (m) => m.role === MessageRole.user && m.type === 'TextMessage',\n ) as TextMessage | undefined;\n if (lastUserMsg && lastUserMsg.content && typeof lastUserMsg.content.text === 'string') {\n // 重新发起 chat\n chat(lastUserMsg.content.text);\n }\n\n return newMessages;\n });\n };\n\n // 停止对话\n const stopChat = () => {\n stop();\n setMessages((prevMessages) => {\n // 找到我所有进行中的消息,并设置为结束\n const newMessages = [...prevMessages];\n newMessages.forEach((m) => {\n if (m.status === MessageStatus.pending) {\n m.status = MessageStatus.done;\n } else if (m.status === MessageStatus.init) {\n if (m.type === 'TextMessage') {\n m.content.text = '<span style=\"color: #cbcbcb;\">用户已取消</span>';\n }\n m.status = MessageStatus.done;\n }\n });\n return newMessages;\n });\n };\n\n // 初始化历史记录\n const formatMessages = (data: any, init = false) => {\n setMessages((prev) => {\n const initMessagesList: Messages[] = [];\n data.forEach((item: any) => {\n const { content, messageTime, role } = item || {};\n\n if (role === 'USER') {\n const newMessage: Messages = {\n type: 'TextMessage',\n id: uuidV4(),\n createdAt: messageTime,\n role: MessageRole.user,\n status: MessageStatus.done,\n content: {\n text: content,\n },\n };\n\n initMessagesList.push(newMessage);\n } else if (role === 'AI') {\n const newMessage: TextMessage = {\n id: uuidV4(),\n type: 'TextMessage',\n createdAt: messageTime,\n role: MessageRole.assistant,\n content: { text: content },\n execute: [],\n status: MessageStatus.done,\n };\n\n initMessagesList.push(newMessage);\n }\n });\n\n if (init) {\n return [...initMessagesList];\n }\n return [...prev, ...initMessagesList];\n });\n };\n\n // 初始化开场白\n const initPrologue = async () => {\n const { onboardingInfo = {} } = appInfo;\n // eslint-disable-next-line camelcase\n const { suggested_questions = [], prologue = '' } = onboardingInfo || {};\n\n // 初始化开场白\n if (prologue) {\n setMessage('prologue', prologue);\n } else {\n setMessages((prev) => prev.filter((item) => !item.extra?.prologue));\n }\n\n // 过滤空内容\n const formatSuggests = suggested_questions.filter((item: string) => item);\n\n if (formatSuggests.length > 0) {\n const suggestMessages = formatSuggests.map((item: string, index: number) => ({\n key: index + 1,\n description: item,\n }));\n // 页面为空时展示开场白预设问题\n const hasMessages = messages.some((item) => (!item.extra?.prologue && item.type !== 'SuggestionMessage'));\n if (!hasMessages) {\n setMessage('suggest', suggestMessages);\n }\n } else {\n setMessages((prev) => prev.filter((item) => !(item.type === 'SuggestionMessage')));\n }\n };\n\n // 获取聊天记录\n const initAppConversations = async (fetchDetail: boolean = false) => {\n try {\n const result = await fetchSessionList({\n url,\n appNo,\n pt,\n tc,\n token,\n pageNum: sessionPagination.pageNum,\n pageSize: sessionPagination.pageSize,\n });\n\n if (result?.success) {\n const resultData = result?.data?.data || [];\n if (resultData.length > 0) {\n const formatSessions = resultData.map((item) => {\n return {\n key: item.sessionId,\n label: item.title || '新对话',\n timestamp: new Date(item.gmtCreated).getTime(),\n messages: [],\n meta: {\n ...item,\n }\n };\n });\n\n setSessionList(formatSessions);\n // 设置分页信息\n setSessionPagination({ pageNum: result?.data?.pageNum, pageSize: result?.data?.pageSize, total: result?.data?.totalCount })\n const { sessionId } = resultData[0];\n fetchDetail && setCurrentSessionDetail(sessionId);\n } else {\n // 页面报错 初始化\n setSessionList([]);\n setCurrentSessionId(uuidV4());\n initPrologue();\n }\n // 成功回调\n onSuccess?.({\n code: SuccessCode.APP_MESSAGES_INIT_SUCCESS,\n message: '初始化聊天记录成功',\n });\n } else {\n initPrologue();\n }\n } catch {\n //\n }\n };\n\n // 设置当前会话详情\n const setCurrentSessionDetail = async (sessionId: string) => {\n if (sessionId) {\n if (sessionId === currentSessionId) {\n return;\n }\n setCurrentSessionId(sessionId); // 设置当前会话 id;\n const sessionResult = await fetchSessionDetail({\n url,\n appNo,\n pt,\n tc,\n sessionId,\n token,\n });\n\n if (sessionResult?.success) {\n const sessionsData = (sessionResult?.data as any)?.list?.reduce((acc: any[], cur: any) => {\n return [...acc, ...(cur.sessionMessages || [])];\n }, []);\n\n if (sessionsData.length > 0) {\n formatMessages(sessionsData, true);\n }\n }\n } else {\n // 兼容 无 session异常\n setCurrentSessionId(uuidV4());\n }\n }\n\n // 删除会话\n const deleteSession = async (sessionId: string) => {\n if (!sessionId) return;\n const result = await delSessionId({\n url,\n appNo,\n pt,\n tc,\n sessionId,\n token,\n });\n if (result?.success) {\n // 删除成功后,重新获取会话列表\n initAppConversations(false);\n // 如果删除的是当前会话,则创建新的会话\n if (sessionId === currentSessionId) {\n createNewChat();\n }\n }\n }\n\n // 更新会话名称\n const updateSession = async (sessionId: string, title: string) => {\n if (!sessionId && !title) return;\n const result = await updateSessionTitle({\n url,\n appNo,\n pt,\n tc,\n title,\n sessionId,\n token,\n });\n if (result?.success) {\n // 编辑成功后,重新获取会话列表\n initAppConversations(false);\n }\n }\n\n\n // 生成新对话\n const createNewChat = () => {\n stopChat(); // 停止聊天\n setMessages([]); // 清空所有消息\n initPrologue(); // 初始化开场白和预置问题\n setCurrentSessionId(uuidV4()); // 设置会话 id\n }\n\n // 初始化应用\n useEffect(() => {\n if (appInfo) {\n // 初始化历史数据\n initAppConversations(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [appInfo]);\n\n return {\n appInfo,\n messages,\n loading,\n content: responseData.content,\n sessionList,\n currentSessionId,\n sessionPagination,\n initAppConversations,\n reChat,\n chat,\n createNewChat,\n setCurrentSessionId,\n setCurrentSessionDetail,\n updateSession,\n deleteSession,\n setMessage,\n setMessages,\n stopChat,\n initPrologue,\n };\n};\n\nexport default useAgentGenerator;\n"],
5
+ "mappings": "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",
6
6
  "names": ["ActionType", "ProcessStatus", "ActionAvailability", "uuidV4", "documentIcon", "qaIcon", "documentExpandIcon", "qaExpandIcon", "skillNoIcon", "toolIcon", "skillNoExpandIcon", "toolExpandIcon"]
7
7
  }
@@ -68,10 +68,6 @@ export var ActionHeader = function ActionHeader(_ref) {
68
68
  _useState4 = _slicedToArray(_useState3, 2),
69
69
  executeExpanded = _useState4[0],
70
70
  setExecuteExpanded = _useState4[1];
71
- console.log('ActionHeader debug:', {
72
- thinks: thinks,
73
- executeLength: execute.length
74
- });
75
71
 
76
72
  // 关键修复:只要有思考内容或执行过程就显示,不要同时要求两者都有
77
73
  if (!thinks && (!execute || execute.length === 0)) return null;
@@ -122,9 +118,10 @@ export var ActionHeader = function ActionHeader(_ref) {
122
118
  })]
123
119
  }), thinks && /*#__PURE__*/_jsx("div", {
124
120
  className: styles.actionDetailContent,
125
- children: /*#__PURE__*/_jsx("span", {
126
- children: thinks
127
- })
121
+ style: {
122
+ whiteSpace: 'pre-line'
123
+ },
124
+ children: thinks
128
125
  }), execute && execute.length > 0 && /*#__PURE__*/_jsxs(_Fragment, {
129
126
  children: [!executeExpanded && /*#__PURE__*/_jsxs("div", {
130
127
  className: styles.executeHiddenWrapper,