@ai-group/chat-sdk 3.0.5 → 3.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js +10 -0
  2. package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js.map +2 -2
  3. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +1 -0
  4. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +2 -0
  5. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  6. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +7 -1
  7. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  8. package/dist/cjs/components/XAdkChatbot/index.js +18 -1
  9. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  10. package/dist/cjs/components/XAdkProvider/XAdkProvider.stories.js +2 -2
  11. package/dist/cjs/components/XAdkProvider/XAdkProvider.stories.js.map +1 -1
  12. package/dist/cjs/components/XAdkProvider/compound/Messages.js +63 -9
  13. package/dist/cjs/components/XAdkProvider/compound/Messages.js.map +3 -3
  14. package/dist/cjs/components/XAdkProvider/context/ChatActionContext.d.ts +5 -0
  15. package/dist/cjs/components/XAdkProvider/context/ChatActionContext.js.map +2 -2
  16. package/dist/cjs/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
  17. package/dist/cjs/components/XAdkProvider/context/ChatStateContext.js.map +2 -2
  18. package/dist/cjs/components/XAdkProvider/index.d.ts +1 -1
  19. package/dist/cjs/components/XAdkProvider/index.js +13 -7
  20. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  21. package/dist/cjs/components/XAdkSender/XAdkSender.stories.d.ts +2 -2
  22. package/dist/cjs/components/XAdkSender/XAdkSender.stories.js.map +2 -2
  23. package/dist/cjs/hooks/useADKChat.d.ts +4 -0
  24. package/dist/cjs/hooks/useADKChat.js +24 -2
  25. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  26. package/dist/cjs/types/ChatHook.d.ts +6 -1
  27. package/dist/cjs/types/ChatHook.js.map +1 -1
  28. package/dist/cjs/types/XAdkChatbot.d.ts +1 -1
  29. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  30. package/dist/cjs/types/XAdkProvider.d.ts +6 -1
  31. package/dist/cjs/types/XAdkProvider.js.map +1 -1
  32. package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js +8 -0
  33. package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js.map +1 -1
  34. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +1 -0
  35. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +2 -0
  36. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  37. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +1 -1
  38. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  39. package/dist/esm/components/XAdkChatbot/index.js +26 -5
  40. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  41. package/dist/esm/components/XAdkProvider/XAdkProvider.stories.js +2 -2
  42. package/dist/esm/components/XAdkProvider/XAdkProvider.stories.js.map +1 -1
  43. package/dist/esm/components/XAdkProvider/compound/Messages.js +124 -11
  44. package/dist/esm/components/XAdkProvider/compound/Messages.js.map +1 -1
  45. package/dist/esm/components/XAdkProvider/context/ChatActionContext.d.ts +5 -0
  46. package/dist/esm/components/XAdkProvider/context/ChatActionContext.js.map +1 -1
  47. package/dist/esm/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
  48. package/dist/esm/components/XAdkProvider/context/ChatStateContext.js.map +1 -1
  49. package/dist/esm/components/XAdkProvider/index.d.ts +1 -1
  50. package/dist/esm/components/XAdkProvider/index.js +26 -7
  51. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  52. package/dist/esm/components/XAdkSender/XAdkSender.stories.d.ts +2 -2
  53. package/dist/esm/components/XAdkSender/XAdkSender.stories.js +13 -13
  54. package/dist/esm/components/XAdkSender/XAdkSender.stories.js.map +1 -1
  55. package/dist/esm/hooks/useADKChat.d.ts +4 -0
  56. package/dist/esm/hooks/useADKChat.js +79 -28
  57. package/dist/esm/hooks/useADKChat.js.map +1 -1
  58. package/dist/esm/types/ChatHook.d.ts +6 -1
  59. package/dist/esm/types/ChatHook.js.map +1 -1
  60. package/dist/esm/types/XAdkChatbot.d.ts +1 -1
  61. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  62. package/dist/esm/types/XAdkProvider.d.ts +6 -1
  63. package/dist/esm/types/XAdkProvider.js.map +1 -1
  64. package/dist/umd/chat-sdk.min.css +1 -1
  65. package/dist/umd/chat-sdk.min.js +1 -1
  66. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/useADKChat.ts"],
