@ai-group/chat-sdk 2.1.1 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +2 -2
- package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js +3 -4
- package/dist/cjs/components/XAdkChatbot/components/FunctionCallRender/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +66 -99
- package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.js +119 -0
- package/dist/cjs/components/XAdkSender/XAdkSender.stories.js.map +7 -0
- package/dist/cjs/components/XAdkSender/index.d.ts +4 -0
- package/dist/cjs/components/XAdkSender/index.js +430 -0
- package/dist/cjs/components/XAdkSender/index.js.map +7 -0
- package/dist/cjs/components/XAdkSender/styles.d.ts +56 -0
- package/dist/cjs/components/XAdkSender/styles.js +340 -0
- package/dist/cjs/components/XAdkSender/styles.js.map +7 -0
- package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js +5 -5
- package/dist/cjs/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +2 -2
- package/dist/cjs/components/XAdkWebProvider/index.js +12 -6
- package/dist/cjs/components/XAdkWebProvider/index.js.map +2 -2
- package/dist/cjs/components/XAiConversations/index.js +1 -1
- package/dist/cjs/components/XAiConversations/index.js.map +2 -2
- package/dist/cjs/components/XAiConversations/styles.d.ts +1 -0
- package/dist/cjs/components/XAiConversations/styles.js +3 -0
- package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
- package/dist/cjs/components/XAiSender/XAiSender.stories.js +1 -1
- package/dist/cjs/components/XAiSender/XAiSender.stories.js.map +2 -2
- package/dist/cjs/components/XAiSender/index.js +17 -35
- package/dist/cjs/components/XAiSender/index.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.d.ts +7 -16
- package/dist/cjs/hooks/useADKChat.js +115 -32
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/hooks/useAgentGenerator.js +1 -1
- package/dist/cjs/hooks/useAgentGenerator.js.map +2 -2
- package/dist/cjs/services/api.d.ts +5 -5
- package/dist/cjs/services/api.js +6 -9
- package/dist/cjs/services/api.js.map +2 -2
- package/dist/cjs/types/XAdkChatbot.d.ts +21 -3
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkProvider.d.ts +35 -9
- package/dist/cjs/types/XAdkProvider.js.map +1 -1
- package/dist/cjs/types/XAdkSender.d.ts +49 -0
- package/dist/cjs/types/XAdkSender.js +18 -0
- package/dist/cjs/types/XAdkSender.js.map +7 -0
- package/dist/cjs/types/XAiProvider.d.ts +1 -28
- package/dist/cjs/types/XAiProvider.js.map +2 -2
- package/dist/cjs/types/XAiSender.d.ts +2 -0
- package/dist/cjs/types/XAiSender.js.map +1 -1
- package/dist/cjs/types/common.d.ts +6 -0
- package/dist/cjs/types/common.js +18 -0
- package/dist/cjs/types/common.js.map +7 -0
- package/dist/cjs/types/index.d.ts +2 -0
- package/dist/cjs/types/index.js +5 -1
- package/dist/cjs/types/index.js.map +2 -2
- package/dist/cjs/utils/chat.d.ts +1 -1
- package/dist/cjs/utils/umdEntry.d.ts +9 -9
- package/dist/cjs/utils/umdEntry.js +1 -0
- package/dist/cjs/utils/umdEntry.js.map +2 -2
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.d.ts +2 -2
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js +3 -3
- package/dist/esm/components/XAdkChatbot/components/FunctionCallRender/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +80 -126
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/XAdkSender.stories.d.ts +6 -0
- package/dist/esm/components/XAdkSender/XAdkSender.stories.js +126 -0
- package/dist/esm/components/XAdkSender/XAdkSender.stories.js.map +1 -0
- package/dist/esm/components/XAdkSender/index.d.ts +4 -0
- package/dist/esm/components/XAdkSender/index.js +589 -0
- package/dist/esm/components/XAdkSender/index.js.map +1 -0
- package/dist/esm/components/XAdkSender/styles.d.ts +56 -0
- package/dist/esm/components/XAdkSender/styles.js +50 -0
- package/dist/esm/components/XAdkSender/styles.js.map +1 -0
- package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js +10 -11
- package/dist/esm/components/XAdkWebProvider/XAdkWebProvider.stories.js.map +1 -1
- package/dist/esm/components/XAdkWebProvider/index.js +25 -10
- package/dist/esm/components/XAdkWebProvider/index.js.map +1 -1
- package/dist/esm/components/XAiConversations/index.js +1 -0
- package/dist/esm/components/XAiConversations/index.js.map +1 -1
- package/dist/esm/components/XAiConversations/styles.d.ts +1 -0
- package/dist/esm/components/XAiConversations/styles.js +15 -14
- package/dist/esm/components/XAiConversations/styles.js.map +1 -1
- package/dist/esm/components/XAiSender/XAiSender.stories.js +1 -1
- package/dist/esm/components/XAiSender/XAiSender.stories.js.map +1 -1
- package/dist/esm/components/XAiSender/index.js +16 -22
- package/dist/esm/components/XAiSender/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.d.ts +7 -16
- package/dist/esm/hooks/useADKChat.js +212 -88
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/hooks/useAgentGenerator.js +1 -1
- package/dist/esm/hooks/useAgentGenerator.js.map +1 -1
- package/dist/esm/services/api.d.ts +5 -5
- package/dist/esm/services/api.js +8 -11
- package/dist/esm/services/api.js.map +1 -1
- package/dist/esm/types/XAdkChatbot.d.ts +21 -3
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkProvider.d.ts +35 -9
- package/dist/esm/types/XAdkProvider.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +49 -0
- package/dist/esm/types/XAdkSender.js +2 -0
- package/dist/esm/types/XAdkSender.js.map +1 -0
- package/dist/esm/types/XAiProvider.d.ts +1 -28
- package/dist/esm/types/XAiProvider.js +0 -7
- package/dist/esm/types/XAiProvider.js.map +1 -1
- package/dist/esm/types/XAiSender.d.ts +2 -0
- package/dist/esm/types/XAiSender.js.map +1 -1
- package/dist/esm/types/common.d.ts +6 -0
- package/dist/esm/types/common.js +2 -0
- package/dist/esm/types/common.js.map +1 -0
- package/dist/esm/types/index.d.ts +2 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/utils/chat.d.ts +1 -1
- package/dist/esm/utils/chat.js +4 -4
- package/dist/esm/utils/chat.js.map +1 -1
- package/dist/esm/utils/umdEntry.d.ts +9 -9
- package/dist/esm/utils/umdEntry.js +1 -1
- package/dist/esm/utils/umdEntry.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -38,6 +38,9 @@ var slideOutRight = import_css.keyframes`
|
|
|
38
38
|
`;
|
|
39
39
|
var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
40
40
|
// 静态样式
|
|
41
|
+
conversationsWrapper: import_css.css`
|
|
42
|
+
overflow: hidden;
|
|
43
|
+
`,
|
|
41
44
|
capWrapper: import_css.css`
|
|
42
45
|
padding: 12px 16px;
|
|
43
46
|
display: flex;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAiConversations/styles.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from 'react';\nimport { css, keyframes } 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\nconst slideInRight = keyframes`\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutRight = keyframes`\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n capWrapper: css`\n padding: 12px 16px;\n display: flex;\n align-items: center;\n `,\n\n capShape: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 40px;\n margin-left: 16px;\n background: #FFFFFF;\n box-shadow: 0px 4px 16px 0px rgba(127,135,166,0.08);\n border-radius: 24px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n transition: box-shadow 0.2s, border-color 0.2s;\n cursor: pointer;\n /* &:hover {\n box-shadow: 0px 4px 24px 0px rgba(127,135,166,0.16);\n border-color: ${primaryBlue};\n } */\n `,\n\n capIcon: css`\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n img {\n width: 17px;\n }\n\n &:hover {\n background: #F2F2F2;\n border-radius: 50%;\n }\n `,\n\n addChatBtn: css`\n width: 256px;\n height: 40px;\n margin: 17px auto 24px;\n background: #FFFFFF;\n border-radius: 20px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #343434;\n\n &:hover {\n color: #3961F2;\n }\n\n &:active {\n color: #0A3BEE;\n }\n `,\n\n tipTitle: css`\n font-size: 12px;\n color: #949494;\n padding-left: 24px;\n `,\n\n fWrapper: css`\n background: #F8FBFF;\n padding: 16px 0 13px;\n width: 280px;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n `,\n\n nWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 280px;\n height: 100%;\n z-index: 1000;\n transition: left 0.3s ease;\n background: #F8FBFF;\n padding: 16px 0 13px;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n `,\n\n mask: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.15);\n z-index: 999;\n cursor: pointer;\n `,\n\n fheaderWrapper: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 11px 0 16px;\n `,\n\n scrollList: css`\n max-height: calc(100vh - 120px); /* 120px为头部高度,可根据实际调整 */\n padding-bottom: 15px;\n overflow-y: auto;\n\n /* 隐藏滚动条(Chrome, Edge, Safari) */\n &::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none;\n background: transparent;\n }\n\n /* 隐藏滚动条(Firefox) */\n scrollbar-width: none;\n\n /* 隐藏滚动条(IE/Edge) */\n -ms-overflow-style: none;\n `,\n\n slideIn: css`\n animation: ${slideInRight} 0.3s forwards;\n `,\n slideOut: css`\n animation: ${slideOutRight} 0.3s forwards;\n `,\n\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-conversations .ant-conversations-item-active {\n background: rgba(57,97,242,0.08);\n }\n\n .ant-conversations .ant-conversations-item-active .ant-conversations-label {\n color: #3961F2;\n }\n `}\n />\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA+B;AAC/B,mBAAyC;AACzC,oBAAgC;
|
|
4
|
+
"sourcesContent": ["import React from 'react';\nimport { css, keyframes } 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\nconst slideInRight = keyframes`\n from { transform: translateX(-100%); opacity: 0; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst slideOutRight = keyframes`\n from { transform: translateX(0); opacity: 1; }\n to { transform: translateX(-100%); opacity: 0; }\n`;\n\nexport const useStyles = withBasicStyles(() => ({\n // 静态样式\n conversationsWrapper: css`\n overflow: hidden;\n `,\n\n capWrapper: css`\n padding: 12px 16px;\n display: flex;\n align-items: center;\n `,\n\n capShape: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 80px;\n height: 40px;\n margin-left: 16px;\n background: #FFFFFF;\n box-shadow: 0px 4px 16px 0px rgba(127,135,166,0.08);\n border-radius: 24px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n transition: box-shadow 0.2s, border-color 0.2s;\n cursor: pointer;\n /* &:hover {\n box-shadow: 0px 4px 24px 0px rgba(127,135,166,0.16);\n border-color: ${primaryBlue};\n } */\n `,\n\n capIcon: css`\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n img {\n width: 17px;\n }\n\n &:hover {\n background: #F2F2F2;\n border-radius: 50%;\n }\n `,\n\n addChatBtn: css`\n width: 256px;\n height: 40px;\n margin: 17px auto 24px;\n background: #FFFFFF;\n border-radius: 20px;\n border: 1px solid #E7E7E7;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #343434;\n\n &:hover {\n color: #3961F2;\n }\n\n &:active {\n color: #0A3BEE;\n }\n `,\n\n tipTitle: css`\n font-size: 12px;\n color: #949494;\n padding-left: 24px;\n `,\n\n fWrapper: css`\n background: #F8FBFF;\n padding: 16px 0 13px;\n width: 280px;\n height: 100%;\n box-sizing: border-box;\n position: relative;\n `,\n\n nWrapper: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 280px;\n height: 100%;\n z-index: 1000;\n transition: left 0.3s ease;\n background: #F8FBFF;\n padding: 16px 0 13px;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);\n `,\n\n mask: css`\n position: absolute;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: rgba(0, 0, 0, 0.15);\n z-index: 999;\n cursor: pointer;\n `,\n\n fheaderWrapper: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 11px 0 16px;\n `,\n\n scrollList: css`\n max-height: calc(100vh - 120px); /* 120px为头部高度,可根据实际调整 */\n padding-bottom: 15px;\n overflow-y: auto;\n\n /* 隐藏滚动条(Chrome, Edge, Safari) */\n &::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none;\n background: transparent;\n }\n\n /* 隐藏滚动条(Firefox) */\n scrollbar-width: none;\n\n /* 隐藏滚动条(IE/Edge) */\n -ms-overflow-style: none;\n `,\n\n slideIn: css`\n animation: ${slideInRight} 0.3s forwards;\n `,\n slideOut: css`\n animation: ${slideOutRight} 0.3s forwards;\n `,\n\n}));\n\nexport const GlobalStyle: React.FC = () => (\n <Global\n styles={globalCss`\n .ant-conversations .ant-conversations-item-active {\n background: rgba(57,97,242,0.08);\n }\n\n .ant-conversations .ant-conversations-item-active .ant-conversations-label {\n color: #3961F2;\n }\n `}\n />\n);\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA+B;AAC/B,mBAAyC;AACzC,oBAAgC;AAuK9B;AArKF,IAAM,cAAc;AAMpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAKrB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAKf,IAAM,gBAAY,+BAAgB,OAAO;AAAA;AAAA,EAE9C,sBAAsB;AAAA;AAAA;AAAA,EAItB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAgBU;AAAA;AAAA;AAAA,EAIpB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBT,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaV,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWN,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBZ,SAAS;AAAA,iBACM;AAAA;AAAA,EAEf,UAAU;AAAA,iBACK;AAAA;AAGjB,EAAE;AAEK,IAAM,cAAwB,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ,aAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV;",
|
|
6
6
|
"names": ["globalCss"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAiSender/XAiSender.stories.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useState } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport type { Attachment } from '@ant-design/x/es/attachments';\nimport XAiSender from '.';\n\nconst meta: Meta<typeof XAiSender> = {\n title: 'AI组件/XAiSender 输入框',\n component: XAiSender,\n parameters: {\n layout: 'centered',\n },\n tags: ['autodocs'],\n argTypes: {},\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 基础用法\nconst BasicUsageStory = () => {\n const [files, setFiles] = useState<Attachment[]>([]);\n const [content, setContent] = useState('');\n const [loading, setLoading] = useState(false);\n\n // 模拟清空数据\n const handleClear = () => {\n console.info('clear');\n };\n\n // 模拟输入\n const handleChange = (text: string) => {\n setContent(text);\n };\n\n // 模拟快捷短语点击\n const handleSendMessage = (obj: any) => {\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAGhC,eAAsB;AA4ChB;AA1CN,IAAM,OAA+B;AAAA,EACnC,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CAAC;AACb;AAEA,IAAO,4BAAQ;AAIf,IAAM,kBAAkB,MAAM;AAC5B,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAG5C,QAAM,cAAc,MAAM;AACxB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAGA,QAAM,eAAe,CAAC,SAAiB;AACrC,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,oBAAoB,CAAC,QAAa;AACtC,
|
|
4
|
+
"sourcesContent": ["import React, { useState } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react-vite';\nimport type { Attachment } from '@ant-design/x/es/attachments';\nimport XAiSender from '.';\n\nconst meta: Meta<typeof XAiSender> = {\n title: 'AI组件/XAiSender 输入框',\n component: XAiSender,\n parameters: {\n layout: 'centered',\n },\n tags: ['autodocs'],\n argTypes: {},\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\n// 基础用法\nconst BasicUsageStory = () => {\n const [files, setFiles] = useState<Attachment[]>([]);\n const [content, setContent] = useState('');\n const [loading, setLoading] = useState(false);\n\n // 模拟清空数据\n const handleClear = () => {\n console.info('clear');\n };\n\n // 模拟输入\n const handleChange = (text: string) => {\n setContent(text);\n };\n\n // 模拟快捷短语点击\n const handleSendMessage = (obj: any) => {\n console.log(obj);\n setLoading(true);\n setTimeout(() => {\n setContent('');\n setFiles([]);\n setLoading(false);\n }, 2000);\n };\n\n return (\n <div style={{ width: 440, border: '1px solid #eee', padding: 20 }}>\n <XAiSender\n loading={loading}\n value={content}\n enableUpload\n files={files}\n onChangeFiles={setFiles}\n uploadRequest={({ file, onProgress, onSuccess }) => {\n console.info(file);\n onProgress?.({\n percent: 50,\n });\n setTimeout(() => {\n onSuccess?.({});\n }, 1000);\n }}\n onClear={handleClear}\n onChange={handleChange}\n onSubmit={handleSendMessage}\n onStop={handleClear}\n footerTips=\"内容由AI生成,无法确保真实准确,仅供参考\"\n />\n </div>\n );\n};\n\nexport const 基础用法: Story = {\n render: BasicUsageStory,\n args: {},\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAgC;AAGhC,eAAsB;AA4ChB;AA1CN,IAAM,OAA+B;AAAA,EACnC,OAAO;AAAA,EACP,WAAW,SAAAA;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,UAAU;AAAA,EACjB,UAAU,CAAC;AACb;AAEA,IAAO,4BAAQ;AAIf,IAAM,kBAAkB,MAAM;AAC5B,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAG5C,QAAM,cAAc,MAAM;AACxB,YAAQ,KAAK,OAAO;AAAA,EACtB;AAGA,QAAM,eAAe,CAAC,SAAiB;AACrC,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,oBAAoB,CAAC,QAAa;AACtC,YAAQ,IAAI,GAAG;AACf,eAAW,IAAI;AACf,eAAW,MAAM;AACf,iBAAW,EAAE;AACb,eAAS,CAAC,CAAC;AACX,iBAAW,KAAK;AAAA,IAClB,GAAG,GAAI;AAAA,EACT;AAEA,SACE,4CAAC,SAAI,OAAO,EAAE,OAAO,KAAK,QAAQ,kBAAkB,SAAS,GAAG,GAC9D;AAAA,IAAC,SAAAA;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP,cAAY;AAAA,MACZ;AAAA,MACA,eAAe;AAAA,MACf,eAAe,CAAC,EAAE,MAAM,YAAY,UAAU,MAAM;AAClD,gBAAQ,KAAK,IAAI;AACjB,iDAAa;AAAA,UACX,SAAS;AAAA,QACX;AACA,mBAAW,MAAM;AACf,iDAAY,CAAC;AAAA,QACf,GAAG,GAAI;AAAA,MACT;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAW;AAAA;AAAA,EACb,GACF;AAEJ;AAEO,IAAM,OAAc;AAAA,EACzB,QAAQ;AAAA,EACR,MAAM,CAAC;AACT;",
|
|
6
6
|
"names": ["XAiSender"]
|
|
7
7
|
}
|
|
@@ -63,18 +63,11 @@ var XAiSender = (props) => {
|
|
|
63
63
|
const loading = mergedProps.loading || propLoading;
|
|
64
64
|
const [clearPopoverVisible, setClearPopoverVisible] = (0, import_react.useState)(false);
|
|
65
65
|
const styles = (0, import_styles.useStyles)();
|
|
66
|
-
const uploading = files == null ? void 0 : files.some((file) => file.status === "uploading");
|
|
67
66
|
const handleSend = () => {
|
|
68
|
-
if (
|
|
69
|
-
import_antd.message.warning("文件正在上传中");
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const hasText = value && value.trim();
|
|
73
|
-
const hasFiles = files == null ? void 0 : files.length;
|
|
74
|
-
if (hasText || hasFiles) {
|
|
67
|
+
if (value && value.trim()) {
|
|
75
68
|
onSubmit == null ? void 0 : onSubmit({
|
|
76
69
|
text: value,
|
|
77
|
-
files
|
|
70
|
+
files: files || []
|
|
78
71
|
});
|
|
79
72
|
}
|
|
80
73
|
};
|
|
@@ -170,7 +163,7 @@ var XAiSender = (props) => {
|
|
|
170
163
|
value,
|
|
171
164
|
className: styles.sendWrapper,
|
|
172
165
|
placeholder: "继续对话...",
|
|
173
|
-
disabled
|
|
166
|
+
disabled,
|
|
174
167
|
loading,
|
|
175
168
|
ref: senderRef,
|
|
176
169
|
header: enableUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -185,40 +178,29 @@ var XAiSender = (props) => {
|
|
|
185
178
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
186
179
|
import_x.Attachments,
|
|
187
180
|
{
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
},
|
|
199
|
-
getDropContainer: () => {
|
|
200
|
-
var _a;
|
|
201
|
-
return (_a = senderRef.current) == null ? void 0 : _a.nativeElement;
|
|
202
|
-
}
|
|
181
|
+
ref: attachmentsRef,
|
|
182
|
+
customRequest: uploadRequest,
|
|
183
|
+
multiple: true,
|
|
184
|
+
items: files,
|
|
185
|
+
onChange: ({ fileList }) => {
|
|
186
|
+
onChangeFiles == null ? void 0 : onChangeFiles(fileList);
|
|
187
|
+
},
|
|
188
|
+
getDropContainer: () => {
|
|
189
|
+
var _a;
|
|
190
|
+
return (_a = senderRef.current) == null ? void 0 : _a.nativeElement;
|
|
203
191
|
}
|
|
204
192
|
}
|
|
205
193
|
)
|
|
206
194
|
}
|
|
207
195
|
),
|
|
208
|
-
|
|
209
|
-
const { SendButton, LoadingButton } = info
|
|
210
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Space, { size: "small", children: [
|
|
196
|
+
suffix: (_, info) => {
|
|
197
|
+
const { SendButton, LoadingButton } = info.components;
|
|
198
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_antd.Space, { size: "small", style: { paddingBottom: "5px" }, children: [
|
|
211
199
|
enableUpload && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
212
200
|
uploadButton,
|
|
213
201
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.divider })
|
|
214
202
|
] }),
|
|
215
|
-
loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
216
|
-
LoadingButton,
|
|
217
|
-
{
|
|
218
|
-
onClick: () => onStop == null ? void 0 : onStop(),
|
|
219
|
-
className: styles.stopButton
|
|
220
|
-
}
|
|
221
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
203
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoadingButton, { onClick: () => onStop == null ? void 0 : onStop(), className: styles.stopButton }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
222
204
|
SendButton,
|
|
223
205
|
{
|
|
224
206
|
className: styles.sendButton,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAiSender/index.tsx"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import React, {\n useRef,\n useState,\n} from 'react';\nimport {\n Attachments,\n Sender,\n} from '@ant-design/x';\nimport {\n Button,\n GetRef,\n Popover,\n Space,\n Tooltip,\n} from 'antd';\nimport {\n ArrowUpOutlined,\n ClearOutlined,\n PlusCircleOutlined,\n} from '@ant-design/icons';\nimport clsx from 'clsx';\nimport { AttachmentsRef } from '@ant-design/x/es/attachments';\nimport {\n XAiSenderProps,\n} from '@/types';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { useStyles } from './styles';\n\nconst XAiSender: React.FC<XAiSenderProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n const {\n footerTips,\n clearBtnShow,\n value,\n onChange,\n onClear,\n onStop,\n onSubmit,\n files,\n enableUpload,\n onChangeFiles,\n uploadRequest,\n loading: propLoading = false,\n disabled,\n ...resetProps\n } = mergedProps as XAiSenderProps;\n const senderRef = useRef<GetRef<typeof Sender>>(null);\n const attachmentsRef = useRef<AttachmentsRef>(null);\n\n // 如果在 Provider 中,使用 Provider 的状态\n const loading = mergedProps.loading || propLoading;\n const [clearPopoverVisible, setClearPopoverVisible] = useState(false); // 气泡卡片显隐藏\n const styles = useStyles();\n\n // 触发发送\n const handleSend = () => {\n if (value && value.trim()) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSubmit?.({\n text: value,\n files: files || [],\n });\n }\n };\n\n // 文件上传按钮引用\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 点击清除按钮\n const handleClear = () => {\n setClearPopoverVisible(true);\n };\n\n // 取消清除\n const cancelClear = () => {\n setClearPopoverVisible(false);\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n setClearPopoverVisible(false);\n };\n\n // 清空按钮提示文案\n const clearConfirmContent = (\n <div className={styles.p('2px')}>\n <p className={clsx(styles.mb(14), styles.mt(0))}>确认清除所有聊天记录并重置会话!</p>\n <div className={styles.popoverFooter}>\n <Button size=\"small\" onClick={cancelClear}>\n 取消\n </Button>\n <Button size=\"small\" type=\"primary\" danger onClick={confirmClear}>\n 确认\n </Button>\n </div>\n </div>\n );\n\n // 自定义上传按钮\n const uploadButton = (\n <div className={styles.flexCenterGap2}>\n <Tooltip\n placement=\"top\"\n title=\"支持图片、文档等上传\"\n >\n <Button\n color=\"default\"\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n icon={<PlusCircleOutlined style={{ fontSize: 20, color: '#949494' }} />}\n onClick={() => {\n if (fileInputRef.current) {\n fileInputRef.current?.click();\n }\n }}\n />\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n onChange={(e) => {\n const fileList = e.target.files || [];\n if (!fileList.length) return;\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList[i];\n attachmentsRef.current?.upload(file);\n }\n e.target.value = '';\n }}\n style={{ display: 'none' }}\n accept=\"*/*\"\n />\n </Tooltip>\n </div>\n );\n\n return (\n <>\n <div className={styles.chatFooter}>\n <div className={clsx(styles.flex, styles.gap(8))}>\n {/* 清空按钮 */}\n {clearBtnShow && (\n <Popover\n content={clearConfirmContent}\n title=\"确认清空对话\"\n trigger=\"click\"\n open={clearPopoverVisible}\n onOpenChange={setClearPopoverVisible}\n >\n <div\n className={styles.clearBtn}\n style={{ border: '1px solid #E4E7EC', borderRadius: '50%', height: '35px', width: '35px' }}\n onClick={handleClear}\n >\n <ClearOutlined className={styles.text(16)} />\n </div>\n </Popover>\n )}\n {/* 普通文本输入 */}\n <Sender\n {...resetProps}\n value={value}\n className={styles.sendWrapper}\n placeholder=\"继续对话...\"\n disabled={disabled}\n loading={loading}\n ref={senderRef}\n header={enableUpload && (\n <Sender.Header\n closable={false}\n forceRender\n open={!!files?.length}\n styles={{\n content: { padding: 0 },\n }}\n >\n <Attachments\n ref={attachmentsRef}\n customRequest={uploadRequest}\n multiple\n items={files}\n // imageProps={{\n // preview: {\n // mask: true,\n // },\n // }}\n onChange={({ fileList }) => {\n onChangeFiles?.(fileList);\n }}\n getDropContainer={() => senderRef.current?.nativeElement}\n />\n </Sender.Header>\n )}\n suffix={(_, info) => {\n const { SendButton, LoadingButton } = info.components;\n return (\n <Space size=\"small\" style={{ paddingBottom: '5px' }}>\n {enableUpload && (\n <>\n {uploadButton}\n <div className={styles.divider} />\n </>\n )}\n {loading\n ? (\n <LoadingButton onClick={() => onStop?.()} className={styles.stopButton} />\n )\n : (\n <SendButton\n className={styles.sendButton}\n type=\"primary\"\n icon={<ArrowUpOutlined className={styles.text(20)} />}\n disabled={disabled}\n />\n )}\n </Space>\n );\n }}\n onChange={(v) => {\n onChange?.(v);\n }}\n onSubmit={handleSend}\n onCancel={() => {\n onStop?.();\n }}\n />\n </div>\n </div>\n { footerTips && <div className={styles.footerTips}>{footerTips}</div>}\n </>\n );\n};\n\nexport default XAiSender;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAGO;AACP,eAGO;AACP,kBAMO;AACP,mBAIO;AACP,kBAAiB;AAKjB,gCAAkC;AAClC,oBAA0B;AA8DpB;AA5DN,IAAM,YAAsC,CAAC,UAAU;AAErD,QAAM,EAAE,YAAY,QAAI,6CAAkB,KAAK;AAC/C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,cAAc;AAAA,IACvB;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,gBAAY,qBAA8B,IAAI;AACpD,QAAM,qBAAiB,qBAAuB,IAAI;AAGlD,QAAM,UAAU,YAAY,WAAW;AACvC,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,uBAAS,KAAK;AACpE,QAAM,aAAS,yBAAU;AAGzB,QAAM,aAAa,MAAM;AACvB,QAAI,SAAS,MAAM,KAAK,GAAG;AAEzB,2CAAW;AAAA,QACT,MAAM;AAAA,QACN,OAAO,SAAS,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAe,qBAAyB,IAAI;AAGlD,QAAM,cAAc,MAAM;AACxB,2BAAuB,IAAI;AAAA,EAC7B;AAGA,QAAM,cAAc,MAAM;AACxB,2BAAuB,KAAK;AAAA,EAC9B;AAGA,QAAM,eAAe,MAAM;AACzB;AACA,2BAAuB,KAAK;AAAA,EAC9B;AAGA,QAAM,sBACJ,6CAAC,SAAI,WAAW,OAAO,EAAE,KAAK,GAC5B;AAAA,gDAAC,OAAE,eAAW,YAAAA,SAAK,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,8BAAgB;AAAA,IACjE,6CAAC,SAAI,WAAW,OAAO,eACrB;AAAA,kDAAC,sBAAO,MAAK,SAAQ,SAAS,aAAa,gBAE3C;AAAA,MACA,4CAAC,sBAAO,MAAK,SAAQ,MAAK,WAAU,QAAM,MAAC,SAAS,cAAc,gBAElE;AAAA,OACF;AAAA,KACF;AAIF,QAAM,eACJ,4CAAC,SAAI,WAAW,OAAO,gBACrB;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAM;AAAA,MAEN;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,MAAM,4CAAC,mCAAmB,OAAO,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG;AAAA,YACrE,SAAS,MAAM;AAjHzB;AAkHY,kBAAI,aAAa,SAAS;AACxB,mCAAa,YAAb,mBAAsB;AAAA,cACxB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,UAAQ;AAAA,YACR,UAAU,CAAC,MAAM;AA3H3B;AA4HY,oBAAM,WAAW,EAAE,OAAO,SAAS,CAAC;AACpC,kBAAI,CAAC,SAAS;AAAQ;AACtB,uBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,sBAAM,OAAO,SAAS,CAAC;AACvB,qCAAe,YAAf,mBAAwB,OAAO;AAAA,cACjC;AACA,gBAAE,OAAO,QAAQ;AAAA,YACnB;AAAA,YACA,OAAO,EAAE,SAAS,OAAO;AAAA,YACzB,QAAO;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EACF,GACF;AAGF,SACE,4EACE;AAAA,gDAAC,SAAI,WAAW,OAAO,YACrB,uDAAC,SAAI,eAAW,YAAAA,SAAK,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,GAE5C;AAAA,sBACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,MAAM;AAAA,UACN,cAAc;AAAA,UAEd;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,OAAO;AAAA,cAClB,OAAO,EAAE,QAAQ,qBAAqB,cAAc,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,cACzF,SAAS;AAAA,cAET,sDAAC,8BAAc,WAAW,OAAO,KAAK,EAAE,GAAG;AAAA;AAAA,UAC7C;AAAA;AAAA,MACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA,WAAW,OAAO;AAAA,UAClB,aAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,QAAQ,gBACN;AAAA,YAAC,gBAAO;AAAA,YAAP;AAAA,cACC,UAAU;AAAA,cACV,aAAW;AAAA,cACX,MAAM,CAAC,EAAC,+BAAO;AAAA,cACf,QAAQ;AAAA,gBACN,SAAS,EAAE,SAAS,EAAE;AAAA,cACxB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,eAAe;AAAA,kBACf,UAAQ;AAAA,kBACR,OAAO;AAAA,kBAMP,UAAU,CAAC,EAAE,SAAS,MAAM;AAC1B,mEAAgB;AAAA,kBAClB;AAAA,kBACA,kBAAkB,MAAG;AAhMvC;AAgM0C,2CAAU,YAAV,mBAAmB;AAAA;AAAA;AAAA,cAC7C;AAAA;AAAA,UACF;AAAA,UAEF,QAAQ,CAAC,GAAG,SAAS;AACnB,kBAAM,EAAE,YAAY,cAAc,IAAI,KAAK;AAC3C,mBACE,6CAAC,qBAAM,MAAK,SAAQ,OAAO,EAAE,eAAe,MAAM,GAC/C;AAAA,8BACC,4EACG;AAAA;AAAA,gBACD,4CAAC,SAAI,WAAW,OAAO,SAAS;AAAA,iBAClC;AAAA,cAED,UAEG,4CAAC,iBAAc,SAAS,MAAM,oCAAY,WAAW,OAAO,YAAY,IAGxE;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,OAAO;AAAA,kBAClB,MAAK;AAAA,kBACL,MAAM,4CAAC,gCAAgB,WAAW,OAAO,KAAK,EAAE,GAAG;AAAA,kBACnD;AAAA;AAAA,cACF;AAAA,eAEN;AAAA,UAEJ;AAAA,UACA,UAAU,CAAC,MAAM;AACf,iDAAW;AAAA,UACb;AAAA,UACA,UAAU;AAAA,UACV,UAAU,MAAM;AACd;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,IACE,cAAc,4CAAC,SAAI,WAAW,OAAO,YAAa,sBAAW;AAAA,KACjE;AAEJ;AAEA,IAAO,oBAAQ;",
|
|
6
6
|
"names": ["clsx"]
|
|
7
7
|
}
|
|
@@ -1,24 +1,15 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import {
|
|
3
|
-
import type { Event, IMessage, Part } from "../types";
|
|
4
|
-
import { type Error, type Success, type SessionData } from "../types";
|
|
2
|
+
import { DebugOptions, FunctionCall, SendContent, SessionData, Event, IMessage, Part } from "../types";
|
|
5
3
|
import { type ChatConfig } from "../services/api";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
token: string;
|
|
11
|
-
type?: 'agentDebug' | 'appDebug';
|
|
12
|
-
onError?: (error: Error) => void;
|
|
13
|
-
onSuccess?: (data: Success) => void;
|
|
14
|
-
onMessage?: (content: string, data: Messages) => void;
|
|
15
|
-
}
|
|
16
|
-
declare function useADKChat({ url, token, config, type, onError, onMessage, onSuccess, }: DebugOptions): {
|
|
17
|
-
appInfo: ChatConfig;
|
|
18
|
-
startChat: (text: string) => Promise<void>;
|
|
4
|
+
declare function useADKChat({ url, token, config, type, onError, onMessage, onSuccess, onStream, }: DebugOptions): {
|
|
5
|
+
appInfo: ChatConfig | null;
|
|
6
|
+
startChat: ({ text, files, functionResponse }: SendContent) => Promise<void>;
|
|
7
|
+
reChat: () => void;
|
|
19
8
|
stopChat: () => void;
|
|
20
9
|
clearChat: () => void;
|
|
21
10
|
suggestChat: (text: string) => void;
|
|
11
|
+
confirmFnCall: (fnCall: FunctionCall, confirmed: boolean) => void;
|
|
12
|
+
initialized: boolean;
|
|
22
13
|
currentSessionId: string;
|
|
23
14
|
sessionList: SessionData[];
|
|
24
15
|
prologue: string;
|
|
@@ -55,22 +55,14 @@ function useADKChat({
|
|
|
55
55
|
type = "agentDebug",
|
|
56
56
|
onError,
|
|
57
57
|
onMessage,
|
|
58
|
-
onSuccess
|
|
58
|
+
onSuccess,
|
|
59
|
+
onStream
|
|
59
60
|
}) {
|
|
60
61
|
const [loading, setLoading] = (0, import_react.useState)(false);
|
|
61
62
|
const ctrl = (0, import_react.useRef)(null);
|
|
62
63
|
const { appNo } = config || {};
|
|
63
|
-
const [appInfo, setAppInfo] = (0, import_react.useState)(
|
|
64
|
-
|
|
65
|
-
appVersionNo: "",
|
|
66
|
-
appTheme: "",
|
|
67
|
-
appName: "",
|
|
68
|
-
onboardingInfo: {
|
|
69
|
-
prologue: "",
|
|
70
|
-
questionFiles: [],
|
|
71
|
-
suggested_questions: []
|
|
72
|
-
}
|
|
73
|
-
});
|
|
64
|
+
const [appInfo, setAppInfo] = (0, import_react.useState)(null);
|
|
65
|
+
const [initialized, setInitialized] = (0, import_react.useState)(false);
|
|
74
66
|
const [sessionList, setSessionList] = (0, import_react.useState)([]);
|
|
75
67
|
const [currentSessionId, setCurrentSessionId] = (0, import_react.useState)("");
|
|
76
68
|
const [sessionPagination, setSessionPagination] = (0, import_react.useState)({ total: 0, pageNum: 1, pageSize: import_constants.SESSION_PAGE_SIZE });
|
|
@@ -178,6 +170,8 @@ function useADKChat({
|
|
|
178
170
|
if ((_b = (_a = event == null ? void 0 : event.groundingMetadata) == null ? void 0 : _a.searchEntryPoint) == null ? void 0 : _b.renderedContent) {
|
|
179
171
|
msg.renderedContent = event.groundingMetadata.searchEntryPoint.renderedContent;
|
|
180
172
|
}
|
|
173
|
+
} else if (part.fileData) {
|
|
174
|
+
msg.fileData = [part.fileData];
|
|
181
175
|
} else if (part.functionCall) {
|
|
182
176
|
msg.functionCall = part.functionCall;
|
|
183
177
|
} else if (part.functionResponse) {
|
|
@@ -298,6 +292,7 @@ function useADKChat({
|
|
|
298
292
|
import_antd.message.warning(chunkJson.error);
|
|
299
293
|
return;
|
|
300
294
|
}
|
|
295
|
+
onStream == null ? void 0 : onStream(chunkJson);
|
|
301
296
|
if (chunkJson.content) {
|
|
302
297
|
if (chunkJson.content.role === "followup") {
|
|
303
298
|
processFollowupPart(chunkJson);
|
|
@@ -313,7 +308,11 @@ function useADKChat({
|
|
|
313
308
|
}
|
|
314
309
|
},
|
|
315
310
|
onclose: () => {
|
|
311
|
+
var _a;
|
|
316
312
|
setLoading(false);
|
|
313
|
+
if (textMsgRef.current) {
|
|
314
|
+
onMessage == null ? void 0 : onMessage(((_a = textMsgRef.current) == null ? void 0 : _a.text) || "", textMsgRef.current);
|
|
315
|
+
}
|
|
317
316
|
textMsgRef.current = null;
|
|
318
317
|
resolve();
|
|
319
318
|
},
|
|
@@ -326,18 +325,43 @@ function useADKChat({
|
|
|
326
325
|
});
|
|
327
326
|
});
|
|
328
327
|
}, [type, currentSessionId, processActionArtifact, processErrorMessage, processPart]);
|
|
329
|
-
const startChat = async (text) => {
|
|
328
|
+
const startChat = async ({ text = "", files = [], functionResponse }) => {
|
|
330
329
|
if (loading)
|
|
331
330
|
return;
|
|
332
|
-
if (!text.trim())
|
|
331
|
+
if (!text.trim() && !functionResponse)
|
|
333
332
|
return;
|
|
334
333
|
setSuggestedQuestions([]);
|
|
335
334
|
setMessages((prev) => {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
335
|
+
let temp = [...prev];
|
|
336
|
+
if (text.trim()) {
|
|
337
|
+
temp.push({
|
|
338
|
+
id: (0, import_uuid.v4)(),
|
|
339
|
+
role: "user",
|
|
340
|
+
text
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
if (files.length > 0) {
|
|
344
|
+
temp.push({
|
|
345
|
+
id: (0, import_uuid.v4)(),
|
|
346
|
+
role: "user",
|
|
347
|
+
fileData: files.map((file) => {
|
|
348
|
+
var _a, _b;
|
|
349
|
+
return {
|
|
350
|
+
displayName: file.name,
|
|
351
|
+
mimeType: (_a = file.response) == null ? void 0 : _a.mimeType,
|
|
352
|
+
fileUri: (_b = file.response) == null ? void 0 : _b.fileUrl
|
|
353
|
+
};
|
|
354
|
+
})
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
if (functionResponse) {
|
|
358
|
+
temp.push({
|
|
359
|
+
id: (0, import_uuid.v4)(),
|
|
360
|
+
role: "user",
|
|
361
|
+
functionResponse
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
return temp;
|
|
341
365
|
});
|
|
342
366
|
await sendMessageRequest({
|
|
343
367
|
stream: true,
|
|
@@ -347,17 +371,69 @@ function useADKChat({
|
|
|
347
371
|
parts: [{
|
|
348
372
|
text
|
|
349
373
|
}]
|
|
350
|
-
}
|
|
374
|
+
},
|
|
375
|
+
files: files.map((file) => {
|
|
376
|
+
var _a, _b, _c, _d, _e;
|
|
377
|
+
return {
|
|
378
|
+
fileName: (_a = file.response) == null ? void 0 : _a.fileName,
|
|
379
|
+
fileId: (_b = file.response) == null ? void 0 : _b.fileId,
|
|
380
|
+
tempUrl: (_c = file.response) == null ? void 0 : _c.fileUrl,
|
|
381
|
+
type: (_d = file.response) == null ? void 0 : _d.fileType,
|
|
382
|
+
mimeType: (_e = file.response) == null ? void 0 : _e.mimeType
|
|
383
|
+
};
|
|
384
|
+
})
|
|
351
385
|
});
|
|
352
386
|
initAppConversations();
|
|
353
387
|
};
|
|
388
|
+
const reChat = () => {
|
|
389
|
+
if (loading)
|
|
390
|
+
return;
|
|
391
|
+
if (messages.length === 0)
|
|
392
|
+
return;
|
|
393
|
+
setMessages((prev) => {
|
|
394
|
+
const newMessages = [...prev];
|
|
395
|
+
const lastAIIndex = newMessages.findLastIndex((msg) => msg.role === "bot");
|
|
396
|
+
if (lastAIIndex !== -1) {
|
|
397
|
+
newMessages.splice(lastAIIndex, 1);
|
|
398
|
+
}
|
|
399
|
+
setSuggestedQuestions([]);
|
|
400
|
+
const lastUserMessage = newMessages.findLast((msg) => msg.role === "user");
|
|
401
|
+
if (lastUserMessage) {
|
|
402
|
+
const { text = "", fileData = [] } = lastUserMessage;
|
|
403
|
+
sendMessageRequest({
|
|
404
|
+
stream: true,
|
|
405
|
+
sessionId: currentSessionId,
|
|
406
|
+
content: {
|
|
407
|
+
role: "user",
|
|
408
|
+
parts: [{
|
|
409
|
+
text
|
|
410
|
+
}]
|
|
411
|
+
},
|
|
412
|
+
files: fileData == null ? void 0 : fileData.map((file) => ({
|
|
413
|
+
fileName: file.displayName,
|
|
414
|
+
tempUrl: file.fileUri,
|
|
415
|
+
mimeType: file.mimeType
|
|
416
|
+
}))
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
return newMessages;
|
|
420
|
+
});
|
|
421
|
+
};
|
|
422
|
+
const confirmFnCall = (fnCall, confirmed) => {
|
|
423
|
+
const functionResponse = {
|
|
424
|
+
id: fnCall.id,
|
|
425
|
+
name: fnCall.name,
|
|
426
|
+
response: { confirmed }
|
|
427
|
+
};
|
|
428
|
+
startChat({ functionResponse });
|
|
429
|
+
};
|
|
354
430
|
const suggestChat = (text) => {
|
|
355
431
|
if (loading)
|
|
356
432
|
return;
|
|
357
433
|
if (!text.trim())
|
|
358
434
|
return;
|
|
359
435
|
setSuggestedQuestions([]);
|
|
360
|
-
startChat(text);
|
|
436
|
+
startChat({ text });
|
|
361
437
|
};
|
|
362
438
|
const stopChat = (0, import_react.useCallback)(() => {
|
|
363
439
|
var _a;
|
|
@@ -366,11 +442,12 @@ function useADKChat({
|
|
|
366
442
|
textMsgRef.current = null;
|
|
367
443
|
}, [ctrl]);
|
|
368
444
|
const clearChat = () => {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
445
|
+
var _a;
|
|
446
|
+
const newSessionId = (0, import_uuid.v4)();
|
|
447
|
+
setCurrentSessionId(newSessionId);
|
|
448
|
+
stopChat();
|
|
449
|
+
setMessages([]);
|
|
450
|
+
setSuggestedQuestions(((_a = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a.suggested_questions) || []);
|
|
374
451
|
};
|
|
375
452
|
const formatMessages = (messages2, isReplace = false) => {
|
|
376
453
|
const mapped = [];
|
|
@@ -445,9 +522,9 @@ function useADKChat({
|
|
|
445
522
|
token
|
|
446
523
|
});
|
|
447
524
|
if ((result == null ? void 0 : result.code) === import_constants.API_SUCCESS_CODE) {
|
|
525
|
+
setPrologue(((_a = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a.prologue) || "");
|
|
448
526
|
if (Array.isArray(data) && data.length > 0) {
|
|
449
527
|
formatMessages(data, true);
|
|
450
|
-
setPrologue(((_a = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a.prologue) || "");
|
|
451
528
|
} else {
|
|
452
529
|
setSuggestedQuestions(((_b = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _b.suggested_questions) || []);
|
|
453
530
|
}
|
|
@@ -471,7 +548,7 @@ function useADKChat({
|
|
|
471
548
|
return {
|
|
472
549
|
key: item.sessionId,
|
|
473
550
|
label: item.title || "新对话",
|
|
474
|
-
timestamp: new Date(item.
|
|
551
|
+
timestamp: new Date(item.startTime).getTime(),
|
|
475
552
|
messages: [],
|
|
476
553
|
meta: {
|
|
477
554
|
...item
|
|
@@ -482,16 +559,19 @@ function useADKChat({
|
|
|
482
559
|
setSessionPagination({ pageNum: sessionPagination.pageNum, pageSize: sessionPagination.pageSize, total: (pagination == null ? void 0 : pagination.total) || 0 });
|
|
483
560
|
const { sessionId } = data == null ? void 0 : data[0];
|
|
484
561
|
fetchDetail && setCurrentSessionDetail(sessionId);
|
|
562
|
+
if (!initialized) {
|
|
563
|
+
onSuccess == null ? void 0 : onSuccess({
|
|
564
|
+
code: import_types.SuccessCode.APP_MESSAGES_INIT_SUCCESS,
|
|
565
|
+
message: "初始化聊天记录成功"
|
|
566
|
+
});
|
|
567
|
+
setInitialized(true);
|
|
568
|
+
}
|
|
485
569
|
} else {
|
|
486
570
|
setSessionList([]);
|
|
487
571
|
setCurrentSessionId((0, import_uuid.v4)());
|
|
488
572
|
setPrologue("");
|
|
489
573
|
setSuggestedQuestions([]);
|
|
490
574
|
}
|
|
491
|
-
onSuccess == null ? void 0 : onSuccess({
|
|
492
|
-
code: import_types.SuccessCode.APP_MESSAGES_INIT_SUCCESS,
|
|
493
|
-
message: "初始化聊天记录成功"
|
|
494
|
-
});
|
|
495
575
|
} else {
|
|
496
576
|
setSessionList([]);
|
|
497
577
|
setCurrentSessionId((0, import_uuid.v4)());
|
|
@@ -571,9 +651,12 @@ function useADKChat({
|
|
|
571
651
|
return {
|
|
572
652
|
appInfo,
|
|
573
653
|
startChat,
|
|
654
|
+
reChat,
|
|
574
655
|
stopChat,
|
|
575
656
|
clearChat,
|
|
576
657
|
suggestChat,
|
|
658
|
+
confirmFnCall,
|
|
659
|
+
initialized,
|
|
577
660
|
currentSessionId,
|
|
578
661
|
sessionList,
|
|
579
662
|
prologue,
|