@ai-group/chat-sdk 0.4.2 → 0.5.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 (54) hide show
  1. package/dist/cjs/components/XAiChatbot/styles.js +1 -0
  2. package/dist/cjs/components/XAiChatbot/styles.js.map +2 -2
  3. package/dist/cjs/components/XAiConversations/XAiConversations.stories.js +1 -1
  4. package/dist/cjs/components/XAiConversations/XAiConversations.stories.js.map +2 -2
  5. package/dist/cjs/components/XAiConversations/index.js +41 -15
  6. package/dist/cjs/components/XAiConversations/index.js.map +3 -3
  7. package/dist/cjs/components/XAiProvider/XAiProvider.stories.d.ts +2 -1
  8. package/dist/cjs/components/XAiProvider/XAiProvider.stories.js +88 -34
  9. package/dist/cjs/components/XAiProvider/XAiProvider.stories.js.map +3 -3
  10. package/dist/cjs/components/XAiProvider/index.js +31 -5
  11. package/dist/cjs/components/XAiProvider/index.js.map +2 -2
  12. package/dist/cjs/context/AiProviderContext.d.ts +4 -2
  13. package/dist/cjs/context/AiProviderContext.js.map +2 -2
  14. package/dist/cjs/hooks/useAgentGenerator.d.ts +14 -5
  15. package/dist/cjs/hooks/useAgentGenerator.js +144 -65
  16. package/dist/cjs/hooks/useAgentGenerator.js.map +3 -3
  17. package/dist/cjs/types/XAiChatbot.d.ts +2 -0
  18. package/dist/cjs/types/XAiChatbot.js.map +1 -1
  19. package/dist/cjs/types/XAiConversations.d.ts +14 -2
  20. package/dist/cjs/types/XAiConversations.js.map +1 -1
  21. package/dist/cjs/types/XAiProvider.d.ts +257 -13
  22. package/dist/cjs/types/XAiProvider.js.map +2 -2
  23. package/dist/cjs/utils/umdEntry.d.ts +3 -1
  24. package/dist/cjs/utils/umdEntry.js +5 -2
  25. package/dist/cjs/utils/umdEntry.js.map +3 -3
  26. package/dist/esm/components/XAiChatbot/styles.js +1 -1
  27. package/dist/esm/components/XAiChatbot/styles.js.map +1 -1
  28. package/dist/esm/components/XAiConversations/XAiConversations.stories.js +1 -1
  29. package/dist/esm/components/XAiConversations/XAiConversations.stories.js.map +1 -1
  30. package/dist/esm/components/XAiConversations/index.js +56 -14
  31. package/dist/esm/components/XAiConversations/index.js.map +1 -1
  32. package/dist/esm/components/XAiProvider/XAiProvider.stories.d.ts +2 -1
  33. package/dist/esm/components/XAiProvider/XAiProvider.stories.js +105 -28
  34. package/dist/esm/components/XAiProvider/XAiProvider.stories.js.map +1 -1
  35. package/dist/esm/components/XAiProvider/index.js +31 -8
  36. package/dist/esm/components/XAiProvider/index.js.map +1 -1
  37. package/dist/esm/context/AiProviderContext.d.ts +4 -2
  38. package/dist/esm/context/AiProviderContext.js +1 -0
  39. package/dist/esm/context/AiProviderContext.js.map +1 -1
  40. package/dist/esm/hooks/useAgentGenerator.d.ts +14 -5
  41. package/dist/esm/hooks/useAgentGenerator.js +272 -113
  42. package/dist/esm/hooks/useAgentGenerator.js.map +1 -1
  43. package/dist/esm/types/XAiChatbot.d.ts +2 -0
  44. package/dist/esm/types/XAiChatbot.js.map +1 -1
  45. package/dist/esm/types/XAiConversations.d.ts +14 -2
  46. package/dist/esm/types/XAiConversations.js.map +1 -1
  47. package/dist/esm/types/XAiProvider.d.ts +257 -13
  48. package/dist/esm/types/XAiProvider.js +81 -1
  49. package/dist/esm/types/XAiProvider.js.map +1 -1
  50. package/dist/esm/utils/umdEntry.d.ts +3 -1
  51. package/dist/esm/utils/umdEntry.js +29 -22
  52. package/dist/esm/utils/umdEntry.js.map +1 -1
  53. package/dist/umd/chat-sdk.min.js +1 -1
  54. package/package.json +2 -1
@@ -118,6 +118,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
118
118
  emptyImg: import_css.css`
119
119
  width: 60px;
120
120
  height: 60px;
121
+ border-radius: 8px;
121
122
  margin-bottom: 16px;
122
123
  `,
