@zero-library/chat-agent 2.1.16 → 2.1.18
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 +95 -51
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.css +24 -0
- package/dist/index.css.map +1 -1
- package/dist/index.esm.js +92 -48
- 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/core/utils.ts","../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/stores/index.ts","../src/services/index.ts","../src/services/file.ts","../src/ui/layouts/index.tsx","../src/components/MessageRender.tsx","../src/ui/common/markdownAlert/index.ts","../src/components/styles.module.less","../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","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 { copyText } from '@zero-library/common'\nimport { message } from 'antd'\nimport dayjs from 'dayjs'\n\n/**\n * 复制文本到剪贴板\n * @param value - 要复制的文本内容\n */\nexport const copy = (value: string) => {\n copyText(value).then(() => {\n message.success('复制成功')\n })\n}\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// 对象转换函数,将源对象转换为目标对象\nexport function transform<T extends object, U extends object>(\n source: T,\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U {\n const result = {} as U\n for (const [targetKey, mapping] of Object.entries(fieldMap)) {\n const key = targetKey as keyof U\n if (typeof mapping === 'function') {\n result[key] = (mapping as (src: T) => U[typeof key])(source)\n } else if (typeof mapping === 'string' && source && mapping in source) {\n result[key] = source[mapping as keyof T] as unknown as U[typeof key]\n } else {\n result[key] = mapping as U[typeof key]\n }\n }\n return result\n}\n\n// 批量对象转换函数\nexport function transforms<T extends object, U extends object>(\n sources: T[],\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U[] {\n return sources?.map((source) => transform<T, U>(source, fieldMap)) || []\n}\n\n/**\n * 构建带查询参数的 URL,支持数组参数\n * @param url - 基础 URL\n * @param params - 查询参数对象,支持数组值\n * @returns 构建完成的完整 URL\n */\nexport function buildURLWithParams(url: string, params?: Record<string, any>) {\n const query = new URLSearchParams(\n Object.entries(params || {}).flatMap(([key, val]) => (Array.isArray(val) ? val.map((v) => [key, String(v)]) : [[key, String(val)]]))\n ).toString()\n return query ? `${url}${url.includes('?') ? '&' : '?'}${query}` : url\n}\n\n/**\n * 将文件转换为 Base64 字符串\n * @param file - 要转换的文件对象\n * @returns Promise,resolve 为 Base64 字符串\n */\nexport const getBase64 = (file: File): Promise<string> => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n}\n/**\n * 替换think标签为自定义标记\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 { 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 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 { FileIcon, RenderMarkdown } from '@zero-library/common'\nimport { Button, Flex, Spin } from 'antd'\nimport { FileTextType } from 'packages/chat-agent/src/stores'\nimport { copy } from '../../../core/utils'\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 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={() => copy(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 { Conversation } from '@ant-design/x'\nimport { createRequest, deepCopy, deepMerge, getCurrentUser, isObject, RenderControl, shouldRender, UserInfo } from '@zero-library/common'\nimport { ButtonProps, message } from 'antd'\nimport { proxy } from 'valtio'\nimport { ConversationMemberEnum } from '../core/constants'\nimport { classifyTime, transform, transforms } 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} from '../services'\nimport { createFileService } from '../services/file'\n\nexport type ConversationStrategy = 1 | 2 // 1-最近会话 2-新会话 默认2\nexport interface ReceiverInfo {\n /**\n * name,名称\n */\n name: string\n /**\n * Agenttype,智能体类型\n */\n type?: number\n /**\n * 智能体的附带信息\n */\n config?: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: ObjectType<any>\n}\nexport type ConversationMemberObj = Partial<Record<ConversationMemberEnum, ConversationMember>>\nexport interface FileUrlType {\n suffix: string\n fileUrl: string\n fileName: string\n // messageId?: string\n}\nexport interface FileTextType {\n content: string\n suffix: string\n fileName: string\n // messageId?: string\n}\nexport interface ReferencesContent extends MessageQuoteMsg {\n name?: string\n markdown?: string\n [key: string]: any\n}\nexport interface ReferencesType {\n type: number // 1:markdown引用(拼正文发) 2: 文案引用(不发正文) 3:消息引用\n content: ReferencesContent\n params?: ObjectType<any>\n}\nexport interface MessageBoxType {\n content?: ConversationMessageSend['msgContent'] // 输入框内容\n files?: ConversationMessageSend['msgFiles'] // 上传文件内容\n headerOpen?: boolean\n loading: boolean\n message: ConversationMessage[]\n questionList?: string[] // 推荐问题\n references?: ReferencesType // 引用消息(可扩展quoteMsg)\n speakHuman?: boolean // false: ai(默认) true: 专家\n}\nexport type ChatStoreType = ReturnType<typeof createChatStore>\nexport interface ChatHooks {\n onBeforeInit?: () => void\n onAfterInit?: () => void\n onSenderFocus?: () => void\n onHeaderClose?: () => void\n onBeforeSend?: (message: ConversationMessageSend['msgContent'], files: InputFile[]) => boolean | Promise<boolean> | void\n onAfterSend?: () => void\n onBeforeSwitchAgent?: (agentId: string) => boolean | Promise<boolean> | void\n onAfterSwitchAgent?: (agent: AgentInfo) => void\n onBeforeSwitchConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterSwitchConversation?: (conversationId: string) => void\n onBeforeInitMessages?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterInitMessages?: (messages: ConversationMessage[]) => void\n onBeforeDelConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterDelConversation?: (conversationId: string, isCurrentConversation: boolean) => void\n // onMessageEvent?: (event) => void\n // onAfterLayout?: () => void\n // onError?: (error: unknown) => void\n}\nexport interface ChatParams {\n source?: number\n businessData?: string\n businessId?: string\n businessType?: number\n params?: ObjectType<any>\n}\n// 默认 title = true, closeBtn = false, newConversationBtn = true, conversationListBtn = true\nexport interface ChatLayoutHeader {\n title?: RenderControl<void, void>\n closeBtn?: boolean\n newConversationBtn?: RenderControl<void, void>\n agentCharacter?: boolean\n conversationListBtn?: boolean\n}\n// 默认 header = true\nexport interface ChatLayoutConversationList {\n header?: RenderControl<void, void>\n}\n// placeholder, extraBtn = false, referencesBtn = false\nexport interface ChatLayoutSender {\n placeholder?: string\n extraBtn?: RenderControl<void, void>\n referencesBtn?: RenderControl<void, void>\n footerBelow?: RenderControl<void, void>\n sendBtnProps?: () => ButtonProps\n prompts?: boolean\n}\nexport interface ChatLayoutMessageList {\n avatar?: boolean | Partial<Record<ConversationMemberEnum, boolean>>\n firstMessage?: RenderControl<void, void>\n}\nexport interface ChatLayout {\n leftPanel?: RenderControl<void, void>\n conversationList?: RenderControl<void, ChatLayoutConversationList>\n preview?: boolean // 是否允许预览\n messageList?: RenderControl<void, ChatLayoutMessageList>\n senderHeader?: RenderControl<void, void>\n sender?: RenderControl<void, ChatLayoutSender>\n senderFooter?: RenderControl<void, void>\n globalHeader?: RenderControl<void, ChatLayoutHeader>\n chatHeader?: RenderControl<void, ChatLayoutHeader>\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\nexport interface ChatServices {\n websocketBaseUrls?: string[] // TODO后续优化\n baseUrl?: string\n request?: ReturnType<typeof createChatService> & ReturnType<typeof createFileService>\n}\n/**\n * 创建聊天状态管理器\n * 使用 Valtio 进行状态管理,包含会话、消息、用户信息等所有聊天相关状态\n * @returns 聊天状态管理器和操作方法\n */\nexport function createChatStore() {\n const config = proxy({\n services: {\n websocketBaseUrls: []\n } as ChatServices,\n hooks: {} as ChatHooks,\n layout: {} as ChatLayout,\n preview: {\n file: {} as FileUrlType | FileTextType,\n isEdit: false // 未使用\n // isShow: 0, // 0 不显示 1 显示 2 用户关闭\n // isIntact: false // true 完整 false 不完整\n },\n userInfo: {} as ChatUserInfo,\n params: {} as ChatParams\n })\n\n /**\n * 设置服务配置\n * @param baseUrl - API 基础路径,默认为 '/api'\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: 'name'\n })\n }\n const receiver = proxy({\n active: {} as ReceiverInfo,\n loading: false,\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 list: [] as AgentCharacter[],\n active: {} as AgentCharacter,\n open: false,\n loading: false,\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 list: {\n items: [] as Conversation[],\n params: {\n pageNum: 1,\n pageSize: 1000\n }\n },\n updateIndex: 0, // 当前会话索引, 创建会话时更新,促使页面更新会话列表\n loading: false,\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 member: {} as ConversationMemberObj\n },\n messages: {} as { [key: ConversationType['id']]: MessageBoxType },\n feedback: {\n // open: false,\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 const setInitMessage = async (conversationId: ConversationType['id']) => {\n conversation.messages[conversationId] = {\n content: '',\n files: [] as ConversationMessageSend['msgFiles'], // 上传文件内容\n headerOpen: false,\n loading: false,\n message: [],\n questionList: [] // 推荐问题\n }\n }\n // 如果前端不存在会话ID,目前只有智能体在用\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 const pickReceiver = () => {\n const { agent, other } = conversation.active.member\n if (conversation.messages[conversation.active.id].speakHuman && other) return other\n if (agent) return agent\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 const startCallback = (msg: ConversationMessage) => {\n if (msg.conversationTitle && conversations.list.items.length) {\n updateConversationTitle(msg.conversationId, msg.conversationTitle)\n }\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId].message\n messages.push(msg.sender.type === 3 ? { ...msg, msgContent: '正在努力思考中' } : msg)\n conversation.messages[msg.conversationId].loading = true\n }\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 messages[idx] = msg\n conversation.messages[msg.conversationId].loading = true\n }\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 if (message?.type === 'STEP_STARTED' || message?.type === 'TEXT_MESSAGE_START') {\n messages[idx] = msg\n return\n }\n messages[idx] = {\n ...message,\n msgContent: message.msgContent + (msg.msgContent || '')\n }\n }\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 messages[idx] = { ...messages[idx], type: undefined }\n conversation.messages[msg.conversationId].loading = false\n getQuestionList(msg.conversationId, msg.id)\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 messages[idx] = { ...msg, type: undefined }\n conversation.messages[msg.conversationId].loading = false\n }\n // 接收消息\n const acceptMessage = (newMessage: R<ConversationMessage>) => {\n const conversationId = newMessage.data.conversationId\n if (!conversation.messages[conversationId]?.message) return\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 config,\n setServices,\n setPreview,\n setLayout,\n setHooks,\n setParams,\n setUserInfo,\n character,\n getCharacters,\n openCharacterList,\n closeCharacterList,\n switchCharacter,\n receiver,\n setReceiverParams,\n conversations,\n getConversations,\n delConversation,\n conversation,\n setSpeakHuman,\n setReferences,\n setContent,\n setFileList,\n setHeaderOpen,\n feedback,\n switchAgentConversation,\n createConversation,\n switchConversation,\n sendMessage,\n cancelReceive,\n acceptMessage\n }\n}\n","import { createRequest } from '@zero-library/common'\n\nexport interface ChatUserInfo {\n id: string\n iconUrl: string\n name: string\n description: string\n}\n\nexport interface ConversationsQuery extends PageReq {\n businessId?: string\n businessType?: number\n targetId: string\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\nexport interface conversationMessagesQuery extends PageReq {\n conversationId: string\n}\nexport interface InputFile {\n /**\n * Content,文件内容\n */\n content: string\n /**\n * 文件模式 remote_url local_file\n */\n mode: string\n /**\n * Type,文件类型\n */\n type: string\n /**\n * 文件扩展名\n */\n extension: string\n /**\n * 文件名\n */\n name: string\n}\nexport interface MessageQuoteMsg {\n /**\n * Id,消息ID\n */\n id?: string\n /**\n * Msgcontent,消息内容\n */\n msgContent?: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n}\n\nexport interface MessageSender {\n /**\n * Curruser,是否为当前用户\n */\n currUser?: boolean\n /**\n * Id,发送者ID\n */\n id: string\n /**\n * Type,1-用户 2-专家 3-Agent 4-税协\n */\n type: number\n}\nexport interface ConversationMessage {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n // websocket返回\n conversationTitle?: string\n type?: 'TEXT_MESSAGE_START' | 'STEP_STARTED' | 'TEXT_MESSAGE_CONTENT' | 'TEXT_MESSAGE_END' | 'RUN_ERROR'\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfeedback,消息反馈\n */\n msgFeedback?: number\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * 引消息\n */\n quoteMsg?: MessageQuoteMsg\n /**\n * 发送者信息\n */\n sender?: MessageSender\n /**\n * Sendtime,发送时间\n */\n sendTime: number\n /**\n * Stopflag,是否打断\n */\n stopFlag?: boolean\n}\nexport interface FeedbackUpdate {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgfeedback,反馈类型:1-赞,2-踩\n */\n msgFeedback: number\n /**\n * Msgfeedbackcontent,消息反馈内容\n */\n msgFeedbackContent?: string\n}\n\nexport interface ConversationMessageSend {\n /**\n * Conversationid,会话 ID\n */\n conversationId: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * Params,业务参数,透传到智能体\n */\n params?: string\n /**\n * Quotemsgid,引用的消息 ID,大于 0 的整数\n */\n quoteMsgId?: number\n /**\n * Receiverid,接收者 ID。当 receiverType ≠ 3(非 agent)时,后端需填充此字段\n */\n receiverId: string\n /**\n * Receivertype,接收者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n receiverType: number\n /**\n * Returntype,返回方式:1-http;2-ws(WebSocket)\n */\n returnType: number\n /**\n * Senderid,发送者 ID\n */\n senderId: string\n /**\n * Sendertype,发送者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n senderType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Stream,是否启用流式返回响应结果\n */\n stream: boolean\n}\n/**\n * FileUploadConfig,文件上传配置\n */\nexport interface FileUploadConfig {\n /**\n * Allowedfiletypes,允许的文件类型\n */\n allowedFileTypes: string[]\n /**\n * Enabled,是否启用文件上传\n */\n enabled: boolean\n /**\n * Maxfilecount,最大文件数量\n */\n maxFileCount: number\n /**\n * Maxfilesize,最大文件大小\n */\n maxFileSize?: number\n}\n\n/**\n * QuestionBO,推荐问题或热门问题项\n */\nexport interface RecommendQuestion {\n /**\n * Id,问题 ID\n */\n id: number\n /**\n * Question,问题内容\n */\n question: string\n}\n/**\n * LabelBO,热门问题标签\n */\nexport interface HotQuestionList {\n /**\n * Id,标签 ID\n */\n id: number\n /**\n * Items,标签下的问题列表\n */\n items: RecommendQuestion[]\n /**\n * Name,标签名称\n */\n name: string\n}\n\nexport interface AgentConfig {\n /**\n * 文件上传配置\n */\n fileUpload?: FileUploadConfig[]\n /**\n * Labels,热门问题标签列表\n */\n labels?: HotQuestionList[]\n /**\n * Recommendquestions,推荐问题列表\n */\n recommendQuestions?: RecommendQuestion[]\n}\nexport interface AgentInfo {\n /**\n * Agentname,名称\n */\n agentName: string\n /**\n * Agenttype,智能体类型\n */\n agentType: number\n /**\n * 智能体的附带信息\n */\n config: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: string // json字符串\n}\n\nexport interface AgentCharacter {\n /**\n * Agentid,智能体ID\n */\n agentId: number\n /**\n * Charactername,性格名称\n */\n characterName: string\n /**\n * Detaillevel,详细程度:1-10\n */\n detailLevel: number\n /**\n * Humorlevel,幽默程度:1-10\n */\n humorLevel: number\n /**\n * Id,id\n */\n id: number\n /**\n * Logo,头像,存储图片路径\n */\n logo: string\n /**\n * Professionallevel,专业程度:1-10\n */\n professionalLevel: number\n /**\n * Selected,是否已选择\n */\n selected: boolean\n /**\n * Sex,性别:1-男,2-女\n */\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 { 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 UserInfo,\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 } 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\nexport interface ChatConfig {\n receiverType?: number // :1-用户 2-专家 3-Agent\n receiverId?: string // 专家或智能体\n conversationId?: string // 会话Id\n conversationStrategy?: ConversationStrategy\n}\nexport interface ChatHandle {\n sendMessage: (message?: string, files?: InputFile[]) => void\n switchAgentConversation: (agentId: AgentInfo['id'], strategy?: ConversationStrategy) => Promise<void>\n switchConversation: (id?: Conversation['id']) => Promise<void>\n createConversation: () => Promise<void>\n setReferences: (references?: ReferencesType) => void\n setMessage: (message?: string) => void\n setFiles: (files?: InputFile[]) => void\n setParams: (params?: ChatParams) => void\n setServices: (services?: ChatServices) => void\n senderFocus: ChatSenderHandle['focus']\n}\nexport interface ChatProps {\n theme?: ThemeConfig\n config?: ChatConfig\n params?: ChatParams\n hooks?: ChatHooks\n layout?: ChatLayout\n userInfo?: UserInfo\n services?: ChatServices\n}\nexport default forwardRef<ChatHandle, ChatProps>(({ theme, params, userInfo, hooks, layout, config, services }: ChatProps, ref) => {\n const chatStore = useMemo(() => createChatStore(), [])\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 const receiverState = useSnapshot(chatStore.receiver)\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 // 计算Splitter的尺寸\n const [sizes, setSizes] = useState([0, '100%'])\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 // 会话Socket\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 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 useEffect(() => {\n configState.hooks?.onBeforeInit?.()\n // setTimeout(() => {\n // setA([a[0]])\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 {/** 对话区 - header */}\n <RenderWrapper control={configState.layout.globalHeader} DefaultComponent={ChatHeader} />\n <Flex className=\"full-scroll\">\n <RenderWrapper control={configState.layout.leftPanel} />\n\n <RenderWrapper control={configState.layout.conversationList} DefaultComponent={ConversationListPanel} />\n <Splitter className=\"flex-1\" onResize={setSplitterSizes}>\n <Splitter.Panel collapsible={false} min={600} size={sizes[0]}>\n {hasPreView && (\n <>\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 {(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: LgPrimaryColor }} />\n // 保存中\n // </Flex>\n // </Tag>\n // )\n }\n />\n )}\n </>\n )}\n </Splitter.Panel>\n\n <Splitter.Panel collapsible={false} max={800} min={400} size={sizes[1]}>\n <Flex vertical className={classNames('height-full')}>\n {/** 对话区 - header */}\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 {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 <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 <RenderWrapper\n control={configState.layout.disclaimerNotice as ChatLayout['disclaimerNotice']}\n DefaultComponent={<div className={styles.nsDisclaimerNotice}>内容由AI生成,仅供参考,请仔细甄别</div>}\n />\n </Flex>\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","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 </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","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","/**\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 { 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 { copy } from '../../core/utils'\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\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={() => copy(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 // 小于 100px 表示接近底部,允许自动滚动\n autoScrollRef.current = distanceToBottom < 100\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/core/utils.ts","../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/stores/index.ts","../src/services/index.ts","../src/services/file.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/MessageAIRender.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","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","Typography","Bubble","useSnapshot","useMemo","CopyOutlined","shouldRender","Avatar","Empty","RenderWrapper","Space","Popover","useRef","useDebounce","isObject","Attachments","forwardRef","useImperativeHandle","ChatSender_default","Sender","PlusOutlined","nsPreviewHeader","nsPreviewHeaderTitle","nsChatSenderHeader","nsDisclaimerNotice","nsChatLayout","nsChatBody","nsBodyWidth","sizes","downloadFile","MarkdownEditor","Tag","CloseOutlined"],"mappings":"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","file":"index.esm.js","sourcesContent":["import { copyText } from '@zero-library/common'\nimport { message } from 'antd'\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标签为自定义标记\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}\n/**\n * 复制文本到剪贴板\n * @param value - 要复制的文本内容\n */\nexport const copy = (value: string) => {\n copyText(value).then(() => {\n message.success('复制成功')\n })\n}\n","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 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 { FileIcon, RenderMarkdown } from '@zero-library/common'\nimport { Button, Flex, Spin } from 'antd'\nimport { FileTextType } from 'packages/chat-agent/src/stores'\nimport { copy } from '../../../core/utils'\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 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={() => copy(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 { 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 UserInfo\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} from '../services'\nimport { createFileService } from '../services/file'\n\nexport type ConversationStrategy = 1 | 2 // 1-最近会话 2-新会话 默认2\nexport interface ReceiverInfo {\n /**\n * name,名称\n */\n name: string\n /**\n * Agenttype,智能体类型\n */\n type?: number\n /**\n * 智能体的附带信息\n */\n config?: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: ObjectType<any>\n}\nexport type ConversationMemberObj = Partial<Record<ConversationMemberEnum, ConversationMember>>\nexport interface FileUrlType {\n suffix: string\n fileUrl: string\n fileName: string\n // messageId?: string\n}\nexport interface FileTextType {\n content: string\n suffix: string\n fileName: string\n // messageId?: string\n}\nexport interface ReferencesContent extends MessageQuoteMsg {\n name?: string\n markdown?: string\n [key: string]: any\n}\nexport interface ReferencesType {\n type: number // 1:markdown引用(拼正文发) 2: 文案引用(不发正文) 3:消息引用\n content: ReferencesContent\n params?: ObjectType<any>\n}\nexport interface MessageBoxType {\n content?: ConversationMessageSend['msgContent'] // 输入框内容\n files?: ConversationMessageSend['msgFiles'] // 上传文件内容\n headerOpen?: boolean\n loading: boolean\n message: ConversationMessage[]\n questionList?: string[] // 推荐问题\n references?: ReferencesType // 引用消息(可扩展quoteMsg)\n speakHuman?: boolean // false: ai(默认) true: 专家\n}\nexport type ChatStoreType = ReturnType<typeof createChatStore>\nexport interface ChatHooks {\n onBeforeInit?: () => void\n onAfterInit?: () => void\n onSenderFocus?: () => void\n onHeaderClose?: () => void\n onBeforeSend?: (message: ConversationMessageSend['msgContent'], files: InputFile[]) => boolean | Promise<boolean> | void\n onAfterSend?: () => void\n onBeforeSwitchAgent?: (agentId: string) => boolean | Promise<boolean> | void\n onAfterSwitchAgent?: (agent: AgentInfo) => void\n onBeforeSwitchConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterSwitchConversation?: (conversationId: string) => void\n onBeforeInitMessages?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterInitMessages?: (messages: ConversationMessage[]) => void\n onBeforeDelConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterDelConversation?: (conversationId: string, isCurrentConversation: boolean) => void\n // onMessageEvent?: (event) => void\n // onAfterLayout?: () => void\n // onError?: (error: unknown) => void\n}\nexport interface ChatParams {\n source?: number\n businessData?: string\n businessId?: string\n businessType?: number\n params?: ObjectType<any>\n}\n// 默认 title = true, closeBtn = false, newConversationBtn = true, conversationListBtn = true\nexport interface ChatLayoutHeader {\n title?: RenderControl<void, void>\n closeBtn?: boolean\n newConversationBtn?: RenderControl<void, void>\n agentCharacter?: boolean\n conversationListBtn?: boolean\n}\n// 默认 header = true\nexport interface ChatLayoutConversationList {\n header?: RenderControl<void, void>\n}\n// placeholder, extraBtn = false, referencesBtn = false\nexport interface ChatLayoutSender {\n placeholder?: string\n extraBtn?: RenderControl<void, void>\n referencesBtn?: RenderControl<void, void>\n footerBelow?: RenderControl<void, void>\n sendBtnProps?: () => ButtonProps\n prompts?: boolean\n}\nexport interface ChatLayoutMessageList {\n avatar?: boolean | Partial<Record<ConversationMemberEnum, boolean>>\n firstMessage?: RenderControl<void, void>\n}\nexport interface ChatLayout {\n leftPanel?: RenderControl<void, void>\n conversationList?: RenderControl<void, ChatLayoutConversationList>\n preview?: boolean // 是否允许预览\n messageList?: RenderControl<void, ChatLayoutMessageList>\n senderHeader?: RenderControl<void, void>\n sender?: RenderControl<void, ChatLayoutSender>\n senderFooter?: RenderControl<void, void>\n globalHeader?: RenderControl<void, ChatLayoutHeader>\n chatHeader?: RenderControl<void, ChatLayoutHeader>\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\nexport interface ChatServices {\n websocketBaseUrls?: string[] // TODO后续优化\n baseUrl?: string\n request?: ReturnType<typeof createChatService> & ReturnType<typeof createFileService>\n}\n/**\n * 创建聊天状态管理器\n * 使用 Valtio 进行状态管理,包含会话、消息、用户信息等所有聊天相关状态\n * @returns 聊天状态管理器和操作方法\n */\nexport function createChatStore() {\n const config = proxy({\n services: {\n websocketBaseUrls: []\n } as ChatServices,\n hooks: {} as ChatHooks,\n layout: {} as ChatLayout,\n preview: {\n file: {} as FileUrlType | FileTextType,\n isEdit: false // 未使用\n // isShow: 0, // 0 不显示 1 显示 2 用户关闭\n // isIntact: false // true 完整 false 不完整\n },\n userInfo: {} as ChatUserInfo,\n params: {} as ChatParams\n })\n\n /**\n * 设置服务配置\n * @param baseUrl - API 基础路径,默认为 '/api'\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: 'name'\n })\n }\n const receiver = proxy({\n active: {} as ReceiverInfo,\n loading: false,\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 list: [] as AgentCharacter[],\n active: {} as AgentCharacter,\n open: false,\n loading: false,\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 list: {\n items: [] as Conversation[],\n params: {\n pageNum: 1,\n pageSize: 1000\n }\n },\n updateIndex: 0, // 当前会话索引, 创建会话时更新,促使页面更新会话列表\n loading: false,\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 member: {} as ConversationMemberObj\n },\n messages: {} as { [key: ConversationType['id']]: MessageBoxType },\n feedback: {\n // open: false,\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 const setInitMessage = async (conversationId: ConversationType['id']) => {\n conversation.messages[conversationId] = {\n content: '',\n files: [] as ConversationMessageSend['msgFiles'], // 上传文件内容\n headerOpen: false,\n loading: false,\n message: [],\n questionList: [] // 推荐问题\n }\n }\n // 如果前端不存在会话ID,目前只有智能体在用\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 const pickReceiver = () => {\n const { agent, other } = conversation.active.member\n if (conversation.messages[conversation.active.id].speakHuman && other) return other\n if (agent) return agent\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 const startCallback = (msg: ConversationMessage) => {\n if (msg.conversationTitle && conversations.list.items.length) {\n updateConversationTitle(msg.conversationId, msg.conversationTitle)\n }\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId].message\n messages.push(msg.sender.type === 3 ? { ...msg, msgContent: '正在努力思考中' } : msg)\n conversation.messages[msg.conversationId].loading = true\n }\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 messages[idx] = msg\n conversation.messages[msg.conversationId].loading = true\n }\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 if (message?.type === 'STEP_STARTED' || message?.type === 'TEXT_MESSAGE_START') {\n messages[idx] = msg\n return\n }\n messages[idx] = {\n ...message,\n msgContent: message.msgContent + (msg.msgContent || '')\n }\n }\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 messages[idx] = { ...messages[idx], type: undefined }\n conversation.messages[msg.conversationId].loading = false\n getQuestionList(msg.conversationId, msg.id)\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 messages[idx] = { ...msg, type: undefined }\n conversation.messages[msg.conversationId].loading = false\n }\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 config,\n setServices,\n setPreview,\n setLayout,\n setHooks,\n setParams,\n setUserInfo,\n character,\n getCharacters,\n openCharacterList,\n closeCharacterList,\n switchCharacter,\n receiver,\n setReceiverParams,\n conversations,\n getConversations,\n delConversation,\n conversation,\n setSpeakHuman,\n setReferences,\n setContent,\n setFileList,\n setHeaderOpen,\n feedback,\n switchAgentConversation,\n createConversation,\n switchConversation,\n sendMessage,\n cancelReceive,\n acceptMessage\n }\n}\n","import { createRequest } from '@zero-library/common'\n\nexport interface ChatUserInfo {\n id: string\n iconUrl: string\n name: string\n description: string\n}\n\nexport interface ConversationsQuery extends PageReq {\n businessId?: string\n businessType?: number\n targetId: string\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\nexport interface conversationMessagesQuery extends PageReq {\n conversationId: string\n}\nexport interface InputFile {\n /**\n * Content,文件内容\n */\n content: string\n /**\n * 文件模式 remote_url local_file\n */\n mode: string\n /**\n * Type,文件类型\n */\n type: string\n /**\n * 文件扩展名\n */\n extension: string\n /**\n * 文件名\n */\n name: string\n}\nexport interface MessageQuoteMsg {\n /**\n * Id,消息ID\n */\n id?: string\n /**\n * Msgcontent,消息内容\n */\n msgContent?: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n}\n\nexport interface MessageSender {\n /**\n * Curruser,是否为当前用户\n */\n currUser?: boolean\n /**\n * Id,发送者ID\n */\n id: string\n /**\n * Type,1-用户 2-专家 3-Agent 4-税协\n */\n type: number\n}\nexport interface ConversationMessage {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n // websocket返回\n conversationTitle?: string\n type?: 'TEXT_MESSAGE_START' | 'STEP_STARTED' | 'TEXT_MESSAGE_CONTENT' | 'TEXT_MESSAGE_END' | 'RUN_ERROR'\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfeedback,消息反馈\n */\n msgFeedback?: number\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * 引消息\n */\n quoteMsg?: MessageQuoteMsg\n /**\n * 发送者信息\n */\n sender?: MessageSender\n /**\n * Sendtime,发送时间\n */\n sendTime: number\n /**\n * Stopflag,是否打断\n */\n stopFlag?: boolean\n}\nexport interface FeedbackUpdate {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgfeedback,反馈类型:1-赞,2-踩\n */\n msgFeedback: number\n /**\n * Msgfeedbackcontent,消息反馈内容\n */\n msgFeedbackContent?: string\n}\n\nexport interface ConversationMessageSend {\n /**\n * Conversationid,会话 ID\n */\n conversationId: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * Params,业务参数,透传到智能体\n */\n params?: string\n /**\n * Quotemsgid,引用的消息 ID,大于 0 的整数\n */\n quoteMsgId?: number\n /**\n * Receiverid,接收者 ID。当 receiverType ≠ 3(非 agent)时,后端需填充此字段\n */\n receiverId: string\n /**\n * Receivertype,接收者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n receiverType: number\n /**\n * Returntype,返回方式:1-http;2-ws(WebSocket)\n */\n returnType: number\n /**\n * Senderid,发送者 ID\n */\n senderId: string\n /**\n * Sendertype,发送者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n senderType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Stream,是否启用流式返回响应结果\n */\n stream: boolean\n}\n/**\n * FileUploadConfig,文件上传配置\n */\nexport interface FileUploadConfig {\n /**\n * Allowedfiletypes,允许的文件类型\n */\n allowedFileTypes: string[]\n /**\n * Enabled,是否启用文件上传\n */\n enabled: boolean\n /**\n * Maxfilecount,最大文件数量\n */\n maxFileCount: number\n /**\n * Maxfilesize,最大文件大小\n */\n maxFileSize?: number\n}\n\n/**\n * QuestionBO,推荐问题或热门问题项\n */\nexport interface RecommendQuestion {\n /**\n * Id,问题 ID\n */\n id: number\n /**\n * Question,问题内容\n */\n question: string\n}\n/**\n * LabelBO,热门问题标签\n */\nexport interface HotQuestionList {\n /**\n * Id,标签 ID\n */\n id: number\n /**\n * Items,标签下的问题列表\n */\n items: RecommendQuestion[]\n /**\n * Name,标签名称\n */\n name: string\n}\n\nexport interface AgentConfig {\n /**\n * 文件上传配置\n */\n fileUpload?: FileUploadConfig[]\n /**\n * Labels,热门问题标签列表\n */\n labels?: HotQuestionList[]\n /**\n * Recommendquestions,推荐问题列表\n */\n recommendQuestions?: RecommendQuestion[]\n}\nexport interface AgentInfo {\n /**\n * Agentname,名称\n */\n agentName: string\n /**\n * Agenttype,智能体类型\n */\n agentType: number\n /**\n * 智能体的附带信息\n */\n config: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: string // json字符串\n}\n\nexport interface AgentCharacter {\n /**\n * Agentid,智能体ID\n */\n agentId: number\n /**\n * Charactername,性格名称\n */\n characterName: string\n /**\n * Detaillevel,详细程度:1-10\n */\n detailLevel: number\n /**\n * Humorlevel,幽默程度:1-10\n */\n humorLevel: number\n /**\n * Id,id\n */\n id: number\n /**\n * Logo,头像,存储图片路径\n */\n logo: string\n /**\n * Professionallevel,专业程度:1-10\n */\n professionalLevel: number\n /**\n * Selected,是否已选择\n */\n selected: boolean\n /**\n * Sex,性别:1-男,2-女\n */\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 { 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 UserInfo,\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 } 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\nexport interface ChatConfig {\n receiverType?: number // :1-用户 2-专家 3-Agent\n receiverId?: string // 专家或智能体\n conversationId?: string // 会话Id\n conversationStrategy?: ConversationStrategy\n}\nexport interface ChatHandle {\n sendMessage: (message?: string, files?: InputFile[]) => void\n switchAgentConversation: (agentId: AgentInfo['id'], strategy?: ConversationStrategy) => Promise<void>\n switchConversation: (id?: Conversation['id']) => Promise<void>\n createConversation: () => Promise<void>\n setReferences: (references?: ReferencesType) => void\n setMessage: (message?: string) => void\n setFiles: (files?: InputFile[]) => void\n setParams: (params?: ChatParams) => void\n setServices: (services?: ChatServices) => void\n senderFocus: ChatSenderHandle['focus']\n}\nexport interface ChatProps {\n theme?: ThemeConfig\n config?: ChatConfig\n params?: ChatParams\n hooks?: ChatHooks\n layout?: ChatLayout\n userInfo?: UserInfo\n services?: ChatServices\n}\nexport default forwardRef<ChatHandle, ChatProps>(({ theme, params, userInfo, hooks, layout, config, services }: ChatProps, ref) => {\n const chatStore = useMemo(() => createChatStore(), [])\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 const receiverState = useSnapshot(chatStore.receiver)\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 // 计算Splitter的尺寸\n const [sizes, setSizes] = useState([0, '100%'])\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 // 会话Socket\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 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 useEffect(() => {\n configState.hooks?.onBeforeInit?.()\n // setTimeout(() => {\n // setA([a[0]])\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 {/** 对话区 - header */}\n <RenderWrapper control={configState.layout.globalHeader} DefaultComponent={ChatHeader} />\n <Flex className=\"full-scroll\">\n <RenderWrapper control={configState.layout.leftPanel} />\n\n <RenderWrapper control={configState.layout.conversationList} DefaultComponent={ConversationListPanel} />\n <Splitter className=\"flex-1\" onResize={setSplitterSizes}>\n <Splitter.Panel collapsible={false} min={600} size={sizes[0]}>\n {hasPreView && (\n <>\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 {(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: LgPrimaryColor }} />\n // 保存中\n // </Flex>\n // </Tag>\n // )\n }\n />\n )}\n </>\n )}\n </Splitter.Panel>\n\n <Splitter.Panel collapsible={false} max={800} min={400} size={sizes[1]}>\n <Flex vertical className={classNames('height-full')}>\n {/** 对话区 - header */}\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 {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 <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 <RenderWrapper\n control={configState.layout.disclaimerNotice as ChatLayout['disclaimerNotice']}\n DefaultComponent={<div className={styles.nsDisclaimerNotice}>内容由AI生成,仅供参考,请仔细甄别</div>}\n />\n </Flex>\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 { 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={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 { 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 { copy } from '../../core/utils'\nimport { ConversationMessage } from '../../services'\nimport { ChatLayoutMessageList, MessageBoxType } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport MessageAIRender from './MessageAIRender'\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 content:\n role.user === 'agent' ? (\n <MessageAIRender message={message as ConversationMessage} placement={role.placement} />\n ) : (\n <MessageRender message={message as ConversationMessage} placement={role.placement} />\n ),\n footer: role.user === 'agent' && (\n <Flex>\n <Button onClick={() => copy(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 // 小于 100px 表示接近底部,允许自动滚动\n autoScrollRef.current = distanceToBottom < 100\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.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.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","import { Bubble, BubbleProps } from '@ant-design/x'\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Collapse, Flex, Spin, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { ConversationMessage } from '../../services'\nimport { customComponents } from './markdownAlert'\nimport styles from './styles.module.less'\n\ninterface Props {\n message?: ConversationMessage\n placement: BubbleProps['placement']\n}\n\nfunction extractThinkContent(content: string): {\n mainContent: string\n thinkContents: string[]\n thinkBuffer: string\n} {\n let main = content\n const thinkContents: string[] = []\n let buffer = ''\n\n const regex = /<think>(.*?)<\\/think>/gs\n for (const match of content.matchAll(regex)) {\n const thinkText = match[1].trim()\n thinkContents.push(thinkText)\n main = main.replace(match[0], '')\n }\n\n const lastStart = content.lastIndexOf('<think>')\n const lastEnd = content.lastIndexOf('</think>')\n if (lastStart > lastEnd) {\n buffer = content.slice(lastStart).replace('<think>', '')\n main = main.slice(0, lastStart)\n }\n\n return { mainContent: main, thinkContents, thinkBuffer: buffer }\n}\n\nfunction renderMarkdownPanel(content: string, label: string, key: string) {\n return {\n key,\n label,\n children: <RenderMarkdown content={content} customComponents={customComponents} />\n }\n}\n\nexport default ({ message, placement }: Props) => {\n const { mainContent, thinkContents, thinkBuffer } = useMemo(() => {\n if (!message?.msgContent) return { mainContent: '', thinkContents: [], thinkBuffer: '' }\n return extractThinkContent(message.msgContent)\n }, [message?.msgContent])\n\n if (!message.msgContent) {\n return (\n <Typography>\n <Spin size={'small'} />\n </Typography>\n )\n }\n return (\n <Flex vertical>\n <Bubble\n placement={placement}\n className={classNames({ [styles.loadingMessage]: message.type && message.type !== 'TEXT_MESSAGE_END' })}\n content={\n <>\n {/* 渲染 think 内容,默认展开所有项 */}\n {thinkContents.length > 0 && (\n <Collapse\n ghost\n size=\"small\"\n className={styles.think}\n defaultActiveKey={thinkContents.map((_, i) => `think-${i}`)}\n items={thinkContents.map((content, index) => renderMarkdownPanel(content, `思考过程`, `think-${index}`))}\n />\n )}\n\n {/* 渲染缓冲中的 think 内容 */}\n {thinkBuffer && (\n <Collapse\n ghost\n size=\"small\"\n className={styles.think}\n defaultActiveKey={['buffer-think']}\n items={[renderMarkdownPanel(thinkBuffer, '仔细思考中...', 'buffer-think')]}\n />\n )}\n\n {/* 渲染主内容 */}\n {/* {mainContent && message.status === 'error' ? (\n <div>\n <CloseCircleOutlined color={'red'} /> {mainContent}\n </div>\n ) : ( */}\n <RenderMarkdown content={mainContent} customComponents={customComponents} />\n {/* )} */}\n </>\n }\n />\n </Flex>\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 { 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"]}
|