4
- "sourcesContent": ["import { useEffect, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n fetchEventSource,\n EventStreamContentType,\n} from \"@microsoft/fetch-event-source\";\nimport { message } from \"antd\";\nimport { v4 } from \"uuid\";\nimport { SESSION_PAGE_SIZE, API_SUCCESS_CODE } from \"@/constants\";\nimport {\n SuccessCode,\n ErrorCode,\n DebugOptions,\n FunctionCall,\n SendContent,\n SessionData,\n AgentRunRequest,\n Event,\n FunctionResponse,\n IMessage,\n Part,\n} from \"@/types\";\nimport {\n fetchAppConfig,\n fetchSessionList,\n fetchSessionDetail,\n closeSession,\n updateSessionTitle,\n type ChatConfig,\n} from \"@/services/api\";\nimport { safeJsonParse } from \"@/utils\";\n\nconst combineTextParts = (parts: Part[]) => {\n const result: Part[] = [];\n let combinedTextPart: Part | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const part of parts) {\n if (part.text) {\n // 如果没有 combined 或 combined 思考类型跟当前 part 不同,则创建新的合并引用\n if (!combinedTextPart || combinedTextPart.thought !== part.thought) {\n combinedTextPart = { ...part };\n result.push(combinedTextPart);\n } else {\n combinedTextPart.text += part.text;\n }\n } else {\n combinedTextPart = undefined;\n result.push(part);\n }\n }\n return result;\n};\n\nfunction useADKChat({\n url,\n token,\n config = {},\n type = \"agentDebug\",\n enabled = true, // ← 新增: 是否启用 Hook\n onError,\n onMessage,\n onSuccess,\n onStream,\n}: DebugOptions) {\n const [loading, setLoading] = useState(false);\n const ctrl = useRef<AbortController | null>(null);\n // 应用配置\n const { appNo, showFirstSession } = config || {};\n const [appInfo, setAppInfo] = useState<ChatConfig | null>(null);\n // 初始化完成\n const [initialized, setInitialized] = useState(false);\n // 会话记录\n const [sessionList, setSessionList] = useState<SessionData[]>([]);\n // 当前会话\n const [currentSessionId, setCurrentSessionId] = useState<string>(() => v4());\n // 会话分页设置\n const [sessionPagination, setSessionPagination] = useState({\n total: 0,\n pageNum: 1,\n pageSize: SESSION_PAGE_SIZE,\n });\n // 开场白\n const [prologue, setPrologue] = useState<string>(\"\");\n // 建议问题\n const [suggestedQuestions, setSuggestedQuestions] = useState<string[]>([]);\n const [messages, setMessages] = useState<IMessage[]>([]);\n const mergedMessages = useMemo(() => {\n const fnResMap: Record<string, FunctionResponse> = {};\n messages.forEach((msg) => {\n if (msg.functionResponse) {\n fnResMap[msg?.functionResponse?.id || \"\"] = msg.functionResponse;\n }\n });\n return messages.map((msg) => {\n if (msg.functionCall) {\n return {\n ...msg,\n functionResponse: fnResMap[msg?.functionCall?.id || \"\"],\n };\n }\n return msg;\n });\n }, [messages]);\n const textMsgRef = useRef<IMessage>(null);\n const eventDataRef = useRef<Map<string, any>>(new Map());\n\n // 插入消息\n const insertMessage = useCallback((msg: IMessage) => {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.isLoading) {\n return [...prev.slice(0, -1), msg, lastMessage];\n }\n return [...prev, msg];\n });\n }, []);\n\n // 初始化开场白预设置问题\n const insertSuggestedQuestions = (suggested_questions: string[] = []) => {\n if (!suggested_questions?.length) return;\n // 无消息内容 且 有建议问题时\n if (messages.length === 0 && suggested_questions.length) {\n setSuggestedQuestions(suggested_questions);\n }\n };\n\n // 初始化开场白\n const insertPrologue = (prologue: string) => {\n if (prologue) {\n setPrologue(prologue);\n }\n };\n\n // 更新消息\n const updateMessage = useCallback((msg: IMessage) => {\n setMessages((prev) => {\n return prev.map((m) => {\n if (m.id === msg.id) {\n return msg;\n }\n return m;\n });\n });\n }, []);\n\n // 存储事件\n const storeEvents = useCallback((part: Part | null, event: any) => {\n let title = \"\";\n\n if (part == null && event.actions?.artifactDelta) {\n title += \"eventAction: artifact\";\n } else if (part) {\n if (part.text) {\n title += `text:${part.text}`;\n } else if (part.functionCall) {\n title += `functionCall:${part.functionCall.name}`;\n } else if (part.functionResponse) {\n title += `functionResponse:${part.functionResponse.name}`;\n } else if (part.executableCode) {\n title += `executableCode:${part.executableCode.code?.slice(0, 10)}`;\n } else if (part.codeExecutionResult) {\n title += `codeExecutionResult:${part.codeExecutionResult.outcome}`;\n } else if (part.errorMessage) {\n title += `errorMessage:${part.errorMessage}`;\n }\n }\n\n const updatedEvent = { ...event, title };\n\n const newEventData = new Map(eventDataRef.current);\n newEventData.set(event.id, updatedEvent);\n eventDataRef.current = newEventData;\n }, []);\n\n // 存储消息\n const storeMessage = useCallback(\n (part: Part | null, event: Event, role: \"user\" | \"bot\") => {\n const msg: IMessage = {\n id: v4(),\n author: event.author,\n invocationId: event.invocationId,\n eventId: event.id,\n timestamp: event.timestamp,\n isLike: event.isLike || 0,\n role,\n };\n\n if (part) {\n if (part.inlineData) {\n msg.inlineData = {\n displayName: part.inlineData.displayName,\n data: part.inlineData.data,\n mimeType: part.inlineData.mimeType,\n };\n } else if (part.text) {\n msg.text = part.text;\n msg.thought = part.thought;\n\n if (event?.groundingMetadata?.searchEntryPoint?.renderedContent) {\n msg.renderedContent =\n event.groundingMetadata.searchEntryPoint.renderedContent;\n }\n } else if (part.fileData) {\n msg.fileData = [part.fileData];\n } else if (part.functionCall) {\n msg.functionCall = part.functionCall;\n } else if (part.functionResponse) {\n msg.functionResponse = part.functionResponse;\n } else if (part.executableCode) {\n msg.executableCode = part.executableCode;\n } else if (part.codeExecutionResult) {\n msg.codeExecutionResult = part.codeExecutionResult;\n }\n }\n\n if (part && Object.keys(part).length > 0) {\n insertMessage(msg);\n }\n },\n [insertMessage],\n );\n\n // 处理消息部分(关键更新)\n const processPart = useCallback(\n (event: Event, part: Part) => {\n const renderedContent =\n event.groundingMetadata?.searchEntryPoint?.renderedContent;\n if (part.text) {\n const newChunk = part.text;\n\n if (\n !textMsgRef.current ||\n textMsgRef.current.thought !== part.thought\n ) {\n const newMessage: IMessage = {\n id: v4(),\n author: event.author,\n invocationId: event.invocationId,\n eventId: event.id,\n timestamp: event.timestamp,\n role: \"bot\",\n text: newChunk,\n isLike: event.isLike || 0,\n thought: part.thought,\n };\n\n if (renderedContent) {\n newMessage.renderedContent = renderedContent;\n }\n\n textMsgRef.current = newMessage;\n // 存储原数据\n storeEvents(part, event);\n // 插入消息\n insertMessage(newMessage);\n } else {\n if (event.partial === false) {\n storeEvents(part, event);\n textMsgRef.current = null;\n return;\n }\n if (renderedContent) {\n textMsgRef.current = {\n ...textMsgRef.current,\n renderedContent,\n };\n }\n textMsgRef.current = {\n ...textMsgRef.current,\n text: (textMsgRef.current.text || \"\") + newChunk,\n };\n updateMessage(textMsgRef.current);\n }\n } else {\n textMsgRef.current = null;\n storeEvents(part, event);\n storeMessage(part, event, \"bot\");\n }\n },\n [storeEvents, storeMessage, insertMessage, updateMessage],\n );\n\n // 处理建议类消息\n const processFollowupPart = useCallback(\n (event: Event) => {\n // 获取建议类消息的文本内容\n const part = event?.content?.parts?.[0] || null;\n const text = part?.text || \"\";\n storeEvents(part, event);\n if (text) {\n setSuggestedQuestions((prev) => [...prev, text]);\n }\n },\n [storeEvents, insertMessage],\n );\n\n // 处理错误消息\n const processErrorMessage = useCallback(\n (chunkJson: any) => {\n storeEvents(null, chunkJson);\n insertMessage({\n id: v4(),\n text: chunkJson.errorMessage,\n role: \"bot\",\n });\n },\n [storeEvents, insertMessage],\n );\n\n // 处理动作和制品\n const processActionArtifact = useCallback(\n (event: any) => {\n if (event.actions && event.actions.artifactDelta) {\n storeEvents(null, event);\n storeMessage(null, event, \"bot\");\n }\n },\n [storeEvents, storeMessage],\n );\n\n // 发送消息请求\n const sendMessageRequest = useCallback(\n (values: AgentRunRequest) => {\n return new Promise<void>((resolve) => {\n if (ctrl.current) {\n ctrl.current.abort();\n }\n setLoading(true);\n ctrl.current = new AbortController();\n const requestUrl = `${url}/api/gateway-web/openApi/v1/aizt/app/${appNo}/sendMsgStreaming`;\n\n fetchEventSource(requestUrl, {\n method: \"POST\",\n signal: ctrl.current.signal,\n body: JSON.stringify(values),\n openWhenHidden: true,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n stream: \"true\",\n Authorization: `Bearer ${token}`,\n },\n async onopen(response) {\n if (\n response.ok &&\n response.headers.get(\"content-type\") === EventStreamContentType\n ) {\n // everything's good\n } else if (\n response.status >= 400 &&\n response.status < 500 &&\n response.status !== 429\n ) {\n resolve();\n } else {\n resolve();\n }\n },\n onmessage: (event) => {\n const rawData = safeJsonParse(event.data, {});\n\n // 处理新的数据格式: { data: {...}, result: {...} }\n let chunkJson: Event = rawData;\n if (rawData.data && rawData.result) {\n // 转换为旧格式\n chunkJson = {\n ...rawData.data,\n content: rawData.data, // data 本身就是 content\n invocationId: rawData.result.invocationId,\n sessionId: rawData.result.sessionId,\n id: rawData.result.invocationId,\n };\n }\n\n if (chunkJson.error) {\n message.warning(chunkJson.error);\n return;\n }\n onStream?.(chunkJson);\n if (chunkJson.content) {\n // 建议类消息单独处理\n if (chunkJson.content.role === \"followup\") {\n processFollowupPart(chunkJson);\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n for (const part of combineTextParts(chunkJson.content.parts)) {\n processPart(chunkJson, part);\n }\n } else if (chunkJson.errorMessage) {\n processErrorMessage(chunkJson);\n } else if (chunkJson.actions) {\n processActionArtifact(chunkJson);\n }\n },\n onclose: () => {\n setLoading(false);\n if (textMsgRef.current) {\n onMessage?.(textMsgRef.current?.text || \"\", textMsgRef.current);\n }\n textMsgRef.current = null;\n resolve();\n },\n onerror: (error) => {\n setLoading(false);\n resolve();\n console.error(\"EventSource failed:\", error);\n throw error;\n },\n });\n });\n },\n [\n type,\n currentSessionId,\n processActionArtifact,\n processErrorMessage,\n processPart,\n ],\n );\n\n // 发送会话\n const startChat = async ({\n text = \"\",\n files = [],\n functionResponse,\n }: SendContent) => {\n if (loading) return;\n if (!text.trim() && !functionResponse) return;\n // 清空建议问题\n setSuggestedQuestions([]);\n // 发送消息\n setMessages((prev) => {\n let temp = [...prev];\n // 如果 text 存在\n if (text.trim()) {\n temp.push({\n id: v4(),\n role: \"user\",\n text,\n });\n }\n // 如果file 存在\n if (files.length > 0) {\n temp.push({\n id: v4(),\n role: \"user\",\n fileData: files.map((file) => ({\n displayName: file.name,\n mimeType: file.response?.mimeType,\n fileUri: file.response?.fileUrl,\n })),\n });\n }\n // 如果 functionResponse 存在\n if (functionResponse) {\n temp.push({\n id: v4(),\n role: \"user\",\n functionResponse,\n });\n }\n return temp;\n });\n await sendMessageRequest({\n stream: true,\n sessionId: currentSessionId,\n content: {\n role: \"user\",\n parts: functionResponse ? [{ functionResponse }] : [{ text }],\n },\n files: files.map((file) => ({\n fileName: file.response?.fileName,\n fileId: file.response?.fileId,\n tempUrl: file.response?.fileUrl,\n type: file.response?.fileType,\n mimeType: file.response?.mimeType,\n })),\n });\n // 获取聊天记录\n initAppConversations();\n };\n\n // 重新发送会话\n const reChat = () => {\n if (loading) return;\n if (messages.length === 0) return;\n setMessages((prev) => {\n const newMessages = [...prev];\n // 删除最后一条 AI 消息\n const lastAIIndex = newMessages.findLastIndex(\n (msg) => msg.role === \"bot\",\n );\n if (lastAIIndex !== -1) {\n newMessages.splice(lastAIIndex, 1);\n }\n // 清空建议问题\n setSuggestedQuestions([]);\n // 重新发送最后一条用户消息\n const lastUserMessage = newMessages.findLast(\n (msg) => msg.role === \"user\",\n );\n if (lastUserMessage) {\n const { text = \"\", fileData = [] } = lastUserMessage;\n sendMessageRequest({\n stream: true,\n sessionId: currentSessionId,\n content: {\n role: \"user\",\n parts: [\n {\n text,\n },\n ],\n },\n files: fileData?.map((file) => ({\n fileName: file.displayName,\n tempUrl: file.fileUri,\n mimeType: file.mimeType,\n })),\n });\n }\n\n return newMessages;\n });\n };\n\n // 确认函数调用\n const confirmFnCall = (fnCall: FunctionCall, confirmed: boolean) => {\n const functionResponse = {\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n };\n startChat({ functionResponse });\n };\n\n // 使用建议问题\n const suggestChat = (text: string) => {\n if (loading) return;\n if (!text.trim()) return;\n setSuggestedQuestions([]);\n startChat({ text });\n };\n\n // 停止会话\n const stopChat = useCallback(() => {\n ctrl.current?.abort();\n setLoading(false);\n textMsgRef.current = null;\n }, [ctrl]);\n\n // 清除/重置会话\n const clearChat = () => {\n const newSessionId = v4();\n setCurrentSessionId(newSessionId);\n // 重置聊天内容\n stopChat();\n setPrologue(appInfo?.onboardingInfo?.prologue || \"\");\n setMessages([]);\n setSuggestedQuestions(appInfo?.onboardingInfo?.suggested_questions || []);\n };\n\n // 格式化会话记录\n const formatMessages = (messages: any[], isReplace = false) => {\n const mapped: IMessage[] = [];\n messages.forEach((item) => {\n if (!item || !item.content || !Array.isArray(item.content.parts)) return;\n\n const role =\n (item.content.role || \"\").toLowerCase() === \"user\" ? \"user\" : \"bot\";\n const parts = Array.isArray(item.content.parts)\n ? item.content.parts.filter((p: any) => {\n if (!p) return false;\n return Boolean(\n p.text ||\n p.inlineData ||\n p.functionCall ||\n p.functionResponse ||\n p.fileData ||\n p.executableCode ||\n p.codeExecutionResult ||\n p.errorMessage,\n );\n })\n : [];\n\n if (parts.length === 0) return;\n parts.forEach((part: any) => {\n const msg: IMessage = {\n id: v4(),\n author: item.author,\n invocationId: item.invocationId,\n eventId: item.id,\n timestamp: item.timestamp,\n isLike: item.isLike,\n role,\n raw: item,\n } as IMessage;\n\n if (part.inlineData) {\n msg.inlineData = {\n displayName: part.inlineData.displayName,\n data: part.inlineData.data,\n mimeType: part.inlineData.mimeType,\n } as any;\n }\n if (part.text) {\n msg.text = part.text;\n if (typeof part.thought !== \"undefined\") msg.thought = part.thought;\n }\n if (part.functionCall) msg.functionCall = part.functionCall;\n if (part.fileData) {\n msg.inlineData = {\n displayName: part.fileData.displayName || \"\",\n data: part.fileData.fileUri,\n mimeType: part.fileData.mimeType,\n } as any;\n }\n if (part.executableCode) msg.executableCode = part.executableCode;\n if (part.codeExecutionResult)\n msg.codeExecutionResult = part.codeExecutionResult;\n if (part.errorMessage) msg.text = part.errorMessage;\n // 补全函数调用结果\n if (part.functionResponse) {\n // 通过 functionCall.id 寻找对应的函数调用消息,在那条消息上添加functionResponse\n const functionCallMsg = mapped.find(\n (msg) => msg.functionCall?.id === part.functionResponse?.id,\n );\n if (functionCallMsg) {\n functionCallMsg.functionResponse = part.functionResponse;\n }\n return;\n }\n mapped.push(msg);\n });\n });\n\n setMessages((prev) => (isReplace ? mapped : [...prev, ...mapped]));\n };\n\n // 设置当前会话详情\n const setCurrentSessionDetail = async (sessionId: string) => {\n if (sessionId) {\n if (sessionId === currentSessionId) {\n return;\n }\n setCurrentSessionId(sessionId); // 设置当前会话 id;\n const { data, result } = await fetchSessionDetail({\n url,\n appNo,\n sessionId,\n token,\n });\n\n if (result?.code === API_SUCCESS_CODE) {\n setPrologue(appInfo?.onboardingInfo?.prologue || \"\");\n // 新接口直接返回按 event/item 结构的数组,传入 formatMessages 处理\n if (Array.isArray(data) && data.length > 0) {\n formatMessages(data, true);\n } else {\n setSuggestedQuestions(\n appInfo?.onboardingInfo?.suggested_questions || [],\n );\n }\n }\n } else {\n // 兼容 无 session异常\n setCurrentSessionId(v4());\n }\n };\n\n // 获取聊天记录\n const initAppConversations = async (fetchDetail = false) => {\n try {\n setLoading(true);\n\n const {\n data = [],\n pagination,\n result,\n } = await fetchSessionList({\n url,\n appNo,\n token,\n pageSize: sessionPagination.pageSize,\n });\n\n if (result?.code === API_SUCCESS_CODE) {\n if (data.length > 0) {\n const formatSessions = data.map((item) => {\n return {\n key: item.sessionId,\n label: item.title || \"新对话\",\n timestamp: new Date(item.startTime).getTime(),\n messages: [],\n meta: {\n ...item,\n },\n };\n });\n\n setSessionList(formatSessions);\n // 设置分页信息\n setSessionPagination({\n pageNum: sessionPagination.pageNum,\n pageSize: sessionPagination.pageSize,\n total: pagination?.total || 0,\n });\n const { sessionId } = data?.[0];\n if (showFirstSession) {\n setCurrentSessionDetail(sessionId);\n } else {\n fetchDetail && setPrologue(appInfo?.onboardingInfo?.prologue || \"\");\n fetchDetail &&\n setSuggestedQuestions(\n appInfo?.onboardingInfo?.suggested_questions || [],\n );\n }\n // 成功回调\n if (!initialized) {\n onSuccess?.({\n code: SuccessCode.APP_MESSAGES_INIT_SUCCESS,\n message: \"初始化聊天记录成功\",\n data: {\n sessionId,\n },\n });\n setInitialized(true);\n }\n } else {\n // 无会话记录时,初始化会话详情\n clearChat();\n }\n } else {\n setSessionList([]);\n setCurrentSessionId(v4());\n setPrologue(\"\");\n setSuggestedQuestions([]);\n }\n } catch {\n //\n } finally {\n setLoading(false);\n }\n };\n\n // 删除会话\n const deleteSession = async (sessionId: string) => {\n if (!sessionId) return;\n const { result } = await closeSession({\n url,\n appNo,\n sessionId,\n token,\n });\n if (result?.code === API_SUCCESS_CODE) {\n // 删除成功后,重新获取会话列表\n initAppConversations(true);\n // 如果删除的是当前会话,则创建新的会话\n if (sessionId === currentSessionId) {\n clearChat();\n }\n } else {\n message.error(\"删除会话失败\");\n }\n };\n\n // 更新会话名称\n const updateSession = async (sessionId: string, title: string) => {\n if (!sessionId && !title) return;\n const { result } = await updateSessionTitle({\n url,\n appNo,\n title,\n sessionId,\n token,\n });\n if (result?.code === API_SUCCESS_CODE) {\n // 编辑成功后,重新获取会话列表\n initAppConversations();\n } else {\n message.error(\"更新会话失败\");\n }\n };\n\n // 初始化应用\n const initConfig = async () => {\n try {\n setLoading(true);\n const { data, result } = await fetchAppConfig({ url, appNo });\n if (result.code === API_SUCCESS_CODE) {\n setAppInfo(data);\n // 成功回调\n onSuccess?.({\n code: SuccessCode.APP_CONFIG_INIT_SUCCESS,\n message: \"初始化配置成功\",\n });\n } else {\n onError?.({\n code: (result.code as ErrorCode) || ErrorCode.APP_NOT_FOUND,\n message: result.message || \"获取应用配置失败\",\n });\n }\n } catch (error) {\n onError?.({\n code: ErrorCode.API_ERROR,\n message: \"获取应用配置失败\",\n });\n } finally {\n setLoading(false);\n }\n };\n\n // 初始化—获取配置 (仅在启用时)\n useEffect(() => {\n if (enabled && url && appNo) {\n initConfig();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, url, appNo]);\n\n // 初始化-聊天记录\n useEffect(() => {\n if (appInfo) {\n initAppConversations(true);\n }\n }, [appInfo]);\n\n return {\n appInfo,\n startChat,\n reChat,\n stopChat,\n clearChat,\n suggestChat,\n confirmFnCall,\n initialized,\n currentSessionId,\n sessionList,\n sessionPagination,\n prologue,\n suggestions: suggestedQuestions,\n loading,\n messages: mergedMessages,\n insertSuggestedQuestions,\n insertPrologue,\n deleteSession,\n updateSession,\n setSuggestedQuestions,\n setCurrentSessionDetail,\n setMessages,\n storeEvents,\n storeMessage,\n };\n}\n\nexport default useADKChat;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { useEffect, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n fetchEventSource,\n EventStreamContentType,\n} from \"@microsoft/fetch-event-source\";\nimport { message } from \"antd\";\nimport { v4 } from \"uuid\";\nimport { SESSION_PAGE_SIZE, API_SUCCESS_CODE } from \"@/constants\";\nimport {\n SuccessCode,\n ErrorCode,\n DebugOptions,\n FunctionCall,\n SendContent,\n SessionData,\n AgentRunRequest,\n Event,\n FunctionResponse,\n IMessage,\n Part,\n} from \"@/types\";\nimport {\n fetchAppConfig,\n fetchSessionList,\n fetchSessionDetail,\n closeSession,\n updateSessionTitle,\n addFeedback,\n type ChatConfig,\n} from \"@/services/api\";\nimport { safeJsonParse } from \"@/utils\";\n\nconst combineTextParts = (parts: Part[]) => {\n const result: Part[] = [];\n let combinedTextPart: Part | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const part of parts) {\n if (part.text) {\n // 如果没有 combined 或 combined 思考类型跟当前 part 不同,则创建新的合并引用\n if (!combinedTextPart || combinedTextPart.thought !== part.thought) {\n combinedTextPart = { ...part };\n result.push(combinedTextPart);\n } else {\n combinedTextPart.text += part.text;\n }\n } else {\n combinedTextPart = undefined;\n result.push(part);\n }\n }\n return result;\n};\n\nfunction useADKChat({\n url = window.location.origin,\n token,\n config = {},\n type = \"agentDebug\",\n enabled = true, // ← 新增: 是否启用 Hook\n onError,\n onMessage,\n onSuccess,\n onStream,\n}: DebugOptions) {\n const [loading, setLoading] = useState(false);\n const ctrl = useRef<AbortController | null>(null);\n // 应用配置\n const { appNo, showFirstSession } = config || {};\n const [appInfo, setAppInfo] = useState<ChatConfig | null>(null);\n // 初始化完成\n const [initialized, setInitialized] = useState(false);\n // 会话记录\n const [sessionList, setSessionList] = useState<SessionData[]>([]);\n // 当前会话\n const [currentSessionId, setCurrentSessionId] = useState<string>(() => v4());\n // 会话分页设置\n const [sessionPagination, setSessionPagination] = useState({\n total: 0,\n pageNum: 1,\n pageSize: SESSION_PAGE_SIZE,\n });\n // 开场白\n const [prologue, setPrologue] = useState<string>(\"\");\n // 建议问题\n const [suggestedQuestions, setSuggestedQuestions] = useState<string[]>([]);\n const [messages, setMessages] = useState<IMessage[]>([]);\n const mergedMessages = useMemo(() => {\n const fnResMap: Record<string, FunctionResponse> = {};\n messages.forEach((msg) => {\n if (msg.functionResponse) {\n fnResMap[msg?.functionResponse?.id || \"\"] = msg.functionResponse;\n }\n });\n return messages.map((msg) => {\n if (msg.functionCall) {\n return {\n ...msg,\n functionResponse: fnResMap[msg?.functionCall?.id || \"\"],\n };\n }\n return msg;\n });\n }, [messages]);\n const textMsgRef = useRef<IMessage>(null);\n const eventDataRef = useRef<Map<string, any>>(new Map());\n\n // 插入消息\n const insertMessage = useCallback((msg: IMessage) => {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.isLoading) {\n return [...prev.slice(0, -1), msg, lastMessage];\n }\n return [...prev, msg];\n });\n }, []);\n\n // 初始化开场白预设置问题\n const insertSuggestedQuestions = (suggested_questions: string[] = []) => {\n if (!suggested_questions?.length) return;\n // 无消息内容 且 有建议问题时\n if (messages.length === 0 && suggested_questions.length) {\n setSuggestedQuestions(suggested_questions);\n }\n };\n\n // 初始化开场白\n const insertPrologue = (prologue: string) => {\n if (prologue) {\n setPrologue(prologue);\n }\n };\n\n // 更新消息\n const updateMessage = useCallback((msg: IMessage) => {\n setMessages((prev) => {\n return prev.map((m) => {\n if (m.id === msg.id) {\n return msg;\n }\n return m;\n });\n });\n }, []);\n\n // 存储事件\n const storeEvents = useCallback((part: Part | null, event: any) => {\n let title = \"\";\n\n if (part == null && event.actions?.artifactDelta) {\n title += \"eventAction: artifact\";\n } else if (part) {\n if (part.text) {\n title += `text:${part.text}`;\n } else if (part.functionCall) {\n title += `functionCall:${part.functionCall.name}`;\n } else if (part.functionResponse) {\n title += `functionResponse:${part.functionResponse.name}`;\n } else if (part.executableCode) {\n title += `executableCode:${part.executableCode.code?.slice(0, 10)}`;\n } else if (part.codeExecutionResult) {\n title += `codeExecutionResult:${part.codeExecutionResult.outcome}`;\n } else if (part.errorMessage) {\n title += `errorMessage:${part.errorMessage}`;\n }\n }\n\n const updatedEvent = { ...event, title };\n\n const newEventData = new Map(eventDataRef.current);\n newEventData.set(event.id, updatedEvent);\n eventDataRef.current = newEventData;\n }, []);\n\n // 存储消息\n const storeMessage = useCallback(\n (part: Part | null, event: Event, role: \"user\" | \"bot\") => {\n const msg: IMessage = {\n id: v4(),\n author: event.author,\n invocationId: event.invocationId,\n eventId: event.id,\n timestamp: event.timestamp,\n isLike: event.isLike || 0,\n role,\n };\n\n if (part) {\n if (part.inlineData) {\n msg.inlineData = {\n displayName: part.inlineData.displayName,\n data: part.inlineData.data,\n mimeType: part.inlineData.mimeType,\n };\n } else if (part.text) {\n msg.text = part.text;\n msg.thought = part.thought;\n\n if (event?.groundingMetadata?.searchEntryPoint?.renderedContent) {\n msg.renderedContent =\n event.groundingMetadata.searchEntryPoint.renderedContent;\n }\n } else if (part.fileData) {\n msg.fileData = [part.fileData];\n } else if (part.functionCall) {\n msg.functionCall = part.functionCall;\n } else if (part.functionResponse) {\n msg.functionResponse = part.functionResponse;\n } else if (part.executableCode) {\n msg.executableCode = part.executableCode;\n } else if (part.codeExecutionResult) {\n msg.codeExecutionResult = part.codeExecutionResult;\n }\n }\n\n if (part && Object.keys(part).length > 0) {\n insertMessage(msg);\n }\n },\n [insertMessage],\n );\n\n // 处理消息部分(关键更新)\n const processPart = useCallback(\n (event: Event, part: Part) => {\n const renderedContent =\n event.groundingMetadata?.searchEntryPoint?.renderedContent;\n if (part.text) {\n const newChunk = part.text;\n\n if (\n !textMsgRef.current ||\n textMsgRef.current.thought !== part.thought\n ) {\n const newMessage: IMessage = {\n id: v4(),\n author: event.author,\n invocationId: event.invocationId,\n eventId: event.id,\n timestamp: event.timestamp,\n role: \"bot\",\n text: newChunk,\n isLike: event.isLike || 0,\n thought: part.thought,\n };\n\n if (renderedContent) {\n newMessage.renderedContent = renderedContent;\n }\n\n textMsgRef.current = newMessage;\n // 存储原数据\n storeEvents(part, event);\n // 插入消息\n insertMessage(newMessage);\n } else {\n if (event.partial === false) {\n storeEvents(part, event);\n textMsgRef.current = null;\n return;\n }\n if (renderedContent) {\n textMsgRef.current = {\n ...textMsgRef.current,\n renderedContent,\n };\n }\n textMsgRef.current = {\n ...textMsgRef.current,\n text: (textMsgRef.current.text || \"\") + newChunk,\n };\n updateMessage(textMsgRef.current);\n }\n } else {\n textMsgRef.current = null;\n storeEvents(part, event);\n storeMessage(part, event, \"bot\");\n }\n },\n [storeEvents, storeMessage, insertMessage, updateMessage],\n );\n\n // 处理建议类消息\n const processFollowupPart = useCallback(\n (event: Event) => {\n // 获取建议类消息的文本内容\n const part = event?.content?.parts?.[0] || null;\n const text = part?.text || \"\";\n storeEvents(part, event);\n if (text) {\n setSuggestedQuestions((prev) => [...prev, text]);\n }\n },\n [storeEvents, insertMessage],\n );\n\n // 处理错误消息\n const processErrorMessage = useCallback(\n (chunkJson: any) => {\n storeEvents(null, chunkJson);\n insertMessage({\n id: v4(),\n text: chunkJson.errorMessage,\n role: \"bot\",\n });\n },\n [storeEvents, insertMessage],\n );\n\n // 处理动作和制品\n const processActionArtifact = useCallback(\n (event: any) => {\n if (event.actions && event.actions.artifactDelta) {\n storeEvents(null, event);\n storeMessage(null, event, \"bot\");\n }\n },\n [storeEvents, storeMessage],\n );\n\n // 发送消息请求\n const sendMessageRequest = useCallback(\n (values: AgentRunRequest) => {\n return new Promise<void>((resolve) => {\n if (ctrl.current) {\n ctrl.current.abort();\n }\n setLoading(true);\n ctrl.current = new AbortController();\n const requestUrl = `${url}/api/gateway-web/openApi/v1/aizt/app/${appNo}/sendMsgStreaming`;\n\n fetchEventSource(requestUrl, {\n method: \"POST\",\n signal: ctrl.current.signal,\n body: JSON.stringify(values),\n openWhenHidden: true,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-cache\",\n stream: \"true\",\n Authorization: `Bearer ${token}`,\n },\n async onopen(response) {\n if (\n response.ok &&\n response.headers.get(\"content-type\") === EventStreamContentType\n ) {\n // everything's good\n } else if (\n response.status >= 400 &&\n response.status < 500 &&\n response.status !== 429\n ) {\n resolve();\n } else {\n resolve();\n }\n },\n onmessage: (event) => {\n const rawData = safeJsonParse(event.data, {});\n\n // 处理新的数据格式: { data: {...}, result: {...} }\n let chunkJson: Event = rawData;\n if (rawData.data && rawData.result) {\n // 转换为旧格式\n chunkJson = {\n ...rawData.data,\n content: rawData.data, // data 本身就是 content\n invocationId: rawData.result.invocationId,\n sessionId: rawData.result.sessionId,\n id: rawData.result.invocationId,\n };\n }\n\n if (chunkJson.error) {\n message.warning(chunkJson.error);\n return;\n }\n onStream?.(chunkJson);\n if (chunkJson.content) {\n // 建议类消息单独处理\n if (chunkJson.content.role === \"followup\") {\n processFollowupPart(chunkJson);\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n for (const part of combineTextParts(chunkJson.content.parts)) {\n processPart(chunkJson, part);\n }\n } else if (chunkJson.errorMessage) {\n processErrorMessage(chunkJson);\n } else if (chunkJson.actions) {\n processActionArtifact(chunkJson);\n }\n },\n onclose: () => {\n setLoading(false);\n if (textMsgRef.current) {\n onMessage?.(textMsgRef.current?.text || \"\", textMsgRef.current);\n }\n textMsgRef.current = null;\n resolve();\n },\n onerror: (error) => {\n setLoading(false);\n resolve();\n console.error(\"EventSource failed:\", error);\n throw error;\n },\n });\n });\n },\n [\n type,\n currentSessionId,\n processActionArtifact,\n processErrorMessage,\n processPart,\n ],\n );\n\n // 发送会话\n const startChat = async ({\n text = \"\",\n files = [],\n functionResponse,\n }: SendContent) => {\n if (loading) return;\n if (!text.trim() && !functionResponse) return;\n // 清空建议问题\n setSuggestedQuestions([]);\n // 发送消息\n setMessages((prev) => {\n let temp = [...prev];\n // 如果 text 存在\n if (text.trim()) {\n temp.push({\n id: v4(),\n role: \"user\",\n text,\n });\n }\n // 如果file 存在\n if (files.length > 0) {\n temp.push({\n id: v4(),\n role: \"user\",\n fileData: files.map((file) => ({\n displayName: file.name,\n mimeType: file.response?.mimeType,\n fileUri: file.response?.fileUrl,\n })),\n });\n }\n // 如果 functionResponse 存在\n if (functionResponse) {\n temp.push({\n id: v4(),\n role: \"user\",\n functionResponse,\n });\n }\n return temp;\n });\n await sendMessageRequest({\n stream: true,\n sessionId: currentSessionId,\n content: {\n role: \"user\",\n parts: functionResponse ? [{ functionResponse }] : [{ text }],\n },\n files: files.map((file) => ({\n fileName: file.response?.fileName,\n fileId: file.response?.fileId,\n tempUrl: file.response?.fileUrl,\n type: file.response?.fileType,\n mimeType: file.response?.mimeType,\n })),\n });\n // 获取聊天记录\n initAppConversations();\n };\n\n // 重新发送会话\n const reChat = () => {\n if (loading) return;\n if (messages.length === 0) return;\n setMessages((prev) => {\n const newMessages = [...prev];\n // 删除最后一条 AI 消息\n const lastAIIndex = newMessages.findLastIndex(\n (msg) => msg.role === \"bot\",\n );\n if (lastAIIndex !== -1) {\n newMessages.splice(lastAIIndex, 1);\n }\n // 清空建议问题\n setSuggestedQuestions([]);\n // 重新发送最后一条用户消息\n const lastUserMessage = newMessages.findLast(\n (msg) => msg.role === \"user\",\n );\n if (lastUserMessage) {\n const { text = \"\", fileData = [] } = lastUserMessage;\n sendMessageRequest({\n stream: true,\n sessionId: currentSessionId,\n content: {\n role: \"user\",\n parts: [\n {\n text,\n },\n ],\n },\n files: fileData?.map((file) => ({\n fileName: file.displayName,\n tempUrl: file.fileUri,\n mimeType: file.mimeType,\n })),\n });\n }\n\n return newMessages;\n });\n };\n\n // 确认函数调用\n const confirmFnCall = (fnCall: FunctionCall, confirmed: boolean) => {\n const functionResponse = {\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n };\n startChat({ functionResponse });\n };\n\n // 使用建议问题\n const suggestChat = (text: string) => {\n if (loading) return;\n if (!text.trim()) return;\n setSuggestedQuestions([]);\n startChat({ text });\n };\n\n // 停止会话\n const stopChat = useCallback(() => {\n ctrl.current?.abort();\n setLoading(false);\n textMsgRef.current = null;\n }, [ctrl]);\n\n // 清除/重置会话\n const clearChat = () => {\n const newSessionId = v4();\n setCurrentSessionId(newSessionId);\n // 重置聊天内容\n stopChat();\n setPrologue(appInfo?.onboardingInfo?.prologue || \"\");\n setMessages([]);\n setSuggestedQuestions(appInfo?.onboardingInfo?.suggested_questions || []);\n };\n\n // 格式化会话记录\n const formatMessages = (messages: any[], isReplace = false) => {\n const mapped: IMessage[] = [];\n messages.forEach((item) => {\n if (!item || !item.content || !Array.isArray(item.content.parts)) return;\n\n const role =\n (item.content.role || \"\").toLowerCase() === \"user\" ? \"user\" : \"bot\";\n const parts = Array.isArray(item.content.parts)\n ? item.content.parts.filter((p: any) => {\n if (!p) return false;\n return Boolean(\n p.text ||\n p.inlineData ||\n p.functionCall ||\n p.functionResponse ||\n p.fileData ||\n p.executableCode ||\n p.codeExecutionResult ||\n p.errorMessage,\n );\n })\n : [];\n\n if (parts.length === 0) return;\n parts.forEach((part: any) => {\n const msg: IMessage = {\n id: v4(),\n author: item.author,\n invocationId: item.invocationId,\n eventId: item.id,\n timestamp: item.timestamp,\n isLike: item.isLike,\n role,\n raw: item,\n } as IMessage;\n\n if (part.inlineData) {\n msg.inlineData = {\n displayName: part.inlineData.displayName,\n data: part.inlineData.data,\n mimeType: part.inlineData.mimeType,\n } as any;\n }\n if (part.text) {\n msg.text = part.text;\n if (typeof part.thought !== \"undefined\") msg.thought = part.thought;\n }\n if (part.functionCall) msg.functionCall = part.functionCall;\n if (part.fileData) {\n msg.inlineData = {\n displayName: part.fileData.displayName || \"\",\n data: part.fileData.fileUri,\n mimeType: part.fileData.mimeType,\n } as any;\n }\n if (part.executableCode) msg.executableCode = part.executableCode;\n if (part.codeExecutionResult)\n msg.codeExecutionResult = part.codeExecutionResult;\n if (part.errorMessage) msg.text = part.errorMessage;\n // 补全函数调用结果\n if (part.functionResponse) {\n // 通过 functionCall.id 寻找对应的函数调用消息,在那条消息上添加functionResponse\n const functionCallMsg = mapped.find(\n (msg) => msg.functionCall?.id === part.functionResponse?.id,\n );\n if (functionCallMsg) {\n functionCallMsg.functionResponse = part.functionResponse;\n }\n return;\n }\n mapped.push(msg);\n });\n });\n\n setMessages((prev) => (isReplace ? mapped : [...prev, ...mapped]));\n };\n\n // 设置当前会话详情\n const setCurrentSessionDetail = async (sessionId: string) => {\n if (sessionId) {\n if (sessionId === currentSessionId) {\n return;\n }\n setCurrentSessionId(sessionId); // 设置当前会话 id;\n const { data, result } = await fetchSessionDetail({\n url,\n appNo,\n sessionId,\n token,\n });\n\n if (result?.code === API_SUCCESS_CODE) {\n setPrologue(appInfo?.onboardingInfo?.prologue || \"\");\n // 新接口直接返回按 event/item 结构的数组,传入 formatMessages 处理\n if (Array.isArray(data) && data.length > 0) {\n formatMessages(data, true);\n } else {\n setSuggestedQuestions(\n appInfo?.onboardingInfo?.suggested_questions || [],\n );\n }\n }\n } else {\n // 兼容 无 session异常\n setCurrentSessionId(v4());\n }\n };\n\n // 获取聊天记录\n const initAppConversations = async (fetchDetail = false) => {\n try {\n setLoading(true);\n\n const {\n data = [],\n pagination,\n result,\n } = await fetchSessionList({\n url,\n appNo,\n token,\n pageSize: sessionPagination.pageSize,\n });\n\n if (result?.code === API_SUCCESS_CODE) {\n if (data.length > 0) {\n const formatSessions = data.map((item) => {\n return {\n key: item.sessionId,\n label: item.title || \"新对话\",\n timestamp: new Date(item.startTime).getTime(),\n messages: [],\n meta: {\n ...item,\n },\n };\n });\n\n setSessionList(formatSessions);\n // 设置分页信息\n setSessionPagination({\n pageNum: sessionPagination.pageNum,\n pageSize: sessionPagination.pageSize,\n total: pagination?.total || 0,\n });\n const { sessionId } = data?.[0];\n if (showFirstSession) {\n setCurrentSessionDetail(sessionId);\n } else {\n fetchDetail && setPrologue(appInfo?.onboardingInfo?.prologue || \"\");\n fetchDetail &&\n setSuggestedQuestions(\n appInfo?.onboardingInfo?.suggested_questions || [],\n );\n }\n // 成功回调\n if (!initialized) {\n onSuccess?.({\n code: SuccessCode.APP_MESSAGES_INIT_SUCCESS,\n message: \"初始化聊天记录成功\",\n data: {\n sessionId,\n },\n });\n setInitialized(true);\n }\n } else {\n // 无会话记录时,初始化会话详情\n clearChat();\n }\n } else {\n setSessionList([]);\n setCurrentSessionId(v4());\n setPrologue(\"\");\n setSuggestedQuestions([]);\n }\n } catch {\n //\n } finally {\n setLoading(false);\n }\n };\n\n // 删除会话\n const deleteSession = async (sessionId: string) => {\n if (!sessionId) return;\n const { result } = await closeSession({\n url,\n appNo,\n sessionId,\n token,\n });\n if (result?.code === API_SUCCESS_CODE) {\n // 删除成功后,重新获取会话列表\n initAppConversations(true);\n // 如果删除的是当前会话,则创建新的会话\n if (sessionId === currentSessionId) {\n clearChat();\n }\n } else {\n message.error(\"删除会话失败\");\n }\n };\n\n // 点赞/点踩\n const likeMessage = async (\n invocationId: string,\n isLike: 1 | -1,\n feedbackData?: { feedbackTags?: string; feedbackDescription?: string },\n ) => {\n if (!appNo || !invocationId) return false;\n const { result } = await addFeedback({\n url,\n appNo,\n token,\n requestId: invocationId,\n isLike,\n ...feedbackData,\n });\n if (result?.code === API_SUCCESS_CODE) {\n setMessages((prev) =>\n prev.map((m) =>\n m.invocationId === invocationId ? { ...m, isLike } : m,\n ),\n );\n return true;\n }\n return false;\n };\n\n // 更新会话名称\n const updateSession = async (sessionId: string, title: string) => {\n if (!sessionId && !title) return;\n const { result } = await updateSessionTitle({\n url,\n appNo,\n title,\n sessionId,\n token,\n });\n if (result?.code === API_SUCCESS_CODE) {\n // 编辑成功后,重新获取会话列表\n initAppConversations();\n } else {\n message.error(\"更新会话失败\");\n }\n };\n\n // 初始化应用\n const initConfig = async () => {\n try {\n setLoading(true);\n const { data, result } = await fetchAppConfig({ url, appNo });\n if (result.code === API_SUCCESS_CODE) {\n setAppInfo(data);\n // 成功回调\n onSuccess?.({\n code: SuccessCode.APP_CONFIG_INIT_SUCCESS,\n message: \"初始化配置成功\",\n });\n } else {\n onError?.({\n code: (result.code as ErrorCode) || ErrorCode.APP_NOT_FOUND,\n message: result.message || \"获取应用配置失败\",\n });\n }\n } catch (error) {\n onError?.({\n code: ErrorCode.API_ERROR,\n message: \"获取应用配置失败\",\n });\n } finally {\n setLoading(false);\n }\n };\n\n // 初始化—获取配置 (仅在启用时)\n useEffect(() => {\n if (enabled && url && appNo) {\n initConfig();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, url, appNo]);\n\n // 初始化-聊天记录\n useEffect(() => {\n if (appInfo) {\n initAppConversations(true);\n }\n }, [appInfo]);\n\n return {\n appInfo,\n startChat,\n reChat,\n stopChat,\n clearChat,\n suggestChat,\n confirmFnCall,\n initialized,\n currentSessionId,\n sessionList,\n sessionPagination,\n prologue,\n suggestions: suggestedQuestions,\n loading,\n messages: mergedMessages,\n insertSuggestedQuestions,\n insertPrologue,\n deleteSession,\n updateSession,\n setSuggestedQuestions,\n setCurrentSessionDetail,\n setMessages,\n storeEvents,\n storeMessage,\n likeMessage,\n };\n}\n\nexport default useADKChat;\n"],
5
+ "mappings": "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",
6
6
  "names": ["prologue", "messages", "msg"]
