diff --git a/package.json b/package.json index cc41e7d4..a07278d5 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", "ansi-to-html": "^0.7.2", - "antd": "^5.20.6", + "antd": "^5.21.6", "antd-style": "^3.6.2", "axios": "^1.7.2", "classnames": "^2.5.1", @@ -45,6 +45,8 @@ "lodash": "^4.17.21", "mammoth": "^1.8.0", "marked": "^14.1.0", + "ml-dataset-iris": "^1.2.1", + "ml-pca": "^4.1.1", "numeral": "^2.0.6", "overlayscrollbars": "^2.10.0", "overlayscrollbars-react": "^0.5.6", @@ -58,6 +60,7 @@ "simplebar-react": "^3.2.6", "umap-js": "^1.4.0", "umi-presets-pro": "^2.0.3", + "wavesurfer.js": "^7.8.8", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d30daff..c949ffa9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ dependencies: version: 5.5.1(react-dom@18.2.0)(react@18.2.0) '@ant-design/pro-components': specifier: ^2.7.18 - version: 2.7.19(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + version: 2.7.19(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) '@huggingface/gguf': specifier: ^0.1.7 version: 0.1.7 @@ -48,11 +48,11 @@ dependencies: specifier: ^0.7.2 version: 0.7.2 antd: - specifier: ^5.20.6 - version: 5.20.6(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.21.6 + version: 5.21.6(react-dom@18.2.0)(react@18.2.0) antd-style: specifier: ^3.6.2 - version: 3.6.2(@types/react@18.3.1)(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + version: 3.6.2(@types/react@18.3.1)(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) axios: specifier: ^1.7.2 version: 1.7.2 @@ -98,6 +98,12 @@ dependencies: marked: specifier: ^14.1.0 version: 14.1.0 + ml-dataset-iris: + specifier: ^1.2.1 + version: 1.2.1 + ml-pca: + specifier: ^4.1.1 + version: 4.1.1 numeral: specifier: ^2.0.6 version: 2.0.6 @@ -136,7 +142,10 @@ dependencies: version: 1.4.0 umi-presets-pro: specifier: ^2.0.3 - version: 2.0.3(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.3.24) + version: 2.0.3(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.3.24) + wavesurfer.js: + specifier: ^7.8.8 + version: 7.8.8 xlsx: specifier: https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz version: '@cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz' @@ -238,7 +247,7 @@ packages: react: 18.2.0 dev: false - /@alita/plugins@3.5.0(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@alita/plugins@3.5.0(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-/vpSYnGWdePgzZu4warBGxZC6lhCWgeNCWWtbznEWJ9rnV5+TXJRJPlYvO5xBJzYuZAQLeLRM+nwelRtJyVjxg==, tarball: https://registry.npmjs.org/@alita/plugins/-/plugins-3.5.0.tgz} dependencies: '@alita/babel-transform-jsx-class': 0.0.2 @@ -246,7 +255,7 @@ packages: '@alita/request': 3.1.2 '@alita/types': 3.1.2 '@umijs/bundler-utils': 4.2.8 - '@umijs/plugins': 4.2.8(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@umijs/plugins': 4.2.8(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) '@umijs/utils': 4.2.8 ahooks: 3.8.0(react@18.2.0) antd-mobile-alita: 2.3.4(react-dom@18.2.0)(react@18.2.0) @@ -316,14 +325,14 @@ packages: '@ctrl/tinycolor': 3.6.1 dev: false - /@ant-design/cssinjs-utils@1.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-E9nOWObXx7Dy7hdyuYlOFaer/LtPO7oyZVxZphh0CYEslr5EmhJPM3WI0Q2RBHRtYg6dSNqeSK73kvZjPN3IMQ==, tarball: https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.0.tgz} + /@ant-design/cssinjs-utils@1.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2HAiyGGGnM0es40SxdszeQAU5iWp41wBIInq+ONTCKjlSKOrzQfnw4JDtB8IBmqE6tQaEKwmzTP2LGdt5DSwYQ==, tarball: https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.1.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@ant-design/cssinjs': 1.21.0(react-dom@18.2.0)(react@18.2.0) - '@babel/runtime': 7.24.8 + '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.25.7 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -363,11 +372,28 @@ packages: stylis: 4.3.2 dev: false + /@ant-design/cssinjs@1.21.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==, tarball: https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.1.tgz} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.25.7 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + classnames: 2.5.1 + csstype: 3.1.3 + rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + stylis: 4.3.4 + dev: false + /@ant-design/fast-color@2.0.6: resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==, tarball: https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz} engines: {node: '>=8.x'} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 dev: false /@ant-design/icons-svg@4.4.2: @@ -431,17 +457,17 @@ packages: - react-dom dev: false - /@ant-design/pro-card@2.8.8(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-card@2.8.8(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-av9ksFaSKmi63VXuU9qbEwk49stuzZZsDq4vUqCt1GJBzUiKVGs8rmTYlfDwmqc9k1ZZjCu74SyAf58J5775wg==, tarball: https://registry.npmjs.org/@ant-design/pro-card/-/pro-card-2.8.8.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' dependencies: '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 omit.js: 2.0.2 rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) @@ -477,25 +503,25 @@ packages: - rc-field-form dev: false - /@ant-design/pro-components@2.7.19(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-components@2.7.19(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-C/xf7VhZEMZsphT9i6DsjjwQYAEj0u77n7WYtd9/HLfJyQ2h9maORnd1z+BSmBZ58IWb18wPbiODUjNXT/toMw==, tarball: https://registry.npmjs.org/@ant-design/pro-components/-/pro-components-2.7.19.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' react-dom: '>=17.0.0' dependencies: - '@ant-design/pro-card': 2.8.8(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-descriptions': 2.5.53(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-field': 2.16.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-form': 2.30.2(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-layout': 7.20.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-list': 2.5.69(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-skeleton': 2.1.13(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-table': 3.17.2(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-card': 2.8.8(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-descriptions': 2.5.53(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.16.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.30.2(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-layout': 7.20.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-list': 2.5.69(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-skeleton': 2.1.13(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-table': 3.17.2(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -525,19 +551,19 @@ packages: - react-dom dev: false - /@ant-design/pro-descriptions@2.5.53(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-descriptions@2.5.53(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-n/LP+FgjysmZgpjAXei7RZSVYgr/9oM6ta672yoyLkZfdMMezRDNnQb3GEhLDMOERVUBg9Ud3ZwYKSoiyC25QQ==, tarball: https://registry.npmjs.org/@ant-design/pro-descriptions/-/pro-descriptions-2.5.53.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' dependencies: - '@ant-design/pro-field': 2.16.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-form': 2.30.2(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-skeleton': 2.1.13(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.16.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.30.2(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-skeleton': 2.1.13(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) rc-resize-observer: 0.2.6(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -570,18 +596,18 @@ packages: - react-dom dev: false - /@ant-design/pro-field@2.16.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-field@2.16.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qn31+7kCV2Cj0FBwFjKIiCiqoO7xpZUaER0J4SZS3KsH3EpX1iVCyleAKZ4kaluLPokj7dRX/+YsbefeVZKrtw==, tarball: https://registry.npmjs.org/@ant-design/pro-field/-/pro-field-2.16.2.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 react: '>=17.0.0' dependencies: '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0) - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 dayjs: 1.11.11 lodash-es: 4.17.21 @@ -624,7 +650,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@ant-design/pro-form@2.30.2(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-form@2.30.2(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Tn5pT8Pi5kkjr9aotezJdiRkJPgv53nyZK5qx6mwQMnI8zqTXarK22plrVEZXuFoLC1qwuAchmy4ofqAsBLx7w==, tarball: https://registry.npmjs.org/@ant-design/pro-form/-/pro-form-2.30.2.tgz} peerDependencies: '@types/lodash-es': ^4.17.12 @@ -637,13 +663,13 @@ packages: optional: true dependencies: '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-field': 2.16.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.16.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0) '@umijs/use-params': 1.0.9(react@18.2.0) - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 dayjs: 1.11.11 lodash-es: 4.17.21 @@ -681,7 +707,7 @@ packages: warning: 4.0.3 dev: false - /@ant-design/pro-layout@7.20.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-layout@7.20.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-a97k8P2sbprPXcBOG8p1g/0bP5kLBiC3+GSj0oxSWjUelAKzI9Q448tLOIfLjDcokxOvPRCEcCAlRg+mCKZVPg==, tarball: https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.20.2.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 @@ -689,12 +715,12 @@ packages: react-dom: '>=17.0.0' dependencies: '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 '@umijs/route-utils': 4.0.1 '@umijs/use-params': 1.0.9(react@18.2.0) - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 lodash-es: 4.17.21 omit.js: 2.0.2 @@ -732,7 +758,7 @@ packages: - rc-field-form dev: false - /@ant-design/pro-list@2.5.69(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-list@2.5.69(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-jd5slgWw9hV/f1XhFjuHfsdS9fh81lTRhBzJDlgFqZaFNKo++S2c8wX5FbpNzYCu+XIfVTVt8EXvz8j4lPiG0g==, tarball: https://registry.npmjs.org/@ant-design/pro-list/-/pro-list-2.5.69.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 @@ -740,12 +766,12 @@ packages: react-dom: '>=17.0.0' dependencies: '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-card': 2.8.8(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-field': 2.16.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-table': 3.17.2(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-card': 2.8.8(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.16.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-table': 3.17.2(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 dayjs: 1.11.11 rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) @@ -774,7 +800,7 @@ packages: swr: 2.2.5(react@18.2.0) dev: false - /@ant-design/pro-provider@2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-provider@2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-4UJr6AHyWKsrhx2KfdkpRQCgjc75oDUDhMHGA2OWqQVI16sMQfeZf6KYfmeiG3Dal1QKFOtSibCdH5G2CDvWlg==, tarball: https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.14.9.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 @@ -784,7 +810,7 @@ packages: '@ant-design/cssinjs': 1.21.0(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 '@ctrl/tinycolor': 3.6.1 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -804,7 +830,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@ant-design/pro-skeleton@2.1.13(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-skeleton@2.1.13(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Z2+DpJaFzO6gbmDW8lTceHy2vOpwKQUVRteAh5Ac3NSPeZFUDoyxZGOmA2jN/BxlSQnhrR88vhwXi+KouEqxcg==, tarball: https://registry.npmjs.org/@ant-design/pro-skeleton/-/pro-skeleton-2.1.13.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 @@ -812,7 +838,7 @@ packages: react-dom: '>=17.0.0' dependencies: '@babel/runtime': 7.25.7 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -850,7 +876,7 @@ packages: - '@types/lodash-es' dev: false - /@ant-design/pro-table@3.17.2(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-table@3.17.2(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-nEwhlx93MgKjXD5PsXQqnB4bQHKe7dTTzwUiYrBCb0Y5So2ra4cBcjobQHS+q1IgIP9DJQQoruRp/AYplCtwHw==, tarball: https://registry.npmjs.org/@ant-design/pro-table/-/pro-table-3.17.2.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 @@ -859,17 +885,17 @@ packages: react-dom: '>=17.0.0' dependencies: '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-card': 2.8.8(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-field': 2.16.2(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-form': 2.30.2(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-utils': 2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-card': 2.8.8(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-field': 2.16.2(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-form': 2.30.2(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-utils': 2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.1.0)(react@18.2.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.1.0)(react@18.2.0) '@dnd-kit/utilities': 3.2.2(react@18.2.0) - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 dayjs: 1.11.11 lodash-es: 4.17.21 @@ -904,7 +930,7 @@ packages: swr: 2.2.5(react@18.2.0) dev: false - /@ant-design/pro-utils@2.15.18(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0): + /@ant-design/pro-utils@2.15.18(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-t/7i57tIYrQPlo2uIchWsXcvtQfBi72uQF9mLFS4C8f3nEKJFiEMWg2m+7JDgencTkpQmP7qmmfT1/6qXJcOvA==, tarball: https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.15.18.tgz} peerDependencies: antd: ^4.24.15 || ^5.11.2 @@ -912,9 +938,9 @@ packages: react-dom: '>=17.0.0' dependencies: '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-provider': 2.14.9(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-provider': 2.14.9(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': 7.25.7 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 dayjs: 1.11.11 lodash-es: 4.17.21 @@ -943,7 +969,7 @@ packages: peerDependencies: react: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 json2mq: 0.2.0 react: 18.2.0 @@ -4696,7 +4722,7 @@ packages: resolution: {integrity: sha512-eN5chKrc0ANerXjLJuoqh/YJpor0u4T1bgaph5BPh42cJ2afDihaHJ2Mh3Up3XIFk05EfKG4nIQxbqC6y2eM4Q==, tarball: https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.3.tgz} engines: {node: '>=14.x'} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 dev: false /@rc-component/color-picker@2.0.1(react-dom@18.2.0)(react@18.2.0): @@ -4706,7 +4732,7 @@ packages: react-dom: '>=16.9.0' dependencies: '@ant-design/fast-color': 2.0.6 - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -4719,7 +4745,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4729,7 +4755,7 @@ packages: resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==, tarball: https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz} engines: {node: '>=8.x'} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 dev: false /@rc-component/mutate-observer@1.1.0(react-dom@18.2.0)(react@18.2.0): @@ -4739,7 +4765,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -4767,7 +4793,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -4781,7 +4807,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) '@rc-component/trigger': 2.2.3(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 @@ -4797,10 +4823,10 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -6526,7 +6552,7 @@ packages: tsx: 3.12.2 dev: false - /@umijs/plugins@4.2.1(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@umijs/plugins@4.2.1(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-bTpYLEyzhJQNzruDeG1oaVWW+W5bGihkOoPFNqbd6r/IjoK9YuUQKCq471FgH/LV68rTIrPzVWwhRCejcvqorA==} dependencies: '@ahooksjs/use-request': 2.8.15(react@18.2.0) @@ -6534,7 +6560,7 @@ packages: '@ant-design/cssinjs': 1.20.0(react-dom@18.2.0)(react@18.2.0) '@ant-design/icons': 4.8.3(react-dom@18.2.0)(react@18.2.0) '@ant-design/moment-webpack-plugin': 0.0.3 - '@ant-design/pro-components': 2.7.19(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-components': 2.7.19(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-devtools': 4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0) '@umijs/bundler-utils': 4.2.1 @@ -6622,7 +6648,7 @@ packages: - supports-color dev: false - /@umijs/plugins@4.2.8(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): + /@umijs/plugins@4.2.8(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IkWX4/0NYxWV+KvyzTVlZIepblSIpbTcZA6wVfJR82+gv3192uJVL7SKC7OfElq1UaF0cBQeeMC/onC2dRN9SQ==, tarball: https://registry.npmjs.org/@umijs/plugins/-/plugins-4.2.8.tgz} dependencies: '@ahooksjs/use-request': 2.8.15(react@18.2.0) @@ -6630,7 +6656,7 @@ packages: '@ant-design/cssinjs': 1.20.0(react-dom@18.2.0)(react@18.2.0) '@ant-design/icons': 4.8.3(react-dom@18.2.0)(react@18.2.0) '@ant-design/moment-webpack-plugin': 0.0.3 - '@ant-design/pro-components': 2.7.19(antd@5.20.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@ant-design/pro-components': 2.7.19(antd@5.21.6)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-devtools': 4.36.1(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0) '@umijs/bundler-utils': 4.2.8 @@ -7408,7 +7434,7 @@ packages: resolution: {integrity: sha512-iquIc7EsQTndk5nMv9pQQv+/OY5YnjVIPhtCFo7W7JL+Gjqzq/YJ/HO2WxUxyCgYha2NsTTNAb2vPa/M4zAi2g==, tarball: https://registry.npmjs.org/antd-mobile-icons/-/antd-mobile-icons-0.2.2.tgz} dev: false - /antd-style@3.6.2(@types/react@18.3.1)(antd@5.20.6)(react-dom@18.2.0)(react@18.2.0): + /antd-style@3.6.2(@types/react@18.3.1)(antd@5.21.6)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-p6tRV63+U9yp3T3DB4ope1Xs3VdkhNsPD+yiZMJnR57dclPQPtrNnrGBmdGwjWYP1HlzB1XS4JHqFAyMjvObHA==} peerDependencies: antd: '>=5.8.1' @@ -7422,7 +7448,7 @@ packages: '@emotion/serialize': 1.1.4 '@emotion/server': 11.11.0(@emotion/css@11.11.2) '@emotion/utils': 1.2.1 - antd: 5.20.6(react-dom@18.2.0)(react@18.2.0) + antd: 5.21.6(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 use-merge-value: 1.2.0(react@18.2.0) transitivePeerDependencies: @@ -7483,18 +7509,18 @@ packages: scroll-into-view-if-needed: 2.2.31 dev: false - /antd@5.20.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-TZFmNenHlh26DelHCJbkB+x1OVulIKsN1f/CnAd2NxZLysXqRvSuLUeHcgccqAnxTy7B03GZ6i1tocGxPCNjgA==, tarball: https://registry.npmjs.org/antd/-/antd-5.20.6.tgz} + /antd@5.21.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-EviOde/VEu+OsIKH5t6YXTMmmNeg9R85m0W5zXAo+Np8Latg9q10691JvAqOTMpnrRmbdeKUQL1Krp69Bzbe/g==, tarball: https://registry.npmjs.org/antd/-/antd-5.21.6.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: '@ant-design/colors': 7.1.0 - '@ant-design/cssinjs': 1.21.0(react-dom@18.2.0)(react@18.2.0) - '@ant-design/cssinjs-utils': 1.1.0(react-dom@18.2.0)(react@18.2.0) + '@ant-design/cssinjs': 1.21.1(react-dom@18.2.0)(react@18.2.0) + '@ant-design/cssinjs-utils': 1.1.1(react-dom@18.2.0)(react@18.2.0) '@ant-design/icons': 5.5.1(react-dom@18.2.0)(react@18.2.0) '@ant-design/react-slick': 1.1.2(react@18.2.0) - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@ctrl/tinycolor': 3.6.1 '@rc-component/color-picker': 2.0.1(react-dom@18.2.0)(react@18.2.0) '@rc-component/mutate-observer': 1.1.0(react-dom@18.2.0)(react@18.2.0) @@ -7504,37 +7530,37 @@ packages: classnames: 2.5.1 copy-to-clipboard: 3.3.3 dayjs: 1.11.11 - rc-cascader: 3.28.1(react-dom@18.2.0)(react@18.2.0) + rc-cascader: 3.28.2(react-dom@18.2.0)(react@18.2.0) rc-checkbox: 3.3.0(react-dom@18.2.0)(react@18.2.0) - rc-collapse: 3.7.3(react-dom@18.2.0)(react@18.2.0) - rc-dialog: 9.5.2(react-dom@18.2.0)(react@18.2.0) + rc-collapse: 3.8.0(react-dom@18.2.0)(react@18.2.0) + rc-dialog: 9.6.0(react-dom@18.2.0)(react@18.2.0) rc-drawer: 7.2.0(react-dom@18.2.0)(react@18.2.0) rc-dropdown: 4.2.0(react-dom@18.2.0)(react@18.2.0) rc-field-form: 2.4.0(react-dom@18.2.0)(react@18.2.0) - rc-image: 7.9.0(react-dom@18.2.0)(react@18.2.0) + rc-image: 7.11.0(react-dom@18.2.0)(react@18.2.0) rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0) rc-input-number: 9.2.0(react-dom@18.2.0)(react@18.2.0) - rc-mentions: 2.15.0(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.14.1(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) - rc-notification: 5.6.0(react-dom@18.2.0)(react@18.2.0) - rc-pagination: 4.2.0(react-dom@18.2.0)(react@18.2.0) + rc-mentions: 2.16.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.15.1(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) + rc-notification: 5.6.2(react-dom@18.2.0)(react@18.2.0) + rc-pagination: 4.3.0(react-dom@18.2.0)(react@18.2.0) rc-picker: 4.6.15(dayjs@1.11.11)(react-dom@18.2.0)(react@18.2.0) rc-progress: 4.0.0(react-dom@18.2.0)(react@18.2.0) rc-rate: 2.13.0(react-dom@18.2.0)(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) - rc-segmented: 2.3.0(react-dom@18.2.0)(react@18.2.0) + rc-segmented: 2.5.0(react-dom@18.2.0)(react@18.2.0) rc-select: 14.15.2(react-dom@18.2.0)(react@18.2.0) rc-slider: 11.1.7(react-dom@18.2.0)(react@18.2.0) rc-steps: 6.0.1(react-dom@18.2.0)(react@18.2.0) rc-switch: 4.1.0(react-dom@18.2.0)(react@18.2.0) - rc-table: 7.45.7(react-dom@18.2.0)(react@18.2.0) - rc-tabs: 15.1.1(react-dom@18.2.0)(react@18.2.0) + rc-table: 7.47.5(react-dom@18.2.0)(react@18.2.0) + rc-tabs: 15.3.0(react-dom@18.2.0)(react@18.2.0) rc-textarea: 1.8.2(react-dom@18.2.0)(react@18.2.0) - rc-tooltip: 6.2.0(react-dom@18.2.0)(react@18.2.0) + rc-tooltip: 6.2.1(react-dom@18.2.0)(react@18.2.0) rc-tree: 5.9.0(react-dom@18.2.0)(react@18.2.0) rc-tree-select: 5.23.0(react-dom@18.2.0)(react@18.2.0) - rc-upload: 4.7.0(react-dom@18.2.0)(react@18.2.0) + rc-upload: 4.8.1(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -12953,6 +12979,10 @@ packages: ml-array-min: 1.2.3 dev: false + /ml-dataset-iris@1.2.1: + resolution: {integrity: sha512-7GO+Xk382d+HhVgjebaQnJ4Tcm8+uaL9Mc76UdxhBAU0aFWs6JDjINZLnrlZ0KDiIi9Erc52bD26QOvYsG7Nnw==, tarball: https://registry.npmjs.org/ml-dataset-iris/-/ml-dataset-iris-1.2.1.tgz} + dev: false + /ml-levenberg-marquardt@2.1.1: resolution: {integrity: sha512-2+HwUqew4qFFFYujYlQtmFUrxCB4iJAPqnUYro3P831wj70eJZcANwcRaIMGUVaH9NDKzfYuA4N5u67KExmaRA==, tarball: https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-2.1.1.tgz} dependencies: @@ -12967,6 +12997,12 @@ packages: ml-array-rescale: 1.3.7 dev: false + /ml-pca@4.1.1: + resolution: {integrity: sha512-HQwswMK1dObj+ppk3EPcQMR2djWK0Cri8mAFd2nITtXHkLfO4DBBsEtiCT5KiR+2e3hQjp+lI0UyqZpdf04AlQ==, tarball: https://registry.npmjs.org/ml-pca/-/ml-pca-4.1.1.tgz} + dependencies: + ml-matrix: 6.12.0 + dev: false + /mock.js@0.2.0: resolution: {integrity: sha512-DKI8Rh/h7Mma+fg+6aD0uUvwn0QXAjKG6q3s+lTaCboCQ/kvQMBN9IXRBzgEaz4aPiYoRnKU9jVsfZp0mHpWrQ==, tarball: https://registry.npmjs.org/mock.js/-/mock.js-0.2.0.tgz} dev: false @@ -15028,13 +15064,13 @@ packages: react-lifecycles-compat: 3.0.4 dev: false - /rc-cascader@3.28.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9+8oHIMWVLHxuaapDiqFNmD9KSyKN/P4bo9x/MBuDbyTqP8f2/POmmZxdXWBO3yq/uE3pKyQCXYNUxrNfHRv2A==, tarball: https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.28.1.tgz} + /rc-cascader@3.28.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-8f+JgM83iLTvjgdkgU7GfI4qY8icXOBP0cGZjOdx2iJAkEe8ucobxDQAVE69UD/c3ehCxZlcgEHeD5hFmypbUw==, tarball: https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.28.2.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 array-tree-filter: 2.1.0 classnames: 2.5.1 rc-select: 14.15.2(react-dom@18.2.0)(react@18.2.0) @@ -15088,7 +15124,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15122,15 +15158,15 @@ packages: shallowequal: 1.1.0 dev: false - /rc-collapse@3.7.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==, tarball: https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.3.tgz} + /rc-collapse@3.8.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YVBkssrKPBG09TGfcWWGj8zJBYD9G3XuTy89t5iUmSXrIXEAnO1M+qjUxRW6b4Qi0+wNWG6MHJF/+US+nmIlzA==, tarball: https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.8.0.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -15151,16 +15187,16 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-dialog@9.5.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==, tarball: https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz} + /rc-dialog@9.6.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==, tarball: https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -15187,10 +15223,10 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -15216,7 +15252,7 @@ packages: react: '>=16.11.0' react-dom: '>=16.11.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/trigger': 2.2.3(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) @@ -15245,7 +15281,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/async-validator': 5.0.3 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15274,17 +15310,17 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-image@7.9.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==, tarball: https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz} + /rc-image@7.11.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==, tarball: https://registry.npmjs.org/rc-image/-/rc-image-7.11.0.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 - rc-dialog: 9.5.2(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-dialog: 9.6.0(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -15309,7 +15345,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/mini-decimal': 1.1.0 classnames: 2.5.1 rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0) @@ -15337,7 +15373,7 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15360,33 +15396,33 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-mentions@2.15.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-f5v5i7VdqvBDXbphoqcQWmXDif2Msd2arritVoWybrVDuHE6nQ7XCYsybHbV//WylooK52BFDouFvyaRDtXZEw==, tarball: https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.15.0.tgz} + /rc-mentions@2.16.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-GnhSTGP9Mtv6pqFFGQze44LlrtWOjHNrUUAcsdo9DnNAhN4pwVPEWy4z+2jpjkiGlJ3VoXdvMHcNDQdfI9fEaw==, tarball: https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.16.1.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/trigger': 2.2.3(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.14.1(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.15.1(react-dom@18.2.0)(react@18.2.0) rc-textarea: 1.8.2(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /rc-menu@9.14.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==, tarball: https://registry.npmjs.org/rc-menu/-/rc-menu-9.14.1.tgz} + /rc-menu@9.15.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UKporqU6LPfHnpPmtP6hdEK4iO5Q+b7BRv/uRpxdIyDGplZy9jwUjsnpev5bs3PQKB0H0n34WAPDfjAfn3kAPA==, tarball: https://registry.npmjs.org/rc-menu/-/rc-menu-9.15.1.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/trigger': 2.2.3(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15422,6 +15458,19 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /rc-motion@2.9.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rkW47ABVkic7WEB0EKJqzySpvDqwl60/tdkY7hWP7dYnh5pm0SzJpo54oW3TDUGXV5wfxXFmMkxrzRRbotQ0+w==, tarball: https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.3.tgz} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.25.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-notification@4.6.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==, tarball: https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz} engines: {node: '>=8.x'} @@ -15437,16 +15486,16 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-notification@5.6.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==, tarball: https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.0.tgz} + /rc-notification@5.6.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==, tarball: https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.2.tgz} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -15478,13 +15527,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-pagination@4.2.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==, tarball: https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.2.0.tgz} + /rc-pagination@4.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UubEWA0ShnroQ1tDa291Fzw6kj0iOeF26IsUObxYTpimgj4/qPCWVFl18RLZE+0Up1IZg0IK4pMn6nB3mjvB7g==, tarball: https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.3.0.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15530,7 +15579,7 @@ packages: moment: optional: true dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/trigger': 2.2.3(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 dayjs: 1.11.11 @@ -15560,7 +15609,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15574,7 +15623,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15637,6 +15686,20 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false + /rc-segmented@2.5.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==, tarball: https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.5.0.tgz} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.25.7 + classnames: 2.5.1 + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) + rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /rc-select@14.1.18(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg==, tarball: https://registry.npmjs.org/rc-select/-/rc-select-14.1.18.tgz} engines: {node: '>=8.x'} @@ -15662,10 +15725,10 @@ packages: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/trigger': 2.2.3(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) rc-virtual-list: 3.14.8(react-dom@18.2.0)(react@18.2.0) @@ -15695,7 +15758,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15738,7 +15801,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15773,7 +15836,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15796,14 +15859,14 @@ packages: shallowequal: 1.1.0 dev: false - /rc-table@7.45.7(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==, tarball: https://registry.npmjs.org/rc-table/-/rc-table-7.45.7.tgz} + /rc-table@7.47.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fzq+V9j/atbPIcvs3emuclaEoXulwQpIiJA6/7ey52j8+9cJ4P8DGmp4YzfUVDrb3qhgedcVeD6eRgUrokwVEQ==, tarball: https://registry.npmjs.org/rc-table/-/rc-table-7.47.5.tgz} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/context': 1.4.0(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) @@ -15831,18 +15894,18 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-tabs@15.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==, tarball: https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.1.1.tgz} + /rc-tabs@15.3.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lzE18r+zppT/jZWOAWS6ntdkDUKHOLJzqMi5UAij1LeKwOaQaupupAoI9Srn73GRzVpmGznkECMRrzkRusC40A==, tarball: https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.3.0.tgz} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-dropdown: 4.2.0(react-dom@18.2.0)(react@18.2.0) - rc-menu: 9.14.1(react-dom@18.2.0)(react@18.2.0) - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-menu: 9.15.1(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -15870,7 +15933,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-input: 1.6.3(react-dom@18.2.0)(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) @@ -15903,13 +15966,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-tooltip@6.2.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==, tarball: https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz} + /rc-tooltip@6.2.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==, tarball: https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.1.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 '@rc-component/trigger': 2.2.3(react-dom@18.2.0)(react@18.2.0) classnames: 2.5.1 react: 18.2.0 @@ -15922,7 +15985,7 @@ packages: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-select: 14.15.2(react-dom@18.2.0)(react@18.2.0) rc-tree: 5.9.0(react-dom@18.2.0)(react@18.2.0) @@ -15969,9 +16032,9 @@ packages: react: '*' react-dom: '*' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.2.0)(react@18.2.0) + rc-motion: 2.9.3(react-dom@18.2.0)(react@18.2.0) rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) rc-virtual-list: 3.14.8(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -16022,13 +16085,13 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /rc-upload@4.7.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-eUwxYNHlsYe5vYhKFAUGrQG95JrnPzY+BmPi1Daq39fWNl/eOc7v4UODuWrVp2LFkQBuV3cMCG/I68iub6oBrg==, tarball: https://registry.npmjs.org/rc-upload/-/rc-upload-4.7.0.tgz} + /rc-upload@4.8.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==, tarball: https://registry.npmjs.org/rc-upload/-/rc-upload-4.8.1.tgz} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 @@ -17912,6 +17975,10 @@ packages: resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} dev: false + /stylis@4.3.4: + resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==, tarball: https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz} + dev: false + /sugarss@2.0.0: resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==, tarball: https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz} dependencies: @@ -18401,12 +18468,12 @@ packages: ml-levenberg-marquardt: 2.1.1 dev: false - /umi-presets-pro@2.0.3(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.3.24): + /umi-presets-pro@2.0.3(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.3.24): resolution: {integrity: sha512-sHKynw/fi7UeUftzTRPRsrV5GHV4BWvWYhyvwkg8s+shmt0ROPW/52y4gxBziEvetxl8yWMKUCWk50OUDOcrww==, tarball: https://registry.npmjs.org/umi-presets-pro/-/umi-presets-pro-2.0.3.tgz} dependencies: - '@alita/plugins': 3.5.0(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@alita/plugins': 3.5.0(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) '@umijs/max-plugin-openapi': 2.0.3 - '@umijs/plugins': 4.2.1(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.20.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) + '@umijs/plugins': 4.2.1(@babel/core@7.25.7)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.21.6)(dva@2.5.0-beta.2)(rc-field-form@2.4.0)(react-dom@18.2.0)(react@18.2.0) '@umijs/request-record': 1.1.4(umi@4.3.24) swagger-ui-dist: 4.19.1 transitivePeerDependencies: @@ -18926,6 +18993,10 @@ packages: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + /wavesurfer.js@7.8.8: + resolution: {integrity: sha512-FNiJ6RCAu4TijRcwdaqlN19+Y+Hhqb7Nfo2P4LudzhNnQRMKvF3QmXd9+KHlQZrSjexeK3WbY4COsxgGJkxMag==, tarball: https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-7.8.8.tgz} + dev: false + /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: diff --git a/src/assets/styles/common.less b/src/assets/styles/common.less index bf2fae3f..9011d77b 100644 --- a/src/assets/styles/common.less +++ b/src/assets/styles/common.less @@ -166,6 +166,10 @@ font-size: 20px; } +.font-size-24 { + font-size: 24px; +} + .m-b-0 { margin-bottom: 0; } diff --git a/src/components/audio-animation/index.less b/src/components/audio-animation/index.less new file mode 100644 index 00000000..c2662174 --- /dev/null +++ b/src/components/audio-animation/index.less @@ -0,0 +1,10 @@ +.canvas-wrap { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + + canvas { + display: block; + } +} diff --git a/src/components/audio-animation/index.tsx b/src/components/audio-animation/index.tsx new file mode 100644 index 00000000..30111090 --- /dev/null +++ b/src/components/audio-animation/index.tsx @@ -0,0 +1,121 @@ +import React, { useEffect } from 'react'; +import './index.less'; + +interface AudioAnimationProps { + width: number; + height: number; + analyserData: { + data: Uint8Array; + analyser: any; + }; +} + +const AudioAnimation: React.FC = (props) => { + const { width, height, analyserData } = props; + const canvasRef = React.useRef(null); + const animationId = React.useRef(0); + const isScaled = React.useRef(false); + const oscillationOffset = React.useRef(0); + const direction = React.useRef(1); + + const startAudioVisualization = () => { + if (!canvasRef.current || !analyserData.data?.length) return; + + const canvas = canvasRef.current; + const canvasCtx = canvas.getContext('2d'); + if (!canvasCtx) return; + + const WIDTH = (canvas.width = width * 2); + const HEIGHT = (canvas.height = height * 2); + + if (!isScaled.current) { + canvasCtx.scale(2, 2); + isScaled.current = true; + } + + const barWidth = 3; + const barSpacing = 2; + const centerX = HEIGHT / 2; + const centerLine = Math.floor(HEIGHT / 2); + const jitterAmplitude = 60; // 最大抖动幅度 + const minJitter = 15; // 最小抖动幅度 + + const frameInterval = 2; + let frameCount = 0; + + canvasCtx.fillStyle = '#0073EF'; + + const draw = () => { + frameCount++; + if (frameCount % frameInterval !== 0) { + animationId.current = requestAnimationFrame(draw); + return; + } + analyserData.analyser?.current?.getByteFrequencyData(analyserData.data); + canvasCtx.clearRect(0, 0, WIDTH, HEIGHT); + + const barCount = analyserData.data.length; + const totalWidth = barCount * (barWidth + barSpacing) - barSpacing; + let x = centerX - totalWidth / 2 + oscillationOffset.current; + oscillationOffset.current += direction.current * 0.5; + + if (oscillationOffset.current > 20 || oscillationOffset.current < -20) { + direction.current *= -1; + } + + for (let i = 0; i < barCount; i++) { + const baseHeight = Math.floor(analyserData.data[i] / 2); + const jitter = + minJitter + + Math.round((Math.random() - 0.5) * (jitterAmplitude - minJitter)); + const barHeight = baseHeight + jitter; + + const topY = Math.round(centerLine - barHeight / 2); + const bottomY = Math.round(centerLine + barHeight / 2); + + canvasCtx.beginPath(); + canvasCtx.moveTo(x, bottomY); + canvasCtx.lineTo(x, topY + 2); + canvasCtx.arcTo(x + barWidth, topY + 2, x + barWidth, bottomY, 2); + canvasCtx.lineTo(x + barWidth, bottomY); + canvasCtx.closePath(); + canvasCtx.fill(); + + x += barWidth + barSpacing; + } + + animationId.current = requestAnimationFrame(draw); + }; + + draw(); + }; + + useEffect(() => { + if (!analyserData.data?.length || !analyserData.analyser.current) { + canvasRef.current + ?.getContext('2d') + ?.clearRect(0, 0, width * 2, height * 2); + cancelAnimationFrame(animationId.current); + animationId.current = 0; + return; + } + startAudioVisualization(); + return () => { + if (animationId.current) cancelAnimationFrame(animationId.current); + }; + }, [analyserData, width, height]); + + return ( +
+ +
+ ); +}; + +export default React.memo(AudioAnimation); diff --git a/src/components/audio-player/index.less b/src/components/audio-player/index.less new file mode 100644 index 00000000..01c488a9 --- /dev/null +++ b/src/components/audio-player/index.less @@ -0,0 +1,53 @@ +.player-wrap { + width: 100%; + display: flex; + background-color: var(--ant-color-fill-quaternary); + border-radius: 36px; + + .player-ui { + padding: 5px 10px; + flex: 1; + display: flex; + justify-content: flex-start; + align-items: center; + } + + .play-content { + display: flex; + justify-content: flex-start; + align-items: center; + flex: 1; + } + + .time { + &.current { + margin-left: 6px; + } + } + + .progress-bar { + margin-inline: 10px; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .slider { + width: 100%; + } + + .file-name { + line-height: 20px; + height: 20px; + } + + .ant-slider-horizontal { + margin-block: 2px; + } + } + + .speaker { + margin-left: 10px; + } +} diff --git a/src/components/audio-player/index.tsx b/src/components/audio-player/index.tsx new file mode 100644 index 00000000..8127c011 --- /dev/null +++ b/src/components/audio-player/index.tsx @@ -0,0 +1,191 @@ +import { formatTime } from '@/utils/index'; +import { PauseCircleFilled, PlayCircleFilled } from '@ant-design/icons'; +import { Button, Slider } from 'antd'; +import React, { + forwardRef, + useCallback, + useEffect, + useImperativeHandle +} from 'react'; +import IconFont from '../icon-font'; +import './index.less'; + +interface AudioPlayerProps { + autoplay?: boolean; + url: string; + speed?: number; + ref?: any; + name: string; + height?: number; + width?: number; + duration?: number; +} + +const AudioPlayer: React.FC = forwardRef((props, ref) => { + const { autoplay = false, speed: defaultSpeed = 1 } = props; + const audioRef = React.useRef(null); + const [audioState, setAudioState] = React.useState<{ + currentTime: number; + duration: number; + }>({ + currentTime: 0, + duration: 0 + }); + const [playOn, setPlayOn] = React.useState(false); + const [speakerOn, setSpeakerOn] = React.useState(false); + const [volume, setVolume] = React.useState(0.5); + const [speed, setSpeed] = React.useState(defaultSpeed); + const timer = React.useRef(null); + + useImperativeHandle(ref, () => ({ + play: () => { + audioRef.current?.play(); + }, + pause: () => { + audioRef.current?.pause(); + } + })); + + const handleAudioOnPlay = useCallback(() => { + timer.current = setInterval(() => { + setAudioState((prestate) => { + return { + currentTime: Math.ceil(audioRef.current?.currentTime || 0), + duration: + prestate.duration || Math.ceil(audioRef.current?.duration || 0) + }; + }); + + if (audioRef.current?.paused || audioRef.current?.ended) { + clearInterval(timer.current); + setPlayOn(false); + setAudioState((prestate: any) => { + return { + currentTime: 0, + duration: prestate.duration + }; + }); + } + }, 500); + }, []); + + const handlePlay = useCallback(() => { + if (playOn) { + audioRef.current?.pause(); + } else { + audioRef.current?.play(); + } + setPlayOn(!playOn); + }, [playOn]); + + const initPlayerConfig = useCallback(() => { + // set volume + audioRef.current!.volume = volume; + // set playback rate + audioRef.current!.playbackRate = speed; + }, []); + + const handleLoadedMetadata = useCallback( + (data: any) => { + const duration = Math.ceil(audioRef.current?.duration || 0); + setAudioState({ + currentTime: 0, + duration: + duration && duration !== Infinity ? duration : props.duration || 0 + }); + setPlayOn(autoplay); + }, + [autoplay, props.duration] + ); + + const handleCurrentChange = useCallback((val: number) => { + audioRef.current!.currentTime = val; + setAudioState((prestate) => { + return { + currentTime: val, + duration: prestate.duration + }; + }); + }, []); + + useEffect(() => { + if (audioRef.current) { + initPlayerConfig(); + } + }, [audioRef.current]); + + useEffect(() => { + return () => { + clearInterval(timer.current); + }; + }, []); + + return ( +
+
+ + + +
+ + {' '} + {formatTime(audioState.currentTime)} + +
+ {props.name} +
+ +
+ {props.speed ? `${props.speed}x` : '1x'} +
+ {formatTime(audioState.duration)} +
+ + + +
+ +
+ ); +}); + +export default React.memo(AudioPlayer); diff --git a/src/components/echarts/config.ts b/src/components/echarts/config.ts index 540101ee..2b099266 100644 --- a/src/components/echarts/config.ts +++ b/src/components/echarts/config.ts @@ -84,6 +84,7 @@ export const title = { textStyle: { fontSize: 12, color: '#000' + // fontWeight: 500 }, text: '' }; diff --git a/src/components/echarts/scatter.tsx b/src/components/echarts/scatter.tsx index a962398f..33e19afa 100644 --- a/src/components/echarts/scatter.tsx +++ b/src/components/echarts/scatter.tsx @@ -13,9 +13,11 @@ const options: any = { top: -1, bottom: -1, left: -1, - containLabel: true + containLabel: true, + borderRadius: 4 }, xAxis: { + scale: false, slient: true, splitNumber: 15, splitLine: { @@ -34,6 +36,7 @@ const options: any = { } }, yAxis: { + scale: false, slient: true, splitNumber: 10, splitLine: { diff --git a/src/components/icon-font/index.tsx b/src/components/icon-font/index.tsx index c8392f84..2fea3c32 100644 --- a/src/components/icon-font/index.tsx +++ b/src/components/icon-font/index.tsx @@ -1,7 +1,7 @@ import { createFromIconfontCN } from '@ant-design/icons'; const IconFont = createFromIconfontCN({ - scriptUrl: '//at.alicdn.com/t/c/font_4613488_flbkvujyhg4.js' + scriptUrl: '//at.alicdn.com/t/c/font_4613488_f5wastzhj2w.js' }); export default IconFont; diff --git a/src/components/speech-content/audio-player.tsx b/src/components/speech-content/audio-player.tsx new file mode 100644 index 00000000..14acaede --- /dev/null +++ b/src/components/speech-content/audio-player.tsx @@ -0,0 +1,47 @@ +import React, { + forwardRef, + useEffect, + useImperativeHandle, + useRef +} from 'react'; +import useWavesurfer from './hooks/use-wavesurfer'; + +interface AudioPlayerProps { + autoplay: boolean; + audioUrl: string; + speed: number; + ref?: any; + height?: number; + width?: number; +} + +const AudioPlayer: React.FC = forwardRef((props, ref) => { + const { autoplay, audioUrl, speed = 1, ...rest } = props; + const container = useRef(null); + const { createWavesurfer, play, pause, destroyWavesurfer } = useWavesurfer({ + container, + autoplay: autoplay, + url: audioUrl, + audioRate: speed, + ...rest + }); + + useImperativeHandle(ref, () => { + return { + play, + pause + }; + }); + + useEffect(() => { + if (container.current) { + createWavesurfer(); + } + return () => { + destroyWavesurfer(); + }; + }, [container.current]); + return
; +}); + +export default React.memo(AudioPlayer); diff --git a/src/components/speech-content/hooks/use-wavesurfer.ts b/src/components/speech-content/hooks/use-wavesurfer.ts new file mode 100644 index 00000000..a8f4085b --- /dev/null +++ b/src/components/speech-content/hooks/use-wavesurfer.ts @@ -0,0 +1,68 @@ +import { useRef } from 'react'; +import WaveSurfer from 'wavesurfer.js'; + +interface Options { + container: React.RefObject; + waveColor?: string; + progressColor?: string; + url: string; + barWidth?: number; + barGap?: number; + barRadius?: number; + autoplay?: boolean; + audioRate?: number; +} +const useWavesurfer = (options: Options) => { + const wavesurfer = useRef(null); + + const { container, url, ...rest } = options; + + const createWavesurfer = () => { + if (!container.current) { + return; + } + if (wavesurfer.current) { + wavesurfer.current.destroy(); + } + wavesurfer.current = WaveSurfer.create({ + container: container.current, + waveColor: '#4096ff', + progressColor: 'rgb(100, 0, 100)', + url: url, + height: 60, + barWidth: 2, + barGap: 1, + barRadius: 2, + interact: true, + cursorWidth: 0, + ...rest + }); + }; + + const destroyWavesurfer = () => { + if (wavesurfer.current) { + wavesurfer.current.destroy(); + } + }; + + const play = () => { + if (wavesurfer.current) { + wavesurfer.current.play(); + } + }; + + const pause = () => { + if (wavesurfer.current) { + wavesurfer.current.pause(); + } + }; + + return { + createWavesurfer, + play, + pause, + destroyWavesurfer + }; +}; + +export default useWavesurfer; diff --git a/src/components/speech-content/ih.mp4 b/src/components/speech-content/ih.mp4 new file mode 100644 index 00000000..7e684ebd Binary files /dev/null and b/src/components/speech-content/ih.mp4 differ diff --git a/src/components/speech-content/index.tsx b/src/components/speech-content/index.tsx new file mode 100644 index 00000000..96d03b4a --- /dev/null +++ b/src/components/speech-content/index.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import SpeechItem from './speech-item'; + +interface SpeechContentProps { + dataList: any[]; + loading?: boolean; +} + +const SpeechContent: React.FC = (props) => { + console.log('SpeechContent', props); + return ( +
+ {props.dataList.map((item) => ( + + ))} +
+ ); +}; + +export default React.memo(SpeechContent); diff --git a/src/components/speech-content/speech-item.tsx b/src/components/speech-content/speech-item.tsx new file mode 100644 index 00000000..bb2e78b4 --- /dev/null +++ b/src/components/speech-content/speech-item.tsx @@ -0,0 +1,87 @@ +import IconFont from '@/components/icon-font'; +import { + DownloadOutlined, + FileTextOutlined, + PlayCircleOutlined +} from '@ant-design/icons'; +import { Button, Tooltip } from 'antd'; +import React, { useRef, useState } from 'react'; +import AudioPlayer from './audio-player'; +import './styles/index.less'; + +const audioUrl = require('./ih.mp4'); + +interface SpeechContentProps { + prompt: string; + autoplay: boolean; + voice: string; + format: string; + speed: number; +} +const SpeechItem: React.FC = (props) => { + console.log('porps=======', props); + const [collapsed, setCollapsed] = useState(false); + const ref = useRef(null); + + const handlePlay = () => { + ref.current?.play(); + }; + + const handleCollapse = () => { + setCollapsed(!collapsed); + }; + + return ( +
+
+ {/* */} +
+ + {props.voice} +
+
+ +
+
+
+ + {props.format} + + {props.speed}x + +
+ + + + + + + + + +
+
+ {collapsed && ( +
+
{props.prompt}
+
+ )} +
+ ); +}; + +export default React.memo(SpeechItem); diff --git a/src/components/speech-content/styles/index.less b/src/components/speech-content/styles/index.less new file mode 100644 index 00000000..928e26c7 --- /dev/null +++ b/src/components/speech-content/styles/index.less @@ -0,0 +1,93 @@ +.speech-item { + display: flex; + justify-content: flex-start; + align-items: center; + + .voice { + width: 80px; + display: flex; + justify-content: flex-start; + align-items: center; + gap: 5px; + + .text { + display: flex; + padding: 2px 4px; + border-radius: 4px; + border: 1px solid var(--ant-color-border); + } + } + + .wrapper { + flex: 1; + display: flex; + justify-content: flex-start; + align-items: center; + + .audio-container { + flex: 1; + } + + .format { + display: flex; + padding-left: 5px; + } + } + + audio { + flex: 1; + } +} + +.prompt-box { + padding-left: 80px; + + .prompt { + margin-top: 16px; + padding: 10px; + border-radius: var(--border-radius-base); + background-color: var(--ant-color-fill-quaternary); + } +} + +.speech-actions { + display: flex; + justify-content: space-between; + margin-top: 10px; + padding-left: 80px; + + .actions { + display: flex; + justify-content: flex-start; + align-items: center; + gap: 15px; + + .anticon { + font-size: 14px; + } + } + + .tags { + display: flex; + justify-content: flex-start; + align-items: center; + + .item { + display: flex; + justify-content: center; + align-items: center; + padding: 2px; + border-radius: 4px; + color: var(--ant-color-text-tertiary); + } + + .splitor { + display: flex; + width: 1px; + height: 1px; + border-radius: 2px; + margin: 0 8px; + background-color: var(--ant-color-fill-content-hover); + } + } +} diff --git a/src/components/upload-audio/index.tsx b/src/components/upload-audio/index.tsx new file mode 100644 index 00000000..958438f4 --- /dev/null +++ b/src/components/upload-audio/index.tsx @@ -0,0 +1,54 @@ +import { UploadOutlined } from '@ant-design/icons'; +import { Button, Tooltip, Upload } from 'antd'; +import React from 'react'; + +interface UploadAudioProps { + accept?: string; + maxCount?: number; + type?: 'text' | 'primary' | 'default'; + onChange?: (data: { file: any; fileList: any[] }) => void; +} + +const UploadAudio: React.FC = (props) => { + const beforeUpload = (file: any) => { + return true; + }; + + const handleOnChange = React.useCallback( + (data: { file: any; fileList: any }) => { + console.log('handleOnChange', data); + props.onChange?.(data); + }, + [] + ); + return ( + + +
+ +
+
+
+ ); +}; + +export default React.memo(UploadAudio); diff --git a/src/locales/en-US/menu.ts b/src/locales/en-US/menu.ts index dad668bb..bc45b62c 100644 --- a/src/locales/en-US/menu.ts +++ b/src/locales/en-US/menu.ts @@ -4,8 +4,8 @@ export default { 'menu.playground.rerank': 'Rerank', 'menu.playground.embedding': 'Embedding', 'menu.playground.chat': 'Chat', - 'menu.playground.speech': 'Speech', - 'menu.playground.text2images': 'Text to Images', + 'menu.playground.speech': 'Audio', + 'menu.playground.text2images': 'Image', 'menu.compare': 'Compare', 'menu.models': 'Models', 'menu.resources': 'Resources', diff --git a/src/locales/en-US/playground.ts b/src/locales/en-US/playground.ts index 5ca57e4f..f49d89f0 100644 --- a/src/locales/en-US/playground.ts +++ b/src/locales/en-US/playground.ts @@ -36,6 +36,7 @@ export default { 'playground.img.upload.success': 'Upload Success', 'playground.img.upload.error': 'Upload Error', 'playground.toolbar.clearmsg': 'Clear Messages', + 'playground.toolbar.autoplay': 'Autoplay', 'playground.toolbar.prompts': 'Prompts', 'playground.toolbar.compare2Model': '2-Model Comparison', 'playground.toolbar.compare3Model': '3-Model Comparison', diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts index 735195d7..70d573ba 100644 --- a/src/locales/zh-CN/menu.ts +++ b/src/locales/zh-CN/menu.ts @@ -5,7 +5,7 @@ export default { 'menu.playground.embedding': '文本嵌入', 'menu.playground.chat': '对话', 'menu.playground.speech': '语音', - 'menu.playground.text2images': '文生图', + 'menu.playground.text2images': '图片', 'menu.compare': '多模型对比', 'menu.models': '模型', 'menu.resources': '资源', diff --git a/src/locales/zh-CN/playground.ts b/src/locales/zh-CN/playground.ts index 51f9608c..a57d0769 100644 --- a/src/locales/zh-CN/playground.ts +++ b/src/locales/zh-CN/playground.ts @@ -36,6 +36,7 @@ export default { 'playground.img.upload.success': '上传成功', 'playground.img.upload.error': '上传失败', 'playground.toolbar.clearmsg': '清空消息', + 'playground.toolbar.autoplay': '自动播放', 'playground.toolbar.prompts': '提示词', 'playground.toolbar.compare2Model': '2 模型对比', 'playground.toolbar.compare3Model': '3 模型对比', diff --git a/src/pages/playground/apis/index.ts b/src/pages/playground/apis/index.ts index 435da7d0..2be8b300 100644 --- a/src/pages/playground/apis/index.ts +++ b/src/pages/playground/apis/index.ts @@ -43,6 +43,8 @@ export const rerankerQuery = async ( export const handleEmbedding = async ( params: { model: string; + encoding_format?: string; + dimensions?: number; input: string[]; }, options?: any diff --git a/src/pages/playground/components/audio-content.tsx b/src/pages/playground/components/audio-content.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/pages/playground/components/audio-input.tsx b/src/pages/playground/components/audio-input.tsx new file mode 100644 index 00000000..b7cf49b2 --- /dev/null +++ b/src/pages/playground/components/audio-input.tsx @@ -0,0 +1,246 @@ +import { AudioOutlined } from '@ant-design/icons'; +import { Button, Space, Tooltip } from 'antd'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +// import '../style/audio-input.less'; + +interface AudioInputProps { + onAudioData: (audioData: { + chunks: any[]; + url: string; + name: string; + duration: number; + }) => void; + onAnalyse?: (analyseData: any, frequencyBinCount: any) => void; + onAudioPermission: (audioPermission: boolean) => void; + onRecord?: (isRecording: boolean) => void; + voiceActivity?: boolean; + type?: 'text' | 'primary' | 'default'; +} + +const AudioInput: React.FC = (props) => { + const [audioOn, setAudioOn] = useState(false); + const [isRecording, setIsRecording] = useState(false); + const [audioPermission, setAudioPermission] = useState(true); + const audioStream = useRef(null); + const audioRecorder = useRef(null); + const startTime = useRef(0); + const audioContext = useRef(null); + const analyser = useRef(null); + const dataArray = useRef(null); + const canvasRef = useRef(null); + + const initAudioContext = useCallback(() => { + audioContext.current = new (window.AudioContext || + window.webkitAudioContext)(); + + analyser.current = audioContext.current.createAnalyser(); + analyser.current.fftSize = 256; + dataArray.current = new Uint8Array(analyser.current.frequencyBinCount); + }, []); + + const generateVisualData = useCallback(() => { + const source = audioContext.current.createMediaStreamSource( + audioStream.current + ); + source.connect(analyser.current); + }, []); + + // stop all audio tracks + const stopAudioTracks = () => { + audioStream.current?.getTracks().forEach((track: any) => { + track.stop(); + }); + }; + + const handleStopRecording = () => { + setIsRecording(false); + audioRecorder.current?.stop(); + props.onRecord?.(false); + }; + + // get all audio tracks + const getAudioTracks = () => { + const audioTracks = audioStream.current.getAudioTracks(); + audioTracks.forEach((track: any) => { + track.onended = () => { + setAudioPermission(false); + }; + }); + }; + + // check if microphone is on + const isMicrophoneOn = () => { + return ( + audioStream.current && + audioStream.current + .getTracks() + .some((track: any) => track.readyState === 'live') + ); + }; + + const microphonePermissionDenied = async () => { + const permissionStatus = await navigator.permissions.query({ + name: 'microphone' as any + }); + + return permissionStatus.state === 'denied'; + }; + + const checkMicrophonePermission = async () => { + try { + const permissionStatus = await navigator.permissions.query({ + name: 'microphone' as any + }); + console.log('permissionStatus:', permissionStatus); + if (permissionStatus.state === 'granted') { + setAudioPermission(true); + props.onAudioPermission(true); + } else if (permissionStatus.state === 'denied') { + setAudioPermission(false); + props.onAudioPermission(false); + handleStopRecording(); + } + + permissionStatus.onchange = () => { + console.log('permission changed'); + checkMicrophonePermission(); + }; + } catch (error) { + // todo + } + }; + + // open audio + const EnableAudio = async () => { + try { + audioStream.current = await navigator.mediaDevices.getUserMedia({ + audio: true + }); + getAudioTracks(); + setAudioOn(true); + setAudioPermission(true); + initAudioContext(); + } catch (error) { + // console.log(error); + } + }; + + // close audio + const disableAudio = () => { + stopAudioTracks(); + setAudioOn(false); + handleStopRecording(); + audioStream.current = null; + }; + + const stopRecording = () => { + audioRecorder.current?.stop(); + setIsRecording(false); + }; + + const handleAudioData = (audioData: any) => { + props.onAudioData?.(audioData); + }; + + // start recording + const StartRecording = async () => { + if (isRecording) { + stopRecording(); + return; + } + try { + await EnableAudio(); + console.log('audioStream:', audioStream.current); + audioRecorder.current = new MediaRecorder(audioStream.current); + + const audioChunks: any[] = []; + + audioRecorder.current.ondataavailable = (event: any) => { + audioChunks.push(event.data); + if (props.voiceActivity) { + analyser.current?.getByteFrequencyData(dataArray.current); + + props.onAnalyse?.(dataArray.current, analyser); + } + }; + + // stop recording + audioRecorder.current.onstop = () => { + const audioBlob = new Blob(audioChunks, { type: 'audio/wav' }); + const audioUrl = URL.createObjectURL(audioBlob); + + handleAudioData({ + chunks: audioChunks, + size: audioBlob.size, + type: audioBlob.type, + url: audioUrl, + name: `recording-${new Date().toISOString()}.wav`, + duration: Math.ceil((Date.now() - startTime.current) / 1000) + }); + + props.onAnalyse?.([], null); + }; + + setIsRecording(true); + props.onRecord?.(true); + startTime.current = Date.now(); + audioRecorder.current.start(1000); + generateVisualData(); + } catch (error) { + // console.log(error); + } + }; + + useEffect(() => { + return () => { + handleStopRecording(); + stopAudioTracks(); + }; + }, []); + + useEffect(() => { + checkMicrophonePermission(); + }, []); + + return ( +
+ + { + +
+ +
+
+ } + {/* {isRecording && ( + + + + )} */} +
+
+ ); +}; + +export default React.memo(AudioInput); diff --git a/src/pages/playground/components/ground-embedding.tsx b/src/pages/playground/components/ground-embedding.tsx index c2755b27..5927c2ee 100644 --- a/src/pages/playground/components/ground-embedding.tsx +++ b/src/pages/playground/components/ground-embedding.tsx @@ -11,10 +11,12 @@ import { import { useIntl, useSearchParams } from '@umijs/max'; import { Button, Tooltip } from 'antd'; import classNames from 'classnames'; +import { PCA } from 'ml-pca'; import 'overlayscrollbars/overlayscrollbars.css'; import { forwardRef, memo, + useCallback, useEffect, useImperativeHandle, useMemo, @@ -23,7 +25,7 @@ import { } from 'react'; import { UMAP } from 'umap-js'; import { handleEmbedding } from '../apis'; -import { MessageItem, ParamsSchema } from '../config/types'; +import { ParamsSchema } from '../config/types'; import '../style/ground-left.less'; import '../style/rerank.less'; import '../style/system-message-wrap.less'; @@ -40,34 +42,34 @@ interface MessageProps { } const paramsConfig: ParamsSchema[] = [ - { - type: 'Select', - name: 'truncate', - label: { - text: 'Truncate', - isLocalized: false - }, - options: [ - { - label: 'None', - value: 'none' - }, - { - label: 'Start', - value: 'start' - }, - { - label: 'End', - value: 'end' - } - ], - rules: [ - { - required: true, - message: 'Please select truncate' - } - ] - } + // { + // type: 'Select', + // name: 'truncate', + // label: { + // text: 'Truncate', + // isLocalized: false + // }, + // options: [ + // { + // label: 'None', + // value: 'none' + // }, + // { + // label: 'Start', + // value: 'start' + // }, + // { + // label: 'End', + // value: 'end' + // } + // ], + // rules: [ + // { + // required: true, + // message: 'Please select truncate' + // } + // ] + // } ]; const initialValues = { @@ -79,7 +81,6 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { const acceptType = '.txt, .doc, .docx, .xls, .xlsx, .csv, .md, .pdf, .eml, .msg, .ppt, .pptx, .xml, .epub, .html'; const messageId = useRef(0); - const [messageList, setMessageList] = useState([]); const intl = useIntl(); const requestSource = useRequestToken(); @@ -117,11 +118,11 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { const [scatterData, setScatterData] = useState([]); - const { initialize, updateScrollerPosition } = useOverlayScroller(); - const { - initialize: innitializeParams, - updateScrollerPosition: updateDocumentScrollerPosition - } = useOverlayScroller(); + const { initialize, updateScrollerPosition: updateDocumentScrollerPosition } = + useOverlayScroller(); + + const { initialize: innitializeParams, updateScrollerPosition } = + useOverlayScroller(); useImperativeHandle(ref, () => { return { @@ -139,35 +140,74 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { return list.length < 2; }, [textList, fileList]); - const generateEmbedding = (embeddings: any[]) => { - try { - const umap = new UMAP({ - // random() { - // return 0.1; - // }, - // minDist: 0.1, - nComponents: 2, - nNeighbors: 1 - }); - - const dataList = embeddings.map((item) => { - return item.embedding; - }); + const cosine = useCallback((x: number[], y: number[]) => { + let result = 0; + let normX = 0; + let normY = 0; - const embedding = umap.fit([...dataList, ...dataList]); + for (let i = 0; i < x.length; i++) { + result += x[i] * y[i]; + normX += x[i] ** 2; + normY += y[i] ** 2; + } - const list = embedding.map((item: number[], index: number) => { - return { - value: item, - name: index + 1, - text: `test test test test test` - }; - }); - setScatterData(list); - } catch (e) { - // console.log('error:', e); + if (normX === 0 && normY === 0) { + return 0; + } else if (normX === 0 || normY === 0) { + return 1; + } else { + return 1 - result / Math.sqrt(normX * normY); } - }; + }, []); + + const generateEmbedding = useCallback( + (embeddings: any[]) => { + try { + const umap = new UMAP({ + // random: random, + minDist: 0, + nComponents: 3, + nEpochs: 200, + distanceFn: cosine, + nNeighbors: embeddings.length - 1 + }); + + const dataList = embeddings.map((item) => { + return item.embedding; + }); + + const embedding = umap.fit([...dataList]); + console.log('embedding:----------------', embedding); + const pca = new PCA(dataList, {}); + console.log('dataList====', dataList, embeddings); + const pcadata = pca.predict(dataList, { nComponents: 2 }).to2DArray(); + console.log('pcadata++++++++++++++++', pcadata); + + const input = [ + ...textList.map((item) => item.text), + ...fileList.map((item) => item.text) + ]; + + const list = pcadata.map((item: number[], index: number) => { + return { + value: item, + name: index + 1, + text: input[index] + }; + }); + console.log('embedding____________:', { + list, + input, + textList, + fileList + }); + setScatterData(list); + } catch (e) { + console.log('error:', e); + } + }, + [textList, fileList] + ); const setMessageId = () => { messageId.current = messageId.current + 1; @@ -193,6 +233,7 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { const result: any = await handleEmbedding( { model: parameters.model, + encoding_format: 'float', input: [ ...textList.map((item) => item.text), ...fileList.map((item) => item.text) @@ -221,14 +262,6 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { setLoading(false); } }; - const handleClear = () => { - if (!messageList.length) { - return; - } - setMessageId(); - setScatterData([]); - setTokenResult(null); - }; const handleSendMessage = () => { submitMessage(); @@ -297,10 +330,6 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { } }, [paramsRef.current, innitializeParams]); - useEffect(() => { - updateScrollerPosition(); - }, [messageList]); - useEffect(() => { if (textList.length + fileList.length > messageListLengthCache.current) { updateDocumentScrollerPosition(); diff --git a/src/pages/playground/components/ground-images.tsx b/src/pages/playground/components/ground-images.tsx index 5596d93a..2760cd04 100644 --- a/src/pages/playground/components/ground-images.tsx +++ b/src/pages/playground/components/ground-images.tsx @@ -1,27 +1,24 @@ import useOverlayScroller from '@/hooks/use-overlay-scroller'; import useRequestToken from '@/hooks/use-request-token'; +import ThumbImg from '@/pages/playground/components/thumb-img'; import { useIntl, useSearchParams } from '@umijs/max'; -import { Spin } from 'antd'; import classNames from 'classnames'; import _ from 'lodash'; import 'overlayscrollbars/overlayscrollbars.css'; -import { +import React, { forwardRef, memo, useEffect, useImperativeHandle, - useMemo, useRef, useState } from 'react'; import { createImages } from '../apis'; -import { Roles, generateMessages } from '../config'; import { ImageParamsConfig as paramsConfig } from '../config/params-config'; import { MessageItem } from '../config/types'; import '../style/ground-left.less'; import '../style/system-message-wrap.less'; import MessageInput from './message-input'; -import MessageContent from './multiple-chat/message-content'; import ReferenceParams from './reference-params'; import RerankerParams from './reranker-params'; import ViewCodeModal from './view-code-modal'; @@ -42,24 +39,24 @@ const initialValues = { const GroundImages: React.FC = forwardRef((props, ref) => { const { modelList } = props; const messageId = useRef(0); - const [messageList, setMessageList] = useState([]); + const [messageList, setMessageList] = useState< + { dataUrl: string; height: number; uid: number }[] + >([]); const intl = useIntl(); const requestSource = useRequestToken(); const [searchParams] = useSearchParams(); const selectModel = searchParams.get('model') || ''; const [parameters, setParams] = useState({}); - const [systemMessage, setSystemMessage] = useState(''); const [show, setShow] = useState(false); const [loading, setLoading] = useState(false); const [tokenResult, setTokenResult] = useState(null); const [collapse, setCollapse] = useState(false); - const contentRef = useRef(''); const scroller = useRef(null); - const currentMessageRef = useRef(null); const paramsRef = useRef(null); const messageListLengthCache = useRef(0); const requestToken = useRef(null); + const [currentPrompt, setCurrentPrompt] = useState(''); const { initialize, updateScrollerPosition } = useOverlayScroller(); const { initialize: innitializeParams } = useOverlayScroller(); @@ -76,32 +73,11 @@ const GroundImages: React.FC = forwardRef((props, ref) => { }; }); - const viewCodeMessage = useMemo(() => { - return generateMessages([ - { role: Roles.System, content: systemMessage }, - ...messageList - ]); - }, [messageList, systemMessage]); - const setMessageId = () => { messageId.current = messageId.current + 1; return messageId.current; }; - const handleNewMessage = (message?: { role: string; content: string }) => { - const newMessage = message || { - role: - _.last(messageList)?.role === Roles.User ? Roles.Assistant : Roles.User, - content: '' - }; - messageList.push({ - ...newMessage, - uid: messageId.current + 1 - }); - setMessageId(); - setMessageList([...messageList]); - }; - const handleStopConversation = () => { requestToken.current?.cancel?.(); setLoading(false); @@ -112,26 +88,25 @@ const GroundImages: React.FC = forwardRef((props, ref) => { try { setLoading(true); setMessageId(); + setCurrentPrompt(current?.content || ''); + setMessageList( + Array(parameters.n) + .fill({}) + .map((item, index: number) => { + return { + dataUrl: '', + height: 256, + width: 256, + uid: index + }; + }) + ); requestToken.current?.cancel?.(); requestToken.current = requestSource(); - currentMessageRef.current = current - ? [ - { - ...current, - uid: messageId.current - } - ] - : []; - - contentRef.current = ''; - setMessageList((pre) => { - return [...pre, ...currentMessageRef.current]; - }); - const params = { - prompt: current?.content || '', + prompt: current?.content || currentPrompt || '', ...parameters }; @@ -143,25 +118,19 @@ const GroundImages: React.FC = forwardRef((props, ref) => { return { dataUrl: `data:image/png;base64,${item.b64_json}`, created: result.created, + height: 256, + width: 256, uid: index }; }); - setMessageList((pre) => { - return [ - ...pre, - { - content: '', - role: Roles.Assistant, - imgs: imgList, - uid: messageId.current - } - ]; - }); + setMessageList(imgList); console.log('result:', imgList); setMessageId(); } catch (error) { // console.log('error:', error); + requestToken.current?.cancel?.(); + setMessageList([]); } finally { setLoading(false); } @@ -177,8 +146,7 @@ const GroundImages: React.FC = forwardRef((props, ref) => { const handleSendMessage = (message: Omit) => { console.log('message:', message); - const currentMessage = - message.content || message.imgs?.length ? message : undefined; + const currentMessage = message.content ? message : undefined; submitMessage(currentMessage); }; @@ -186,23 +154,6 @@ const GroundImages: React.FC = forwardRef((props, ref) => { setShow(false); }; - const handleSelectModel = () => {}; - - const handlePresetPrompt = (list: { role: string; content: string }[]) => { - const sysMsg = list.filter((item) => item.role === 'system'); - const userMsg = list - .filter((item) => item.role === 'user') - .map((item) => { - setMessageId(); - return { - ...item, - uid: messageId.current - }; - }); - setSystemMessage(sysMsg[0]?.content || ''); - setMessageList(userMsg); - }; - useEffect(() => { if (scroller.current) { initialize(scroller.current); @@ -234,22 +185,12 @@ const GroundImages: React.FC = forwardRef((props, ref) => {
<>
- - {loading && ( - -
-
- )} + >
@@ -260,19 +201,15 @@ const GroundImages: React.FC = forwardRef((props, ref) => { )}
@@ -297,7 +234,7 @@ const GroundImages: React.FC = forwardRef((props, ref) => { = forwardRef((props, ref) => { const [tokenResult, setTokenResult] = useState(null); const [collapse, setCollapse] = useState(false); const contentRef = useRef(''); - const controllerRef = useRef(null); const scroller = useRef(null); - const currentMessageRef = useRef(null); const inputListRef = useRef(null); const paramsRef = useRef(null); const messageListLengthCache = useRef(0); const requestToken = useRef(null); const [fileList, setFileList] = useState< - { text: string; name: string; uid: number | string }[] + { + text: string; + name: string; + uid: number | string; + score?: number; + showExtra?: boolean; + percent?: number; + rank?: number; + }[] >([]); const [textList, setTextList] = useState< - { text: string; uid: number | string; name: string }[] + { + text: string; + uid: number | string; + name: string; + score?: number; + showExtra?: boolean; + percent?: number; + rank?: number; + }[] >([ { text: '', @@ -99,11 +112,10 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { } ]); - const { initialize, updateScrollerPosition } = useOverlayScroller(); - const { - initialize: innitializeParams, - updateScrollerPosition: updateDocumentScrollerPosition - } = useOverlayScroller(); + const { initialize, updateScrollerPosition: updateDocumentScrollerPosition } = + useOverlayScroller(); + const { initialize: innitializeParams, updateScrollerPosition } = + useOverlayScroller(); useImperativeHandle(ref, () => { return { @@ -116,8 +128,74 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { }; }); + // [0.1, 1.0] + const normalizValue = (data: { min: number; max: number; value: number }) => { + const range = [0.5, 1.0]; + const [a, b] = range; + const { min, max, value } = data; + + if (isNaN(value) || isNaN(min) || isNaN(max) || min > max) { + return 0; + } + if (min === max) { + return 100; + } + const res = a + ((value - min) * (b - a)) / (max - min); + return res * 100; + }; + + const renderPercent = useCallback((data: any) => { + if (!data.showExtra) { + return null; + } + const percent = data.percent; + return ( + <> + + + Rank: {data.rank} + + Score: {_.round(data.score, 2)} + + + + ); + }, []); + const setMessageId = () => { messageId.current = messageId.current + 1; + return messageId.current; }; const handleStopConversation = () => { @@ -153,28 +231,52 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { token: requestToken.current.token } ); - console.log('result:', result); setMessageId(); setTokenResult(result.usage); - const maxItem = _.maxBy(result.results || [], (item: any) => - Math.abs(item.relevance_score) + + const sortList = _.sortBy( + result.results || [], + (item: any) => item.relevance_score ); - const maxValue = _.ceil(maxItem?.relevance_score, 2); + const maxValue = sortList[sortList.length - 1].relevance_score; + const minValue = sortList[0].relevance_score; + + let newTextList = [...textList]; + + result.results?.forEach((item: any, sIndex: number) => { + newTextList[item.index] = { + ...newTextList[item.index], + rank: sIndex + 1, + score: item.relevance_score, + showExtra: true, + percent: normalizValue({ + min: minValue, + max: maxValue, + value: item.relevance_score + }) + }; + }); + setTextList(newTextList); setMessageList([ { title: 'Results', role: '', content: result.results?.map((item: any) => { + const percent: number = normalizValue({ + min: minValue, + max: maxValue, + value: item.relevance_score + }); return { uid: item.index, text: `${item.document?.text?.slice(0, 500) || ''}`, docIndex: item.index, title: documentList[item.index]?.name || '', score: item.relevance_score, - normalizValue: - _.round(_.round(item.relevance_score, 2) / maxValue, 2) * 100 + extra: renderPercent(percent), + normalizValue: percent }; }), uid: messageId.current @@ -280,8 +382,11 @@ const GroundReranker: React.FC = forwardRef((props, ref) => {
} loading={loading} disabled={!parameters.model} @@ -294,7 +399,11 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { placeholer={intl.formatMessage({ id: 'playground.input.keyword.holder' })} - tools={Query} + tools={ + + Query + + } style={{ borderTop: 'none', width: 'unset', @@ -313,19 +422,6 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { Documents
- {/* - Support: {acceptType}}> - - - */}
{messageList.length ? (

Results

- + {tokenResult?.total_tokens && ( + + {intl.formatMessage({ id: 'playground.tokenusage' })}:{' '} + {tokenResult?.total_tokens} + + )}
) : null}
@@ -371,7 +463,7 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { > <>
- + {/**/} {loading && (
@@ -402,7 +494,9 @@ const GroundReranker: React.FC = forwardRef((props, ref) => { item.text)} + documentList={[...textList, ...fileList] + .map((item) => item.text) + .filter((text) => text)} parameters={{ ...parameters, query: contentRef.current diff --git a/src/pages/playground/components/ground-stt.tsx b/src/pages/playground/components/ground-stt.tsx index 9a120a61..990843e1 100644 --- a/src/pages/playground/components/ground-stt.tsx +++ b/src/pages/playground/components/ground-stt.tsx @@ -1,7 +1,475 @@ -import React from 'react'; +import AudioAnimation from '@/components/audio-animation'; +import AudioPlayer from '@/components/audio-player'; +import IconFont from '@/components/icon-font'; +import UploadAudio from '@/components/upload-audio'; +import useOverlayScroller from '@/hooks/use-overlay-scroller'; +import { fetchChunkedData, readStreamData } from '@/utils/fetch-chunk-data'; +import { readAudioFile } from '@/utils/load-audio-file'; +import { AudioOutlined, ThunderboltOutlined } from '@ant-design/icons'; +import { useIntl, useSearchParams } from '@umijs/max'; +import { Button, Spin, Tag, Tooltip } from 'antd'; +import classNames from 'classnames'; +import _ from 'lodash'; +import 'overlayscrollbars/overlayscrollbars.css'; +import { + forwardRef, + memo, + useCallback, + useEffect, + useImperativeHandle, + useMemo, + useRef, + useState +} from 'react'; +import { CHAT_API } from '../apis'; +import { Roles, generateMessages } from '../config'; +import { RealtimeParamsConfig as paramsConfig } from '../config/params-config'; +import { MessageItem } from '../config/types'; +import '../style/ground-left.less'; +import '../style/speech-to-text.less'; +import '../style/system-message-wrap.less'; +import AudioInput from './audio-input'; +import MessageContent from './multiple-chat/message-content'; +import RerankerParams from './reranker-params'; +import ViewCodeModal from './view-code-modal'; -const GroundStt = () => { - return
STT
; +interface MessageProps { + modelList: Global.BaseOption[]; + loaded?: boolean; + ref?: any; +} + +const initialValues = { + language: 'auto' }; -export default React.memo(GroundStt); +const GroundLeft: React.FC = forwardRef((props, ref) => { + const { modelList } = props; + const messageId = useRef(0); + const [messageList, setMessageList] = useState([]); + + const intl = useIntl(); + const [searchParams] = useSearchParams(); + const selectModel = searchParams.get('model') || ''; + const [parameters, setParams] = useState({}); + const [systemMessage, setSystemMessage] = useState(''); + const [show, setShow] = useState(false); + const [loading, setLoading] = useState(false); + const [tokenResult, setTokenResult] = useState(null); + const [collapse, setCollapse] = useState(false); + const contentRef = useRef(''); + const controllerRef = useRef(null); + const scroller = useRef(null); + const currentMessageRef = useRef(null); + const paramsRef = useRef(null); + const messageListLengthCache = useRef(0); + const [audioPermissionOn, setAudioPermissionOn] = useState(true); + const [audioData, setAudioData] = useState(null); + const [audioChunks, setAudioChunks] = useState({ + data: [], + analyser: null + }); + const [isRecording, setIsRecording] = useState(false); + + const { initialize, updateScrollerPosition } = useOverlayScroller(); + const { initialize: innitializeParams } = useOverlayScroller(); + + useImperativeHandle(ref, () => { + return { + viewCode() { + setShow(true); + }, + setCollapse() { + setCollapse(!collapse); + }, + collapse: collapse + }; + }); + + const viewCodeMessage = useMemo(() => { + return generateMessages([ + { role: Roles.System, content: systemMessage }, + ...messageList + ]); + }, [messageList, systemMessage]); + + const setMessageId = () => { + messageId.current = messageId.current + 1; + }; + + const joinMessage = (chunk: any) => { + setTokenResult({ + ...(chunk?.usage ?? {}) + }); + + if (!chunk || !_.get(chunk, 'choices', []).length) { + return; + } + contentRef.current = + contentRef.current + _.get(chunk, 'choices.0.delta.content', ''); + setMessageList([ + ...messageList, + ...currentMessageRef.current, + { + role: Roles.Assistant, + content: contentRef.current, + uid: messageId.current + } + ]); + }; + const handleStopConversation = () => { + controllerRef.current?.abort?.(); + setLoading(false); + }; + + const submitMessage = async (current?: { role: string; content: string }) => { + if (!parameters.model) return; + try { + setLoading(true); + setMessageId(); + setTokenResult(null); + + controllerRef.current?.abort?.(); + controllerRef.current = new AbortController(); + const signal = controllerRef.current.signal; + currentMessageRef.current = current + ? [ + { + ...current, + uid: messageId.current + } + ] + : []; + + contentRef.current = ''; + setMessageList((pre) => { + return [...pre, ...currentMessageRef.current]; + }); + + const messageParams = [ + { role: Roles.System, content: systemMessage }, + ...messageList, + ...currentMessageRef.current + ]; + + const messages = generateMessages(messageParams); + + const chatParams = { + messages: messages, + ...parameters, + stream: true, + stream_options: { + include_usage: true + } + }; + const result: any = await fetchChunkedData({ + data: chatParams, + url: CHAT_API, + signal + }); + + if (result?.error) { + setTokenResult({ + error: true, + errorMessage: + result?.data?.error?.message || result?.data?.message || '' + }); + return; + } + setMessageId(); + const { reader, decoder } = result; + await readStreamData(reader, decoder, (chunk: any) => { + if (chunk?.error) { + setTokenResult({ + error: true, + errorMessage: chunk?.error?.message || chunk?.message || '' + }); + return; + } + joinMessage(chunk); + }); + } catch (error) { + // console.log('error:', error); + } finally { + setLoading(false); + } + }; + const handleClear = () => { + if (!messageList.length) { + return; + } + setMessageId(); + setMessageList([]); + setTokenResult(null); + }; + + const renderTitle = useCallback((role: string) => { + return ( + + {intl.formatMessage({ id: `playground.${role}` })} + 00:10 + + ); + }, []); + + const handleSendMessage = (message: Omit) => { + setLoading(true); + setMessageList([ + ...messageList, + { + role: Roles.User, + title: renderTitle(Roles.User), + content: 'test data test data', + uid: messageId.current + } + ]); + + setTimeout(() => { + setMessageList([ + ...messageList, + { + role: Roles.Assistant, + title: renderTitle(Roles.Assistant), + content: 'generate by assistant', + uid: messageId.current + } + ]); + setLoading(false); + }, 1000); + }; + + const handleCloseViewCode = () => { + setShow(false); + }; + + const handleOnAudioData = useCallback( + (data: { chunks: Blob[]; url: string; name: string; duration: number }) => { + setAudioData(() => { + return { + url: data.url, + name: data.name, + duration: data.duration + }; + }); + }, + [] + ); + + const handleOnAudioPermission = useCallback((permission: boolean) => { + setAudioPermissionOn(permission); + }, []); + + const handleUploadChange = useCallback( + async (data: { file: any; fileList: any }) => { + const res = await readAudioFile(data.file.originFileObj); + console.log('res=======', res); + setAudioData(res); + }, + [] + ); + + const handleOnAnalyse = useCallback((data: any, analyser: any) => { + setAudioChunks((pre: any) => { + return { + data: data, + analyser: analyser + }; + }); + }, []); + const handleOnRecord = useCallback((val: boolean) => { + setIsRecording(val); + setAudioData(null); + }, []); + + const renderAniamtion = () => { + if (!audioPermissionOn) { + return null; + } + if (isRecording) { + return ( + + ); + } + return ( +
+ + Upload an audio file or start recording +
+ ); + }; + + useEffect(() => {}, [messageList]); + useEffect(() => { + if (scroller.current) { + initialize(scroller.current); + } + }, [scroller.current, initialize]); + + useEffect(() => { + if (paramsRef.current) { + innitializeParams(paramsRef.current); + } + }, [paramsRef.current, innitializeParams]); + + useEffect(() => { + if (loading) { + updateScrollerPosition(); + } + }, [messageList, loading]); + + useEffect(() => { + if (messageList.length > messageListLengthCache.current) { + updateScrollerPosition(); + } + messageListLengthCache.current = messageList.length; + }, [messageList.length]); + + return ( +
+
+
+
+
+ + + + +
+ + {audioData ? ( +
+
+ +
+ + + +
+
+
+ ) : ( + renderAniamtion() + )} +
+ {!audioPermissionOn && ( +
+ + + } + > + + + Enable microphone access in your browser’s settings. + +
+ )} +
+
+ <> +
+ <> + + {loading && ( + +
+
+ )} + +
+ +
+
+
+
+ +
+
+ + +
+ ); +}); + +export default memo(GroundLeft); diff --git a/src/pages/playground/components/ground-tts.tsx b/src/pages/playground/components/ground-tts.tsx index edf99753..fe324bb2 100644 --- a/src/pages/playground/components/ground-tts.tsx +++ b/src/pages/playground/components/ground-tts.tsx @@ -1,3 +1,4 @@ +import SpeechContent from '@/components/speech-content'; import useOverlayScroller from '@/hooks/use-overlay-scroller'; import { fetchChunkedData, readStreamData } from '@/utils/fetch-chunk-data'; import { useIntl, useSearchParams } from '@umijs/max'; @@ -21,8 +22,6 @@ import { MessageItem } from '../config/types'; import '../style/ground-left.less'; import '../style/system-message-wrap.less'; import MessageInput from './message-input'; -import MessageContent from './multiple-chat/message-content'; -import SystemMessage from './multiple-chat/system-message'; import ReferenceParams from './reference-params'; import RerankerParams from './reranker-params'; import ViewCodeModal from './view-code-modal'; @@ -59,6 +58,7 @@ const GroundLeft: React.FC = forwardRef((props, ref) => { const currentMessageRef = useRef(null); const paramsRef = useRef(null); const messageListLengthCache = useRef(0); + const checkvalueRef = useRef(true); const { initialize, updateScrollerPosition } = useOverlayScroller(); const { initialize: innitializeParams } = useOverlayScroller(); @@ -207,10 +207,23 @@ const GroundLeft: React.FC = forwardRef((props, ref) => { }; const handleSendMessage = (message: Omit) => { - console.log('message:', message); - const currentMessage = - message.content || message.imgs?.length ? message : undefined; - submitMessage(currentMessage); + // submitMessage(currentMessage); + setMessageId(); + setLoading(true); + + setTimeout(() => { + setMessageList([ + { + prompt: message.content, + voice: parameters.voice, + format: parameters.response_format, + speed: parameters.speed, + uid: messageId.current, + autoplay: checkvalueRef.current + } + ]); + setLoading(false); + }, 1000); }; const handleCloseViewCode = () => { @@ -233,7 +246,10 @@ const GroundLeft: React.FC = forwardRef((props, ref) => { setSystemMessage(sysMsg[0]?.content || ''); setMessageList(userMsg); }; - + const handleOnCheckChange = (e: any) => { + console.log('handleOnCheckChange', e); + checkvalueRef.current = e.target.checked; + }; useEffect(() => { if (scroller.current) { initialize(scroller.current); @@ -264,32 +280,8 @@ const GroundLeft: React.FC = forwardRef((props, ref) => {
<> -
- -
-
- + {loading && (
@@ -306,9 +298,14 @@ const GroundLeft: React.FC = forwardRef((props, ref) => {
React.ReactNode; + textList: { + text: string; + uid: number | string; + name: string; + }[]; onChange?: ( textList: { text: string; uid: number | string; name: string }[] ) => void; } const InputList: React.FC = forwardRef( - ({ textList, onChange }, ref) => { + ({ textList, onChange, extra }, ref) => { const intl = useIntl(); const messageId = useRef(0); @@ -82,6 +87,7 @@ const InputList: React.FC = forwardRef( > + {extra?.(text)}
); })} diff --git a/src/pages/playground/components/message-input.tsx b/src/pages/playground/components/message-input.tsx index 64e964e9..e1d0274d 100644 --- a/src/pages/playground/components/message-input.tsx +++ b/src/pages/playground/components/message-input.tsx @@ -2,9 +2,9 @@ import IconFont from '@/components/icon-font'; import HotKeys, { KeyMap } from '@/config/hotkeys'; import { ClearOutlined, SendOutlined, SwapOutlined } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; -import { Button, Divider, Input, Select, Tooltip } from 'antd'; +import { Button, Checkbox, Divider, Input, Select, Tooltip } from 'antd'; import _ from 'lodash'; -import { useCallback, useMemo, useRef, useState } from 'react'; +import React, { useCallback, useMemo, useRef, useState } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { Roles } from '../config'; import { MessageItem } from '../config/types'; @@ -15,7 +15,14 @@ import UploadImg from './upload-img'; type CurrentMessage = Omit; -type ActionType = 'clear' | 'layout' | 'role' | 'upload' | 'add' | 'paste'; +type ActionType = + | 'clear' + | 'layout' + | 'role' + | 'upload' + | 'add' + | 'paste' + | 'check'; const layoutOptions = [ { @@ -57,7 +64,7 @@ const layoutOptions = [ ]; interface MessageInputProps { - modelList: Global.BaseOption[]; + modelList?: Global.BaseOption[]; handleSubmit: (params: CurrentMessage) => void; handleAbortFetch: () => void; updateLayout?: (value: { span: number; count: number }) => void; @@ -67,6 +74,7 @@ interface MessageInputProps { instanceId: symbol; })[] ) => void; + onCheck?: (e: any) => void; submitIcon?: React.ReactNode; presetPrompt?: (list: CurrentMessage[]) => void; addMessage?: (message: CurrentMessage) => void; @@ -75,11 +83,12 @@ interface MessageInputProps { showModelSelection?: boolean; disabled: boolean; isEmpty?: boolean; - scope: string; placeholer?: string; shouldResetMessage?: boolean; style?: React.CSSProperties; actions?: ActionType[]; + checkLabel?: React.ReactNode; + defaultSize?: { minRows: number; maxRows: number }; } const MessageInput: React.FC = ({ @@ -90,16 +99,18 @@ const MessageInput: React.FC = ({ clearAll, updateLayout, addMessage, + onCheck, loading, modelList, showModelSelection, disabled, isEmpty, - scope, submitIcon, placeholer, tools, style, + checkLabel, + defaultSize = { minRows: 3, maxRows: 8 }, shouldResetMessage = true, actions = ['clear', 'layout', 'role', 'upload', 'add', 'paste'] }) => { @@ -338,7 +349,6 @@ const MessageInput: React.FC = ({
- {tools} { <> {actions.includes('role') && ( @@ -362,6 +372,12 @@ const MessageInput: React.FC = ({ )} } + {tools} + {actions.includes('check') && ( + + {checkLabel} + + )} {actions.includes('clear') && ( = ({ > )} + {actions.includes('layout') && updateLayout && ( <> @@ -478,7 +495,10 @@ const MessageInput: React.FC = ({ ) : (