@zero-library/chat-agent 2.1.20 → 2.2.0
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 +147 -111
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.mts +804 -71
- package/dist/index.d.ts +804 -71
- package/dist/index.esm.js +148 -107
- package/dist/index.esm.js.map +1 -1
- package/package.json +3 -3
package/dist/index.esm.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/QuoteList.tsx","../src/ui/common/markdownAlert/Think.tsx","../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/core/constants.ts","../src/ui/common/BubbleListItems.tsx","../src/ui/common/styles.module.less","../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/SenderPromptsItems.tsx","../src/ui/common/ConversationListHeader.tsx","../src/ui/common/ConversationListPanel.tsx","../src/ui/layouts/styles.module.less"],"names":["appCard","fileView","fileEdit","fileEditHeader","fileEditContent","quoteList","mdEdit","think","jsx","Spin","jsxs","Flex","useState","useEffect","FileIcon","Button","RenderMarkdown","isExternal","Collapse","createRequest","userInfo","message","styles_module_default","loadingMessage","chatAttachments","chatSender","chatQuoteMsg","Fragment","classNames","nsConversationListPanel","nsConversations","nsBubbleList","nsChatHeader","nsChatTitle","nsChatHeaderPopover","chatWelcomeWrap","chatWelcome","chatWelcomePrompts","nsSenderListTitle","nsSenderList","nsSenderListItem","nsSenderListFooter","nsChatUserName","nsSenderReferenceHeaderTitle","nsSenderReferenceHeaderContent","nsAvatarListContainer","nsAvatarList","nsAvatarListItem","nsAvatarListItemIcon","nsAvatarListItemIconActive","nsAvatarListItemName","useSnapshot","copyText","CopyOutlined","shouldRender","Bubble","Avatar","useMemo","Empty","RenderWrapper","Space","Popover","useRef","useDebounce","isObject","Attachments","forwardRef","useImperativeHandle","ChatSender_default","Sender","Typography","PlusOutlined","nsPreviewHeader","nsPreviewHeaderTitle","nsChatSenderHeader","nsDisclaimerNotice","nsChatLayout","nsChatBody","nsBodyWidth","sizes","downloadFile","MarkdownEditor","Tag","CloseOutlined"],"mappings":"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","file":"index.esm.js","sourcesContent":["import { useCreateValtioContext } from '@zero-library/common'\nimport { ChatStoreType } from '.'\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","import { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n appKey: string\n appName: string\n iconUrl: string\n }\n loading: boolean\n}\n// :::alert type=appCard data={appKey:\"cube-acc\",appName:\"罗拉易账\",iconUrl:\"/icon-url/2e53e398d31627d559e0b3b1b5acb731.png\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.switchAgentConversation(data.appKey)\n // emit('openApp', { appKey: data.appKey })\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 { FileUrlType } from '../../../stores'\nimport { useChatStore } from '../../../stores/Context'\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 fileUrl: string\n title: string\n open: boolean\n onClose: () => void\n}\nexport default ({ title, open, onClose, fileUrl }: 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(fileUrl)\n setContent(res.data?.content)\n } finally {\n setLoading(false)\n }\n }\n useEffect(() => {\n getContent()\n }, [fileUrl])\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={index:\"1\",fileName:'',fileUrl:\"\"} :::\nimport { isExternal } from '@zero-library/common'\nimport { Flex, Popover, Spin, Tag } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\n\ninterface Props {\n data: {\n index: string\n fileUrl?: string\n fileName: string\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const onClick = () => {\n if (!data.fileUrl) return\n if (isExternal(data.fileUrl)) {\n window.open(data.fileUrl, '_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}>{data.fileName}</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.index}\n </Tag>\n </Popover>\n </Spin>\n {open && <DocDrawer fileUrl={data.fileUrl} title={data.fileName} 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 // messageId: string\n }\n loading: boolean\n}\n// :::alert type=mdEdit data={content:\"\"} :::\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 onOk = () => {\n chatStore.sendMessage('开始写作', [], { outline: 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 </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 { FileTextType } from 'packages/chat-agent/src/stores'\nimport { useChatStore } from '../../../stores/Context'\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=quoteList data={list:[{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521334\"},{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521364\"}]} :::\nimport { CaretRightOutlined } from '@ant-design/icons'\nimport { isExternal } from '@zero-library/common'\nimport { Collapse, Flex } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\nimport styles from './styles.module.less'\ninterface QuoteItem {\n title: string\n fileUrl: string\n}\ninterface Props {\n data: {\n list: QuoteItem[]\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const [selectItem, setSelectItem] = useState({} as QuoteItem)\n const onClick = (item: QuoteItem) => {\n if (!item.fileUrl) return\n if (isExternal(item.fileUrl)) {\n window.open(item.fileUrl, '_blank')\n } else {\n setSelectItem(item)\n setOpen(true)\n }\n }\n return (\n <>\n <Collapse\n className={styles.quoteList}\n bordered={false}\n ghost\n expandIcon={({ isActive }) => <CaretRightOutlined rotate={isActive ? 90 : 0} />}\n items={[\n {\n key: '1',\n label: '参考资料',\n children: (\n <Flex vertical gap={4}>\n {data.list.map((item) => (\n <p key={item.fileUrl} onClick={() => !loading && onClick(item)} className=\"cursor-pointer\">\n {item.title}\n </p>\n ))}\n </Flex>\n )\n }\n ]}\n />\n {open && <DocDrawer fileUrl={selectItem.fileUrl} title={selectItem.title} open={open} onClose={() => setOpen(false)} />}\n </>\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 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 * 替换think标签为自定义标记 方便markdown渲染\n * @param str - 原始字符串\n * @returns 替换后的字符串\n */\nexport const replaceThinkTags = (str: string) => {\n return (\n str\n // 替换开标签\n .replace(/<think>/g, \":::alert type=think data={content:'\")\n // 替换闭标签\n .replace(/<\\/think>/g, \"'} :::\")\n )\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: number\n /** 机构名称 */\n orgName?: string\n /** 用户姓名 */\n name: string\n /** 用户名 */\n username?: string\n /** 手机号 */\n mobile?: string\n /** 头像地址 */\n avatar: string\n /** 我的邀请码 */\n myInviteCode?: string\n /** 邮箱地址 */\n email?: string\n /** 备注信息 */\n remark?: string\n /** 角色ID列表 */\n roles?: number[]\n /** 权限代码列表 */\n permissions?: string[]\n}\n\n/**\n * 聊天用户信息接口\n * 用于聊天界面展示的用户信息\n */\nexport interface ChatUserInfo {\n /** 用户ID */\n id: string\n /** 用户头像地址 */\n iconUrl: string\n /** 用户名称 */\n name: string\n /** 用户描述信息 */\n description: 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-弹窗\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-弹窗\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'\n /** 消息ID */\n id: string\n /** 消息内容 */\n msgContent: string\n /** 消息反馈:1-赞 2-踩 */\n msgFeedback?: number\n /** 附件文件列表 */\n msgFiles?: InputFile[]\n /** 引用的消息信息 */\n quoteMsg?: MessageQuoteMsg\n /** 发送者信息 */\n sender?: MessageSender\n /** 发送时间戳 */\n sendTime: number\n /** 是否被打断标志 */\n stopFlag?: boolean\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 recommendQuestions?: RecommendQuestion[]\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 * @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 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 }\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(`/uc/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 getCurrentUser,\n isObject,\n RenderControl,\n shouldRender,\n transform,\n transforms\n} from '@zero-library/common'\nimport { ButtonProps, message } from 'antd'\nimport { proxy } from 'valtio'\nimport { ConversationMemberEnum } from '../core/constants'\nimport { classifyTime } from '../core/utils'\nimport {\n AgentCharacter,\n AgentConfig,\n AgentInfo,\n ChatUserInfo,\n ConversationMember,\n ConversationMessage,\n ConversationMessageSend,\n ConversationsQuery,\n ConversationType,\n createChatService,\n FeedbackUpdate,\n InputFile,\n MessageQuoteMsg,\n UserInfo\n} from '../services'\nimport { createFileService } from '../services/file'\n\n/**\n * 会话策略类型\n * 1-最近会话:获取用户最近的会话继续对话\n * 2-新会话:创建全新的会话开始对话\n */\nexport type ConversationStrategy = 1 | 2 // 1-最近会话 2-新会话 默认2\n\n/**\n * 接收者信息接口\n * 定义聊天中消息接收者的详细信息,包括智能体和专家\n */\nexport interface ReceiverInfo {\n /**\n * 接收者名称\n */\n name: string\n /**\n * 接收者类型:1-用户 2-专家 3-智能体 4-税协\n */\n type?: number\n /**\n * 智能体配置信息(仅在智能体类型时有值)\n */\n config?: AgentConfig\n /**\n * 接收者描述信息\n */\n description?: string\n /**\n * 接收者唯一标识\n */\n id: string\n /**\n * 接收者是否可用状态\n */\n isAvailable?: boolean\n /**\n * 接收者头像或Logo地址\n */\n logo: string\n /**\n * 智能体特性配置,JSON格式的扩展配置\n */\n feature?: ObjectType<any>\n}\n/**\n * 会话成员对象类型\n * 使用枚举类型作为键,存储不同类型的会话成员\n */\nexport type ConversationMemberObj = Partial<Record<ConversationMemberEnum, ConversationMember>>\n\n/**\n * 文件URL类型接口\n * 定义通过URL访问的文件信息\n */\nexport interface FileUrlType {\n /** 文件后缀名 */\n suffix: string\n /** 文件访问URL */\n fileUrl: string\n /** 文件名 */\n fileName: string\n // messageId?: string // 关联的消息ID(当前未使用)\n}\n\n/**\n * 文件文本类型接口\n * 定义包含文本内容的文件信息\n */\nexport interface FileTextType {\n /** 文件内容 */\n content: string\n /** 文件后缀名 */\n suffix: string\n /** 文件名 */\n fileName: string\n // messageId?: string // 关联的消息ID(当前未使用)\n}\n\n/**\n * 引用内容接口\n * 扩展消息引用信息,支持更多引用格式\n */\nexport interface ReferencesContent extends MessageQuoteMsg {\n /** 引用名称 */\n name?: string\n /** Markdown格式的引用内容 */\n markdown?: string\n /** 其他扩展属性 */\n [key: string]: any\n}\n\n/**\n * 引用类型接口\n * 定义消息引用的各种类型和参数\n */\nexport interface ReferencesType {\n /** 引用类型:1-markdown引用(拼正文发) 2-文案引用(不发正文) 3-消息引用 */\n type: number\n /** 引用内容 */\n content: ReferencesContent\n /** 引用参数 */\n params?: ObjectType<any>\n}\n\n/**\n * 消息框类型接口\n * 定义聊天界面中单个会话的完整状态\n */\nexport interface MessageBoxType {\n /** 输入框内容 */\n content?: ConversationMessageSend['msgContent']\n /** 上传文件内容 */\n files?: ConversationMessageSend['msgFiles']\n /** 头部展开状态 */\n headerOpen?: boolean\n /** 消息加载状态 */\n loading: boolean\n /** 消息列表 */\n message: ConversationMessage[]\n /** 推荐问题列表 */\n questionList?: string[]\n /** 引用消息(可扩展quoteMsg) */\n references?: ReferencesType\n /** 说话人类型:false-AI(默认) true-专家 */\n speakHuman?: boolean\n}\n/**\n * 聊天状态管理器类型\n * 从 createChatStore 函数返回的状态管理器类型\n */\nexport type ChatStoreType = ReturnType<typeof createChatStore>\n\n/**\n * 聊天组件生命周期钩子接口\n * 定义聊天组件在各种事件发生时的回调函数\n */\nexport interface ChatHooks {\n /** 初始化前回调 */\n onBeforeInit?: () => void\n /** 初始化后回调 */\n onAfterInit?: () => void\n /** 输入框聚焦回调 */\n onSenderFocus?: () => void\n /** 头部关闭回调 */\n onHeaderClose?: () => void\n /** 发送消息前回调,可阻止发送 */\n onBeforeSend?: (message: ConversationMessageSend['msgContent'], files: InputFile[]) => boolean | Promise<boolean> | void\n /** 发送消息后回调 */\n onAfterSend?: () => void\n /** 切换智能体前回调,可阻止切换 */\n onBeforeSwitchAgent?: (agentId: string) => boolean | Promise<boolean> | void\n /** 切换智能体后回调 */\n onAfterSwitchAgent?: (agent: AgentInfo) => void\n /** 切换会话前回调,可阻止切换 */\n onBeforeSwitchConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n /** 切换会话后回调 */\n onAfterSwitchConversation?: (conversationId: string) => void\n /** 初始化消息前回调,可阻止初始化 */\n onBeforeInitMessages?: (conversationId: string) => boolean | Promise<boolean> | void\n /** 初始化消息后回调 */\n onAfterInitMessages?: (messages: ConversationMessage[]) => void\n /** 删除会话前回调,可阻止删除 */\n onBeforeDelConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n /** 删除会话后回调 */\n onAfterDelConversation?: (conversationId: string, isCurrentConversation: boolean) => void\n // onMessageEvent?: (event) => void // 消息事件回调(未启用)\n // onAfterLayout?: () => void // 布局完成后回调(未启用)\n // onError?: (error: unknown) => void // 错误处理回调(未启用)\n}\n/**\n * 聊天参数接口\n * 定义聊天组件的运行时参数\n */\nexport interface ChatParams {\n /** 会话来源 */\n source?: number\n /** 业务扩展数据,JSON字符串格式 */\n businessData?: string\n /** 业务数据唯一ID */\n businessId?: string\n /** 业务类型 */\n businessType?: number\n /** 扩展参数对象 */\n params?: ObjectType<any>\n}\n\n/**\n * 聊天布局头部配置接口\n * 控制聊天头部区域的显示和功能\n * 默认 title = true, closeBtn = false, newConversationBtn = true, conversationListBtn = true\n */\nexport interface ChatLayoutHeader {\n /** 头部标题渲染控制 */\n title?: RenderControl<void, void>\n /** 是否显示关闭按钮 */\n closeBtn?: boolean\n /** 新建会话按钮渲染控制 */\n newConversationBtn?: RenderControl<void, void>\n /** 是否显示智能体性格选择 */\n agentCharacter?: boolean\n /** 是否显示会话列表按钮 */\n conversationListBtn?: boolean\n}\n\n/**\n * 聊天布局会话列表配置接口\n * 控制会话列表区域的显示和功能\n * 默认 header = true\n */\nexport interface ChatLayoutConversationList {\n /** 会话列表头部渲染控制 */\n header?: RenderControl<void, void>\n}\n\n/**\n * 聊天布局输入框配置接口\n * 控制输入框区域的功能和样式\n * 默认 placeholder, extraBtn = false, referencesBtn = false\n */\nexport interface ChatLayoutSender {\n /** 输入框占位符文本 */\n placeholder?: string\n /** 额外按钮渲染控制 */\n extraBtn?: RenderControl<void, void>\n /** 引用按钮渲染控制 */\n referencesBtn?: RenderControl<void, void>\n /** 底部额外内容渲染控制 */\n footerBelow?: RenderControl<void, void>\n /** 发送按钮属性配置函数 */\n sendBtnProps?: () => ButtonProps\n /** 是否显示推荐问题 */\n prompts?: boolean\n}\n\n/**\n * 聊天布局消息列表配置接口\n * 控制消息列表区域的显示和功能\n */\nexport interface ChatLayoutMessageList {\n /** 头像显示控制:可以是全局布尔值或按成员类型分别控制 */\n avatar?: boolean | Partial<Record<ConversationMemberEnum, boolean>>\n /** 首条消息渲染控制 */\n firstMessage?: RenderControl<void, void>\n}\n/**\n * 聊天布局配置接口\n * 控制聊天组件整体布局的显示和功能\n */\nexport interface ChatLayout {\n /** 左侧面板渲染控制 */\n leftPanel?: RenderControl<void, void>\n /** 会话列表面板渲染控制 */\n conversationList?: RenderControl<void, ChatLayoutConversationList>\n /** 是否允许预览功能 */\n preview?: boolean\n /** 消息列表渲染控制 */\n messageList?: RenderControl<void, ChatLayoutMessageList>\n /** 输入框头部渲染控制 */\n senderHeader?: RenderControl<void, void>\n /** 输入框渲染控制 */\n sender?: RenderControl<void, ChatLayoutSender>\n /** 输入框底部渲染控制 */\n senderFooter?: RenderControl<void, void>\n /** 全局头部渲染控制 */\n globalHeader?: RenderControl<void, ChatLayoutHeader>\n /** 聊天区域头部渲染控制 */\n chatHeader?: RenderControl<void, ChatLayoutHeader>\n /** 免责声明渲染控制 */\n disclaimerNotice?: RenderControl<void, void>\n}\nconst defaultAgentLayout = {\n leftPanel: false,\n conversationList: true,\n preview: true,\n messageList: true,\n firstMessage: false,\n senderHeader: false,\n sender: true,\n senderFooter: false,\n globalHeader: false,\n chatHeader: true,\n disclaimerNotice: true\n} as ChatLayout\nconst defaultExpertLayout = {\n leftPanel: false,\n conversationList: false,\n preview: false,\n messageList: true,\n firstMessage: false,\n senderHeader: false,\n sender: {\n props: {\n prompts: false\n }\n },\n senderFooter: false,\n globalHeader: false,\n chatHeader: {\n props: {\n title: true,\n closeBtn: false,\n newConversationBtn: false,\n agentCharacter: false,\n conversationListBtn: false\n }\n },\n disclaimerNotice: false\n} as ChatLayout\n/**\n * 聊天服务接口\n * 定义聊天组件所需的服务配置\n */\nexport interface ChatServices {\n /** WebSocket连接基础URL列表,支持多地址容错 */\n websocketBaseUrls?: string[] // TODO后续优化\n /** API基础URL */\n baseUrl?: string\n /** 聊天服务和文件服务的合并请求对象 */\n request?: ReturnType<typeof createChatService> & ReturnType<typeof createFileService>\n}\n/**\n * 创建聊天状态管理器\n * 使用 Valtio 进行状态管理,包含会话、消息、用户信息等所有聊天相关状态\n * @returns 聊天状态管理器和操作方法\n */\nexport function createChatStore() {\n /** 全局配置对象,包含服务、钩子函数、布局等配置 */\n const config = proxy({\n services: {\n websocketBaseUrls: []\n } as ChatServices,\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 ChatUserInfo,\n /** 聊天参数配置 */\n params: {} as ChatParams\n })\n\n /**\n * 设置服务配置\n * @param services - 服务配置对象\n */\n const setServices = ({ baseUrl = '/api' } = {} as ChatServices) => {\n config.services.baseUrl = baseUrl\n if (!config.services.websocketBaseUrls?.includes(baseUrl)) {\n config.services.websocketBaseUrls = [...config.services.websocketBaseUrls, baseUrl]\n }\n const request = createRequest(baseUrl)\n config.services.request = { ...createChatService(request), ...createFileService(request) }\n }\n /**\n * 设置文件预览\n * @param file - 要预览的文件\n * @param isEdit - 是否为编辑模式\n */\n const setPreview = (file = {} as FileUrlType | FileTextType, isEdit = false) => {\n if (shouldRender(config.layout.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 {\n console.log('当前环境不支持预览')\n }\n }\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 const setUserInfo = (userInfo?: UserInfo) => {\n config.userInfo = transform(userInfo || getCurrentUser() || {}, {\n id: (userInfo) => {\n return String(userInfo['id'])\n },\n name: 'name',\n iconUrl: 'avatar',\n description: 'remark'\n })\n }\n /** 接收者状态管理,包含当前激活的接收者信息 */\n const receiver = proxy({\n /** 当前激活的接收者信息(智能体或专家) */\n active: {} as ReceiverInfo,\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 // 需要根据配置选择是否存在\n if (receiver.active.feature?.deepThink) {\n setReceiverParams({ thinkMode: '2' })\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 = (references?: ReferencesType) => {\n conversation.messages[conversation.active.id].references = references\n }\n const setContent = (content?: ConversationMessageSend['msgContent']) => {\n conversation.messages[conversation.active.id].content = content\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 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 // 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 const agentId = String(id)\n await switchAgent(agentId)\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 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 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?.markdown) {\n msgContent = references.content.markdown + '\\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\n Object.assign(extraParams, receiver.params, message ? {} : references?.params, params)\n sendParams.params = JSON.stringify(extraParams)\n\n if (!message) {\n setContent('')\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 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 }\n const updateConversationTitle = (conversationId: ConversationType['id'], title: ConversationType['title']) => {\n const idx = conversations.list.items.findIndex((item) => item.id === conversationId)\n if (idx === -1) return\n conversations.list.items[idx].title = title\n }\n\n const findMsgIndex = (conversationId: string, msgId: string) => {\n const messages = conversation.messages[conversationId]?.message || []\n return messages.findLastIndex((item) => item.id === msgId)\n }\n /**\n * WebSocket消息开始回调\n * 处理消息开始接收时的状态更新\n * @param msg - 接收到的消息\n */\n const startCallback = (msg: ConversationMessage) => {\n // 如果有会话标题,更新会话标题\n if (msg.conversationTitle && conversations.list.items.length) {\n updateConversationTitle(msg.conversationId, msg.conversationTitle)\n }\n // 清除推荐问题列表\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId].message\n // 如果是智能体消息,显示思考状态;用户消息直接显示\n messages.push(msg.sender.type === 3 ? { ...msg, msgContent: '正在努力思考中' } : 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.conversationId, msg.id)\n if (idx === -1) return\n // 更新步骤消息\n messages[idx] = msg\n conversation.messages[msg.conversationId].loading = true\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.conversationId, msg.id)\n if (idx === -1) return\n const message = messages[idx]\n conversation.messages[msg.conversationId].loading = true\n // 如果是刚开始的消息,直接替换\n if (message?.type === 'STEP_STARTED' || message?.type === 'TEXT_MESSAGE_START') {\n messages[idx] = msg\n return\n }\n // 追加消息内容\n messages[idx] = {\n ...message,\n msgContent: message.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.conversationId, msg.id)\n if (idx === -1) return\n // 清除消息类型,标记为完成\n messages[idx] = { ...messages[idx], type: undefined }\n conversation.messages[msg.conversationId].loading = false\n // 获取推荐问题\n getQuestionList(msg.conversationId, msg.id)\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.conversationId, msg.id)\n if (idx === -1) return\n // 显示错误消息\n messages[idx] = { ...msg, type: undefined }\n conversation.messages[msg.conversationId].loading = false\n }\n /**\n * 接收WebSocket消息的统一入口\n * 根据消息类型分发到不同的处理函数\n * @param newMessage - 新消息对象\n */\n const acceptMessage = (newMessage: R<ConversationMessage>) => {\n const conversationId = newMessage.data.conversationId\n if (!conversation.messages[conversationId]?.message) return\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 'RUN_ERROR':\n errCallback(newMessage.data)\n break\n default:\n break\n }\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 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 } from '@ant-design/icons'\nimport { Conversation, XProvider } from '@ant-design/x'\nimport {\n downloadFile,\n FilePreview,\n getToken,\n getWebSocketUrl,\n isLocalhost,\n MarkdownEditor,\n RenderWrapper,\n shouldRender,\n useDeepEffect,\n useWebSocket\n} from '@zero-library/common'\nimport { Button, Flex, Spin, Splitter, Tag, ThemeConfig } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { ChatSenderHandle } from '../../components/ChatSender'\nimport { AgentInfo, InputFile, UserInfo } from '../../services'\nimport type { ChatHooks, ChatLayout, ChatParams, ChatServices, ConversationStrategy, FileTextType, FileUrlType, ReferencesType } from '../../stores'\nimport { createChatStore } from '../../stores'\nimport { ChatProvider } from '../../stores/Context'\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'\n\n/**\n * 聊天组件配置接口\n * 定义聊天组件的初始化配置选项\n */\nexport interface ChatConfig {\n /** 接收者类型:1-用户 2-专家 3-Agent */\n receiverType?: number\n /** 接收者ID:专家或智能体ID */\n receiverId?: string\n /** 会话ID:已存在的会话ID */\n conversationId?: string\n /** 会话策略:1-最近会话 2-新会话 */\n conversationStrategy?: ConversationStrategy\n}\n/**\n * 聊天组件操作句柄接口\n * 提供外部操作聊天组件的方法\n */\nexport interface ChatHandle {\n /** 发送消息 */\n sendMessage: (message?: string, files?: InputFile[]) => void\n /** 切换智能体会话 */\n switchAgentConversation: (agentId: AgentInfo['id'], strategy?: ConversationStrategy) => Promise<void>\n /** 切换会话 */\n switchConversation: (id?: Conversation['id']) => Promise<void>\n /** 创建新会话 */\n createConversation: () => Promise<void>\n /** 设置引用消息 */\n setReferences: (references?: ReferencesType) => void\n /** 设置输入框消息内容 */\n setMessage: (message?: string) => void\n /** 设置上传文件列表 */\n setFiles: (files?: InputFile[]) => void\n /** 设置聊天参数 */\n setParams: (params?: ChatParams) => void\n /** 设置服务配置 */\n setServices: (services?: ChatServices) => void\n /** 输入框聚焦 */\n senderFocus: ChatSenderHandle['focus']\n}\n/**\n * 聊天组件属性接口\n * 定义聊天组件的输入属性\n */\nexport interface ChatProps {\n /** 主题配置 */\n theme?: ThemeConfig\n /** 聊天配置 */\n config?: ChatConfig\n /** 聊天参数 */\n params?: ChatParams\n /** 生命周期钩子 */\n hooks?: ChatHooks\n /** 布局配置 */\n layout?: ChatLayout\n /** 用户信息 */\n userInfo?: UserInfo\n /** 服务配置 */\n services?: ChatServices\n}\n/**\n * 聊天组件\n * 使用 React.forwardRef 实现的聊天界面组件\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 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 useEffect(() => {\n chatStore.setUserInfo(userInfo)\n }, [userInfo])\n\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 useEffect(() => {\n // console.log('hooks changed:', hooks)\n chatStore.setHooks(hooks)\n }, [hooks])\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 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=${getToken()}&a=2`, isLocalhost() ? '192.168.6.23' : ''),\n // getWebSocketUrl(`/api/lolr/conversation/ws/subscribe?NS-TOKEN=${getToken()}`, isLocalhost() ? '192.168.6.23' : '')\n // ])\n /** 主 WebSocket 连接,用于接收实时消息 */\n useWebSocket({\n url:\n configState.services.websocketBaseUrls?.[0] &&\n getWebSocketUrl(\n `${configState.services.websocketBaseUrls?.[0]}/lolr/conversation/ws/subscribe?NS-TOKEN=${getToken()}`,\n isLocalhost() ? '192.168.3.102' : ''\n ),\n onMessage: chatStore.acceptMessage,\n clientHeartbeat: false,\n reconnectInterval: 10000\n })\n /** 备用 WebSocket 连接,提供一体机saas可用性 */\n useWebSocket({\n url:\n configState.services.websocketBaseUrls?.[1] &&\n getWebSocketUrl(\n `${configState.services.websocketBaseUrls?.[1]}/lolr/conversation/ws/subscribe?NS-TOKEN=${getToken()}`,\n isLocalhost() ? '192.168.3.102' : ''\n ),\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={styles.nsPreviewHeaderTitle}>{configState.preview.file.fileName}</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: 1,\n content: {\n name: text,\n markdown: text\n },\n params: {\n outline: 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 </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}\n",".loadingMessage {\n background-image: linear-gradient(90deg, #ff6b23 0%, #af3cb8 31%, #53b6ff 89%);\n background-size: 100% 2px;\n background-repeat: no-repeat;\n background-position: bottom;\n padding-bottom: 2px;\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","import { Attachments, Bubble, BubbleProps } from '@ant-design/x'\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Flex, Spin, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { replaceThinkTags } from '../core/utils'\nimport { ConversationMessage } from '../services'\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\n/**\n * 消息渲染组件\n * 用于渲染聊天消息内容,包括文本、文件附件和引用消息\n */\nexport default ({ message, placement }: MessageRenderProps) => {\n return (\n <Flex vertical>\n {!(message.msgContent || message.msgFiles.length) ? (\n <Typography>\n <Spin size={'small'} />\n </Typography>\n ) : (\n <>\n {message.msgContent && (\n <Bubble\n placement={placement}\n className={classNames({ [styles.loadingMessage]: message.type })}\n content={<RenderMarkdown content={replaceThinkTags(message.msgContent)} customComponents={customComponents} />}\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 <Attachments.FileCard\n key={file.content}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n }\n />\n ))}\n {message.quoteMsg?.id && (\n <Bubble\n className={classNames(styles.chatQuoteMsg)}\n placement={placement}\n content={\n <Flex vertical gap={8}>\n {message.quoteMsg.msgContent && (\n <Flex>\n <span>【引用消息】:</span>\n <Flex flex={1} className=\"text-ellipsis\">\n {message.quoteMsg.msgContent}\n\n {/* <RenderMarkdown content={message.quoteMsg.msgContent} /> */}\n </Flex>\n </Flex>\n )}\n {message.quoteMsg?.msgFiles && message.quoteMsg.msgFiles.length > 0 && (\n <Flex>\n <span>【引用文件】:</span>\n <Flex gap={8} wrap flex={1}>\n {message.quoteMsg.msgFiles.map((file) => (\n <Attachments.FileCard\n key={file.content}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n ))}\n </Flex>\n </Flex>\n )}\n </Flex>\n }\n />\n )}\n </>\n )}\n </Flex>\n )\n}\n","/**\n * 会话成员类型枚举\n * - 'agent': AI 智能体\n * - 'user': 用户\n * - 'other': 其他成员(如专家等)\n */\nexport type ConversationMemberEnum = 'agent' | 'user' | 'other'\n\n/**\n * 成员类型映射表,将数字类型映射为对应的成员类型\n * - 1: 'user' - 用户\n * - 2: 'other' - 其他成员\n * - 3: 'agent' - AI 智能体\n */\nexport const MEMBER_TYPE: ObjectType<ConversationMemberEnum> = {\n 1: 'user',\n 2: 'other',\n 3: 'agent'\n}\n","import { CopyOutlined, DislikeOutlined, LikeOutlined, OpenAIOutlined } from '@ant-design/icons'\nimport { Bubble, BubbleProps, Prompts, Welcome } from '@ant-design/x'\nimport { BubbleDataType } from '@ant-design/x/es/bubble/BubbleList'\nimport { copyText, isBoolean, RenderWrapper, shouldRender, UserAvatar } from '@zero-library/common'\nimport { Avatar, Button, Flex, GetRef, Space } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useSnapshot } from 'valtio'\nimport MessageRender from '../../components/MessageRender'\nimport { ConversationMemberEnum, MEMBER_TYPE } from '../../core/constants'\nimport { ConversationMessage } from '../../services'\nimport { ChatLayoutMessageList, MessageBoxType } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface RoleContent {\n user: ConversationMemberEnum\n placement: BubbleProps['placement']\n avatar?: any\n}\n\n/* 🌟 消息列表 */\nexport default ({ firstMessage = false, avatar = { user: false, agent: true, other: true } }: 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 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 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 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 placeholderNode = useMemo(\n () => [\n {\n key: 'placeholder',\n content: (\n <Space direction=\"vertical\" size={16} className={styles.chatWelcomeWrap}>\n <Welcome\n className={classNames(styles.chatWelcome, 'p-t-32')}\n variant=\"borderless\"\n icon={<Avatar shape=\"square\" size={58} src={receiverState.active.logo} />}\n title={`你好,我是${receiverState.active.name || ''}`}\n description={<div dangerouslySetInnerHTML={{ __html: receiverState.active.description || '' }}></div>}\n />\n {receiverState.active.config?.recommendQuestions?.length > 0 && (\n <Prompts\n className=\"m-t-16\"\n wrap\n items={[\n {\n key: '1',\n label: '🤔 推荐问题:',\n children: receiverState.active.config.recommendQuestions.map(({ question }) => ({\n key: question,\n description: (\n <span onClick={() => chatStore.sendMessage(question)} className={classNames(styles.chatWelcomePrompts, 'text-ellipsis')}>\n {question}\n </span>\n )\n }))\n }\n ]}\n />\n )}\n </Space>\n ),\n variant: 'borderless'\n } as BubbleDataType\n ],\n [receiverState.active]\n )\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\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 = conversationRoles[MEMBER_TYPE[message.sender.type]] || ({} as RoleContent)\n return {\n key: message.id,\n placement: role.placement,\n variant: 'borderless',\n avatar: role.avatar,\n content: <MessageRender message={message as ConversationMessage} placement={role.placement} />,\n footer: role.user === 'agent' && (\n <Flex>\n <Button onClick={() => copyText(message.msgContent)} color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} />\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 {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ShareAltOutlined />} /> */}\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ReloadOutlined />} /> */}\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 firstMessageRecord = useMemo(() => {\n const isExist = shouldRender(firstMessage)\n return isExist\n ? [\n {\n key: 'firstMessage',\n content: <RenderWrapper control={firstMessage} />,\n placement: 'end'\n // avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : []\n }, [firstMessage])\n const bubbleListItems = useMemo(() => {\n const list = []\n if (firstMessageRecord.length > 0) {\n list.push(...firstMessageRecord)\n }\n if (chatRecords.length > 0) {\n list.push(...chatRecords, ...questionList)\n }\n if (list.length) {\n return list\n }\n return [...placeholderNode]\n }, [chatRecords, questionList, placeholderNode, firstMessageRecord])\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 { 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 { ChatLayoutHeader } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport AgentCharacter from './AgentCharacter'\nimport ConversationList from './ConversationList'\nimport styles from './styles.module.less'\n\nexport default ({\n title = 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\n control={title}\n DefaultComponent={\n <>\n <Avatar size={22} src={receiverState.active.logo} alt={receiverState.active.name} />\n <div className={styles.nsChatTitle}>{receiverState.active.name}</div>\n </>\n }\n />{' '}\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\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 }\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 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 // components={{ input: (...Props) => <MarkdownEditor showToolbar={false} /> }}\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\">{loading ? <LoadingButton disabled={false} /> : <SendButton {...sendBtnProps} />}</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, UserSwitchOutlined } from '@ant-design/icons'\nimport { Sender } from '@ant-design/x'\nimport { isFunction, 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 { ChatLayoutSender, MessageBoxType } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\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 referenceHandle = (con: string) => {\n if (chatMessage?.loading) return\n chatStore.setContent(con)\n setTimeout(() => {\n chatStore.sendMessage()\n }, 10)\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 {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 <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 {chatMessage?.references?.content?.name}\n </Typography.Text>\n </Flex>\n }\n open={!!chatMessage?.references?.content?.name}\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 { 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 {item.question}\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'\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/QuoteList.tsx","../src/ui/common/markdownAlert/Think.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/core/constants.ts","../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/SenderPromptsItems.tsx","../src/ui/common/ConversationListHeader.tsx","../src/ui/common/ConversationListPanel.tsx","../src/ui/layouts/styles.module.less"],"names":["appCard","fileView","fileEdit","fileEditHeader","fileEditContent","quoteList","mdEdit","think","jsx","Spin","jsxs","Flex","useState","useEffect","FileIcon","Button","RenderMarkdown","isExternal","Collapse","createRequest","message","styles_module_default","loadingMessage","chatAttachments","chatSender","chatQuoteMsg","Fragment","classNames","nsConversationListPanel","nsConversations","nsBubbleList","nsChatHeader","nsChatTitle","nsChatHeaderPopover","chatWelcomeWrap","chatWelcome","chatWelcomePrompts","nsSenderListTitle","nsSenderList","nsSenderListItem","nsSenderListFooter","nsChatUserName","nsSenderReferenceHeaderTitle","nsSenderReferenceHeaderContent","nsAvatarListContainer","nsAvatarList","nsAvatarListItem","nsAvatarListItemIcon","nsAvatarListItemIconActive","nsAvatarListItemName","useSnapshot","shouldRender","RenderWrapper","Prompts","copyText","CopyOutlined","Bubble","Avatar","useMemo","Empty","Space","Popover","useRef","useDebounce","isObject","Attachments","forwardRef","useImperativeHandle","ChatSender_default","Sender","Typography","PlusOutlined","nsPreviewHeader","nsPreviewHeaderTitle","nsChatSenderHeader","nsDisclaimerNotice","nsChatLayout","nsChatBody","nsBodyWidth","sizes","downloadFile","MarkdownEditor","Tag","CloseOutlined"],"mappings":"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","file":"index.esm.js","sourcesContent":["import { useCreateValtioContext } from '@zero-library/common'\nimport { ChatStoreType } from '.'\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","import { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n appKey: string\n appName: string\n iconUrl: string\n }\n loading: boolean\n}\n// :::alert type=appCard data={appKey:\"cube-acc\",appName:\"罗拉易账\",iconUrl:\"/icon-url/2e53e398d31627d559e0b3b1b5acb731.png\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.switchAgentConversation(data.appKey)\n // emit('openApp', { appKey: data.appKey })\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 fileUrl: string\n title: string\n open: boolean\n onClose: () => void\n}\nexport default ({ title, open, onClose, fileUrl }: 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(fileUrl)\n setContent(res.data?.content)\n } finally {\n setLoading(false)\n }\n }\n useEffect(() => {\n getContent()\n }, [fileUrl])\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={index:\"1\",fileName:'',fileUrl:\"\"} :::\nimport { isExternal } from '@zero-library/common'\nimport { Flex, Popover, Spin, Tag } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\n\ninterface Props {\n data: {\n index: string\n fileUrl?: string\n fileName: string\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const onClick = () => {\n if (!data.fileUrl) return\n if (isExternal(data.fileUrl)) {\n window.open(data.fileUrl, '_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}>{data.fileName}</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.index}\n </Tag>\n </Popover>\n </Spin>\n {open && <DocDrawer fileUrl={data.fileUrl} title={data.fileName} 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 // messageId: string\n }\n loading: boolean\n}\n// :::alert type=mdEdit data={content:\"\"} :::\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 onOk = () => {\n chatStore.sendMessage('开始写作', [], { outline: 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 </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=quoteList data={list:[{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521334\"},{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521364\"}]} :::\nimport { CaretRightOutlined } from '@ant-design/icons'\nimport { isExternal } from '@zero-library/common'\nimport { Collapse, Flex } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\nimport styles from './styles.module.less'\ninterface QuoteItem {\n title: string\n fileUrl: string\n}\ninterface Props {\n data: {\n list: QuoteItem[]\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const [selectItem, setSelectItem] = useState({} as QuoteItem)\n const onClick = (item: QuoteItem) => {\n if (!item.fileUrl) return\n if (isExternal(item.fileUrl)) {\n window.open(item.fileUrl, '_blank')\n } else {\n setSelectItem(item)\n setOpen(true)\n }\n }\n return (\n <>\n <Collapse\n className={styles.quoteList}\n bordered={false}\n ghost\n expandIcon={({ isActive }) => <CaretRightOutlined rotate={isActive ? 90 : 0} />}\n items={[\n {\n key: '1',\n label: '参考资料',\n children: (\n <Flex vertical gap={4}>\n {data.list.map((item) => (\n <p key={item.fileUrl} onClick={() => !loading && onClick(item)} className=\"cursor-pointer\">\n {item.title}\n </p>\n ))}\n </Flex>\n )\n }\n ]}\n />\n {open && <DocDrawer fileUrl={selectItem.fileUrl} title={selectItem.title} open={open} onClose={() => setOpen(false)} />}\n </>\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 { 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 * 替换think标签为自定义标记 方便markdown渲染\n * @param str - 原始字符串\n * @returns 替换后的字符串\n */\nexport const replaceThinkTags = (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 * 构建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-弹窗\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-弹窗\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'\n /** 消息ID */\n id: string\n /** 消息内容 */\n msgContent: string\n /** 消息反馈:1-赞 2-踩 */\n msgFeedback?: number\n /** 附件文件列表 */\n msgFiles?: InputFile[]\n /** 引用的消息信息 */\n quoteMsg?: MessageQuoteMsg\n /** 发送者信息 */\n sender?: MessageSender\n /** 发送时间戳 */\n sendTime: number\n /** 是否被打断标志 */\n stopFlag?: boolean\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 recommendQuestions?: RecommendQuestion[]\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 * @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 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 }\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(`/uc/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 firstMessage: false,\n senderHeader: false,\n sender: true,\n senderFooter: false,\n globalHeader: false,\n chatHeader: true,\n disclaimerNotice: true\n} as ChatLayout\nconst defaultExpertLayout = {\n leftPanel: false,\n conversationList: false,\n preview: false,\n messageList: true,\n firstMessage: false,\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} 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 = (file = {} as FileUrlType | FileTextType, isEdit = false) => {\n if (shouldRender(config.layout.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 {\n console.log('当前环境不支持预览')\n }\n }\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 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 // 需要根据配置选择是否存在\n if (receiver.active.feature?.deepThink) {\n setReceiverParams({ thinkMode: '2' })\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 = (references?: ReferencesType) => {\n conversation.messages[conversation.active.id].references = references\n }\n const setContent = (content?: ConversationMessageSend['msgContent']) => {\n conversation.messages[conversation.active.id].content = content\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 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 // 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 const agentId = String(id)\n await switchAgent(agentId)\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 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 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?.markdown) {\n msgContent = references.content.markdown + '\\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, params)\n sendParams.params = JSON.stringify(extraParams)\n\n if (!message) {\n setContent('')\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 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 }\n const updateConversationTitle = (conversationId: ConversationType['id'], title: ConversationType['title']) => {\n const idx = conversations.list.items.findIndex((item) => item.id === conversationId)\n if (idx === -1) return\n conversations.list.items[idx].title = title\n }\n\n const findMsgIndex = (conversationId: string, msgId: string) => {\n const messages = conversation.messages[conversationId]?.message || []\n return messages.findLastIndex((item) => item.id === msgId)\n }\n /**\n * WebSocket消息开始回调\n * 处理消息开始接收时的状态更新\n * @param msg - 接收到的消息\n */\n const startCallback = (msg: ConversationMessage) => {\n // 如果有会话标题,更新会话标题\n if (msg.conversationTitle && conversations.list.items.length) {\n updateConversationTitle(msg.conversationId, msg.conversationTitle)\n }\n // 清除推荐问题列表\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId].message\n // 如果是智能体消息,显示思考状态;用户消息直接显示\n messages.push(msg.sender.type === 3 ? { ...msg, msgContent: '正在努力思考中' } : 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.conversationId, msg.id)\n if (idx === -1) return\n // 更新步骤消息\n messages[idx] = msg\n conversation.messages[msg.conversationId].loading = true\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.conversationId, msg.id)\n if (idx === -1) return\n const message = messages[idx]\n conversation.messages[msg.conversationId].loading = true\n // 如果是刚开始的消息,直接替换\n if (message?.type === 'STEP_STARTED' || message?.type === 'TEXT_MESSAGE_START') {\n messages[idx] = msg\n return\n }\n // 追加消息内容\n messages[idx] = {\n ...message,\n msgContent: message.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.conversationId, msg.id)\n if (idx === -1) return\n // 清除消息类型,标记为完成\n messages[idx] = { ...messages[idx], type: undefined }\n conversation.messages[msg.conversationId].loading = false\n // 获取推荐问题\n getQuestionList(msg.conversationId, msg.id)\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.conversationId, msg.id)\n if (idx === -1) return\n // 显示错误消息\n messages[idx] = { ...msg, type: undefined }\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 // 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 '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 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 } from '@ant-design/icons'\nimport { 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 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={styles.nsPreviewHeaderTitle}>{configState.preview.file.fileName}</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: 1,\n content: {\n name: text,\n markdown: text\n },\n params: {\n outline: 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 </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}\n",".loadingMessage {\n background-image: linear-gradient(90deg, #ff6b23 0%, #af3cb8 31%, #53b6ff 89%);\n background-size: 100% 2px;\n background-repeat: no-repeat;\n background-position: bottom;\n padding-bottom: 2px;\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","import { Attachments, Bubble, BubbleProps } from '@ant-design/x'\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Flex, Spin, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { replaceThinkTags } from '../core/utils'\nimport { ConversationMessage } from '../services'\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\n/**\n * 消息渲染组件\n * 用于渲染聊天消息内容,包括文本、文件附件和引用消息\n */\nexport default ({ message, placement }: MessageRenderProps) => {\n return (\n <Flex vertical>\n {!(message.msgContent || message.msgFiles.length) ? (\n <Typography>\n <Spin size={'small'} />\n </Typography>\n ) : (\n <>\n {message.msgContent && (\n <Bubble\n placement={placement}\n className={classNames({ [styles.loadingMessage]: message.type })}\n content={<RenderMarkdown content={replaceThinkTags(message.msgContent)} customComponents={customComponents} />}\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 <Attachments.FileCard\n key={file.content}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n }\n />\n ))}\n {message.quoteMsg?.id && (\n <Bubble\n className={classNames(styles.chatQuoteMsg)}\n placement={placement}\n content={\n <Flex vertical gap={8}>\n {message.quoteMsg.msgContent && (\n <Flex>\n <span>【引用消息】:</span>\n <Flex flex={1} className=\"text-ellipsis\">\n {message.quoteMsg.msgContent}\n\n {/* <RenderMarkdown content={message.quoteMsg.msgContent} /> */}\n </Flex>\n </Flex>\n )}\n {message.quoteMsg?.msgFiles && message.quoteMsg.msgFiles.length > 0 && (\n <Flex>\n <span>【引用文件】:</span>\n <Flex gap={8} wrap flex={1}>\n {message.quoteMsg.msgFiles.map((file) => (\n <Attachments.FileCard\n key={file.content}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n ))}\n </Flex>\n </Flex>\n )}\n </Flex>\n }\n />\n )}\n </>\n )}\n </Flex>\n )\n}\n","/**\n * 会话成员类型枚举\n * - 'agent': AI 智能体\n * - 'user': 用户\n * - 'other': 其他成员(如专家等)\n */\nexport type ConversationMemberEnum = 'agent' | 'user' | 'other'\n\n/**\n * 成员类型映射表,将数字类型映射为对应的成员类型\n * - 1: 'user' - 用户\n * - 2: 'other' - 其他成员\n * - 3: 'agent' - AI 智能体\n */\nexport const MEMBER_TYPE: ObjectType<ConversationMemberEnum> = {\n 1: 'user',\n 2: 'other',\n 3: 'agent'\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, 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, MEMBER_TYPE } from '../../core/constants'\nimport { ConversationMessage } 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 user: ConversationMemberEnum\n placement: BubbleProps['placement']\n avatar?: any\n}\n\n/* 🌟 消息列表 */\nexport default ({ firstMessage = false, welcomeMessage = true, avatar = { user: false, agent: true, other: true } }: 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 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 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 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\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 = conversationRoles[MEMBER_TYPE[message.sender.type]] || ({} as RoleContent)\n return {\n key: message.id,\n placement: role.placement,\n variant: 'borderless',\n avatar: role.avatar,\n content: <MessageRender message={message as ConversationMessage} placement={role.placement} />,\n footer: role.user === 'agent' && (\n <Flex>\n <Button onClick={() => copyText(message.msgContent)} color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} />\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 {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ShareAltOutlined />} /> */}\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ReloadOutlined />} /> */}\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 firstMessageRecord = useMemo(() => {\n const isExist = shouldRender(firstMessage)\n return isExist\n ? [\n {\n key: 'firstMessage',\n content: <RenderWrapper control={firstMessage} />,\n placement: 'end'\n // avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : []\n }, [firstMessage])\n const bubbleListItems = useMemo(() => {\n const list = []\n list.push(...firstMessageRecord)\n list.push(...chatRecords, ...questionList)\n if (list.length) {\n return list\n }\n return [...welcomeMessageRecord]\n }, [chatRecords, questionList, welcomeMessageRecord, firstMessageRecord])\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 {receiverState.active.config?.recommendQuestions?.length > 0 && (\n <RenderWrapper\n control={prompts}\n DefaultComponent={\n <Prompts\n className=\"m-t-16\"\n wrap\n items={[\n {\n key: '1',\n label: '🤔 推荐问题:',\n children: receiverState.active.config.recommendQuestions.map(({ question }) => ({\n key: question,\n description: (\n <span onClick={() => chatStore.sendMessage(question)} className={classNames(styles.chatWelcomePrompts, 'text-ellipsis')}>\n {question}\n </span>\n )\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\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 }\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 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 // components={{ input: (...Props) => <MarkdownEditor showToolbar={false} /> }}\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\">{loading ? <LoadingButton disabled={false} /> : <SendButton {...sendBtnProps} />}</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, UserSwitchOutlined } from '@ant-design/icons'\nimport { Sender } from '@ant-design/x'\nimport { isFunction, 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 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 referenceHandle = (con: string) => {\n if (chatMessage?.loading) return\n chatStore.setContent(con)\n setTimeout(() => {\n chatStore.sendMessage()\n }, 10)\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 {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 <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 {chatMessage?.references?.content?.name}\n </Typography.Text>\n </Flex>\n }\n open={!!chatMessage?.references?.content?.name}\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 { 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 {item.question}\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"]}
|