@zero-library/chat-agent 2.3.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +5 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +5 -5
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stores/Context.ts","../src/ui/common/markdownAlert/styles.module.less","../src/ui/common/markdownAlert/AppCard.tsx","../src/ui/common/markdownAlert/FileView.tsx","../src/ui/common/markdownAlert/components/DocDrawer.tsx","../src/ui/common/markdownAlert/IndexQuote.tsx","../src/ui/common/markdownAlert/MdEdit.tsx","../src/ui/common/markdownAlert/FileEdit.tsx","../src/ui/common/markdownAlert/Think.tsx","../src/ui/common/markdownAlert/Charts.tsx","../src/core/local.ts","../src/core/utils.ts","../src/services/index.ts","../src/services/file.ts","../src/stores/index.ts","../src/ui/layouts/index.tsx","../src/ui/common/markdownAlert/index.ts","../src/components/styles.module.less","../src/components/MessageRender.tsx","../src/ui/common/BubbleListItems.tsx","../src/ui/common/styles.module.less","../src/ui/common/WelcomeItem.tsx","../src/ui/common/ChatHeader.tsx","../src/ui/common/AgentCharacter.tsx","../src/ui/common/CharacterList.tsx","../src/ui/common/ConversationList.tsx","../src/components/Attachments.tsx","../src/components/ChatSender.tsx","../src/ui/common/ChatSender.tsx","../src/ui/common/FeaturesRenderer.tsx","../src/ui/common/QuickAsk/QuickAskPanel.tsx","../src/ui/common/QuickAsk/QuickAskEditModal.tsx","../src/ui/common/QuickAsk/styles.module.less","../src/ui/common/SenderPromptsItems.tsx","../src/ui/common/ConversationListHeader.tsx","../src/ui/common/ConversationListPanel.tsx","../src/ui/layouts/styles.module.less"],"names":["useCreateValtioContext","appCard","fileView","fileEdit","fileEditHeader","fileEditContent","quoteList","mdEdit","think","chart","chartSkeleton","chartSkeletonIcon","Spin","jsxs","Flex","jsx","FileIcon","useSnapshot","useState","useEffect","Drawer","RenderMarkdown","Empty","message","useMemo","isExternal","Popover","Tag","MarkdownEditor","Button","PlayCircleOutlined","CopyOutlined","copyText","Collapse","classNames","Skeleton","DotChartOutlined","LazyComponent","Alert","createSecureManager","createTokenManager","emit","dayjs","buildUrlParams","getWebSocketUrl","downloadFile","proxy","createRequest","HttpStatus","isArray","isString","shouldRender","deepMerge","isObject","transform","transforms","deepCopy","styles_module_default","loadingMessage","chatAttachments","chatSender","chatQuoteMsg","quoteTooltip","quoteTooltipContainer","quoteMsg","markdownToText","isEmptyObj","Typography","Fragment","Bubble","Attachments","Tooltip","nsConversationListPanel","nsConversations","nsBubbleList","nsChatHeader","nsChatTitle","nsChatHeaderPopover","chatWelcomeWrap","chatWelcome","chatWelcomePrompts","nsSenderListTitle","nsSenderList","nsSenderListItem","nsSenderListFooter","nsChatUserName","nsSenderReferenceHeaderTitle","nsSenderReferenceHeaderContent","nsAvatarListContainer","nsAvatarList","nsAvatarListItem","nsAvatarListItemIcon","nsAvatarListItemIconActive","nsAvatarListItemName","Space","Welcome","RenderWrapper","Avatar","Prompts","customComponents","isBoolean","UserAvatar","OpenAIOutlined","useRef","htmlToMarkdown","LikeOutlined","DislikeOutlined","Modal","Row","Col","useDebounce","InfiniteScroll","RedoOutlined","Conversations","DeleteOutlined","PlusOutlined","CommentOutlined","CloseOutlined","forwardRef","App","useRefState","getFileSuffixName","isNumber","isNullOrUnDef","useImperativeHandle","CloudUploadOutlined","useSyncInput","Badge","PaperClipOutlined","Sender","Suggestion","Form","Input","SignatureOutlined","AutoComplete","quickAskPanel","tagContainer","quickAskItem","quickAskItemHeader","quickAskItemBody","SearchOutlined","PushpinOutlined","EditOutlined","Popconfirm","UserSwitchOutlined","List","ChatSender_default","isFunction","EnterOutlined","nsPreviewHeader","nsPreviewHeaderTitle","nsChatSenderHeader","nsDisclaimerNotice","nsChatLayout","nsChatBody","nsBodyWidth","useDeepEffect","sizes","useWebSocket","XProvider","Splitter","FilePreview","FileSearchOutlined"],"mappings":"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","file":"index.cjs.js","sourcesContent":["import { useCreateValtioContext } from '@zero-library/common'\nimport { ChatStoreType } from './types'\n\n/**\n * 基于泛型创建专用的聊天上下文\n * 使用 Valtio 进行状态管理,提供 Provider 和 Hook\n */\nexport const { ValtioProvider: ChatProvider, useValtioStore: useChatStore } = useCreateValtioContext<ChatStoreType>()\n",".appCard {\n width: 180px;\n border-radius: 10px;\n border: 1px solid #d7d7d7;\n background-color: #fafafa;\n font-size: 16px;\n cursor: pointer;\n margin: 8px;\n padding: 12px 8px;\n}\n.appCard > div {\n max-width: 100%;\n}\n.appCard > img {\n height: 30px;\n}\n.fileView {\n width: 200px;\n padding: 4px 8px;\n cursor: pointer;\n background-color: #f5f3f3;\n border-radius: 6px;\n}\n.fileEdit {\n margin: 12px 0;\n border-radius: 6px;\n border: 1px solid #f2f2f2;\n}\n.fileEdit .fileEditHeader {\n padding: 2px 8px;\n background-color: #f2f2f2;\n}\n.fileEdit .fileEditContent {\n padding: 8px;\n background-color: #fafafa;\n}\n.quoteList {\n min-width: 300px;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-header {\n padding: 12px 0;\n color: #8f91a8;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-content {\n color: #8f91a8;\n background-color: #f2f2f2;\n}\n.mdEdit {\n margin: 10px 0;\n background-color: rgba(242, 242, 242, 0.2);\n border: 1px solid #f2f2f2;\n padding: 10px;\n border-radius: 4px;\n}\n.think:global.ant-collapse {\n margin-bottom: 16px;\n}\n.think:global.ant-collapse .ant-collapse-header {\n color: #8f91a8;\n}\n.think:global.ant-collapse .ant-collapse-content {\n color: #8f91a8;\n}\n.think:global.ant-collapse .ant-collapse-content .ant-collapse-content-box {\n padding: 0 10px 0 24px;\n}\n.chart {\n padding: 10px;\n max-width: 100%;\n min-width: 350px;\n overflow-x: scroll;\n display: inline-block;\n border-radius: 12px;\n border: 1px solid #e5e9f0;\n background: linear-gradient(180deg, #fff 0%, #f8fafc 100%);\n margin: 12px 0;\n}\n.chart .chartSkeleton {\n width: 100% !important;\n}\n.chart .chartSkeleton .chartSkeletonIcon {\n font-size: 40px;\n color: #bfbfbf;\n}\n","import { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n agentId: string\n appKey?: string\n appName: string\n iconUrl: string\n }\n loading: boolean\n}\n// :::alert type=appCard data={appKey:\"cube-acc\",agentId:\"\",appName:\"罗拉易账\",iconUrl:\"/icon-url/2e53e398d31627d559e0b3b1b5acb731.png\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = async () => {\n if (data.appKey) {\n const canProceed = await chatStore.config.hooks?.onAppRightVerify?.(data.appKey)\n if (canProceed === false) {\n return\n }\n }\n chatStore.switchAgentConversation(data.agentId)\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex vertical gap={4} align=\"center\" className={styles.appCard} onClick={onClick}>\n <img src={data.iconUrl} />\n <div className=\"text-ellipsis\" title={data.appName}>\n {data.appName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { FileIcon } from '@zero-library/common'\nimport { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport { FileUrlType } from '../../../stores/types'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileUrlType\n loading: boolean\n}\n// :::alert type=fileView data={fileUrl:\"\",fileName:\"\",suffix:\"\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.setPreview(data, false)\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex gap={8} align=\"center\" className={styles.fileView} onClick={onClick}>\n <FileIcon suffix={data.suffix} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { RenderMarkdown } from '@zero-library/common'\nimport { Drawer, Empty, Spin } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../../../stores/Context'\n\ninterface Props {\n paramsStr: string\n title: string\n open: boolean\n onClose: () => void\n}\nexport default ({ title, open, onClose, paramsStr }: Props) => {\n const chatStore = useChatStore()\n const configState = useSnapshot(chatStore.config)\n const [content, setContent] = useState('')\n const [loading, setLoading] = useState(false)\n const getContent = async () => {\n try {\n setLoading(true)\n const res = await configState.services.request.docQuery(paramsStr)\n setContent(res.data?.content)\n } finally {\n setLoading(false)\n }\n }\n useEffect(() => {\n getContent()\n }, [paramsStr])\n return (\n <Drawer title={title} push={false} width=\"100%\" open={open} onClose={onClose}>\n <Spin spinning={loading}>{content ? <RenderMarkdown content={content} /> : <Empty className=\"m-t-32\" />}</Spin>\n </Drawer>\n )\n}\n","// :::alert type=indexQuote data={citationName:引,citationId:5}:::\nimport { isExternal } from '@zero-library/common'\nimport { Flex, Popover, Spin, Tag } from 'antd'\nimport { useMemo, useState } from 'react'\nimport { ConversationMessage } from '../../../services'\nimport DocDrawer from './components/DocDrawer'\n\ninterface Props {\n message: ConversationMessage\n data: {\n citationName: string\n citationId: number\n }\n loading: boolean\n}\nexport default ({ data, loading, message }: Props) => {\n const [open, setOpen] = useState(false)\n // {\"citationId\": 1, \"citationUrl\": \"type=2&datasetId=1997851270976937984&docId=1765162923266&sid=0fd11940-b20e-4719-9b16-147a5f618e4e\", \"citationName\": \"第3卷证词.pdf\"}\n const citation = useMemo(() => {\n let citations = []\n try {\n citations = JSON.parse(message.citations)\n } catch (e) {}\n return citations?.find((item) => String(item.citationId) === String(data.citationId))\n }, [data.citationId, message.citations])\n const onClick = () => {\n if (!citation?.citationUrl) return\n if (isExternal(citation.citationUrl)) {\n window.open(citation.citationUrl, '_blank')\n } else {\n setOpen(true)\n }\n }\n const Content = (\n <div>\n <Flex align=\"center\" gap={8}>\n {/* <FileIcon suffix={data.suffix} fontSize={16} /> */}\n <a onClick={onClick}>{citation?.citationName}</a>\n </Flex>\n </div>\n )\n return (\n <div className=\"inline-block m-l-8\">\n <Spin spinning={loading} size=\"small\">\n <Popover content={Content}>\n <Tag bordered={false} color=\"processing\" className=\"cursor-pointer\">\n {data?.citationName}\n </Tag>\n </Popover>\n </Spin>\n {open && <DocDrawer paramsStr={citation?.citationUrl} title={citation?.citationName} open={open} onClose={() => setOpen(false)} />}\n </div>\n )\n}\n","import { MarkdownEditor } from '@zero-library/common'\nimport { Button, Flex } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n content: string\n btnText?: string\n }\n loading: boolean\n}\n// :::alert type=mdEdit data={content:\"\",btnText:\"\"} :::\nexport default ({ data, loading }: Props) => {\n // const num = useRef(0)\n // useEffect(() => {\n // num.current = num.current + 1\n // console.log('mdEdit', num.current, data.content, loading)\n // }, [data.content, loading])\n const chatStore = useChatStore()\n const [value, setValue] = useState('')\n const btnText = data.btnText || '继续' // '开始写作',\n const onOk = () => {\n chatStore.sendMessage(btnText, [], { citation: value })\n }\n useEffect(() => {\n setValue(data.content)\n }, [data.content])\n return (\n <div className={styles.mdEdit}>\n <MarkdownEditor disabled={loading} value={value} onChange={setValue} showToolbar={false} />\n {!loading && (\n <Flex justify=\"end\" className=\"m-t-16\">\n <Button color=\"primary\" variant=\"outlined\" onClick={onOk}>\n {/* 确认提纲思路,开始写作 */}\n {btnText}\n </Button>\n </Flex>\n )}\n </div>\n )\n}\n","// :::alert type=fileEdit data={fileName:\"\",content:\"\"} :::\nimport { CopyOutlined, PlayCircleOutlined } from '@ant-design/icons'\nimport { copyText, FileIcon, RenderMarkdown } from '@zero-library/common'\nimport { Button, Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport { FileTextType } from '../../../stores/types'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileTextType\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n // console.log('fileEdit', data)\n const chatStore = useChatStore()\n // const configState = useSnapshot(chatStore.config)\n const onPreview = () => {\n chatStore.setPreview(data, true)\n }\n // useEffect(() => {\n // if (configState.preview.isShow !== 2 || (loading && configState.preview.isShow === 1)) {\n // chatStore.setPreview(data, {\n // isEdit: true,\n // isShow: 1,\n // isIntact: !loading\n // })\n // }\n // }, [data, loading])\n\n return (\n <Flex vertical className={styles.fileEdit}>\n <Flex gap={8} align=\"center\" justify=\"space-between\" className={styles.fileEditHeader}>\n <Flex gap={4} align=\"center\" className=\"flex-1\">\n <FileIcon suffix={'md'} fontSize={18} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n <Spin spinning={loading} size=\"small\">\n <Flex>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<PlayCircleOutlined />} onClick={onPreview}>\n 预览编辑\n </Button>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} onClick={() => copyText(data.content)}>\n 复制\n </Button>\n </Flex>\n </Spin>\n </Flex>\n <Flex gap={8} align=\"center\" className={styles.fileEditContent}>\n <RenderMarkdown content={data.content} />\n </Flex>\n </Flex>\n )\n}\n","// :::alert type=think data={content:\"\"} :::\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Collapse } from 'antd'\nimport styles from './styles.module.less'\ninterface Props {\n data: {\n content: string\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n return (\n <Collapse\n className={styles.think}\n ghost\n size=\"small\"\n defaultActiveKey={['think']}\n items={[\n {\n key: 'think',\n label: loading ? '仔细思考中...' : '思考过程',\n children: <RenderMarkdown content={data.content} />\n }\n ]}\n />\n )\n}\n","import { DotChartOutlined } from '@ant-design/icons'\nimport { LazyComponent } from '@zero-library/common'\nimport { Alert, Skeleton } from 'antd'\nimport classNames from 'classnames'\nimport styles from './styles.module.less'\n// 需要支持的图表类型列表\nconst chartTypes = [\n 'Line',\n 'Column',\n 'Bar',\n 'Area',\n 'Pie',\n 'DualAxes',\n 'Scatter',\n 'WordCloud',\n 'Funnel',\n 'Heatmap',\n 'Histogram',\n 'Liquid',\n 'BidirectionalBar',\n 'Box',\n 'Bullet',\n 'CirclePacking',\n 'Gauge',\n 'Radar',\n 'Rose',\n 'Sankey',\n 'Stock',\n 'Sunburst',\n 'Treemap',\n 'Venn',\n 'Waterfall',\n 'MindMap',\n 'Fishbone',\n 'IndentedTree',\n 'Dendrogram',\n 'OrganizationChart',\n 'FlowGraph',\n 'FlowDirectionGraph',\n 'NetworkGraph'\n // …如果还有其他图表也继续加\n] as const\n// 所有支持的图表类型映射\nconst CHART_COMPONENTS = Object.fromEntries(\n chartTypes.map((type) => [\n type,\n () =>\n import('@ant-design/charts').then((mod) => ({\n default: (mod as any)[type]\n }))\n ])\n)\n\ninterface Props {\n data: {\n type: string\n config: any\n }\n loading: boolean\n}\n\nexport default ({ data, loading }: Props) => {\n const { type, config } = data\n\n return (\n <div className={classNames(styles.chart, 'scroll-fade-in')}>\n {loading ? (\n // Antd 骨架屏\n <Skeleton.Node active className={styles.chartSkeleton}>\n <DotChartOutlined className={styles.chartSkeletonIcon} />\n </Skeleton.Node>\n ) : (\n <LazyComponent\n type={type}\n {...config}\n customComponents={CHART_COMPONENTS}\n unknownContent={\n <Alert message=\"不支持的图表\" description={`当前图表类型 \"${type}\" 暂未实现,请检查图表类型是否正确。`} type=\"warning\" showIcon />\n }\n />\n )}\n </div>\n )\n}\n","import { createSecureManager, createTokenManager, emit } from '@zero-library/common'\nimport { UserInfo } from '../services'\n/**\n * 用户信息管理器\n * 用于安全存储和管理用户信息,采用AES加密存储\n */\nexport const userInfoManager = createSecureManager<UserInfo>({\n key: 'NS-USER',\n aesKey: '((#II))'\n})\n\nexport const TOKEN_KEY = 'NS-TOKEN'\n/**\n * 令牌管理器\n * 用于管理用户认证令牌,支持从URL参数或存储中获取、设置和清除令牌\n *\n * 特点:\n * 1. 默认使用localStorage存储\n * 2. 支持从URL参数自动同步令牌\n */\nexport const tokenManager = createTokenManager({\n key: TOKEN_KEY\n})\n\n/**\n * 跳转到登录页面\n * 该函数用于在用户未授权或会话过期时重定向到登录页面\n */\nexport const redirectUrl = () => {\n const path = localStorage.getItem('SIGNPATH')\n emit('jumpLink', { url: `/uc${path || '/sign-in'}` })\n}\n","import { buildUrlParams, getWebSocketUrl } from '@zero-library/common'\nimport dayjs from 'dayjs'\n\n/**\n * 根据时间戳分类时间,返回相对时间描述\n * @param timestamp - 时间戳(毫秒),可选,默认为当前时间\n * @returns 时间分类字符串\n */\nexport const classifyTime = (timestamp?: number): string => {\n const now = dayjs()\n const target = dayjs(timestamp)\n\n if (target.isSame(now, 'day')) {\n return '今天'\n }\n\n const diffInDays = now.diff(target, 'day')\n if (diffInDays < 7) {\n return '最近 7 天'\n } else if (diffInDays < 30) {\n return '最近 30 天'\n } else if (diffInDays < 180) {\n return '最近半年'\n } else {\n return '更早'\n }\n}\n\n/**\n * 替换一些标记为自定义标记方便markdown渲染,比如think标签\n * @param str - 原始字符串\n * @returns 替换后的字符串\n */\nexport const replaceMarkdownTags = (str: string) => {\n return (\n str\n // 替换开标签\n .replace(/<think>/g, \":::alert type=think data={content:'\")\n // 替换闭标签\n .replace(/<\\/think>/g, \"'} :::\\n\")\n )\n}\n/**\n * 构建Chat WebSocket URL\n * 将 baseURL和参数组合成完整的WebSocket连接URL\n *\n * @param baseURL - WebSocket baseURL\n * @param params - 要附加到URL上的参数\n * @returns 完整的WebSocket URL\n */\nexport const getChatSocketUrl = (baseURL: string, params: Record<string, any>) => {\n return buildUrlParams(params, getWebSocketUrl(`${baseURL}/lolr/conversation/ws/subscribe`), 'comma')\n}\n","import { createRequest } from '@zero-library/common'\n\n/**\n * 聊天服务模块\n * 提供聊天相关的 API 接口定义和类型声明\n * 包含会话管理、消息处理、智能体操作等功能\n */\n\n/**\n * 用户信息接口\n * 定义用户的基本信息和权限配置\n */\nexport interface UserInfo {\n /** 用户ID */\n id?: string | number\n /** 用户姓名 */\n name?: string\n /** 头像地址 */\n avatar?: string\n /** 备注信息 */\n remark?: string\n}\n\n/**\n * 会话列表查询参数接口\n * 用于获取用户的会话列表\n */\nexport interface ConversationsQuery extends PageReq {\n /** 业务数据唯一ID,非必填 */\n businessId?: string\n /** 业务类型,非必填 */\n businessType?: number\n /** 目标ID(如智能体ID、专家ID等) */\n targetId: string\n /** 目标类型:1-用户 2-专家 3-Agent 4-税协 */\n targetType: number\n}\n/**\n * 会话成员返回模型\n */\nexport interface ConversationMember {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,会话成员表ID\n */\n id: string\n /**\n * Jointime,加入时间\n */\n joinTime: Date\n /**\n * Memberavatar,成员头像\n */\n memberAvatar: string\n /**\n * Memberid,成员ID\n */\n memberId: string\n /**\n * Membername,成员名称\n */\n memberName: string\n /**\n * Membertype,成员类型\n */\n memberType: number\n /**\n * Orgid,机构ID\n */\n orgId: number\n /**\n * Orgname,机构名称\n */\n orgName: string\n}\nexport interface ConversationType {\n /**\n * Agentid,智能体 ID\n */\n agentId: string\n /**\n * Agentname,智能体名称\n */\n agentName: string\n /**\n * Id,会话 ID\n */\n id: string\n /**\n * Logourl,头像路径\n */\n logoUrl: string\n /**\n * Members,会话成员\n */\n members?: ConversationMember[]\n /**\n * Selected,当前选择的会话\n */\n selected: boolean\n /**\n * State,会话状态 1-正常 2-结束\n */\n state: number\n /**\n * Title,会话标题\n */\n title: string\n /**\n * Unreadcount,当前用户未读消息数\n */\n unreadCount: number\n /**\n * Updatetime,更新时间\n */\n updateTime: number\n}\n\nexport interface ConversationCreate {\n /**\n * Businessdata,业务扩展参数,非必填\n */\n businessData?: string\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗;3-律师\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Type,会话类型: 1-对话; 2-工具\n */\n type: number\n}\n\nexport interface ConversationRecentUpdate extends ConversationRecentQuery {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n}\n\nexport interface ConversationRecentQuery {\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗;3-律师\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n}\n\n/**\n * 会话消息查询参数接口\n * 用于获取指定会话的消息列表\n */\nexport interface conversationMessagesQuery extends PageReq {\n /** 会话ID */\n conversationId: string\n}\n/**\n * 输入文件接口\n * 定义聊天中上传文件的属性\n */\nexport interface InputFile {\n /** 文件内容(base64编码或URL) */\n content: string\n /** 文件模式:remote_url(远程URL)| local_file(本地文件) */\n mode: string\n /** 文件类型(MIME类型) */\n type: string\n /** 文件扩展名 */\n extension: string\n /** 文件名 */\n name: string\n}\n/**\n * 消息引用类型\n * 用于消息回复时的引用信息\n */\nexport interface MessageQuoteMsg {\n /** 被引用的消息ID */\n id?: string\n /** 被引用的消息内容 */\n msgContent?: string\n /** 被引用消息的附件文件列表 */\n msgFiles?: InputFile[]\n}\n\n/**\n * 消息发送者接口\n * 定义消息发送者的身份信息\n */\nexport interface MessageSender {\n /** 是否为当前用户 */\n currUser?: boolean\n /** 发送者ID */\n id: string\n /** 发送者类型:1-用户 2-专家 3-Agent 4-税协 */\n type: number\n}\n/**\n * 会话消息接口\n * 定义聊天消息的完整信息\n */\nexport interface ConversationMessage {\n /** 会话ID */\n conversationId: string\n /** 会话标题(WebSocket返回时可能包含) */\n conversationTitle?: string\n /** 消息类型:WebSocket流式消息类型 */\n type?: 'TEXT_MESSAGE_START' | 'STEP_STARTED' | 'TEXT_MESSAGE_CONTENT' | 'TEXT_MESSAGE_END' | 'RUN_ERROR' | 'TEXT_MESSAGE_CITATION'\n /** 消息ID */\n id: string\n /** 消息内容 */\n msgContent: string\n /** 消息反馈:1-赞 2-踩 */\n msgFeedback?: number\n /** 附件文件列表 */\n msgFiles?: InputFile[]\n /** 引用的消息信息 */\n quoteMsg?: MessageQuoteMsg\n /** 透传参数 json字符串 */\n params?: string\n /** 大模型引用到的数据列表 json字符串*/\n citations?: string\n /** 发送者信息 */\n sender?: MessageSender\n /** 发送时间戳 */\n sendTime: number\n /** 是否被打断标志 */\n stopFlag?: boolean\n\n /** 临时Content数据 用于存储step和error信息 */\n tempContent?: string\n}\n/**\n * 消息反馈更新接口\n * 用于用户对消息进行赞/踩评价\n */\nexport interface FeedbackUpdate {\n /** 会话ID */\n conversationId: string\n /** 消息ID */\n id: string\n /** 反馈类型:1-赞 2-踩 */\n msgFeedback: number\n /** 反馈内容描述,非必填 */\n msgFeedbackContent?: string\n}\n\n/**\n * 消息发送参数接口\n * 定义发送消息时所需的全部参数\n */\nexport interface ConversationMessageSend {\n /** 会话ID */\n conversationId: string\n /** 消息内容 */\n msgContent: string\n /** 附件文件列表 */\n msgFiles?: InputFile[]\n /** 业务参数,透传到智能体的JSON字符串 */\n params?: string\n /** 引用的消息ID,大于0的整数 */\n quoteMsgId?: number\n /** 接收者ID,当receiverType≠3时由后端填充 */\n receiverId: string\n /** 接收者类型:1-用户 2-专家 3-agent 4-税协 */\n receiverType: number\n /** 返回方式:1-http 2-WebSocket */\n returnType: number\n /** 发送者ID */\n senderId: string\n /** 发送者类型:1-用户 2-专家 3-agent 4-税协 */\n senderType: number\n /** 会话来源:1-罗拉-APP 2-罗拉-pc端 3-合作伙伴端 4-税协 5-罗拉-cube 6-api */\n source: number\n /** 是否启用流式返回 */\n stream: boolean\n}\n/**\n * 文件上传配置接口\n * 定义智能体的文件上传规则\n */\nexport interface FileUploadConfig {\n /** 允许的文件类型列表(MIME类型或扩展名) */\n allowedFileTypes: string[]\n /** 是否启用文件上传功能 */\n enabled: boolean\n /** 单次上传最大文件数量 */\n maxFileCount: number\n /** 单个文件最大大小(字节) */\n maxFileSize?: number\n}\n\n/**\n * 推荐问题接口\n * 定义单个推荐问题的结构\n */\nexport interface RecommendQuestion {\n /** 问题ID */\n id: number\n /** 问题内容 */\n question: string\n}\n\n/**\n * 热门问题标签接口\n * 定义热门问题的分类标签\n */\nexport interface HotQuestionList {\n /** 标签ID */\n id: number\n /** 标签下的问题列表 */\n items: RecommendQuestion[]\n /** 标签名称 */\n name: string\n}\n\n/**\n * 智能体配置接口\n * 定义智能体的功能配置信息\n */\nexport interface AgentConfig {\n /** 文件上传配置列表 */\n fileUpload?: FileUploadConfig[]\n /** 热门问题标签列表 */\n labels?: HotQuestionList[]\n}\n/**\n * 智能体信息接口\n * 定义智能体的基本信息和配置\n */\nexport interface AgentInfo {\n /** 智能体名称 */\n agentName: string\n /** 智能体类型 */\n agentType: number\n /** 智能体的配置信息 */\n config: AgentConfig\n /** 智能体描述 */\n description?: string\n /** 智能体ID */\n id: string\n /** 智能体是否可用 */\n isAvailable?: boolean\n /** 智能体Logo地址 */\n logo: string\n /** 智能体特性配置,JSON字符串格式 */\n feature?: string\n}\n\n/**\n * 智能体性格接口\n * 定义智能体的性格特征配置\n */\nexport interface AgentCharacter {\n /** 智能体ID */\n agentId: number\n /** 性格名称 */\n characterName: string\n /** 详细程度评级:1-10 */\n detailLevel: number\n /** 幽默程度评级:1-10 */\n humorLevel: number\n /** 性格配置ID */\n id: number\n /** 性格头像图片路径 */\n logo: string\n /** 专业程度评级:1-10 */\n professionalLevel: number\n /** 是否为当前选择的性格 */\n selected: boolean\n /** 性别设置:1-男 2-女 */\n sex: number\n}\n\n/**\n * 快速提问更新参数接口\n */\nexport interface LabelItemUpdate extends LabelItemPrompt {\n /** 快速提问ID,修改时必填 */\n id?: string\n}\n\n/**\n * 快速提问列表查询参数接口\n */\nexport interface LabelItemListQuery {\n /** 分类ID */\n labelId?: string\n /** 搜索关键字 */\n keyword?: string\n}\n\n/**\n * 快速提问列表项接口\n */\nexport interface LabelItem extends LabelItemUpdate {\n /** 问题ID */\n id: string\n agentId: string\n seq: number\n /** 是否置顶 */\n isTop?: boolean\n createTime: number\n updateTime: number\n canDelete?: boolean\n}\n\nexport interface LabelQuery extends PageReq {\n labelName?: string\n}\nexport interface LabelType {\n /** 分类ID */\n id: string\n /** 分类名称 */\n labelName: string\n createTime: number\n updateTime: number\n canDelete?: boolean\n}\n/**\n * 快速提问置顶参数接口\n */\nexport interface LabelItemTop {\n /** 问题ID */\n id: string\n /** 是否置顶 */\n isTop: boolean\n}\n\n/**\n * 罗拉提示词助手返回接口\n */\nexport interface LabelItemPrompt {\n /** 建议的问题名称 */\n title: string\n /** 建议的问题分类 */\n labelName: string\n /** 建议的问题内容 */\n content: string\n}\n\n/**\n * 创建聊天服务\n * @param request - 请求函数实例\n * @returns 聊天服务对象\n */\nexport const createChatService = (request: ReturnType<typeof createRequest>) => {\n /**\n * 查询会话列表\n * @param params - 查询参数,包含分页和过滤条件\n * @returns 分页的会话列表\n */\n const conversationsQuery = (params: ConversationsQuery): Promise<R<PageRes<ConversationType>>> => {\n return request.get('/lolr/conversation', params)\n }\n\n /**\n * 创建新会话\n * @param params - 创建会话的参数\n * @returns 新创建的会话ID\n */\n const conversationCreate = (params: ConversationCreate): Promise<R<string>> => {\n return request.post('/lolr/conversation', params)\n }\n\n /**\n * 删除指定会话\n * @param conversationId - 要删除的会话ID\n */\n const conversationDelete = (conversationId: string): Promise<R<null>> => {\n return request.delete('/lolr/conversation', { conversationId })\n }\n /**\n * 更新用户的最近一次会话\n * @param params - 更新参数,包含会话ID\n * @returns 更新是否成功\n */\n const conversationRecentUpdate = (params: ConversationRecentUpdate): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/recent', params)\n }\n /**\n * 获取用户的最近一次会话\n * @param params - 查询参数\n * @returns 最近会话ID\n */\n const conversationRecentQuery = (params: ConversationRecentQuery): Promise<R<string>> => {\n return request.get('/lolr/conversation/recent', params)\n }\n\n /**\n * 查询会话消息列表\n * @param params - 查询参数,包含会话ID和分页信息\n * @returns 分页的消息列表\n */\n const conversationMessagesQuery = (params: conversationMessagesQuery): Promise<R<PageRes<ConversationMessage>>> => {\n return request.get('/lolr/conversation/message', params)\n }\n\n /**\n * 标记会话中的消息为已读\n * @param conversationId - 会话ID\n * @returns 标记是否成功\n */\n const conversationMessageRead = (conversationId: ConversationType['id']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/message/read', { conversationId })\n }\n\n /**\n * 更新消息反馈(赞或踩)\n * @param params - 反馈参数,包含消息ID和反馈类型\n */\n const feedbackUpdate = (params: FeedbackUpdate): Promise<R<null>> => {\n return request.put('/lolr/conversation/message/feedback', params)\n }\n /**\n * 获取基于消息的推荐问题\n * @param msgId - 消息ID\n * @param maxCount - 最大推荐数量,默认为3\n * @returns 推荐问题列表\n */\n const messageSuggestedQuery = (msgId: ConversationMessage['id'], maxCount = 3): Promise<R<string[]>> => {\n return request.get('/lolr/conversation/suggest', { msgId, maxCount })\n }\n\n /**\n * 获取会话成员列表\n * @param conversationId - 会话ID\n * @returns 会话成员列表\n */\n const conversationMemberQuery = (conversationId: ConversationType['id']): Promise<R<ConversationMember[]>> => {\n return request.get('/lolr/conversation/member', { conversationId })\n }\n /**\n * 更新会话状态\n * @param conversationId - 会话ID\n * @param state - 新的会话状态(1-正常 2-结束)\n * @returns 更新是否成功\n */\n const conversationStateUpdate = (conversationId: ConversationType['id'], state: ConversationType['state']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/state', { conversationId, state })\n }\n\n /**\n * 发送消息到会话\n * @param params - 消息发送参数\n */\n const conversationMessageSend = (params: ConversationMessageSend): Promise<R<void>> => {\n return request.post('/lolr/conversation/send', params)\n }\n\n /**\n * 打断正在进行的流式输出\n * @param conversationId - 要打断的会话ID\n */\n const conversationStop = (conversationId: ConversationType['id']): Promise<R<void>> => {\n return request.post('/lolr/conversation/stop', { conversationId })\n }\n\n /**\n * 获取智能体详细信息\n * @param agentId - 智能体ID\n * @returns 智能体详细信息\n */\n const agentInfoQuery = (agentId: AgentInfo['id']): Promise<R<AgentInfo>> => {\n return request.get('/lolr/agent/detail', { agentId })\n }\n\n /**\n * 获取智能体的性格角色列表\n * @param agentId - 智能体ID\n * @returns 性格角色列表\n */\n const agentCharacterQuery = (agentId: AgentInfo['id']): Promise<R<AgentCharacter[]>> => {\n return request.get('/lolr/character', { agentId })\n }\n /**\n * 为用户选择智能体的性格角色\n * @param agentId - 智能体ID\n * @param characterId - 性格角色ID\n */\n const agentCharacterSelect = (agentId: AgentInfo['id'], characterId: AgentCharacter['id']): Promise<R<null>> => {\n return request.post('/lolr/character/user', { agentId, characterId })\n }\n\n /**\n * 上传文件到存储服务\n * @param formData - 包含文件的表单数据\n * @returns 上传后的文件信息\n */\n const fileUpload = (formData: FormData): Promise<R<InputFile>> => {\n return request.post('/lolr/storage/upload', formData, { timeout: 5 * 60 * 1000 })\n }\n\n /**\n * 新增/修改快速提问\n */\n const labelItemUpdate = (agentId: AgentInfo['id'], params: LabelItemUpdate): Promise<R<LabelItem['id']>> => {\n return request.post('/lolr/label/item', { agentId, ...params })\n }\n\n /**\n * 删除快速提问\n */\n const labelItemDelete = (id: LabelItem['id']): Promise<R<null>> => {\n return request.delete('/lolr/label/item', { id })\n }\n\n /**\n * 获取快速提问分类列表\n */\n const labelsQuery = (agentId: AgentInfo['id'], params?: LabelQuery): Promise<R<PageRes<LabelType>>> => {\n return request.get('/lolr/label', { agentId, ...params })\n }\n\n /**\n * 获取快速提问列表\n */\n const labelItemsQuery = (agentId: string, params: LabelItemListQuery): Promise<R<LabelItem[]>> => {\n return request.get('/lolr/label/item', { ...params, agentId })\n }\n\n /**\n * 置顶/取消置顶快速提问\n */\n const labelItemTop = (params: LabelItemTop): Promise<R<null>> => {\n return request.put('/lolr/label/item/top', params)\n }\n\n /**\n * 罗拉提示词助手\n * 根据用户输入的描述生成建议的问题表单项\n */\n const labelItemPromptAssistant = (prompt: string): Promise<R<LabelItemPrompt>> => {\n return request.post('/lolr/agent/prompts/optimization', { prompt })\n }\n\n /**\n * 获取智能推荐问题\n * 根据智能体配置和会话上下文生成推荐问题\n */\n const recommendQuestionsQuery = (agentId: AgentInfo['id'], conversationId: ConversationType['id']): Promise<R<string[]>> => {\n return request.get('/lolr/agent/suggest', { maxCount: 3, agentId, conversationId })\n }\n\n return {\n conversationsQuery,\n conversationCreate,\n conversationDelete,\n conversationRecentUpdate,\n conversationRecentQuery,\n conversationMessagesQuery,\n conversationMessageRead,\n feedbackUpdate,\n messageSuggestedQuery,\n conversationMemberQuery,\n conversationStateUpdate,\n conversationMessageSend,\n conversationStop,\n agentInfoQuery,\n agentCharacterQuery,\n agentCharacterSelect,\n fileUpload,\n labelItemUpdate,\n labelItemDelete,\n labelsQuery,\n labelItemsQuery,\n labelItemTop,\n labelItemPromptAssistant,\n recommendQuestionsQuery\n }\n}\n","import { createRequest, downloadFile } from '@zero-library/common'\n/**\n * 文档类型接口\n */\nexport interface DocType {\n /** 文档内容 */\n content: string\n /** 文档唯一标识 */\n docId: string\n /** 文档关键字列表 */\n keywords?: string[]\n /** 文档位置 */\n position?: number\n /** 文档分段ID */\n sid?: string\n /** 文档令牌数量 */\n tokens?: number\n /** 文档字数 */\n wordCount?: number\n}\n\n/**\n * 创建文件服务\n * @param request - 请求函数实例\n * @returns 文件服务对象\n */\nexport const createFileService = (request: ReturnType<typeof createRequest>) => {\n /**\n * 查询文档信息\n * @param paramsStr - 查询参数字符串\n * @returns 文档信息\n */\n const docQuery = (paramsStr: string): Promise<R<DocType>> => {\n return request.get(`/lolr/doc?${paramsStr}`)\n }\n\n /**\n * 创建文件(将内容转换为指定格式的文件并下载)\n * @param fileContent - 文件内容\n * @param fileName - 文件名,可选\n * @param targetFormat - 目标文件格式,默认为 'docx'\n */\n const fileCreate = async (fileContent: string, fileName?: string, targetFormat: string = 'docx') => {\n const blob = await request.post(`/uc/doc/convert`, { fileContent, fileName, targetFormat }, { responseType: 'blob' })\n const url = URL.createObjectURL(blob)\n downloadFile(url, fileName)\n }\n\n return {\n docQuery,\n fileCreate\n }\n}\n","import { Conversation } from '@ant-design/x'\nimport {\n createRequest,\n deepCopy,\n deepMerge,\n HttpStatus,\n isArray,\n isObject,\n isString,\n shouldRender,\n transform,\n transforms\n} from '@zero-library/common'\nimport { message } from 'antd'\nimport { proxy } from 'valtio'\nimport { redirectUrl, TOKEN_KEY, tokenManager, userInfoManager } from '../core/local'\nimport { classifyTime, getChatSocketUrl } from '../core/utils'\nimport {\n AgentCharacter,\n AgentInfo,\n ConversationMember,\n ConversationMessage,\n ConversationMessageSend,\n ConversationsQuery,\n ConversationType,\n createChatService,\n FeedbackUpdate,\n UserInfo\n} from '../services'\nimport { createFileService } from '../services/file'\nimport {\n ChatHooks,\n ChatLayout,\n ChatParams,\n ChatServices,\n ConversationMemberObj,\n ConversationStrategy,\n FileTextType,\n FileUrlType,\n MessageBoxType,\n ReceiverInfo,\n ReferencesType,\n RequestInstance\n} from './types'\n\nconst defaultAgentLayout = {\n leftPanel: false,\n conversationList: true,\n preview: true,\n messageList: true,\n senderHeader: false,\n sender: true,\n senderFooter: false,\n globalHeader: false,\n chatHeader: true,\n disclaimerNotice: true,\n recommendQuestions: false\n} as ChatLayout\nconst defaultExpertLayout = {\n leftPanel: false,\n conversationList: false,\n preview: false,\n messageList: true,\n senderHeader: false,\n sender: {\n props: {\n prompts: false\n }\n },\n senderFooter: false,\n globalHeader: false,\n chatHeader: {\n props: {\n newConversationBtn: false,\n agentCharacter: false,\n conversationListBtn: false\n }\n },\n disclaimerNotice: false,\n recommendQuestions: false\n} as ChatLayout\n\n/**\n * 创建聊天状态管理器\n * 使用 Valtio 进行状态管理,包含会话、消息、用户信息等所有聊天相关状态\n * @returns 聊天状态管理器和操作方法\n */\nexport function createChatStore() {\n /** 全局配置对象,包含服务、钩子函数、布局等配置 */\n const config = proxy({\n services: {\n /** WebSocket地址 */\n websocketUrls: ['', ''] as [string, string],\n /** HTTP请求实例 */\n request: {} as RequestInstance\n },\n hooks: {} as ChatHooks,\n layout: {} as ChatLayout,\n /** 文件预览状态 */\n preview: {\n file: {} as FileUrlType | FileTextType,\n isEdit: false // 未使用\n // isShow: 0, // 0 不显示 1 显示 2 用户关闭\n // isIntact: false // true 完整 false 不完整\n },\n /** 当前用户信息 */\n userInfo: {} as UserInfo,\n /** 聊天参数配置 */\n params: {} as ChatParams\n })\n\n /**\n * 设置服务配置\n * 配置聊天组件所需的HTTP和WebSocket服务\n *\n * @param services - 服务配置对象,包含HTTP和WebSocket配置\n */\n const setServices = ({ http, websocket } = {} as ChatServices) => {\n // 合并默认HTTP配置和用户提供的配置,包括默认的认证头\n const httpConfig = { baseURL: '/api', headers: { [TOKEN_KEY]: tokenManager.get() }, ...http?.config }\n // 初始化http配置\n const request = createRequest(httpConfig)\n if (config.hooks?.onRequestInterceptor) {\n request.instance.interceptors.request.use(...(config.hooks.onRequestInterceptor as any))\n }\n request.instance.interceptors.response.use(undefined, (err) => {\n if (err?.response?.status === HttpStatus.UNAUTHORIZED) {\n if (config.hooks.onRedirectLogin) {\n config.hooks.onRedirectLogin()\n } else {\n redirectUrl()\n }\n }\n return Promise.reject(err)\n })\n if (config.hooks?.onResponseInterceptor) {\n request.instance.interceptors.response.use(...config.hooks.onResponseInterceptor)\n }\n config.services.request = { ...createChatService(request), ...createFileService(request), ...http?.request }\n\n // 初始化WebSocket配置数组,最多支持两个地址\n config.services.websocketUrls = ['', '']\n if (isArray(websocket?.baseURLs)) {\n // 配置提供的WebSocket地址\n websocket.baseURLs.forEach((baseURL, index) => {\n if (isString(baseURL)) {\n config.services.websocketUrls[index] = getChatSocketUrl(baseURL, websocket?.params || httpConfig.headers)\n }\n })\n } else {\n // 如果未提供WebSocket URL数组,则继承HTTP配置\n const url = getChatSocketUrl(httpConfig.baseURL, websocket?.params || httpConfig.headers)\n config.services.websocketUrls = [url, '']\n }\n }\n /**\n * 设置文件预览\n * @param file - 要预览的文件\n * @param isEdit - 是否为编辑模式\n */\n const setPreview = async (file = {} as FileUrlType | FileTextType, isEdit = false) => {\n const preview = shouldRender(config.layout.preview)\n const canProceed = await config.hooks?.onBeforeFilePreview?.(file, preview)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n if (preview) {\n config.preview = {\n file,\n isEdit\n }\n } else {\n if ((file as FileUrlType)?.fileUrl) {\n window.open((file as FileUrlType).fileUrl, '_blank')\n } else if ((file as FileTextType)?.content) {\n console.log('当前环境不支持预览')\n }\n }\n\n config.hooks?.onAfterFilePreview?.(file, preview)\n }\n /**\n * 设置布局配置\n * @param layout - 布局配置\n * @param receiverType - 接收者类型:3-智能体,其他-专家\n */\n const setLayout = (layout: ChatLayout, receiverType: number = 3) => {\n const defaultLayout = receiverType === 3 ? defaultAgentLayout : defaultExpertLayout\n config.layout = deepMerge(defaultLayout, layout)\n }\n /**\n * 设置聊天参数\n * @param params - 聊天参数配置\n */\n const setParams = (params = {} as ChatParams) => {\n config.params = { ...params }\n }\n /**\n * 设置生命周期钩子函数\n * @param hooks - 钩子函数配置\n */\n const setHooks = (hooks = {} as ChatHooks) => {\n config.hooks = hooks\n }\n /**\n * 设置当前用户信息\n * @param userInfo - 用户信息\n */\n const setUserInfo = (userInfo?: UserInfo) => {\n config.userInfo = userInfo || userInfoManager.get() || {}\n config.userInfo.id = String(config.userInfo.id || '')\n }\n /** 接收者状态管理,包含当前激活的接收者信息 */\n const receiver = proxy({\n /** 当前激活的接收者信息(智能体或专家) */\n active: {} as ReceiverInfo,\n /** 智能体推荐问题列表 */\n recommendQuestions: [] as string[],\n /** 接收者加载状态 */\n loading: false,\n /** 接收者透传参数,后期可能扩展不透传参数 */\n params: {} as ObjectType<any>\n })\n\n const setReceiverParams = (params?: ObjectType<any>) => {\n if (isObject(params)) {\n Object.assign(receiver.params, params)\n } else {\n receiver.params = {}\n }\n }\n // 智能体切换\n const switchAgent = async (agentId: AgentInfo['id']) => {\n // 切换智能体\n if (receiver.active.id === agentId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchAgent?.(agentId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n\n try {\n receiver.loading = true\n const { data } = await config.services.request.agentInfoQuery(agentId)\n receiver.active = transform<AgentInfo, ReceiverInfo>(data, {\n name: 'agentName',\n logo: 'logo',\n description: 'description',\n id: 'id',\n config: 'config',\n isAvailable: 'isAvailable',\n feature: (agentInfo) => {\n if (agentInfo.feature) {\n try {\n return JSON.parse(agentInfo.feature)\n } catch (e) {}\n }\n return {}\n }\n })\n receiver.active.type = 3\n setReceiverParams()\n\n config.hooks?.onAfterSwitchAgent?.(data)\n } catch (error) {\n console.error(error)\n throw error\n } finally {\n receiver.loading = false\n }\n }\n // 目前只是为了对照智能体\n const switchExpert = (expert: ConversationMember) => {\n if (receiver.active.id === expert.memberId) return\n receiver.active = transform<ConversationMember, ReceiverInfo>(expert, {\n name: 'memberName',\n logo: 'memberAvatar',\n id: 'memberId'\n })\n receiver.active.type = 2\n setReceiverParams()\n }\n\n /** 智能体性格状态管理 */\n const character = proxy({\n /** 性格列表 */\n list: [] as AgentCharacter[],\n /** 当前激活的性格 */\n active: {} as AgentCharacter,\n /** 性格选择面板是否打开 */\n open: false,\n /** 加载性格列表的状态 */\n loading: false,\n /** 切换性格时的加载状态 */\n switchLoading: false\n })\n\n const getCharacters = async (agentId: AgentInfo['id']) => {\n try {\n character.loading = true\n const { data } = await config.services.request.agentCharacterQuery(agentId)\n if (receiver.active.id !== agentId) return\n character.list = data || []\n const active = character.list.find((item) => item.selected)\n if (active) {\n character.active = active\n }\n } finally {\n character.loading = false\n }\n }\n const openCharacterList = () => {\n character.open = true\n }\n const closeCharacterList = () => {\n character.open = false\n }\n const switchCharacter = async (c: AgentCharacter) => {\n if (!c.id) return\n try {\n character.switchLoading = true\n await config.services.request.agentCharacterSelect(receiver.active.id, c.id)\n character.active = { ...c }\n closeCharacterList()\n } finally {\n character.switchLoading = false\n }\n }\n\n /** 历史会话管理 */\n const conversations = proxy({\n /** 会话列表数据 */\n list: {\n items: [] as Conversation[],\n /** 分页查询参数 */\n params: {\n pageNum: 1,\n pageSize: 1000\n }\n },\n /** 当前会话索引,创建会话时更新,促使页面更新会话列表 */\n updateIndex: 0,\n /** 获取会话列表的加载状态 */\n loading: false,\n /** 删除会话的加载状态 */\n delLoading: false\n })\n\n const getConversations = async (targetId: ConversationsQuery['targetId'], targetType: ConversationsQuery['targetType']) => {\n try {\n conversations.loading = true\n const { data } = await config.services.request.conversationsQuery({\n targetId,\n targetType,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n ...conversations.list.params\n })\n // 防止会话接口请求前就已经切换了会话\n if (receiver.active.id !== targetId) return\n const items = transforms<ConversationType, Conversation>(data?.items || [], {\n key: 'id',\n id: 'id',\n label: 'title',\n group: (c): string => {\n return classifyTime(c.updateTime)\n },\n timestamp: 'updateTime'\n })\n conversations.list.items = items\n } finally {\n conversations.loading = false\n }\n }\n const delConversation = async (conversationId: ConversationType['id']) => {\n try {\n const canProceed = await config.hooks?.onBeforeDelConversation?.(conversationId)\n if (canProceed === false) return\n conversations.delLoading = true\n await config.services.request.conversationDelete(conversationId)\n message.success('删除成功')\n conversations.list.items = conversations.list.items.filter((item) => item.key !== conversationId)\n delete conversation.messages[conversationId]\n if (conversation.active.id === conversationId) {\n createConversation()\n }\n config.hooks?.onAfterDelConversation?.(conversationId, conversation.active.id === conversationId)\n } finally {\n conversations.delLoading = false\n }\n }\n /** 当前会话管理 */\n const conversation = proxy({\n /** 当前激活的会话信息 */\n active: {\n id: '',\n /** 会话成员对象,包含用户、智能体、专家等 */\n member: {} as ConversationMemberObj\n },\n /** 每个会话的消息存储,以会话ID为键 */\n messages: {} as { [key: ConversationType['id']]: MessageBoxType },\n /** 消息反馈状态 */\n feedback: {\n // open: false,\n /** 反馈操作加载状态 */\n loading: false\n // recordId: '',\n // target: undefined as number | undefined\n }\n })\n const setSpeakHuman = (speakHuman: boolean) => {\n conversation.messages[conversation.active.id].speakHuman = speakHuman\n }\n const setReferences = async (references?: ReferencesType) => {\n const canProceed = await config.hooks?.onBeforeSetReferences?.(references)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n conversation.messages[conversation.active.id].references = references\n config.hooks?.onAfterSetReferences?.(references)\n }\n const setContent = (content?: ConversationMessageSend['msgContent']) => {\n conversation.messages[conversation.active.id].content = content\n }\n const setContentParams = (params?: MessageBoxType['params']) => {\n conversation.messages[conversation.active.id].params = params\n }\n const setFileList = (files = [] as ConversationMessageSend['msgFiles']) => {\n conversation.messages[conversation.active.id].files = files\n }\n const setHeaderOpen = (headerOpen: MessageBoxType['headerOpen']) => {\n conversation.messages[conversation.active.id].headerOpen = headerOpen\n }\n const removeQuestionList = (conversationId: ConversationType['id']) => {\n if (conversation.messages[conversationId].questionList?.length) {\n conversation.messages[conversationId].questionList = []\n }\n }\n const getQuestionList = async (conversationId: ConversationType['id'], messageId: ConversationMessage['id']) => {\n // 根据配置判断是否接受message推荐问题,TODO切换智能体间隙会出现问题\n if (receiver.active.feature?.prompts === false) return\n const messages = conversation.messages[conversationId]?.message\n if (!messages?.length) return\n let lastMessage = messages[messages.length - 1]\n if (!lastMessage || lastMessage.sender.type !== 3 || lastMessage.id !== messageId) return\n const { data } = await config.services.request.messageSuggestedQuery(messageId)\n lastMessage = messages[messages.length - 1]\n if (lastMessage.id !== messageId) return\n\n conversation.messages[conversationId].questionList = data!\n }\n\n /**\n * 获取智能推荐问题\n * 如果是新会话(通常新会话没有消息),尝试获取智能推荐问题\n */\n const getRecommendQuestions = async (conversationId: ConversationType['id']) => {\n if (conversationId === conversation.active.id && conversation.active.member.agent?.id && !conversation.messages[conversationId].message.length) {\n try {\n const { data } = await config.services.request.recommendQuestionsQuery(conversation.active.member.agent.id, conversationId)\n if (conversationId === conversation.active.id) {\n receiver.recommendQuestions = data\n }\n } catch (e) {}\n }\n }\n\n // const closeFeedback = async () => {\n // conversation.feedback.open = false\n // }\n\n const feedback = async (\n conversationId: FeedbackUpdate['conversationId'],\n messageId: FeedbackUpdate['id'],\n msgFeedback: FeedbackUpdate['msgFeedback'],\n index: number\n ) => {\n try {\n conversation.feedback.loading = true\n await config.services.request.feedbackUpdate({ conversationId, id: messageId, msgFeedback })\n message.success('感谢您的反馈')\n // closeFeedback()\n conversation.messages[conversationId].message[index].msgFeedback = msgFeedback\n } finally {\n conversation.feedback.loading = false\n }\n }\n\n /**\n * 初始化会话消息状态\n * @param conversationId - 会话ID\n */\n const setInitMessage = async (conversationId: ConversationType['id']) => {\n conversation.messages[conversationId] = {\n /** 输入框内容 */\n content: '',\n /** 上传文件列表 */\n files: [] as ConversationMessageSend['msgFiles'],\n /** 头部展开状态 */\n headerOpen: false,\n /** 消息发送/接收加载状态 */\n loading: false,\n /** 消息列表 */\n message: [],\n /** 推荐问题列表 */\n questionList: []\n }\n }\n /**\n * 解析会话ID(根据策略获取或创建会话)\n * 如果前端不存在会话ID,目前只有智能体在用\n * @param receiverId - 接收者ID(智能体ID)\n * @param strategy - 会话策略:1-最近会话 2-新会话\n * @returns 会话ID\n */\n const resolveConversationId = async (receiverId: AgentInfo['id'], strategy: ConversationStrategy = 2) => {\n if (strategy === 1) {\n const { data } = await config.services.request.conversationRecentQuery({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType\n })\n return data\n } else {\n const { data } = await config.services.request.conversationCreate({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n businessData: config.params.businessData,\n source: config.params.source,\n type: 1\n })\n conversations.updateIndex = conversations.updateIndex + 1\n return data\n }\n }\n\n const initConversation = async (conversationId: Conversation['id']) => {\n try {\n const { data } = await config.services.request.conversationMemberQuery(conversationId)\n conversation.active = { id: conversationId, member: {} }\n data.forEach((member) => {\n if (member.memberType === 3) {\n conversation.active.member.agent = member\n } else {\n // TODO 应该使用用户id 匹配; member.memberType === 1临时判断\n if (member.memberId === config.userInfo.id || member.memberType === 1) {\n conversation.active.member.user = member\n } else {\n conversation.active.member.other = member\n }\n }\n })\n } finally {\n }\n }\n const switchAgentConversation = async (id: AgentInfo['id'], strategy?: ConversationStrategy) => {\n await switchAgent(String(id))\n const conversationId = await resolveConversationId(receiver.active.id, strategy)\n if (conversationId) {\n await switchConversation(conversationId)\n }\n }\n const createConversation = async () => {\n if (!receiver.active.id) return\n const conversationId = await resolveConversationId(receiver.active.id)\n if (conversationId) {\n await switchConversation(conversationId)\n }\n }\n // 切换会话\n const switchConversation = async (id: Conversation['id']) => {\n const conversationId = String(id)\n if (conversation.active.id === conversationId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchConversation?.(conversationId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n // 初始化会话\n await initConversation(conversationId)\n // 清空智能体推荐问题\n receiver.recommendQuestions = []\n // 关闭文件预览\n await setPreview()\n config.hooks?.onAfterSwitchConversation?.(conversationId)\n\n // 初始化接收者\n try {\n if (conversation.active.member.agent) {\n switchAgent(conversation.active.member.agent.memberId)\n } else if (conversation.active.member.other) {\n switchExpert(conversation.active.member.other)\n }\n } catch (e) {}\n // 获取消息列表\n await getMessages(conversationId)\n }\n const getMessages = async (conversationId: ConversationType['id']) => {\n const canProceed = await config.hooks?.onBeforeInitMessages?.(conversationId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n // 初始化消息列表\n if (!conversation.messages[conversationId]) {\n setInitMessage(conversationId)\n }\n if (conversation.messages[conversationId].message.length === 0) {\n // try {\n // conversation.messages[key].messageLoading = true\n const { data } = await config.services.request.conversationMessagesQuery({\n pageNo: 1,\n pageSize: 1000,\n conversationId\n })\n conversation.messages[conversationId].message = data.items\n // }catch(e){\n // throw e\n // } finally {\n // conversation.messages[key].messageLoading = false\n // }\n }\n getRecommendQuestions(conversationId)\n config.hooks?.onAfterInitMessages?.(conversation.messages[conversationId].message)\n config.hooks?.onAfterInit?.()\n }\n\n /**\n * 选择消息接收者\n * 根据当前会话状态和说话人类型选择合适的接收者\n * @returns 消息接收者信息\n */\n const pickReceiver = () => {\n const { agent, other } = conversation.active.member\n // 如果当前是人类专家说话模式且有专家,则选择专家\n if (conversation.messages[conversation.active.id].speakHuman && other) return other\n // 优先选择智能体\n if (agent) return agent\n // 其次选择专家\n if (other) return other\n return undefined\n }\n const sendMessage = async (\n message?: ConversationMessageSend['msgContent'],\n files = [] as ConversationMessageSend['msgFiles'],\n params?: ObjectType<any>\n ) => {\n const conversationId = conversation.active.id\n if (conversation.messages[conversationId].loading) return\n let msgContent: ConversationMessageSend['msgContent'] = '',\n msgFiles: ConversationMessageSend['msgFiles'] | undefined\n const references = conversation.messages[conversationId].references\n if (message) {\n msgContent = message\n msgFiles = files\n } else {\n if (references?.type === 1 && references?.content?.msgContent) {\n msgContent = references.content.msgContent + '\\n'\n }\n msgContent = msgContent + conversation.messages[conversationId].content!\n msgFiles = conversation.messages[conversationId].files\n }\n if (!msgContent) return\n\n const canProceed = await config.hooks?.onBeforeSend?.(msgContent, msgFiles)\n if (canProceed === false) return\n\n conversation.messages[conversationId].loading = true\n const sendReceiver = pickReceiver()\n const sendParams = {\n conversationId,\n msgContent,\n msgFiles,\n // quoteMsgId\n receiverId: sendReceiver.memberId,\n receiverType: sendReceiver.memberType,\n returnType: 2,\n senderId: conversation.active.member.user.memberId,\n senderType: conversation.active.member.user.memberType,\n source: config.params.source,\n stream: true\n } as ConversationMessageSend\n // 参数合并\n const extraParams = deepCopy(config.params.params || {}) as ChatParams['params']\n Object.assign(extraParams, receiver.params, message ? {} : { ...references?.params, ...conversation.messages[conversationId].params }, params)\n sendParams.params = JSON.stringify(extraParams)\n\n if (!message) {\n setContent('')\n setContentParams()\n setFileList([])\n setReferences()\n setHeaderOpen(false)\n }\n try {\n await config.services.request.conversationMessageSend(sendParams)\n\n config.hooks?.onAfterSend?.()\n } finally {\n // loading关闭由websocket消息执行\n // conversation.messages[conversationId].loading = false\n }\n }\n const cancelReceive = async () => {\n console.log('取消接收')\n // TODO 取消接收\n await config.services.request.conversationStop(conversation.active.id)\n conversation.messages[conversation.active.id].loading = false\n }\n\n // 更新会话标题\n const updateConversationTitle = (conversationId: ConversationType['id'], title: ConversationType['title']) => {\n if (title && conversations.list.items.length) {\n const idx = conversations.list.items.findIndex((item) => item.id === conversationId)\n if (idx === -1) return\n conversations.list.items[idx].label = title\n }\n }\n\n const findMsgIndex = (msgId: string, messages?: ConversationMessage[]) => {\n return (messages || []).findLastIndex((item) => item.id === msgId)\n }\n /**\n * WebSocket消息开始回调\n * 处理消息开始接收时的状态更新\n * @param msg - 接收到的消息\n */\n const startCallback = (msg: ConversationMessage) => {\n // 清除推荐问题列表\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId]?.message\n // 未初始化消息列表\n if (!messages) return\n // 如果是智能体消息,显示思考状态;用户消息直接显示\n messages.push(msg.sender.type === 3 ? { ...msg, tempContent: '正在努力思考中' } : msg)\n conversation.messages[msg.conversationId].loading = true\n }\n\n /**\n * WebSocket步骤消息回调\n * 处理多步骤消息的更新\n * @param msg - 步骤消息\n */\n const stepCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n conversation.messages[msg.conversationId].loading = true\n // 更新步骤消息\n messages[idx] = {\n ...messages[idx],\n type: msg.type,\n tempContent: msg.msgContent\n }\n }\n\n /**\n * WebSocket消息内容回调\n * 处理流式消息内容的追加\n * @param msg - 消息内容\n */\n const contentCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n conversation.messages[msg.conversationId].loading = true\n // 追加消息内容\n messages[idx] = {\n ...messages[idx],\n msgFiles: messages[idx]?.msgFiles?.length ? messages[idx].msgFiles : msg.msgFiles,\n params: messages[idx]?.params || msg.params,\n quoteMsg: messages[idx]?.quoteMsg || msg.quoteMsg,\n type: msg.type,\n tempContent: '',\n msgContent: messages[idx].msgContent + (msg.msgContent || '')\n }\n }\n\n /**\n * WebSocket消息结束回调\n * 处理消息接收完成的状态更新\n * @param msg - 结束消息\n */\n const endCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n // 清除消息类型,标记为完成\n messages[idx] = {\n ...messages[idx],\n tempContent: '',\n type: undefined\n }\n conversation.messages[msg.conversationId].loading = false\n // 获取推荐问题\n getQuestionList(msg.conversationId, msg.id)\n }\n /**\n * WebSocket消息引用回调\n * 返回message里用到的引用来源\n * @param msg - 引用来源消息\n */\n const citationCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n conversation.messages[msg.conversationId].loading = true\n // 追加消息内容\n messages[idx] = {\n ...messages[idx],\n citations: msg.msgContent\n }\n }\n /**\n * WebSocket错误消息回调\n * 处理消息接收错误的状态更新\n * @param msg - 错误消息\n */\n const errCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n // 显示错误消息\n messages[idx] = {\n ...messages[idx],\n tempContent: msg.msgContent,\n type: undefined,\n // 报错后清空消息内容\n msgContent: ''\n }\n conversation.messages[msg.conversationId].loading = false\n }\n /**\n * 接收WebSocket消息的统一入口\n * 根据消息类型分发到不同的处理函数\n * @param newMessage - 新消息对象\n */\n const acceptMessage = async (newMessage: R<ConversationMessage>) => {\n const conversationId = newMessage.data.conversationId\n if (!conversation.messages[conversationId]?.message) return\n const canProceed = await config.hooks?.onBeforeAcceptMessage?.(newMessage.data)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n updateConversationTitle(conversationId, newMessage.data.conversationTitle)\n // console.log('接收消息:', newMessage.data.type)\n switch (newMessage.data.type) {\n case 'TEXT_MESSAGE_START':\n startCallback(newMessage.data)\n break\n case 'STEP_STARTED':\n stepCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_CONTENT':\n contentCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_END':\n endCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_CITATION':\n citationCallback(newMessage.data)\n break\n case 'RUN_ERROR':\n errCallback(newMessage.data)\n break\n default:\n break\n }\n config.hooks?.onAfterAcceptMessage?.(newMessage.data)\n }\n\n return {\n /** 全局配置对象 */\n config,\n /** 设置服务配置 */\n setServices,\n /** 设置文件预览 */\n setPreview,\n /** 设置布局配置 */\n setLayout,\n /** 设置生命周期钩子 */\n setHooks,\n /** 设置聊天参数 */\n setParams,\n /** 设置用户信息 */\n setUserInfo,\n /** 智能体性格状态 */\n character,\n /** 获取性格列表 */\n getCharacters,\n /** 打开性格选择面板 */\n openCharacterList,\n /** 关闭性格选择面板 */\n closeCharacterList,\n /** 切换性格 */\n switchCharacter,\n /** 接收者状态 */\n receiver,\n /** 设置接收者参数 */\n setReceiverParams,\n /** 历史会话状态 */\n conversations,\n /** 获取会话列表 */\n getConversations,\n /** 删除会话 */\n delConversation,\n /** 当前会话状态 */\n conversation,\n /** 设置说话人类型 */\n setSpeakHuman,\n /** 设置引用消息 */\n setReferences,\n /** 设置消息内容 */\n setContent,\n /** 设置内容参数,透传大模型后清空 */\n setContentParams,\n /** 设置文件列表 */\n setFileList,\n /** 设置头部展开状态 */\n setHeaderOpen,\n /** 消息反馈操作 */\n feedback,\n /** 切换智能体会话 */\n switchAgentConversation,\n /** 创建新会话 */\n createConversation,\n /** 切换会话 */\n switchConversation,\n /** 发送消息 */\n sendMessage,\n /** 取消接收 */\n cancelReceive,\n /** 接收消息 */\n acceptMessage\n }\n}\n","import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport { CloseOutlined, FileSearchOutlined } from '@ant-design/icons'\nimport { Prompts, XProvider } from '@ant-design/x'\nimport { downloadFile, FilePreview, MarkdownEditor, RenderWrapper, shouldRender, useDeepEffect, useWebSocket } from '@zero-library/common'\nimport { Button, Flex, Spin, Splitter, Tag } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { ChatSenderHandle } from '../../components/ChatSender'\nimport { createChatStore } from '../../stores'\nimport { ChatProvider } from '../../stores/Context'\nimport type { ChatLayout, FileTextType, FileUrlType } from '../../stores/types'\nimport BubbleListItems from '../common/BubbleListItems'\nimport ChatHeader from '../common/ChatHeader'\nimport ChatSender from '../common/ChatSender'\nimport ConversationListPanel from '../common/ConversationListPanel'\nimport styles from './styles.module.less'\nimport { ChatHandle, ChatProps } from './types'\n\n/**\n * 聊天组件\n * 使用 React.forwardRef 实现的聊天界面组件\n * 集成了消息收发、会话管理、文件预览等功能\n *\n * @example\n * // 基本使用\n * <Chat\n * config={{\n * receiverType: 3,\n * receiverId: 'agent-001'\n * }}\n * params={{\n * businessId: 'case-001',\n * businessType: 2\n * }}\n * />\n *\n * @example\n * <Chat\n * config={{\n * receiverType: 3,\n * receiverId: 'agent-001'\n * }}\n * params={{\n * businessId: 'case-001',\n * businessType: 2\n * }}\n * // 钩子配置\n * hooks={{\n * onBeforeSend: (message, files) => {\n * if (!message?.trim()) {\n * message.error('请输入消息内容')\n * return false\n * }\n * return true\n * },\n * onAfterSend: () => {\n * console.log('消息发送完成')\n * }\n * }}\n * // 布局配置\n * layout={{\n * preview: true,\n * sender: {\n * props: {\n * placeholder: '请输入您的问题...'\n * }\n * }\n * }}\n * // 服务配置\n * services={{\n * http: {\n * config: {\n * baseURL: '/api',\n * timeout: 30000\n * }\n * },\n * websocket: {\n * baseURLs: ['/api', '/api/backup']\n * }\n * }}\n * />\n *\n */\nexport default forwardRef<ChatHandle, ChatProps>(({ theme, params, userInfo, hooks, layout, config, services }: ChatProps, ref) => {\n /** 创建聊天状态管理器实例 */\n const chatStore = useMemo(() => createChatStore(), [])\n /** 输入框组件的引用 */\n const senderRef = useRef<ChatSenderHandle>()\n\n useEffect(() => {\n // console.log('hooks changed:', hooks)\n chatStore.setHooks(hooks)\n }, [hooks])\n\n useEffect(() => {\n chatStore.setUserInfo(userInfo)\n }, [userInfo])\n useEffect(() => {\n // console.log('layout changed:', layout)\n chatStore.setLayout(layout, config?.receiverType)\n }, [layout, config?.receiverType])\n useEffect(() => {\n // console.log('params changed:', params)\n chatStore.setParams(params)\n }, [params])\n\n useDeepEffect(() => {\n chatStore.setServices(services)\n }, [services])\n useDeepEffect(() => {\n if (config?.conversationId) {\n chatStore.switchConversation(config.conversationId)\n return\n }\n if (config?.receiverId && config?.receiverType === 3) {\n chatStore.switchAgentConversation(config.receiverId, config.conversationStrategy)\n }\n }, [config])\n\n /** 接收者状态的快照 */\n const receiverState = useSnapshot(chatStore.receiver)\n /** 配置状态的快照 */\n const configState = useSnapshot(chatStore.config)\n useImperativeHandle(\n ref,\n () => ({\n sendMessage: chatStore.sendMessage,\n switchAgentConversation: chatStore.switchAgentConversation,\n switchConversation: chatStore.switchConversation,\n createConversation: chatStore.createConversation,\n setReferences: chatStore.setReferences,\n setMessage: chatStore.setContent,\n setMessageParams: chatStore.setContentParams,\n setFiles: chatStore.setFileList,\n setServices: chatStore.setServices,\n setParams: chatStore.setParams,\n senderFocus: (options) => {\n senderRef.current?.focus(options)\n }\n }),\n []\n )\n const hasPreView = useMemo(() => {\n return (\n shouldRender(configState.layout.preview as ChatLayout['preview']) &&\n (!!(configState.preview.file as FileUrlType).fileUrl || !!(configState.preview.file as FileTextType).content)\n )\n }, [configState.layout.preview, configState.preview.file])\n\n /** 分割面板尺寸状态 */\n const [sizes, setSizes] = useState([0, '100%'])\n /** 设置分割面板尺寸 */\n const setSplitterSizes = (sizes: (number | string)[]) => {\n setSizes(sizes)\n }\n useEffect(() => {\n if (hasPreView) {\n setSplitterSizes(['70%', '30%'])\n } else {\n setSplitterSizes([0, '100%'])\n }\n }, [hasPreView])\n // const [a, setA] = useState([\n // getWebSocketUrl(`/api/lolr/conversation/ws/subscribe?NS-TOKEN=${tokenManager.get()}&a=2`, isLocalhost() ? '192.168.6.23' : ''),\n // getWebSocketUrl(`/api/lolr/conversation/ws/subscribe?NS-TOKEN=${tokenManager.get()}`, isLocalhost() ? '192.168.6.23' : '')\n // ])\n /** 主 WebSocket 连接,用于接收实时消息 */\n useWebSocket({\n url: configState.services.websocketUrls?.[0],\n onMessage: chatStore.acceptMessage,\n clientHeartbeat: false,\n reconnectInterval: 10000\n })\n /** 备用 WebSocket 连接,提供一体机saas可用性 */\n useWebSocket({\n url: configState.services.websocketUrls?.[1],\n onMessage: chatStore.acceptMessage,\n clientHeartbeat: false,\n reconnectInterval: 10000\n })\n\n // 测试代码:将数据转为流返回(已注释)\n // function streamData(data: string, callback: (chunk: string, completed: boolean) => void): () => void {\n // let index = 0\n // const interval = setInterval(() => {\n // if (index < data.length) {\n // const chunk = data.slice(index, index + 10)\n // index += 10\n // callback(chunk, index >= data.length)\n // } else {\n // clearInterval(interval)\n // }\n // }, 50)\n\n // // 返回取消函数\n // return () => {\n // clearInterval(interval)\n // }\n // }\n useEffect(() => {\n configState.hooks?.onBeforeInit?.()\n // setTimeout(() => {\n // setA([a[0]])\n // }, 10000)\n // const data = `\\n<think>\\n\\n您的问题是“帮我调出这些主要证据证人原始资料”,我理解您是想问:如何调取本案中主要证据和证人的原始资料?请稍候,我将围绕您的问题检索相关信息……\\n\\n</think>\\n\\n\\n根据您提出的请求,现将本案中**与罗先进相关的主要证据和证人原始资料**进行整理,并按照**案卷引用格式**提供查阅方式。\\n\\n---\\n\\n## 一、**主要证据原始资料**\\n\\n### 1. **罗先进借他人名义持有、买卖股票的事实**\\n- **文件名称**:第29卷.pdf \\n- **内容概述**:记载了罗先进通过他人名义持有、买卖股票,并从中获利的情况,可能被用于推断其存在利益输送行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:1,fileName:第29卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=7521087687252336&sid=25504562-d00e-479e-9a38-f02c86daded1'}:::\\n\\n---\\n\\n### 2. **银行流水及资金往来记录**\\n- **文件名称**:第34卷.pdf、第36卷.pdf \\n- **内容概述**:涉及多人的银行流水,可能与罗先进存在资金往来,用于推断其异常交易行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:2,fileName:第34卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=6865514974920901&sid=2bd6b02f-5431-464b-9b78-592812eeb1fa'}:::\\n[引]:::alert type=indexQuote data={index:3,fileName:第36卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=7138173847859108&sid=e19f6aa1-a476-48bb-a593-f9a6ed99a274'}:::\\n\\n---\\n\\n## 二、**主要证人原始资料**\\n\\n### 1. **景晓军**\\n- **文件名称**:第29卷.pdf \\n- **内容概述**:作为罗先进股份转让协议的相对方,其证言可能被用于证明罗先进存在借他人名义持有股票的行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:4,fileName:第29卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=7521087687252336&sid=25504562-d00e-479e-9a38-f02c86daded1'}:::\\n\\n---\\n\\n### 2. **何娟娟、邓翠娥等涉案人员**\\n- **文件名称**:第34卷.pdf \\n- **内容概述**:涉及多人银行流水,可能与罗先进存在资金往来,其证言可能被用于证明异常交易行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:5,fileName:第34卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=6865514974920901&sid=2bd6b02f-5431-464b-9b78-592812eeb1fa'}:::\\n\\n---\\n\\n## 三、**查阅方式说明**\\n\\n您可通过以下链接访问上述原始资料:\\n\\n- **第29卷.pdf**:[点击查看](type=2&datasetId=1992895846377267200&docId=7521087687252336&sid=25504562-d00e-479e-9a38-f02c86daded1)\\n- **第34卷.pdf**:[点击查看](type=2&datasetId=1992895846377267200&docId=6865514974920901&sid=2bd6b02f-5431-464b-9b78-592812eeb1fa)\\n- **第36卷.pdf**:[点击查看](type=2&datasetId=1992895846377267200&docId=7138173847859108&sid=e19f6aa1-a476-48bb-a593-f9a6ed99a274)\\n\\n---\\n\\n## 四、**建议**\\n\\n如需进一步分析上述证据或证人证言对案件的影响,可继续提供相关材料或提出具体问题。我们将根据案件进展,协助您制定更精准的辩护策略。\"`\n // setTimeout(() => {\n // chatStore.acceptMessage({\n // code: 200,\n // data: {\n // msgContent: '',\n // id: '22222',\n // sendTime: new Date().getTime(),\n // conversationId: '143',\n // type: 'TEXT_MESSAGE_START',\n // sender: { type: 3, id: '1' }\n // }\n // })\n // // 流式返回\n // streamData(data, (chunk, completed) => {\n // chatStore.acceptMessage({\n // code: 200,\n // data: {\n // msgContent: chunk,\n // id: '22222',\n // sendTime: new Date().getTime(),\n // conversationId: '143',\n // type: 'TEXT_MESSAGE_CONTENT',\n // sender: { type: 3, id: '1' }\n // }\n // })\n // if (completed) {\n // chatStore.acceptMessage({\n // code: 200,\n // data: {\n // msgContent: '',\n // id: '22222',\n // sendTime: new Date().getTime(),\n // conversationId: '143',\n // type: 'TEXT_MESSAGE_END',\n // sender: { type: 3, id: '1' }\n // }\n // })\n // }\n // })\n // }, 10000)\n }, [])\n return (\n <XProvider theme={{ cssVar: true, ...theme }}>\n <ChatProvider store={chatStore}>\n <Spin spinning={receiverState.loading} wrapperClassName=\"full-spin\">\n <Flex vertical className={classNames(styles.nsChatLayout, 'zero-chat-layout', 'height-full')}>\n {/** 全局头部区域 */}\n <RenderWrapper control={configState.layout.globalHeader} DefaultComponent={ChatHeader} />\n <Flex className=\"full-scroll\">\n {/** 左侧面板区域 */}\n <RenderWrapper control={configState.layout.leftPanel} />\n\n {/** 会话列表面板 */}\n <RenderWrapper control={configState.layout.conversationList} DefaultComponent={ConversationListPanel} />\n <Splitter className=\"flex-1\" onResize={setSplitterSizes}>\n {/** 文件预览面板 */}\n <Splitter.Panel collapsible={false} min={600} size={sizes[0]}>\n {hasPreView && (\n <>\n {/** 文件URL预览 */}\n {(configState.preview.file as FileUrlType).fileUrl && (\n <Flex vertical className=\"height-full\">\n <Flex justify=\"space-between\" align=\"center\" gap={16} className={styles.nsPreviewHeader}>\n <div className={classNames(styles.nsPreviewHeaderTitle, 'text-ellipsis')} title={configState.preview.file.fileName}>\n {configState.preview.file.fileName}\n </div>\n <Flex gap={8} justify=\"center\" align=\"center\">\n <Button\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => downloadFile((configState.preview.file as FileUrlType).fileUrl, configState.preview.file.fileName)}\n >\n 下载\n </Button>\n <Button onClick={() => chatStore.setPreview()}>关闭</Button>\n </Flex>\n </Flex>\n <div className=\"full-scroll\">\n <FilePreview\n {...(configState.preview.file as FileUrlType)}\n pdfParams={{\n isHasThumbnails: false\n }}\n />\n </div>\n </Flex>\n )}\n {/** 文本内容预览 */}\n {(configState.preview.file as FileTextType).content && (\n <MarkdownEditor\n value={(configState.preview.file as FileTextType).content}\n // onChange={(con) => chatStore.setPreview({ ...configState.preview.file, content: con }, true)}\n onQuote={(text) => {\n chatStore.setReferences({\n type: 2,\n content: {\n name: text\n },\n params: {\n citation: text\n }\n })\n }}\n onDownloadFile={(content, type) =>\n configState.services.request.fileCreate(content, configState.preview.file.fileName, type)\n }\n extraNav={\n <>\n <Tag bordered={false} color=\"default\" className=\"cursor-pointer\" onClick={() => chatStore.setPreview()}>\n <CloseOutlined />\n </Tag>\n </>\n // loading && (\n // <Tag bordered={false} color=\"default\">\n // <Flex gap={4} align=\"center\">\n // <SyncOutlined spin style={{ color: 'var(--ant-color-primary)' }} />\n // 保存中\n // </Flex>\n // </Tag>\n // )\n }\n />\n )}\n </>\n )}\n </Splitter.Panel>\n\n {/** 聊天主体面板 */}\n <Splitter.Panel collapsible={false} max={800} min={400} size={sizes[1]}>\n <Flex vertical className={classNames('height-full')}>\n {/** 聊天区域头部 */}\n <RenderWrapper control={configState.layout.chatHeader} DefaultComponent={ChatHeader} />\n <Flex vertical className={classNames('full-scroll')}>\n <Flex\n justify=\"center\"\n vertical\n gap={24}\n className={classNames('height-full', styles.nsChatBody, 'zero-chat-body', styles.nsBodyWidth)}\n >\n {/** 消息列表区域 */}\n {shouldRender(configState.layout.messageList) && (\n <div className=\"full-scroll\">\n <RenderWrapper control={configState.layout.messageList as ChatLayout['messageList']} DefaultComponent={BubbleListItems} />\n </div>\n )}\n <Flex vertical gap={8}>\n {/** 输入框上方头部 */}\n <RenderWrapper\n control={configState.layout.senderHeader as ChatLayout['senderHeader']}\n DefaultComponent={<div className={styles.nsChatSenderHeader}>我是 {receiverState.active.name}</div>}\n />\n {/** 输入框组件 */}\n <RenderWrapper ref={senderRef} control={configState.layout.sender} DefaultComponent={ChatSender} />\n {/** 免责声明 */}\n <RenderWrapper\n control={configState.layout.disclaimerNotice as ChatLayout['disclaimerNotice']}\n DefaultComponent={<div className={styles.nsDisclaimerNotice}>内容由AI生成,仅供参考,请仔细甄别</div>}\n />\n {/** 输入框下方区域推荐问题 */}\n <RenderWrapper\n control={configState.layout.recommendQuestions as ChatLayout['recommendQuestions']}\n DefaultComponent={\n receiverState?.recommendQuestions?.length > 0 && (\n <Prompts\n vertical\n title=\"推荐问题:\"\n onItemClick={({ data }) => chatStore.sendMessage(data.key)}\n items={receiverState?.recommendQuestions.map((question) => ({\n key: question,\n icon: <FileSearchOutlined />,\n description: question\n }))}\n />\n )\n }\n />\n </Flex>\n {/** 输入框底部区域 */}\n <RenderWrapper control={configState.layout.senderFooter} />\n </Flex>\n </Flex>\n </Flex>\n </Splitter.Panel>\n </Splitter>\n </Flex>\n </Flex>\n </Spin>\n </ChatProvider>\n </XProvider>\n )\n})\n","export const customComponents = {\n appCard: () => import('./AppCard'),\n fileView: () => import('./FileView'),\n indexQuote: () => import('./IndexQuote'),\n mdEdit: () => import('./MdEdit'),\n fileEdit: () => import('./FileEdit'),\n // quoteList: () => import('./QuoteList'),\n think: () => import('./Think'),\n charts: () => import('./Charts')\n}\n","@keyframes loading-line {\n from {\n background-position: 200% 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.loadingMessage {\n position: relative;\n padding-bottom: 6px;\n}\n.loadingMessage::after {\n content: '';\n position: absolute;\n left: 0;\n bottom: 0;\n height: 2px;\n width: 100%;\n background: linear-gradient(90deg, #ff6b23, #af3cb8, #53b6ff);\n background-size: 200% 100%;\n animation: loading-line 1.2s linear infinite;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-text {\n display: none;\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-circle {\n animation: spin 2s linear infinite;\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content {\n gap: 4px;\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc {\n width: 15px;\n height: 15px;\n border: 2px solid transparent;\n border-color: #1890ff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n box-sizing: border-box;\n position: relative;\n clip-path: inset(0 0 30% 0);\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc .ant-attachment-list-card-ellipsis-prefix {\n display: none;\n}\n.chatSender:global.ant-sender:focus-within {\n box-shadow: none;\n}\n.chatQuoteMsg {\n margin-top: 4px;\n}\n.chatQuoteMsg:global.ant-bubble > .ant-bubble-content {\n min-height: auto;\n background-color: var(--ant-color-fill-tertiary) !important;\n color: var(--ant-color-text-tertiary);\n}\n.chatQuoteMsg .quoteTooltip {\n max-width: 100%;\n border: 1px solid #000;\n}\n.chatQuoteMsg .quoteTooltip .quoteTooltipContainer {\n max-height: 200px;\n overflow-y: auto;\n background-color: #fff;\n color: #000;\n}\n","import { Attachments, Bubble, BubbleProps } from '@ant-design/x'\nimport { isEmptyObj, markdownToText, RenderMarkdown } from '@zero-library/common'\nimport { Flex, Spin, Tooltip, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { replaceMarkdownTags } from '../core/utils'\nimport { ConversationMessage, InputFile } from '../services'\nimport { ChatLayoutMessageList } from '../stores/types'\nimport { customComponents } from '../ui/common/markdownAlert'\nimport styles from './styles.module.less'\n/**\n * MessageRender 组件属性接口\n */\nexport interface MessageRenderProps {\n /** 消息对象 */\n message: ConversationMessage\n /** 消息气泡位置 */\n placement: BubbleProps['placement']\n /** 文件预览回调 非图片类型文件点击预览 */\n onFilePreview?: (file: InputFile) => void\n /** message自定义标记渲染组件 */\n customComponents?: ChatLayoutMessageList['customComponents']\n}\n\n/**\n * 消息渲染组件\n * 用于渲染聊天消息内容,包括文本、文件附件和引用消息\n */\nexport default ({ message, placement, onFilePreview, customComponents: propsCustomComponents }: MessageRenderProps) => {\n const msgContent = useMemo(\n () => `${message.msgContent || ''}${message.msgContent && message.tempContent ? '\\n\\n' : ''}${message.tempContent || ''}`,\n [message.msgContent, message.tempContent]\n )\n const quoteMsg = useMemo(() => {\n const quoteMsg = {} as { msgFiles?: InputFile[]; msgContent?: string; msgContentText?: string }\n if (message.quoteMsg?.id) {\n if (message.quoteMsg.msgContent) {\n quoteMsg.msgContent = message.quoteMsg.msgContent\n }\n if (message.quoteMsg.msgFiles?.length) {\n quoteMsg.msgFiles = message.quoteMsg.msgFiles\n }\n } else if (message.params) {\n try {\n const citation = JSON.parse(message.params).citation\n if (citation) {\n quoteMsg.msgContent = citation\n }\n } catch (e) {}\n }\n if (quoteMsg.msgContent) {\n quoteMsg.msgContentText = markdownToText(quoteMsg.msgContent)\n }\n return isEmptyObj(quoteMsg) ? null : quoteMsg\n }, [message.params, message.quoteMsg])\n // 文件预览\n const filePreview = (file: InputFile) => {\n if (file.content && !['image'].includes(file.type)) {\n onFilePreview?.(file)\n }\n }\n\n const mergedCustomComponents = useMemo(() => {\n return { ...customComponents, ...propsCustomComponents }\n }, [propsCustomComponents])\n\n return (\n <Flex vertical>\n {!(msgContent || message.msgFiles.length) ? (\n <Typography>\n <Spin size={'small'} />\n </Typography>\n ) : (\n <>\n {msgContent && (\n <Bubble\n placement={placement}\n className={classNames({ [styles.loadingMessage]: message.type })}\n content={<RenderMarkdown content={replaceMarkdownTags(msgContent)} customComponents={mergedCustomComponents} message={message} />}\n />\n )}\n {message.msgFiles?.map((file) => (\n <Bubble\n className=\"m-t-8\"\n key={file.content}\n variant=\"borderless\"\n placement={placement}\n content={\n <div className=\"cursor-pointer\" onClick={() => filePreview(file)}>\n <Attachments.FileCard\n // imageProps={{ preview: false }}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n </div>\n }\n />\n ))}\n {quoteMsg && (\n <Bubble\n className={styles.chatQuoteMsg}\n placement={placement}\n content={\n <Flex vertical gap={8}>\n {quoteMsg.msgContent && (\n <Tooltip\n arrow={false}\n classNames={{\n root: styles.quoteTooltip,\n body: `${styles.quoteTooltipContainer} scroll-fade-in`\n }}\n title={<RenderMarkdown content={quoteMsg.msgContent} />}\n getPopupContainer={(node) => node}\n >\n <Flex>\n <span>【引用消息】:</span>\n <Flex flex={1} className=\"text-ellipsis-2\">\n {quoteMsg.msgContentText}\n </Flex>\n </Flex>\n </Tooltip>\n )}\n {quoteMsg?.msgFiles && (\n <Flex>\n <span>【引用文件】:</span>\n <Flex gap={8} wrap flex={1}>\n {quoteMsg.msgFiles.map((file) => (\n <div key={file.content} className=\"cursor-pointer\" onClick={() => filePreview(file)}>\n <Attachments.FileCard\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n </div>\n ))}\n </Flex>\n </Flex>\n )}\n </Flex>\n }\n />\n )}\n </>\n )}\n </Flex>\n )\n}\n","import { CopyOutlined, DislikeOutlined, LikeOutlined, OpenAIOutlined } from '@ant-design/icons'\nimport { Bubble, BubbleProps, Prompts } from '@ant-design/x'\nimport { BubbleDataType } from '@ant-design/x/es/bubble/BubbleList'\nimport { copyText, htmlToMarkdown, isBoolean, RenderWrapper, shouldRender, UserAvatar } from '@zero-library/common'\nimport { Button, Flex, GetRef } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useSnapshot } from 'valtio'\nimport MessageRender from '../../components/MessageRender'\nimport { ConversationMemberEnum } from '../../core/constants'\nimport { ConversationMessage, MessageSender } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutMessageList, MessageBoxType } from '../../stores/types'\nimport styles from './styles.module.less'\nimport WelcomeItem from './WelcomeItem'\n\ninterface RoleContent {\n id: string\n user: ConversationMemberEnum\n placement: BubbleProps['placement']\n avatar?: any\n}\n\n/* 🌟 消息列表 */\nexport default ({\n firstMessages = [],\n welcomeMessage = true,\n avatar = { user: false, agent: true, other: true },\n agentActions = false,\n customComponents = {}\n}: ChatLayoutMessageList) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n const conversationRoles = useMemo(() => {\n const roles = {} as Record<ConversationMemberEnum, RoleContent>\n if (conversationState.active.member.user) {\n roles.user = {\n id: conversationState.active.member.user.memberId,\n user: 'user',\n placement: 'end',\n avatar: (isBoolean(avatar) ? avatar : avatar?.user) ? (\n <UserAvatar\n size={30}\n avatarSrc={conversationState.active.member.user?.memberAvatar}\n userName={conversationState.active.member.user?.memberName}\n />\n ) : null\n }\n }\n if (conversationState.active.member.agent) {\n roles.agent = {\n id: conversationState.active.member.agent.memberId,\n user: 'agent',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.agent)\n ? { src: conversationState.active.member.agent?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n if (conversationState.active.member.other) {\n roles.other = {\n id: conversationState.active.member.other.memberId,\n user: 'other',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.other)\n ? { src: conversationState.active.member.other?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n return roles\n }, [conversationState.active.member, avatar])\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const welcomeMessageRecord = useMemo(() => {\n const isExist = shouldRender(welcomeMessage)\n return isExist\n ? [\n {\n key: 'placeholder',\n content: <RenderWrapper control={welcomeMessage} DefaultComponent={<WelcomeItem />} />,\n variant: 'borderless'\n } as BubbleDataType\n ]\n : []\n }, [receiverState.active, welcomeMessage])\n\n const questionList = useMemo(\n () =>\n chatMessage?.questionList?.length\n ? [\n {\n key: 'questionList',\n content: (\n <Prompts\n className=\"m-b-16\"\n styles={{\n list: {\n overflow: 'auto'\n }\n }}\n vertical\n items={chatMessage?.questionList.map((question) => ({\n key: question,\n description: <span onClick={() => chatStore.sendMessage(question)}>{question}</span>\n }))}\n />\n ),\n variant: 'borderless',\n avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : [],\n [chatMessage?.questionList]\n )\n const getRole = (sender: MessageSender) => {\n const roleKey = Object.keys(conversationRoles).find((key) => conversationRoles[key].id === sender.id)\n return conversationRoles[roleKey] || ({} as RoleContent)\n }\n const messageRefs = useRef<ObjectType<HTMLDivElement>>({})\n const chatRecords = useMemo(() => {\n return (chatMessage?.message || []).map((message, index) => {\n // let isHasTime = false\n // if (index === 0) {\n // isHasTime = true\n // } else {\n // const lastMessage = chatMessage.message[index - 1]\n // // if((lastMessage.sendDate - message.sendDate) > 60 * 60 * 1000)\n // }\n const role = getRole(message.sender)\n return {\n key: message.id,\n placement: role.placement,\n variant: 'borderless',\n avatar: role.avatar,\n content: (\n <div\n ref={(el) => {\n messageRefs.current[message.id] = el\n }}\n >\n <MessageRender\n message={message as ConversationMessage}\n placement={role.placement}\n customComponents={customComponents}\n onFilePreview={(file) =>\n chatStore.setPreview({\n fileUrl: file.content,\n suffix: file.extension,\n fileName: file.name\n })\n }\n />\n </div>\n ),\n footer: (\n <Flex>\n {/* {conversationRoles.other && role.user !== 'agent' && (\n <Button\n onClick={() =>\n chatStore.setReferences({\n type: 3,\n content: {\n id: message.id,\n // 内容需要增加其它参数渲染,比如citations\n msgContent: message.msgContent,\n msgFiles: message.msgFiles as InputFile[]\n }\n })\n }\n color=\"default\"\n variant=\"text\"\n size=\"small\"\n icon={<SignatureOutlined />}\n />\n )} */}\n {/* 智能体功能 */}\n {role.user === 'agent' && (\n <>\n <Button\n onClick={() => {\n const container = messageRefs.current[message.id]\n if (!container) return\n const markdown = htmlToMarkdown(container?.innerHTML) || message.msgContent\n copyText(markdown)\n }}\n color=\"default\"\n variant=\"text\"\n size=\"small\"\n icon={<CopyOutlined />}\n />\n <Button\n color={message.msgFeedback === 1 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<LikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 1, index)}\n />\n <Button\n color={message.msgFeedback === 2 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<DislikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 2, index)}\n />\n <RenderWrapper\n control={agentActions}\n ctx={{\n message,\n get dom() {\n return messageRefs.current[message.id]\n }\n }}\n />\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ShareAltOutlined />} /> */}\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ReloadOutlined />} /> */}\n </>\n )}\n </Flex>\n )\n // ...(isHasTime\n // ? { rootClassName: styles.hasSendTime, classNames: { header: styles.sendTime }, header: <span>{formatDate(message.sendDate)}</span> }\n // : {})\n } as BubbleDataType\n })\n }, [chatMessage?.message])\n\n const firstMessagesRecord = useMemo(() => {\n return (firstMessages || []).map((firstMessage, index) => {\n const { member, ...args } = firstMessage\n return {\n key: `firstMessage-${index}`,\n placement: conversationRoles[member]?.placement,\n avatar: conversationRoles[member]?.avatar,\n // avatar: { style: { visibility: 'hidden' } }\n variant: 'borderless',\n ...args\n } as BubbleDataType\n })\n }, [firstMessages])\n const bubbleListItems = useMemo(() => {\n const list = []\n list.push(...firstMessagesRecord)\n list.push(...chatRecords, ...questionList)\n if (list.length) {\n return list\n }\n return [...welcomeMessageRecord]\n }, [chatRecords, questionList, welcomeMessageRecord, firstMessagesRecord])\n\n const listRef = useRef<GetRef<typeof Bubble.List>>(null)\n // 真实控制是否自动滚动的 ref(不会触发渲染)\n const autoScrollRef = useRef(true)\n const handleScroll = (el: any) => {\n const target = el.target\n // console.log('handleScroll', target.scrollHeight - target.scrollTop - target.clientHeight)\n const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight\n // 小于 150px 表示接近底部,允许自动滚动\n autoScrollRef.current = distanceToBottom < 150\n }\n useEffect(() => {\n // console.log('bubbleListItems2')\n autoScrollRef.current = true\n }, [bubbleListItems.length])\n useEffect(() => {\n const el = listRef.current?.nativeElement\n if (!el || !bubbleListItems.length) return\n // console.log('bubbleListItems', bubbleListItems, autoScrollRef.current)\n // 只有当用户在底部(autoScroll = true)时,才滚动到底\n if (autoScrollRef.current) {\n setTimeout(() => {\n if (autoScrollRef.current) {\n listRef.current?.scrollTo({\n key: bubbleListItems[bubbleListItems.length - 1].key,\n block: 'end'\n })\n }\n }, 100)\n }\n }, [bubbleListItems])\n return (\n <Bubble.List\n autoScroll={false}\n key={conversationState.active.id}\n ref={listRef}\n items={bubbleListItems}\n className={classNames(styles.nsBubbleList, 'height-full', 'scroll-fade-in', 'zero-chat-bubbles')}\n onScroll={handleScroll}\n />\n )\n}\n",".nsConversationListPanel {\n width: 360px;\n}\n.nsConversations {\n padding: 0 24px;\n}\n.nsConversations :global .ant-conversations-group-title {\n padding: 0;\n}\n.nsConversations :global .ant-conversations-group-title .ant-typography {\n color: #878aab;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item {\n padding-left: 16px;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item .ant-conversations-label {\n color: rgba(0, 0, 0, 0.88);\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item.ant-conversations-item-active .ant-conversations-label {\n color: var(--ant-color-primary);\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-start .ant-bubble-content-filled {\n background-color: transparent;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-end .ant-bubble-content-filled {\n background-color: var(--ant-color-primary-bg);\n}\n.nsChatHeader {\n padding: 8px 16px;\n border-bottom: 1px solid #eee;\n}\n.nsChatHeader .nsChatTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatHeader .nsChatHeaderPopover {\n max-height: 500px;\n width: 300px;\n display: flex;\n flex-direction: column;\n}\n.nsChatHeader .nsChatHeaderPopover :global .ant-popover-inner-content {\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n.chatWelcomeWrap :global .ant-prompts .ant-prompts-list {\n overflow: auto;\n}\n.chatWelcomeWrap .chatWelcome :global .ant-welcome-icon > img {\n border-radius: 10px;\n max-width: initial;\n}\n.chatWelcomeWrap .chatWelcomePrompts {\n width: 300px;\n}\n.nsSenderListTitle {\n width: 300px;\n}\n.nsSenderList :global .ant-list-items {\n max-height: 350px;\n overflow-y: auto;\n margin-right: -12px;\n padding-right: 12px;\n}\n.nsSenderList.historyList :global .ant-list-items {\n max-height: initial;\n}\n.nsSenderList .nsSenderListItem {\n background-color: #f6f6f6;\n color: #6b6b6b !important;\n border-radius: 5px;\n width: 300px;\n padding: 6px 12px !important;\n margin-top: 12px;\n font-size: 14px;\n cursor: pointer;\n}\n.nsSenderList .nsSenderListFooter {\n font-size: 12px;\n}\n.nsChatUserName {\n font-size: 16px;\n font-weight: bold;\n}\n.nsSenderReferenceHeaderTitle:global > .ant-sender-header-title {\n overflow: hidden;\n}\n.nsSenderReferenceHeaderContent {\n padding: 0 !important;\n}\n.nsAvatarListContainer {\n height: 300px;\n padding: 30px 48px 30px 24px;\n overflow-y: auto;\n margin-right: -24px;\n}\n.nsAvatarListContainer .nsAvatarList .nsAvatarListItem:hover {\n opacity: 90%;\n}\n.nsAvatarListContainer .nsAvatarList .nsAvatarListItem .nsAvatarListItemIcon.nsAvatarListItemIconActive {\n outline: 2px solid var(--ant-color-primary);\n}\n.nsAvatarListContainer .nsAvatarList .nsAvatarListItem .nsAvatarListItemName {\n font-size: 12px;\n}\n","import { Prompts, Welcome } from '@ant-design/x'\nimport { RenderWrapper } from '@zero-library/common'\nimport { Avatar, Space } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutWelcomeMessage } from '../../stores/types'\nimport styles from './styles.module.less'\n\nexport default ({ icon = true, title = true, description = true, prompts = true }: ChatLayoutWelcomeMessage) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n return (\n <Space direction=\"vertical\" size={16} className={styles.chatWelcomeWrap}>\n <Welcome\n className={classNames(styles.chatWelcome, 'p-t-32')}\n variant=\"borderless\"\n icon={<RenderWrapper control={icon} DefaultComponent={<Avatar shape=\"square\" size={58} src={receiverState.active.logo} />} />}\n title={<RenderWrapper control={title} DefaultComponent={`你好,我是${receiverState.active.name || ''}`} />}\n description={\n <RenderWrapper\n control={description}\n DefaultComponent={<div dangerouslySetInnerHTML={{ __html: receiverState.active.description || '' }}></div>}\n />\n }\n />\n\n <RenderWrapper\n control={prompts}\n DefaultComponent={\n receiverState?.recommendQuestions?.length > 0 && (\n <Prompts\n className=\"m-t-16\"\n wrap\n onItemClick={({ data }) => chatStore.sendMessage(data.key)}\n items={[\n {\n key: '1',\n label: '🤔 推荐问题:',\n children: receiverState?.recommendQuestions.map((question) => ({\n key: question,\n description: <span className={classNames(styles.chatWelcomePrompts, 'text-ellipsis')}>{question}</span>\n }))\n }\n ]}\n />\n )\n }\n />\n </Space>\n )\n}\n","import { CloseOutlined, CommentOutlined, PlusOutlined } from '@ant-design/icons'\nimport { RenderWrapper } from '@zero-library/common'\nimport { Avatar, Button, Flex, Popover, Space } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutHeader } from '../../stores/types'\nimport AgentCharacter from './AgentCharacter'\nimport ConversationList from './ConversationList'\nimport styles from './styles.module.less'\n\nexport default ({\n title = true,\n avatar = true,\n closeBtn = false,\n newConversationBtn = true,\n agentCharacter = true,\n conversationListBtn = true\n}: ChatLayoutHeader) => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const configState = useSnapshot(chatStore.config)\n return (\n <>\n <Flex justify=\"space-between\" align=\"center\" className={classNames(styles.nsChatHeader, 'zero-chat-header')}>\n <Flex gap={4} align=\"center\">\n <RenderWrapper control={avatar} DefaultComponent={<Avatar size={22} src={receiverState.active.logo} alt={receiverState.active.name} />} />\n <RenderWrapper control={title} DefaultComponent={<div className={styles.nsChatTitle}>{receiverState.active.name}</div>} />{' '}\n </Flex>\n <Space size={2}>\n <RenderWrapper control={agentCharacter} DefaultComponent={AgentCharacter} />\n <RenderWrapper\n control={newConversationBtn}\n DefaultComponent={\n <Button title=\"新建会话\" type=\"text\" size=\"large\" icon={<PlusOutlined />} onClick={() => chatStore.createConversation()} />\n }\n />\n\n <RenderWrapper\n control={conversationListBtn}\n DefaultComponent={\n <Popover\n getPopupContainer={(e) => e}\n placement=\"bottom\"\n classNames={{ body: styles.nsChatHeaderPopover }}\n content={<ConversationList />}\n trigger={['click']}\n >\n <Button title=\"历史会话\" type=\"text\" size=\"large\" icon={<CommentOutlined />} />\n </Popover>\n }\n />\n\n <RenderWrapper\n control={closeBtn}\n DefaultComponent={<Button title=\"关闭\" type=\"text\" size=\"large\" onClick={configState.hooks?.onHeaderClose} icon={<CloseOutlined />} />}\n />\n </Space>\n </Flex>\n </>\n )\n}\n","import { Avatar } from 'antd'\nimport { useEffect } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport CharacterList from './CharacterList'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const characterState = useSnapshot(chatStore.character)\n useEffect(() => {\n if (receiverState.active.id && receiverState.active.type === 3) {\n chatStore.getCharacters(receiverState.active.id)\n }\n }, [receiverState.active.id])\n\n return (\n characterState.active?.id && (\n <>\n <div title=\"性格\">\n <Avatar onClick={chatStore.openCharacterList} className=\"cursor-pointer\" src={characterState.active.logo} />\n </div>\n {characterState.open && <CharacterList />}\n </>\n )\n )\n}\n","import { Avatar, Col, Flex, Modal, Row } from 'antd'\nimport classNames from 'classnames'\nimport { useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const characterState = useSnapshot(chatStore.character)\n const [activeCharacter, setActiveCharacter] = useState(characterState.active)\n return (\n <Modal\n width={500}\n title=\"选择性格\"\n maskClosable={false}\n open={characterState.open}\n onCancel={chatStore.closeCharacterList}\n loading={characterState.loading}\n okText=\"切换性格\"\n onOk={() => chatStore.switchCharacter(activeCharacter)}\n confirmLoading={characterState.switchLoading}\n >\n <div className={styles.nsAvatarListContainer}>\n <Row wrap gutter={[16, 32]} className={styles.nsAvatarList}>\n {characterState.list.map((item) => (\n <Col span={6} key={item.id}>\n <Flex vertical align=\"center\" className={styles.nsAvatarListItem} onClick={() => setActiveCharacter(item)}>\n <Avatar\n className={classNames(styles.nsAvatarListItemIcon, 'cursor-pointer', {\n [styles.nsAvatarListItemIconActive]: activeCharacter.id === item.id\n })}\n size={50}\n // onClick={openCharacterList}\n src={<img src={item.logo} alt=\"头像\" />}\n />\n <div className={styles.nsAvatarListItemName}>{item.characterName}</div>\n </Flex>\n </Col>\n ))}\n {/* <Col span={6}>\n <Flex vertical align=\"center\" className={styles.nsAvatarListItem} onClick={() => onOpenUpdateCharacter(1)}>\n <PlusCircleFilled className={classNames(styles.nsAvatarListItemIcon, 'cursor-pointer')} style={{ fontSize: 50, color: '#eee' }} />\n <div className={styles.nsAvatarListItemName}>自定义</div>\n </Flex>\n </Col> */}\n </Row>\n </div>\n </Modal>\n )\n}\n","import { DeleteOutlined, RedoOutlined } from '@ant-design/icons'\nimport { Conversations } from '@ant-design/x'\nimport type { Conversation } from '@ant-design/x/es/conversations/interface'\nimport { useDebounce } from '@zero-library/common'\nimport { Empty, Spin } from 'antd'\nimport { useEffect, useMemo } from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationsState = useSnapshot(chatStore.conversations)\n const conversationState = useSnapshot(chatStore.conversation)\n\n const getConversations = useDebounce(() => {\n chatStore.getConversations(receiverState.active.id, 3)\n }, 300)\n\n useEffect(() => {\n if (receiverState.active.id) {\n getConversations()\n }\n }, [receiverState.active.id, conversationsState.updateIndex])\n\n const conversationList = useMemo(() => {\n return conversationsState.list.items.filter((item) => item.label)\n }, [conversationsState.list.items])\n return (\n <>\n <div className=\"height-full scroll-fade-in\" id=\"scrollableDiv\">\n {conversationList.length ? (\n <InfiniteScroll\n dataLength={conversationList.length}\n next={() => {\n console.log('next')\n // chatStore.getConversations(receiverState.active.id, conversationsState.list.lastId)\n }}\n hasMore={false}\n loader={\n <div className=\"text-center\">\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n }\n style={{ overflow: 'hidden' }}\n scrollableTarget=\"scrollableDiv\" // 👈 指定滚动容器\n >\n <Conversations\n className={styles.nsConversations}\n items={conversationList as Conversation[]}\n activeKey={conversationState.active.id}\n onActiveChange={async (id) => chatStore.switchConversation(id)}\n groupable\n menu={(conversation) => ({\n items: [\n {\n label: '删除会话',\n key: 'delete',\n icon: <DeleteOutlined />,\n danger: true\n }\n ],\n onClick: (menuInfo) => {\n menuInfo.domEvent.stopPropagation()\n if (menuInfo.key === 'delete') {\n chatStore.delConversation(conversation.id)\n }\n }\n })}\n />\n </InfiniteScroll>\n ) : (\n <Empty description=\"暂无会话记录\" image={Empty.PRESENTED_IMAGE_SIMPLE} />\n )}\n </div>\n </>\n )\n}\n","import { CloudUploadOutlined } from '@ant-design/icons'\nimport { Attachments } from '@ant-design/x'\nimport { Attachment } from '@ant-design/x/es/attachments'\nimport { getFileSuffixName, isNullOrUnDef, isNumber, isObject, useDebounce, useRefState } from '@zero-library/common'\nimport { App } from 'antd'\nimport { RcFile, UploadFile } from 'antd/lib/upload'\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react'\nimport { FileUploadConfig, InputFile } from '../services'\nimport styles from './styles.module.less'\n/**\n * 附件组件属性接口\n */\nexport interface AttachmentsProps {\n /** 文件上传函数,接收 FormData 并返回上传结果 */\n fileUpload: (formData: FormData) => Promise<R<InputFile>>\n /** 文件上传配置列表,定义允许的文件类型和大小限制 */\n fileUploadConfig?: FileUploadConfig[]\n /** 额外的上传参数,会附加到 FormData 中 */\n extraParams?: ObjectType<string | undefined>\n /** 当前文件列表 */\n fileList?: InputFile[]\n /** 文件列表变化回调函数 */\n onChange: (fileList: InputFile[]) => void\n}\n/**\n * 附件文件类型,继承自 Ant Design X 的 Attachment 类型\n */\ntype AttachedFile = Attachment & InputFile\n\n// 扩展属性(未来可能需要)\n// {\n// extension: string - 文件扩展名\n// }\n/**\n * 附件上传组件\n * 支持多文件上传、文件类型验证、文件大小限制等功能\n */\nexport default forwardRef(({ fileUpload, fileUploadConfig = [], fileList = [], onChange, extraParams }: AttachmentsProps, ref) => {\n const { message } = App.useApp()\n const fileListRef = useRef<InputFile[]>([])\n const [attachedFiles, setAttachedFiles, getAttachedFiles] = useRefState<AttachedFile[]>([])\n // 初始化 fileList 映射为 Attachments 所需格式\n useEffect(() => {\n if (JSON.stringify(fileList) !== JSON.stringify(fileListRef.current)) {\n fileListRef.current = fileList\n const mapped: AttachedFile[] = fileList.map((file) => ({\n ...file,\n uid: file.content,\n url: file.content,\n status: 'done'\n }))\n setAttachedFiles(mapped)\n }\n }, [fileList])\n useEffect(() => {\n // console.log('attachedFiles', attachedFiles)\n const files = attachedFiles\n .filter((file) => file.status === 'done')\n .map((file) => {\n const f = { ...file }\n delete f.status\n delete f.uid\n delete f.size\n delete f.url\n return f as unknown as InputFile\n })\n fileListRef.current = files\n onChange(files)\n }, [attachedFiles])\n const onErrorTip = useDebounce((errorMsg: string) => {\n message.error(errorMsg)\n }, 300)\n /** 根据文件类型找到对应的 upload config */\n const findConfigByFile = (file: RcFile): FileUploadConfig | undefined => {\n return fileUploadConfig.find((cfg) => cfg.allowedFileTypes?.includes(getFileSuffixName(file.name).toLocaleUpperCase()))\n }\n\n const onBeforeUpload = (files: RcFile[]) => {\n // console.log('onBeforeUpload', maxFileCount, files, attachedFiles)\n // 多规则支持:逐个文件校验\n for (const file of files) {\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name} (${file.type})`)\n return Promise.reject(false)\n }\n\n // 校验数量\n if (isNumber(cfg.maxFileCount)) {\n const currentCount = attachedFiles.filter((f) => cfg.allowedFileTypes.includes(getFileSuffixName(f.name || '').toLocaleUpperCase())).length\n\n if (currentCount + 1 > cfg.maxFileCount) {\n onErrorTip(`【${file.name}】所属类型最多只能上传 ${cfg.maxFileCount} 个文件`)\n return Promise.reject(false)\n }\n }\n }\n }\n const onCustomRequest = async ({ file }: any) => {\n // console.log('onCustomRequest', file)\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name}`)\n return\n }\n\n // 校验大小\n if (cfg.maxFileSize && file.size > cfg.maxFileSize * 1024 * 1024) {\n onErrorTip(`文件大小不能超过 ${cfg.maxFileSize} MB`)\n return\n }\n // console.log('上传文件列表1:', file)\n setAttachedFiles([\n ...getAttachedFiles(),\n {\n uid: file.uid,\n status: 'uploading',\n percent: 70,\n size: file.size,\n type: file.type,\n name: file.name\n } as AttachedFile\n ])\n try {\n const formData = new FormData()\n formData.append('file', file)\n if (isObject(extraParams)) {\n Object.keys(extraParams).forEach((key) => {\n if (isNullOrUnDef(extraParams[key])) return\n formData.append(key, extraParams[key])\n })\n }\n // 发送文件到后端\n const { data } = await fileUpload(formData)\n\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...data!, uid: data!.content, url: data.content, status: 'done', size: f.size }\n } else {\n return f\n }\n })\n )\n } catch (error) {\n console.log('上传文件错误:', error)\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...f, status: 'error', description: '上传失败' }\n } else {\n return f\n }\n })\n )\n }\n }\n const onRemove = (file: UploadFile<any>) => {\n // 删除文件\n setAttachedFiles(attachedFiles.filter((f) => f.uid !== file.uid))\n }\n useImperativeHandle(\n ref,\n () => ({\n validateFile: () => {\n const files = getAttachedFiles()\n const uploadingFiles = files.filter((file) => file.status === 'uploading')\n if (uploadingFiles.length > 0) {\n onErrorTip('请等待所有文件上传完成')\n return false\n }\n const errorFiles = files.filter((file) => file.status === 'error')\n if (errorFiles.length > 0) {\n onErrorTip('请检查上传失败的文件')\n return false\n }\n return true\n }\n }),\n []\n )\n\n const acceptStr = useMemo(() => {\n const allTypes = fileUploadConfig.flatMap((cfg) => cfg.allowedFileTypes || [])\n return allTypes.length ? allTypes.join(',') : undefined\n }, [fileUploadConfig])\n return (\n <Attachments\n className={styles.chatAttachments}\n accept={acceptStr}\n multiple={true}\n customRequest={onCustomRequest}\n beforeUpload={(file, files) => onBeforeUpload(files)}\n items={attachedFiles}\n onRemove={onRemove}\n overflow=\"wrap\"\n placeholder={(type) =>\n type === 'drop'\n ? { title: '将文件放到这里' }\n : {\n icon: <CloudUploadOutlined />,\n title: '提交文件',\n description: (\n <div>\n <div>单击或拖动文件到此区域进行上传; </div>\n {/* {allowedFileTypes && <div>支持扩展名:{allowedFileTypes}; </div>} */}\n </div>\n )\n }\n }\n />\n )\n})\n","import { PaperClipOutlined } from '@ant-design/icons'\nimport { Sender, Suggestion } from '@ant-design/x'\nimport { useSyncInput } from '@zero-library/common'\nimport { Badge, Button, ButtonProps, Flex, GetRef } from 'antd'\nimport { forwardRef, useImperativeHandle, useRef } from 'react'\nimport { FileUploadConfig, InputFile } from '../services'\nimport ChatSendAttachments, { AttachmentsProps } from './Attachments'\nimport styles from './styles.module.less'\n\n/**\n * ChatSender 组件暴露的方法接口\n */\nexport interface ChatSenderHandle {\n /** 聚焦输入框 */\n focus: (options?: { cursor?: 'start' | 'end' }) => void\n}\n/**\n * 文件上传配置接口\n */\ninterface FileUpload {\n /** 上传时的额外参数 */\n params?: ObjectType<any>\n /** 文件上传配置列表 */\n config: FileUploadConfig[]\n /** 文件上传请求函数 */\n request: AttachmentsProps['fileUpload']\n}\n\n/**\n * ChatSender 组件属性接口\n */\nexport interface SenderProps {\n /** 输入框占位符 */\n placeholder?: string\n /** 输入框内容 */\n content?: string\n /** 文件列表 */\n fileList?: InputFile[]\n /** 是否打开文件选择头部 */\n headerOpen?: boolean\n /** 是否正在发送消息 */\n loading?: boolean\n /** 内容变化回调 */\n onContentChange: (value: string) => void\n /** 文件列表变化回调 */\n onFileListChange: (files: InputFile[]) => void\n /** 头部打开状态变化回调 */\n onHeaderOpenChange: (open: boolean) => void\n /** 发送消息回调 */\n onSend: () => void\n /** 取消发送回调 */\n onCancel?: () => void\n /** 输入框聚焦回调 */\n onFocus?: () => void\n /** 头部额外内容 */\n extraHeader?: React.ReactNode\n /** 底部额外内容 */\n extraFooter?: React.ReactNode\n /** 底部下方额外内容 */\n extraFooterBelow?: React.ReactNode\n /** 发送按钮属性 */\n sendBtnProps?: ButtonProps\n /** 文件上传配置 */\n fileUpload?: FileUpload\n}\n\nexport default forwardRef<ChatSenderHandle, SenderProps>(\n (\n {\n placeholder,\n content,\n fileList = [],\n headerOpen = false,\n loading = false,\n onContentChange,\n onFileListChange,\n onHeaderOpenChange,\n onSend,\n onCancel,\n onFocus,\n extraHeader,\n extraFooter,\n extraFooterBelow,\n sendBtnProps,\n fileUpload\n },\n ref\n ) => {\n const senderRef = useRef<GetRef<typeof Sender>>(null)\n const { inputValue, setInputValue } = useSyncInput(content || '', onContentChange)\n\n const attachmentsNode = (fileUpload?.config?.length ?? 0) > 0 && (\n <Badge dot={!!fileList?.length && !headerOpen}>\n <Button type=\"text\" icon={<PaperClipOutlined />} onClick={() => onHeaderOpenChange(!headerOpen)} />\n </Badge>\n )\n\n const attachmentsRef = useRef<any>()\n const senderHeader = (\n <>\n <Sender.Header title=\"选择文件\" open={headerOpen} onOpenChange={onHeaderOpenChange}>\n <ChatSendAttachments\n ref={attachmentsRef}\n fileList={fileList}\n fileUpload={fileUpload.request}\n onChange={onFileListChange}\n fileUploadConfig={fileUpload.config}\n extraParams={fileUpload.params}\n />\n </Sender.Header>\n {extraHeader}\n </>\n )\n const onSubmit = () => {\n if (!attachmentsRef.current?.validateFile || attachmentsRef.current.validateFile()) {\n onSend()\n }\n }\n\n // 暴露方法给外部组件\n useImperativeHandle(\n ref,\n () => ({\n focus: (options?: { cursor?: 'start' | 'end' }) => {\n senderRef.current?.focus(options)\n }\n }),\n []\n )\n\n return (\n <Suggestion items={[]} onSelect={(itemVal) => setInputValue(`[${itemVal}]:`)}>\n {({}) => (\n <Sender\n className={styles.chatSender}\n ref={senderRef}\n value={inputValue}\n header={senderHeader}\n onSubmit={onSubmit}\n onChange={setInputValue}\n onFocus={onFocus}\n autoSize={{ minRows: 2, maxRows: 6 }}\n // prefix={attachmentsNode}\n // loading={loading}\n onCancel={onCancel}\n footer={({ components }) => {\n const { SendButton, LoadingButton } = components\n return (\n <Flex vertical>\n <Flex justify=\"space-between\" align=\"center\" gap={12}>\n <Flex className=\"flex-1\" gap={6} align=\"center\">\n {attachmentsNode}\n {extraFooter}{' '}\n </Flex>\n <Flex align=\"center\" gap={6}>\n {/* <SpeechButton /> */}\n {loading ? <LoadingButton disabled={false} /> : <SendButton {...sendBtnProps} />}\n </Flex>\n </Flex>\n {extraFooterBelow}\n </Flex>\n )\n }}\n actions={false}\n placeholder={placeholder || '有什么我能帮您的吗?'}\n />\n )}\n </Suggestion>\n )\n }\n)\n","import { EnterOutlined } from '@ant-design/icons'\nimport { Sender } from '@ant-design/x'\nimport { isFunction, markdownToText, RenderWrapper, shouldRender } from '@zero-library/common'\nimport { Button, Flex, Typography } from 'antd'\nimport { forwardRef, useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport ChatSender, { ChatSenderHandle } from '../../components/ChatSender'\nimport { FileUploadConfig, InputFile } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutSender, MessageBoxType } from '../../stores/types'\nimport FeaturesRenderer from './FeaturesRenderer'\nimport SenderPromptsItems from './SenderPromptsItems'\nimport styles from './styles.module.less'\n\nexport default forwardRef<ChatSenderHandle, ChatLayoutSender>(\n ({ placeholder, extraBtn = false, referencesBtn = false, sendBtnProps, footerBelow = false, prompts = true }, ref) => {\n const chatStore = useChatStore()\n\n const configState = useSnapshot(chatStore.config)\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const referenceContent = useMemo(() => {\n const content = chatMessage.references?.content?.name\n if (content) {\n return markdownToText(content)\n }\n }, [chatMessage.references])\n const referenceHandle = (con: string) => {\n if (chatMessage?.loading) return\n chatStore.setContent(con)\n chatStore.sendMessage()\n }\n return (\n <Flex vertical gap={8} className=\"zero-chat-sender\">\n {/* 🌟 提示词 */}\n <RenderWrapper control={prompts} DefaultComponent={SenderPromptsItems} />\n <ChatSender\n ref={ref}\n placeholder={placeholder}\n content={chatMessage.content}\n fileList={chatMessage.files as InputFile[]}\n headerOpen={chatMessage.headerOpen}\n loading={chatMessage.loading}\n onContentChange={chatStore.setContent}\n onFileListChange={chatStore.setFileList}\n onHeaderOpenChange={chatStore.setHeaderOpen}\n onSend={() => chatStore.sendMessage()}\n onCancel={chatStore.cancelReceive}\n onFocus={chatStore.config.hooks?.onSenderFocus}\n fileUpload={{\n request: configState.services.request?.fileUpload,\n config: receiverState.active.config?.fileUpload as FileUploadConfig[]\n }}\n sendBtnProps={isFunction(sendBtnProps) ? sendBtnProps() : {}}\n extraFooterBelow={<RenderWrapper control={footerBelow} />}\n extraFooter={\n <>\n <FeaturesRenderer />\n <RenderWrapper control={extraBtn} />\n </>\n }\n extraHeader={\n <Sender.Header\n title={\n <Flex gap={4}>\n <EnterOutlined />\n <Typography.Text type=\"secondary\" ellipsis>\n {referenceContent}\n </Typography.Text>\n </Flex>\n }\n open={!!referenceContent}\n onOpenChange={() => chatStore.setReferences()}\n classNames={{\n header: styles.nsSenderReferenceHeaderTitle,\n content: shouldRender(referencesBtn) ? '' : styles.nsSenderReferenceHeaderContent\n }}\n >\n <RenderWrapper\n control={referencesBtn}\n DefaultComponent={\n <Flex gap={8}>\n {['深度解读', '概要解读'].map((con) => (\n <Button key={con} color=\"primary\" variant=\"filled\" onClick={() => referenceHandle(con)}>\n {con} →\n </Button>\n ))}\n </Flex>\n }\n />\n </Sender.Header>\n }\n />\n </Flex>\n )\n }\n)\n","import { UserSwitchOutlined } from '@ant-design/icons'\nimport { Button, Popover } from 'antd'\nimport { useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport { MessageBoxType } from '../../stores/types'\nimport QuickAskPanel from './QuickAsk/QuickAskPanel'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n // const [quickAskOpen, setQuickAskOpen] = useState(false)\n\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n return (\n <>\n {receiverState.active.feature?.deepThink && (\n <Button\n size=\"small\"\n color={receiverState.params.thinkMode === '1' ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => chatStore.setReceiverParams({ thinkMode: receiverState.params.thinkMode === '1' ? '2' : '1' })}\n >\n 深度思考\n </Button>\n )}\n {receiverState.active.feature?.switchManual && (\n <Button\n size=\"small\"\n title={\n chatMessage?.speakHuman\n ? '当前状态为人工模式。您发送的问题将直接发送给专家,智能助手将不再回复'\n : '当前状态为智能助手模式。您发送的问题将发送给智能助手,智能助手将回复您'\n }\n shape=\"round\"\n icon={<UserSwitchOutlined />}\n color={chatMessage?.speakHuman ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => {\n chatStore.setSpeakHuman?.(!chatMessage?.speakHuman)\n }}\n >\n 向专家咨询\n </Button>\n )}\n {/* {receiverState.active.feature?.quickAsk && ( */}\n <Popover\n // open={quickAskOpen}\n // onOpenChange={setQuickAskOpen}\n trigger=\"click\"\n placement=\"topLeft\"\n content={<QuickAskPanel />}\n >\n <Button\n size=\"small\"\n color=\"primary\"\n variant=\"filled\"\n // onClick={() => setQuickAskOpen(true)}\n >\n 快速提问\n </Button>\n </Popover>\n {/* )} */}\n </>\n )\n}\n","import { CopyOutlined, DeleteOutlined, EditOutlined, PlusOutlined, PushpinOutlined, SearchOutlined } from '@ant-design/icons'\nimport { useDebounce, useRefState } from '@zero-library/common'\nimport { App, Button, Flex, Input, Popconfirm, Space, Tag, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { LabelItem, LabelItemUpdate, LabelType } from '../../../services'\nimport { useChatStore } from '../../../stores/Context'\nimport QuickAskEditModal from './QuickAskEditModal'\nimport styles from './styles.module.less'\n\nexport default () => {\n const { message } = App.useApp()\n const chatStore = useChatStore()\n const configState = useSnapshot(chatStore.config)\n const receiverState = useSnapshot(chatStore.receiver)\n const [searchText, setSearchText, getSearchText] = useRefState('')\n const [searchExpanded, setSearchExpanded] = useState(false)\n const [activeTab, setActiveTab, getActiveTab] = useRefState({} as LabelType)\n\n // 数据状态\n const [categories, setCategories] = useState<LabelType[]>([])\n const [items, setItems] = useState<LabelItem[]>([])\n\n // 编辑弹窗状态\n const [editModalOpen, setEditModalOpen] = useState(false)\n const [editingItem, setEditingItem] = useState<LabelItem | undefined>()\n\n // 获取分类列表\n const fetchCategories = async () => {\n try {\n const res = await configState.services.request?.labelsQuery?.(receiverState.active?.id, { pageNo: 1, pageSize: 1000 })\n if (res?.data) {\n setCategories(res.data?.items)\n }\n } catch (err) {}\n }\n // 获取问题列表\n const fetchItems = useDebounce(async () => {\n try {\n const res = await configState.services.request?.labelItemsQuery?.(receiverState.active?.id, {\n labelId: getActiveTab().id,\n keyword: getSearchText()\n })\n if (res?.data) {\n setItems(res.data)\n }\n } catch (err) {}\n })\n\n useEffect(() => {\n if (receiverState.active?.id) {\n fetchCategories()\n fetchItems()\n }\n }, [receiverState.active?.id])\n const [loading, setLoading] = useState(false)\n // 处理新增/编辑\n const handleEditConfirm = async (values: LabelItemUpdate) => {\n try {\n setLoading(true)\n await configState.services.request?.labelItemUpdate?.(receiverState.active?.id, values)\n setEditModalOpen(false)\n message.success('保存成功')\n if (!getActiveTab().id || values.labelName === getActiveTab().labelName) {\n fetchItems() // 刷新列表\n }\n fetchCategories()\n } finally {\n setLoading(false)\n }\n }\n\n // 处理删除\n const handleDelete = async (id: LabelItem['id']) => {\n try {\n await configState.services.request?.labelItemDelete?.(id)\n message.success('删除成功')\n fetchItems() // 刷新列表\n } catch (err) {}\n }\n\n // 处理置顶\n const handleTop = async (item: LabelItem) => {\n try {\n await configState.services.request?.labelItemTop?.({\n id: item.id,\n isTop: !item.isTop\n })\n message.success(item.isTop ? '取消置顶成功' : '置顶成功')\n fetchItems()\n } catch (err) {}\n }\n\n return (\n <Flex vertical className={styles.quickAskPanel}>\n <Flex justify=\"space-between\" align=\"center\">\n <Typography.Title level={5}>快速提问</Typography.Title>\n {/* <Button type=\"text\" icon={<CloseOutlined />} onClick={onClose} size=\"small\" /> */}\n </Flex>\n\n <Flex gap={8} className=\"m-b-16 m-t-16\">\n {!searchExpanded && (\n <Button\n type=\"dashed\"\n block\n icon={<PlusOutlined />}\n className=\"flex-1\"\n onClick={() => {\n setEditingItem(null)\n setEditModalOpen(true)\n }}\n >\n 新增快速提问\n </Button>\n )}\n {searchExpanded ? (\n <Input\n autoFocus\n placeholder=\"输入问题名称或内容检索\"\n prefix={<SearchOutlined />}\n value={searchText}\n onChange={(e) => {\n setSearchText(e.target.value)\n fetchItems()\n }}\n className=\"flex-1\"\n allowClear\n onBlur={() => setSearchExpanded(false)}\n />\n ) : (\n <Button icon={<SearchOutlined />} onClick={() => setSearchExpanded(true)} />\n )}\n </Flex>\n\n <Flex align=\"center\" className={classNames('scroll-fade-in', 'm-b-16', styles.tagContainer)}>\n <Tag\n color={!activeTab.id ? 'processing' : 'default'}\n className=\"cursor-pointer\"\n bordered={false}\n onClick={() => {\n setActiveTab({} as LabelType)\n fetchItems()\n }}\n >\n 全部\n </Tag>\n {categories.map((c) => (\n <Tag\n color={activeTab.id === c.id ? 'processing' : 'default'}\n key={c.id}\n className=\"cursor-pointer\"\n bordered={false}\n onClick={() => {\n setActiveTab(c)\n fetchItems()\n }}\n >\n {c.labelName}\n </Tag>\n ))}\n </Flex>\n\n <Flex vertical className=\"flex-1\">\n <Flex vertical gap={8} className=\"height-full scroll-fade-in\">\n {items.map((item) => (\n <div\n key={item.id}\n className={styles.quickAskItem}\n onClick={() => {\n // console.log('点击了快速提问', item)\n chatStore.setContent(item.content)\n chatStore.setContentParams({\n use_template: 1\n })\n // onClose?.()\n }}\n >\n <Flex gap={8} justify=\"space-between\" className={styles.quickAskItemHeader}>\n <div className=\"flex-1 text-ellipsis\">{item.title}</div>\n <Space size={4}>\n <Button\n key=\"top\"\n type=\"primary\"\n size=\"small\"\n icon={<PushpinOutlined rotate={item.isTop ? -45 : 0} />}\n title={item.isTop ? '取消置顶' : '置顶'}\n onClick={(e) => {\n e.stopPropagation()\n handleTop(item)\n }}\n />\n <Button\n key=\"copy\"\n type=\"primary\"\n size=\"small\"\n icon={<CopyOutlined />}\n title=\"复制\"\n onClick={(e) => {\n e.stopPropagation()\n // 复制, 不带 id\n handleEditConfirm({\n title: item.title,\n labelName: item.labelName,\n content: item.content\n })\n }}\n />\n\n <Button\n key=\"edit\"\n type=\"primary\"\n size=\"small\"\n icon={<EditOutlined />}\n title=\"编辑\"\n onClick={(e) => {\n e.stopPropagation()\n setEditingItem(item)\n setEditModalOpen(true)\n }}\n />\n\n {item.canDelete && (\n <Popconfirm\n key=\"delete\"\n title=\"提示\"\n okText=\"确定\"\n cancelText=\"取消\"\n description=\"确认删除问题吗?\"\n onConfirm={(e) => {\n e.stopPropagation()\n handleDelete(item.id)\n }}\n >\n <Button type=\"primary\" size=\"small\" icon={<DeleteOutlined />} title=\"删除\" onClick={(e) => e.stopPropagation()} />\n </Popconfirm>\n )}\n </Space>\n </Flex>\n <div className={classNames(styles.quickAskItemBody)}>\n <div className=\"text-ellipsis-3\">{item.content}</div>\n </div>\n </div>\n ))}\n </Flex>\n </Flex>\n\n {editModalOpen && (\n <QuickAskEditModal\n open={editModalOpen}\n onCancel={() => setEditModalOpen(false)}\n onConfirm={handleEditConfirm}\n loading={loading}\n initialValues={editingItem}\n categories={categories}\n />\n )}\n </Flex>\n )\n}\n","import { SignatureOutlined } from '@ant-design/icons'\nimport { AutoComplete, Button, Flex, Form, Input, Modal } from 'antd'\nimport { useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { LabelItemUpdate, LabelType } from '../../../services'\nimport { useChatStore } from '../../../stores/Context'\n\ninterface Props {\n open: boolean\n onCancel: () => void\n loading: boolean\n onConfirm: (values: LabelItemUpdate) => void\n initialValues?: LabelItemUpdate\n categories?: LabelType[]\n}\n\nexport default ({ open, onCancel, loading, onConfirm, initialValues, categories = [] }: Props) => {\n const [form] = Form.useForm()\n const chatStore = useChatStore()\n const configState = useSnapshot(chatStore.config)\n const [promptLoading, setPromptLoading] = useState(false)\n const [description, setDescription] = useState('')\n\n const handleOk = async () => {\n try {\n const values = await form.validateFields()\n if (values) {\n onConfirm(values)\n }\n } catch (error) {\n console.error('Validation failed:', error)\n }\n }\n\n // 罗拉提示词助手生成\n const handleGenerate = async () => {\n if (!description.trim()) return\n setPromptLoading(true)\n try {\n const res = await configState.services.request?.labelItemPromptAssistant?.(description)\n if (res.data) {\n form.setFieldsValue({\n title: res.data.title,\n labelName: res.data.labelName,\n content: res.data.content\n })\n }\n } finally {\n setPromptLoading(false)\n }\n }\n\n return (\n <Modal\n title={initialValues?.id ? '编辑快速提问' : '新增快速提问'}\n open={open}\n onCancel={onCancel}\n onOk={handleOk}\n width={600}\n okText=\"确定\"\n okButtonProps={{\n loading\n }}\n cancelText=\"取消\"\n >\n {/* <Spin spinning={promptLoading}> */}\n <Flex vertical gap={4}>\n <Input.TextArea\n rows={4}\n placeholder=\"请输入问题描述,罗拉提示词助手将帮您生成问题名称,分类和内容。\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n disabled={promptLoading}\n />\n <Flex justify=\"end\">\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<SignatureOutlined />}\n onClick={handleGenerate}\n loading={promptLoading}\n disabled={!description.trim()}\n >\n 罗拉提示词助手\n </Button>\n </Flex>\n </Flex>\n\n <Form form={form} layout=\"vertical\" initialValues={initialValues}>\n <Form.Item label=\"问题ID\" name=\"id\" hidden>\n <Input disabled />\n </Form.Item>\n <Form.Item label=\"问题名称\" name=\"title\" rules={[{ required: true, message: '请输入问题名称' }]}>\n <Input placeholder=\"请输入问题名称\" />\n </Form.Item>\n\n <Form.Item label=\"问题分类\" name=\"labelName\" rules={[{ required: true, message: '请选择或输入问题分类' }]}>\n <AutoComplete\n fieldNames={{ value: 'labelName' }}\n placeholder=\"请选择问题分类或输入新的分类\"\n options={categories}\n // filterOption={(inputValue, option) => option!.value.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1}\n />\n </Form.Item>\n\n <Form.Item label=\"问题内容\" name=\"content\" rules={[{ required: true, message: '请输入具体提问内容' }]}>\n <Input.TextArea placeholder=\"请输入具体提问内容,如:帮我扩写一份证据说明\" rows={6} />\n </Form.Item>\n </Form>\n {/* </Spin> */}\n </Modal>\n )\n}\n",".quickAskPanel {\n width: 600px;\n height: 400px;\n}\n.quickAskPanel .tagContainer {\n overflow-y: auto;\n}\n.quickAskPanel .quickAskItem {\n border-radius: 16px;\n overflow: clip;\n cursor: pointer;\n}\n.quickAskPanel .quickAskItem .quickAskItemHeader {\n background-color: var(--ant-color-primary);\n color: #fff;\n padding: 8px 12px;\n}\n.quickAskPanel .quickAskItem .quickAskItemBody {\n background-color: #f2f2f2;\n color: #555;\n padding: 12px;\n}\n","import { Button, Flex, List, Popover } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { RecommendQuestion } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\n/* 🌟 提示词 */\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n const component = useMemo(\n () =>\n receiverState.active.config?.labels?.length > 0 && (\n <Flex gap={4} wrap>\n <Button disabled color=\"default\" variant=\"text\">\n 随便聊聊\n </Button>\n {receiverState.active.config.labels.slice(0, 6).map((question) => (\n <Popover\n key={question.id}\n content={\n <List\n itemLayout=\"horizontal\"\n split={false}\n className={styles.nsSenderList}\n dataSource={question.items as RecommendQuestion[]}\n renderItem={(item) => (\n <List.Item onClick={() => chatStore.sendMessage(item.question)} className={styles.nsSenderListItem}>\n <div className='text-ellipsis'>{item.question}</div>\n </List.Item>\n )}\n footer={\n <Flex justify=\"end\" className={styles.nsSenderListFooter}>\n (您可点击以上问题开启AI体验)\n </Flex>\n }\n />\n }\n title={\n <div\n className={classNames(styles.nsSenderListTitle, 'text-ellipsis')}\n >{`${receiverState.active.name}开始关注${question.name}内容!`}</div>\n }\n >\n <Button color=\"default\" variant=\"filled\">\n {question.name}\n </Button>\n </Popover>\n ))}\n </Flex>\n ),\n [receiverState.active.config?.labels]\n )\n return component\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport { Avatar, Button, Flex } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n return (\n <div className=\"p-24\">\n <Flex align=\"center\" gap={8}>\n <Avatar size={36} src={receiverState.active.logo} />\n <span className={styles.nsChatUserName}>{receiverState.active.name}</span>\n </Flex>\n <Button\n block\n type=\"primary\"\n shape=\"round\"\n onClick={() => chatStore.createConversation()}\n className={classNames('m-t-16')}\n icon={<PlusOutlined />}\n >\n 新建会话\n </Button>\n </div>\n )\n}\n","import { RenderWrapper } from '@zero-library/common'\nimport { Flex } from 'antd'\nimport classNames from 'classnames'\nimport { ChatLayoutConversationList } from '../../stores/types'\nimport ConversationList from './ConversationList'\nimport ConversationListHeader from './ConversationListHeader'\nimport styles from './styles.module.less'\n\nexport default ({ header }: ChatLayoutConversationList) => {\n return (\n <Flex vertical className={classNames('height-full', 'zero-chat-conversations', styles.nsConversationListPanel)}>\n <RenderWrapper control={header} DefaultComponent={ConversationListHeader} />\n <div className=\"full-scroll\">\n <ConversationList />\n </div>\n </Flex>\n )\n}\n",".nsPreviewHeader {\n padding: 16px 24px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n}\n.nsPreviewHeader .nsPreviewHeaderTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatSenderHeader {\n margin-bottom: 16px;\n padding: 24px;\n font-size: 24px;\n text-align: center;\n}\n.nsDisclaimerNotice {\n font-size: 12px;\n text-align: center;\n color: #bfbfbf;\n}\n.nsChatLayout {\n background-color: #fff;\n}\n.nsChatLayout .nsChatBody {\n padding: 8px 0;\n}\n.nsBodyWidth {\n margin: 0 auto;\n max-width: 896px;\n min-width: 320px;\n width: calc(100% - 24px);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stores/Context.ts","../src/ui/common/markdownAlert/styles.module.less","../src/ui/common/markdownAlert/AppCard.tsx","../src/ui/common/markdownAlert/FileView.tsx","../src/ui/common/markdownAlert/components/DocDrawer.tsx","../src/ui/common/markdownAlert/IndexQuote.tsx","../src/ui/common/markdownAlert/MdEdit.tsx","../src/ui/common/markdownAlert/FileEdit.tsx","../src/ui/common/markdownAlert/Think.tsx","../src/ui/common/markdownAlert/Charts.tsx","../src/core/local.ts","../src/core/utils.ts","../src/services/index.ts","../src/services/file.ts","../src/stores/index.ts","../src/ui/layouts/index.tsx","../src/ui/common/markdownAlert/index.ts","../src/components/styles.module.less","../src/components/MessageRender.tsx","../src/ui/common/BubbleListItems.tsx","../src/ui/common/styles.module.less","../src/ui/common/WelcomeItem.tsx","../src/ui/common/ChatHeader.tsx","../src/ui/common/AgentCharacter.tsx","../src/ui/common/CharacterList.tsx","../src/ui/common/ConversationList.tsx","../src/components/Attachments.tsx","../src/components/ChatSender.tsx","../src/ui/common/ChatSender.tsx","../src/ui/common/FeaturesRenderer.tsx","../src/ui/common/QuickAsk/QuickAskPanel.tsx","../src/ui/common/QuickAsk/QuickAskEditModal.tsx","../src/ui/common/QuickAsk/styles.module.less","../src/ui/common/SenderPromptsItems.tsx","../src/ui/common/ConversationListHeader.tsx","../src/ui/common/ConversationListPanel.tsx","../src/ui/layouts/styles.module.less"],"names":["useCreateValtioContext","appCard","fileView","fileEdit","fileEditHeader","fileEditContent","quoteList","mdEdit","think","chart","chartSkeleton","chartSkeletonIcon","Spin","jsxs","Flex","jsx","FileIcon","useSnapshot","useState","useEffect","Drawer","RenderMarkdown","Empty","message","useMemo","isExternal","Popover","Tag","MarkdownEditor","Button","PlayCircleOutlined","CopyOutlined","copyText","Collapse","classNames","Skeleton","DotChartOutlined","LazyComponent","Alert","createSecureManager","createTokenManager","emit","dayjs","buildUrlParams","getWebSocketUrl","downloadFile","proxy","createRequest","HttpStatus","isArray","isString","shouldRender","deepMerge","isObject","transform","transforms","deepCopy","styles_module_default","loadingMessage","chatAttachments","chatSender","chatQuoteMsg","quoteTooltip","quoteTooltipContainer","quoteMsg","markdownToText","isEmptyObj","Typography","Fragment","Bubble","Attachments","Tooltip","nsConversationListPanel","nsConversations","nsBubbleList","nsChatHeader","nsChatTitle","nsChatHeaderPopover","chatWelcomeWrap","chatWelcome","chatWelcomePrompts","nsSenderListTitle","nsSenderList","nsSenderListItem","nsSenderListFooter","nsChatUserName","nsSenderReferenceHeaderTitle","nsSenderReferenceHeaderContent","nsAvatarListContainer","nsAvatarList","nsAvatarListItem","nsAvatarListItemIcon","nsAvatarListItemIconActive","nsAvatarListItemName","Space","Welcome","RenderWrapper","Avatar","Prompts","customComponents","isBoolean","UserAvatar","OpenAIOutlined","useRef","htmlToMarkdown","LikeOutlined","DislikeOutlined","Modal","Row","Col","useDebounce","InfiniteScroll","RedoOutlined","Conversations","DeleteOutlined","PlusOutlined","CommentOutlined","CloseOutlined","forwardRef","App","useRefState","getFileSuffixName","isNumber","isNullOrUnDef","useImperativeHandle","CloudUploadOutlined","useSyncInput","Badge","PaperClipOutlined","Sender","Suggestion","Form","Input","SignatureOutlined","AutoComplete","quickAskPanel","tagContainer","quickAskItem","quickAskItemHeader","quickAskItemBody","SearchOutlined","PushpinOutlined","EditOutlined","Popconfirm","UserSwitchOutlined","List","ChatSender_default","isFunction","EnterOutlined","nsPreviewHeader","nsPreviewHeaderTitle","nsChatSenderHeader","nsDisclaimerNotice","nsChatLayout","nsChatBody","nsBodyWidth","useDeepEffect","sizes","useWebSocket","XProvider","Splitter","FilePreview","FileSearchOutlined"],"mappings":"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","file":"index.cjs.js","sourcesContent":["import { useCreateValtioContext } from '@zero-library/common'\nimport { ChatStoreType } from './types'\n\n/**\n * 基于泛型创建专用的聊天上下文\n * 使用 Valtio 进行状态管理,提供 Provider 和 Hook\n */\nexport const { ValtioProvider: ChatProvider, useValtioStore: useChatStore } = useCreateValtioContext<ChatStoreType>()\n",".appCard {\n width: 180px;\n border-radius: 10px;\n border: 1px solid #d7d7d7;\n background-color: #fafafa;\n font-size: 16px;\n cursor: pointer;\n margin: 8px;\n padding: 12px 8px;\n}\n.appCard > div {\n max-width: 100%;\n}\n.appCard > img {\n height: 30px;\n}\n.fileView {\n width: 200px;\n padding: 4px 8px;\n cursor: pointer;\n background-color: #f5f3f3;\n border-radius: 6px;\n}\n.fileEdit {\n margin: 12px 0;\n border-radius: 6px;\n border: 1px solid #f2f2f2;\n}\n.fileEdit .fileEditHeader {\n padding: 2px 8px;\n background-color: #f2f2f2;\n}\n.fileEdit .fileEditContent {\n padding: 8px;\n background-color: #fafafa;\n}\n.quoteList {\n min-width: 300px;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-header {\n padding: 12px 0;\n color: #8f91a8;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-content {\n color: #8f91a8;\n background-color: #f2f2f2;\n}\n.mdEdit {\n margin: 10px 0;\n background-color: rgba(242, 242, 242, 0.2);\n border: 1px solid #f2f2f2;\n padding: 10px;\n border-radius: 4px;\n}\n.think:global.ant-collapse {\n margin-bottom: 16px;\n}\n.think:global.ant-collapse .ant-collapse-header {\n color: #8f91a8;\n}\n.think:global.ant-collapse .ant-collapse-content {\n color: #8f91a8;\n}\n.think:global.ant-collapse .ant-collapse-content .ant-collapse-content-box {\n padding: 0 10px 0 24px;\n}\n.chart {\n padding: 10px;\n max-width: 100%;\n min-width: 350px;\n overflow-x: scroll;\n display: inline-block;\n border-radius: 12px;\n border: 1px solid #e5e9f0;\n background: linear-gradient(180deg, #fff 0%, #f8fafc 100%);\n margin: 12px 0;\n}\n.chart .chartSkeleton {\n width: 100% !important;\n}\n.chart .chartSkeleton .chartSkeletonIcon {\n font-size: 40px;\n color: #bfbfbf;\n}\n","import { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n agentId: string\n appKey?: string\n appName: string\n iconUrl: string\n }\n loading: boolean\n}\n// :::alert type=appCard data={appKey:\"cube-acc\",agentId:\"\",appName:\"罗拉易账\",iconUrl:\"/icon-url/2e53e398d31627d559e0b3b1b5acb731.png\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = async () => {\n if (data.appKey) {\n const canProceed = await chatStore.config.hooks?.onAppRightVerify?.(data.appKey)\n if (canProceed === false) {\n return\n }\n }\n chatStore.switchAgentConversation(data.agentId)\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex vertical gap={4} align=\"center\" className={styles.appCard} onClick={onClick}>\n <img src={data.iconUrl} />\n <div className=\"text-ellipsis\" title={data.appName}>\n {data.appName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { FileIcon } from '@zero-library/common'\nimport { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport { FileUrlType } from '../../../stores/types'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileUrlType\n loading: boolean\n}\n// :::alert type=fileView data={fileUrl:\"\",fileName:\"\",suffix:\"\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.setPreview(data, false)\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex gap={8} align=\"center\" className={styles.fileView} onClick={onClick}>\n <FileIcon suffix={data.suffix} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { RenderMarkdown } from '@zero-library/common'\nimport { Drawer, Empty, Spin } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../../../stores/Context'\n\ninterface Props {\n paramsStr: string\n title: string\n open: boolean\n onClose: () => void\n}\nexport default ({ title, open, onClose, paramsStr }: Props) => {\n const chatStore = useChatStore()\n const configState = useSnapshot(chatStore.config)\n const [content, setContent] = useState('')\n const [loading, setLoading] = useState(false)\n const getContent = async () => {\n try {\n setLoading(true)\n const res = await configState.services.request.docQuery(paramsStr)\n setContent(res.data?.content)\n } finally {\n setLoading(false)\n }\n }\n useEffect(() => {\n getContent()\n }, [paramsStr])\n return (\n <Drawer title={title} push={false} width=\"100%\" open={open} onClose={onClose}>\n <Spin spinning={loading}>{content ? <RenderMarkdown content={content} /> : <Empty className=\"m-t-32\" />}</Spin>\n </Drawer>\n )\n}\n","// :::alert type=indexQuote data={citationName:引,citationId:5}:::\nimport { isExternal } from '@zero-library/common'\nimport { Flex, Popover, Spin, Tag } from 'antd'\nimport { useMemo, useState } from 'react'\nimport { ConversationMessage } from '../../../services'\nimport DocDrawer from './components/DocDrawer'\n\ninterface Props {\n message: ConversationMessage\n data: {\n citationName: string\n citationId: number\n }\n loading: boolean\n}\nexport default ({ data, loading, message }: Props) => {\n const [open, setOpen] = useState(false)\n // {\"citationId\": 1, \"citationUrl\": \"type=2&datasetId=1997851270976937984&docId=1765162923266&sid=0fd11940-b20e-4719-9b16-147a5f618e4e\", \"citationName\": \"第3卷证词.pdf\"}\n const citation = useMemo(() => {\n let citations = []\n try {\n citations = JSON.parse(message.citations)\n } catch (e) {}\n return citations?.find((item) => String(item.citationId) === String(data.citationId))\n }, [data.citationId, message.citations])\n const onClick = () => {\n if (!citation?.citationUrl) return\n if (isExternal(citation.citationUrl)) {\n window.open(citation.citationUrl, '_blank')\n } else {\n setOpen(true)\n }\n }\n const Content = (\n <div>\n <Flex align=\"center\" gap={8}>\n {/* <FileIcon suffix={data.suffix} fontSize={16} /> */}\n <a onClick={onClick}>{citation?.citationName}</a>\n </Flex>\n </div>\n )\n return (\n <div className=\"inline-block m-l-8\">\n <Spin spinning={loading} size=\"small\">\n <Popover content={Content}>\n <Tag bordered={false} color=\"processing\" className=\"cursor-pointer\">\n {data?.citationName}\n </Tag>\n </Popover>\n </Spin>\n {open && <DocDrawer paramsStr={citation?.citationUrl} title={citation?.citationName} open={open} onClose={() => setOpen(false)} />}\n </div>\n )\n}\n","import { MarkdownEditor } from '@zero-library/common'\nimport { Button, Flex } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n content: string\n btnText?: string\n }\n loading: boolean\n}\n// :::alert type=mdEdit data={content:\"\",btnText:\"\"} :::\nexport default ({ data, loading }: Props) => {\n // const num = useRef(0)\n // useEffect(() => {\n // num.current = num.current + 1\n // console.log('mdEdit', num.current, data.content, loading)\n // }, [data.content, loading])\n const chatStore = useChatStore()\n const [value, setValue] = useState('')\n const btnText = data.btnText || '继续' // '开始写作',\n const onOk = () => {\n chatStore.sendMessage(btnText, [], { citation: value })\n }\n useEffect(() => {\n setValue(data.content)\n }, [data.content])\n return (\n <div className={styles.mdEdit}>\n <MarkdownEditor disabled={loading} value={value} onChange={setValue} showToolbar={false} />\n {!loading && (\n <Flex justify=\"end\" className=\"m-t-16\">\n <Button color=\"primary\" variant=\"outlined\" onClick={onOk}>\n {/* 确认提纲思路,开始写作 */}\n {btnText}\n </Button>\n </Flex>\n )}\n </div>\n )\n}\n","// :::alert type=fileEdit data={fileName:\"\",content:\"\"} :::\nimport { CopyOutlined, PlayCircleOutlined } from '@ant-design/icons'\nimport { copyText, FileIcon, RenderMarkdown } from '@zero-library/common'\nimport { Button, Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport { FileTextType } from '../../../stores/types'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileTextType\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n // console.log('fileEdit', data)\n const chatStore = useChatStore()\n // const configState = useSnapshot(chatStore.config)\n const onPreview = () => {\n chatStore.setPreview(data, true)\n }\n // useEffect(() => {\n // if (configState.preview.isShow !== 2 || (loading && configState.preview.isShow === 1)) {\n // chatStore.setPreview(data, {\n // isEdit: true,\n // isShow: 1,\n // isIntact: !loading\n // })\n // }\n // }, [data, loading])\n\n return (\n <Flex vertical className={styles.fileEdit}>\n <Flex gap={8} align=\"center\" justify=\"space-between\" className={styles.fileEditHeader}>\n <Flex gap={4} align=\"center\" className=\"flex-1\">\n <FileIcon suffix={'md'} fontSize={18} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n <Spin spinning={loading} size=\"small\">\n <Flex>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<PlayCircleOutlined />} onClick={onPreview}>\n 预览编辑\n </Button>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} onClick={() => copyText(data.content)}>\n 复制\n </Button>\n </Flex>\n </Spin>\n </Flex>\n <Flex gap={8} align=\"center\" className={styles.fileEditContent}>\n <RenderMarkdown content={data.content} />\n </Flex>\n </Flex>\n )\n}\n","// :::alert type=think data={content:\"\"} :::\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Collapse } from 'antd'\nimport styles from './styles.module.less'\ninterface Props {\n data: {\n content: string\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n return (\n <Collapse\n className={styles.think}\n ghost\n size=\"small\"\n defaultActiveKey={['think']}\n items={[\n {\n key: 'think',\n label: loading ? '仔细思考中...' : '思考过程',\n children: <RenderMarkdown content={data.content} />\n }\n ]}\n />\n )\n}\n","import { DotChartOutlined } from '@ant-design/icons'\nimport { LazyComponent } from '@zero-library/common'\nimport { Alert, Skeleton } from 'antd'\nimport classNames from 'classnames'\nimport styles from './styles.module.less'\n// 需要支持的图表类型列表\nconst chartTypes = [\n 'Line',\n 'Column',\n 'Bar',\n 'Area',\n 'Pie',\n 'DualAxes',\n 'Scatter',\n 'WordCloud',\n 'Funnel',\n 'Heatmap',\n 'Histogram',\n 'Liquid',\n 'BidirectionalBar',\n 'Box',\n 'Bullet',\n 'CirclePacking',\n 'Gauge',\n 'Radar',\n 'Rose',\n 'Sankey',\n 'Stock',\n 'Sunburst',\n 'Treemap',\n 'Venn',\n 'Waterfall',\n 'MindMap',\n 'Fishbone',\n 'IndentedTree',\n 'Dendrogram',\n 'OrganizationChart',\n 'FlowGraph',\n 'FlowDirectionGraph',\n 'NetworkGraph'\n // …如果还有其他图表也继续加\n] as const\n// 所有支持的图表类型映射\nconst CHART_COMPONENTS = Object.fromEntries(\n chartTypes.map((type) => [\n type,\n () =>\n import('@ant-design/charts').then((mod) => ({\n default: (mod as any)[type]\n }))\n ])\n)\n\ninterface Props {\n data: {\n type: string\n config: any\n }\n loading: boolean\n}\n\nexport default ({ data, loading }: Props) => {\n const { type, config } = data\n\n return (\n <div className={classNames(styles.chart, 'scroll-fade-in')}>\n {loading ? (\n // Antd 骨架屏\n <Skeleton.Node active className={styles.chartSkeleton}>\n <DotChartOutlined className={styles.chartSkeletonIcon} />\n </Skeleton.Node>\n ) : (\n <LazyComponent\n type={type}\n {...config}\n customComponents={CHART_COMPONENTS}\n unknownContent={\n <Alert message=\"不支持的图表\" description={`当前图表类型 \"${type}\" 暂未实现,请检查图表类型是否正确。`} type=\"warning\" showIcon />\n }\n />\n )}\n </div>\n )\n}\n","import { createSecureManager, createTokenManager, emit } from '@zero-library/common'\nimport { UserInfo } from '../services'\n/**\n * 用户信息管理器\n * 用于安全存储和管理用户信息,采用AES加密存储\n */\nexport const userInfoManager = createSecureManager<UserInfo>({\n key: 'NS-USER',\n aesKey: '((#II))'\n})\n\nexport const TOKEN_KEY = 'NS-TOKEN'\n/**\n * 令牌管理器\n * 用于管理用户认证令牌,支持从URL参数或存储中获取、设置和清除令牌\n *\n * 特点:\n * 1. 默认使用localStorage存储\n * 2. 支持从URL参数自动同步令牌\n */\nexport const tokenManager = createTokenManager({\n key: TOKEN_KEY\n})\n\n/**\n * 跳转到登录页面\n * 该函数用于在用户未授权或会话过期时重定向到登录页面\n */\nexport const redirectUrl = () => {\n const path = localStorage.getItem('SIGNPATH')\n emit('jumpLink', { url: `/uc${path || '/sign-in'}` })\n}\n","import { buildUrlParams, getWebSocketUrl } from '@zero-library/common'\nimport dayjs from 'dayjs'\n\n/**\n * 根据时间戳分类时间,返回相对时间描述\n * @param timestamp - 时间戳(毫秒),可选,默认为当前时间\n * @returns 时间分类字符串\n */\nexport const classifyTime = (timestamp?: number): string => {\n const now = dayjs()\n const target = dayjs(timestamp)\n\n if (target.isSame(now, 'day')) {\n return '今天'\n }\n\n const diffInDays = now.diff(target, 'day')\n if (diffInDays < 7) {\n return '最近 7 天'\n } else if (diffInDays < 30) {\n return '最近 30 天'\n } else if (diffInDays < 180) {\n return '最近半年'\n } else {\n return '更早'\n }\n}\n\n/**\n * 替换一些标记为自定义标记方便markdown渲染,比如think标签\n * @param str - 原始字符串\n * @returns 替换后的字符串\n */\nexport const replaceMarkdownTags = (str: string) => {\n return (\n str\n // 替换开标签\n .replace(/<think>/g, \":::alert type=think data={content:'\")\n // 替换闭标签\n .replace(/<\\/think>/g, \"'} :::\\n\")\n )\n}\n/**\n * 构建Chat WebSocket URL\n * 将 baseURL和参数组合成完整的WebSocket连接URL\n *\n * @param baseURL - WebSocket baseURL\n * @param params - 要附加到URL上的参数\n * @returns 完整的WebSocket URL\n */\nexport const getChatSocketUrl = (baseURL: string, params: Record<string, any>) => {\n return buildUrlParams(params, getWebSocketUrl(`${baseURL}/lolr/conversation/ws/subscribe`), 'comma')\n}\n","import { createRequest } from '@zero-library/common'\n\n/**\n * 聊天服务模块\n * 提供聊天相关的 API 接口定义和类型声明\n * 包含会话管理、消息处理、智能体操作等功能\n */\n\n/**\n * 用户信息接口\n * 定义用户的基本信息和权限配置\n */\nexport interface UserInfo {\n /** 用户ID */\n id?: string | number\n /** 用户姓名 */\n name?: string\n /** 头像地址 */\n avatar?: string\n /** 备注信息 */\n remark?: string\n}\n\n/**\n * 会话列表查询参数接口\n * 用于获取用户的会话列表\n */\nexport interface ConversationsQuery extends PageReq {\n /** 业务数据唯一ID,非必填 */\n businessId?: string\n /** 业务类型,非必填 */\n businessType?: number\n /** 目标ID(如智能体ID、专家ID等) */\n targetId: string\n /** 目标类型:1-用户 2-专家 3-Agent 4-税协 */\n targetType: number\n}\n/**\n * 会话成员返回模型\n */\nexport interface ConversationMember {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,会话成员表ID\n */\n id: string\n /**\n * Jointime,加入时间\n */\n joinTime: Date\n /**\n * Memberavatar,成员头像\n */\n memberAvatar: string\n /**\n * Memberid,成员ID\n */\n memberId: string\n /**\n * Membername,成员名称\n */\n memberName: string\n /**\n * Membertype,成员类型\n */\n memberType: number\n /**\n * Orgid,机构ID\n */\n orgId: number\n /**\n * Orgname,机构名称\n */\n orgName: string\n}\nexport interface ConversationType {\n /**\n * Agentid,智能体 ID\n */\n agentId: string\n /**\n * Agentname,智能体名称\n */\n agentName: string\n /**\n * Id,会话 ID\n */\n id: string\n /**\n * Logourl,头像路径\n */\n logoUrl: string\n /**\n * Members,会话成员\n */\n members?: ConversationMember[]\n /**\n * Selected,当前选择的会话\n */\n selected: boolean\n /**\n * State,会话状态 1-正常 2-结束\n */\n state: number\n /**\n * Title,会话标题\n */\n title: string\n /**\n * Unreadcount,当前用户未读消息数\n */\n unreadCount: number\n /**\n * Updatetime,更新时间\n */\n updateTime: number\n}\n\nexport interface ConversationCreate {\n /**\n * Businessdata,业务扩展参数,非必填\n */\n businessData?: string\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗;3-律师\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Type,会话类型: 1-对话; 2-工具\n */\n type: number\n}\n\nexport interface ConversationRecentUpdate extends ConversationRecentQuery {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n}\n\nexport interface ConversationRecentQuery {\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗;3-律师\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n}\n\n/**\n * 会话消息查询参数接口\n * 用于获取指定会话的消息列表\n */\nexport interface conversationMessagesQuery extends PageReq {\n /** 会话ID */\n conversationId: string\n}\n/**\n * 输入文件接口\n * 定义聊天中上传文件的属性\n */\nexport interface InputFile {\n /** 文件内容(base64编码或URL) */\n content: string\n /** 文件模式:remote_url(远程URL)| local_file(本地文件) */\n mode: string\n /** 文件类型(MIME类型) */\n type: string\n /** 文件扩展名 */\n extension: string\n /** 文件名 */\n name: string\n}\n/**\n * 消息引用类型\n * 用于消息回复时的引用信息\n */\nexport interface MessageQuoteMsg {\n /** 被引用的消息ID */\n id?: string\n /** 被引用的消息内容 */\n msgContent?: string\n /** 被引用消息的附件文件列表 */\n msgFiles?: InputFile[]\n}\n\n/**\n * 消息发送者接口\n * 定义消息发送者的身份信息\n */\nexport interface MessageSender {\n /** 是否为当前用户 */\n currUser?: boolean\n /** 发送者ID */\n id: string\n /** 发送者类型:1-用户 2-专家 3-Agent 4-税协 */\n type: number\n}\n/**\n * 会话消息接口\n * 定义聊天消息的完整信息\n */\nexport interface ConversationMessage {\n /** 会话ID */\n conversationId: string\n /** 会话标题(WebSocket返回时可能包含) */\n conversationTitle?: string\n /** 消息类型:WebSocket流式消息类型 */\n type?: 'TEXT_MESSAGE_START' | 'STEP_STARTED' | 'TEXT_MESSAGE_CONTENT' | 'TEXT_MESSAGE_END' | 'RUN_ERROR' | 'TEXT_MESSAGE_CITATION'\n /** 消息ID */\n id: string\n /** 消息内容 */\n msgContent: string\n /** 消息反馈:1-赞 2-踩 */\n msgFeedback?: number\n /** 附件文件列表 */\n msgFiles?: InputFile[]\n /** 引用的消息信息 */\n quoteMsg?: MessageQuoteMsg\n /** 透传参数 json字符串 */\n params?: string\n /** 大模型引用到的数据列表 json字符串*/\n citations?: string\n /** 发送者信息 */\n sender?: MessageSender\n /** 发送时间戳 */\n sendTime: number\n /** 是否被打断标志 */\n stopFlag?: boolean\n\n /** 临时Content数据 用于存储step和error信息 */\n tempContent?: string\n}\n/**\n * 消息反馈更新接口\n * 用于用户对消息进行赞/踩评价\n */\nexport interface FeedbackUpdate {\n /** 会话ID */\n conversationId: string\n /** 消息ID */\n id: string\n /** 反馈类型:1-赞 2-踩 */\n msgFeedback: number\n /** 反馈内容描述,非必填 */\n msgFeedbackContent?: string\n}\n\n/**\n * 消息发送参数接口\n * 定义发送消息时所需的全部参数\n */\nexport interface ConversationMessageSend {\n /** 会话ID */\n conversationId: string\n /** 消息内容 */\n msgContent: string\n /** 附件文件列表 */\n msgFiles?: InputFile[]\n /** 业务参数,透传到智能体的JSON字符串 */\n params?: string\n /** 引用的消息ID,大于0的整数 */\n quoteMsgId?: number\n /** 接收者ID,当receiverType≠3时由后端填充 */\n receiverId: string\n /** 接收者类型:1-用户 2-专家 3-agent 4-税协 */\n receiverType: number\n /** 返回方式:1-http 2-WebSocket */\n returnType: number\n /** 发送者ID */\n senderId: string\n /** 发送者类型:1-用户 2-专家 3-agent 4-税协 */\n senderType: number\n /** 会话来源:1-罗拉-APP 2-罗拉-pc端 3-合作伙伴端 4-税协 5-罗拉-cube 6-api */\n source: number\n /** 是否启用流式返回 */\n stream: boolean\n}\n/**\n * 文件上传配置接口\n * 定义智能体的文件上传规则\n */\nexport interface FileUploadConfig {\n /** 允许的文件类型列表(MIME类型或扩展名) */\n allowedFileTypes: string[]\n /** 是否启用文件上传功能 */\n enabled: boolean\n /** 单次上传最大文件数量 */\n maxFileCount: number\n /** 单个文件最大大小(字节) */\n maxFileSize?: number\n}\n\n/**\n * 推荐问题接口\n * 定义单个推荐问题的结构\n */\nexport interface RecommendQuestion {\n /** 问题ID */\n id: number\n /** 问题内容 */\n question: string\n}\n\n/**\n * 热门问题标签接口\n * 定义热门问题的分类标签\n */\nexport interface HotQuestionList {\n /** 标签ID */\n id: number\n /** 标签下的问题列表 */\n items: RecommendQuestion[]\n /** 标签名称 */\n name: string\n}\n\n/**\n * 智能体配置接口\n * 定义智能体的功能配置信息\n */\nexport interface AgentConfig {\n /** 文件上传配置列表 */\n fileUpload?: FileUploadConfig[]\n /** 热门问题标签列表 */\n labels?: HotQuestionList[]\n}\n/**\n * 智能体信息接口\n * 定义智能体的基本信息和配置\n */\nexport interface AgentInfo {\n /** 智能体名称 */\n agentName: string\n /** 智能体类型 */\n agentType: number\n /** 智能体的配置信息 */\n config: AgentConfig\n /** 智能体描述 */\n description?: string\n /** 智能体ID */\n id: string\n /** 智能体是否可用 */\n isAvailable?: boolean\n /** 智能体Logo地址 */\n logo: string\n /** 智能体特性配置,JSON字符串格式 */\n feature?: string\n}\n\n/**\n * 智能体性格接口\n * 定义智能体的性格特征配置\n */\nexport interface AgentCharacter {\n /** 智能体ID */\n agentId: number\n /** 性格名称 */\n characterName: string\n /** 详细程度评级:1-10 */\n detailLevel: number\n /** 幽默程度评级:1-10 */\n humorLevel: number\n /** 性格配置ID */\n id: number\n /** 性格头像图片路径 */\n logo: string\n /** 专业程度评级:1-10 */\n professionalLevel: number\n /** 是否为当前选择的性格 */\n selected: boolean\n /** 性别设置:1-男 2-女 */\n sex: number\n}\n\n/**\n * 快速提问更新参数接口\n */\nexport interface LabelItemUpdate extends LabelItemPrompt {\n /** 快速提问ID,修改时必填 */\n id?: string\n}\n\n/**\n * 快速提问列表查询参数接口\n */\nexport interface LabelItemListQuery {\n /** 分类ID */\n labelId?: string\n /** 搜索关键字 */\n keyword?: string\n}\n\n/**\n * 快速提问列表项接口\n */\nexport interface LabelItem extends LabelItemUpdate {\n /** 问题ID */\n id: string\n agentId: string\n seq: number\n /** 是否置顶 */\n isTop?: 1 | 0\n createTime: number\n updateTime: number\n canDelete?: boolean\n}\n\nexport interface LabelQuery extends PageReq {\n labelName?: string\n}\nexport interface LabelType {\n /** 分类ID */\n id: string\n /** 分类名称 */\n labelName: string\n createTime: number\n updateTime: number\n canDelete?: boolean\n}\n/**\n * 快速提问置顶参数接口\n */\nexport interface LabelItemTop {\n /** 问题ID */\n id: string\n /** 是否置顶 */\n isTop: LabelItem['isTop']\n}\n\n/**\n * 罗拉提示词助手返回接口\n */\nexport interface LabelItemPrompt {\n /** 建议的问题名称 */\n title: string\n /** 建议的问题分类 */\n labelName: string\n /** 建议的问题内容 */\n content: string\n}\n\n/**\n * 创建聊天服务\n * @param request - 请求函数实例\n * @returns 聊天服务对象\n */\nexport const createChatService = (request: ReturnType<typeof createRequest>) => {\n /**\n * 查询会话列表\n * @param params - 查询参数,包含分页和过滤条件\n * @returns 分页的会话列表\n */\n const conversationsQuery = (params: ConversationsQuery): Promise<R<PageRes<ConversationType>>> => {\n return request.get('/lolr/conversation', params)\n }\n\n /**\n * 创建新会话\n * @param params - 创建会话的参数\n * @returns 新创建的会话ID\n */\n const conversationCreate = (params: ConversationCreate): Promise<R<string>> => {\n return request.post('/lolr/conversation', params)\n }\n\n /**\n * 删除指定会话\n * @param conversationId - 要删除的会话ID\n */\n const conversationDelete = (conversationId: string): Promise<R<null>> => {\n return request.delete('/lolr/conversation', { conversationId })\n }\n /**\n * 更新用户的最近一次会话\n * @param params - 更新参数,包含会话ID\n * @returns 更新是否成功\n */\n const conversationRecentUpdate = (params: ConversationRecentUpdate): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/recent', params)\n }\n /**\n * 获取用户的最近一次会话\n * @param params - 查询参数\n * @returns 最近会话ID\n */\n const conversationRecentQuery = (params: ConversationRecentQuery): Promise<R<string>> => {\n return request.get('/lolr/conversation/recent', params)\n }\n\n /**\n * 查询会话消息列表\n * @param params - 查询参数,包含会话ID和分页信息\n * @returns 分页的消息列表\n */\n const conversationMessagesQuery = (params: conversationMessagesQuery): Promise<R<PageRes<ConversationMessage>>> => {\n return request.get('/lolr/conversation/message', params)\n }\n\n /**\n * 标记会话中的消息为已读\n * @param conversationId - 会话ID\n * @returns 标记是否成功\n */\n const conversationMessageRead = (conversationId: ConversationType['id']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/message/read', { conversationId })\n }\n\n /**\n * 更新消息反馈(赞或踩)\n * @param params - 反馈参数,包含消息ID和反馈类型\n */\n const feedbackUpdate = (params: FeedbackUpdate): Promise<R<null>> => {\n return request.put('/lolr/conversation/message/feedback', params)\n }\n /**\n * 获取基于消息的推荐问题\n * @param msgId - 消息ID\n * @param maxCount - 最大推荐数量,默认为3\n * @returns 推荐问题列表\n */\n const messageSuggestedQuery = (msgId: ConversationMessage['id'], maxCount = 3): Promise<R<string[]>> => {\n return request.get('/lolr/conversation/suggest', { msgId, maxCount })\n }\n\n /**\n * 获取会话成员列表\n * @param conversationId - 会话ID\n * @returns 会话成员列表\n */\n const conversationMemberQuery = (conversationId: ConversationType['id']): Promise<R<ConversationMember[]>> => {\n return request.get('/lolr/conversation/member', { conversationId })\n }\n /**\n * 更新会话状态\n * @param conversationId - 会话ID\n * @param state - 新的会话状态(1-正常 2-结束)\n * @returns 更新是否成功\n */\n const conversationStateUpdate = (conversationId: ConversationType['id'], state: ConversationType['state']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/state', { conversationId, state })\n }\n\n /**\n * 发送消息到会话\n * @param params - 消息发送参数\n */\n const conversationMessageSend = (params: ConversationMessageSend): Promise<R<void>> => {\n return request.post('/lolr/conversation/send', params)\n }\n\n /**\n * 打断正在进行的流式输出\n * @param conversationId - 要打断的会话ID\n */\n const conversationStop = (conversationId: ConversationType['id']): Promise<R<void>> => {\n return request.post('/lolr/conversation/stop', { conversationId })\n }\n\n /**\n * 获取智能体详细信息\n * @param agentId - 智能体ID\n * @returns 智能体详细信息\n */\n const agentInfoQuery = (agentId: AgentInfo['id']): Promise<R<AgentInfo>> => {\n return request.get('/lolr/agent/detail', { agentId })\n }\n\n /**\n * 获取智能体的性格角色列表\n * @param agentId - 智能体ID\n * @returns 性格角色列表\n */\n const agentCharacterQuery = (agentId: AgentInfo['id']): Promise<R<AgentCharacter[]>> => {\n return request.get('/lolr/character', { agentId })\n }\n /**\n * 为用户选择智能体的性格角色\n * @param agentId - 智能体ID\n * @param characterId - 性格角色ID\n */\n const agentCharacterSelect = (agentId: AgentInfo['id'], characterId: AgentCharacter['id']): Promise<R<null>> => {\n return request.post('/lolr/character/user', { agentId, characterId })\n }\n\n /**\n * 上传文件到存储服务\n * @param formData - 包含文件的表单数据\n * @returns 上传后的文件信息\n */\n const fileUpload = (formData: FormData): Promise<R<InputFile>> => {\n return request.post('/lolr/storage/upload', formData, { timeout: 5 * 60 * 1000 })\n }\n\n /**\n * 新增/修改快速提问\n */\n const labelItemUpdate = (agentId: AgentInfo['id'], params: LabelItemUpdate): Promise<R<LabelItem['id']>> => {\n return request.post('/lolr/label/item', { agentId, ...params })\n }\n\n /**\n * 删除快速提问\n */\n const labelItemDelete = (id: LabelItem['id']): Promise<R<null>> => {\n return request.delete('/lolr/label/item', { id })\n }\n\n /**\n * 获取快速提问分类列表\n */\n const labelsQuery = (agentId: AgentInfo['id'], params?: LabelQuery): Promise<R<PageRes<LabelType>>> => {\n return request.get('/lolr/label', { agentId, ...params })\n }\n\n /**\n * 获取快速提问列表\n */\n const labelItemsQuery = (agentId: string, params: LabelItemListQuery): Promise<R<LabelItem[]>> => {\n return request.get('/lolr/label/item', { ...params, agentId })\n }\n\n /**\n * 置顶/取消置顶快速提问\n */\n const labelItemTop = (params: LabelItemTop): Promise<R<null>> => {\n return request.put('/lolr/label/item/top', params)\n }\n\n /**\n * 罗拉提示词助手\n * 根据用户输入的描述生成建议的问题表单项\n */\n const labelItemPromptAssistant = (prompt: string): Promise<R<LabelItemPrompt>> => {\n return request.post('/lolr/agent/prompts/optimization', { prompt })\n }\n\n /**\n * 获取智能推荐问题\n * 根据智能体配置和会话上下文生成推荐问题\n */\n const recommendQuestionsQuery = (agentId: AgentInfo['id'], conversationId: ConversationType['id']): Promise<R<string[]>> => {\n return request.get('/lolr/agent/suggest', { maxCount: 3, agentId, conversationId })\n }\n\n return {\n conversationsQuery,\n conversationCreate,\n conversationDelete,\n conversationRecentUpdate,\n conversationRecentQuery,\n conversationMessagesQuery,\n conversationMessageRead,\n feedbackUpdate,\n messageSuggestedQuery,\n conversationMemberQuery,\n conversationStateUpdate,\n conversationMessageSend,\n conversationStop,\n agentInfoQuery,\n agentCharacterQuery,\n agentCharacterSelect,\n fileUpload,\n labelItemUpdate,\n labelItemDelete,\n labelsQuery,\n labelItemsQuery,\n labelItemTop,\n labelItemPromptAssistant,\n recommendQuestionsQuery\n }\n}\n","import { createRequest, downloadFile } from '@zero-library/common'\n/**\n * 文档类型接口\n */\nexport interface DocType {\n /** 文档内容 */\n content: string\n /** 文档唯一标识 */\n docId: string\n /** 文档关键字列表 */\n keywords?: string[]\n /** 文档位置 */\n position?: number\n /** 文档分段ID */\n sid?: string\n /** 文档令牌数量 */\n tokens?: number\n /** 文档字数 */\n wordCount?: number\n}\n\n/**\n * 创建文件服务\n * @param request - 请求函数实例\n * @returns 文件服务对象\n */\nexport const createFileService = (request: ReturnType<typeof createRequest>) => {\n /**\n * 查询文档信息\n * @param paramsStr - 查询参数字符串\n * @returns 文档信息\n */\n const docQuery = (paramsStr: string): Promise<R<DocType>> => {\n return request.get(`/lolr/doc?${paramsStr}`)\n }\n\n /**\n * 创建文件(将内容转换为指定格式的文件并下载)\n * @param fileContent - 文件内容\n * @param fileName - 文件名,可选\n * @param targetFormat - 目标文件格式,默认为 'docx'\n */\n const fileCreate = async (fileContent: string, fileName?: string, targetFormat: string = 'docx') => {\n const blob = await request.post(`/uc/doc/convert`, { fileContent, fileName, targetFormat }, { responseType: 'blob' })\n const url = URL.createObjectURL(blob)\n downloadFile(url, fileName)\n }\n\n return {\n docQuery,\n fileCreate\n }\n}\n","import { Conversation } from '@ant-design/x'\nimport {\n createRequest,\n deepCopy,\n deepMerge,\n HttpStatus,\n isArray,\n isObject,\n isString,\n shouldRender,\n transform,\n transforms\n} from '@zero-library/common'\nimport { message } from 'antd'\nimport { proxy } from 'valtio'\nimport { redirectUrl, TOKEN_KEY, tokenManager, userInfoManager } from '../core/local'\nimport { classifyTime, getChatSocketUrl } from '../core/utils'\nimport {\n AgentCharacter,\n AgentInfo,\n ConversationMember,\n ConversationMessage,\n ConversationMessageSend,\n ConversationsQuery,\n ConversationType,\n createChatService,\n FeedbackUpdate,\n UserInfo\n} from '../services'\nimport { createFileService } from '../services/file'\nimport {\n ChatHooks,\n ChatLayout,\n ChatParams,\n ChatServices,\n ConversationMemberObj,\n ConversationStrategy,\n FileTextType,\n FileUrlType,\n MessageBoxType,\n ReceiverInfo,\n ReferencesType,\n RequestInstance\n} from './types'\n\nconst defaultAgentLayout = {\n leftPanel: false,\n conversationList: true,\n preview: true,\n messageList: true,\n senderHeader: false,\n sender: true,\n senderFooter: false,\n globalHeader: false,\n chatHeader: true,\n disclaimerNotice: true,\n recommendQuestions: false\n} as ChatLayout\nconst defaultExpertLayout = {\n leftPanel: false,\n conversationList: false,\n preview: false,\n messageList: true,\n senderHeader: false,\n sender: {\n props: {\n prompts: false\n }\n },\n senderFooter: false,\n globalHeader: false,\n chatHeader: {\n props: {\n newConversationBtn: false,\n agentCharacter: false,\n conversationListBtn: false\n }\n },\n disclaimerNotice: false,\n recommendQuestions: false\n} as ChatLayout\n\n/**\n * 创建聊天状态管理器\n * 使用 Valtio 进行状态管理,包含会话、消息、用户信息等所有聊天相关状态\n * @returns 聊天状态管理器和操作方法\n */\nexport function createChatStore() {\n /** 全局配置对象,包含服务、钩子函数、布局等配置 */\n const config = proxy({\n services: {\n /** WebSocket地址 */\n websocketUrls: ['', ''] as [string, string],\n /** HTTP请求实例 */\n request: {} as RequestInstance\n },\n hooks: {} as ChatHooks,\n layout: {} as ChatLayout,\n /** 文件预览状态 */\n preview: {\n file: {} as FileUrlType | FileTextType,\n isEdit: false // 未使用\n // isShow: 0, // 0 不显示 1 显示 2 用户关闭\n // isIntact: false // true 完整 false 不完整\n },\n /** 当前用户信息 */\n userInfo: {} as UserInfo,\n /** 聊天参数配置 */\n params: {} as ChatParams\n })\n\n /**\n * 设置服务配置\n * 配置聊天组件所需的HTTP和WebSocket服务\n *\n * @param services - 服务配置对象,包含HTTP和WebSocket配置\n */\n const setServices = ({ http, websocket } = {} as ChatServices) => {\n // 合并默认HTTP配置和用户提供的配置,包括默认的认证头\n const httpConfig = { baseURL: '/api', headers: { [TOKEN_KEY]: tokenManager.get() }, ...http?.config }\n // 初始化http配置\n const request = createRequest(httpConfig)\n if (config.hooks?.onRequestInterceptor) {\n request.instance.interceptors.request.use(...(config.hooks.onRequestInterceptor as any))\n }\n request.instance.interceptors.response.use(undefined, (err) => {\n if (err?.response?.status === HttpStatus.UNAUTHORIZED) {\n if (config.hooks.onRedirectLogin) {\n config.hooks.onRedirectLogin()\n } else {\n redirectUrl()\n }\n }\n return Promise.reject(err)\n })\n if (config.hooks?.onResponseInterceptor) {\n request.instance.interceptors.response.use(...config.hooks.onResponseInterceptor)\n }\n config.services.request = { ...createChatService(request), ...createFileService(request), ...http?.request }\n\n // 初始化WebSocket配置数组,最多支持两个地址\n config.services.websocketUrls = ['', '']\n if (isArray(websocket?.baseURLs)) {\n // 配置提供的WebSocket地址\n websocket.baseURLs.forEach((baseURL, index) => {\n if (isString(baseURL)) {\n config.services.websocketUrls[index] = getChatSocketUrl(baseURL, websocket?.params || httpConfig.headers)\n }\n })\n } else {\n // 如果未提供WebSocket URL数组,则继承HTTP配置\n const url = getChatSocketUrl(httpConfig.baseURL, websocket?.params || httpConfig.headers)\n config.services.websocketUrls = [url, '']\n }\n }\n /**\n * 设置文件预览\n * @param file - 要预览的文件\n * @param isEdit - 是否为编辑模式\n */\n const setPreview = async (file = {} as FileUrlType | FileTextType, isEdit = false) => {\n const preview = shouldRender(config.layout.preview)\n const canProceed = await config.hooks?.onBeforeFilePreview?.(file, preview)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n if (preview) {\n config.preview = {\n file,\n isEdit\n }\n } else {\n if ((file as FileUrlType)?.fileUrl) {\n window.open((file as FileUrlType).fileUrl, '_blank')\n } else if ((file as FileTextType)?.content) {\n console.log('当前环境不支持预览')\n }\n }\n\n config.hooks?.onAfterFilePreview?.(file, preview)\n }\n /**\n * 设置布局配置\n * @param layout - 布局配置\n * @param receiverType - 接收者类型:3-智能体,其他-专家\n */\n const setLayout = (layout: ChatLayout, receiverType: number = 3) => {\n const defaultLayout = receiverType === 3 ? defaultAgentLayout : defaultExpertLayout\n config.layout = deepMerge(defaultLayout, layout)\n }\n /**\n * 设置聊天参数\n * @param params - 聊天参数配置\n */\n const setParams = (params = {} as ChatParams) => {\n config.params = { ...params }\n }\n /**\n * 设置生命周期钩子函数\n * @param hooks - 钩子函数配置\n */\n const setHooks = (hooks = {} as ChatHooks) => {\n config.hooks = hooks\n }\n /**\n * 设置当前用户信息\n * @param userInfo - 用户信息\n */\n const setUserInfo = (userInfo?: UserInfo) => {\n config.userInfo = userInfo || userInfoManager.get() || {}\n config.userInfo.id = String(config.userInfo.id || '')\n }\n /** 接收者状态管理,包含当前激活的接收者信息 */\n const receiver = proxy({\n /** 当前激活的接收者信息(智能体或专家) */\n active: {} as ReceiverInfo,\n /** 智能体推荐问题列表 */\n recommendQuestions: [] as string[],\n /** 接收者加载状态 */\n loading: false,\n /** 接收者透传参数,后期可能扩展不透传参数 */\n params: {} as ObjectType<any>\n })\n\n const setReceiverParams = (params?: ObjectType<any>) => {\n if (isObject(params)) {\n Object.assign(receiver.params, params)\n } else {\n receiver.params = {}\n }\n }\n // 智能体切换\n const switchAgent = async (agentId: AgentInfo['id']) => {\n // 切换智能体\n if (receiver.active.id === agentId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchAgent?.(agentId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n\n try {\n receiver.loading = true\n const { data } = await config.services.request.agentInfoQuery(agentId)\n receiver.active = transform<AgentInfo, ReceiverInfo>(data, {\n name: 'agentName',\n logo: 'logo',\n description: 'description',\n id: 'id',\n config: 'config',\n isAvailable: 'isAvailable',\n feature: (agentInfo) => {\n if (agentInfo.feature) {\n try {\n return JSON.parse(agentInfo.feature)\n } catch (e) {}\n }\n return {}\n }\n })\n receiver.active.type = 3\n setReceiverParams()\n\n config.hooks?.onAfterSwitchAgent?.(data)\n } catch (error) {\n console.error(error)\n throw error\n } finally {\n receiver.loading = false\n }\n }\n // 目前只是为了对照智能体\n const switchExpert = (expert: ConversationMember) => {\n if (receiver.active.id === expert.memberId) return\n receiver.active = transform<ConversationMember, ReceiverInfo>(expert, {\n name: 'memberName',\n logo: 'memberAvatar',\n id: 'memberId'\n })\n receiver.active.type = 2\n setReceiverParams()\n }\n\n /** 智能体性格状态管理 */\n const character = proxy({\n /** 性格列表 */\n list: [] as AgentCharacter[],\n /** 当前激活的性格 */\n active: {} as AgentCharacter,\n /** 性格选择面板是否打开 */\n open: false,\n /** 加载性格列表的状态 */\n loading: false,\n /** 切换性格时的加载状态 */\n switchLoading: false\n })\n\n const getCharacters = async (agentId: AgentInfo['id']) => {\n try {\n character.loading = true\n const { data } = await config.services.request.agentCharacterQuery(agentId)\n if (receiver.active.id !== agentId) return\n character.list = data || []\n const active = character.list.find((item) => item.selected)\n if (active) {\n character.active = active\n }\n } finally {\n character.loading = false\n }\n }\n const openCharacterList = () => {\n character.open = true\n }\n const closeCharacterList = () => {\n character.open = false\n }\n const switchCharacter = async (c: AgentCharacter) => {\n if (!c.id) return\n try {\n character.switchLoading = true\n await config.services.request.agentCharacterSelect(receiver.active.id, c.id)\n character.active = { ...c }\n closeCharacterList()\n } finally {\n character.switchLoading = false\n }\n }\n\n /** 历史会话管理 */\n const conversations = proxy({\n /** 会话列表数据 */\n list: {\n items: [] as Conversation[],\n /** 分页查询参数 */\n params: {\n pageNum: 1,\n pageSize: 1000\n }\n },\n /** 当前会话索引,创建会话时更新,促使页面更新会话列表 */\n updateIndex: 0,\n /** 获取会话列表的加载状态 */\n loading: false,\n /** 删除会话的加载状态 */\n delLoading: false\n })\n\n const getConversations = async (targetId: ConversationsQuery['targetId'], targetType: ConversationsQuery['targetType']) => {\n try {\n conversations.loading = true\n const { data } = await config.services.request.conversationsQuery({\n targetId,\n targetType,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n ...conversations.list.params\n })\n // 防止会话接口请求前就已经切换了会话\n if (receiver.active.id !== targetId) return\n const items = transforms<ConversationType, Conversation>(data?.items || [], {\n key: 'id',\n id: 'id',\n label: 'title',\n group: (c): string => {\n return classifyTime(c.updateTime)\n },\n timestamp: 'updateTime'\n })\n conversations.list.items = items\n } finally {\n conversations.loading = false\n }\n }\n const delConversation = async (conversationId: ConversationType['id']) => {\n try {\n const canProceed = await config.hooks?.onBeforeDelConversation?.(conversationId)\n if (canProceed === false) return\n conversations.delLoading = true\n await config.services.request.conversationDelete(conversationId)\n message.success('删除成功')\n conversations.list.items = conversations.list.items.filter((item) => item.key !== conversationId)\n delete conversation.messages[conversationId]\n if (conversation.active.id === conversationId) {\n createConversation()\n }\n config.hooks?.onAfterDelConversation?.(conversationId, conversation.active.id === conversationId)\n } finally {\n conversations.delLoading = false\n }\n }\n /** 当前会话管理 */\n const conversation = proxy({\n /** 当前激活的会话信息 */\n active: {\n id: '',\n /** 会话成员对象,包含用户、智能体、专家等 */\n member: {} as ConversationMemberObj\n },\n /** 每个会话的消息存储,以会话ID为键 */\n messages: {} as { [key: ConversationType['id']]: MessageBoxType },\n /** 消息反馈状态 */\n feedback: {\n // open: false,\n /** 反馈操作加载状态 */\n loading: false\n // recordId: '',\n // target: undefined as number | undefined\n }\n })\n const setSpeakHuman = (speakHuman: boolean) => {\n conversation.messages[conversation.active.id].speakHuman = speakHuman\n }\n const setReferences = async (references?: ReferencesType) => {\n const canProceed = await config.hooks?.onBeforeSetReferences?.(references)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n conversation.messages[conversation.active.id].references = references\n config.hooks?.onAfterSetReferences?.(references)\n }\n const setContent = (content?: ConversationMessageSend['msgContent']) => {\n conversation.messages[conversation.active.id].content = content\n }\n const setContentParams = (params?: MessageBoxType['params']) => {\n conversation.messages[conversation.active.id].params = params\n }\n const setFileList = (files = [] as ConversationMessageSend['msgFiles']) => {\n conversation.messages[conversation.active.id].files = files\n }\n const setHeaderOpen = (headerOpen: MessageBoxType['headerOpen']) => {\n conversation.messages[conversation.active.id].headerOpen = headerOpen\n }\n const removeQuestionList = (conversationId: ConversationType['id']) => {\n if (conversation.messages[conversationId].questionList?.length) {\n conversation.messages[conversationId].questionList = []\n }\n }\n const getQuestionList = async (conversationId: ConversationType['id'], messageId: ConversationMessage['id']) => {\n // 根据配置判断是否接受message推荐问题,TODO切换智能体间隙会出现问题\n if (receiver.active.feature?.prompts === false) return\n const messages = conversation.messages[conversationId]?.message\n if (!messages?.length) return\n let lastMessage = messages[messages.length - 1]\n if (!lastMessage || lastMessage.sender.type !== 3 || lastMessage.id !== messageId) return\n const { data } = await config.services.request.messageSuggestedQuery(messageId)\n lastMessage = messages[messages.length - 1]\n if (lastMessage.id !== messageId) return\n\n conversation.messages[conversationId].questionList = data!\n }\n\n /**\n * 获取智能推荐问题\n * 如果是新会话(通常新会话没有消息),尝试获取智能推荐问题\n */\n const getRecommendQuestions = async (conversationId: ConversationType['id']) => {\n if (\n conversationId === conversation.active.id &&\n conversation.active.member.agent?.memberId &&\n !conversation.messages[conversationId].message.length\n ) {\n try {\n const { data } = await config.services.request.recommendQuestionsQuery(conversation.active.member.agent.memberId, conversationId)\n if (conversationId === conversation.active.id) {\n receiver.recommendQuestions = data\n }\n } catch (e) {}\n }\n }\n\n // const closeFeedback = async () => {\n // conversation.feedback.open = false\n // }\n\n const feedback = async (\n conversationId: FeedbackUpdate['conversationId'],\n messageId: FeedbackUpdate['id'],\n msgFeedback: FeedbackUpdate['msgFeedback'],\n index: number\n ) => {\n try {\n conversation.feedback.loading = true\n await config.services.request.feedbackUpdate({ conversationId, id: messageId, msgFeedback })\n message.success('感谢您的反馈')\n // closeFeedback()\n conversation.messages[conversationId].message[index].msgFeedback = msgFeedback\n } finally {\n conversation.feedback.loading = false\n }\n }\n\n /**\n * 初始化会话消息状态\n * @param conversationId - 会话ID\n */\n const setInitMessage = async (conversationId: ConversationType['id']) => {\n conversation.messages[conversationId] = {\n /** 输入框内容 */\n content: '',\n /** 上传文件列表 */\n files: [] as ConversationMessageSend['msgFiles'],\n /** 头部展开状态 */\n headerOpen: false,\n /** 消息发送/接收加载状态 */\n loading: false,\n /** 消息列表 */\n message: [],\n /** 推荐问题列表 */\n questionList: []\n }\n }\n /**\n * 解析会话ID(根据策略获取或创建会话)\n * 如果前端不存在会话ID,目前只有智能体在用\n * @param receiverId - 接收者ID(智能体ID)\n * @param strategy - 会话策略:1-最近会话 2-新会话\n * @returns 会话ID\n */\n const resolveConversationId = async (receiverId: AgentInfo['id'], strategy: ConversationStrategy = 2) => {\n if (strategy === 1) {\n const { data } = await config.services.request.conversationRecentQuery({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType\n })\n return data\n } else {\n const { data } = await config.services.request.conversationCreate({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n businessData: config.params.businessData,\n source: config.params.source,\n type: 1\n })\n conversations.updateIndex = conversations.updateIndex + 1\n return data\n }\n }\n\n const initConversation = async (conversationId: Conversation['id']) => {\n try {\n const { data } = await config.services.request.conversationMemberQuery(conversationId)\n conversation.active = { id: conversationId, member: {} }\n data.forEach((member) => {\n if (member.memberType === 3) {\n conversation.active.member.agent = member\n } else {\n // TODO 应该使用用户id 匹配; member.memberType === 1临时判断\n if (member.memberId === config.userInfo.id || member.memberType === 1) {\n conversation.active.member.user = member\n } else {\n conversation.active.member.other = member\n }\n }\n })\n } finally {\n }\n }\n const switchAgentConversation = async (id: AgentInfo['id'], strategy?: ConversationStrategy) => {\n await switchAgent(String(id))\n const conversationId = await resolveConversationId(receiver.active.id, strategy)\n if (conversationId) {\n await switchConversation(conversationId)\n }\n }\n const createConversation = async () => {\n if (!receiver.active.id) return\n const conversationId = await resolveConversationId(receiver.active.id)\n if (conversationId) {\n await switchConversation(conversationId)\n }\n }\n // 切换会话\n const switchConversation = async (id: Conversation['id']) => {\n const conversationId = String(id)\n if (conversation.active.id === conversationId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchConversation?.(conversationId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n // 初始化会话\n await initConversation(conversationId)\n // 清空智能体推荐问题\n receiver.recommendQuestions = []\n // 关闭文件预览\n await setPreview()\n config.hooks?.onAfterSwitchConversation?.(conversationId)\n\n // 初始化接收者\n try {\n if (conversation.active.member.agent) {\n switchAgent(conversation.active.member.agent.memberId)\n } else if (conversation.active.member.other) {\n switchExpert(conversation.active.member.other)\n }\n } catch (e) {}\n // 获取消息列表\n await getMessages(conversationId)\n }\n const getMessages = async (conversationId: ConversationType['id']) => {\n const canProceed = await config.hooks?.onBeforeInitMessages?.(conversationId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n // 初始化消息列表\n if (!conversation.messages[conversationId]) {\n setInitMessage(conversationId)\n }\n if (conversation.messages[conversationId].message.length === 0) {\n // try {\n // conversation.messages[key].messageLoading = true\n const { data } = await config.services.request.conversationMessagesQuery({\n pageNo: 1,\n pageSize: 1000,\n conversationId\n })\n conversation.messages[conversationId].message = data.items\n // }catch(e){\n // throw e\n // } finally {\n // conversation.messages[key].messageLoading = false\n // }\n }\n getRecommendQuestions(conversationId)\n config.hooks?.onAfterInitMessages?.(conversation.messages[conversationId].message)\n config.hooks?.onAfterInit?.()\n }\n\n /**\n * 选择消息接收者\n * 根据当前会话状态和说话人类型选择合适的接收者\n * @returns 消息接收者信息\n */\n const pickReceiver = () => {\n const { agent, other } = conversation.active.member\n // 如果当前是人类专家说话模式且有专家,则选择专家\n if (conversation.messages[conversation.active.id].speakHuman && other) return other\n // 优先选择智能体\n if (agent) return agent\n // 其次选择专家\n if (other) return other\n return undefined\n }\n const sendMessage = async (\n message?: ConversationMessageSend['msgContent'],\n files = [] as ConversationMessageSend['msgFiles'],\n params?: ObjectType<any>\n ) => {\n const conversationId = conversation.active.id\n if (conversation.messages[conversationId].loading) return\n let msgContent: ConversationMessageSend['msgContent'] = '',\n msgFiles: ConversationMessageSend['msgFiles'] | undefined\n const references = conversation.messages[conversationId].references\n if (message) {\n msgContent = message\n msgFiles = files\n } else {\n if (references?.type === 1 && references?.content?.msgContent) {\n msgContent = references.content.msgContent + '\\n'\n }\n msgContent = msgContent + conversation.messages[conversationId].content!\n msgFiles = conversation.messages[conversationId].files\n }\n if (!msgContent) return\n\n const canProceed = await config.hooks?.onBeforeSend?.(msgContent, msgFiles)\n if (canProceed === false) return\n\n conversation.messages[conversationId].loading = true\n const sendReceiver = pickReceiver()\n const sendParams = {\n conversationId,\n msgContent,\n msgFiles,\n // quoteMsgId\n receiverId: sendReceiver.memberId,\n receiverType: sendReceiver.memberType,\n returnType: 2,\n senderId: conversation.active.member.user.memberId,\n senderType: conversation.active.member.user.memberType,\n source: config.params.source,\n stream: true\n } as ConversationMessageSend\n // 参数合并\n const extraParams = deepCopy(config.params.params || {}) as ChatParams['params']\n Object.assign(extraParams, receiver.params, message ? {} : { ...references?.params, ...conversation.messages[conversationId].params }, params)\n sendParams.params = JSON.stringify(extraParams)\n\n if (!message) {\n setContent('')\n setContentParams()\n setFileList([])\n setReferences()\n setHeaderOpen(false)\n }\n try {\n await config.services.request.conversationMessageSend(sendParams)\n\n config.hooks?.onAfterSend?.()\n } finally {\n // loading关闭由websocket消息执行\n // conversation.messages[conversationId].loading = false\n }\n }\n const cancelReceive = async () => {\n console.log('取消接收')\n // TODO 取消接收\n await config.services.request.conversationStop(conversation.active.id)\n conversation.messages[conversation.active.id].loading = false\n }\n\n // 更新会话标题\n const updateConversationTitle = (conversationId: ConversationType['id'], title: ConversationType['title']) => {\n if (title && conversations.list.items.length) {\n const idx = conversations.list.items.findIndex((item) => item.id === conversationId)\n if (idx === -1) return\n conversations.list.items[idx].label = title\n }\n }\n\n const findMsgIndex = (msgId: string, messages?: ConversationMessage[]) => {\n return (messages || []).findLastIndex((item) => item.id === msgId)\n }\n /**\n * WebSocket消息开始回调\n * 处理消息开始接收时的状态更新\n * @param msg - 接收到的消息\n */\n const startCallback = (msg: ConversationMessage) => {\n // 清除推荐问题列表\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId]?.message\n // 未初始化消息列表\n if (!messages) return\n // 如果是智能体消息,显示思考状态;用户消息直接显示\n messages.push(msg.sender.type === 3 ? { ...msg, tempContent: '正在努力思考中' } : msg)\n conversation.messages[msg.conversationId].loading = true\n }\n\n /**\n * WebSocket步骤消息回调\n * 处理多步骤消息的更新\n * @param msg - 步骤消息\n */\n const stepCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n conversation.messages[msg.conversationId].loading = true\n // 更新步骤消息\n messages[idx] = {\n ...messages[idx],\n type: msg.type,\n tempContent: msg.msgContent\n }\n }\n\n /**\n * WebSocket消息内容回调\n * 处理流式消息内容的追加\n * @param msg - 消息内容\n */\n const contentCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n conversation.messages[msg.conversationId].loading = true\n // 追加消息内容\n messages[idx] = {\n ...messages[idx],\n msgFiles: messages[idx]?.msgFiles?.length ? messages[idx].msgFiles : msg.msgFiles,\n params: messages[idx]?.params || msg.params,\n quoteMsg: messages[idx]?.quoteMsg || msg.quoteMsg,\n type: msg.type,\n tempContent: '',\n msgContent: messages[idx].msgContent + (msg.msgContent || '')\n }\n }\n\n /**\n * WebSocket消息结束回调\n * 处理消息接收完成的状态更新\n * @param msg - 结束消息\n */\n const endCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n // 清除消息类型,标记为完成\n messages[idx] = {\n ...messages[idx],\n tempContent: '',\n type: undefined\n }\n conversation.messages[msg.conversationId].loading = false\n // 获取推荐问题\n getQuestionList(msg.conversationId, msg.id)\n }\n /**\n * WebSocket消息引用回调\n * 返回message里用到的引用来源\n * @param msg - 引用来源消息\n */\n const citationCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId]?.message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n conversation.messages[msg.conversationId].loading = true\n // 追加消息内容\n messages[idx] = {\n ...messages[idx],\n citations: msg.msgContent\n }\n }\n /**\n * WebSocket错误消息回调\n * 处理消息接收错误的状态更新\n * @param msg - 错误消息\n */\n const errCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.id, messages)\n if (idx === -1) return\n // 显示错误消息\n messages[idx] = {\n ...messages[idx],\n tempContent: msg.msgContent,\n type: undefined,\n // 报错后清空消息内容\n msgContent: ''\n }\n conversation.messages[msg.conversationId].loading = false\n }\n /**\n * 接收WebSocket消息的统一入口\n * 根据消息类型分发到不同的处理函数\n * @param newMessage - 新消息对象\n */\n const acceptMessage = async (newMessage: R<ConversationMessage>) => {\n const conversationId = newMessage.data.conversationId\n if (!conversation.messages[conversationId]?.message) return\n const canProceed = await config.hooks?.onBeforeAcceptMessage?.(newMessage.data)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n updateConversationTitle(conversationId, newMessage.data.conversationTitle)\n // console.log('接收消息:', newMessage.data.type)\n switch (newMessage.data.type) {\n case 'TEXT_MESSAGE_START':\n startCallback(newMessage.data)\n break\n case 'STEP_STARTED':\n stepCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_CONTENT':\n contentCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_END':\n endCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_CITATION':\n citationCallback(newMessage.data)\n break\n case 'RUN_ERROR':\n errCallback(newMessage.data)\n break\n default:\n break\n }\n config.hooks?.onAfterAcceptMessage?.(newMessage.data)\n }\n\n return {\n /** 全局配置对象 */\n config,\n /** 设置服务配置 */\n setServices,\n /** 设置文件预览 */\n setPreview,\n /** 设置布局配置 */\n setLayout,\n /** 设置生命周期钩子 */\n setHooks,\n /** 设置聊天参数 */\n setParams,\n /** 设置用户信息 */\n setUserInfo,\n /** 智能体性格状态 */\n character,\n /** 获取性格列表 */\n getCharacters,\n /** 打开性格选择面板 */\n openCharacterList,\n /** 关闭性格选择面板 */\n closeCharacterList,\n /** 切换性格 */\n switchCharacter,\n /** 接收者状态 */\n receiver,\n /** 设置接收者参数 */\n setReceiverParams,\n /** 历史会话状态 */\n conversations,\n /** 获取会话列表 */\n getConversations,\n /** 删除会话 */\n delConversation,\n /** 当前会话状态 */\n conversation,\n /** 设置说话人类型 */\n setSpeakHuman,\n /** 设置引用消息 */\n setReferences,\n /** 设置消息内容 */\n setContent,\n /** 设置内容参数,透传大模型后清空 */\n setContentParams,\n /** 设置文件列表 */\n setFileList,\n /** 设置头部展开状态 */\n setHeaderOpen,\n /** 消息反馈操作 */\n feedback,\n /** 切换智能体会话 */\n switchAgentConversation,\n /** 创建新会话 */\n createConversation,\n /** 切换会话 */\n switchConversation,\n /** 发送消息 */\n sendMessage,\n /** 取消接收 */\n cancelReceive,\n /** 接收消息 */\n acceptMessage\n }\n}\n","import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport { CloseOutlined, FileSearchOutlined } from '@ant-design/icons'\nimport { Prompts, XProvider } from '@ant-design/x'\nimport { downloadFile, FilePreview, MarkdownEditor, RenderWrapper, shouldRender, useDeepEffect, useWebSocket } from '@zero-library/common'\nimport { Button, Flex, Spin, Splitter, Tag } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { ChatSenderHandle } from '../../components/ChatSender'\nimport { createChatStore } from '../../stores'\nimport { ChatProvider } from '../../stores/Context'\nimport type { ChatLayout, FileTextType, FileUrlType } from '../../stores/types'\nimport BubbleListItems from '../common/BubbleListItems'\nimport ChatHeader from '../common/ChatHeader'\nimport ChatSender from '../common/ChatSender'\nimport ConversationListPanel from '../common/ConversationListPanel'\nimport styles from './styles.module.less'\nimport { ChatHandle, ChatProps } from './types'\n\n/**\n * 聊天组件\n * 使用 React.forwardRef 实现的聊天界面组件\n * 集成了消息收发、会话管理、文件预览等功能\n *\n * @example\n * // 基本使用\n * <Chat\n * config={{\n * receiverType: 3,\n * receiverId: 'agent-001'\n * }}\n * params={{\n * businessId: 'case-001',\n * businessType: 2\n * }}\n * />\n *\n * @example\n * <Chat\n * config={{\n * receiverType: 3,\n * receiverId: 'agent-001'\n * }}\n * params={{\n * businessId: 'case-001',\n * businessType: 2\n * }}\n * // 钩子配置\n * hooks={{\n * onBeforeSend: (message, files) => {\n * if (!message?.trim()) {\n * message.error('请输入消息内容')\n * return false\n * }\n * return true\n * },\n * onAfterSend: () => {\n * console.log('消息发送完成')\n * }\n * }}\n * // 布局配置\n * layout={{\n * preview: true,\n * sender: {\n * props: {\n * placeholder: '请输入您的问题...'\n * }\n * }\n * }}\n * // 服务配置\n * services={{\n * http: {\n * config: {\n * baseURL: '/api',\n * timeout: 30000\n * }\n * },\n * websocket: {\n * baseURLs: ['/api', '/api/backup']\n * }\n * }}\n * />\n *\n */\nexport default forwardRef<ChatHandle, ChatProps>(({ theme, params, userInfo, hooks, layout, config, services }: ChatProps, ref) => {\n /** 创建聊天状态管理器实例 */\n const chatStore = useMemo(() => createChatStore(), [])\n /** 输入框组件的引用 */\n const senderRef = useRef<ChatSenderHandle>()\n\n useEffect(() => {\n // console.log('hooks changed:', hooks)\n chatStore.setHooks(hooks)\n }, [hooks])\n\n useEffect(() => {\n chatStore.setUserInfo(userInfo)\n }, [userInfo])\n useEffect(() => {\n // console.log('layout changed:', layout)\n chatStore.setLayout(layout, config?.receiverType)\n }, [layout, config?.receiverType])\n useEffect(() => {\n // console.log('params changed:', params)\n chatStore.setParams(params)\n }, [params])\n\n useDeepEffect(() => {\n chatStore.setServices(services)\n }, [services])\n useDeepEffect(() => {\n if (config?.conversationId) {\n chatStore.switchConversation(config.conversationId)\n return\n }\n if (config?.receiverId && config?.receiverType === 3) {\n chatStore.switchAgentConversation(config.receiverId, config.conversationStrategy)\n }\n }, [config])\n\n /** 接收者状态的快照 */\n const receiverState = useSnapshot(chatStore.receiver)\n /** 配置状态的快照 */\n const configState = useSnapshot(chatStore.config)\n useImperativeHandle(\n ref,\n () => ({\n sendMessage: chatStore.sendMessage,\n switchAgentConversation: chatStore.switchAgentConversation,\n switchConversation: chatStore.switchConversation,\n createConversation: chatStore.createConversation,\n setReferences: chatStore.setReferences,\n setMessage: chatStore.setContent,\n setMessageParams: chatStore.setContentParams,\n setFiles: chatStore.setFileList,\n setServices: chatStore.setServices,\n setParams: chatStore.setParams,\n senderFocus: (options) => {\n senderRef.current?.focus(options)\n }\n }),\n []\n )\n const hasPreView = useMemo(() => {\n return (\n shouldRender(configState.layout.preview as ChatLayout['preview']) &&\n (!!(configState.preview.file as FileUrlType).fileUrl || !!(configState.preview.file as FileTextType).content)\n )\n }, [configState.layout.preview, configState.preview.file])\n\n /** 分割面板尺寸状态 */\n const [sizes, setSizes] = useState([0, '100%'])\n /** 设置分割面板尺寸 */\n const setSplitterSizes = (sizes: (number | string)[]) => {\n setSizes(sizes)\n }\n useEffect(() => {\n if (hasPreView) {\n setSplitterSizes(['70%', '30%'])\n } else {\n setSplitterSizes([0, '100%'])\n }\n }, [hasPreView])\n // const [a, setA] = useState([\n // getWebSocketUrl(`/api/lolr/conversation/ws/subscribe?NS-TOKEN=${tokenManager.get()}&a=2`, isLocalhost() ? '192.168.6.23' : ''),\n // getWebSocketUrl(`/api/lolr/conversation/ws/subscribe?NS-TOKEN=${tokenManager.get()}`, isLocalhost() ? '192.168.6.23' : '')\n // ])\n /** 主 WebSocket 连接,用于接收实时消息 */\n useWebSocket({\n url: configState.services.websocketUrls?.[0],\n onMessage: chatStore.acceptMessage,\n clientHeartbeat: false,\n reconnectInterval: 10000\n })\n /** 备用 WebSocket 连接,提供一体机saas可用性 */\n useWebSocket({\n url: configState.services.websocketUrls?.[1],\n onMessage: chatStore.acceptMessage,\n clientHeartbeat: false,\n reconnectInterval: 10000\n })\n\n // 测试代码:将数据转为流返回(已注释)\n // function streamData(data: string, callback: (chunk: string, completed: boolean) => void): () => void {\n // let index = 0\n // const interval = setInterval(() => {\n // if (index < data.length) {\n // const chunk = data.slice(index, index + 10)\n // index += 10\n // callback(chunk, index >= data.length)\n // } else {\n // clearInterval(interval)\n // }\n // }, 50)\n\n // // 返回取消函数\n // return () => {\n // clearInterval(interval)\n // }\n // }\n useEffect(() => {\n configState.hooks?.onBeforeInit?.()\n // setTimeout(() => {\n // setA([a[0]])\n // }, 10000)\n // const data = `\\n<think>\\n\\n您的问题是“帮我调出这些主要证据证人原始资料”,我理解您是想问:如何调取本案中主要证据和证人的原始资料?请稍候,我将围绕您的问题检索相关信息……\\n\\n</think>\\n\\n\\n根据您提出的请求,现将本案中**与罗先进相关的主要证据和证人原始资料**进行整理,并按照**案卷引用格式**提供查阅方式。\\n\\n---\\n\\n## 一、**主要证据原始资料**\\n\\n### 1. **罗先进借他人名义持有、买卖股票的事实**\\n- **文件名称**:第29卷.pdf \\n- **内容概述**:记载了罗先进通过他人名义持有、买卖股票,并从中获利的情况,可能被用于推断其存在利益输送行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:1,fileName:第29卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=7521087687252336&sid=25504562-d00e-479e-9a38-f02c86daded1'}:::\\n\\n---\\n\\n### 2. **银行流水及资金往来记录**\\n- **文件名称**:第34卷.pdf、第36卷.pdf \\n- **内容概述**:涉及多人的银行流水,可能与罗先进存在资金往来,用于推断其异常交易行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:2,fileName:第34卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=6865514974920901&sid=2bd6b02f-5431-464b-9b78-592812eeb1fa'}:::\\n[引]:::alert type=indexQuote data={index:3,fileName:第36卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=7138173847859108&sid=e19f6aa1-a476-48bb-a593-f9a6ed99a274'}:::\\n\\n---\\n\\n## 二、**主要证人原始资料**\\n\\n### 1. **景晓军**\\n- **文件名称**:第29卷.pdf \\n- **内容概述**:作为罗先进股份转让协议的相对方,其证言可能被用于证明罗先进存在借他人名义持有股票的行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:4,fileName:第29卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=7521087687252336&sid=25504562-d00e-479e-9a38-f02c86daded1'}:::\\n\\n---\\n\\n### 2. **何娟娟、邓翠娥等涉案人员**\\n- **文件名称**:第34卷.pdf \\n- **内容概述**:涉及多人银行流水,可能与罗先进存在资金往来,其证言可能被用于证明异常交易行为。 \\n- **引用方式**:\\n\\n[引]:::alert type=indexQuote data={index:5,fileName:第34卷.pdf,fileUrl:'type=2&datasetId=1992895846377267200&docId=6865514974920901&sid=2bd6b02f-5431-464b-9b78-592812eeb1fa'}:::\\n\\n---\\n\\n## 三、**查阅方式说明**\\n\\n您可通过以下链接访问上述原始资料:\\n\\n- **第29卷.pdf**:[点击查看](type=2&datasetId=1992895846377267200&docId=7521087687252336&sid=25504562-d00e-479e-9a38-f02c86daded1)\\n- **第34卷.pdf**:[点击查看](type=2&datasetId=1992895846377267200&docId=6865514974920901&sid=2bd6b02f-5431-464b-9b78-592812eeb1fa)\\n- **第36卷.pdf**:[点击查看](type=2&datasetId=1992895846377267200&docId=7138173847859108&sid=e19f6aa1-a476-48bb-a593-f9a6ed99a274)\\n\\n---\\n\\n## 四、**建议**\\n\\n如需进一步分析上述证据或证人证言对案件的影响,可继续提供相关材料或提出具体问题。我们将根据案件进展,协助您制定更精准的辩护策略。\"`\n // setTimeout(() => {\n // chatStore.acceptMessage({\n // code: 200,\n // data: {\n // msgContent: '',\n // id: '22222',\n // sendTime: new Date().getTime(),\n // conversationId: '143',\n // type: 'TEXT_MESSAGE_START',\n // sender: { type: 3, id: '1' }\n // }\n // })\n // // 流式返回\n // streamData(data, (chunk, completed) => {\n // chatStore.acceptMessage({\n // code: 200,\n // data: {\n // msgContent: chunk,\n // id: '22222',\n // sendTime: new Date().getTime(),\n // conversationId: '143',\n // type: 'TEXT_MESSAGE_CONTENT',\n // sender: { type: 3, id: '1' }\n // }\n // })\n // if (completed) {\n // chatStore.acceptMessage({\n // code: 200,\n // data: {\n // msgContent: '',\n // id: '22222',\n // sendTime: new Date().getTime(),\n // conversationId: '143',\n // type: 'TEXT_MESSAGE_END',\n // sender: { type: 3, id: '1' }\n // }\n // })\n // }\n // })\n // }, 10000)\n }, [])\n return (\n <XProvider theme={{ cssVar: true, ...theme }}>\n <ChatProvider store={chatStore}>\n <Spin spinning={receiverState.loading} wrapperClassName=\"full-spin\">\n <Flex vertical className={classNames(styles.nsChatLayout, 'zero-chat-layout', 'height-full')}>\n {/** 全局头部区域 */}\n <RenderWrapper control={configState.layout.globalHeader} DefaultComponent={ChatHeader} />\n <Flex className=\"full-scroll\">\n {/** 左侧面板区域 */}\n <RenderWrapper control={configState.layout.leftPanel} />\n\n {/** 会话列表面板 */}\n <RenderWrapper control={configState.layout.conversationList} DefaultComponent={ConversationListPanel} />\n <Splitter className=\"flex-1\" onResize={setSplitterSizes}>\n {/** 文件预览面板 */}\n <Splitter.Panel collapsible={false} min={600} size={sizes[0]}>\n {hasPreView && (\n <>\n {/** 文件URL预览 */}\n {(configState.preview.file as FileUrlType).fileUrl && (\n <Flex vertical className=\"height-full\">\n <Flex justify=\"space-between\" align=\"center\" gap={16} className={styles.nsPreviewHeader}>\n <div className={classNames(styles.nsPreviewHeaderTitle, 'text-ellipsis')} title={configState.preview.file.fileName}>\n {configState.preview.file.fileName}\n </div>\n <Flex gap={8} justify=\"center\" align=\"center\">\n <Button\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => downloadFile((configState.preview.file as FileUrlType).fileUrl, configState.preview.file.fileName)}\n >\n 下载\n </Button>\n <Button onClick={() => chatStore.setPreview()}>关闭</Button>\n </Flex>\n </Flex>\n <div className=\"full-scroll\">\n <FilePreview\n {...(configState.preview.file as FileUrlType)}\n pdfParams={{\n isHasThumbnails: false\n }}\n />\n </div>\n </Flex>\n )}\n {/** 文本内容预览 */}\n {(configState.preview.file as FileTextType).content && (\n <MarkdownEditor\n value={(configState.preview.file as FileTextType).content}\n // onChange={(con) => chatStore.setPreview({ ...configState.preview.file, content: con }, true)}\n onQuote={(text) => {\n chatStore.setReferences({\n type: 2,\n content: {\n name: text\n },\n params: {\n citation: text\n }\n })\n }}\n onDownloadFile={(content, type) =>\n configState.services.request.fileCreate(content, configState.preview.file.fileName, type)\n }\n extraNav={\n <>\n <Tag bordered={false} color=\"default\" className=\"cursor-pointer\" onClick={() => chatStore.setPreview()}>\n <CloseOutlined />\n </Tag>\n </>\n // loading && (\n // <Tag bordered={false} color=\"default\">\n // <Flex gap={4} align=\"center\">\n // <SyncOutlined spin style={{ color: 'var(--ant-color-primary)' }} />\n // 保存中\n // </Flex>\n // </Tag>\n // )\n }\n />\n )}\n </>\n )}\n </Splitter.Panel>\n\n {/** 聊天主体面板 */}\n <Splitter.Panel collapsible={false} max={800} min={400} size={sizes[1]}>\n <Flex vertical className={classNames('height-full')}>\n {/** 聊天区域头部 */}\n <RenderWrapper control={configState.layout.chatHeader} DefaultComponent={ChatHeader} />\n <Flex vertical className={classNames('full-scroll')}>\n <Flex\n justify=\"center\"\n vertical\n gap={24}\n className={classNames('height-full', styles.nsChatBody, 'zero-chat-body', styles.nsBodyWidth)}\n >\n {/** 消息列表区域 */}\n {shouldRender(configState.layout.messageList) && (\n <div className=\"full-scroll\">\n <RenderWrapper control={configState.layout.messageList as ChatLayout['messageList']} DefaultComponent={BubbleListItems} />\n </div>\n )}\n <Flex vertical gap={8}>\n {/** 输入框上方头部 */}\n <RenderWrapper\n control={configState.layout.senderHeader as ChatLayout['senderHeader']}\n DefaultComponent={<div className={styles.nsChatSenderHeader}>我是 {receiverState.active.name}</div>}\n />\n {/** 输入框组件 */}\n <RenderWrapper ref={senderRef} control={configState.layout.sender} DefaultComponent={ChatSender} />\n {/** 免责声明 */}\n <RenderWrapper\n control={configState.layout.disclaimerNotice as ChatLayout['disclaimerNotice']}\n DefaultComponent={<div className={styles.nsDisclaimerNotice}>内容由AI生成,仅供参考,请仔细甄别</div>}\n />\n {/** 输入框下方区域推荐问题 */}\n <RenderWrapper\n control={configState.layout.recommendQuestions as ChatLayout['recommendQuestions']}\n DefaultComponent={\n receiverState?.recommendQuestions?.length > 0 && (\n <Prompts\n vertical\n title=\"推荐问题:\"\n onItemClick={({ data }) => chatStore.sendMessage(data.key)}\n items={receiverState?.recommendQuestions.map((question) => ({\n key: question,\n icon: <FileSearchOutlined />,\n description: question\n }))}\n />\n )\n }\n />\n </Flex>\n {/** 输入框底部区域 */}\n <RenderWrapper control={configState.layout.senderFooter} />\n </Flex>\n </Flex>\n </Flex>\n </Splitter.Panel>\n </Splitter>\n </Flex>\n </Flex>\n </Spin>\n </ChatProvider>\n </XProvider>\n )\n})\n","export const customComponents = {\n appCard: () => import('./AppCard'),\n fileView: () => import('./FileView'),\n indexQuote: () => import('./IndexQuote'),\n mdEdit: () => import('./MdEdit'),\n fileEdit: () => import('./FileEdit'),\n // quoteList: () => import('./QuoteList'),\n think: () => import('./Think'),\n charts: () => import('./Charts')\n}\n","@keyframes loading-line {\n from {\n background-position: 200% 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.loadingMessage {\n position: relative;\n padding-bottom: 6px;\n}\n.loadingMessage::after {\n content: '';\n position: absolute;\n left: 0;\n bottom: 0;\n height: 2px;\n width: 100%;\n background: linear-gradient(90deg, #ff6b23, #af3cb8, #53b6ff);\n background-size: 200% 100%;\n animation: loading-line 1.2s linear infinite;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-text {\n display: none;\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-circle {\n animation: spin 2s linear infinite;\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content {\n gap: 4px;\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc {\n width: 15px;\n height: 15px;\n border: 2px solid transparent;\n border-color: #1890ff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n box-sizing: border-box;\n position: relative;\n clip-path: inset(0 0 30% 0);\n}\n.chatAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc .ant-attachment-list-card-ellipsis-prefix {\n display: none;\n}\n.chatSender:global.ant-sender:focus-within {\n box-shadow: none;\n}\n.chatQuoteMsg {\n margin-top: 4px;\n}\n.chatQuoteMsg:global.ant-bubble > .ant-bubble-content {\n min-height: auto;\n background-color: var(--ant-color-fill-tertiary) !important;\n color: var(--ant-color-text-tertiary);\n}\n.chatQuoteMsg .quoteTooltip {\n max-width: 100%;\n border: 1px solid #000;\n}\n.chatQuoteMsg .quoteTooltip .quoteTooltipContainer {\n max-height: 200px;\n overflow-y: auto;\n background-color: #fff;\n color: #000;\n}\n","import { Attachments, Bubble, BubbleProps } from '@ant-design/x'\nimport { isEmptyObj, markdownToText, RenderMarkdown } from '@zero-library/common'\nimport { Flex, Spin, Tooltip, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { replaceMarkdownTags } from '../core/utils'\nimport { ConversationMessage, InputFile } from '../services'\nimport { ChatLayoutMessageList } from '../stores/types'\nimport { customComponents } from '../ui/common/markdownAlert'\nimport styles from './styles.module.less'\n/**\n * MessageRender 组件属性接口\n */\nexport interface MessageRenderProps {\n /** 消息对象 */\n message: ConversationMessage\n /** 消息气泡位置 */\n placement: BubbleProps['placement']\n /** 文件预览回调 非图片类型文件点击预览 */\n onFilePreview?: (file: InputFile) => void\n /** message自定义标记渲染组件 */\n customComponents?: ChatLayoutMessageList['customComponents']\n}\n\n/**\n * 消息渲染组件\n * 用于渲染聊天消息内容,包括文本、文件附件和引用消息\n */\nexport default ({ message, placement, onFilePreview, customComponents: propsCustomComponents }: MessageRenderProps) => {\n const msgContent = useMemo(\n () => `${message.msgContent || ''}${message.msgContent && message.tempContent ? '\\n\\n' : ''}${message.tempContent || ''}`,\n [message.msgContent, message.tempContent]\n )\n const quoteMsg = useMemo(() => {\n const quoteMsg = {} as { msgFiles?: InputFile[]; msgContent?: string; msgContentText?: string }\n if (message.quoteMsg?.id) {\n if (message.quoteMsg.msgContent) {\n quoteMsg.msgContent = message.quoteMsg.msgContent\n }\n if (message.quoteMsg.msgFiles?.length) {\n quoteMsg.msgFiles = message.quoteMsg.msgFiles\n }\n } else if (message.params) {\n try {\n const citation = JSON.parse(message.params).citation\n if (citation) {\n quoteMsg.msgContent = citation\n }\n } catch (e) {}\n }\n if (quoteMsg.msgContent) {\n quoteMsg.msgContentText = markdownToText(quoteMsg.msgContent)\n }\n return isEmptyObj(quoteMsg) ? null : quoteMsg\n }, [message.params, message.quoteMsg])\n // 文件预览\n const filePreview = (file: InputFile) => {\n if (file.content && !['image'].includes(file.type)) {\n onFilePreview?.(file)\n }\n }\n\n const mergedCustomComponents = useMemo(() => {\n return { ...customComponents, ...propsCustomComponents }\n }, [propsCustomComponents])\n\n return (\n <Flex vertical>\n {!(msgContent || message.msgFiles.length) ? (\n <Typography>\n <Spin size={'small'} />\n </Typography>\n ) : (\n <>\n {msgContent && (\n <Bubble\n placement={placement}\n className={classNames({ [styles.loadingMessage]: message.type })}\n content={<RenderMarkdown content={replaceMarkdownTags(msgContent)} customComponents={mergedCustomComponents} message={message} />}\n />\n )}\n {message.msgFiles?.map((file) => (\n <Bubble\n className=\"m-t-8\"\n key={file.content}\n variant=\"borderless\"\n placement={placement}\n content={\n <div className=\"cursor-pointer\" onClick={() => filePreview(file)}>\n <Attachments.FileCard\n // imageProps={{ preview: false }}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n </div>\n }\n />\n ))}\n {quoteMsg && (\n <Bubble\n className={styles.chatQuoteMsg}\n placement={placement}\n content={\n <Flex vertical gap={8}>\n {quoteMsg.msgContent && (\n <Tooltip\n arrow={false}\n classNames={{\n root: styles.quoteTooltip,\n body: `${styles.quoteTooltipContainer} scroll-fade-in`\n }}\n title={<RenderMarkdown content={quoteMsg.msgContent} />}\n getPopupContainer={(node) => node}\n >\n <Flex>\n <span>【引用消息】:</span>\n <Flex flex={1} className=\"text-ellipsis-2\">\n {quoteMsg.msgContentText}\n </Flex>\n </Flex>\n </Tooltip>\n )}\n {quoteMsg?.msgFiles && (\n <Flex>\n <span>【引用文件】:</span>\n <Flex gap={8} wrap flex={1}>\n {quoteMsg.msgFiles.map((file) => (\n <div key={file.content} className=\"cursor-pointer\" onClick={() => filePreview(file)}>\n <Attachments.FileCard\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n </div>\n ))}\n </Flex>\n </Flex>\n )}\n </Flex>\n }\n />\n )}\n </>\n )}\n </Flex>\n )\n}\n","import { CopyOutlined, DislikeOutlined, LikeOutlined, OpenAIOutlined } from '@ant-design/icons'\nimport { Bubble, BubbleProps, Prompts } from '@ant-design/x'\nimport { BubbleDataType } from '@ant-design/x/es/bubble/BubbleList'\nimport { copyText, htmlToMarkdown, isBoolean, RenderWrapper, shouldRender, UserAvatar } from '@zero-library/common'\nimport { Button, Flex, GetRef } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useSnapshot } from 'valtio'\nimport MessageRender from '../../components/MessageRender'\nimport { ConversationMemberEnum } from '../../core/constants'\nimport { ConversationMessage, MessageSender } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutMessageList, MessageBoxType } from '../../stores/types'\nimport styles from './styles.module.less'\nimport WelcomeItem from './WelcomeItem'\n\ninterface RoleContent {\n id: string\n user: ConversationMemberEnum\n placement: BubbleProps['placement']\n avatar?: any\n}\n\n/* 🌟 消息列表 */\nexport default ({\n firstMessages = [],\n welcomeMessage = true,\n avatar = { user: false, agent: true, other: true },\n agentActions = false,\n customComponents = {}\n}: ChatLayoutMessageList) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n const conversationRoles = useMemo(() => {\n const roles = {} as Record<ConversationMemberEnum, RoleContent>\n if (conversationState.active.member.user) {\n roles.user = {\n id: conversationState.active.member.user.memberId,\n user: 'user',\n placement: 'end',\n avatar: (isBoolean(avatar) ? avatar : avatar?.user) ? (\n <UserAvatar\n size={30}\n avatarSrc={conversationState.active.member.user?.memberAvatar}\n userName={conversationState.active.member.user?.memberName}\n />\n ) : null\n }\n }\n if (conversationState.active.member.agent) {\n roles.agent = {\n id: conversationState.active.member.agent.memberId,\n user: 'agent',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.agent)\n ? { src: conversationState.active.member.agent?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n if (conversationState.active.member.other) {\n roles.other = {\n id: conversationState.active.member.other.memberId,\n user: 'other',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.other)\n ? { src: conversationState.active.member.other?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n return roles\n }, [conversationState.active.member, avatar])\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const welcomeMessageRecord = useMemo(() => {\n const isExist = shouldRender(welcomeMessage)\n return isExist\n ? [\n {\n key: 'placeholder',\n content: <RenderWrapper control={welcomeMessage} DefaultComponent={<WelcomeItem />} />,\n variant: 'borderless'\n } as BubbleDataType\n ]\n : []\n }, [receiverState.active, welcomeMessage])\n\n const questionList = useMemo(\n () =>\n chatMessage?.questionList?.length\n ? [\n {\n key: 'questionList',\n content: (\n <Prompts\n className=\"m-b-16\"\n styles={{\n list: {\n overflow: 'auto'\n }\n }}\n vertical\n items={chatMessage?.questionList.map((question) => ({\n key: question,\n description: <span onClick={() => chatStore.sendMessage(question)}>{question}</span>\n }))}\n />\n ),\n variant: 'borderless',\n avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : [],\n [chatMessage?.questionList]\n )\n const getRole = (sender: MessageSender) => {\n const roleKey = Object.keys(conversationRoles).find((key) => conversationRoles[key].id === sender.id)\n return conversationRoles[roleKey] || ({} as RoleContent)\n }\n const messageRefs = useRef<ObjectType<HTMLDivElement>>({})\n const chatRecords = useMemo(() => {\n return (chatMessage?.message || []).map((message, index) => {\n // let isHasTime = false\n // if (index === 0) {\n // isHasTime = true\n // } else {\n // const lastMessage = chatMessage.message[index - 1]\n // // if((lastMessage.sendDate - message.sendDate) > 60 * 60 * 1000)\n // }\n const role = getRole(message.sender)\n return {\n key: message.id,\n placement: role.placement,\n variant: 'borderless',\n avatar: role.avatar,\n content: (\n <div\n ref={(el) => {\n messageRefs.current[message.id] = el\n }}\n >\n <MessageRender\n message={message as ConversationMessage}\n placement={role.placement}\n customComponents={customComponents}\n onFilePreview={(file) =>\n chatStore.setPreview({\n fileUrl: file.content,\n suffix: file.extension,\n fileName: file.name\n })\n }\n />\n </div>\n ),\n footer: (\n <Flex>\n {/* {conversationRoles.other && role.user !== 'agent' && (\n <Button\n onClick={() =>\n chatStore.setReferences({\n type: 3,\n content: {\n id: message.id,\n // 内容需要增加其它参数渲染,比如citations\n msgContent: message.msgContent,\n msgFiles: message.msgFiles as InputFile[]\n }\n })\n }\n color=\"default\"\n variant=\"text\"\n size=\"small\"\n icon={<SignatureOutlined />}\n />\n )} */}\n {/* 智能体功能 */}\n {role.user === 'agent' && (\n <>\n <Button\n onClick={() => {\n const container = messageRefs.current[message.id]\n if (!container) return\n const markdown = htmlToMarkdown(container?.innerHTML) || message.msgContent\n copyText(markdown)\n }}\n color=\"default\"\n variant=\"text\"\n size=\"small\"\n icon={<CopyOutlined />}\n />\n <Button\n color={message.msgFeedback === 1 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<LikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 1, index)}\n />\n <Button\n color={message.msgFeedback === 2 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<DislikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 2, index)}\n />\n <RenderWrapper\n control={agentActions}\n ctx={{\n message,\n get dom() {\n return messageRefs.current[message.id]\n }\n }}\n />\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ShareAltOutlined />} /> */}\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ReloadOutlined />} /> */}\n </>\n )}\n </Flex>\n )\n // ...(isHasTime\n // ? { rootClassName: styles.hasSendTime, classNames: { header: styles.sendTime }, header: <span>{formatDate(message.sendDate)}</span> }\n // : {})\n } as BubbleDataType\n })\n }, [chatMessage?.message])\n\n const firstMessagesRecord = useMemo(() => {\n return (firstMessages || []).map((firstMessage, index) => {\n const { member, ...args } = firstMessage\n return {\n key: `firstMessage-${index}`,\n placement: conversationRoles[member]?.placement,\n avatar: conversationRoles[member]?.avatar,\n // avatar: { style: { visibility: 'hidden' } }\n variant: 'borderless',\n ...args\n } as BubbleDataType\n })\n }, [firstMessages, conversationRoles])\n const bubbleListItems = useMemo(() => {\n const list = []\n list.push(...firstMessagesRecord)\n list.push(...chatRecords, ...questionList)\n if (list.length) {\n return list\n }\n return [...welcomeMessageRecord]\n }, [chatRecords, questionList, welcomeMessageRecord, firstMessagesRecord])\n\n const listRef = useRef<GetRef<typeof Bubble.List>>(null)\n // 真实控制是否自动滚动的 ref(不会触发渲染)\n const autoScrollRef = useRef(true)\n const handleScroll = (el: any) => {\n const target = el.target\n // console.log('handleScroll', target.scrollHeight - target.scrollTop - target.clientHeight)\n const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight\n // 小于 150px 表示接近底部,允许自动滚动\n autoScrollRef.current = distanceToBottom < 150\n }\n useEffect(() => {\n // console.log('bubbleListItems2')\n autoScrollRef.current = true\n }, [bubbleListItems.length])\n useEffect(() => {\n const el = listRef.current?.nativeElement\n if (!el || !bubbleListItems.length) return\n // console.log('bubbleListItems', bubbleListItems, autoScrollRef.current)\n // 只有当用户在底部(autoScroll = true)时,才滚动到底\n if (autoScrollRef.current) {\n setTimeout(() => {\n if (autoScrollRef.current) {\n listRef.current?.scrollTo({\n key: bubbleListItems[bubbleListItems.length - 1].key,\n block: 'end'\n })\n }\n }, 100)\n }\n }, [bubbleListItems])\n return (\n <Bubble.List\n autoScroll={false}\n key={conversationState.active.id}\n ref={listRef}\n items={bubbleListItems}\n className={classNames(styles.nsBubbleList, 'height-full', 'scroll-fade-in', 'zero-chat-bubbles')}\n onScroll={handleScroll}\n />\n )\n}\n",".nsConversationListPanel {\n width: 360px;\n}\n.nsConversations {\n padding: 0 24px;\n}\n.nsConversations :global .ant-conversations-group-title {\n padding: 0;\n}\n.nsConversations :global .ant-conversations-group-title .ant-typography {\n color: #878aab;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item {\n padding-left: 16px;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item .ant-conversations-label {\n color: rgba(0, 0, 0, 0.88);\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item.ant-conversations-item-active .ant-conversations-label {\n color: var(--ant-color-primary);\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-start .ant-bubble-content-filled {\n background-color: transparent;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-end .ant-bubble-content-filled {\n background-color: var(--ant-color-primary-bg);\n}\n.nsChatHeader {\n padding: 8px 16px;\n border-bottom: 1px solid #eee;\n}\n.nsChatHeader .nsChatTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatHeader .nsChatHeaderPopover {\n max-height: 500px;\n width: 300px;\n display: flex;\n flex-direction: column;\n}\n.nsChatHeader .nsChatHeaderPopover :global .ant-popover-inner-content {\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n.chatWelcomeWrap :global .ant-prompts .ant-prompts-list {\n overflow: auto;\n}\n.chatWelcomeWrap .chatWelcome :global .ant-welcome-icon > img {\n border-radius: 10px;\n max-width: initial;\n}\n.chatWelcomeWrap .chatWelcomePrompts {\n width: 300px;\n}\n.nsSenderListTitle {\n width: 300px;\n}\n.nsSenderList :global .ant-list-items {\n max-height: 350px;\n overflow-y: auto;\n margin-right: -12px;\n padding-right: 12px;\n}\n.nsSenderList.historyList :global .ant-list-items {\n max-height: initial;\n}\n.nsSenderList .nsSenderListItem {\n background-color: #f6f6f6;\n color: #6b6b6b !important;\n border-radius: 5px;\n width: 300px;\n padding: 6px 12px !important;\n margin-top: 12px;\n font-size: 14px;\n cursor: pointer;\n}\n.nsSenderList .nsSenderListFooter {\n font-size: 12px;\n}\n.nsChatUserName {\n font-size: 16px;\n font-weight: bold;\n}\n.nsSenderReferenceHeaderTitle:global > .ant-sender-header-title {\n overflow: hidden;\n}\n.nsSenderReferenceHeaderContent {\n padding: 0 !important;\n}\n.nsAvatarListContainer {\n height: 300px;\n padding: 30px 48px 30px 24px;\n overflow-y: auto;\n margin-right: -24px;\n}\n.nsAvatarListContainer .nsAvatarList .nsAvatarListItem:hover {\n opacity: 90%;\n}\n.nsAvatarListContainer .nsAvatarList .nsAvatarListItem .nsAvatarListItemIcon.nsAvatarListItemIconActive {\n outline: 2px solid var(--ant-color-primary);\n}\n.nsAvatarListContainer .nsAvatarList .nsAvatarListItem .nsAvatarListItemName {\n font-size: 12px;\n}\n","import { Prompts, Welcome } from '@ant-design/x'\nimport { RenderWrapper } from '@zero-library/common'\nimport { Avatar, Space } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutWelcomeMessage } from '../../stores/types'\nimport styles from './styles.module.less'\n\nexport default ({ icon = true, title = true, description = true, prompts = true }: ChatLayoutWelcomeMessage) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n return (\n <Space direction=\"vertical\" size={16} className={styles.chatWelcomeWrap}>\n <Welcome\n className={classNames(styles.chatWelcome, 'p-t-32')}\n variant=\"borderless\"\n icon={<RenderWrapper control={icon} DefaultComponent={<Avatar shape=\"square\" size={58} src={receiverState.active.logo} />} />}\n title={<RenderWrapper control={title} DefaultComponent={`你好,我是${receiverState.active.name || ''}`} />}\n description={\n <RenderWrapper\n control={description}\n DefaultComponent={<div dangerouslySetInnerHTML={{ __html: receiverState.active.description || '' }}></div>}\n />\n }\n />\n\n <RenderWrapper\n control={prompts}\n DefaultComponent={\n receiverState?.recommendQuestions?.length > 0 && (\n <Prompts\n className=\"m-t-16\"\n wrap\n onItemClick={({ data }) => chatStore.sendMessage(data.key)}\n items={[\n {\n key: '1',\n label: '🤔 推荐问题:',\n children: receiverState?.recommendQuestions.map((question) => ({\n key: question,\n description: <span className={classNames(styles.chatWelcomePrompts, 'text-ellipsis')}>{question}</span>\n }))\n }\n ]}\n />\n )\n }\n />\n </Space>\n )\n}\n","import { CloseOutlined, CommentOutlined, PlusOutlined } from '@ant-design/icons'\nimport { RenderWrapper } from '@zero-library/common'\nimport { Avatar, Button, Flex, Popover, Space } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutHeader } from '../../stores/types'\nimport AgentCharacter from './AgentCharacter'\nimport ConversationList from './ConversationList'\nimport styles from './styles.module.less'\n\nexport default ({\n title = true,\n avatar = true,\n closeBtn = false,\n newConversationBtn = true,\n agentCharacter = true,\n conversationListBtn = true\n}: ChatLayoutHeader) => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const configState = useSnapshot(chatStore.config)\n return (\n <>\n <Flex justify=\"space-between\" align=\"center\" className={classNames(styles.nsChatHeader, 'zero-chat-header')}>\n <Flex gap={4} align=\"center\">\n <RenderWrapper control={avatar} DefaultComponent={<Avatar size={22} src={receiverState.active.logo} alt={receiverState.active.name} />} />\n <RenderWrapper control={title} DefaultComponent={<div className={styles.nsChatTitle}>{receiverState.active.name}</div>} />{' '}\n </Flex>\n <Space size={2}>\n <RenderWrapper control={agentCharacter} DefaultComponent={AgentCharacter} />\n <RenderWrapper\n control={newConversationBtn}\n DefaultComponent={\n <Button title=\"新建会话\" type=\"text\" size=\"large\" icon={<PlusOutlined />} onClick={() => chatStore.createConversation()} />\n }\n />\n\n <RenderWrapper\n control={conversationListBtn}\n DefaultComponent={\n <Popover\n getPopupContainer={(e) => e}\n placement=\"bottom\"\n classNames={{ body: styles.nsChatHeaderPopover }}\n content={<ConversationList />}\n trigger={['click']}\n >\n <Button title=\"历史会话\" type=\"text\" size=\"large\" icon={<CommentOutlined />} />\n </Popover>\n }\n />\n\n <RenderWrapper\n control={closeBtn}\n DefaultComponent={<Button title=\"关闭\" type=\"text\" size=\"large\" onClick={configState.hooks?.onHeaderClose} icon={<CloseOutlined />} />}\n />\n </Space>\n </Flex>\n </>\n )\n}\n","import { Avatar } from 'antd'\nimport { useEffect } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport CharacterList from './CharacterList'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const characterState = useSnapshot(chatStore.character)\n useEffect(() => {\n if (receiverState.active.id && receiverState.active.type === 3) {\n chatStore.getCharacters(receiverState.active.id)\n }\n }, [receiverState.active.id])\n\n return (\n characterState.active?.id && (\n <>\n <div title=\"性格\">\n <Avatar onClick={chatStore.openCharacterList} className=\"cursor-pointer\" src={characterState.active.logo} />\n </div>\n {characterState.open && <CharacterList />}\n </>\n )\n )\n}\n","import { Avatar, Col, Flex, Modal, Row } from 'antd'\nimport classNames from 'classnames'\nimport { useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const characterState = useSnapshot(chatStore.character)\n const [activeCharacter, setActiveCharacter] = useState(characterState.active)\n return (\n <Modal\n width={500}\n title=\"选择性格\"\n maskClosable={false}\n open={characterState.open}\n onCancel={chatStore.closeCharacterList}\n loading={characterState.loading}\n okText=\"切换性格\"\n onOk={() => chatStore.switchCharacter(activeCharacter)}\n confirmLoading={characterState.switchLoading}\n >\n <div className={styles.nsAvatarListContainer}>\n <Row wrap gutter={[16, 32]} className={styles.nsAvatarList}>\n {characterState.list.map((item) => (\n <Col span={6} key={item.id}>\n <Flex vertical align=\"center\" className={styles.nsAvatarListItem} onClick={() => setActiveCharacter(item)}>\n <Avatar\n className={classNames(styles.nsAvatarListItemIcon, 'cursor-pointer', {\n [styles.nsAvatarListItemIconActive]: activeCharacter.id === item.id\n })}\n size={50}\n // onClick={openCharacterList}\n src={<img src={item.logo} alt=\"头像\" />}\n />\n <div className={styles.nsAvatarListItemName}>{item.characterName}</div>\n </Flex>\n </Col>\n ))}\n {/* <Col span={6}>\n <Flex vertical align=\"center\" className={styles.nsAvatarListItem} onClick={() => onOpenUpdateCharacter(1)}>\n <PlusCircleFilled className={classNames(styles.nsAvatarListItemIcon, 'cursor-pointer')} style={{ fontSize: 50, color: '#eee' }} />\n <div className={styles.nsAvatarListItemName}>自定义</div>\n </Flex>\n </Col> */}\n </Row>\n </div>\n </Modal>\n )\n}\n","import { DeleteOutlined, RedoOutlined } from '@ant-design/icons'\nimport { Conversations } from '@ant-design/x'\nimport type { Conversation } from '@ant-design/x/es/conversations/interface'\nimport { useDebounce } from '@zero-library/common'\nimport { Empty, Spin } from 'antd'\nimport { useEffect, useMemo } from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationsState = useSnapshot(chatStore.conversations)\n const conversationState = useSnapshot(chatStore.conversation)\n\n const getConversations = useDebounce(() => {\n chatStore.getConversations(receiverState.active.id, 3)\n }, 300)\n\n useEffect(() => {\n if (receiverState.active.id) {\n getConversations()\n }\n }, [receiverState.active.id, conversationsState.updateIndex])\n\n const conversationList = useMemo(() => {\n return conversationsState.list.items.filter((item) => item.label)\n }, [conversationsState.list.items])\n return (\n <>\n <div className=\"height-full scroll-fade-in\" id=\"scrollableDiv\">\n {conversationList.length ? (\n <InfiniteScroll\n dataLength={conversationList.length}\n next={() => {\n console.log('next')\n // chatStore.getConversations(receiverState.active.id, conversationsState.list.lastId)\n }}\n hasMore={false}\n loader={\n <div className=\"text-center\">\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n }\n style={{ overflow: 'hidden' }}\n scrollableTarget=\"scrollableDiv\" // 👈 指定滚动容器\n >\n <Conversations\n className={styles.nsConversations}\n items={conversationList as Conversation[]}\n activeKey={conversationState.active.id}\n onActiveChange={async (id) => chatStore.switchConversation(id)}\n groupable\n menu={(conversation) => ({\n items: [\n {\n label: '删除会话',\n key: 'delete',\n icon: <DeleteOutlined />,\n danger: true\n }\n ],\n onClick: (menuInfo) => {\n menuInfo.domEvent.stopPropagation()\n if (menuInfo.key === 'delete') {\n chatStore.delConversation(conversation.id)\n }\n }\n })}\n />\n </InfiniteScroll>\n ) : (\n <Empty description=\"暂无会话记录\" image={Empty.PRESENTED_IMAGE_SIMPLE} />\n )}\n </div>\n </>\n )\n}\n","import { CloudUploadOutlined } from '@ant-design/icons'\nimport { Attachments } from '@ant-design/x'\nimport { Attachment } from '@ant-design/x/es/attachments'\nimport { getFileSuffixName, isNullOrUnDef, isNumber, isObject, useDebounce, useRefState } from '@zero-library/common'\nimport { App } from 'antd'\nimport { RcFile, UploadFile } from 'antd/lib/upload'\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react'\nimport { FileUploadConfig, InputFile } from '../services'\nimport styles from './styles.module.less'\n/**\n * 附件组件属性接口\n */\nexport interface AttachmentsProps {\n /** 文件上传函数,接收 FormData 并返回上传结果 */\n fileUpload: (formData: FormData) => Promise<R<InputFile>>\n /** 文件上传配置列表,定义允许的文件类型和大小限制 */\n fileUploadConfig?: FileUploadConfig[]\n /** 额外的上传参数,会附加到 FormData 中 */\n extraParams?: ObjectType<string | undefined>\n /** 当前文件列表 */\n fileList?: InputFile[]\n /** 文件列表变化回调函数 */\n onChange: (fileList: InputFile[]) => void\n}\n/**\n * 附件文件类型,继承自 Ant Design X 的 Attachment 类型\n */\ntype AttachedFile = Attachment & InputFile\n\n// 扩展属性(未来可能需要)\n// {\n// extension: string - 文件扩展名\n// }\n/**\n * 附件上传组件\n * 支持多文件上传、文件类型验证、文件大小限制等功能\n */\nexport default forwardRef(({ fileUpload, fileUploadConfig = [], fileList = [], onChange, extraParams }: AttachmentsProps, ref) => {\n const { message } = App.useApp()\n const fileListRef = useRef<InputFile[]>([])\n const [attachedFiles, setAttachedFiles, getAttachedFiles] = useRefState<AttachedFile[]>([])\n // 初始化 fileList 映射为 Attachments 所需格式\n useEffect(() => {\n if (JSON.stringify(fileList) !== JSON.stringify(fileListRef.current)) {\n fileListRef.current = fileList\n const mapped: AttachedFile[] = fileList.map((file) => ({\n ...file,\n uid: file.content,\n url: file.content,\n status: 'done'\n }))\n setAttachedFiles(mapped)\n }\n }, [fileList])\n useEffect(() => {\n // console.log('attachedFiles', attachedFiles)\n const files = attachedFiles\n .filter((file) => file.status === 'done')\n .map((file) => {\n const f = { ...file }\n delete f.status\n delete f.uid\n delete f.size\n delete f.url\n return f as unknown as InputFile\n })\n fileListRef.current = files\n onChange(files)\n }, [attachedFiles])\n const onErrorTip = useDebounce((errorMsg: string) => {\n message.error(errorMsg)\n }, 300)\n /** 根据文件类型找到对应的 upload config */\n const findConfigByFile = (file: RcFile): FileUploadConfig | undefined => {\n return fileUploadConfig.find((cfg) => cfg.allowedFileTypes?.includes(getFileSuffixName(file.name).toLocaleUpperCase()))\n }\n\n const onBeforeUpload = (files: RcFile[]) => {\n // console.log('onBeforeUpload', maxFileCount, files, attachedFiles)\n // 多规则支持:逐个文件校验\n for (const file of files) {\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name} (${file.type})`)\n return Promise.reject(false)\n }\n\n // 校验数量\n if (isNumber(cfg.maxFileCount)) {\n const currentCount = attachedFiles.filter((f) => cfg.allowedFileTypes.includes(getFileSuffixName(f.name || '').toLocaleUpperCase())).length\n\n if (currentCount + 1 > cfg.maxFileCount) {\n onErrorTip(`【${file.name}】所属类型最多只能上传 ${cfg.maxFileCount} 个文件`)\n return Promise.reject(false)\n }\n }\n }\n }\n const onCustomRequest = async ({ file }: any) => {\n // console.log('onCustomRequest', file)\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name}`)\n return\n }\n\n // 校验大小\n if (cfg.maxFileSize && file.size > cfg.maxFileSize * 1024 * 1024) {\n onErrorTip(`文件大小不能超过 ${cfg.maxFileSize} MB`)\n return\n }\n // console.log('上传文件列表1:', file)\n setAttachedFiles([\n ...getAttachedFiles(),\n {\n uid: file.uid,\n status: 'uploading',\n percent: 70,\n size: file.size,\n type: file.type,\n name: file.name\n } as AttachedFile\n ])\n try {\n const formData = new FormData()\n formData.append('file', file)\n if (isObject(extraParams)) {\n Object.keys(extraParams).forEach((key) => {\n if (isNullOrUnDef(extraParams[key])) return\n formData.append(key, extraParams[key])\n })\n }\n // 发送文件到后端\n const { data } = await fileUpload(formData)\n\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...data!, uid: data!.content, url: data.content, status: 'done', size: f.size }\n } else {\n return f\n }\n })\n )\n } catch (error) {\n console.log('上传文件错误:', error)\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...f, status: 'error', description: '上传失败' }\n } else {\n return f\n }\n })\n )\n }\n }\n const onRemove = (file: UploadFile<any>) => {\n // 删除文件\n setAttachedFiles(attachedFiles.filter((f) => f.uid !== file.uid))\n }\n useImperativeHandle(\n ref,\n () => ({\n validateFile: () => {\n const files = getAttachedFiles()\n const uploadingFiles = files.filter((file) => file.status === 'uploading')\n if (uploadingFiles.length > 0) {\n onErrorTip('请等待所有文件上传完成')\n return false\n }\n const errorFiles = files.filter((file) => file.status === 'error')\n if (errorFiles.length > 0) {\n onErrorTip('请检查上传失败的文件')\n return false\n }\n return true\n }\n }),\n []\n )\n\n const acceptStr = useMemo(() => {\n const allTypes = fileUploadConfig.flatMap((cfg) => cfg.allowedFileTypes || [])\n return allTypes.length ? allTypes.join(',') : undefined\n }, [fileUploadConfig])\n return (\n <Attachments\n className={styles.chatAttachments}\n accept={acceptStr}\n multiple={true}\n customRequest={onCustomRequest}\n beforeUpload={(file, files) => onBeforeUpload(files)}\n items={attachedFiles}\n onRemove={onRemove}\n overflow=\"wrap\"\n placeholder={(type) =>\n type === 'drop'\n ? { title: '将文件放到这里' }\n : {\n icon: <CloudUploadOutlined />,\n title: '提交文件',\n description: (\n <div>\n <div>单击或拖动文件到此区域进行上传; </div>\n {/* {allowedFileTypes && <div>支持扩展名:{allowedFileTypes}; </div>} */}\n </div>\n )\n }\n }\n />\n )\n})\n","import { PaperClipOutlined } from '@ant-design/icons'\nimport { Sender, Suggestion } from '@ant-design/x'\nimport { useSyncInput } from '@zero-library/common'\nimport { Badge, Button, ButtonProps, Flex, GetRef } from 'antd'\nimport { forwardRef, useImperativeHandle, useRef } from 'react'\nimport { FileUploadConfig, InputFile } from '../services'\nimport ChatSendAttachments, { AttachmentsProps } from './Attachments'\nimport styles from './styles.module.less'\n\n/**\n * ChatSender 组件暴露的方法接口\n */\nexport interface ChatSenderHandle {\n /** 聚焦输入框 */\n focus: (options?: { cursor?: 'start' | 'end' }) => void\n}\n/**\n * 文件上传配置接口\n */\ninterface FileUpload {\n /** 上传时的额外参数 */\n params?: ObjectType<any>\n /** 文件上传配置列表 */\n config: FileUploadConfig[]\n /** 文件上传请求函数 */\n request: AttachmentsProps['fileUpload']\n}\n\n/**\n * ChatSender 组件属性接口\n */\nexport interface SenderProps {\n /** 输入框占位符 */\n placeholder?: string\n /** 输入框内容 */\n content?: string\n /** 文件列表 */\n fileList?: InputFile[]\n /** 是否打开文件选择头部 */\n headerOpen?: boolean\n /** 是否正在发送消息 */\n loading?: boolean\n /** 内容变化回调 */\n onContentChange: (value: string) => void\n /** 文件列表变化回调 */\n onFileListChange: (files: InputFile[]) => void\n /** 头部打开状态变化回调 */\n onHeaderOpenChange: (open: boolean) => void\n /** 发送消息回调 */\n onSend: () => void\n /** 取消发送回调 */\n onCancel?: () => void\n /** 输入框聚焦回调 */\n onFocus?: () => void\n /** 头部额外内容 */\n extraHeader?: React.ReactNode\n /** 底部额外内容 */\n extraFooter?: React.ReactNode\n /** 底部下方额外内容 */\n extraFooterBelow?: React.ReactNode\n /** 发送按钮属性 */\n sendBtnProps?: ButtonProps\n /** 文件上传配置 */\n fileUpload?: FileUpload\n}\n\nexport default forwardRef<ChatSenderHandle, SenderProps>(\n (\n {\n placeholder,\n content,\n fileList = [],\n headerOpen = false,\n loading = false,\n onContentChange,\n onFileListChange,\n onHeaderOpenChange,\n onSend,\n onCancel,\n onFocus,\n extraHeader,\n extraFooter,\n extraFooterBelow,\n sendBtnProps,\n fileUpload\n },\n ref\n ) => {\n const senderRef = useRef<GetRef<typeof Sender>>(null)\n const { inputValue, setInputValue } = useSyncInput(content || '', onContentChange)\n\n const attachmentsNode = (fileUpload?.config?.length ?? 0) > 0 && (\n <Badge dot={!!fileList?.length && !headerOpen}>\n <Button type=\"text\" icon={<PaperClipOutlined />} onClick={() => onHeaderOpenChange(!headerOpen)} />\n </Badge>\n )\n\n const attachmentsRef = useRef<any>()\n const senderHeader = (\n <>\n <Sender.Header title=\"选择文件\" open={headerOpen} onOpenChange={onHeaderOpenChange}>\n <ChatSendAttachments\n ref={attachmentsRef}\n fileList={fileList}\n fileUpload={fileUpload.request}\n onChange={onFileListChange}\n fileUploadConfig={fileUpload.config}\n extraParams={fileUpload.params}\n />\n </Sender.Header>\n {extraHeader}\n </>\n )\n const onSubmit = () => {\n if (!attachmentsRef.current?.validateFile || attachmentsRef.current.validateFile()) {\n onSend()\n }\n }\n\n // 暴露方法给外部组件\n useImperativeHandle(\n ref,\n () => ({\n focus: (options?: { cursor?: 'start' | 'end' }) => {\n senderRef.current?.focus(options)\n }\n }),\n []\n )\n\n return (\n <Suggestion items={[]} onSelect={(itemVal) => setInputValue(`[${itemVal}]:`)}>\n {({}) => (\n <Sender\n className={styles.chatSender}\n ref={senderRef}\n value={inputValue}\n header={senderHeader}\n onSubmit={onSubmit}\n onChange={setInputValue}\n onFocus={onFocus}\n autoSize={{ minRows: 2, maxRows: 6 }}\n // prefix={attachmentsNode}\n // loading={loading}\n onCancel={onCancel}\n footer={({ components }) => {\n const { SendButton, LoadingButton } = components\n return (\n <Flex vertical>\n <Flex justify=\"space-between\" align=\"center\" gap={12}>\n <Flex className=\"flex-1\" gap={6} align=\"center\">\n {attachmentsNode}\n {extraFooter}{' '}\n </Flex>\n <Flex align=\"center\" gap={6}>\n {/* <SpeechButton /> */}\n {loading ? <LoadingButton disabled={false} /> : <SendButton {...sendBtnProps} />}\n </Flex>\n </Flex>\n {extraFooterBelow}\n </Flex>\n )\n }}\n actions={false}\n placeholder={placeholder || '有什么我能帮您的吗?'}\n />\n )}\n </Suggestion>\n )\n }\n)\n","import { EnterOutlined } from '@ant-design/icons'\nimport { Sender } from '@ant-design/x'\nimport { isFunction, markdownToText, RenderWrapper, shouldRender } from '@zero-library/common'\nimport { Button, Flex, Typography } from 'antd'\nimport { forwardRef, useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport ChatSender, { ChatSenderHandle } from '../../components/ChatSender'\nimport { FileUploadConfig, InputFile } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport { ChatLayoutSender, MessageBoxType } from '../../stores/types'\nimport FeaturesRenderer from './FeaturesRenderer'\nimport SenderPromptsItems from './SenderPromptsItems'\nimport styles from './styles.module.less'\n\nexport default forwardRef<ChatSenderHandle, ChatLayoutSender>(\n ({ placeholder, extraBtn = false, referencesBtn = false, sendBtnProps, footerBelow = false, prompts = true }, ref) => {\n const chatStore = useChatStore()\n\n const configState = useSnapshot(chatStore.config)\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const referenceContent = useMemo(() => {\n const content = chatMessage.references?.content?.name\n if (content) {\n return markdownToText(content)\n }\n }, [chatMessage.references])\n const referenceHandle = (con: string) => {\n if (chatMessage?.loading) return\n chatStore.setContent(con)\n chatStore.sendMessage()\n }\n return (\n <Flex vertical gap={8} className=\"zero-chat-sender\">\n {/* 🌟 提示词 */}\n <RenderWrapper control={prompts} DefaultComponent={SenderPromptsItems} />\n <ChatSender\n ref={ref}\n placeholder={placeholder}\n content={chatMessage.content}\n fileList={chatMessage.files as InputFile[]}\n headerOpen={chatMessage.headerOpen}\n loading={chatMessage.loading}\n onContentChange={chatStore.setContent}\n onFileListChange={chatStore.setFileList}\n onHeaderOpenChange={chatStore.setHeaderOpen}\n onSend={() => chatStore.sendMessage()}\n onCancel={chatStore.cancelReceive}\n onFocus={chatStore.config.hooks?.onSenderFocus}\n fileUpload={{\n request: configState.services.request?.fileUpload,\n config: receiverState.active.config?.fileUpload as FileUploadConfig[]\n }}\n sendBtnProps={isFunction(sendBtnProps) ? sendBtnProps() : {}}\n extraFooterBelow={<RenderWrapper control={footerBelow} />}\n extraFooter={\n <>\n <FeaturesRenderer />\n <RenderWrapper control={extraBtn} />\n </>\n }\n extraHeader={\n <Sender.Header\n title={\n <Flex gap={4}>\n <EnterOutlined />\n <Typography.Text type=\"secondary\" ellipsis>\n {referenceContent}\n </Typography.Text>\n </Flex>\n }\n open={!!referenceContent}\n onOpenChange={() => chatStore.setReferences()}\n classNames={{\n header: styles.nsSenderReferenceHeaderTitle,\n content: shouldRender(referencesBtn) ? '' : styles.nsSenderReferenceHeaderContent\n }}\n >\n <RenderWrapper\n control={referencesBtn}\n DefaultComponent={\n <Flex gap={8}>\n {['深度解读', '概要解读'].map((con) => (\n <Button key={con} color=\"primary\" variant=\"filled\" onClick={() => referenceHandle(con)}>\n {con} →\n </Button>\n ))}\n </Flex>\n }\n />\n </Sender.Header>\n }\n />\n </Flex>\n )\n }\n)\n","import { UserSwitchOutlined } from '@ant-design/icons'\nimport { Button, Popover } from 'antd'\nimport { useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport { MessageBoxType } from '../../stores/types'\nimport QuickAskPanel from './QuickAsk/QuickAskPanel'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n // const [quickAskOpen, setQuickAskOpen] = useState(false)\n\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n return (\n <>\n {receiverState.active.feature?.deepThink && (\n <Button\n size=\"small\"\n color={receiverState.params.thinkMode === '1' ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => chatStore.setReceiverParams({ thinkMode: receiverState.params.thinkMode === '1' ? '2' : '1' })}\n >\n 深度思考\n </Button>\n )}\n {receiverState.active.feature?.switchManual && (\n <Button\n size=\"small\"\n title={\n chatMessage?.speakHuman\n ? '当前状态为人工模式。您发送的问题将直接发送给专家,智能助手将不再回复'\n : '当前状态为智能助手模式。您发送的问题将发送给智能助手,智能助手将回复您'\n }\n shape=\"round\"\n icon={<UserSwitchOutlined />}\n color={chatMessage?.speakHuman ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => {\n chatStore.setSpeakHuman?.(!chatMessage?.speakHuman)\n }}\n >\n 向专家咨询\n </Button>\n )}\n {receiverState.active.feature?.quickAsk && (\n <Popover\n // open={quickAskOpen}\n // onOpenChange={setQuickAskOpen}\n trigger=\"click\"\n placement=\"topLeft\"\n content={<QuickAskPanel />}\n >\n <Button\n size=\"small\"\n color=\"primary\"\n variant=\"filled\"\n // onClick={() => setQuickAskOpen(true)}\n >\n 快速提问\n </Button>\n </Popover>\n )}\n </>\n )\n}\n","import { CopyOutlined, DeleteOutlined, EditOutlined, PlusOutlined, PushpinOutlined, SearchOutlined } from '@ant-design/icons'\nimport { useDebounce, useRefState } from '@zero-library/common'\nimport { App, Button, Flex, Input, Popconfirm, Space, Tag, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { LabelItem, LabelItemUpdate, LabelType } from '../../../services'\nimport { useChatStore } from '../../../stores/Context'\nimport QuickAskEditModal from './QuickAskEditModal'\nimport styles from './styles.module.less'\n\nexport default () => {\n const { message } = App.useApp()\n const chatStore = useChatStore()\n const configState = useSnapshot(chatStore.config)\n const receiverState = useSnapshot(chatStore.receiver)\n const [searchText, setSearchText, getSearchText] = useRefState('')\n const [searchExpanded, setSearchExpanded] = useState(false)\n const [activeTab, setActiveTab, getActiveTab] = useRefState({} as LabelType)\n\n // 数据状态\n const [categories, setCategories] = useState<LabelType[]>([])\n const [items, setItems] = useState<LabelItem[]>([])\n\n // 编辑弹窗状态\n const [editModalOpen, setEditModalOpen] = useState(false)\n const [editingItem, setEditingItem] = useState<LabelItem | undefined>()\n\n // 获取分类列表\n const fetchCategories = async () => {\n try {\n const res = await configState.services.request?.labelsQuery?.(receiverState.active?.id, { pageNo: 1, pageSize: 1000 })\n if (res?.data) {\n setCategories(res.data?.items)\n }\n } catch (err) {}\n }\n // 获取问题列表\n const fetchItems = useDebounce(async () => {\n try {\n const res = await configState.services.request?.labelItemsQuery?.(receiverState.active?.id, {\n labelId: getActiveTab().id,\n keyword: getSearchText()\n })\n if (res?.data) {\n setItems(res.data)\n }\n } catch (err) {}\n })\n\n useEffect(() => {\n if (receiverState.active?.id) {\n fetchCategories()\n fetchItems()\n }\n }, [receiverState.active?.id])\n const [loading, setLoading] = useState(false)\n // 处理新增/编辑\n const handleEditConfirm = async (values: LabelItemUpdate) => {\n try {\n setLoading(true)\n await configState.services.request?.labelItemUpdate?.(receiverState.active?.id, values)\n setEditModalOpen(false)\n message.success('保存成功')\n if (!getActiveTab().id || values.labelName === getActiveTab().labelName) {\n fetchItems() // 刷新列表\n }\n fetchCategories()\n } finally {\n setLoading(false)\n }\n }\n\n // 处理删除\n const handleDelete = async (id: LabelItem['id']) => {\n try {\n await configState.services.request?.labelItemDelete?.(id)\n message.success('删除成功')\n fetchItems() // 刷新列表\n } catch (err) {}\n }\n\n // 处理置顶\n const handleTop = async (item: LabelItem) => {\n try {\n await configState.services.request?.labelItemTop?.({\n id: item.id,\n isTop: item.isTop ? 0 : 1\n })\n message.success(item.isTop ? '取消置顶成功' : '置顶成功')\n fetchItems()\n } catch (err) {}\n }\n\n return (\n <Flex vertical className={styles.quickAskPanel}>\n <Flex justify=\"space-between\" align=\"center\">\n <Typography.Title level={5}>快速提问</Typography.Title>\n {/* <Button type=\"text\" icon={<CloseOutlined />} onClick={onClose} size=\"small\" /> */}\n </Flex>\n\n <Flex gap={8} className=\"m-b-16 m-t-16\">\n {!searchExpanded && (\n <Button\n type=\"dashed\"\n block\n icon={<PlusOutlined />}\n className=\"flex-1\"\n onClick={() => {\n setEditingItem(null)\n setEditModalOpen(true)\n }}\n >\n 新增快速提问\n </Button>\n )}\n {searchExpanded ? (\n <Input\n autoFocus\n placeholder=\"输入问题名称或内容检索\"\n prefix={<SearchOutlined />}\n value={searchText}\n onChange={(e) => {\n setSearchText(e.target.value)\n fetchItems()\n }}\n className=\"flex-1\"\n allowClear\n onBlur={() => setSearchExpanded(false)}\n />\n ) : (\n <Button icon={<SearchOutlined />} onClick={() => setSearchExpanded(true)} />\n )}\n </Flex>\n\n <Flex align=\"center\" className={classNames('scroll-fade-in', 'm-b-16', styles.tagContainer)}>\n <Tag\n color={!activeTab.id ? 'processing' : 'default'}\n className=\"cursor-pointer\"\n bordered={false}\n onClick={() => {\n setActiveTab({} as LabelType)\n fetchItems()\n }}\n >\n 全部\n </Tag>\n {categories.map((c) => (\n <Tag\n color={activeTab.id === c.id ? 'processing' : 'default'}\n key={c.id}\n className=\"cursor-pointer\"\n bordered={false}\n onClick={() => {\n setActiveTab(c)\n fetchItems()\n }}\n >\n {c.labelName}\n </Tag>\n ))}\n </Flex>\n\n <Flex vertical className=\"flex-1\">\n <Flex vertical gap={8} className=\"height-full scroll-fade-in\">\n {items.map((item) => (\n <div\n key={item.id}\n className={styles.quickAskItem}\n onClick={() => {\n // console.log('点击了快速提问', item)\n chatStore.setContent(item.content)\n chatStore.setContentParams({\n use_template: 1\n })\n // onClose?.()\n }}\n >\n <Flex gap={8} justify=\"space-between\" className={styles.quickAskItemHeader}>\n <div className=\"flex-1 text-ellipsis\">{item.title}</div>\n <Space size={4}>\n <Button\n key=\"top\"\n type=\"primary\"\n size=\"small\"\n icon={<PushpinOutlined rotate={item.isTop ? -45 : 0} />}\n title={item.isTop ? '取消置顶' : '置顶'}\n onClick={(e) => {\n e.stopPropagation()\n handleTop(item)\n }}\n />\n <Button\n key=\"copy\"\n type=\"primary\"\n size=\"small\"\n icon={<CopyOutlined />}\n title=\"复制\"\n onClick={(e) => {\n e.stopPropagation()\n // 复制, 不带 id\n handleEditConfirm({\n title: item.title,\n labelName: item.labelName,\n content: item.content\n })\n }}\n />\n\n <Button\n key=\"edit\"\n type=\"primary\"\n size=\"small\"\n icon={<EditOutlined />}\n title=\"编辑\"\n onClick={(e) => {\n e.stopPropagation()\n setEditingItem(item)\n setEditModalOpen(true)\n }}\n />\n\n {item.canDelete && (\n <Popconfirm\n key=\"delete\"\n title=\"提示\"\n okText=\"确定\"\n cancelText=\"取消\"\n description=\"确认删除问题吗?\"\n onConfirm={(e) => {\n e.stopPropagation()\n handleDelete(item.id)\n }}\n >\n <Button type=\"primary\" size=\"small\" icon={<DeleteOutlined />} title=\"删除\" onClick={(e) => e.stopPropagation()} />\n </Popconfirm>\n )}\n </Space>\n </Flex>\n <div className={classNames(styles.quickAskItemBody)}>\n <div className=\"text-ellipsis-3\">{item.content}</div>\n </div>\n </div>\n ))}\n </Flex>\n </Flex>\n\n {editModalOpen && (\n <QuickAskEditModal\n open={editModalOpen}\n onCancel={() => setEditModalOpen(false)}\n onConfirm={handleEditConfirm}\n loading={loading}\n initialValues={editingItem}\n categories={categories}\n />\n )}\n </Flex>\n )\n}\n","import { SignatureOutlined } from '@ant-design/icons'\nimport { AutoComplete, Button, Flex, Form, Input, Modal } from 'antd'\nimport { useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { LabelItemUpdate, LabelType } from '../../../services'\nimport { useChatStore } from '../../../stores/Context'\n\ninterface Props {\n open: boolean\n onCancel: () => void\n loading: boolean\n onConfirm: (values: LabelItemUpdate) => void\n initialValues?: LabelItemUpdate\n categories?: LabelType[]\n}\n\nexport default ({ open, onCancel, loading, onConfirm, initialValues, categories = [] }: Props) => {\n const [form] = Form.useForm()\n const chatStore = useChatStore()\n const configState = useSnapshot(chatStore.config)\n const [promptLoading, setPromptLoading] = useState(false)\n const [description, setDescription] = useState('')\n\n const handleOk = async () => {\n try {\n const values = await form.validateFields()\n if (values) {\n onConfirm(values)\n }\n } catch (error) {\n console.error('Validation failed:', error)\n }\n }\n\n // 罗拉提示词助手生成\n const handleGenerate = async () => {\n if (!description.trim()) return\n setPromptLoading(true)\n try {\n const res = await configState.services.request?.labelItemPromptAssistant?.(description)\n if (res.data) {\n form.setFieldsValue({\n title: res.data.title,\n labelName: res.data.labelName,\n content: res.data.content\n })\n }\n } finally {\n setPromptLoading(false)\n }\n }\n\n return (\n <Modal\n title={initialValues?.id ? '编辑快速提问' : '新增快速提问'}\n open={open}\n onCancel={onCancel}\n onOk={handleOk}\n width={600}\n okText=\"确定\"\n okButtonProps={{\n loading\n }}\n cancelText=\"取消\"\n >\n {/* <Spin spinning={promptLoading}> */}\n <Flex vertical gap={4}>\n <Input.TextArea\n rows={4}\n placeholder=\"请输入问题描述,罗拉提示词助手将帮您生成问题名称,分类和内容。\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n disabled={promptLoading}\n />\n <Flex justify=\"end\">\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<SignatureOutlined />}\n onClick={handleGenerate}\n loading={promptLoading}\n disabled={!description.trim()}\n >\n 罗拉提示词助手\n </Button>\n </Flex>\n </Flex>\n\n <Form form={form} layout=\"vertical\" initialValues={initialValues}>\n <Form.Item label=\"问题ID\" name=\"id\" hidden>\n <Input disabled />\n </Form.Item>\n <Form.Item label=\"问题名称\" name=\"title\" rules={[{ required: true, message: '请输入问题名称' }]}>\n <Input placeholder=\"请输入问题名称\" />\n </Form.Item>\n\n <Form.Item label=\"问题分类\" name=\"labelName\" rules={[{ required: true, message: '请选择或输入问题分类' }]}>\n <AutoComplete\n fieldNames={{ value: 'labelName' }}\n placeholder=\"请选择问题分类或输入新的分类\"\n options={categories}\n // filterOption={(inputValue, option) => option!.value.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1}\n />\n </Form.Item>\n\n <Form.Item label=\"问题内容\" name=\"content\" rules={[{ required: true, message: '请输入具体提问内容' }]}>\n <Input.TextArea placeholder=\"请输入具体提问内容,如:帮我扩写一份证据说明\" rows={6} />\n </Form.Item>\n </Form>\n {/* </Spin> */}\n </Modal>\n )\n}\n",".quickAskPanel {\n width: 600px;\n height: 400px;\n}\n.quickAskPanel .tagContainer {\n overflow-y: auto;\n}\n.quickAskPanel .quickAskItem {\n border-radius: 16px;\n overflow: clip;\n cursor: pointer;\n}\n.quickAskPanel .quickAskItem .quickAskItemHeader {\n background-color: var(--ant-color-primary);\n color: #fff;\n padding: 8px 12px;\n}\n.quickAskPanel .quickAskItem .quickAskItemBody {\n background-color: #f2f2f2;\n color: #555;\n padding: 12px;\n}\n","import { Button, Flex, List, Popover } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { RecommendQuestion } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\n/* 🌟 提示词 */\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n const component = useMemo(\n () =>\n receiverState.active.config?.labels?.length > 0 && (\n <Flex gap={4} wrap>\n <Button disabled color=\"default\" variant=\"text\">\n 随便聊聊\n </Button>\n {receiverState.active.config.labels.slice(0, 6).map((question) => (\n <Popover\n key={question.id}\n content={\n <List\n itemLayout=\"horizontal\"\n split={false}\n className={styles.nsSenderList}\n dataSource={question.items as RecommendQuestion[]}\n renderItem={(item) => (\n <List.Item onClick={() => chatStore.sendMessage(item.question)} className={styles.nsSenderListItem}>\n <div className=\"text-ellipsis\">{item.question}</div>\n </List.Item>\n )}\n footer={\n <Flex justify=\"end\" className={styles.nsSenderListFooter}>\n (您可点击以上问题开启AI体验)\n </Flex>\n }\n />\n }\n title={\n <div\n className={classNames(styles.nsSenderListTitle, 'text-ellipsis')}\n >{`${receiverState.active.name}开始关注${question.name}内容!`}</div>\n }\n >\n <Button color=\"default\" variant=\"filled\">\n {question.name}\n </Button>\n </Popover>\n ))}\n </Flex>\n ),\n [receiverState.active.config?.labels]\n )\n return component\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport { Avatar, Button, Flex } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n return (\n <div className=\"p-24\">\n <Flex align=\"center\" gap={8}>\n <Avatar size={36} src={receiverState.active.logo} />\n <span className={styles.nsChatUserName}>{receiverState.active.name}</span>\n </Flex>\n <Button\n block\n type=\"primary\"\n shape=\"round\"\n onClick={() => chatStore.createConversation()}\n className={classNames('m-t-16')}\n icon={<PlusOutlined />}\n >\n 新建会话\n </Button>\n </div>\n )\n}\n","import { RenderWrapper } from '@zero-library/common'\nimport { Flex } from 'antd'\nimport classNames from 'classnames'\nimport { ChatLayoutConversationList } from '../../stores/types'\nimport ConversationList from './ConversationList'\nimport ConversationListHeader from './ConversationListHeader'\nimport styles from './styles.module.less'\n\nexport default ({ header }: ChatLayoutConversationList) => {\n return (\n <Flex vertical className={classNames('height-full', 'zero-chat-conversations', styles.nsConversationListPanel)}>\n <RenderWrapper control={header} DefaultComponent={ConversationListHeader} />\n <div className=\"full-scroll\">\n <ConversationList />\n </div>\n </Flex>\n )\n}\n",".nsPreviewHeader {\n padding: 16px 24px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n}\n.nsPreviewHeader .nsPreviewHeaderTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatSenderHeader {\n margin-bottom: 16px;\n padding: 24px;\n font-size: 24px;\n text-align: center;\n}\n.nsDisclaimerNotice {\n font-size: 12px;\n text-align: center;\n color: #bfbfbf;\n}\n.nsChatLayout {\n background-color: #fff;\n}\n.nsChatLayout .nsChatBody {\n padding: 8px 0;\n}\n.nsBodyWidth {\n margin: 0 auto;\n max-width: 896px;\n min-width: 320px;\n width: calc(100% - 24px);\n}\n"]}
|