123
124
  message: import_css.css`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiChatbot/styles.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport { css } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles } from '@/styles/common';\n\nconst primaryBlue = '#0078FF'; // 主蓝色\nconst lightBlue = '#E6F0FF'; // 浅蓝色气泡背景\nconst darkGray = '#333'; // 深灰色文本\nconst lightGray = '#888'; // 浅灰文本\nconst borderGray = '#ddd'; // 边框灰色\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n wrapper: css`\n display: flex;\n flex-direction: column;\n // max-height: 812px;\n min-height: 300px;\n width: 100%;\n height: 100%;\n min-width: 375px;\n // background-color: #fff;\n // border: 1px solid rgba(80,96,122,.15);\n border-radius: 12px;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n `,\n\n navbar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px 16px;\n border-bottom: 1px solid ${borderGray};\n // background-color: #fff;\n `,\n\n userAvatar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n width: 32px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n `,\n\n avatar: css`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n border: 1px solid ${borderGray};\n `,\n\n title: css`\n font-weight: 600;\n font-size: 16px;\n color: ${darkGray};\n `,\n\n subtitle: css`\n font-size: 12px;\n color: ${lightGray};\n margin-top: 2px;\n `,\n\n messageContainer: css`\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n // background-color: #fff;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n position: relative;\n `,\n\n emptyWrapper: css`\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: '#222';\n userSelect: none;\n `,\n\n emptyImg: css`\n width: 60px;\n height: 60px;\n margin-bottom: 16px;\n `,\n\n message: css`\n max-width: 70%;\n padding: 10px 14px;\n border-radius: 20px;\n background-color: ${lightBlue};\n color: ${darkGray};\n font-size: 14px;\n line-height: 1.4;\n word-break: break-word;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n `,\n\n messageRight: css`\n align-self: flex-end;\n background-color: ${primaryBlue};\n color: white;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 20px;\n border-top-left-radius: 20px;\n border-top-right-radius: 20px;\n `,\n\n quickReplies: css`\n display: flex;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n overflow-x: auto;\n `,\n\n replyItem: css`\n padding: 6px 12px;\n font-size: 13px;\n border: 1px solid ${primaryBlue};\n border-radius: 20px;\n background-color: #fff;\n color: ${primaryBlue};\n cursor: pointer;\n white-space: nowrap;\n user-select: none;\n transition: all 0.2s ease;\n \n &:hover {\n background-color: ${primaryBlue};\n color: #fff;\n }\n `,\n\n highlight: css`\n background-color: ${primaryBlue};\n color: white;\n border-color: ${primaryBlue};\n `,\n\n inputBar: css`\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n `,\n\n input: css`\n flex: 1;\n padding: 8px 12px;\n border: 1px solid ${borderGray};\n border-radius: 20px;\n font-size: 14px;\n outline: none;\n \n &:focus {\n border-color: ${primaryBlue};\n box-shadow: 0 0 3px ${primaryBlue};\n }\n `,\n\n sendWrapper: css`\n flex: 1;\n border-radius: 26px;\n `,\n\n stopButton: css`\n width: 23px !important;\n height: 23px !important;\n padding: 0 !important;\n min-width: 23px !important;\n min-height: 23px !important;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n\n sendButton: css`\n width: 23px !important;\n height: 23px !important;\n padding: 0 !important;\n min-width: 23px !important;\n min-height: 23px !important;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${primaryBlue};\n border: none;\n border-radius: 20px;\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: background-color 0.2s ease;\n box-sizing: border-box;\n &:hover {\n background-color: #005ecb;\n }\n &:disabled {\n background-color: ${lightBlue};\n cursor: not-allowed;\n }\n `,\n\n uploadBtn: css`\n margin-left: 8px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background-color: ${primaryBlue};\n color: white;\n font-weight: 700;\n font-size: 22px;\n line-height: 32px;\n text-align: center;\n cursor: pointer;\n border: none;\n user-select: none;\n &:hover {\n background-color: #005ecb;\n }\n `,\n\n clearBtn: css`\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n border: 1px solid rgb(228, 231, 236);\n border-radius: 12px;\n width: 45px;\n height: 45px;\n box-sizing: border-box;\n `,\n\n chatFooter: css`\n gap: 8px;\n position: relatative;\n z-index: 10;\n padding: 0 20px 10px 20px;\n `,\n\n footerTips: css`\n display: flex;\n align-items:center;\n justify-content: center;\n font-size: 12px;\n color: rgba(0,0,0,0.4);\n `,\n\n flexCenterGap2: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n\n iconHuihuarenqun: css`\n font-family: \"iconfont\";\n font-size: 16px;\n font-weight: 300;\n padding: 3px;\n border-radius: 6px;\n color: #181B25;\n cursor: pointer;\n &:hover {\n background: #E1E4EA;\n color: #7F56D9;\n }\n `,\n\n popoverFooter: css`\n display: flex;\n gap: 8px;\n justify-content: end;\n `,\n\n divider: css`\n width: 1px;\n height: 15px;\n margin-left: 3px;\n margin-right: 3px;\n background: #D0D5DD;\n `,\n\n flexCenterGap4: css`\n display: flex;\n align-items: center;\n gap: 4px;\n color: #7F56D9;\n cursor: pointer;\n &:hover {\n opacity: 0.8;\n }\n `,\n\n iconZengjiaDisabled: css`\n font-family: \"iconfont\";\n font-size: 25px;\n font-weight: 300;\n color: #D0D5DD;\n cursor: not-allowed;\n `,\n\n iconZengjiaNormal: css`\n font-family: \"iconfont\";\n font-size: 25px;\n font-weight: 300;\n color: #98A2B3;\n cursor: pointer;\n &:hover {\n color: #7F56D9;\n }\n `,\n actionHeaderWrapper: css`\n margin-bottom: 12px;\n `,\n actionHeaderItem: css`\n display: flex;\n align-items: center;\n height: 40px;\n box-sizing: border-box;\n padding: 10px 16px;\n margin-bottom: 8px;\n background: #f7fafd;\n cursor: pointer;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.03);\n `,\n actionHeaderIcon: css`\n height: 14px;\n `,\n actionHeaderText: css`\n font-weight: 400;\n font-size: 14px;\n color: #3961F2;\n margin-left: 10px;\n margin-right: 6px;\n `,\n actionHeaderDetail: css`\n background: #F3F5FA;\n border-radius: 8px;\n overflow: hidden;\n `,\n actionDetailTitle: css`\n display: flex;\n align-items: center;\n padding: 0 16px;\n box-sizing: border-box;\n background: #EDEFF5;\n height: 32px;\n margin-bottom: 12px;\n cursor: pointer;\n `,\n actionHeaderDetailItem: css`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n padding: 0 16px;\n margin-bottom: 12px;\n color: #949494;\n `,\n actionHeaderCost: css`\n margin-left: auto;\n color: #888;\n font-size: 12px;\n min-width: 32px;\n text-align: right;\n `,\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-bubble-footer {\n display: flex;\n align-items: center;\n min-width: 0,\n max-width: 600,\n /* 你想覆盖的其他样式 */\n }\n\n .ant-sender-content {\n textarea {\n word-break: break-all;\n }\n }\n\n .ant-avatar {\n background-color: transparent;\n }\n\n .ant-sender-actions-list {\n margin-left: -40px;\n }\n\n .ant-sender {\n box-shadow: none !important;\n }\n\n .ant-prompts-item {\n padding-block: 8px !important;\n }\n\n /* 用户消息气泡背景色 */\n .ant-bubble .user-content {\n background-color: #D8E0FD;\n }\n\n /* 助手消息气泡背景色 */\n .ant-bubble .assistant-content {\n background-color: #F3F5FA;\n }\n `}\n />\n);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React from 'react';\nimport { css } from '@emotion/css';\nimport { css as globalCss, Global } from '@emotion/react';\nimport { withBasicStyles } from '@/styles/common';\n\nconst primaryBlue = '#0078FF'; // 主蓝色\nconst lightBlue = '#E6F0FF'; // 浅蓝色气泡背景\nconst darkGray = '#333'; // 深灰色文本\nconst lightGray = '#888'; // 浅灰文本\nconst borderGray = '#ddd'; // 边框灰色\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n wrapper: css`\n display: flex;\n flex-direction: column;\n // max-height: 812px;\n min-height: 300px;\n width: 100%;\n height: 100%;\n min-width: 375px;\n // background-color: #fff;\n // border: 1px solid rgba(80,96,122,.15);\n border-radius: 12px;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n `,\n\n navbar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px 16px;\n border-bottom: 1px solid ${borderGray};\n // background-color: #fff;\n `,\n\n userAvatar: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 32px;\n width: 32px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n `,\n\n avatar: css`\n width: 40px;\n height: 40px;\n border-radius: 50%;\n object-fit: cover;\n margin-right: 12px;\n border: 1px solid ${borderGray};\n `,\n\n title: css`\n font-weight: 600;\n font-size: 16px;\n color: ${darkGray};\n `,\n\n subtitle: css`\n font-size: 12px;\n color: ${lightGray};\n margin-top: 2px;\n `,\n\n messageContainer: css`\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n // background-color: #fff;\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-height: 0;\n position: relative;\n `,\n\n emptyWrapper: css`\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: '#222';\n userSelect: none;\n `,\n\n emptyImg: css`\n width: 60px;\n height: 60px;\n border-radius: 8px;\n margin-bottom: 16px;\n `,\n\n message: css`\n max-width: 70%;\n padding: 10px 14px;\n border-radius: 20px;\n background-color: ${lightBlue};\n color: ${darkGray};\n font-size: 14px;\n line-height: 1.4;\n word-break: break-word;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n `,\n\n messageRight: css`\n align-self: flex-end;\n background-color: ${primaryBlue};\n color: white;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 20px;\n border-top-left-radius: 20px;\n border-top-right-radius: 20px;\n `,\n\n quickReplies: css`\n display: flex;\n gap: 8px;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n overflow-x: auto;\n `,\n\n replyItem: css`\n padding: 6px 12px;\n font-size: 13px;\n border: 1px solid ${primaryBlue};\n border-radius: 20px;\n background-color: #fff;\n color: ${primaryBlue};\n cursor: pointer;\n white-space: nowrap;\n user-select: none;\n transition: all 0.2s ease;\n \n &:hover {\n background-color: ${primaryBlue};\n color: #fff;\n }\n `,\n\n highlight: css`\n background-color: ${primaryBlue};\n color: white;\n border-color: ${primaryBlue};\n `,\n\n inputBar: css`\n display: flex;\n align-items: center;\n padding: 10px 16px;\n border-top: 1px solid ${borderGray};\n background-color: #fff;\n `,\n\n input: css`\n flex: 1;\n padding: 8px 12px;\n border: 1px solid ${borderGray};\n border-radius: 20px;\n font-size: 14px;\n outline: none;\n \n &:focus {\n border-color: ${primaryBlue};\n box-shadow: 0 0 3px ${primaryBlue};\n }\n `,\n\n sendWrapper: css`\n flex: 1;\n border-radius: 26px;\n `,\n\n stopButton: css`\n width: 23px !important;\n height: 23px !important;\n padding: 0 !important;\n min-width: 23px !important;\n min-height: 23px !important;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n\n sendButton: css`\n width: 23px !important;\n height: 23px !important;\n padding: 0 !important;\n min-width: 23px !important;\n min-height: 23px !important;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${primaryBlue};\n border: none;\n border-radius: 20px;\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: background-color 0.2s ease;\n box-sizing: border-box;\n &:hover {\n background-color: #005ecb;\n }\n &:disabled {\n background-color: ${lightBlue};\n cursor: not-allowed;\n }\n `,\n\n uploadBtn: css`\n margin-left: 8px;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background-color: ${primaryBlue};\n color: white;\n font-weight: 700;\n font-size: 22px;\n line-height: 32px;\n text-align: center;\n cursor: pointer;\n border: none;\n user-select: none;\n &:hover {\n background-color: #005ecb;\n }\n `,\n\n clearBtn: css`\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n border: 1px solid rgb(228, 231, 236);\n border-radius: 12px;\n width: 45px;\n height: 45px;\n box-sizing: border-box;\n `,\n\n chatFooter: css`\n gap: 8px;\n position: relatative;\n z-index: 10;\n padding: 0 20px 10px 20px;\n `,\n\n footerTips: css`\n display: flex;\n align-items:center;\n justify-content: center;\n font-size: 12px;\n color: rgba(0,0,0,0.4);\n `,\n\n flexCenterGap2: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n\n iconHuihuarenqun: css`\n font-family: \"iconfont\";\n font-size: 16px;\n font-weight: 300;\n padding: 3px;\n border-radius: 6px;\n color: #181B25;\n cursor: pointer;\n &:hover {\n background: #E1E4EA;\n color: #7F56D9;\n }\n `,\n\n popoverFooter: css`\n display: flex;\n gap: 8px;\n justify-content: end;\n `,\n\n divider: css`\n width: 1px;\n height: 15px;\n margin-left: 3px;\n margin-right: 3px;\n background: #D0D5DD;\n `,\n\n flexCenterGap4: css`\n display: flex;\n align-items: center;\n gap: 4px;\n color: #7F56D9;\n cursor: pointer;\n &:hover {\n opacity: 0.8;\n }\n `,\n\n iconZengjiaDisabled: css`\n font-family: \"iconfont\";\n font-size: 25px;\n font-weight: 300;\n color: #D0D5DD;\n cursor: not-allowed;\n `,\n\n iconZengjiaNormal: css`\n font-family: \"iconfont\";\n font-size: 25px;\n font-weight: 300;\n color: #98A2B3;\n cursor: pointer;\n &:hover {\n color: #7F56D9;\n }\n `,\n actionHeaderWrapper: css`\n margin-bottom: 12px;\n `,\n actionHeaderItem: css`\n display: flex;\n align-items: center;\n height: 40px;\n box-sizing: border-box;\n padding: 10px 16px;\n margin-bottom: 8px;\n background: #f7fafd;\n cursor: pointer;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.03);\n `,\n actionHeaderIcon: css`\n height: 14px;\n `,\n actionHeaderText: css`\n font-weight: 400;\n font-size: 14px;\n color: #3961F2;\n margin-left: 10px;\n margin-right: 6px;\n `,\n actionHeaderDetail: css`\n background: #F3F5FA;\n border-radius: 8px;\n overflow: hidden;\n `,\n actionDetailTitle: css`\n display: flex;\n align-items: center;\n padding: 0 16px;\n box-sizing: border-box;\n background: #EDEFF5;\n height: 32px;\n margin-bottom: 12px;\n cursor: pointer;\n `,\n actionHeaderDetailItem: css`\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n padding: 0 16px;\n margin-bottom: 12px;\n color: #949494;\n `,\n actionHeaderCost: css`\n margin-left: auto;\n color: #888;\n font-size: 12px;\n min-width: 32px;\n text-align: right;\n `,\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-bubble-footer {\n display: flex;\n align-items: center;\n min-width: 0,\n max-width: 600,\n /* 你想覆盖的其他样式 */\n }\n\n .ant-sender-content {\n textarea {\n word-break: break-all;\n }\n }\n\n .ant-avatar {\n background-color: transparent;\n }\n\n .ant-sender-actions-list {\n margin-left: -40px;\n }\n\n .ant-sender {\n box-shadow: none !important;\n }\n\n .ant-prompts-item {\n padding-block: 8px !important;\n }\n\n /* 用户消息气泡背景色 */\n .ant-bubble .user-content {\n background-color: #D8E0FD;\n }\n\n /* 助手消息气泡背景色 */\n .ant-bubble .assistant-content {\n background-color: #F3F5FA;\n }\n `}\n />\n);\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_react", "React", "globalCss"]