7
7
  }
@@ -1,4 +1,4 @@
1
- import { IMessage, SendContent } from './index';
1
+ import { IMessage, SendContent } from "./index";
2
2
  /**
3
3
  * 聊天 Hook 标准接口
4
4
  * 所有自定义 Hook 必须实现这个接口
@@ -63,6 +63,11 @@ export interface ChatHookResult {
63
63
  setCurrentSessionDetail: (id: string) => void;
64
64
  /** 直接设置消息列表 */
65
65
  setMessages: (msgs: IMessage[] | ((prev: IMessage[]) => IMessage[])) => void;
66
+ /** 点赞/点踩消息(可选,自定义 Hook 可不实现) */
67
+ likeMessage?: (invocationId: string, isLike: 1 | -1, feedbackData?: {
68
+ feedbackTags?: string;
69
+ feedbackDescription?: string;
70
+ }) => Promise<boolean>;
66
71
  }
67
72
  /**
68
73
  * Hook 工厂函数类型
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/ChatHook.ts"],
4
- "sourcesContent": ["import { IMessage, SendContent } from './index';\n\n/**\n * 聊天 Hook 标准接口\n * 所有自定义 Hook 必须实现这个接口\n *\n * @example\n * // 使用内置标准协议\n * <XAdkProvider url=\"...\" token=\"...\" config={...}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n *\n * @example\n * // 使用自定义 Hook (GraphQL)\n * function MyApp() {\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * return (\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n * );\n * }\n */\nexport interface ChatHookResult {\n // ========== 状态 ==========\n\n /** 消息列表 */\n messages: IMessage[];\n\n /** 加载状态 */\n loading: boolean;\n\n /** 当前会话ID */\n currentSessionId: string;\n\n /** 开场白 */\n prologue: string;\n\n /** 建议问题列表 */\n suggestions: string[];\n\n /** 应用信息 */\n appInfo: any | null;\n\n /** 是否已初始化 */\n initialized: boolean;\n\n // ========== 会话列表 ==========\n\n /** 会话列表 */\n sessionList: any[];\n\n /** 会话分页信息 */\n sessionPagination: {\n total: number;\n pageNum: number;\n pageSize: number;\n };\n\n // ========== 操作方法 ==========\n\n /** 发送消息 */\n startChat: (content: SendContent) => void;\n\n /** 停止当前对话 */\n stopChat: () => void;\n\n /** 清空当前会话消息 */\n clearChat: () => void;\n\n /** 重新生成最后一条回复 */\n reChat: () => void;\n\n /** 发送建议问题 */\n suggestChat: (suggestion: string) => void;\n\n /** 确认函数调用 */\n confirmFnCall: (response: any) => void;\n\n /** 删除会话 */\n deleteSession: (id: string) => void;\n\n /** 更新会话标题 */\n updateSession: (id: string, title: string) => void;\n\n /** 切换会话 */\n setCurrentSessionDetail: (id: string) => void;\n\n /** 直接设置消息列表 */\n setMessages: (msgs: IMessage[] | ((prev: IMessage[]) => IMessage[])) => void;\n}\n\n/**\n * Hook 工厂函数类型\n *\n * @example\n * const useMyCustomChat: ChatHookFactory = (options) => {\n * // 实现自定义协议逻辑\n * return {\n * messages: [...],\n * loading: false,\n * startChat: (content) => { ... },\n * // ... 其他方法\n * };\n * };\n */\nexport type ChatHookFactory = (options: any) => ChatHookResult;\n"],
4
+ "sourcesContent": ["import { IMessage, SendContent } from \"./index\";\n\n/**\n * 聊天 Hook 标准接口\n * 所有自定义 Hook 必须实现这个接口\n *\n * @example\n * // 使用内置标准协议\n * <XAdkProvider url=\"...\" token=\"...\" config={...}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n *\n * @example\n * // 使用自定义 Hook (GraphQL)\n * function MyApp() {\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * return (\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n * );\n * }\n */\nexport interface ChatHookResult {\n // ========== 状态 ==========\n\n /** 消息列表 */\n messages: IMessage[];\n\n /** 加载状态 */\n loading: boolean;\n\n /** 当前会话ID */\n currentSessionId: string;\n\n /** 开场白 */\n prologue: string;\n\n /** 建议问题列表 */\n suggestions: string[];\n\n /** 应用信息 */\n appInfo: any | null;\n\n /** 是否已初始化 */\n initialized: boolean;\n\n // ========== 会话列表 ==========\n\n /** 会话列表 */\n sessionList: any[];\n\n /** 会话分页信息 */\n sessionPagination: {\n total: number;\n pageNum: number;\n pageSize: number;\n };\n\n // ========== 操作方法 ==========\n\n /** 发送消息 */\n startChat: (content: SendContent) => void;\n\n /** 停止当前对话 */\n stopChat: () => void;\n\n /** 清空当前会话消息 */\n clearChat: () => void;\n\n /** 重新生成最后一条回复 */\n reChat: () => void;\n\n /** 发送建议问题 */\n suggestChat: (suggestion: string) => void;\n\n /** 确认函数调用 */\n confirmFnCall: (response: any) => void;\n\n /** 删除会话 */\n deleteSession: (id: string) => void;\n\n /** 更新会话标题 */\n updateSession: (id: string, title: string) => void;\n\n /** 切换会话 */\n setCurrentSessionDetail: (id: string) => void;\n\n /** 直接设置消息列表 */\n setMessages: (msgs: IMessage[] | ((prev: IMessage[]) => IMessage[])) => void;\n\n /** 点赞/点踩消息(可选,自定义 Hook 可不实现) */\n likeMessage?: (\n invocationId: string,\n isLike: 1 | -1,\n feedbackData?: { feedbackTags?: string; feedbackDescription?: string },\n ) => Promise<boolean>;\n}\n\n/**\n * Hook 工厂函数类型\n *\n * @example\n * const useMyCustomChat: ChatHookFactory = (options) => {\n * // 实现自定义协议逻辑\n * return {\n * messages: [...],\n * loading: false,\n * startChat: (content) => { ... },\n * // ... 其他方法\n * };\n * };\n */\nexport type ChatHookFactory = (options: any) => ChatHookResult;\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -214,7 +214,7 @@ export interface XAdkChatbotProps extends Partial<XAdkSenderProps> {
214
214
  welcome?: React.ReactNode;
215
215
  /** 显示函数调用详情 */
216
216
  showFnCallDetail?: boolean;
217
- /** 是否初始化 */
217
+ /** 是否初始化完成,初始化完成后自动滚动到最新消息 */
218
218
  initialized?: boolean;
219
219
  /** 提交回调 */
220
220
  onSubmit?: ({ text, files }: SendContent) => void;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/XAdkChatbot.ts"],
4
- "sourcesContent": ["import { JSX, ReactNode } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n className?: string;\n style?: React.CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: React.ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 是否初始化 */\n initialized?: boolean;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n}\n"],
4
+ "sourcesContent": ["import { JSX } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n className?: string;\n style?: React.CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: React.ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 是否初始化完成,初始化完成后自动滚动到最新消息 */\n initialized?: boolean;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -97,6 +97,11 @@ export interface XAdkProviderConfig {
97
97
  appNo?: string;
98
98
  chatProps?: ChatConfig;
99
99
  debug?: boolean;
100
+ /**
101
+ * 是否展示点赞/点踩按钮
102
+ * @default true
103
+ */
104
+ showFeedback?: boolean;
100
105
  }
101
106
  /**
102
107
  * XAdkProvider Props
@@ -105,7 +110,7 @@ export interface XAdkProviderProps {
105
110
  /**
106
111
  * AI 服务基础地址
107
112
  */
108
- url: string;
113
+ url?: string;
109
114
  /**
110
115
  * 认证 token
111
116
  */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/XAdkProvider.ts"],
4
- "sourcesContent": ["import { ReactNode } from \"react\";\nimport {\n IMessage,\n Success,\n Event,\n Error,\n SendContent,\n ThemeType,\n} from \"@/types\";\n\nexport interface DebugOptions {\n url: string;\n sessionId?: string;\n config: any;\n token: string;\n type?: \"agentDebug\" | \"appDebug\";\n /**\n * 是否启用 Hook\n * 当使用自定义 chatData 时,应设置为 false 以避免内部 Hook 初始化\n * @default true\n */\n enabled?: boolean;\n onError?: (error: Error) => void;\n onSuccess?: (data: Success) => void;\n onStream?: (data: Event) => void;\n onMessage?: (content: string, data: IMessage) => void;\n}\n\n/**\n * 事件状态码枚举\n * @enum {string}\n * @version 1.0.0\n */\nexport enum EventCode {\n /** 切换会话 */\n SESSION_SWITCH = \"SESSION_SWITCH\",\n /** 开启新会话 */\n SESSION_CREATE = \"SESSION_CREATE\",\n}\n\nexport type handleEvent = {\n code: EventCode;\n message: string;\n data?: any;\n};\n/**\n * renderFooter insert 参数说明\n */\nexport interface FooterRenderArgs {\n message: IMessage;\n isLastBotMsg: boolean;\n isLastMsg: boolean;\n}\n\n/**\n * Provider 可通过 ref 暴露的方法句柄\n */\nexport interface XAdkProviderHandle {\n startChat: (content: SendContent) => void;\n stopChat: () => void;\n clearChat: () => void;\n deleteSession: (id: string) => void;\n updateSession: (id: string, title: string) => void;\n getAppInfo: () => any;\n getMessages: () => IMessage[];\n getSessions: () => any[];\n setMessages: (msgs: IMessage[]) => void;\n setCurrentSessionDetail: (id: string) => void;\n}\n\n/**\n * config.chatProps 中的配置\n */\nexport interface ChatConfig {\n /**\n * 是否展示清空按钮\n * @type {boolean}\n * @default false\n */\n clearBtnShow?: boolean;\n /**\n * 是否展示输入框\n * @type {boolean}\n * @default true\n */\n inputShow?: boolean;\n /**\n * 打字机效果速度(单位:毫秒)\n * @type {number}\n * @default 60\n * @version 1.0.0\n */\n textSpeed?: number;\n}\n\n/**\n * Provider config 整体配置结构\n */\nexport interface XAdkProviderConfig {\n session?: {\n showSessionList?: boolean;\n };\n /**\n * 初始化后是否默认展示第一条会话内容\n * @type {boolean}\n * @default false\n */\n showFirstSession?: boolean;\n allowUpload?: boolean;\n appNo?: string;\n chatProps?: ChatConfig;\n debug?: boolean;\n}\n\n/**\n * XAdkProvider Props\n */\nexport interface XAdkProviderProps {\n /**\n * AI 服务基础地址\n */\n url: string;\n /**\n * 认证 token\n */\n token: string;\n /**\n * 组件功能配置\n */\n config?: XAdkProviderConfig;\n /**\n * Provider 唯一标识\n */\n providerId?: string;\n /**\n * 消息成功回调\n */\n onSuccess?: (success: any) => void;\n /**\n * 流式消息回调\n */\n onStream?: (data: Event) => void;\n /**\n * 错误回调\n */\n onError?: (err: any) => void;\n /**\n * 每条消息回调\n */\n onMessage?: (content: string, data: IMessage) => void;\n /**\n * 事件回调\n */\n onEvent?: (event: handleEvent) => void;\n /**\n * React 子元素 - 支持 Compound Components\n */\n children?: ReactNode;\n}\n\n// XAiSDKProps 继承 XAdkProviderProps\nexport interface XAdkSDKProps extends XAdkProviderProps {\n /**\n * 主题类型\n * @type {ThemeType}\n * @default 'default'\n * @version 1.0.0\n */\n theme?: ThemeType;\n\n /**\n * 组件属性配置\n * @type {object}\n * @default undefined\n * @version 1.0.0\n */\n componentProps?: {\n /**\n * 组件ID\n * @type {string}\n * @default undefined\n * @version 1.0.0\n */\n id?: string;\n /** 支持任意 CSS 属性 */\n [key: string]: any;\n };\n}\n"],
4
+ "sourcesContent": ["import { ReactNode } from \"react\";\nimport {\n IMessage,\n Success,\n Event,\n Error,\n SendContent,\n ThemeType,\n} from \"@/types\";\n\nexport interface DebugOptions {\n url: string;\n sessionId?: string;\n config: any;\n token: string;\n type?: \"agentDebug\" | \"appDebug\";\n /**\n * 是否启用 Hook\n * 当使用自定义 chatData 时,应设置为 false 以避免内部 Hook 初始化\n * @default true\n */\n enabled?: boolean;\n onError?: (error: Error) => void;\n onSuccess?: (data: Success) => void;\n onStream?: (data: Event) => void;\n onMessage?: (content: string, data: IMessage) => void;\n}\n\n/**\n * 事件状态码枚举\n * @enum {string}\n * @version 1.0.0\n */\nexport enum EventCode {\n /** 切换会话 */\n SESSION_SWITCH = \"SESSION_SWITCH\",\n /** 开启新会话 */\n SESSION_CREATE = \"SESSION_CREATE\",\n}\n\nexport type handleEvent = {\n code: EventCode;\n message: string;\n data?: any;\n};\n/**\n * renderFooter insert 参数说明\n */\nexport interface FooterRenderArgs {\n message: IMessage;\n isLastBotMsg: boolean;\n isLastMsg: boolean;\n}\n\n/**\n * Provider 可通过 ref 暴露的方法句柄\n */\nexport interface XAdkProviderHandle {\n startChat: (content: SendContent) => void;\n stopChat: () => void;\n clearChat: () => void;\n deleteSession: (id: string) => void;\n updateSession: (id: string, title: string) => void;\n getAppInfo: () => any;\n getMessages: () => IMessage[];\n getSessions: () => any[];\n setMessages: (msgs: IMessage[]) => void;\n setCurrentSessionDetail: (id: string) => void;\n}\n\n/**\n * config.chatProps 中的配置\n */\nexport interface ChatConfig {\n /**\n * 是否展示清空按钮\n * @type {boolean}\n * @default false\n */\n clearBtnShow?: boolean;\n /**\n * 是否展示输入框\n * @type {boolean}\n * @default true\n */\n inputShow?: boolean;\n /**\n * 打字机效果速度(单位:毫秒)\n * @type {number}\n * @default 60\n * @version 1.0.0\n */\n textSpeed?: number;\n}\n\n/**\n * Provider config 整体配置结构\n */\nexport interface XAdkProviderConfig {\n session?: {\n showSessionList?: boolean;\n };\n /**\n * 初始化后是否默认展示第一条会话内容\n * @type {boolean}\n * @default false\n */\n showFirstSession?: boolean;\n allowUpload?: boolean;\n appNo?: string;\n chatProps?: ChatConfig;\n debug?: boolean;\n /**\n * 是否展示点赞/点踩按钮\n * @default true\n */\n showFeedback?: boolean;\n}\n\n/**\n * XAdkProvider Props\n */\nexport interface XAdkProviderProps {\n /**\n * AI 服务基础地址\n */\n url?: string;\n /**\n * 认证 token\n */\n token: string;\n /**\n * 组件功能配置\n */\n config?: XAdkProviderConfig;\n /**\n * Provider 唯一标识\n */\n providerId?: string;\n /**\n * 消息成功回调\n */\n onSuccess?: (success: any) => void;\n /**\n * 流式消息回调\n */\n onStream?: (data: Event) => void;\n /**\n * 错误回调\n */\n onError?: (err: any) => void;\n /**\n * 每条消息回调\n */\n onMessage?: (content: string, data: IMessage) => void;\n /**\n * 事件回调\n */\n onEvent?: (event: handleEvent) => void;\n /**\n * React 子元素 - 支持 Compound Components\n */\n children?: ReactNode;\n}\n\n// XAiSDKProps 继承 XAdkProviderProps\nexport interface XAdkSDKProps extends XAdkProviderProps {\n /**\n * 主题类型\n * @type {ThemeType}\n * @default 'default'\n * @version 1.0.0\n */\n theme?: ThemeType;\n\n /**\n * 组件属性配置\n * @type {object}\n * @default undefined\n * @version 1.0.0\n */\n componentProps?: {\n /**\n * 组件ID\n * @type {string}\n * @default undefined\n * @version 1.0.0\n */\n id?: string;\n /** 支持任意 CSS 属性 */\n [key: string]: any;\n };\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCO,IAAK,YAAL,kBAAKA,eAAL;AAEL,EAAAA,WAAA,oBAAiB;AAEjB,EAAAA,WAAA,oBAAiB;AAJP,SAAAA;AAAA,GAAA;",
6
6
  "names": ["EventCode"]
7
7
  }
@@ -49,6 +49,14 @@ var mockMessages = [{
49
49
  role: "bot",
50
50
  text: "React Hooks \u662F React 16.8 \u5F15\u5165\u7684\u65B0\u7279\u6027,\u5B83\u8BA9\u4F60\u5728\u4E0D\u7F16\u5199 class \u7684\u60C5\u51B5\u4E0B\u4F7F\u7528 state \u548C\u5176\u4ED6 React \u7279\u6027\u3002\n\n## \u5E38\u7528\u7684 Hooks\n\n### 1. useState\n\u7528\u4E8E\u5728\u51FD\u6570\u7EC4\u4EF6\u4E2D\u6DFB\u52A0\u72B6\u6001:\n\n```jsx\nconst [count, setCount] = useState(0);\n```\n\n### 2. useEffect\n\u7528\u4E8E\u5904\u7406\u526F\u4F5C\u7528:\n\n```jsx\nuseEffect(() => {\n document.title = `Count: ${count}`;\n}, [count]);\n```\n\n### 3. useContext\n\u7528\u4E8E\u8BBF\u95EE Context:\n\n```jsx\nconst theme = useContext(ThemeContext);\n```\n\n## \u4F18\u52BF\n\n- \u2705 \u4EE3\u7801\u66F4\u7B80\u6D01\n- \u2705 \u903B\u8F91\u590D\u7528\u66F4\u5BB9\u6613\n- \u2705 \u907F\u514D this \u76F8\u5173\u95EE\u9898\n- \u2705 \u66F4\u597D\u7684\u4EE3\u7801\u7EC4\u7EC7",
51
51
  invocationId: "inv-2"
52
+ }, {
53
+ id: "5",
54
+ role: "user",
55
+ text: "来一段富文本"
56
+ }, {
57
+ id: "6",
58
+ role: "bot",
59
+ text: "# 我是标题\n\n我是正文\n\n**我是加粗**\n\n*我是斜体*\n\n<u>我是下划线</u>\n\n- 我是无序列表\n \n- 1\n \n- 2\n \n\n1. 我是有序列表\n \n2. 1\n \n3. 2\n \n\n> 我是引用\n\n[我是链接](https://www.baidu.com)\n\n```\n我是代码库\n```"
52
60
  }];
53
61
 
54
62
  // ============================================
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useState","Button","Space","XAdkChatbot","jsx","_jsx","jsxs","_jsxs","meta","title","component","parameters","layout","docs","description","tags","argTypes","loading","control","showFnCallDetail","mockMessages","id","role","text","invocationId","基础用法","render","_useState","_useState2","_slicedToArray","messages","setMessages","_useState3","_useState4","setLoading","userMsg","Date","now","toString","fileData","displayName","fileUri","mimeType","prev","concat","_toConsumableArray","setTimeout","botMsg","style","width","height","padding","border","borderRadius","overflow","children","initialized","开场白和建议","_useState5","_useState6","_useState7","_useState8","suggestions","setSuggestions","prologue","handleSuggest","onSuggest","流式输出","_useState9","_useState10","_useState11","_useState12","handleStart","fullText","currentText","index","interval","setInterval","length","newMessages","_objectSpread","clearInterval","marginBottom","type","onClick","disabled","onStop","自定义Footer","_useState13","_useState14","_useState15","Set","_useState16","likedMessages","setLikedMessages","handleLike","messageId","newSet","has","delete","add","customFooter","data","message","isLastBotMsg","isLiked","size","actions","函数调用","messagesWithFunctionCall","functionCall","name","args","city","date","思维链","messagesWithThought","thought","代码高亮","messagesWithCode","多轮对话","multiRoundMessages"],"sources":["../../../../src/components/XAdkChatbot/XAdkChatbot.stories.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport { Button, Space } from \"antd\";\nimport XAdkChatbot from \"./index\";\nimport type { IMessage } from \"@/types\";\n\nconst meta: Meta<typeof XAdkChatbot> = {\n title: \"AI组件/XAdkChatbot 聊天消息组件\",\n component: XAdkChatbot,\n parameters: {\n layout: \"padded\",\n docs: {\n description: {\n component: `\n\n独立的聊天消息显示组件,用于渲染消息列表和建议问题。\n\n## 核心功能\n\n- 📝 **消息渲染**: 支持文本、Markdown、代码块、函数调用等\n- 💭 **思维链**: 支持显示 AI 推理过程\n- 🎯 **建议问题**: 显示和点击建议问题\n- 📌 **开场白**: 支持显示欢迎消息\n- 🔄 **加载状态**: 实时显示 AI 生成状态\n- 🎨 **自定义渲染**: 支持自定义消息底部内容\n\n## Props\n\n| 属性 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| messages | IMessage[] | [] | 消息列表 |\n| loading | boolean | false | 是否正在加载 |\n| prologue | string | - | 开场白 |\n| suggestions | string[] | [] | 建议问题 |\n| showFnCallDetail | boolean | false | 显示函数调用详情 |\n| footer | (msg) => ReactNode | - | 自定义消息底部 |\n| onSubmit | (content) => void | - | 发送消息回调 |\n| onStop | () => void | - | 停止生成回调 |\n| onClear | () => void | - | 清空消息回调 |\n| onSuggest | (text) => void | - | 点击建议回调 |\n| onConfirm | (fnCall, confirmed) => void | - | 确认函数调用 |\n `,\n },\n },\n },\n tags: [\"autodocs\"],\n argTypes: {\n loading: {\n description: \"是否正在加载(AI 生成中)\",\n control: \"boolean\",\n },\n showFnCallDetail: {\n description: \"是否显示函数调用详情\",\n control: \"boolean\",\n },\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// Mock 消息数据\nconst mockMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"你好\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"你好!我是 AI 助手,很高兴为你服务。有什么我可以帮助你的吗?\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"介绍一下 React Hooks\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: `React Hooks 是 React 16.8 引入的新特性,它让你在不编写 class 的情况下使用 state 和其他 React 特性。\n\n## 常用的 Hooks\n\n### 1. useState\n用于在函数组件中添加状态:\n\n\\`\\`\\`jsx\nconst [count, setCount] = useState(0);\n\\`\\`\\`\n\n### 2. useEffect\n用于处理副作用:\n\n\\`\\`\\`jsx\nuseEffect(() => {\n document.title = \\`Count: \\${count}\\`;\n}, [count]);\n\\`\\`\\`\n\n### 3. useContext\n用于访问 Context:\n\n\\`\\`\\`jsx\nconst theme = useContext(ThemeContext);\n\\`\\`\\`\n\n## 优势\n\n- ✅ 代码更简洁\n- ✅ 逻辑复用更容易\n- ✅ 避免 this 相关问题\n- ✅ 更好的代码组织`,\n invocationId: \"inv-2\",\n },\n];\n\n// ============================================\n// 示例 1: 基础用法\n// ============================================\nexport const 基础用法: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>(mockMessages);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text: \"你好\",\n fileData: [\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c97_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c98_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n ],\n };\n setMessages((prev) => [...prev, userMsg]);\n\n setLoading(true);\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"用户\" 的模拟回复。`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n setLoading(false);\n }, 1000);\n }, []);\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n padding: \"20px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n style={{ width: \"670px\" }}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 2: 开场白和建议问题\n// ============================================\nexport const 开场白和建议: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([]);\n const [suggestions, setSuggestions] = useState([\n \"什么是 React Hooks?\",\n \"如何使用 useState?\",\n \"useEffect 的作用是什么?\",\n ]);\n\n const prologue = \"你好!我是 AI 助手,专注于 React 开发相关的问题。\";\n\n const handleSuggest = (text: string) => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages([userMsg]);\n setSuggestions([]);\n\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的回答...`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={handleSuggest}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 3: 流式输出\n// ============================================\nexport const 流式输出: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([\n {\n id: \"1\",\n role: \"user\",\n text: \"给我讲一个故事\",\n },\n ]);\n const [loading, setLoading] = useState(false);\n\n const handleStart = () => {\n setLoading(true);\n\n const fullText =\n \"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事。讲什么呢?从前有座山,山里有座庙...\";\n let currentText = \"\";\n let index = 0;\n\n const botMsg: IMessage = {\n id: \"2\",\n role: \"bot\",\n text: \"\",\n invocationId: \"inv-1\",\n };\n\n setMessages((prev) => [...prev, botMsg]);\n\n const interval = setInterval(() => {\n if (index < fullText.length) {\n currentText += fullText[index];\n setMessages((prev) => {\n const newMessages = [...prev];\n newMessages[newMessages.length - 1] = {\n ...botMsg,\n text: currentText,\n };\n return newMessages;\n });\n index++;\n } else {\n clearInterval(interval);\n setLoading(false);\n }\n }, 50);\n };\n\n return (\n <div style={{ width: 700 }}>\n <div style={{ marginBottom: \"16px\" }}>\n <Button type=\"primary\" onClick={handleStart} disabled={loading}>\n 开始流式输出演示\n </Button>\n </div>\n <div\n style={{\n height: \"550px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onStop={() => setLoading(false)}\n />\n </div>\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 4: 自定义消息 Footer\n// ============================================\nexport const 自定义Footer: Story = {\n render: () => {\n const [messages] = useState<IMessage[]>(mockMessages);\n const [likedMessages, setLikedMessages] = useState<Set<string>>(new Set());\n\n const handleLike = (messageId: string) => {\n setLikedMessages((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(messageId)) {\n newSet.delete(messageId);\n } else {\n newSet.add(messageId);\n }\n return newSet;\n });\n };\n\n const customFooter = (data: any) => {\n const { message, isLastBotMsg } = data;\n\n if (!isLastBotMsg) return null;\n\n const isLiked = likedMessages.has(message.id);\n\n return (\n <div style={{ padding: \"8px 0\" }}>\n <Space size=\"small\">\n <Button\n size=\"small\"\n type={isLiked ? \"primary\" : \"text\"}\n onClick={() => handleLike(message.id)}\n >\n {isLiked ? \"👍 已赞\" : \"👍 赞\"}\n </Button>\n <Button size=\"small\" type=\"text\">\n 👎 踩\n </Button>\n <Button size=\"small\" type=\"text\">\n 📋 复制\n </Button>\n <Button size=\"small\" type=\"text\">\n 🔄 重新生成\n </Button>\n </Space>\n </div>\n );\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n actions={customFooter}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 5: 函数调用\n// ============================================\nexport const 函数调用: Story = {\n render: () => {\n const messagesWithFunctionCall: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"今天北京的天气怎么样?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n functionCall: {\n id: \"call-1\",\n name: \"get_weather\",\n args: {\n city: \"北京\",\n date: \"2024-03-05\",\n },\n },\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"根据天气查询,今天北京的天气是晴天,温度 15-25°C,空气质量良好,适合户外活动。\",\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithFunctionCall}\n loading={false}\n initialized={true}\n showFnCallDetail={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 6: 思维链\n// ============================================\nexport const 思维链: Story = {\n render: () => {\n const messagesWithThought: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"帮我分析一下这个问题\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"让我分析一下这个问题...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"首先,我需要理解问题的核心...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"根据分析,我的结论是...(这是最终回答)\",\n thought: false,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithThought}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 7: 代码高亮\n// ============================================\nexport const 代码高亮: Story = {\n render: () => {\n const messagesWithCode: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"写一个 React 组件\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: `这是一个简单的 React 计数器组件:\n\n\\`\\`\\`jsx\nimport React, { useState } from 'react';\n\nfunction Counter() {\n const [count, setCount] = useState(0);\n\n return (\n <div>\n <h1>Count: {count}</h1>\n <button onClick={() => setCount(count + 1)}>\n +1\n </button>\n <button onClick={() => setCount(count - 1)}>\n -1\n </button>\n </div>\n );\n}\n\nexport default Counter;\n\\`\\`\\`\n\n这个组件使用了 \\`useState\\` Hook 来管理计数器状态。`,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithCode}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 8: 多轮对话\n// ============================================\nexport const 多轮对话: Story = {\n render: () => {\n const multiRoundMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"React 是什么?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"React 是一个用于构建用户界面的 JavaScript 库。\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"它有什么特点?\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"React 的主要特点包括:\\n1. 组件化\\n2. 虚拟 DOM\\n3. 单向数据流\\n4. JSX 语法\",\n invocationId: \"inv-2\",\n },\n {\n id: \"5\",\n role: \"user\",\n text: \"什么是虚拟 DOM?\",\n },\n {\n id: \"6\",\n role: \"bot\",\n text: \"虚拟 DOM 是真实 DOM 的 JavaScript 对象表示,React 通过对比虚拟 DOM 的变化来高效更新真实 DOM。\",\n invocationId: \"inv-3\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={multiRoundMessages}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useEffect","useState","Button","Space","XAdkChatbot","jsx","_jsx","jsxs","_jsxs","meta","title","component","parameters","layout","docs","description","tags","argTypes","loading","control","showFnCallDetail","mockMessages","id","role","text","invocationId","基础用法","render","_useState","_useState2","_slicedToArray","messages","setMessages","_useState3","_useState4","setLoading","userMsg","Date","now","toString","fileData","displayName","fileUri","mimeType","prev","concat","_toConsumableArray","setTimeout","botMsg","style","width","height","padding","border","borderRadius","overflow","children","initialized","开场白和建议","_useState5","_useState6","_useState7","_useState8","suggestions","setSuggestions","prologue","handleSuggest","onSuggest","流式输出","_useState9","_useState10","_useState11","_useState12","handleStart","fullText","currentText","index","interval","setInterval","length","newMessages","_objectSpread","clearInterval","marginBottom","type","onClick","disabled","onStop","自定义Footer","_useState13","_useState14","_useState15","Set","_useState16","likedMessages","setLikedMessages","handleLike","messageId","newSet","has","delete","add","customFooter","data","message","isLastBotMsg","isLiked","size","actions","函数调用","messagesWithFunctionCall","functionCall","name","args","city","date","思维链","messagesWithThought","thought","代码高亮","messagesWithCode","多轮对话","multiRoundMessages"],"sources":["../../../../src/components/XAdkChatbot/XAdkChatbot.stories.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react-vite\";\nimport { Button, Space } from \"antd\";\nimport XAdkChatbot from \"./index\";\nimport type { IMessage } from \"@/types\";\n\nconst meta: Meta<typeof XAdkChatbot> = {\n title: \"AI组件/XAdkChatbot 聊天消息组件\",\n component: XAdkChatbot,\n parameters: {\n layout: \"padded\",\n docs: {\n description: {\n component: `\n\n独立的聊天消息显示组件,用于渲染消息列表和建议问题。\n\n## 核心功能\n\n- 📝 **消息渲染**: 支持文本、Markdown、代码块、函数调用等\n- 💭 **思维链**: 支持显示 AI 推理过程\n- 🎯 **建议问题**: 显示和点击建议问题\n- 📌 **开场白**: 支持显示欢迎消息\n- 🔄 **加载状态**: 实时显示 AI 生成状态\n- 🎨 **自定义渲染**: 支持自定义消息底部内容\n\n## Props\n\n| 属性 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| messages | IMessage[] | [] | 消息列表 |\n| loading | boolean | false | 是否正在加载 |\n| prologue | string | - | 开场白 |\n| suggestions | string[] | [] | 建议问题 |\n| showFnCallDetail | boolean | false | 显示函数调用详情 |\n| footer | (msg) => ReactNode | - | 自定义消息底部 |\n| onSubmit | (content) => void | - | 发送消息回调 |\n| onStop | () => void | - | 停止生成回调 |\n| onClear | () => void | - | 清空消息回调 |\n| onSuggest | (text) => void | - | 点击建议回调 |\n| onConfirm | (fnCall, confirmed) => void | - | 确认函数调用 |\n `,\n },\n },\n },\n tags: [\"autodocs\"],\n argTypes: {\n loading: {\n description: \"是否正在加载(AI 生成中)\",\n control: \"boolean\",\n },\n showFnCallDetail: {\n description: \"是否显示函数调用详情\",\n control: \"boolean\",\n },\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// Mock 消息数据\nconst mockMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"你好\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"你好!我是 AI 助手,很高兴为你服务。有什么我可以帮助你的吗?\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"介绍一下 React Hooks\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: `React Hooks 是 React 16.8 引入的新特性,它让你在不编写 class 的情况下使用 state 和其他 React 特性。\n\n## 常用的 Hooks\n\n### 1. useState\n用于在函数组件中添加状态:\n\n\\`\\`\\`jsx\nconst [count, setCount] = useState(0);\n\\`\\`\\`\n\n### 2. useEffect\n用于处理副作用:\n\n\\`\\`\\`jsx\nuseEffect(() => {\n document.title = \\`Count: \\${count}\\`;\n}, [count]);\n\\`\\`\\`\n\n### 3. useContext\n用于访问 Context:\n\n\\`\\`\\`jsx\nconst theme = useContext(ThemeContext);\n\\`\\`\\`\n\n## 优势\n\n- ✅ 代码更简洁\n- ✅ 逻辑复用更容易\n- ✅ 避免 this 相关问题\n- ✅ 更好的代码组织`,\n invocationId: \"inv-2\",\n },\n {\n id: \"5\",\n role: \"user\",\n text: \"来一段富文本\",\n },\n {\n id: \"6\",\n role: \"bot\",\n text: \"# 我是标题\\n\\n我是正文\\n\\n**我是加粗**\\n\\n*我是斜体*\\n\\n<u>我是下划线</u>\\n\\n- 我是无序列表\\n \\n- 1\\n \\n- 2\\n \\n\\n1. 我是有序列表\\n \\n2. 1\\n \\n3. 2\\n \\n\\n> 我是引用\\n\\n[我是链接](https://www.baidu.com)\\n\\n```\\n我是代码库\\n```\",\n },\n];\n\n// ============================================\n// 示例 1: 基础用法\n// ============================================\nexport const 基础用法: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>(mockMessages);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text: \"你好\",\n fileData: [\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c97_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n {\n displayName: \"06f26c566fe4a3b5eaad678d0d270c98_origin.jpg\",\n fileUri:\n \"https://ai-platform-test.oss-cn-hangzhou.aliyuncs.com/ZABX/vidfnxlkpzxoa.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260317T083458Z&X-Amz-SignedHeaders=host&X-Amz-Credential=LTAI5tSfMvkvWhU43Ev1cFJo%2F20260317%2Foss-cn-hangzhou%2Fs3%2Faws4_request&X-Amz-Expires=518400&X-Amz-Signature=14439e184614d76f1ca19437f76496a6d24a8aa537a29ebf61fb2af9d3f9b285\",\n mimeType: \"image/jpeg\",\n },\n ],\n };\n setMessages((prev) => [...prev, userMsg]);\n\n setLoading(true);\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"用户\" 的模拟回复。`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n setLoading(false);\n }, 1000);\n }, []);\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n padding: \"20px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n style={{ width: \"670px\" }}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 2: 开场白和建议问题\n// ============================================\nexport const 开场白和建议: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([]);\n const [suggestions, setSuggestions] = useState([\n \"什么是 React Hooks?\",\n \"如何使用 useState?\",\n \"useEffect 的作用是什么?\",\n ]);\n\n const prologue = \"你好!我是 AI 助手,专注于 React 开发相关的问题。\";\n\n const handleSuggest = (text: string) => {\n const userMsg: IMessage = {\n id: Date.now().toString(),\n role: \"user\",\n text,\n };\n setMessages([userMsg]);\n setSuggestions([]);\n\n setTimeout(() => {\n const botMsg: IMessage = {\n id: (Date.now() + 1).toString(),\n role: \"bot\",\n text: `这是对 \"${text}\" 的回答...`,\n invocationId: `inv-${Date.now()}`,\n };\n setMessages((prev) => [...prev, botMsg]);\n }, 1000);\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={handleSuggest}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 3: 流式输出\n// ============================================\nexport const 流式输出: Story = {\n render: () => {\n const [messages, setMessages] = useState<IMessage[]>([\n {\n id: \"1\",\n role: \"user\",\n text: \"给我讲一个故事\",\n },\n ]);\n const [loading, setLoading] = useState(false);\n\n const handleStart = () => {\n setLoading(true);\n\n const fullText =\n \"从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事。讲什么呢?从前有座山,山里有座庙...\";\n let currentText = \"\";\n let index = 0;\n\n const botMsg: IMessage = {\n id: \"2\",\n role: \"bot\",\n text: \"\",\n invocationId: \"inv-1\",\n };\n\n setMessages((prev) => [...prev, botMsg]);\n\n const interval = setInterval(() => {\n if (index < fullText.length) {\n currentText += fullText[index];\n setMessages((prev) => {\n const newMessages = [...prev];\n newMessages[newMessages.length - 1] = {\n ...botMsg,\n text: currentText,\n };\n return newMessages;\n });\n index++;\n } else {\n clearInterval(interval);\n setLoading(false);\n }\n }, 50);\n };\n\n return (\n <div style={{ width: 700 }}>\n <div style={{ marginBottom: \"16px\" }}>\n <Button type=\"primary\" onClick={handleStart} disabled={loading}>\n 开始流式输出演示\n </Button>\n </div>\n <div\n style={{\n height: \"550px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={loading}\n initialized={true}\n onStop={() => setLoading(false)}\n />\n </div>\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 4: 自定义消息 Footer\n// ============================================\nexport const 自定义Footer: Story = {\n render: () => {\n const [messages] = useState<IMessage[]>(mockMessages);\n const [likedMessages, setLikedMessages] = useState<Set<string>>(new Set());\n\n const handleLike = (messageId: string) => {\n setLikedMessages((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(messageId)) {\n newSet.delete(messageId);\n } else {\n newSet.add(messageId);\n }\n return newSet;\n });\n };\n\n const customFooter = (data: any) => {\n const { message, isLastBotMsg } = data;\n\n if (!isLastBotMsg) return null;\n\n const isLiked = likedMessages.has(message.id);\n\n return (\n <div style={{ padding: \"8px 0\" }}>\n <Space size=\"small\">\n <Button\n size=\"small\"\n type={isLiked ? \"primary\" : \"text\"}\n onClick={() => handleLike(message.id)}\n >\n {isLiked ? \"👍 已赞\" : \"👍 赞\"}\n </Button>\n <Button size=\"small\" type=\"text\">\n 👎 踩\n </Button>\n <Button size=\"small\" type=\"text\">\n 📋 复制\n </Button>\n <Button size=\"small\" type=\"text\">\n 🔄 重新生成\n </Button>\n </Space>\n </div>\n );\n };\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messages}\n loading={false}\n initialized={true}\n actions={customFooter}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 5: 函数调用\n// ============================================\nexport const 函数调用: Story = {\n render: () => {\n const messagesWithFunctionCall: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"今天北京的天气怎么样?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n functionCall: {\n id: \"call-1\",\n name: \"get_weather\",\n args: {\n city: \"北京\",\n date: \"2024-03-05\",\n },\n },\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"根据天气查询,今天北京的天气是晴天,温度 15-25°C,空气质量良好,适合户外活动。\",\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithFunctionCall}\n loading={false}\n initialized={true}\n showFnCallDetail={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 6: 思维链\n// ============================================\nexport const 思维链: Story = {\n render: () => {\n const messagesWithThought: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"帮我分析一下这个问题\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"让我分析一下这个问题...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"bot\",\n text: \"首先,我需要理解问题的核心...\",\n thought: true,\n invocationId: \"inv-1\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"根据分析,我的结论是...(这是最终回答)\",\n thought: false,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithThought}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 7: 代码高亮\n// ============================================\nexport const 代码高亮: Story = {\n render: () => {\n const messagesWithCode: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"写一个 React 组件\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: `这是一个简单的 React 计数器组件:\n\n\\`\\`\\`jsx\nimport React, { useState } from 'react';\n\nfunction Counter() {\n const [count, setCount] = useState(0);\n\n return (\n <div>\n <h1>Count: {count}</h1>\n <button onClick={() => setCount(count + 1)}>\n +1\n </button>\n <button onClick={() => setCount(count - 1)}>\n -1\n </button>\n </div>\n );\n}\n\nexport default Counter;\n\\`\\`\\`\n\n这个组件使用了 \\`useState\\` Hook 来管理计数器状态。`,\n invocationId: \"inv-1\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={messagesWithCode}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n\n// ============================================\n// 示例 8: 多轮对话\n// ============================================\nexport const 多轮对话: Story = {\n render: () => {\n const multiRoundMessages: IMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n text: \"React 是什么?\",\n },\n {\n id: \"2\",\n role: \"bot\",\n text: \"React 是一个用于构建用户界面的 JavaScript 库。\",\n invocationId: \"inv-1\",\n },\n {\n id: \"3\",\n role: \"user\",\n text: \"它有什么特点?\",\n },\n {\n id: \"4\",\n role: \"bot\",\n text: \"React 的主要特点包括:\\n1. 组件化\\n2. 虚拟 DOM\\n3. 单向数据流\\n4. JSX 语法\",\n invocationId: \"inv-2\",\n },\n {\n id: \"5\",\n role: \"user\",\n text: \"什么是虚拟 DOM?\",\n },\n {\n id: \"6\",\n role: \"bot\",\n text: \"虚拟 DOM 是真实 DOM 的 JavaScript 对象表示,React 通过对比虚拟 DOM 的变化来高效更新真实 DOM。\",\n invocationId: \"inv-3\",\n },\n ];\n\n return (\n <div\n style={{\n width: 700,\n height: \"600px\",\n border: \"1px solid #f0f0f0\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n >\n <XAdkChatbot\n messages={multiRoundMessages}\n loading={false}\n initialized={true}\n />\n </div>\n );\n },\n};\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import "@ant-design/x-markdown/themes/light.css";
2
3
  export interface MarkdownRenderProps {
3
4
  text: string;
4
5
  }
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import XMarkdown from "@ant-design/x-markdown";
3
+ import "@ant-design/x-markdown/themes/light.css";
3
4
  import { CodeHighlighter } from "@ant-design/x";
4
5
  import { Flex } from "antd";
5
6
  import Latex from "@ant-design/x-markdown/plugins/Latex";
@@ -56,6 +57,7 @@ var MarkdownRender = function MarkdownRender(_ref) {
56
57
  className: styles.markdownHost,
57
58
  children: /*#__PURE__*/_jsx(XMarkdown, {
58
59
  content: markdown,
60
+ className: "x-markdown-light",
59
61
  paragraphTag: "div",
60
62
  config: {
61
63
  extensions: Latex()
@@ -1 +1 @@
1
- {"version":3,"names":["React","XMarkdown","CodeHighlighter","Flex","Latex","useStyles","BarsOutlined","BulbOutlined","ThunderboltOutlined","CheckCircleOutlined","jsx","_jsx","jsxs","_jsxs","CodeComponent","props","_className$match","className","children","lang","match","ThinkComponent","memo","type","titleMap","planning","replanning","reasoning","action","final_answer","iconMap","align","gap","style","color","margin","MarkdownRender","_ref","text","styles","markdown","replaceAll","markdownWrapper","markdownHost","content","paragraphTag","config","extensions","components","tag","code","streaming","enableAnimation","animationConfig","fadeDuration"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/index.tsx"],"sourcesContent":["import React from \"react\";\nimport XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Flex } from \"antd\";\nimport Latex from \"@ant-design/x-markdown/plugins/Latex\";\nimport { useStyles } from \"./styles\";\nimport {\n BarsOutlined,\n BulbOutlined,\n ThunderboltOutlined,\n CheckCircleOutlined,\n} from \"@ant-design/icons\";\n\nconst CodeComponent: React.FC<ComponentProps> = (props) => {\n const { className, children } = props;\n const lang = className?.match(/language-(\\S+)/)?.[1] || \"\";\n\n if (typeof children !== \"string\") return null;\n return <CodeHighlighter lang={lang}>{children}</CodeHighlighter>;\n};\n\nexport interface MarkdownRenderProps {\n text: string;\n}\n\nconst ThinkComponent = React.memo((props: ComponentProps) => {\n const type = (props.type || \"\") as string;\n const titleMap: Record<string, string> = {\n planning: \"规划\",\n replanning: \"重新规划\",\n reasoning: \"推理\",\n action: \"行动\",\n final_answer: \"最终答案\",\n };\n const iconMap = {\n planning: <BarsOutlined />,\n replanning: <BarsOutlined />,\n reasoning: <BulbOutlined />,\n action: <ThunderboltOutlined />,\n final_answer: <CheckCircleOutlined />,\n };\n\n return (\n <Flex align=\"center\" gap={8} style={{ color: \"#888\", margin: \"4px 0\" }}>\n {type in titleMap && iconMap[type as keyof typeof iconMap]}\n {titleMap[type] && <span>{titleMap[type]}</span>}\n </Flex>\n );\n});\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({ text }) => {\n const styles = useStyles();\n const markdown = text\n .replaceAll(/\\/\\*\\s*PLANNING\\s*\\*\\//g, '<tag type=\"planning\"></tag>')\n .replaceAll(/\\/\\*\\s*REPLANNING\\s*\\*\\//g, '<tag type=\"replanning\"></tag>')\n .replaceAll(/\\/\\*\\s*REASONING\\s*\\*\\//g, '<tag type=\"reasoning\"></tag>')\n .replaceAll(/\\/\\*\\s*ACTION\\s*\\*\\//g, '<tag type=\"action\"></tag>')\n .replaceAll(\n /\\/\\*\\s*FINAL_ANSWER\\s*\\*\\//g,\n '<tag type=\"final_answer\"></tag>',\n );\n\n return (\n <div className={styles.markdownWrapper}>\n <div className={styles.markdownHost}>\n <XMarkdown\n content={markdown}\n paragraphTag=\"div\"\n config={{\n extensions: Latex(),\n }}\n components={{\n tag: ThinkComponent,\n code: CodeComponent,\n }}\n streaming={{\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 400,\n },\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default MarkdownRender;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","XMarkdown","CodeHighlighter","Flex","Latex","useStyles","BarsOutlined","BulbOutlined","ThunderboltOutlined","CheckCircleOutlined","jsx","_jsx","jsxs","_jsxs","CodeComponent","props","_className$match","className","children","lang","match","ThinkComponent","memo","type","titleMap","planning","replanning","reasoning","action","final_answer","iconMap","align","gap","style","color","margin","MarkdownRender","_ref","text","styles","markdown","replaceAll","markdownWrapper","markdownHost","content","paragraphTag","config","extensions","components","tag","code","streaming","enableAnimation","animationConfig","fadeDuration"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/index.tsx"],"sourcesContent":["import React from \"react\";\nimport XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\nimport \"@ant-design/x-markdown/themes/light.css\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Flex } from \"antd\";\nimport Latex from \"@ant-design/x-markdown/plugins/Latex\";\nimport { useStyles } from \"./styles\";\nimport {\n BarsOutlined,\n BulbOutlined,\n ThunderboltOutlined,\n CheckCircleOutlined,\n} from \"@ant-design/icons\";\n\nconst CodeComponent: React.FC<ComponentProps> = (props) => {\n const { className, children } = props;\n const lang = className?.match(/language-(\\S+)/)?.[1] || \"\";\n\n if (typeof children !== \"string\") return null;\n return <CodeHighlighter lang={lang}>{children}</CodeHighlighter>;\n};\n\nexport interface MarkdownRenderProps {\n text: string;\n}\n\nconst ThinkComponent = React.memo((props: ComponentProps) => {\n const type = (props.type || \"\") as string;\n const titleMap: Record<string, string> = {\n planning: \"规划\",\n replanning: \"重新规划\",\n reasoning: \"推理\",\n action: \"行动\",\n final_answer: \"最终答案\",\n };\n const iconMap = {\n planning: <BarsOutlined />,\n replanning: <BarsOutlined />,\n reasoning: <BulbOutlined />,\n action: <ThunderboltOutlined />,\n final_answer: <CheckCircleOutlined />,\n };\n\n return (\n <Flex align=\"center\" gap={8} style={{ color: \"#888\", margin: \"4px 0\" }}>\n {type in titleMap && iconMap[type as keyof typeof iconMap]}\n {titleMap[type] && <span>{titleMap[type]}</span>}\n </Flex>\n );\n});\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({ text }) => {\n const styles = useStyles();\n const markdown = text\n .replaceAll(/\\/\\*\\s*PLANNING\\s*\\*\\//g, '<tag type=\"planning\"></tag>')\n .replaceAll(/\\/\\*\\s*REPLANNING\\s*\\*\\//g, '<tag type=\"replanning\"></tag>')\n .replaceAll(/\\/\\*\\s*REASONING\\s*\\*\\//g, '<tag type=\"reasoning\"></tag>')\n .replaceAll(/\\/\\*\\s*ACTION\\s*\\*\\//g, '<tag type=\"action\"></tag>')\n .replaceAll(\n /\\/\\*\\s*FINAL_ANSWER\\s*\\*\\//g,\n '<tag type=\"final_answer\"></tag>',\n );\n\n return (\n <div className={styles.markdownWrapper}>\n <div className={styles.markdownHost}>\n <XMarkdown\n content={markdown}\n className=\"x-markdown-light\"\n paragraphTag=\"div\"\n config={{\n extensions: Latex(),\n }}\n components={{\n tag: ThinkComponent,\n code: CodeComponent,\n }}\n streaming={{\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 400,\n },\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default MarkdownRender;\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { withBasicStyles } from "../../../../styles/common";
5
5
  export var useStyles = withBasicStyles(function () {
6
6
  return {
7
7
  markdownWrapper: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* \u5173\u952E\uFF1A\u5141\u8BB8\u5185\u5BB9\u6536\u7F29 */\n max-width: 100%; /* \u81EA\u5B9A\u4E49\u6700\u5927\u5BBD\u5EA6 */\n margin: 0 auto;\n "]))),
8
- markdownHost: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown \u57FA\u7840\u6392\u7248 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n }\n\n li {\n margin: 4px 0;\n }\n\n /* ===== Table \u6837\u5F0F ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== \u56FE\u7247 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n "])))
8
+ markdownHost: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown \u57FA\u7840\u6392\u7248 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n /* ===== Table \u6837\u5F0F ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== \u56FE\u7247 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n "])))
9
9
  };
10
10
  });
11
11
  export default useStyles;