@ai-group/chat-sdk 3.2.1 → 3.3.1

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 (105) hide show
  1. package/README.md +89 -60
  2. package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +1 -6
  3. package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js +19 -3
  4. package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js.map +2 -2
  5. package/dist/cjs/components/XAdkChatbot/index.js +36 -8
  6. package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
  7. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +5 -0
  8. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +9 -4
  9. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  10. package/dist/cjs/components/XAdkProvider/compound/Messages.d.ts +7 -0
  11. package/dist/cjs/components/XAdkProvider/compound/Messages.js +10 -4
  12. package/dist/cjs/components/XAdkProvider/compound/Messages.js.map +2 -2
  13. package/dist/cjs/components/XAdkProvider/context/ChatStateContext.d.ts +3 -1
  14. package/dist/cjs/components/XAdkProvider/context/ChatStateContext.js.map +2 -2
  15. package/dist/cjs/components/XAdkProvider/index.js +27 -3
  16. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  17. package/dist/cjs/components/XAdkSender/index.js +19 -13
  18. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  19. package/dist/cjs/components/XAdkThoughtChain/index.js +29 -8
  20. package/dist/cjs/components/XAdkThoughtChain/index.js.map +3 -3
  21. package/dist/cjs/hooks/useADKChat.d.ts +1 -1
  22. package/dist/cjs/hooks/useADKChat.js +3 -1
  23. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  24. package/dist/cjs/index.d.ts +3 -2
  25. package/dist/cjs/index.js +20 -1
  26. package/dist/cjs/index.js.map +2 -2
  27. package/dist/cjs/presets/xGroupAdk.d.ts +20 -0
  28. package/dist/cjs/presets/xGroupAdk.js +131 -0
  29. package/dist/cjs/presets/xGroupAdk.js.map +7 -0
  30. package/dist/cjs/types/ChatStrategies.d.ts +45 -0
  31. package/dist/cjs/types/ChatStrategies.js +18 -0
  32. package/dist/cjs/types/ChatStrategies.js.map +7 -0
  33. package/dist/cjs/types/FunctionCallRender.d.ts +35 -0
  34. package/dist/cjs/types/FunctionCallRender.js +32 -0
  35. package/dist/cjs/types/FunctionCallRender.js.map +7 -0
  36. package/dist/cjs/types/XAdkChatbot.d.ts +32 -0
  37. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  38. package/dist/cjs/types/XAdkProvider.d.ts +19 -0
  39. package/dist/cjs/types/XAdkProvider.js.map +2 -2
  40. package/dist/cjs/types/XAdkSender.d.ts +20 -4
  41. package/dist/cjs/types/XAdkSender.js.map +1 -1
  42. package/dist/cjs/types/XAdkThoughtChain.d.ts +10 -2
  43. package/dist/cjs/types/XAdkThoughtChain.js.map +1 -1
  44. package/dist/cjs/types/XAiChatbot.d.ts +1 -1
  45. package/dist/cjs/types/XAiChatbot.js.map +1 -1
  46. package/dist/cjs/types/XAiProvider.d.ts +1 -1
  47. package/dist/cjs/types/XAiProvider.js.map +1 -1
  48. package/dist/cjs/types/index.d.ts +2 -0
  49. package/dist/cjs/types/index.js +5 -1
  50. package/dist/cjs/types/index.js.map +2 -2
  51. package/dist/cjs/utils/providerManager.d.ts +1 -1
  52. package/dist/cjs/utils/providerManager.js.map +1 -1
  53. package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +1 -6
  54. package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js +25 -5
  55. package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js.map +1 -1
  56. package/dist/esm/components/XAdkChatbot/index.js +35 -8
  57. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  58. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +5 -0
  59. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +9 -4
  60. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  61. package/dist/esm/components/XAdkProvider/compound/Messages.d.ts +7 -0
  62. package/dist/esm/components/XAdkProvider/compound/Messages.js +14 -9
  63. package/dist/esm/components/XAdkProvider/compound/Messages.js.map +1 -1
  64. package/dist/esm/components/XAdkProvider/context/ChatStateContext.d.ts +3 -1
  65. package/dist/esm/components/XAdkProvider/context/ChatStateContext.js.map +1 -1
  66. package/dist/esm/components/XAdkProvider/index.js +21 -4
  67. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  68. package/dist/esm/components/XAdkSender/index.js +26 -17
  69. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  70. package/dist/esm/components/XAdkThoughtChain/index.js +23 -7
  71. package/dist/esm/components/XAdkThoughtChain/index.js.map +1 -1
  72. package/dist/esm/hooks/useADKChat.d.ts +1 -1
  73. package/dist/esm/hooks/useADKChat.js +3 -1
  74. package/dist/esm/hooks/useADKChat.js.map +1 -1
  75. package/dist/esm/index.d.ts +3 -2
  76. package/dist/esm/index.js +2 -1
  77. package/dist/esm/index.js.map +1 -1
  78. package/dist/esm/presets/xGroupAdk.d.ts +20 -0
  79. package/dist/esm/presets/xGroupAdk.js +123 -0
  80. package/dist/esm/presets/xGroupAdk.js.map +1 -0
  81. package/dist/esm/types/ChatStrategies.d.ts +45 -0
  82. package/dist/esm/types/ChatStrategies.js +2 -0
  83. package/dist/esm/types/ChatStrategies.js.map +1 -0
  84. package/dist/esm/types/FunctionCallRender.d.ts +35 -0
  85. package/dist/esm/types/FunctionCallRender.js +14 -0
  86. package/dist/esm/types/FunctionCallRender.js.map +1 -0
  87. package/dist/esm/types/XAdkChatbot.d.ts +32 -0
  88. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  89. package/dist/esm/types/XAdkProvider.d.ts +19 -0
  90. package/dist/esm/types/XAdkProvider.js.map +1 -1
  91. package/dist/esm/types/XAdkSender.d.ts +20 -4
  92. package/dist/esm/types/XAdkSender.js.map +1 -1
  93. package/dist/esm/types/XAdkThoughtChain.d.ts +10 -2
  94. package/dist/esm/types/XAdkThoughtChain.js.map +1 -1
  95. package/dist/esm/types/XAiChatbot.d.ts +1 -1
  96. package/dist/esm/types/XAiChatbot.js.map +1 -1
  97. package/dist/esm/types/XAiProvider.d.ts +1 -1
  98. package/dist/esm/types/XAiProvider.js.map +1 -1
  99. package/dist/esm/types/index.d.ts +2 -0
  100. package/dist/esm/types/index.js +2 -0
  101. package/dist/esm/types/index.js.map +1 -1
  102. package/dist/esm/utils/providerManager.d.ts +1 -1
  103. package/dist/esm/utils/providerManager.js.map +1 -1
  104. package/dist/umd/chat-sdk.min.js +1 -1
  105. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/XAiChatbot.ts"],