7
7
  }
@@ -66,7 +66,7 @@ var BasicUsageStory = (args) => {
66
66
  /* @__PURE__ */ import_react.default.createElement(
67
67
  import__.default,
68
68
  {
69
- items
69
+ sessionList: items
70
70
  }
71
71
  )
72
72
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiConversations/XAiConversations.stories.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport type { ConversationsProps } from '@ant-design/x';\nimport { type GetProp } from 'antd';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport XAiConversations from '.';\n\nconst meta: Meta<typeof XAiConversations> = {\n title: 'AI组件/XAiConversations 对话记录管理',\n component: XAiConversations,\n parameters: {\n layout: 'centered',\n },\n tags: ['autodocs'],\n argTypes: {\n },\n};\n\nexport default meta;\n type Story = StoryObj<typeof meta>;\n\nconst BasicUsageStory = (args: any) => {\n const items: GetProp<ConversationsProps, 'items'> = Array.from({ length: 4 }).map((_, index) => ({\n key: `item${index + 1}`,\n label: `聊天记录 ${index + 1}`,\n disabled: index === 3,\n }));\n\n return (\n <div style={{\n backgroundColor: 'rgb(240, 242, 245)',\n minHeight: '300px',\n minWidth: '700px',\n display: 'flex',\n alignItems: 'center',\n paddingInline: '50px',\n }}\n >\n <XAiConversations\n items={items}\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {\n },\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAIlB,eAA6B;AAE7B,IAAM,OAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CACV;AACF;AAEA,IAAO,mCAAQ;AAGf,IAAM,kBAAkB,CAAC,SAAc;AACrC,QAAM,QAA8C,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,WAAW;AAAA,IAC/F,KAAK,OAAO,QAAQ;AAAA,IACpB,OAAO,QAAQ,QAAQ;AAAA,IACvB,UAAU,UAAU;AAAA,EACtB,EAAE;AAEF,SACE,6BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MAAI,OAAO;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA;AAAA,IAEE,6BAAAA,QAAA;AAAA,MAAC,SAAAD;AAAA,MAAA;AAAA,QACC;AAAA;AAAA,IACF;AAAA,EACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CACN;AACF;",
4
+ "sourcesContent": ["import React from 'react';\nimport type { ConversationsProps } from '@ant-design/x';\nimport { type GetProp } from 'antd';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport XAiConversations from '.';\n\nconst meta: Meta<typeof XAiConversations> = {\n title: 'AI组件/XAiConversations 对话记录管理',\n component: XAiConversations,\n parameters: {\n layout: 'centered',\n },\n tags: ['autodocs'],\n argTypes: {\n },\n};\n\nexport default meta;\n type Story = StoryObj<typeof meta>;\n\nconst BasicUsageStory = (args: any) => {\n const items: GetProp<ConversationsProps, 'items'> = Array.from({ length: 4 }).map((_, index) => ({\n key: `item${index + 1}`,\n label: `聊天记录 ${index + 1}`,\n disabled: index === 3,\n }));\n\n return (\n <div style={{\n backgroundColor: 'rgb(240, 242, 245)',\n minHeight: '300px',\n minWidth: '700px',\n display: 'flex',\n alignItems: 'center',\n paddingInline: '50px',\n }}\n >\n <XAiConversations\n sessionList={items}\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {\n },\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAIlB,eAA6B;AAE7B,IAAM,OAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CACV;AACF;AAEA,IAAO,mCAAQ;AAGf,IAAM,kBAAkB,CAAC,SAAc;AACrC,QAAM,QAA8C,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,WAAW;AAAA,IAC/F,KAAK,OAAO,QAAQ;AAAA,IACpB,OAAO,QAAQ,QAAQ;AAAA,IACvB,UAAU,UAAU;AAAA,EACtB,EAAE;AAEF,SACE,6BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MAAI,OAAO;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA;AAAA,IAEE,6BAAAA,QAAA;AAAA,MAAC,SAAAD;AAAA,MAAA;AAAA,QACC,aAAa;AAAA;AAAA,IACf;AAAA,EACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CACN;AACF;",
6
6
  "names": ["XAiConversations", "React"]
7
7
  }
@@ -34,26 +34,52 @@ __export(XAiConversations_exports, {
34
34
  module.exports = __toCommonJS(XAiConversations_exports);
35
35
  var import_react = __toESM(require("react"));
36
36
  var import_x = require("@ant-design/x");
37
+ var import_icons = require("@ant-design/icons");
38
+ var import_antd = require("antd");
39
+ var import_useProviderContext = require("../../hooks/useProviderContext");
40
+ var import_react_infinite_scroll_component = __toESM(require("react-infinite-scroll-component"));
37
41
  var XAiConversations = (props) => {
42
+ const { mergedProps } = (0, import_useProviderContext.useChatbotContext)(props);
38
43
  const {
39
- items,
40
- style
41
- } = props;
44
+ sessionTotal = 0,
45
+ sessionList,
46
+ style,
47
+ onActiveChange,
48
+ loadMoreSessions
49
+ } = mergedProps;
42
50
  const [activeKey, setActiveKey] = (0, import_react.useState)("");
43
- return /* @__PURE__ */ import_react.default.createElement(
44
- import_x.Conversations,
51
+ const handleSwitchTab = (key) => {
52
+ setActiveKey(key);
53
+ onActiveChange == null ? void 0 : onActiveChange(key);
54
+ };
55
+ (0, import_react.useEffect)(() => {
56
+ loadMoreSessions == null ? void 0 : loadMoreSessions();
57
+ }, []);
58
+ return /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement(
59
+ import_react_infinite_scroll_component.default,
45
60
  {
46
- activeKey,
47
- onActiveChange: (v) => setActiveKey(v),
48
- items,
49
- style: {
50
- width: 256,
51
- background: "#fff",
52
- borderRadius: "6px",
53
- ...style
61
+ dataLength: sessionList.length,
62
+ next: loadMoreSessions,
63
+ hasMore: sessionList.length < sessionTotal,
64
+ loader: /* @__PURE__ */ import_react.default.createElement("div", { style: { textAlign: "center" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Spin, { indicator: /* @__PURE__ */ import_react.default.createElement(import_icons.RedoOutlined, { spin: true }), size: "small" })),
65
+ scrollableTarget: "scrollableDiv",
66
+ style: { overflow: "hidden" }
67
+ },
68
+ /* @__PURE__ */ import_react.default.createElement(
69
+ import_x.Conversations,
70
+ {
71
+ activeKey,
72
+ onActiveChange: (v) => handleSwitchTab(v),
73
+ items: sessionList,
74
+ style: {
75
+ width: 256,
76
+ background: "#fff",
77
+ borderRadius: "6px",
78
+ ...style
79
+ }
54
80
  }
55
- }
56
- );
81
+ )
82
+ ));
57
83
  };
58
84
  var XAiConversations_default = XAiConversations;
59
85
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiConversations/index.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react';\nimport { Conversations } from '@ant-design/x';\nimport { type XAiConversationsProps } from '@/types/XAiConversations';\n\nconst XAiConversations: React.FC<XAiConversationsProps> = (props) => {\n const {\n items,\n style,\n } = props;\n\n const [activeKey, setActiveKey] = useState('');\n\n return (\n <Conversations\n activeKey={activeKey}\n onActiveChange={(v) => setActiveKey(v)}\n items={items}\n style={{\n width: 256,\n background: '#fff',\n borderRadius: '6px',\n ...style,\n }}\n />\n );\n};\n\nexport default XAiConversations;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAChC,eAA8B;AAG9B,IAAM,mBAAoD,CAAC,UAAU;AACnE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,EAAE;AAE7C,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,gBAAgB,CAAC,MAAM,aAAa,CAAC;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,GAAG;AAAA,MACL;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,2BAAQ;",
6
- "names": ["React"]
4
+ "sourcesContent": ["import React, { useState, useEffect } from 'react';\nimport { Conversations } from '@ant-design/x';\nimport { RedoOutlined } from '@ant-design/icons';\nimport { Avatar, Divider, type GetProp, Spin, theme } from 'antd';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { type XAiConversationsProps } from '@/types/XAiConversations';\nimport InfiniteScroll from 'react-infinite-scroll-component';\n\nconst XAiConversations: React.FC<XAiConversationsProps> = (props) => {\n // 处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n const {\n sessionTotal = 0,\n sessionList,\n style,\n onActiveChange,\n loadMoreSessions,\n } = mergedProps;\n const [activeKey, setActiveKey] = useState('');\n\n const handleSwitchTab = (key: string) => {\n setActiveKey(key);\n onActiveChange?.(key);\n };\n\n useEffect(() => {\n loadMoreSessions?.();\n }, []);\n\n return (\n <div>\n <InfiniteScroll\n dataLength={sessionList.length}\n next={loadMoreSessions}\n hasMore={sessionList.length < sessionTotal}\n loader={\n <div style={{ textAlign: 'center' }}>\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n }\n // endMessage={sessionTotal > 0 && <Divider plain>已经到底啦</Divider>}\n scrollableTarget=\"scrollableDiv\"\n style={{ overflow: 'hidden' }}\n >\n\n <Conversations\n activeKey={activeKey}\n onActiveChange={(v) => handleSwitchTab(v)}\n items={sessionList}\n style={{\n width: 256,\n background: '#fff',\n borderRadius: '6px',\n ...style,\n }}\n />\n </InfiniteScroll>\n </div>\n );\n};\n\nexport default XAiConversations;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA2C;AAC3C,eAA8B;AAC9B,mBAA6B;AAC7B,kBAA2D;AAC3D,gCAAkC;AAElC,6CAA2B;AAE3B,IAAM,mBAAoD,CAAC,UAAU;AAEnE,QAAM,EAAE,YAAY,QAAI,6CAAkB,KAAK;AAC/C,QAAM;AAAA,IACJ,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,EAAE;AAE7C,QAAM,kBAAkB,CAAC,QAAgB;AACvC,iBAAa,GAAG;AAChB,qDAAiB;AAAA,EACnB;AAEA,8BAAU,MAAM;AACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,6BAAAA,QAAA,cAAC,aACC,6BAAAA,QAAA;AAAA,IAAC,uCAAAC;AAAA,IAAA;AAAA,MACC,YAAY,YAAY;AAAA,MACxB,MAAM;AAAA,MACN,SAAS,YAAY,SAAS;AAAA,MAC9B,QACE,6BAAAD,QAAA,cAAC,SAAI,OAAO,EAAE,WAAW,SAAS,KAChC,6BAAAA,QAAA,cAAC,oBAAK,WAAW,6BAAAA,QAAA,cAAC,6BAAa,MAAI,MAAC,GAAI,MAAK,SAAQ,CACvD;AAAA,MAGF,kBAAiB;AAAA,MACjB,OAAO,EAAE,UAAU,SAAS;AAAA;AAAA,IAG5B,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,gBAAgB,CAAC,MAAM,gBAAgB,CAAC;AAAA,QACxC,OAAO;AAAA,QACP,OAAO;AAAA,UACL,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,GAAG;AAAA,QACL;AAAA;AAAA,IACF;AAAA,EACF,CACF;AAEJ;AAEA,IAAO,2BAAQ;",
6
+ "names": ["React", "InfiniteScroll"]
7
7
  }
@@ -3,5 +3,6 @@ import XAiProvider from './index';
3
3
  declare const meta: Meta<typeof XAiProvider>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof meta>;
6
- export declare const 单聊天窗口: Story;
6
+ export declare const 单聊天窗口实例: Story;
7
7
  export declare const 多容器示例: Story;
8
+ export declare const 携带历史记录示例: Story;
@@ -30,13 +30,16 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  var XAiProvider_stories_exports = {};
31
31
  __export(XAiProvider_stories_exports, {
32
32
  default: () => XAiProvider_stories_default,
33
- 单聊天窗口: () => 单聊天窗口,
34
- 多容器示例: () => 多容器示例
33
+ 单聊天窗口实例: () => 单聊天窗口实例,
34
+ 多容器示例: () => 多容器示例,
35
+ 携带历史记录示例: () => 携带历史记录示例
35
36
  });
36
37
  module.exports = __toCommonJS(XAiProvider_stories_exports);
37
38
  var import_react = __toESM(require("react"));
39
+ var import_antd = require("antd");
38
40
  var import_index = __toESM(require("./index"));
39
41
  var import_XAiChatbot = __toESM(require("../XAiChatbot"));
42
+ var import_XAiConversations = __toESM(require("../XAiConversations"));
40
43
  var meta = {
41
44
  title: "AI组件/XAiProvider AI容器",
42
45
  component: import_index.default,
@@ -50,17 +53,19 @@ var meta = {
50
53
  },
51
54
  tags: ["autodocs"],
52
55
  argTypes: {
53
- url: {
54
- control: "text",
55
- description: "AI 服务地址"
56
- },
57
- token: {
58
- control: "text",
59
- description: "认证 token"
60
- },
61
- providerId: {
62
- control: "text",
63
- description: "Provider 唯一标识"
56
+ config: {
57
+ description: "配置信息",
58
+ table: {
59
+ type: {
60
+ summary: "XAiProviderConfig",
61
+ detail: `{
62
+ appNo?: string; // 应用唯一编号
63
+ pt?: string; // 授权方式
64
+ tc?: string; // 租户key
65
+ }`
66
+ },
67
+ category: "配置选项"
68
+ }
64
69
  }
65
70
  },
66
71
  // 添加装饰器,确保组件有必要的上下文
@@ -69,30 +74,43 @@ var meta = {
69
74
  ]
70
75
  };
71
76
  var XAiProvider_stories_default = meta;
72
- var 单聊天窗口 = {
73
- render: (args) => /* @__PURE__ */ import_react.default.createElement("div", { style: { width: "400px", height: "600px" } }, /* @__PURE__ */ import_react.default.createElement(
74
- import_index.default,
75
- {
76
- ...args,
77
- onError: (providerError) => console.log(providerError)
78
- },
79
- /* @__PURE__ */ import_react.default.createElement(
80
- import_XAiChatbot.default,
77
+ var 单聊天窗口实例 = {
78
+ render: (args) => {
79
+ const providerRef = import_react.default.useRef(null);
80
+ const handleSendMessage = () => {
81
+ var _a;
82
+ if ((_a = providerRef.current) == null ? void 0 : _a.chat) {
83
+ providerRef.current.chat("你好,AI!");
84
+ } else {
85
+ console.log("XAiProvider ref 未准备好或 chat 方法不存在");
86
+ }
87
+ };
88
+ return /* @__PURE__ */ import_react.default.createElement("div", { style: { display: "flex" } }, /* @__PURE__ */ import_react.default.createElement("div", { style: { display: "flex", flexDirection: "column", gap: "12px", marginRight: "24px", justifyContent: "center" } }, /* @__PURE__ */ import_react.default.createElement(import_antd.Button, { type: "primary", onClick: handleSendMessage }, "发送消息")), /* @__PURE__ */ import_react.default.createElement("div", { style: { width: "400px", height: "600px" } }, /* @__PURE__ */ import_react.default.createElement(
89
+ import_index.default,
81
90
  {
82
- navbarShow: true,
83
- navbar: {
84
- title: "Provider 聊天机器人",
85
- subtitle: "由 Provider 管理消息",
86
- avatar: "https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg"
91
+ ref: providerRef,
92
+ ...args,
93
+ onError: (providerError) => console.log(providerError),
94
+ onMessage: (data) => console.log(data)
95
+ },
96
+ /* @__PURE__ */ import_react.default.createElement(
97
+ import_XAiChatbot.default,
98
+ {
99
+ navbarShow: true,
100
+ navbar: {
101
+ title: "Provider 聊天机器人",
102
+ subtitle: "由 Provider 管理消息",
103
+ avatar: "https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg"
104
+ }
87
105
  }
88
- }
89
- )
90
- )),
106
+ )
107
+ )));
108
+ },
91
109
  args: {
92
110
  url: "http://ai-platform.xline-dev.test.xinke.biz",
93
- token: "eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIwOWNiYTQ4Yi01OTdjLTQ4OTMtYWFjMy0zZTVmOTAxNzc1MGYiLCJzdWIiOiLmnLHmmajkuq4iLCJpc3MiOiJodHRwczovL2NoYXQtdGVzdC56YXhsaW5lLmNvbSIsImF1ZCI6Ik1haW5TdGF0aW9uIiwiaWF0IjoxNzU1MTYxNjQ5LCJleHAiOjE3NTUxNjg4NDksInR5cGUiOiJhY2Nlc3MiLCJjbGllbnRfaWQiOiJBcHAxOTU1NDQ3NjkxNzk2NTQ5NjMyIiwic2NvcGUiOiJhbGwiLCJwbGF0Zm9ybV90eXBlIjoiTWFpblN0YXRpb24ifQ.AqmyGday6I3wKmhODIGy4rV7MTbLiqwto7bJ0sPfJo-PZ1oL7wmEagwyuxZC_LQsIx4RVoDXLzDeYecc63C8gg",
111
+ token: "eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4ZjYxNjE2Yy05ZWZjLTQ5ZmMtOWFmYi00OWZiZDNhNGVmNzciLCJzdWIiOiLmnLHmmajkuq4iLCJpc3MiOiJodHRwczovL2NoYXQtZGV2LnpheGxpbmUuY29tIiwiYXVkIjoiTWFpblN0YXRpb24iLCJpYXQiOjE3NTc5MjUwOTQsImV4cCI6MTc1NzkzMjI5NCwidHlwZSI6ImFjY2VzcyIsImNsaWVudF9pZCI6IkFwcDE5NTUyMzA4NTA4OTU2ODc2ODAiLCJzY29wZSI6ImFsbCIsInBsYXRmb3JtX3R5cGUiOiJNYWluU3RhdGlvbiJ9._lZMQ_V0Tzv54Cez-Wc9OQCpP1dt6k0HqOiGZ8DBd_f3HPa1mjF3wJP-0ToBLH8udMrFQmkjAOD3jzvTUqHSJA",
94
112
  config: {
95
- appNo: "App1955447691796549632",
113
+ appNo: "App1955230850895687680",
96
114
  pt: "MainStation",
97
115
  tc: "ZABX"
98
116
  },
@@ -126,9 +144,45 @@ var 多容器示例 = {
126
144
  token: "your-token-here"
127
145
  }
128
146
  };
147
+ var 携带历史记录示例 = {
148
+ render: (args) => {
149
+ const providerRef = import_react.default.useRef(null);
150
+ return /* @__PURE__ */ import_react.default.createElement("div", { style: { display: "flex" } }, /* @__PURE__ */ import_react.default.createElement("div", { style: { width: "1000px", height: "600px" } }, /* @__PURE__ */ import_react.default.createElement(
151
+ import_index.default,
152
+ {
153
+ ref: providerRef,
154
+ ...args,
155
+ onError: (providerError) => console.log(providerError),
156
+ onMessage: (data) => console.log(data)
157
+ },
158
+ /* @__PURE__ */ import_react.default.createElement(import_XAiConversations.default, null),
159
+ /* @__PURE__ */ import_react.default.createElement(
160
+ import_XAiChatbot.default,
161
+ {
162
+ navbar: {
163
+ title: "Provider 聊天机器人",
164
+ subtitle: "由 Provider 管理消息",
165
+ avatar: "https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg"
166
+ }
167
+ }
168
+ )
169
+ )));
170
+ },
171
+ args: {
172
+ url: "http://ai-platform.xline-dev.test.xinke.biz",
173
+ token: "eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4ODYwNWUwNi1mNjBkLTQzMTUtYWM0ZC04YzcyNWY0YmQ3NjkiLCJzdWIiOiLmnLHmmajkuq4iLCJpc3MiOiJodHRwczovL2NoYXQtZGV2LnpheGxpbmUuY29tIiwiYXVkIjoiTWFpblN0YXRpb24iLCJpYXQiOjE3NTc5OTU5ODEsImV4cCI6MTc1ODAwMzE4MSwidHlwZSI6ImFjY2VzcyIsImNsaWVudF9pZCI6IkFwcDE5NTUyMzA4NTA4OTU2ODc2ODAiLCJzY29wZSI6ImFsbCIsInBsYXRmb3JtX3R5cGUiOiJNYWluU3RhdGlvbiJ9.9nmXvWt210UxfVjDJ-nGXhuD3OnNZDh90RdAQspu0EC5iKh-xdAwbFjZ7KWAyFSODDcqtHekYNSnOPaEGBEgEg",
174
+ config: {
175
+ appNo: "App1955230850895687680",
176
+ pt: "MainStation",
177
+ tc: "ZABX"
178
+ },
179
+ providerId: "demo-provider"
180
+ }
181
+ };
129
182
  // Annotate the CommonJS export names for ESM import in node:
130
183
  0 && (module.exports = {
131
- 单聊天窗口,
132
- 多容器示例
184
+ 单聊天窗口实例,
185
+ 多容器示例,
186
+ 携带历史记录示例
133
187
  });
134
188
  //# sourceMappingURL=XAiProvider.stories.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiProvider/XAiProvider.stories.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport { error } from 'console';\nimport XAiProvider from './index';\nimport XAiChatbot from '../XAiChatbot';\nimport XAiConversations from '../XAiConversations';\nimport useStyles from './demo.styles';\n\nconst meta: Meta<typeof XAiProvider> = {\n title: 'AI组件/XAiProvider AI容器',\n component: XAiProvider,\n parameters: {\n layout: 'centered',\n docs: {\n description: {\n component: 'AI 聊天机器人容器组件,提供全局上下文和消息管理功能。',\n },\n },\n },\n tags: ['autodocs'],\n argTypes: {\n url: {\n control: 'text',\n description: 'AI 服务地址',\n },\n token: {\n control: 'text',\n description: '认证 token',\n },\n providerId: {\n control: 'text',\n description: 'Provider 唯一标识',\n },\n },\n // 添加装饰器,确保组件有必要的上下文\n decorators: [\n (Story) => (\n <div style={{ padding: '20px' }}>\n <Story />\n </div>\n ),\n ],\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 使用 Provider 的 XAiChatbot\nexport const 单聊天窗口: Story = {\n render: (args) => (\n <div style={{ width: '400px', height: '600px' }}>\n <XAiProvider\n {...args}\n onError={(providerError) => console.log(providerError)}\n >\n <XAiChatbot\n navbarShow\n navbar={{\n title: 'Provider 聊天机器人',\n subtitle: '由 Provider 管理消息',\n avatar: 'https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg',\n }}\n />\n </XAiProvider>\n </div>\n ),\n args: {\n url: 'http://ai-platform.xline-dev.test.xinke.biz',\n token: 'eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIwOWNiYTQ4Yi01OTdjLTQ4OTMtYWFjMy0zZTVmOTAxNzc1MGYiLCJzdWIiOiLmnLHmmajkuq4iLCJpc3MiOiJodHRwczovL2NoYXQtdGVzdC56YXhsaW5lLmNvbSIsImF1ZCI6Ik1haW5TdGF0aW9uIiwiaWF0IjoxNzU1MTYxNjQ5LCJleHAiOjE3NTUxNjg4NDksInR5cGUiOiJhY2Nlc3MiLCJjbGllbnRfaWQiOiJBcHAxOTU1NDQ3NjkxNzk2NTQ5NjMyIiwic2NvcGUiOiJhbGwiLCJwbGF0Zm9ybV90eXBlIjoiTWFpblN0YXRpb24ifQ.AqmyGday6I3wKmhODIGy4rV7MTbLiqwto7bJ0sPfJo-PZ1oL7wmEagwyuxZC_LQsIx4RVoDXLzDeYecc63C8gg',\n config: {\n appNo: 'App1955447691796549632',\n pt: 'MainStation',\n tc: 'ZABX',\n },\n providerId: 'demo-provider',\n },\n};\n\n// export const 带历史记录聊天窗口: Story = {\n// render: (args) => {\n// function WithStyles(props: any) {\n// const styles = useStyles();\n// return (\n// <XAiProvider {...props}>\n// <div className={styles.wrapper}>\n// <div>\n// <XAiConversations />\n// </div>\n// <div>\n// <XAiChatbot />\n// </div>\n// </div>\n// </XAiProvider>\n// );\n// }\n// return <WithStyles {...args} />;\n// },\n// args: {\n// url: 'http://ai-platform.xline-dev.test.xinke.biz',\n// token: 'eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJjYWIxYjM3Ni03MmZjLTRkNWEtOTIzMC01N2U3NmZiMGI4NmQiLCJzdWIiOiJSZXgiLCJpc3MiOiJodHRwOi8vY2hhdC10ZXN0LnpheGxpbmUuY29tIiwiYXVkIjoiTWFpblN0YXRpb24iLCJpYXQiOjE3NTQzMTc1OTAsImV4cCI6MTc1NDkyMjM5MCwidHlwZSI6InJlZnJlc2giLCJjbGllbnRfaWQiOiJBcHAxOTUwMDIwNTk0NDUyNjYwMjI0Iiwic2NvcGUiOiJhbGwiLCJwbGF0Zm9ybV90eXBlIjoiTWFpblN0YXRpb24ifQ.crZFQRycuHHA1iIIFJ5ak9kS1-04Eqro-QWWG8HZj6Dz7DkLWYuQBPCrUlCtavGu0XW5tqHZ5WW4tdST06FvEA',\n// config: {\n// appNo: 'App1952213101022154752',\n// pt: 'MainStation',\n// tc: 'ZABX',\n// },\n// providerId: 'demo-provider',\n// },\n// };\n\n// 多个 Provider 示例\nexport const 多容器示例: Story = {\n render: (args) => (\n <div style={{ display: 'flex', gap: '20px' }}>\n <div style={{ width: '400px', height: '600px' }}>\n <XAiProvider {...args} providerId=\"provider-1\">\n <XAiChatbot\n navbarShow\n navbar={{\n title: 'Provider 1',\n subtitle: '第一个聊天机器人',\n avatar: 'https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg',\n }}\n />\n </XAiProvider>\n </div>\n\n <div style={{ width: '400px', height: '600px' }}>\n <XAiProvider {...args} providerId=\"provider-2\">\n <XAiChatbot\n navbarShow\n navbar={{\n title: 'Provider 2',\n subtitle: '第二个聊天机器人',\n avatar: 'https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg',\n }}\n />\n </XAiProvider>\n </div>\n </div>\n ),\n args: {\n url: 'https://api.example.com/ai',\n token: 'your-token-here',\n },\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAGlB,mBAAwB;AACxB,wBAAuB;AAIvB,IAAM,OAAiC;AAAA,EACrC,OAAO;AAAA,EACP,WAAW,aAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,aAAa;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU;AAAA,IACR,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAEA,YAAY;AAAA,IACV,CAAC,UACC,6BAAAC,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,OAAO,KAC5B,6BAAAA,QAAA,cAAC,WAAM,CACT;AAAA,EAEJ;AACF;AAEA,IAAO,8BAAQ;AAIR,IAAM,QAAe;AAAA,EAC1B,QAAQ,CAAC,SACP,6BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ,KAC5C,6BAAAA,QAAA;AAAA,IAAC,aAAAD;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,SAAS,CAAC,kBAAkB,QAAQ,IAAI,aAAa;AAAA;AAAA,IAErD,6BAAAC,QAAA;AAAA,MAAC,kBAAAC;AAAA,MAAA;AAAA,QACC,YAAU;AAAA,QACV,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AAAA;AAAA,IACF;AAAA,EACF,CACF;AAAA,EAEF,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAkCO,IAAM,QAAe;AAAA,EAC1B,QAAQ,CAAC,SACP,6BAAAD,QAAA,cAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,KACzC,6BAAAA,QAAA,cAAC,SAAI,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ,KAC5C,6BAAAA,QAAA,cAAC,aAAAD,SAAA,EAAa,GAAG,MAAM,YAAW,gBAChC,6BAAAC,QAAA;AAAA,IAAC,kBAAAC;AAAA,IAAA;AAAA,MACC,YAAU;AAAA,MACV,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA;AAAA,EACF,CACF,CACF,GAEA,6BAAAD,QAAA,cAAC,SAAI,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ,KAC5C,6BAAAA,QAAA,cAAC,aAAAD,SAAA,EAAa,GAAG,MAAM,YAAW,gBAChC,6BAAAC,QAAA;AAAA,IAAC,kBAAAC;AAAA,IAAA;AAAA,MACC,YAAU;AAAA,MACV,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA;AAAA,EACF,CACF,CACF,CACF;AAAA,EAEF,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AACF;",
6
- "names": ["XAiProvider", "React", "XAiChatbot"]
4
+ "sourcesContent": ["import React from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport { Button } from 'antd';\nimport XAiProvider from './index';\nimport XAiChatbot from '../XAiChatbot';\nimport XAiConversations from '../XAiConversations';\nimport useStyles from './demo.styles';\n\nconst meta: Meta<typeof XAiProvider> = {\n title: 'AI组件/XAiProvider AI容器',\n component: XAiProvider,\n parameters: {\n layout: 'centered',\n docs: {\n description: {\n component: 'AI 聊天机器人容器组件,提供全局上下文和消息管理功能。',\n },\n },\n },\n tags: ['autodocs'],\n argTypes: {\n config: {\n description: '配置信息',\n table: {\n type: { \n summary: 'XAiProviderConfig',\n detail: `{\n appNo?: string; // 应用唯一编号\n pt?: string; // 授权方式\n tc?: string; // 租户key\n }`\n },\n category: '配置选项'\n }\n }\n },\n // 添加装饰器,确保组件有必要的上下文\n decorators: [\n (Story) => (\n <div style={{ padding: '20px' }}>\n <Story />\n </div>\n ),\n ],\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 使用 Provider 的 XAiChatbot\nexport const 单聊天窗口实例: Story = {\n render: (args) => {\n const providerRef = React.useRef<any>(null);\n\n const handleSendMessage = () => {\n if (providerRef.current?.chat) {\n providerRef.current.chat('你好,AI!')\n } else {\n console.log('XAiProvider ref 未准备好或 chat 方法不存在');\n }\n };\n\n return (\n <div style={{ display: 'flex' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px', marginRight: '24px', justifyContent: 'center' }}>\n <Button type=\"primary\" onClick={handleSendMessage}>发送消息</Button>\n </div>\n <div style={{ width: '400px', height: '600px' }}>\n <XAiProvider\n ref={providerRef}\n {...args}\n onError={(providerError) => console.log(providerError)}\n onMessage={(data) => console.log(data)}\n >\n <XAiChatbot\n navbarShow\n navbar={{\n title: 'Provider 聊天机器人',\n subtitle: '由 Provider 管理消息',\n avatar: 'https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg',\n }}\n />\n </XAiProvider>\n </div>\n </div>\n );\n },\n args: {\n url: 'http://ai-platform.xline-dev.test.xinke.biz',\n token: 'eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4ZjYxNjE2Yy05ZWZjLTQ5ZmMtOWFmYi00OWZiZDNhNGVmNzciLCJzdWIiOiLmnLHmmajkuq4iLCJpc3MiOiJodHRwczovL2NoYXQtZGV2LnpheGxpbmUuY29tIiwiYXVkIjoiTWFpblN0YXRpb24iLCJpYXQiOjE3NTc5MjUwOTQsImV4cCI6MTc1NzkzMjI5NCwidHlwZSI6ImFjY2VzcyIsImNsaWVudF9pZCI6IkFwcDE5NTUyMzA4NTA4OTU2ODc2ODAiLCJzY29wZSI6ImFsbCIsInBsYXRmb3JtX3R5cGUiOiJNYWluU3RhdGlvbiJ9._lZMQ_V0Tzv54Cez-Wc9OQCpP1dt6k0HqOiGZ8DBd_f3HPa1mjF3wJP-0ToBLH8udMrFQmkjAOD3jzvTUqHSJA',\n config: {\n appNo: 'App1955230850895687680',\n pt: 'MainStation',\n tc: 'ZABX',\n },\n providerId: 'demo-provider',\n },\n};\n\n// export const 带历史记录聊天窗口: Story = {\n// render: (args) => {\n// function WithStyles(props: any) {\n// const styles = useStyles();\n// return (\n// <XAiProvider {...props}>\n// <div className={styles.wrapper}>\n// <div>\n// <XAiConversations />\n// </div>\n// <div>\n// <XAiChatbot />\n// </div>\n// </div>\n// </XAiProvider>\n// );\n// }\n// return <WithStyles {...args} />;\n// },\n// args: {\n// url: 'http://ai-platform.xline-dev.test.xinke.biz',\n// token: 'eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJjYWIxYjM3Ni03MmZjLTRkNWEtOTIzMC01N2U3NmZiMGI4NmQiLCJzdWIiOiJSZXgiLCJpc3MiOiJodHRwOi8vY2hhdC10ZXN0LnpheGxpbmUuY29tIiwiYXVkIjoiTWFpblN0YXRpb24iLCJpYXQiOjE3NTQzMTc1OTAsImV4cCI6MTc1NDkyMjM5MCwidHlwZSI6InJlZnJlc2giLCJjbGllbnRfaWQiOiJBcHAxOTUwMDIwNTk0NDUyNjYwMjI0Iiwic2NvcGUiOiJhbGwiLCJwbGF0Zm9ybV90eXBlIjoiTWFpblN0YXRpb24ifQ.crZFQRycuHHA1iIIFJ5ak9kS1-04Eqro-QWWG8HZj6Dz7DkLWYuQBPCrUlCtavGu0XW5tqHZ5WW4tdST06FvEA',\n// config: {\n// appNo: 'App1952213101022154752',\n// pt: 'MainStation',\n// tc: 'ZABX',\n// },\n// providerId: 'demo-provider',\n// },\n// };\n\n// 多个 Provider 示例\nexport const 多容器示例: Story = {\n render: (args) => (\n <div style={{ display: 'flex', gap: '20px' }}>\n <div style={{ width: '400px', height: '600px' }}>\n <XAiProvider {...args} providerId=\"provider-1\">\n <XAiChatbot\n navbarShow\n navbar={{\n title: 'Provider 1',\n subtitle: '第一个聊天机器人',\n avatar: 'https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg',\n }}\n />\n </XAiProvider>\n </div>\n\n <div style={{ width: '400px', height: '600px' }}>\n <XAiProvider {...args} providerId=\"provider-2\">\n <XAiChatbot\n navbarShow\n navbar={{\n title: 'Provider 2',\n subtitle: '第二个聊天机器人',\n avatar: 'https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg',\n }}\n />\n </XAiProvider>\n </div>\n </div>\n ),\n args: {\n url: 'https://api.example.com/ai',\n token: 'your-token-here',\n },\n};\n\n// 使用 Provider 的 XAiChatbot\nexport const 携带历史记录示例: Story = {\n render: (args) => {\n const providerRef = React.useRef<any>(null);\n\n return (\n <div style={{ display: 'flex' }}>\n <div style={{ width: '1000px', height: '600px' }}>\n <XAiProvider\n ref={providerRef}\n {...args}\n onError={(providerError) => console.log(providerError)}\n onMessage={(data) => console.log(data)}\n >\n <XAiConversations />\n <XAiChatbot\n navbar={{\n title: 'Provider 聊天机器人',\n subtitle: '由 Provider 管理消息',\n avatar: 'https://gw.alipayobjects.com/zos/bmw-prod/b874caa9-4458-412a-9ac6-a61486180a62.svg',\n }}\n />\n </XAiProvider>\n </div>\n </div>\n );\n },\n args: {\n url: 'http://ai-platform.xline-dev.test.xinke.biz',\n token: 'eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI4ODYwNWUwNi1mNjBkLTQzMTUtYWM0ZC04YzcyNWY0YmQ3NjkiLCJzdWIiOiLmnLHmmajkuq4iLCJpc3MiOiJodHRwczovL2NoYXQtZGV2LnpheGxpbmUuY29tIiwiYXVkIjoiTWFpblN0YXRpb24iLCJpYXQiOjE3NTc5OTU5ODEsImV4cCI6MTc1ODAwMzE4MSwidHlwZSI6ImFjY2VzcyIsImNsaWVudF9pZCI6IkFwcDE5NTUyMzA4NTA4OTU2ODc2ODAiLCJzY29wZSI6ImFsbCIsInBsYXRmb3JtX3R5cGUiOiJNYWluU3RhdGlvbiJ9.9nmXvWt210UxfVjDJ-nGXhuD3OnNZDh90RdAQspu0EC5iKh-xdAwbFjZ7KWAyFSODDcqtHekYNSnOPaEGBEgEg',\n config: {\n appNo: 'App1955230850895687680',\n pt: 'MainStation',\n tc: 'ZABX',\n },\n providerId: 'demo-provider',\n },\n};"],
5
+ "mappings": "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",
6
+ "names": ["XAiProvider", "React", "XAiChatbot", "XAiConversations"]
7
7
  }
@@ -47,9 +47,24 @@ var XAiProvider = (0, import_react.forwardRef)(({
47
47
  providerId = "defaultId",
48
48
  onSuccess,
49
49
  onError,
50
+ onMessage,
50
51
  children
51
52
  }, ref) => {
52
- const { appInfo, chat, stopChat, reChat, messages, loading, setCurrentSession, setMessages } = (0, import_useAgentGenerator.default)({ url, token, config, onError, onSuccess });
53
+ const {
54
+ appInfo,
55
+ chat,
56
+ stopChat,
57
+ reChat,
58
+ initPrologue,
59
+ loadMoreSessions,
60
+ sessionPagination,
61
+ sessionList,
62
+ messages,
63
+ loading,
64
+ setCurrentSessionId,
65
+ setCurrentSessionDetail,
66
+ setMessages
67
+ } = (0, import_useAgentGenerator.default)({ url, token, config, onError, onSuccess, onMessage });
53
68
  const { appName, icon } = appInfo || {};
54
69
  (0, import_react.useImperativeHandle)(ref, () => ({
55
70
  chat,
@@ -58,15 +73,16 @@ var XAiProvider = (0, import_react.forwardRef)(({
58
73
  getAppInfo: () => appInfo,
59
74
  getMessages: () => messages,
60
75
  setMessages,
61
- setCurrentSession
62
- }), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSession]);
76
+ setCurrentSessionDetail
77
+ }), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSessionDetail]);
63
78
  const handleSendMessage = (_type, content) => {
64
79
  chat(content);
65
80
  };
66
81
  const handleClearMessage = () => {
67
82
  stopChat();
68
83
  setMessages([]);
69
- setCurrentSession((0, import_uuid.v4)());
84
+ initPrologue();
85
+ setCurrentSessionId((0, import_uuid.v4)());
70
86
  };
71
87
  const handleActions = (index, actionData) => {
72
88
  const { content, id } = actionData || {};
@@ -96,6 +112,9 @@ var XAiProvider = (0, import_react.forwardRef)(({
96
112
  const handleSuggestMessageClick = (_item, id) => {
97
113
  setMessages((prev) => prev.filter((m) => m.id !== id));
98
114
  };
115
+ const handleActiveChange = (key) => {
116
+ setCurrentSessionDetail(key);
117
+ };
99
118
  const ToolTip = (messageData) => {
100
119
  const finalResult = ((messageData == null ? void 0 : messageData.think) || []).find((item) => item.actionName === "FINISHED");
101
120
  if (!finalResult)
@@ -115,20 +134,27 @@ var XAiProvider = (0, import_react.forwardRef)(({
115
134
  emptyStateText: appName,
116
135
  footerTips: "内容由AI生成,无法确保真实准确,仅供参考",
117
136
  providerId,
137
+ sessionList,
138
+ sessionTotal: sessionPagination.total,
118
139
  token,
119
140
  messages,
120
141
  loading,
121
142
  error: null,
122
143
  messageTooltip: ToolTip,
144
+ loadMoreSessions,
123
145
  onSend: handleSendMessage,
124
146
  onClear: handleClearMessage,
125
147
  onStop: stopChat,
148
+ onActiveChange: handleActiveChange,
126
149
  onSuggestMessageClick: handleSuggestMessageClick,
127
150
  onMessagesActionsCallback: handleActions,
128
151
  isInProvider: true
129
152
  }
130
153
  },
131
- children
154
+ /* @__PURE__ */ import_react.default.createElement("div", { style: {
155
+ display: "flex",
156
+ height: "100%"
157
+ } }, children)
132
158
  ));
133
159
  });
134
160
  var XAiProvider_default = XAiProvider;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiProvider/index.tsx"],
4
- "sourcesContent": ["import React, { forwardRef, useImperativeHandle } from 'react';\nimport { message, Divider } from 'antd';\nimport { v4 as uuidV4 } from 'uuid';\nimport copy from 'copy-to-clipboard';\nimport { XProvider } from '@ant-design/x';\nimport { XAiContext } from '@/context/AiProviderContext';\nimport { XAiProviderProps, XAiProviderHandle } from '@/types/XAiProvider';\nimport useAgentGenerator from '@/hooks/useAgentGenerator';\nimport userIcon from '@/assets/user.png';\n\nconst XAiProvider = forwardRef<XAiProviderHandle, XAiProviderProps>(({\n url,\n token,\n config,\n providerId = 'defaultId',\n onSuccess,\n onError,\n children,\n}, ref) => {\n // 使用 useAgentGenerator Hook 管理消息状态\n const { appInfo, chat, stopChat, reChat, messages, loading, setCurrentSession, setMessages } = useAgentGenerator({ url, token, config, onError, onSuccess });\n\n const { appName, icon } = appInfo || {};\n\n useImperativeHandle(ref, () => ({\n chat,\n stopChat,\n reChat,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n setMessages,\n setCurrentSession,\n }), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSession]);\n\n // 发送消息\n const handleSendMessage = (_type: string, content: string) => {\n chat(content);\n };\n\n // 清空消息\n const handleClearMessage = () => {\n stopChat();\n setMessages([]);\n setCurrentSession(uuidV4());\n };\n\n // 工具栏按钮点击\n const handleActions = (index: number, actionData: any) => {\n const { content, id } = actionData || {};\n const { text = '' } = content;\n switch (index) {\n case 0:\n reChat();\n break;\n case 1:\n copy(text);\n message.success('复制成功');\n break;\n case 2: {\n const idx = messages.findIndex((item) => item.id === id);\n if (idx >= 0) {\n // 删除该条消息及建议类消息\n if (messages.length - idx <= 2) {\n setMessages((prev) => prev.filter((item) => item.id !== id && item.type !== 'SuggestionMessage'));\n } else {\n // 非最新消息 只删除该条消息\n setMessages((prev) => prev.filter((item) => item.id !== id));\n }\n message.success('删除成功');\n }\n break;\n }\n }\n };\n\n // 建议消息点击\n const handleSuggestMessageClick = (_item: any, id: string) => {\n setMessages((prev: any[]) => prev.filter((m: any) => m.id !== id));\n };\n\n const ToolTip = (messageData: any) => {\n const finalResult = (messageData?.think || []).find((item: any) => item.actionName === 'FINISHED');\n if (!finalResult) return null;\n const { cost, token: tokenCount } = finalResult.extra || {};\n if (!cost && !token) return null;\n return (\n <div style={{ display: 'flex', alignItems: 'center', fontSize: '12px', color: '#949494', flex: 1, paddingRight: '40px' }}>\n { (cost !== undefined && cost !== null) && <div>{cost}s</div> }\n { tokenCount && <Divider type=\"vertical\" /> }\n { tokenCount && <div>{ tokenCount } tokens</div> }\n </div>\n );\n };\n\n return (\n <XProvider>\n <XAiContext.Provider value={{\n avatar: <img src={icon} alt=\"智能体头像\" />,\n userAvatar: <img src={userIcon} alt=\"用户头像\" />,\n emptyStateImage: icon,\n emptyStateText: appName,\n footerTips: '内容由AI生成,无法确保真实准确,仅供参考',\n providerId,\n token,\n messages,\n loading,\n error: null,\n messageTooltip: ToolTip,\n onSend: handleSendMessage,\n onClear: handleClearMessage,\n onStop: stopChat,\n onSuggestMessageClick: handleSuggestMessageClick,\n onMessagesActionsCallback: handleActions,\n isInProvider: true,\n }}\n >\n {children}\n </XAiContext.Provider>\n </XProvider>\n );\n});\n\nexport default XAiProvider;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, { forwardRef, useImperativeHandle } from 'react';\nimport { message, Divider } from 'antd';\nimport { v4 as uuidV4 } from 'uuid';\nimport copy from 'copy-to-clipboard';\nimport { XProvider } from '@ant-design/x';\nimport { XAiContext } from '@/context/AiProviderContext';\nimport { XAiProviderProps, XAiProviderHandle } from '@/types/XAiProvider';\nimport useAgentGenerator from '@/hooks/useAgentGenerator';\nimport userIcon from '@/assets/user.png';\n\nconst XAiProvider = forwardRef<XAiProviderHandle, XAiProviderProps>(({\n url,\n token,\n config,\n providerId = 'defaultId',\n onSuccess,\n onError,\n onMessage,\n children,\n}, ref) => {\n // 使用 useAgentGenerator Hook 管理消息状态\n const {\n appInfo,\n chat,\n stopChat,\n reChat,\n initPrologue,\n loadMoreSessions,\n sessionPagination,\n sessionList,\n messages,\n loading,\n setCurrentSessionId,\n setCurrentSessionDetail,\n setMessages\n } = useAgentGenerator({ url, token, config, onError, onSuccess, onMessage });\n\n const { appName, icon } = appInfo || {};\n\n useImperativeHandle(ref, () => ({\n chat,\n stopChat,\n reChat,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n setMessages,\n setCurrentSessionDetail,\n }), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSessionDetail]);\n\n // 发送消息\n const handleSendMessage = (_type: string, content: string) => {\n chat(content);\n };\n\n // 清空消息\n const handleClearMessage = () => {\n stopChat(); // 停止聊天\n setMessages([]); // 清空所有消息\n initPrologue(); // 初始化开场白和预置问题\n setCurrentSessionId(uuidV4()); // 设置会话 id\n };\n \n\n // 工具栏按钮点击\n const handleActions = (index: number, actionData: any) => {\n const { content, id } = actionData || {};\n const { text = '' } = content;\n switch (index) {\n case 0:\n reChat();\n break;\n case 1:\n copy(text);\n message.success('复制成功');\n break;\n case 2: {\n const idx = messages.findIndex((item) => item.id === id);\n if (idx >= 0) {\n // 删除该条消息及建议类消息\n if (messages.length - idx <= 2) {\n setMessages((prev) => prev.filter((item) => item.id !== id && item.type !== 'SuggestionMessage'));\n } else {\n // 非最新消息 只删除该条消息\n setMessages((prev) => prev.filter((item) => item.id !== id));\n }\n message.success('删除成功');\n }\n break;\n }\n }\n };\n\n // 建议消息点击\n const handleSuggestMessageClick = (_item: any, id: string) => {\n setMessages((prev: any[]) => prev.filter((m: any) => m.id !== id));\n };\n\n // 切换会话\n const handleActiveChange = (key: string) => {\n setCurrentSessionDetail(key);\n };\n\n const ToolTip = (messageData: any) => {\n const finalResult = (messageData?.think || []).find((item: any) => item.actionName === 'FINISHED');\n if (!finalResult) return null;\n const { cost, token: tokenCount } = finalResult.extra || {};\n if (!cost && !token) return null;\n return (\n <div style={{ display: 'flex', alignItems: 'center', fontSize: '12px', color: '#949494', flex: 1, paddingRight: '40px' }}>\n { (cost !== undefined && cost !== null) && <div>{cost}s</div> }\n { tokenCount && <Divider type=\"vertical\" /> }\n { tokenCount && <div>{ tokenCount } tokens</div> }\n </div>\n );\n };\n\n return (\n <XProvider>\n <XAiContext.Provider value={{\n avatar: <img src={icon} alt=\"智能体头像\" />,\n userAvatar: <img src={userIcon} alt=\"用户头像\" />,\n emptyStateImage: icon,\n emptyStateText: appName,\n footerTips: '内容由AI生成,无法确保真实准确,仅供参考',\n providerId,\n sessionList,\n sessionTotal: sessionPagination.total, \n token,\n messages,\n loading,\n error: null,\n messageTooltip: ToolTip,\n loadMoreSessions,\n onSend: handleSendMessage,\n onClear: handleClearMessage,\n onStop: stopChat,\n onActiveChange: handleActiveChange,\n onSuggestMessageClick: handleSuggestMessageClick,\n onMessagesActionsCallback: handleActions,\n isInProvider: true,\n }}\n >\n <div style={{\n display: 'flex',\n height: '100%'\n }}>\n {children}\n </div>\n </XAiContext.Provider>\n </XProvider>\n );\n});\n\nexport default XAiProvider;\n"],
5
+ "mappings": "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",
6
6
  "names": ["useAgentGenerator", "uuidV4", "copy", "React", "userIcon"]
7
7
  }
@@ -1,9 +1,11 @@
1
1
  /// <reference types="react" />
2
- import type { XAiChatbotProps } from "../types/XAiChatbot";
3
- export interface XAiContextType extends XAiChatbotProps {
2
+ import type { XAiChatbotProps, XAiConversationsProps } from "../types";
3
+ export interface XAiContextType extends Omit<XAiChatbotProps, 'onScroll'>, Omit<XAiConversationsProps, 'onScroll'> {
4
+ onScroll?: (event: React.UIEvent<HTMLDivElement>) => void;
4
5
  providerId?: string;
5
6
  token: string;
6
7
  error: string | null;
8
+ loadMoreSessions?: () => void;
7
9
  isInProvider?: boolean;
8
10
  }
9
11
  declare const XAiContext: React.Context<XAiContextType>;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/context/AiProviderContext.tsx"],
4
- "sourcesContent": ["import { createContext, useContext } from 'react';\nimport type { XAiChatbotProps } from '@/types/XAiChatbot';\n\n// 定义 context 的类型\nexport interface XAiContextType extends XAiChatbotProps {\n providerId?: string;\n token: string;\n error: string | null;\n // 标识是否在真实的 Provider 中\n isInProvider?: boolean;\n}\n\n// 默认 context 值\nconst defaultContextValue: XAiContextType = {\n providerId: undefined,\n token: '',\n messages: [],\n loading: false,\n error: null,\n emptyStateImage: '',\n emptyStateText: '',\n\n isInProvider: false,\n};\n\n// 安全地创建 context,避免 React 为 null 的情况\nconst XAiContext: React.Context<XAiContextType> = (() => {\n try {\n return createContext<XAiContextType>(defaultContextValue);\n } catch {\n // 如果 React 不可用,创建一个 fallback\n // eslint-disable-next-line\n const fallback: React.Context<XAiContextType> = {} as React.Context<XAiContextType>;\n return fallback;\n }\n})();\n\nexport { XAiContext };\n\n// 改进的 useXAi hook\nexport const useXAi = () => {\n try {\n const context = useContext(XAiContext);\n\n // 如果没有在 Provider 中,返回 undefined\n if (!context?.isInProvider) {\n return undefined;\n }\n\n return context;\n } catch {\n // 如果 useContext 失败,返回 undefined\n return undefined;\n }\n};\n\n// 获取所有可用的 Provider ID\nexport const useXAiProviders = () => {\n try {\n const context = useContext(XAiContext);\n\n // 如果没有在 Provider 中,返回空数组\n if (!context?.isInProvider) {\n return [];\n }\n\n // 返回当前 Provider 的 ID(如果有的话)\n return context.providerId ? [context.providerId] : [];\n } catch {\n return [];\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;AAa1C,IAAM,sBAAsC;AAAA,EAC1C,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU,CAAC;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAEhB,cAAc;AAChB;AAGA,IAAM,cAA6C,MAAM;AACvD,MAAI;AACF,eAAO,4BAA8B,mBAAmB;AAAA,EAC1D,QAAE;AAGA,UAAM,WAA0C,CAAC;AACjD,WAAO;AAAA,EACT;AACF,GAAG;AAKI,IAAM,SAAS,MAAM;AAC1B,MAAI;AACF,UAAM,cAAU,yBAAW,UAAU;AAGrC,QAAI,EAAC,mCAAS,eAAc;AAC1B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,QAAE;AAEA,WAAO;AAAA,EACT;AACF;AAGO,IAAM,kBAAkB,MAAM;AACnC,MAAI;AACF,UAAM,cAAU,yBAAW,UAAU;AAGrC,QAAI,EAAC,mCAAS,eAAc;AAC1B,aAAO,CAAC;AAAA,IACV;AAGA,WAAO,QAAQ,aAAa,CAAC,QAAQ,UAAU,IAAI,CAAC;AAAA,EACtD,QAAE;AACA,WAAO,CAAC;AAAA,EACV;AACF;",
4
+ "sourcesContent": ["import { createContext, useContext } from 'react';\nimport type { XAiChatbotProps, XAiConversationsProps } from '@/types';\n\n// 定义 context 的类型\n// 解决 onScroll 冲突,显式声明 onScroll 类型\nexport interface XAiContextType extends Omit<XAiChatbotProps, 'onScroll'>, Omit<XAiConversationsProps, 'onScroll'> {\n onScroll?: (event: React.UIEvent<HTMLDivElement>) => void;\n providerId?: string;\n token: string;\n error: string | null;\n // 加载更多 session\n loadMoreSessions?: () => void;\n // 标识是否在真实的 Provider 中\n isInProvider?: boolean;\n}\n\n// 默认 context 值\nconst defaultContextValue: XAiContextType = {\n providerId: undefined,\n token: '',\n messages: [],\n loading: false,\n error: null,\n emptyStateImage: '',\n emptyStateText: '',\n\n isInProvider: false,\n};\n\n// 安全地创建 context,避免 React 为 null 的情况\nconst XAiContext: React.Context<XAiContextType> = (() => {\n try {\n return createContext<XAiContextType>(defaultContextValue);\n } catch {\n // 如果 React 不可用,创建一个 fallback\n // eslint-disable-next-line\n const fallback: React.Context<XAiContextType> = {} as React.Context<XAiContextType>;\n return fallback;\n }\n})();\n\nexport { XAiContext };\n\n// 改进的 useXAi hook\nexport const useXAi = () => {\n try {\n const context = useContext(XAiContext);\n\n // 如果没有在 Provider 中,返回 undefined\n if (!context?.isInProvider) {\n return undefined;\n }\n\n return context;\n } catch {\n // 如果 useContext 失败,返回 undefined\n return undefined;\n }\n};\n\n// 获取所有可用的 Provider ID\nexport const useXAiProviders = () => {\n try {\n const context = useContext(XAiContext);\n\n // 如果没有在 Provider 中,返回空数组\n if (!context?.isInProvider) {\n return [];\n }\n\n // 返回当前 Provider 的 ID(如果有的话)\n return context.providerId ? [context.providerId] : [];\n } catch {\n return [];\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;AAiB1C,IAAM,sBAAsC;AAAA,EAC1C,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU,CAAC;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAEhB,cAAc;AAChB;AAGA,IAAM,cAA6C,MAAM;AACvD,MAAI;AACF,eAAO,4BAA8B,mBAAmB;AAAA,EAC1D,QAAE;AAGA,UAAM,WAA0C,CAAC;AACjD,WAAO;AAAA,EACT;AACF,GAAG;AAKI,IAAM,SAAS,MAAM;AAC1B,MAAI;AACF,UAAM,cAAU,yBAAW,UAAU;AAGrC,QAAI,EAAC,mCAAS,eAAc;AAC1B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,QAAE;AAEA,WAAO;AAAA,EACT;AACF;AAGO,IAAM,kBAAkB,MAAM;AACnC,MAAI;AACF,UAAM,cAAU,yBAAW,UAAU;AAGrC,QAAI,EAAC,mCAAS,eAAc;AAC1B,aAAO,CAAC;AAAA,IACV;AAGA,WAAO,QAAQ,aAAa,CAAC,QAAQ,UAAU,IAAI,CAAC;AAAA,EACtD,QAAE;AACA,WAAO,CAAC;AAAA,EACV;AACF;",
6
6
  "names": []
7
7
  }