4
- "sourcesContent": ["import React, { ReactNode, RefObject, MouseEvent, ReactElement } from 'react';\nimport type { PromptsItemType } from '@ant-design/x';\nimport type { MessageType } from 'src/client/base';\nimport type { UploadProps } from 'antd';\nimport type { Messages } from './XAiMessage';\nimport type { SendContent } from './XAiSender';\n\n// 类型定义\nexport interface User {\n id: string;\n name: string;\n avatar?: string;\n }\n\nexport interface MessageProps {\n _id: string;\n type: string;\n content: Record<string, any>;\n createdAt: number;\n user: User;\n position?: 'left' | 'right' | 'center' | 'pop';\n hasTime?: boolean;\n status?: 'pending' | 'sent' | 'fail';\n }\n\nexport interface QuickReplyItemProps {\n name: string;\n code: string;\n icon?: string;\n img?: string;\n isNew?: boolean;\n isHighlight?: boolean;\n }\n\nexport interface ComposerHandle {\n setText: (text: string) => void;\n }\n\nexport interface ScrollToEndOptions {\n animated?: boolean;\n force?: boolean;\n }\n\nexport interface MessageContainerHandle {\n scrollToEnd: (options?: ScrollToEndOptions) => void;\n }\n\nexport interface NavbarProps {\n title?: string;\n subtitle?: string;\n avatar?: string;\n}\n\nexport interface ToolbarItemProps {\n id: string;\n icon: string;\n label: string;\n disabled?: boolean;\n }\n\nexport interface IconButtonProps {\n icon: string;\n onClick: () => void;\n disabled?: boolean;\n }\n\nexport interface RecorderProps {\n onStart?: () => void;\n onStop?: (audioBlob: Blob) => void;\n onError?: (error: Error) => void;\n }\n\nexport type InputType = 'text' | 'voice';\n\n// chatbot 会话字段\nexport interface ChatbotMessageFields {\n messages?: MessageType[];\n setMessages?: React.Dispatch<React.SetStateAction<MessageType[]>>;\n /** 发送消息回调 */\n onSend?: (content: SendContent) => void;\n /** 清空消息回调 */\n onClear?: () => void;\n /** 停止生成回调 */\n onStop?: () => void;\n}\n\nexport interface ActionItem {\n key?: string;\n icon?: React.ReactNode;\n render?: (index: number, msg: any) => React.ReactNode;\n tooltip?: string;\n}\n\n/**\n * AI 聊天机器人组件\n */\nexport interface XAiChatbotProps extends ChatbotMessageFields {\n /** 宽屏断点 */\n wideBreakpoint?: string;\n /** 导航栏展示 */\n navbarShow?: boolean;\n /** 导航栏配置 */\n navbar?: NavbarProps;\n /** 导航栏渲染函数,会覆盖 navbar */\n renderNavbar?: () => ReactNode;\n /** 是否加载中 */\n loading?: boolean;\n /** 加载更多文案 */\n loadMoreText?: string;\n /** 在消息列表上面的渲染函数 */\n renderBeforeMessageList?: () => ReactNode;\n /** 消息列表 ref */\n messagesRef?: RefObject<MessageContainerHandle>;\n /** 下拉加载回调 */\n onRefresh?: () => Promise<any>;\n /** 滚动消息列表回调 */\n onScroll?: (event: React.UIEvent<HTMLDivElement, UIEvent>) => void;\n /** 消息内容渲染函数 */\n renderMessageContent?: (message: MessageProps) => ReactNode;\n /** 快捷短语列表 */\n quickReplies?: QuickReplyItemProps[];\n /** 快捷短语是否可见 */\n quickRepliesVisible?: boolean;\n // /** 点击快速回复回调 */\n // onQuickReplyClick?: (item: QuickReplyItemProps, index: number) => void;\n // /** 快捷短语的滚动回调 */\n // onQuickReplyScroll?: () => void;\n // /** 快捷短语渲染函数,会覆盖 quickReplies */\n // renderQuickReplies?: () => ReactNode;\n /** 输入框初始内容 */\n text?: string;\n /** 空状态渲染插槽 */\n empty?: ReactElement;\n /** 空状态图片 */\n emptyStateImage?: string;\n /** 空状态文案 */\n emptyStateText?: string;\n /** 输入框占位符 */\n placeholder?: string;\n /** 输入方式 */\n inputType?: InputType;\n // /** 输入方式切换回调 */\n // onInputTypeChange?: (inputType: InputType) => void;\n /** 语音输入配置 */\n recorder?: RecorderProps;\n /** 工具栏配置 */\n toolbar?: ToolbarItemProps[];\n /** AI头像 */\n avatar?: ReactNode;\n /** 用户头像 */\n userAvatar?: ReactNode;\n /** 发送按钮 */\n sendBtn?: ReactNode;\n /** 是否展示清空按钮 */\n clearBtnShow? : boolean;\n /** 工具栏点击回调 */\n onToolbarClick?: (item: ToolbarItemProps, event: MouseEvent) => void;\n /** 工具栏打开/关闭回调 */\n onAccessoryToggle?: (isAccessoryOpen: boolean) => void;\n /** 输入框右边图标按钮配置 */\n rightAction?: IconButtonProps;\n /** 底部文案 */\n footerTips?: string;\n /** 帮助消息点击回调 */\n onSuggestMessageClick?: (item: PromptsItemType, id: string) => void;\n /** 消息左下角展示字段 */\n messageTooltip?: (msg: Messages) => React.ReactNode;\n /** 消息右下角功能区 */\n messageActions?: ActionItem[];\n /** 消息右下角功能区点击回调 */\n onMessagesActionsCallback?: (index: number, data: Messages) => void; // 点击回调\n /** 输入组件 */\n Composer?: React.ElementType;\n /** 是否展示输入框 */\n inputShow?: boolean;\n /** 多个chatbot唯一键 */\n providerId?: string;\n /** 消息顶部 */\n messageTop?: ReactNode;\n enableUpload?: boolean;\n uploadRequest?: UploadProps['customRequest'];\n }\n"],
4
+ "sourcesContent": ["import React, { ReactNode, RefObject, MouseEvent, ReactElement } from 'react';\nimport type { PromptsItemType } from '@ant-design/x';\nimport type { MessageType } from '../client/base';\nimport type { UploadProps } from 'antd';\nimport type { Messages } from './XAiMessage';\nimport type { SendContent } from './XAiSender';\n\n// 类型定义\nexport interface User {\n id: string;\n name: string;\n avatar?: string;\n }\n\nexport interface MessageProps {\n _id: string;\n type: string;\n content: Record<string, any>;\n createdAt: number;\n user: User;\n position?: 'left' | 'right' | 'center' | 'pop';\n hasTime?: boolean;\n status?: 'pending' | 'sent' | 'fail';\n }\n\nexport interface QuickReplyItemProps {\n name: string;\n code: string;\n icon?: string;\n img?: string;\n isNew?: boolean;\n isHighlight?: boolean;\n }\n\nexport interface ComposerHandle {\n setText: (text: string) => void;\n }\n\nexport interface ScrollToEndOptions {\n animated?: boolean;\n force?: boolean;\n }\n\nexport interface MessageContainerHandle {\n scrollToEnd: (options?: ScrollToEndOptions) => void;\n }\n\nexport interface NavbarProps {\n title?: string;\n subtitle?: string;\n avatar?: string;\n}\n\nexport interface ToolbarItemProps {\n id: string;\n icon: string;\n label: string;\n disabled?: boolean;\n }\n\nexport interface IconButtonProps {\n icon: string;\n onClick: () => void;\n disabled?: boolean;\n }\n\nexport interface RecorderProps {\n onStart?: () => void;\n onStop?: (audioBlob: Blob) => void;\n onError?: (error: Error) => void;\n }\n\nexport type InputType = 'text' | 'voice';\n\n// chatbot 会话字段\nexport interface ChatbotMessageFields {\n messages?: MessageType[];\n setMessages?: React.Dispatch<React.SetStateAction<MessageType[]>>;\n /** 发送消息回调 */\n onSend?: (content: SendContent) => void;\n /** 清空消息回调 */\n onClear?: () => void;\n /** 停止生成回调 */\n onStop?: () => void;\n}\n\nexport interface ActionItem {\n key?: string;\n icon?: React.ReactNode;\n render?: (index: number, msg: any) => React.ReactNode;\n tooltip?: string;\n}\n\n/**\n * AI 聊天机器人组件\n */\nexport interface XAiChatbotProps extends ChatbotMessageFields {\n /** 宽屏断点 */\n wideBreakpoint?: string;\n /** 导航栏展示 */\n navbarShow?: boolean;\n /** 导航栏配置 */\n navbar?: NavbarProps;\n /** 导航栏渲染函数,会覆盖 navbar */\n renderNavbar?: () => ReactNode;\n /** 是否加载中 */\n loading?: boolean;\n /** 加载更多文案 */\n loadMoreText?: string;\n /** 在消息列表上面的渲染函数 */\n renderBeforeMessageList?: () => ReactNode;\n /** 消息列表 ref */\n messagesRef?: RefObject<MessageContainerHandle>;\n /** 下拉加载回调 */\n onRefresh?: () => Promise<any>;\n /** 滚动消息列表回调 */\n onScroll?: (event: React.UIEvent<HTMLDivElement, UIEvent>) => void;\n /** 消息内容渲染函数 */\n renderMessageContent?: (message: MessageProps) => ReactNode;\n /** 快捷短语列表 */\n quickReplies?: QuickReplyItemProps[];\n /** 快捷短语是否可见 */\n quickRepliesVisible?: boolean;\n // /** 点击快速回复回调 */\n // onQuickReplyClick?: (item: QuickReplyItemProps, index: number) => void;\n // /** 快捷短语的滚动回调 */\n // onQuickReplyScroll?: () => void;\n // /** 快捷短语渲染函数,会覆盖 quickReplies */\n // renderQuickReplies?: () => ReactNode;\n /** 输入框初始内容 */\n text?: string;\n /** 空状态渲染插槽 */\n empty?: ReactElement;\n /** 空状态图片 */\n emptyStateImage?: string;\n /** 空状态文案 */\n emptyStateText?: string;\n /** 输入框占位符 */\n placeholder?: string;\n /** 输入方式 */\n inputType?: InputType;\n // /** 输入方式切换回调 */\n // onInputTypeChange?: (inputType: InputType) => void;\n /** 语音输入配置 */\n recorder?: RecorderProps;\n /** 工具栏配置 */\n toolbar?: ToolbarItemProps[];\n /** AI头像 */\n avatar?: ReactNode;\n /** 用户头像 */\n userAvatar?: ReactNode;\n /** 发送按钮 */\n sendBtn?: ReactNode;\n /** 是否展示清空按钮 */\n clearBtnShow? : boolean;\n /** 工具栏点击回调 */\n onToolbarClick?: (item: ToolbarItemProps, event: MouseEvent) => void;\n /** 工具栏打开/关闭回调 */\n onAccessoryToggle?: (isAccessoryOpen: boolean) => void;\n /** 输入框右边图标按钮配置 */\n rightAction?: IconButtonProps;\n /** 底部文案 */\n footerTips?: string;\n /** 帮助消息点击回调 */\n onSuggestMessageClick?: (item: PromptsItemType, id: string) => void;\n /** 消息左下角展示字段 */\n messageTooltip?: (msg: Messages) => React.ReactNode;\n /** 消息右下角功能区 */\n messageActions?: ActionItem[];\n /** 消息右下角功能区点击回调 */\n onMessagesActionsCallback?: (index: number, data: Messages) => void; // 点击回调\n /** 输入组件 */\n Composer?: React.ElementType;\n /** 是否展示输入框 */\n inputShow?: boolean;\n /** 多个chatbot唯一键 */\n providerId?: string;\n /** 消息顶部 */\n messageTop?: ReactNode;\n enableUpload?: boolean;\n uploadRequest?: UploadProps['customRequest'];\n }\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import React, { ReactNode } from 'react';
2
- import { AiClient } from 'src/client/base';
2
+ import { AiClient } from '../client/base';
3
3
  import type { ChatbotMessageFields } from './XAiChatbot';
4
4
  import type { Messages, SendContent, SessionData, ChatConfig, ThemeType } from "./";
5
5
  /**
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/XAiProvider.ts"],
4
- "sourcesContent": ["// context/ProviderContext.ts\nimport React, { ReactNode } from 'react';\nimport { AiClient } from 'src/client/base';\nimport type { ChatbotMessageFields } from './XAiChatbot';\nimport type { Messages, SendContent, SessionData, ChatConfig, ThemeType } from '@/types';\n\n/**\n * 错误码枚举(数字格式)\n * @enum {string}\n * @version 1.0.0\n */\nexport enum ErrorCodeNum {\n /** 应用下架 */\n APP_NOT_ENABLE = 'client_50017',\n /** 应用删除 */\n APP_DELETED = 'client_50017',\n /** 无该应用 */\n APP_NOT_FOUND = 'client_59999',\n /** 接口报错 */\n API_ERROR = 'client_50054',\n}\n\n/**\n * 错误码枚举\n * @enum {string}\n * @version 1.0.0\n */\nexport enum ErrorCode {\n /** 应用未启用 */\n APP_NOT_ENABLE = 'APP_NOT_ENABLE',\n /** 应用已删除 */\n APP_DELETED = 'APP_DELETED',\n /** 应用未找到 */\n APP_NOT_FOUND = 'APP_NOT_FOUND',\n /** API 错误 */\n API_ERROR = 'API_ERROR',\n}\n\n/**\n * 错误码映射表\n * @type {Record<string, {code: ErrorCode, message: string}>}\n * @version 1.0.0\n */\nexport const ErrorCodeMap = {\n client_50017: {\n code: ErrorCode.APP_NOT_ENABLE,\n message: '该应用已删除或已下架',\n },\n client_50054: {\n code: ErrorCode.API_ERROR,\n message: '应用服务端出错',\n },\n};\n\n/**\n * 成功状态码枚举\n * @enum {string}\n * @version 1.0.0\n */\nexport enum SuccessCode {\n /** 应用配置初始化成功 */\n APP_CONFIG_INIT_SUCCESS = 'APP_CONFIG_INIT_SUCCESS',\n /** 应用消息初始化成功 */\n APP_MESSAGES_INIT_SUCCESS = 'APP_MESSAGES_INIT_SUCCESS',\n}\n\n/**\n * 错误信息接口\n * @interface Error\n * @version 1.0.0\n */\nexport interface Error {\n /** 错误码 */\n code: ErrorCode;\n /** 错误信息 */\n message: string;\n}\n\n/**\n * 成功信息接口\n * @interface Success\n * @version 1.0.0\n */\nexport interface Success {\n /** 成功状态码 */\n code: SuccessCode;\n /** 成功信息 */\n message: string;\n /** 成功数据 */\n data?: any;\n}\n\n/**\n * XAiProvider 操作句柄接口\n * @interface XAiProviderHandle\n * @version 1.0.0\n */\nexport interface XAiProviderHandle {\n /**\n * 发送聊天消息\n * @param content - 消息内容\n * @type {(content: string) => void}\n * @version 1.0.0\n */\n chat: (content: SendContent) => void;\n\n /**\n * 停止聊天\n * @type {() => void}\n * @version 1.0.0\n */\n stopChat: () => void;\n\n /**\n * 重新发送聊天\n * @type {() => void}\n * @version 1.0.0\n */\n reChat: () => void;\n\n /**\n * 获取应用信息\n * @returns {any} 应用信息对象\n * @type {() => any}\n * @version 1.0.0\n */\n getAppInfo: () => any;\n\n /**\n * 获取消息列表\n * @returns {Messages[]} 消息数组\n * @type {() => Messages[]}\n * @version 1.0.0\n */\n getMessages: () => Messages[];\n\n /**\n * 获取会话列表\n * @returns {}\n */\n getSessions: () => SessionData[];\n\n /**\n * 重新设置当前会话\n * @param id - 会话ID\n * @type {(id: string) => void}\n * @version 1.0.0\n */\n setCurrentSession: (id: string) => void;\n}\n\nexport interface sessionConfig {\n /**\n * 是否展示会话列表\n * @type {boolean}\n * @default false\n */\n showSessionList?: boolean;\n}\n\n\n/**\n * XAiProvider 配置接口\n * @interface XAiProviderConfig\n * @version 1.0.0\n */\nexport interface XAiProviderConfig {\n /**\n * 应用唯一编号\n * @type {string}\n * @default undefined\n * @version 1.0.0\n */\n appNo?: string;\n\n /**\n * 会话配置\n * @type {sessionConfig}\n */\n session?: sessionConfig;\n\n /**\n * 对话框配置\n * @type {ChatConfig}\n */\n chatProps?: ChatConfig;\n\n /**\n * 是否启用调试模式\n * @type {boolean}\n * @default false\n * @version 1.0.0\n */\n debug?: boolean;\n}\n\n/**\n * XAiProvider 组件属性接口\n * @interface XAiProviderProps\n * @version 1.0.0\n */\nexport interface XAiProviderProps {\n /**\n * AI 服务地址\n * @type {string}\n * @version 1.0.0\n */\n url: string;\n\n /**\n * 认证 token\n * @type {string}\n * @version 1.0.0\n */\n token: string;\n\n /**\n * 配置信息\n * @type {XAiProviderConfig}\n * @default undefined\n * @version 1.0.0\n */\n config?: XAiProviderConfig;\n\n /**\n * Provider 唯一标识,用于区分多个 Provider 实例\n * @type {string}\n * @default undefined\n * @version 1.0.0\n */\n providerId?: string;\n\n /**\n * Token 刷新回调\n * @type {() => Promise<string>}\n * @default undefined\n * @version 1.0.0\n */\n onRefreshToken?: () => Promise<string>;\n\n /**\n * 应用无法正常渲染回调\n * @type {(error: Error) => void}\n * @default undefined\n * @version 1.0.0\n */\n onError?: (error: Error) => void;\n\n /**\n * 应用正常渲染回调\n * @type {(success: Success) => void}\n * @default undefined\n * @version 1.0.0\n */\n onSuccess?: (success: Success) => void;\n\n /**\n * 消息返回回调\n * @type {(data: Messages) => void}\n * @default undefined\n * @version 1.0.0\n */\n onMessage?: (content: string, data: Messages) => void;\n\n /**\n * 子组件\n * @type {ReactNode}\n * @version 1.0.0\n */\n children: ReactNode;\n}\n\n/**\n * XAiSDK 组件属性接口\n * @interface XAiSDKProps\n * @extends XAiProviderProps\n * @version 1.0.0\n */\nexport interface XAiSDKProps extends XAiProviderProps {\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\n/**\n * XAi 上下文类型接口\n * @interface XAiContextType\n * @extends Required<ChatbotMessageFields>\n * @version 1.0.0\n */\nexport interface XAiContextType extends Required<ChatbotMessageFields> {\n /**\n * AI 客户端实例\n * @type {AiClient | null}\n * @default null\n * @version 1.0.0\n */\n client: AiClient | null;\n\n /**\n * 认证令牌\n * @type {string}\n * @version 1.0.0\n */\n token: string;\n\n /**\n * 加载状态\n * @type {boolean}\n * @default false\n * @version 1.0.0\n */\n loading: boolean;\n\n /**\n * 错误信息\n * @type {string | null}\n * @default null\n * @version 1.0.0\n */\n error: string | null;\n}\n\n/**\n * XAi 上下文对象\n * @type {React.Context<XAiContextType | null>}\n * @version 1.0.0\n */\nexport const XAiContext = React.createContext<XAiContextType | null>(null);\n"],
4
+ "sourcesContent": ["// context/ProviderContext.ts\nimport React, { ReactNode } from 'react';\nimport { AiClient } from '../client/base';\nimport type { ChatbotMessageFields } from './XAiChatbot';\nimport type { Messages, SendContent, SessionData, ChatConfig, ThemeType } from '@/types';\n\n/**\n * 错误码枚举(数字格式)\n * @enum {string}\n * @version 1.0.0\n */\nexport enum ErrorCodeNum {\n /** 应用下架 */\n APP_NOT_ENABLE = 'client_50017',\n /** 应用删除 */\n APP_DELETED = 'client_50017',\n /** 无该应用 */\n APP_NOT_FOUND = 'client_59999',\n /** 接口报错 */\n API_ERROR = 'client_50054',\n}\n\n/**\n * 错误码枚举\n * @enum {string}\n * @version 1.0.0\n */\nexport enum ErrorCode {\n /** 应用未启用 */\n APP_NOT_ENABLE = 'APP_NOT_ENABLE',\n /** 应用已删除 */\n APP_DELETED = 'APP_DELETED',\n /** 应用未找到 */\n APP_NOT_FOUND = 'APP_NOT_FOUND',\n /** API 错误 */\n API_ERROR = 'API_ERROR',\n}\n\n/**\n * 错误码映射表\n * @type {Record<string, {code: ErrorCode, message: string}>}\n * @version 1.0.0\n */\nexport const ErrorCodeMap = {\n client_50017: {\n code: ErrorCode.APP_NOT_ENABLE,\n message: '该应用已删除或已下架',\n },\n client_50054: {\n code: ErrorCode.API_ERROR,\n message: '应用服务端出错',\n },\n};\n\n/**\n * 成功状态码枚举\n * @enum {string}\n * @version 1.0.0\n */\nexport enum SuccessCode {\n /** 应用配置初始化成功 */\n APP_CONFIG_INIT_SUCCESS = 'APP_CONFIG_INIT_SUCCESS',\n /** 应用消息初始化成功 */\n APP_MESSAGES_INIT_SUCCESS = 'APP_MESSAGES_INIT_SUCCESS',\n}\n\n/**\n * 错误信息接口\n * @interface Error\n * @version 1.0.0\n */\nexport interface Error {\n /** 错误码 */\n code: ErrorCode;\n /** 错误信息 */\n message: string;\n}\n\n/**\n * 成功信息接口\n * @interface Success\n * @version 1.0.0\n */\nexport interface Success {\n /** 成功状态码 */\n code: SuccessCode;\n /** 成功信息 */\n message: string;\n /** 成功数据 */\n data?: any;\n}\n\n/**\n * XAiProvider 操作句柄接口\n * @interface XAiProviderHandle\n * @version 1.0.0\n */\nexport interface XAiProviderHandle {\n /**\n * 发送聊天消息\n * @param content - 消息内容\n * @type {(content: string) => void}\n * @version 1.0.0\n */\n chat: (content: SendContent) => void;\n\n /**\n * 停止聊天\n * @type {() => void}\n * @version 1.0.0\n */\n stopChat: () => void;\n\n /**\n * 重新发送聊天\n * @type {() => void}\n * @version 1.0.0\n */\n reChat: () => void;\n\n /**\n * 获取应用信息\n * @returns {any} 应用信息对象\n * @type {() => any}\n * @version 1.0.0\n */\n getAppInfo: () => any;\n\n /**\n * 获取消息列表\n * @returns {Messages[]} 消息数组\n * @type {() => Messages[]}\n * @version 1.0.0\n */\n getMessages: () => Messages[];\n\n /**\n * 获取会话列表\n * @returns {}\n */\n getSessions: () => SessionData[];\n\n /**\n * 重新设置当前会话\n * @param id - 会话ID\n * @type {(id: string) => void}\n * @version 1.0.0\n */\n setCurrentSession: (id: string) => void;\n}\n\nexport interface sessionConfig {\n /**\n * 是否展示会话列表\n * @type {boolean}\n * @default false\n */\n showSessionList?: boolean;\n}\n\n\n/**\n * XAiProvider 配置接口\n * @interface XAiProviderConfig\n * @version 1.0.0\n */\nexport interface XAiProviderConfig {\n /**\n * 应用唯一编号\n * @type {string}\n * @default undefined\n * @version 1.0.0\n */\n appNo?: string;\n\n /**\n * 会话配置\n * @type {sessionConfig}\n */\n session?: sessionConfig;\n\n /**\n * 对话框配置\n * @type {ChatConfig}\n */\n chatProps?: ChatConfig;\n\n /**\n * 是否启用调试模式\n * @type {boolean}\n * @default false\n * @version 1.0.0\n */\n debug?: boolean;\n}\n\n/**\n * XAiProvider 组件属性接口\n * @interface XAiProviderProps\n * @version 1.0.0\n */\nexport interface XAiProviderProps {\n /**\n * AI 服务地址\n * @type {string}\n * @version 1.0.0\n */\n url: string;\n\n /**\n * 认证 token\n * @type {string}\n * @version 1.0.0\n */\n token: string;\n\n /**\n * 配置信息\n * @type {XAiProviderConfig}\n * @default undefined\n * @version 1.0.0\n */\n config?: XAiProviderConfig;\n\n /**\n * Provider 唯一标识,用于区分多个 Provider 实例\n * @type {string}\n * @default undefined\n * @version 1.0.0\n */\n providerId?: string;\n\n /**\n * Token 刷新回调\n * @type {() => Promise<string>}\n * @default undefined\n * @version 1.0.0\n */\n onRefreshToken?: () => Promise<string>;\n\n /**\n * 应用无法正常渲染回调\n * @type {(error: Error) => void}\n * @default undefined\n * @version 1.0.0\n */\n onError?: (error: Error) => void;\n\n /**\n * 应用正常渲染回调\n * @type {(success: Success) => void}\n * @default undefined\n * @version 1.0.0\n */\n onSuccess?: (success: Success) => void;\n\n /**\n * 消息返回回调\n * @type {(data: Messages) => void}\n * @default undefined\n * @version 1.0.0\n */\n onMessage?: (content: string, data: Messages) => void;\n\n /**\n * 子组件\n * @type {ReactNode}\n * @version 1.0.0\n */\n children: ReactNode;\n}\n\n/**\n * XAiSDK 组件属性接口\n * @interface XAiSDKProps\n * @extends XAiProviderProps\n * @version 1.0.0\n */\nexport interface XAiSDKProps extends XAiProviderProps {\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\n/**\n * XAi 上下文类型接口\n * @interface XAiContextType\n * @extends Required<ChatbotMessageFields>\n * @version 1.0.0\n */\nexport interface XAiContextType extends Required<ChatbotMessageFields> {\n /**\n * AI 客户端实例\n * @type {AiClient | null}\n * @default null\n * @version 1.0.0\n */\n client: AiClient | null;\n\n /**\n * 认证令牌\n * @type {string}\n * @version 1.0.0\n */\n token: string;\n\n /**\n * 加载状态\n * @type {boolean}\n * @default false\n * @version 1.0.0\n */\n loading: boolean;\n\n /**\n * 错误信息\n * @type {string | null}\n * @default null\n * @version 1.0.0\n */\n error: string | null;\n}\n\n/**\n * XAi 上下文对象\n * @type {React.Context<XAiContextType | null>}\n * @version 1.0.0\n */\nexport const XAiContext = React.createContext<XAiContextType | null>(null);\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAiC;AAU1B,IAAK,eAAL,kBAAKA,kBAAL;AAEL,EAAAA,cAAA,oBAAiB;AAEjB,EAAAA,cAAA,iBAAc;AAEd,EAAAA,cAAA,mBAAgB;AAEhB,EAAAA,cAAA,eAAY;AARF,SAAAA;AAAA,GAAA;AAgBL,IAAK,YAAL,kBAAKC,eAAL;AAEL,EAAAA,WAAA,oBAAiB;AAEjB,EAAAA,WAAA,iBAAc;AAEd,EAAAA,WAAA,mBAAgB;AAEhB,EAAAA,WAAA,eAAY;AARF,SAAAA;AAAA,GAAA;AAgBL,IAAM,eAAe;AAAA,EAC1B,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAOO,IAAK,cAAL,kBAAKC,iBAAL;AAEL,EAAAA,aAAA,6BAA0B;AAE1B,EAAAA,aAAA,+BAA4B;AAJlB,SAAAA;AAAA,GAAA;AAmSL,IAAM,aAAa,aAAAC,QAAM,cAAqC,IAAI;",
6
6
  "names": ["ErrorCodeNum", "ErrorCode", "SuccessCode", "React"]
7
7
  }
@@ -9,3 +9,5 @@ export * from "./XAdkSender";
9
9
  export * from "./XAdkThoughtChain";
10
10
  export * from "./FileGallery";
11
11
  export * from "./common";
12
+ export * from "./FunctionCallRender";
13
+ export * from "./ChatStrategies";
@@ -27,6 +27,8 @@ __reExport(types_exports, require("./XAdkSender"), module.exports);
27
27
  __reExport(types_exports, require("./XAdkThoughtChain"), module.exports);
28
28
  __reExport(types_exports, require("./FileGallery"), module.exports);
29
29
  __reExport(types_exports, require("./common"), module.exports);
30
+ __reExport(types_exports, require("./FunctionCallRender"), module.exports);
31
+ __reExport(types_exports, require("./ChatStrategies"), module.exports);
30
32
  // Annotate the CommonJS export names for ESM import in node:
31
33
  0 && (module.exports = {
32
34
  ...require("./XAiChatbot"),
@@ -39,6 +41,8 @@ __reExport(types_exports, require("./common"), module.exports);
39
41
  ...require("./XAdkSender"),
40
42
  ...require("./XAdkThoughtChain"),
41
43
  ...require("./FileGallery"),
42
- ...require("./common")
44
+ ...require("./common"),
45
+ ...require("./FunctionCallRender"),
46
+ ...require("./ChatStrategies")
43
47
  });
44
48
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/index.ts"],
4
- "sourcesContent": ["export * from \"./XAiChatbot\";\nexport * from \"./XAiMessage\";\nexport * from \"./XAiProvider\";\nexport * from \"./XAiSender\";\nexport * from \"./XAiConversations\";\nexport * from \"./XAdkProvider\";\nexport * from \"./XAdkChatbot\";\nexport * from \"./XAdkSender\";\nexport * from \"./XAdkThoughtChain\";\nexport * from \"./FileGallery\";\nexport * from \"./common\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,yBAAd;AACA,0BAAc,yBADd;AAEA,0BAAc,0BAFd;AAGA,0BAAc,wBAHd;AAIA,0BAAc,+BAJd;AAKA,0BAAc,2BALd;AAMA,0BAAc,0BANd;AAOA,0BAAc,yBAPd;AAQA,0BAAc,+BARd;AASA,0BAAc,0BATd;AAUA,0BAAc,qBAVd;",
4
+ "sourcesContent": ["export * from \"./XAiChatbot\";\nexport * from \"./XAiMessage\";\nexport * from \"./XAiProvider\";\nexport * from \"./XAiSender\";\nexport * from \"./XAiConversations\";\nexport * from \"./XAdkProvider\";\nexport * from \"./XAdkChatbot\";\nexport * from \"./XAdkSender\";\nexport * from \"./XAdkThoughtChain\";\nexport * from \"./FileGallery\";\nexport * from \"./common\";\nexport * from \"./FunctionCallRender\";\nexport * from \"./ChatStrategies\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,yBAAd;AACA,0BAAc,yBADd;AAEA,0BAAc,0BAFd;AAGA,0BAAc,wBAHd;AAIA,0BAAc,+BAJd;AAKA,0BAAc,2BALd;AAMA,0BAAc,0BANd;AAOA,0BAAc,yBAPd;AAQA,0BAAc,+BARd;AASA,0BAAc,0BATd;AAUA,0BAAc,qBAVd;AAWA,0BAAc,iCAXd;AAYA,0BAAc,6BAZd;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- import { MessageType } from 'src/client/base';
1
+ import { MessageType } from '../client/base';
2
2
  export interface ProviderState {
3
3
  client: any;
4
4
  messages: MessageType[];
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/providerManager.ts"],
4
- "sourcesContent": ["import { MessageType } from 'src/client/base';\nexport interface ProviderState {\n client: any;\n messages: MessageType[];\n token: string;\n url: string;\n}\n// Provider 实例管理\nclass ProviderManager {\n private providers = new Map<string, ProviderState>();\n\n // 注册 Provider\n register(providerId: string, data: {\n client: any;\n token: string;\n url: string;\n }) {\n this.providers.set(providerId, {\n ...data,\n messages: [],\n });\n }\n\n // 注销 Provider\n unregister(providerId: string) {\n this.providers.delete(providerId);\n }\n\n // 获取 Provider 数据\n getProvider(providerId: string): ProviderState | undefined {\n return this.providers.get(providerId);\n }\n\n // 添加消息到指定 Provider\n addMessage(providerId: string, message: MessageType) {\n const provider = this.providers.get(providerId);\n if (provider) {\n provider.messages.push(message);\n }\n }\n\n // 清空指定 Provider 的消息\n clearMessages(providerId: string) {\n const provider = this.providers.get(providerId);\n if (provider) {\n provider.messages = [];\n }\n }\n\n // 获取所有 Provider ID\n getProviderIds() {\n return Array.from(this.providers.keys());\n }\n}\n\n// 全局单例\nexport const providerManager = new ProviderManager();\n\n// Hook 用于在组件中使用\nexport const useProviderManager = () => {\n return providerManager;\n};\n"],
4
+ "sourcesContent": ["import { MessageType } from '../client/base';\nexport interface ProviderState {\n client: any;\n messages: MessageType[];\n token: string;\n url: string;\n}\n// Provider 实例管理\nclass ProviderManager {\n private providers = new Map<string, ProviderState>();\n\n // 注册 Provider\n register(providerId: string, data: {\n client: any;\n token: string;\n url: string;\n }) {\n this.providers.set(providerId, {\n ...data,\n messages: [],\n });\n }\n\n // 注销 Provider\n unregister(providerId: string) {\n this.providers.delete(providerId);\n }\n\n // 获取 Provider 数据\n getProvider(providerId: string): ProviderState | undefined {\n return this.providers.get(providerId);\n }\n\n // 添加消息到指定 Provider\n addMessage(providerId: string, message: MessageType) {\n const provider = this.providers.get(providerId);\n if (provider) {\n provider.messages.push(message);\n }\n }\n\n // 清空指定 Provider 的消息\n clearMessages(providerId: string) {\n const provider = this.providers.get(providerId);\n if (provider) {\n provider.messages = [];\n }\n }\n\n // 获取所有 Provider ID\n getProviderIds() {\n return Array.from(this.providers.keys());\n }\n}\n\n// 全局单例\nexport const providerManager = new ProviderManager();\n\n// Hook 用于在组件中使用\nexport const useProviderManager = () => {\n return providerManager;\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,IAAM,kBAAN,MAAsB;AAAA,EAAtB;AACE,SAAQ,YAAY,oBAAI,IAA2B;AAAA;AAAA;AAAA,EAGnD,SAAS,YAAoB,MAI1B;AACD,SAAK,UAAU,IAAI,YAAY;AAAA,MAC7B,GAAG;AAAA,MACH,UAAU,CAAC;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WAAW,YAAoB;AAC7B,SAAK,UAAU,OAAO,UAAU;AAAA,EAClC;AAAA;AAAA,EAGA,YAAY,YAA+C;AACzD,WAAO,KAAK,UAAU,IAAI,UAAU;AAAA,EACtC;AAAA;AAAA,EAGA,WAAW,YAAoB,SAAsB;AACnD,UAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,QAAI,UAAU;AACZ,eAAS,SAAS,KAAK,OAAO;AAAA,IAChC;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,YAAoB;AAChC,UAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,QAAI,UAAU;AACZ,eAAS,WAAW,CAAC;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,iBAAiB;AACf,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AACF;AAGO,IAAM,kBAAkB,IAAI,gBAAgB;AAG5C,IAAM,qBAAqB,MAAM;AACtC,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,9 +1,4 @@
1
1
  import React from "react";
2
- import type { IMessage, FunctionCall } from "../../../../types";
3
- export interface FunctionCallRenderProps {
4
- msg: IMessage;
5
- showDetail?: boolean;
6
- onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;
7
- }
2
+ import type { FunctionCallRenderProps } from "../../../../types";
8
3
  declare const FunctionCallRender: React.FC<FunctionCallRenderProps>;
9
4
  export default FunctionCallRender;
@@ -2,27 +2,41 @@ import React from "react";
2
2
  import { Alert, Button, Flex, Form, Popover, Tooltip, Typography } from "antd";
3
3
  import { CopyOutlined, ToolOutlined, CheckCircleTwoTone, LoadingOutlined, UserSwitchOutlined, InfoCircleOutlined } from "@ant-design/icons";
4
4
  import { useStyles } from "./styles";
5
+ import { defaultToolKindResolver } from "../../../../types/FunctionCallRender";
5
6
  import JsonView from "../../../XAiJsonView";
7
+ import { Fragment as _Fragment } from "react/jsx-runtime";
6
8
  import { jsx as _jsx } from "react/jsx-runtime";
7
9
  import { jsxs as _jsxs } from "react/jsx-runtime";
8
10
  var FunctionCallRender = function FunctionCallRender(_ref) {
9
11
  var _msg$functionResponse;
10
12
  var msg = _ref.msg,
11
13
  showDetail = _ref.showDetail,
12
- onConfirm = _ref.onConfirm;
14
+ onConfirm = _ref.onConfirm,
15
+ kindProp = _ref.kind,
16
+ _ref$toolKindResolver = _ref.toolKindResolver,
17
+ toolKindResolver = _ref$toolKindResolver === void 0 ? defaultToolKindResolver : _ref$toolKindResolver,
18
+ renderApproval = _ref.renderApproval,
19
+ renderHandoff = _ref.renderHandoff;
13
20
  var styles = useStyles();
14
21
  var fnCall = msg.functionCall;
15
22
  var fnRes = msg.functionResponse;
16
23
  var name = (fnCall === null || fnCall === void 0 ? void 0 : fnCall.name) || (fnRes === null || fnRes === void 0 ? void 0 : fnRes.name);
17
- if (name === "adk_request_confirmation") {
24
+ var kind = kindProp !== null && kindProp !== void 0 ? kindProp : toolKindResolver(name);
25
+ if (kind === "approval") {
18
26
  var _msg$functionCall;
27
+ if (renderApproval) {
28
+ var custom = renderApproval(msg, onConfirm);
29
+ if (custom !== null && custom !== undefined) return /*#__PURE__*/_jsx(_Fragment, {
30
+ children: custom
31
+ });
32
+ }
19
33
  if (fnRes) {
20
34
  var _fnRes$response;
21
35
  if (msg.role === "bot") return null;
22
- var _confirmed = (_fnRes$response = fnRes.response) === null || _fnRes$response === void 0 ? void 0 : _fnRes$response.confirmed;
36
+ var confirmed = (_fnRes$response = fnRes.response) === null || _fnRes$response === void 0 ? void 0 : _fnRes$response.confirmed;
23
37
  return /*#__PURE__*/_jsx("div", {
24
38
  className: styles.wrapper,
25
- children: _confirmed ? /*#__PURE__*/_jsx(Alert, {
39
+ children: confirmed ? /*#__PURE__*/_jsx(Alert, {
26
40
  message: "\u5DF2\u786E\u8BA4",
27
41
  type: "success",
28
42
  showIcon: true,
@@ -68,8 +82,14 @@ var FunctionCallRender = function FunctionCallRender(_ref) {
68
82
  })
69
83
  }, msg.id);
70
84
  }
71
- if (name === "transferToAgent") {
85
+ if (kind === "handoff") {
72
86
  var _fnCall$args;
87
+ if (renderHandoff) {
88
+ var _custom = renderHandoff(msg);
89
+ if (_custom !== null && _custom !== undefined) return /*#__PURE__*/_jsx(_Fragment, {
90
+ children: _custom
91
+ });
92
+ }
73
93
  var agentName = fnCall === null || fnCall === void 0 || (_fnCall$args = fnCall.args) === null || _fnCall$args === void 0 ? void 0 : _fnCall$args.agentName;
74
94
  return /*#__PURE__*/_jsx("div", {
75
95
  className: styles.wrapper,
@@ -1 +1 @@
1
- {"version":3,"names":["React","Alert","Button","Flex","Form","Popover","Tooltip","Typography","CopyOutlined","ToolOutlined","CheckCircleTwoTone","LoadingOutlined","UserSwitchOutlined","InfoCircleOutlined","useStyles","JsonView","jsx","_jsx","jsxs","_jsxs","FunctionCallRender","_ref","_msg$functionResponse","msg","showDetail","onConfirm","styles","fnCall","functionCall","fnRes","functionResponse","name","_msg$functionCall","_fnRes$response","role","confirmed","response","className","wrapper","children","message","type","showIcon","alert","id","originalFn","args","originalFunctionCall","style","justifyContent","confirm","confirmText","justify","gap","size","onClick","_fnCall$args","agentName","color","Text","ellipsis","tooltip","maxWidth","lineHeight","twoToneColor","renderItem","obj","text","str","JSON","stringify","Item","label","align","copyable","icon","marginBottom","value","renderResponse","res","_res$response","error","title","placement","content","width","layout"],"sources":["../../../../../../src/components/XAdkChatbot/components/FunctionCallRender/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert, Button, Flex, Form, Popover, Tooltip, Typography } from \"antd\";\nimport {\n CopyOutlined,\n ToolOutlined,\n CheckCircleTwoTone,\n LoadingOutlined,\n UserSwitchOutlined,\n InfoCircleOutlined,\n} from \"@ant-design/icons\";\nimport type { IMessage, FunctionCall } from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport JsonView from \"@/components/XAiJsonView\";\n\nexport interface FunctionCallRenderProps {\n msg: IMessage;\n showDetail?: boolean;\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n}\n\nconst FunctionCallRender: React.FC<FunctionCallRenderProps> = ({\n msg,\n showDetail,\n onConfirm,\n}) => {\n const styles = useStyles();\n const fnCall = msg.functionCall as FunctionCall;\n const fnRes = msg.functionResponse;\n const name = fnCall?.name || fnRes?.name;\n if (name === \"adk_request_confirmation\") {\n if (fnRes) {\n if (msg.role === \"bot\") return null;\n const confirmed = fnRes.response?.confirmed;\n return (\n <div key={msg.id} className={styles.wrapper}>\n {confirmed ? (\n <Alert\n message=\"已确认\"\n type=\"success\"\n showIcon\n className={styles.alert}\n />\n ) : (\n <Alert\n message=\"已取消\"\n type=\"error\"\n showIcon\n className={styles.alert}\n />\n )}\n </div>\n );\n }\n const originalFn = msg?.functionCall?.args?.originalFunctionCall;\n return (\n <div\n key={msg.id}\n className={styles.wrapper}\n style={{ justifyContent: \"flex-end\" }}\n >\n <div className={styles.confirm}>\n <div className={styles.confirmText}>\n 请确认是否执行工具:{originalFn?.name}\n </div>\n <Flex justify=\"end\" gap={8}>\n <Button\n type=\"default\"\n size=\"small\"\n onClick={() => onConfirm?.(fnCall, false)}\n >\n 取消\n </Button>\n <Button\n type=\"primary\"\n size=\"small\"\n onClick={() => onConfirm?.(fnCall, true)}\n >\n 确认\n </Button>\n </Flex>\n </div>\n </div>\n );\n }\n if (name === \"transferToAgent\") {\n const agentName = fnCall?.args?.agentName;\n return (\n <div key={msg.id} className={styles.wrapper}>\n <div className={styles.fnCall}>\n <UserSwitchOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: agentName }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 任务转交:{agentName}\n </Typography.Text>\n {msg.functionResponse ? (\n <CheckCircleTwoTone twoToneColor=\"#52c41a\" />\n ) : (\n <LoadingOutlined />\n )}\n </div>\n </div>\n );\n }\n const renderItem = (obj: any, text: string) => {\n const str = JSON.stringify(obj, null, 2);\n return (\n <Form.Item\n label={\n <Flex align=\"center\">\n <span className=\"mr-2\">{text}</span>\n <Typography.Text\n copyable={{\n text: str,\n icon: <CopyOutlined />,\n }}\n />\n </Flex>\n }\n style={{ marginBottom: 12 }}\n >\n <JsonView value={str} />\n </Form.Item>\n );\n };\n const renderResponse = () => {\n const res = msg.functionResponse;\n if (res) {\n if (res.response?.error) {\n return (\n <Tooltip title={res.response.error}>\n <InfoCircleOutlined style={{ color: \"#faad14\" }} />\n </Tooltip>\n );\n }\n return <CheckCircleTwoTone twoToneColor=\"#52c41a\" />;\n }\n return <LoadingOutlined />;\n };\n return (\n <div key={msg.id} className={styles.wrapper}>\n {showDetail ? (\n <Popover\n placement=\"left\"\n content={\n <Form style={{ width: 400 }} layout=\"vertical\">\n {renderItem(fnCall?.args, \"工具参数\")}\n {renderItem(msg.functionResponse?.response, \"工具响应\")}\n </Form>\n }\n >\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n </Popover>\n ) : (\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n )}\n </div>\n );\n};\n\nexport default FunctionCallRender;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","Alert","Button","Flex","Form","Popover","Tooltip","Typography","CopyOutlined","ToolOutlined","CheckCircleTwoTone","LoadingOutlined","UserSwitchOutlined","InfoCircleOutlined","useStyles","defaultToolKindResolver","JsonView","Fragment","_Fragment","jsx","_jsx","jsxs","_jsxs","FunctionCallRender","_ref","_msg$functionResponse","msg","showDetail","onConfirm","kindProp","kind","_ref$toolKindResolver","toolKindResolver","renderApproval","renderHandoff","styles","fnCall","functionCall","fnRes","functionResponse","name","_msg$functionCall","custom","undefined","children","_fnRes$response","role","confirmed","response","className","wrapper","message","type","showIcon","alert","id","originalFn","args","originalFunctionCall","style","justifyContent","confirm","confirmText","justify","gap","size","onClick","_fnCall$args","agentName","color","Text","ellipsis","tooltip","maxWidth","lineHeight","twoToneColor","renderItem","obj","text","str","JSON","stringify","Item","label","align","copyable","icon","marginBottom","value","renderResponse","res","_res$response","error","title","placement","content","width","layout"],"sources":["../../../../../../src/components/XAdkChatbot/components/FunctionCallRender/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert, Button, Flex, Form, Popover, Tooltip, Typography } from \"antd\";\nimport {\n CopyOutlined,\n ToolOutlined,\n CheckCircleTwoTone,\n LoadingOutlined,\n UserSwitchOutlined,\n InfoCircleOutlined,\n} from \"@ant-design/icons\";\nimport type { FunctionCallRenderProps, FunctionCall } from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\nimport JsonView from \"@/components/XAiJsonView\";\n\nconst FunctionCallRender: React.FC<FunctionCallRenderProps> = ({\n msg,\n showDetail,\n onConfirm,\n kind: kindProp,\n toolKindResolver = defaultToolKindResolver,\n renderApproval,\n renderHandoff,\n}) => {\n const styles = useStyles();\n const fnCall = msg.functionCall as FunctionCall;\n const fnRes = msg.functionResponse;\n const name = fnCall?.name || fnRes?.name;\n const kind = kindProp ?? toolKindResolver(name);\n\n if (kind === \"approval\") {\n if (renderApproval) {\n const custom = renderApproval(msg, onConfirm);\n if (custom !== null && custom !== undefined) return <>{custom}</>;\n }\n if (fnRes) {\n if (msg.role === \"bot\") return null;\n const confirmed = fnRes.response?.confirmed;\n return (\n <div key={msg.id} className={styles.wrapper}>\n {confirmed ? (\n <Alert\n message=\"已确认\"\n type=\"success\"\n showIcon\n className={styles.alert}\n />\n ) : (\n <Alert\n message=\"已取消\"\n type=\"error\"\n showIcon\n className={styles.alert}\n />\n )}\n </div>\n );\n }\n const originalFn = msg?.functionCall?.args?.originalFunctionCall;\n return (\n <div\n key={msg.id}\n className={styles.wrapper}\n style={{ justifyContent: \"flex-end\" }}\n >\n <div className={styles.confirm}>\n <div className={styles.confirmText}>\n 请确认是否执行工具:{originalFn?.name}\n </div>\n <Flex justify=\"end\" gap={8}>\n <Button\n type=\"default\"\n size=\"small\"\n onClick={() => onConfirm?.(fnCall, false)}\n >\n 取消\n </Button>\n <Button\n type=\"primary\"\n size=\"small\"\n onClick={() => onConfirm?.(fnCall, true)}\n >\n 确认\n </Button>\n </Flex>\n </div>\n </div>\n );\n }\n if (kind === \"handoff\") {\n if (renderHandoff) {\n const custom = renderHandoff(msg);\n if (custom !== null && custom !== undefined) return <>{custom}</>;\n }\n const agentName = fnCall?.args?.agentName;\n return (\n <div key={msg.id} className={styles.wrapper}>\n <div className={styles.fnCall}>\n <UserSwitchOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: agentName }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 任务转交:{agentName}\n </Typography.Text>\n {msg.functionResponse ? (\n <CheckCircleTwoTone twoToneColor=\"#52c41a\" />\n ) : (\n <LoadingOutlined />\n )}\n </div>\n </div>\n );\n }\n const renderItem = (obj: any, text: string) => {\n const str = JSON.stringify(obj, null, 2);\n return (\n <Form.Item\n label={\n <Flex align=\"center\">\n <span className=\"mr-2\">{text}</span>\n <Typography.Text\n copyable={{\n text: str,\n icon: <CopyOutlined />,\n }}\n />\n </Flex>\n }\n style={{ marginBottom: 12 }}\n >\n <JsonView value={str} />\n </Form.Item>\n );\n };\n const renderResponse = () => {\n const res = msg.functionResponse;\n if (res) {\n if (res.response?.error) {\n return (\n <Tooltip title={res.response.error}>\n <InfoCircleOutlined style={{ color: \"#faad14\" }} />\n </Tooltip>\n );\n }\n return <CheckCircleTwoTone twoToneColor=\"#52c41a\" />;\n }\n return <LoadingOutlined />;\n };\n return (\n <div key={msg.id} className={styles.wrapper}>\n {showDetail ? (\n <Popover\n placement=\"left\"\n content={\n <Form style={{ width: 400 }} layout=\"vertical\">\n {renderItem(fnCall?.args, \"工具参数\")}\n {renderItem(msg.functionResponse?.response, \"工具响应\")}\n </Form>\n }\n >\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n </Popover>\n ) : (\n <div className={styles.fnCall}>\n <ToolOutlined style={{ color: \"#888\" }} />\n <Typography.Text\n ellipsis={{ tooltip: name }}\n style={{ maxWidth: 300, lineHeight: \"16px\" }}\n >\n 调用工具:{name}\n </Typography.Text>\n {renderResponse()}\n </div>\n )}\n </div>\n );\n};\n\nexport default FunctionCallRender;\n"],"mappings":"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"}
@@ -11,6 +11,8 @@ import FunctionCallRender from "./components/FunctionCallRender";
11
11
  import FileGallery from "../FileGallery";
12
12
  import XAdkThoughtChain from "../XAdkThoughtChain";
13
13
  import { parseAgentMessage } from "../../utils";
14
+ import { mergeChatStrategies } from "../../presets/xGroupAdk";
15
+ import { defaultToolKindResolver } from "../../types/FunctionCallRender";
14
16
  import { jsx as _jsx } from "react/jsx-runtime";
15
17
  import { jsxs as _jsxs } from "react/jsx-runtime";
16
18
  import { Fragment as _Fragment } from "react/jsx-runtime";
@@ -27,6 +29,7 @@ var scrollThreshold = 10;
27
29
  * - ✅ 欢迎页面 (agentName/agentIcon/description)
28
30
  */
29
31
  var XAdkChatbot = function XAdkChatbot(_ref) {
32
+ var _mergedStrategies$par;
30
33
  var _ref$loading = _ref.loading,
31
34
  loading = _ref$loading === void 0 ? false : _ref$loading,
32
35
  prologue = _ref.prologue,
@@ -51,13 +54,28 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
51
54
  parseOptions = _ref.parseOptions,
52
55
  _ref$initialized = _ref.initialized,
53
56
  initialized = _ref$initialized === void 0 ? false : _ref$initialized,
54
- onFileClick = _ref.onFileClick;
57
+ onFileClick = _ref.onFileClick,
58
+ renderFunctionCall = _ref.renderFunctionCall,
59
+ toolKindResolver = _ref.toolKindResolver,
60
+ strategies = _ref.strategies,
61
+ preset = _ref.preset;
55
62
  var styles = useStyles();
56
63
  var listRef = useRef(null);
57
64
  var lastScrollTopRef = useRef(0);
58
65
  var userHasScrolledRef = useRef(false);
59
66
  var messagesEndRef = useRef(null);
60
67
  var prevInitializedRef = useRef(false);
68
+ var mergedStrategies = useMemo(function () {
69
+ return mergeChatStrategies(preset, strategies);
70
+ }, [preset, strategies]);
71
+ var resolveToolKind = useCallback(function (name, msg) {
72
+ var _ref2, _toolKindResolver, _mergedStrategies$res;
73
+ return (_ref2 = (_toolKindResolver = toolKindResolver === null || toolKindResolver === void 0 ? void 0 : toolKindResolver(name)) !== null && _toolKindResolver !== void 0 ? _toolKindResolver : (_mergedStrategies$res = mergedStrategies.resolveToolKind) === null || _mergedStrategies$res === void 0 ? void 0 : _mergedStrategies$res.call(mergedStrategies, {
74
+ name: name,
75
+ msg: msg
76
+ })) !== null && _ref2 !== void 0 ? _ref2 : defaultToolKindResolver(name);
77
+ }, [toolKindResolver, mergedStrategies]);
78
+ var parseProcessMessage = (_mergedStrategies$par = mergedStrategies.parseProcessMessage) !== null && _mergedStrategies$par !== void 0 ? _mergedStrategies$par : parseAgentMessage;
61
79
 
62
80
  // 初始化完成时滚动到底部
63
81
  useEffect(function () {
@@ -165,7 +183,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
165
183
  }, [messages, enableGrouping]);
166
184
 
167
185
  // ========== 渲染 Bot 消息组 ==========
168
- var renderBotGroup = useCallback(function (group, isLastGroup) {
186
+ var renderBotGroup = useCallback(function (group, isLastGroup, renderFunctionCall) {
169
187
  var msgs = group.msgs,
170
188
  allFiles = group.allFiles;
171
189
  if (!enableProcessParsing) {
@@ -180,10 +198,14 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
180
198
  }, "".concat(msg.id, "-").concat(i));
181
199
  }
182
200
  if (msg.functionCall) {
183
- return /*#__PURE__*/_jsx(FunctionCallRender, {
201
+ var _renderFunctionCall, _msg$functionCall;
202
+ return (_renderFunctionCall = renderFunctionCall === null || renderFunctionCall === void 0 ? void 0 : renderFunctionCall(msg)) !== null && _renderFunctionCall !== void 0 ? _renderFunctionCall : /*#__PURE__*/_jsx(FunctionCallRender, {
184
203
  msg: msg,
185
204
  showDetail: showFnCallDetail,
186
- onConfirm: onConfirm
205
+ onConfirm: onConfirm,
206
+ kind: resolveToolKind((_msg$functionCall = msg.functionCall) === null || _msg$functionCall === void 0 ? void 0 : _msg$functionCall.name, msg),
207
+ renderApproval: mergedStrategies.renderApproval,
208
+ renderHandoff: mergedStrategies.renderHandoff
187
209
  }, "".concat(msg.id, "-").concat(i));
188
210
  }
189
211
  return null;
@@ -255,7 +277,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
255
277
  }
256
278
  // 处理文本消息
257
279
  else if (msg.text && !msg.functionResponse) {
258
- var parts = parseAgentMessage(msg.text, parseOptions);
280
+ var parts = parseProcessMessage(msg.text, parseOptions);
259
281
  parts.forEach(function (part, partIdx) {
260
282
  // process 内容放入 currentProcessItems
261
283
  if (["planning", "replanning", "reasoning", "action_log", "process_text"].includes(part.type)) {
@@ -320,7 +342,12 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
320
342
  items: node.items,
321
343
  showFnCallDetail: showFnCallDetail,
322
344
  onConfirm: onConfirm,
323
- defaultOpen: isGroupLoading
345
+ defaultOpen: isGroupLoading,
346
+ renderFunctionCall: renderFunctionCall,
347
+ toolKindResolver: function toolKindResolver(name) {
348
+ return resolveToolKind(name);
349
+ },
350
+ strategies: mergedStrategies
324
351
  }, node.key);
325
352
  }
326
353
 
@@ -390,7 +417,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
390
417
  })
391
418
  }))]
392
419
  }, group.id);
393
- }, [enableProcessParsing, parseOptions, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, onFileClick, styles]);
420
+ }, [enableProcessParsing, parseOptions, parseProcessMessage, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, onFileClick, styles, resolveToolKind, mergedStrategies]);
394
421
 
395
422
  // ========== 渲染用户消息组 ==========
396
423
  var renderUserGroup = useCallback(function (group) {
@@ -493,7 +520,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
493
520
  onFileClick: onFileClick
494
521
  })
495
522
  }), chatGroups.map(function (group, idx) {
496
- return group.role === "user" ? renderUserGroup(group) : renderBotGroup(group, idx === chatGroups.length - 1);
523
+ return group.role === "user" ? renderUserGroup(group) : renderBotGroup(group, idx === chatGroups.length - 1, renderFunctionCall);
497
524
  }), renderSuggestions(), /*#__PURE__*/_jsx("div", {
498
525
  ref: messagesEndRef
499
526
  })]
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","CheckCircleFilled","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAdkThoughtChain","parseAgentMessage","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","scrollThreshold","XAdkChatbot","_ref","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","_ref$initialized","initialized","onFileClick","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","prevInitializedRef","length","current","timer","setTimeout","_messagesEndRef$curre","scrollIntoView","behavior","clearTimeout","_messagesEndRef$curre2","handleScroll","el","currentTop","scrollTop","isAtBottom","Math","abs","scrollHeight","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","msg","_msg$isLike","id","role","msgs","invocationId","allFiles","fileData","isLike","groups","forEach","isRealUserQuery","functionResponse","functionCall","lastGroup","isLastGroupAgent","push","_msg$isLike2","concat","g","reduce","acc","m","_toConsumableArray","renderBotGroup","group","isLastGroup","botMsg","children","i","text","showDetail","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","name","args","nodes","currentProcessItems","processedToolIds","Set","flushProcessItems","type","items","key","mergedMsg","content","add","parts","part","partIdx","includes","titleMap","planning","replanning","reasoning","action_log","process_text","title","trim","lastNode","fullTextToCopy","filter","join","lastBotMsg","hasProcess","some","n","isGroupLoading","node","idx","defaultOpen","showBadge","findIndex","successBadge","fileSection","fileHeader","display","flexWrap","gap","file","index","onClick","isLastBotMsg","metaFooter","actionIcons","success","timestamp","renderUserGroup","userMsg","userContainer","align","marginBottom","card","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","wrapper","list","ref"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAdkThoughtChain from \"@/components/XAdkThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n onFileClick,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender\n key={`${msg.id}-${i}`}\n text={msg.text}\n onFileClick={onFileClick}\n />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} onFileClick={onFileClick} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} onClick={onFileClick} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n onFileClick,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","CheckCircleFilled","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAdkThoughtChain","parseAgentMessage","mergeChatStrategies","defaultToolKindResolver","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","scrollThreshold","XAdkChatbot","_ref","_mergedStrategies$par","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","_ref$initialized","initialized","onFileClick","renderFunctionCall","toolKindResolver","strategies","preset","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","prevInitializedRef","mergedStrategies","resolveToolKind","name","msg","_ref2","_toolKindResolver","_mergedStrategies$res","call","parseProcessMessage","length","current","timer","setTimeout","_messagesEndRef$curre","scrollIntoView","behavior","clearTimeout","_messagesEndRef$curre2","handleScroll","el","currentTop","scrollTop","isAtBottom","Math","abs","scrollHeight","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","_msg$isLike","id","role","msgs","invocationId","allFiles","fileData","isLike","groups","forEach","isRealUserQuery","functionResponse","functionCall","lastGroup","isLastGroupAgent","push","_msg$isLike2","concat","g","reduce","acc","m","_toConsumableArray","renderBotGroup","group","isLastGroup","botMsg","children","i","text","_renderFunctionCall","_msg$functionCall","showDetail","kind","renderApproval","renderHandoff","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","args","nodes","currentProcessItems","processedToolIds","Set","flushProcessItems","type","items","key","mergedMsg","content","add","parts","part","partIdx","includes","titleMap","planning","replanning","reasoning","action_log","process_text","title","trim","lastNode","fullTextToCopy","filter","join","lastBotMsg","hasProcess","some","n","isGroupLoading","node","idx","defaultOpen","showBadge","findIndex","successBadge","fileSection","fileHeader","display","flexWrap","gap","file","index","onClick","isLastBotMsg","metaFooter","actionIcons","success","timestamp","renderUserGroup","userMsg","userContainer","align","marginBottom","card","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","wrapper","list","ref"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAdkThoughtChain from \"@/components/XAdkThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport { mergeChatStrategies } from \"@/presets/xGroupAdk\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n onFileClick,\n renderFunctionCall,\n toolKindResolver,\n strategies,\n preset,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n const mergedStrategies = useMemo(\n () => mergeChatStrategies(preset, strategies),\n [preset, strategies],\n );\n const resolveToolKind = useCallback(\n (name?: string, msg?: IMessage) =>\n toolKindResolver?.(name) ??\n mergedStrategies.resolveToolKind?.({ name, msg }) ??\n defaultToolKindResolver(name),\n [toolKindResolver, mergedStrategies],\n );\n const parseProcessMessage =\n mergedStrategies.parseProcessMessage ?? parseAgentMessage;\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean, renderFunctionCall?: XAdkChatbotProps[\"renderFunctionCall\"]) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender\n key={`${msg.id}-${i}`}\n text={msg.text}\n onFileClick={onFileClick}\n />\n );\n }\n if (msg.functionCall) {\n return (\n renderFunctionCall?.(msg) ?? (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n kind={resolveToolKind(msg.functionCall?.name, msg)}\n renderApproval={mergedStrategies.renderApproval}\n renderHandoff={mergedStrategies.renderHandoff}\n />\n )\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseProcessMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n renderFunctionCall={renderFunctionCall}\n toolKindResolver={(name) => resolveToolKind(name)}\n strategies={mergedStrategies}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} onFileClick={onFileClick} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} onClick={onFileClick} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n parseProcessMessage,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n onFileClick,\n styles,\n resolveToolKind,\n mergedStrategies,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1, renderFunctionCall),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],"mappings":"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"}