diff --git a/package-lock.json b/package-lock.json index 448d2c44..008187a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,15 @@ "version": "0.0.8", "license": "GPL-3.0-only", "dependencies": { - "@aitube/broadway": "0.1.3-1", - "@aitube/clap": "0.1.2", - "@aitube/clapper-services": "0.1.6", - "@aitube/engine": "0.1.2", - "@aitube/timeline": "0.1.3", + "@aitube/broadway": "0.2.0", + "@aitube/clap": "0.2.0", + "@aitube/clapper-services": "0.2.0-2", + "@aitube/engine": "0.2.0", + "@aitube/timeline": "0.2.0", "@fal-ai/serverless-client": "^0.13.0", "@ffmpeg/ffmpeg": "^0.12.10", "@ffmpeg/util": "^0.12.1", - "@gradio/client": "^1.4.0", + "@gradio/client": "^1.5.0", "@huggingface/hub": "^0.15.1", "@huggingface/inference": "^2.8.0", "@langchain/anthropic": "^0.2.12", @@ -163,23 +163,23 @@ } }, "node_modules/@aitube/broadway": { - "version": "0.1.3-1", - "resolved": "https://registry.npmjs.org/@aitube/broadway/-/broadway-0.1.3-1.tgz", - "integrity": "sha512-CA9VpBtnGYxiiP8cL+g8AyQjzZ+0bMBaNz5wVxA9+IO7HnsfKzQ3cbxDB/PV5GzUK70YsG1WhQ9nG/JgF+41rg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aitube/broadway/-/broadway-0.2.0.tgz", + "integrity": "sha512-L9/9ilCqrEAVveeIYE+2u/mNN6ngr5UeKJouiojWzBu1XXtdSf1E03nsMFYw++dPgdHZCmYQiovfAWFKBzWNoA==", "dependencies": { "@datagica/parse-entities": "^0.3.0", "@datagica/parse-names": "^0.0.8", "indexeddb-fs": "^2.1.5" }, "peerDependencies": { - "@aitube/clap": "0.1.2", - "@aitube/colors": "0.1.2" + "@aitube/clap": "0.2.0", + "@aitube/colors": "0.2.0" } }, "node_modules/@aitube/clap": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@aitube/clap/-/clap-0.1.2.tgz", - "integrity": "sha512-UH0V10DEq3gl5AuzKQJBwEcjD1o+K/MUD1i2K8WpmVb08Da6l34t40XSchWvjIYL97+d1KGA4pUv98WyfKaEaA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aitube/clap/-/clap-0.2.0.tgz", + "integrity": "sha512-dlUQBZ2+j59TrFv0LCkaS11ya/htggMYKgxkKtfJYJPl01/kasR7FJjMFDQ+TWbvnzUB0XZqq9H1YFRliCFKbw==", "dependencies": { "pure-uuid": "^1.8.1" }, @@ -188,12 +188,12 @@ } }, "node_modules/@aitube/clapper-services": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.1.6.tgz", - "integrity": "sha512-crdESrjarVJKI6ugIvqiqN8kxUR+eXocklrrJYI4eZtk+qHcntHLuitFO0fs0Kn3xk5mkHx0Gmqg3PE6pQDbvw==", + "version": "0.2.0-2", + "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.2.0-2.tgz", + "integrity": "sha512-lCXK8tP9Pj3kz/JCs1m/fN9Brx5c6WgZl6Lfo2d3yw9YvbguGDXWs/Q85LKtaL3o6oAhRQz1NUBsL3RHeubKaQ==", "peerDependencies": { - "@aitube/clap": "0.1.2", - "@aitube/timeline": "0.1.3", + "@aitube/clap": "0.2.0", + "@aitube/timeline": "0.2.0", "@monaco-editor/react": "4.6.0", "monaco-editor": "0.50.0", "react": "*", @@ -202,32 +202,32 @@ } }, "node_modules/@aitube/colors": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@aitube/colors/-/colors-0.1.2.tgz", - "integrity": "sha512-egegGnDxyZfxlsQFwuzgWuu/HOfj3j/JQbcGuRQi2FkMx7Ap6Sh7zsz5Lu0ZVn1b4ZtFZJsGi/wHByJIP/Qelg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aitube/colors/-/colors-0.2.0.tgz", + "integrity": "sha512-+MGbFf7sRxz8jQfkzGTYEBmlZ4VOyBugFHlSJN+jH8xaMNkmYWKxQRx9kZ8PkqvYQFHJcYCD1lBJLiTFAQ35fg==", "peer": true, "peerDependencies": { - "@aitube/clap": "0.1.2" + "@aitube/clap": "0.2.0" } }, "node_modules/@aitube/engine": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@aitube/engine/-/engine-0.1.2.tgz", - "integrity": "sha512-Tdw7Fx3G+mH9EAAlFyXxbCiVec1KwO2zsTP/oaUoMi3DMEknld4z2eZwYmTo+IpuTswPNhJeLlFCOqaST54Prg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aitube/engine/-/engine-0.2.0.tgz", + "integrity": "sha512-sAEjX2QoRdI/HE7ApkrLwBuCTlMh9g+hpNvkrTzpV1A/AMInAWkF0iiCs7PS9OaPT6F1U9Qr+yGqq4JFAgp32Q==", "peerDependencies": { - "@aitube/clap": "0.1.2" + "@aitube/clap": "0.2.0" } }, "node_modules/@aitube/timeline": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.1.3.tgz", - "integrity": "sha512-AM6J31BzHOwzrtXlMiLZ9XG+H9UgGb06zZ+9OFfmZTESR6iA98q9svw+utstXI3SmKyEBGIbYocYb5MQ+hSSvg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.2.0.tgz", + "integrity": "sha512-9OLLFv/syAdi3yx9zJ05EBiRLxDcexQ2sGoyKmjyJm568Yi/ZlDJBaY3bR+DUoxe1JfUrEueOxaF20BOj1wGNw==", "dependencies": { "date-fns": "^3.6.0", "react-virtualized-auto-sizer": "^1.0.24" }, "peerDependencies": { - "@aitube/clap": "0.1.2", + "@aitube/clap": "0.2.0", "@radix-ui/react-slider": "^1.1.2", "@react-spring/three": "^9.7.3", "@react-spring/types": "^9.7.3", @@ -2794,15 +2794,6 @@ "node": ">=14.14" } }, - "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emotion/is-prop-valid": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", @@ -2826,70 +2817,6 @@ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-arm64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", @@ -2906,294 +2833,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3319,20 +2958,20 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", - "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", "dependencies": { - "@floating-ui/utils": "^0.2.6" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", - "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.6" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/react-dom": { @@ -3348,9 +2987,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", - "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" }, "node_modules/@gar/promisify": { "version": "1.1.3", @@ -3359,9 +2998,9 @@ "dev": true }, "node_modules/@gradio/client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@gradio/client/-/client-1.4.0.tgz", - "integrity": "sha512-4QrJrUz0j75/2SpiHfhQmKmEuFcTbbuA8hpPFb+G0fvT1kd9fRPf1LhrwvsxFQaP3byZs+IeiV0dzCLveHgtfA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@gradio/client/-/client-1.5.0.tgz", + "integrity": "sha512-ZQ1coiujVZjVfas0zyyFgVQOocUL+pnYJagRNfLTzCsJ0m/DXGngELhGTM/QjIVkJGVDuhUyY5VCM7vD1n4LDQ==", "dependencies": { "@types/eventsource": "^1.1.15", "bufferutil": "^4.0.7", @@ -3401,14 +3040,14 @@ } }, "node_modules/@huggingface/inference/node_modules/@huggingface/tasks": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.11.6.tgz", - "integrity": "sha512-jIPlnJjSOqQCTpyCyIZCyamw3vOvMZrlaEdoB/PInHLnoaoqJKVIc0ijULKJxC3ClkgmehdoOu4J/yU+eGQLRw==" + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.11.8.tgz", + "integrity": "sha512-HOdx2vwhd/rCmy6gpDPiUbsXD+vwVpYSS/h2Tx+yV1uMDfS98MWl/TvoVGV+u5cJWTFbvdiTHMXIuw8B6JbHuQ==" }, "node_modules/@huggingface/jinja": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz", - "integrity": "sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.0.tgz", + "integrity": "sha512-GLJzso0M07ZncFkrJMIXVU4os6GFbPocD4g8fMQPMGJubf48FtGOsUORH2rtFdXPIPelz8SLBMn8ZRmOTwXm9Q==", "engines": { "node": ">=18" } @@ -3587,27 +3226,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", - "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.28", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@img/sharp-libvips-linux-x64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", @@ -3739,31 +3357,6 @@ "@img/sharp-libvips-linux-arm64": "1.0.2" } }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", - "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "glibc": ">=2.31", - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.2" - } - }, "node_modules/@img/sharp-linux-x64": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", @@ -3839,27 +3432,6 @@ "@img/sharp-libvips-linuxmusl-x64": "1.0.2" } }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", - "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.1.1" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@img/sharp-win32-ia32": { "version": "0.33.4", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", @@ -4166,13 +3738,13 @@ } }, "node_modules/@langchain/anthropic": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.12.tgz", - "integrity": "sha512-F74kgQiHHLMSc1CYB3wAPh6ou+ql8ExOqeOMe/NPwK8MuMqC6By/44lAtuV/hOSE/pUmQCNfJmnYwuwteXCXRA==", + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.13.tgz", + "integrity": "sha512-/alz3V3+8R25GM4jtNuPsPTeC39a4/mqsBx4gv7qBP5ENnH2xERse4dtSW8Tk7AHZNacZl8KKTMQi4N4c9NiSQ==", "dependencies": { "@anthropic-ai/sdk": "^0.22.0", - "@langchain/core": ">=0.2.16 <0.3.0", - "fast-xml-parser": "^4.3.5", + "@langchain/core": ">=0.2.21 <0.3.0", + "fast-xml-parser": "^4.4.1", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.4" }, @@ -4181,11 +3753,11 @@ } }, "node_modules/@langchain/cohere": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@langchain/cohere/-/cohere-0.2.1.tgz", - "integrity": "sha512-ZCrCVZGlmLEZB4wcIoNiWbWgljsqtdhsZZndh6Eajbm12G3sABdTIHzmq6h74sa9a+3aEDvNkYGQGGgGAh4x+Q==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@langchain/cohere/-/cohere-0.2.2.tgz", + "integrity": "sha512-XbH6vBnPz0dmJaTMKMFriFhh4eYiajYrEg7Jr0bdejj7s7lxhST92znNrJezi76LjSTtDQo3PyLBKDktk8OxKw==", "dependencies": { - "@langchain/core": ">=0.2.16 <0.3.0", + "@langchain/core": ">=0.2.21 <0.3.0", "cohere-ai": "^7.10.5", "uuid": "^10.0.0", "zod": "^3.23.8", @@ -4208,9 +3780,9 @@ } }, "node_modules/@langchain/core": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.20.tgz", - "integrity": "sha512-WPBjrzOj79/yqjloDUIw1GDhuRQfHis07TyyDj+qS81nHh0svSasetKcqAZ3L5JoPcBmEL7rRBtM+OcyC3mLVg==", + "version": "0.2.21", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.21.tgz", + "integrity": "sha512-NQaoiRG4lIAJKAlo1Ww/aLcC3azfXymHAmWPAJOFcugsOSXYlrj050hilZdLzHrpliS4vDMezHNSaCf+H0CInQ==", "dependencies": { "ansi-styles": "^5.0.0", "camelcase": "6", @@ -4290,11 +3862,11 @@ } }, "node_modules/@langchain/google-common": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@langchain/google-common/-/google-common-0.0.22.tgz", - "integrity": "sha512-LE2IWgjDsif5mjrG/EeHCfK/fnDIbuDYtBLC+Fk4MDJAsztB11A6w5F0Ms86M0BcJrt5ni4FkuG3kocvvVG2nQ==", + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@langchain/google-common/-/google-common-0.0.25.tgz", + "integrity": "sha512-5k9WrEAVT7po+NBa+36Xr2mkZzbw5JAV9kkdi4hjE3mCK8KS8s1kIqkbKZ4wfYCCP59ZcPs5MZayzbNdq8Dhag==", "dependencies": { - "@langchain/core": ">=0.2.16 <0.3.0", + "@langchain/core": ">=0.2.21 <0.3.0", "uuid": "^10.0.0", "zod-to-json-schema": "^3.22.4" }, @@ -4315,12 +3887,12 @@ } }, "node_modules/@langchain/google-gauth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@langchain/google-gauth/-/google-gauth-0.0.21.tgz", - "integrity": "sha512-2vaWACcocuklCL6XtRnTJD/QkrOmv/rF9yHibeDo4QGMbKzCrA9/TXE9T9N6hRl6tQD5qH2IR2rAp/f8ZUSfIQ==", + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@langchain/google-gauth/-/google-gauth-0.0.25.tgz", + "integrity": "sha512-M6kFGZNDGwYNQvr0kNCMQEWvxk8P8yGDk/KQul9UjjWrAmJuJ8qsVEtucvTzFIppj4ee6LR5CGxSJSmIynKMhQ==", "dependencies": { - "@langchain/core": ">0.1.56 <0.3.0", - "@langchain/google-common": "~0.0.22", + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/google-common": "~0.0.25", "google-auth-library": "^8.9.0" }, "engines": { @@ -4382,13 +3954,13 @@ } }, "node_modules/@langchain/openai": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.2.5.tgz", - "integrity": "sha512-gQXS5VBFyAco0jgSnUVan6fYVSIxlffmDaeDGpXrAmz2nQPgiN/h24KYOt2NOZ1zRheRzRuO/CfRagMhyVUaFA==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.2.6.tgz", + "integrity": "sha512-LZgSzHOZPJGsZr2ZXJICqZo1GN0kUyP9/RN+T45g7HDdMRfS5Df7fJgY9w7EIfznT83Q0Ywhz+At/UvWMR3xhw==", "dependencies": { - "@langchain/core": ">=0.2.16 <0.3.0", + "@langchain/core": ">=0.2.21 <0.3.0", "js-tiktoken": "^1.0.12", - "openai": "^4.49.1", + "openai": "^4.55.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" }, @@ -6183,9 +5755,9 @@ "integrity": "sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g==" }, "node_modules/@react-three/drei": { - "version": "9.109.2", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.2.tgz", - "integrity": "sha512-oUbfjiyPQeQch4Mi3jZvFKigMlc97/xvazxyjPBCGa8RP8cHZJl187eZI9Ha1WwkVaX80DfgN7bYAWXS4ywxmw==", + "version": "9.109.5", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.5.tgz", + "integrity": "sha512-Ftw2d01N+83aXTOOMA5y8hF2KBU0w7gBEctyjeHJihUyRuLBdfcgfu5c1OhBjhrdy23ycSYRINaeLkqUBPDFxQ==", "dependencies": { "@babel/runtime": "^7.11.2", "@mediapipe/tasks-vision": "0.10.8", @@ -6537,32 +6109,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", @@ -6576,175 +6122,6 @@ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rushstack/eslint-patch": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", @@ -8071,9 +7448,9 @@ }, "node_modules/@xenova/transformers": { "version": "3.0.0-alpha.0", - "resolved": "git+ssh://git@github.com/xenova/transformers.js.git#38a3bf6dab2265d9f0c2f613064535863194e6b9", + "resolved": "git+ssh://git@github.com/xenova/transformers.js.git#222b94ed69158798c463d5fb374efbe44da199da", "dependencies": { - "@huggingface/jinja": "^0.2.2", + "@huggingface/jinja": "^0.3.0", "onnxruntime-web": "^1.18.0", "sharp": "^0.33.2" }, @@ -9204,9 +8581,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001649", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", - "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "funding": [ { "type": "opencollective", @@ -12632,9 +12009,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -16270,9 +15647,9 @@ } }, "node_modules/msw/node_modules/type-fest": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", - "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", + "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", "engines": { "node": ">=16" }, @@ -17110,9 +16487,9 @@ } }, "node_modules/openai": { - "version": "4.54.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.54.0.tgz", - "integrity": "sha512-e/12BdtTtj+tXs7iHm+Dm7H7WjEWnw7O52B2wSfCQ6lD5F6cvjzo7cANXy5TJ1Q3/qc8YRPT5wBTTFtP5sBp1g==", + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.55.2.tgz", + "integrity": "sha512-Z81nbAPvlLl5eDLNldkixAayhUzbbCbOef/dqqW3uuN0Fkgj5GZn2kgUDTqGPOp2RHtcOYMfZltXNPoC6kEkTQ==", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -17124,6 +16501,14 @@ }, "bin": { "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, "node_modules/openai/node_modules/@types/node": { @@ -20204,9 +19589,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", - "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.9.tgz", + "integrity": "sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -21280,13 +20665,13 @@ } }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", "dev": true, "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "rollup": "^4.13.0" }, "bin": { @@ -21306,6 +20691,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -21323,6 +20709,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, diff --git a/package.json b/package.json index de2d37b9..72cd1958 100644 --- a/package.json +++ b/package.json @@ -36,15 +36,15 @@ "electron:make": "npm run build && electron-forge make" }, "dependencies": { - "@aitube/broadway": "0.1.3-1", - "@aitube/clap": "0.1.2", - "@aitube/clapper-services": "0.1.6", - "@aitube/engine": "0.1.2", - "@aitube/timeline": "0.1.3", + "@aitube/broadway": "0.2.0", + "@aitube/clap": "0.2.0", + "@aitube/clapper-services": "0.2.0-2", + "@aitube/engine": "0.2.0", + "@aitube/timeline": "0.2.0", "@fal-ai/serverless-client": "^0.13.0", "@ffmpeg/ffmpeg": "^0.12.10", "@ffmpeg/util": "^0.12.1", - "@gradio/client": "^1.4.0", + "@gradio/client": "^1.5.0", "@huggingface/hub": "^0.15.1", "@huggingface/inference": "^2.8.0", "@langchain/anthropic": "^0.2.12", diff --git a/src/app/api/assistant/askAnyAssistant.ts b/src/app/api/assistant/askAnyAssistant.ts index 49156887..04718e52 100644 --- a/src/app/api/assistant/askAnyAssistant.ts +++ b/src/app/api/assistant/askAnyAssistant.ts @@ -1,6 +1,6 @@ 'use server' -import { ClapSegmentCategory } from '@aitube/clap' +import { ClapWorkflowProvider } from '@aitube/clap' import { RunnableLike } from '@langchain/core/runnables' import { ChatPromptValueInterface } from '@langchain/core/prompt_values' import { @@ -28,7 +28,6 @@ import { AssistantRequest, AssistantSceneSegment, AssistantStoryBlock, - ComputeProvider, ChatEventVisibility, } from '@aitube/clapper-services' @@ -65,7 +64,9 @@ export async function askAnyAssistant({ history = [], }: AssistantRequest): Promise { - const provider = settings.assistantProvider + const workflow = settings.assistantWorkflow + const provider = workflow.provider + const modelName = workflow.data if (!provider) { throw new Error(`Missing assistant provider`) @@ -74,40 +75,40 @@ export async function askAnyAssistant({ let coerceable: | undefined | RunnableLike = - provider === ComputeProvider.GROQ + provider === ClapWorkflowProvider.GROQ ? new ChatGroq({ apiKey: settings.groqApiKey, - modelName: settings.assistantModel, + modelName, // temperature: 0.7, }) - : provider === ComputeProvider.OPENAI + : provider === ClapWorkflowProvider.OPENAI ? new ChatOpenAI({ openAIApiKey: settings.openaiApiKey, - modelName: settings.assistantModel, + modelName, // temperature: 0.7, }) - : provider === ComputeProvider.ANTHROPIC + : provider === ClapWorkflowProvider.ANTHROPIC ? new ChatAnthropic({ anthropicApiKey: settings.anthropicApiKey, - modelName: settings.assistantModel, + modelName, // temperature: 0.7, }) - : provider === ComputeProvider.COHERE + : provider === ClapWorkflowProvider.COHERE ? new ChatCohere({ apiKey: settings.cohereApiKey, - model: settings.assistantModel, + model: modelName, // temperature: 0.7, }) - : provider === ComputeProvider.MISTRALAI + : provider === ClapWorkflowProvider.MISTRALAI ? new ChatMistralAI({ apiKey: settings.mistralAiApiKey, - modelName: settings.assistantModel, + modelName, // temperature: 0.7, }) - : provider === ComputeProvider.GOOGLE + : provider === ClapWorkflowProvider.GOOGLE ? new ChatVertexAI({ apiKey: settings.googleApiKey, - modelName: settings.assistantModel, + modelName, // temperature: 0.7, }) : undefined diff --git a/src/app/api/resolve/providers/falai/index.ts b/src/app/api/resolve/providers/falai/index.ts index df3d256e..18bde33d 100644 --- a/src/app/api/resolve/providers/falai/index.ts +++ b/src/app/api/resolve/providers/falai/index.ts @@ -22,10 +22,14 @@ export async function resolveSegment( const segment: TimelineSegment = request.segment + let model = request.settings.imageGenerationWorkflow.data || '' + // for doc see: // https://fal.ai/models/fal-ai/fast-sdxl/api if (request.segment.category === ClapSegmentCategory.STORYBOARD) { + model = request.settings.imageGenerationWorkflow.data || '' + if (!request.prompts.image.positive) { console.error( `resolveSegment: cannot resolve a storyboard with an empty prompt` @@ -42,18 +46,18 @@ export async function resolveSegment( let result: FalAiImageResponse | undefined = undefined - if (request.settings.imageGenerationModel === 'fal-ai/pulid') { + if (model === 'fal-ai/pulid') { if (!request.prompts.image.identity) { // throw new Error(`you selected model ${request.settings.falAiModelForImage}, but no character was found, so skipping`) // console.log(`warning: user selected model ${request.settings.falAiModelForImage}, but no character was found. Falling back to fal-ai/flux-pro`) // dirty fix to fallback to a non-face model - request.settings.imageGenerationModel = 'fal-ai/flux-pro' + model = 'fal-ai/flux-pro' } } - if (request.settings.imageGenerationModel === 'fal-ai/pulid') { - result = (await fal.run(request.settings.imageGenerationModel, { + if (model === 'fal-ai/pulid') { + result = (await fal.run(model, { input: { reference_images: [ { @@ -68,16 +72,13 @@ export async function resolveSegment( }, })) as FalAiImageResponse } else { - result = (await fal.run(request.settings.imageGenerationModel, { + result = (await fal.run(model, { input: { prompt: request.prompts.image.positive, image_size: imageSize, sync_mode: true, num_inference_steps: - request.settings.imageGenerationModel === - 'fal-ai/stable-diffusion-v3-medium' - ? 40 - : 25, + model === 'fal-ai/stable-diffusion-v3-medium' ? 40 : 25, num_images: 1, enable_safety_checker: request.settings.censorNotForAllAudiencesContent, @@ -95,8 +96,10 @@ export async function resolveSegment( segment.assetUrl = result.images[0]?.url || '' } else if (request.segment.category === ClapSegmentCategory.VIDEO) { + model = request.settings.videoGenerationWorkflow.data || '' + // console.log(`request.settings.falAiModelForVideo = `, request.settings.falAiModelForVideo) - if (request.settings.videoGenerationModel !== 'fal-ai/stable-video') { + if (model !== 'fal-ai/stable-video') { throw new Error( `only "fal-ai/stable-video" is supported by Clapper for the moment` ) @@ -110,7 +113,7 @@ export async function resolveSegment( `cannot generate a video without a storyboard (the concept of Clapper is to use storyboards)` ) } - const result = (await fal.run(request.settings.videoGenerationModel, { + const result = (await fal.run(model, { input: { image_url: storyboard.assetUrl, @@ -141,7 +144,12 @@ export async function resolveSegment( request.segment.category === ClapSegmentCategory.SOUND || request.segment.category === ClapSegmentCategory.MUSIC ) { - const result = (await fal.run(request.settings.soundGenerationModel, { + model = + request.segment.category === ClapSegmentCategory.MUSIC + ? request.settings.musicGenerationWorkflow.data + : request.settings.soundGenerationWorkflow.data + + const result = (await fal.run(model, { input: { // note how we use the *segment* prompt for music or sound prompt: request.segment.prompt, @@ -153,7 +161,9 @@ export async function resolveSegment( segment.assetUrl = result?.audio_file?.url || '' } else if (request.segment.category === ClapSegmentCategory.DIALOGUE) { - const result = (await fal.run(request.settings.voiceGenerationModel, { + model = request.settings.voiceGenerationWorkflow.data || '' + + const result = (await fal.run(model, { input: { text: request.segment.prompt, diff --git a/src/app/api/resolve/providers/huggingface/generateImage.ts b/src/app/api/resolve/providers/huggingface/generateImage.ts index a81a06d8..948a9bd4 100644 --- a/src/app/api/resolve/providers/huggingface/generateImage.ts +++ b/src/app/api/resolve/providers/huggingface/generateImage.ts @@ -4,9 +4,9 @@ import { decodeOutput } from '@/lib/utils/decodeOutput' import { ResolveRequest } from '@aitube/clapper-services' export async function generateImage(request: ResolveRequest): Promise { - if (!request.settings.imageGenerationModel) { + if (!request.settings.imageGenerationWorkflow.data) { throw new Error( - `HuggingFace.generateImage: cannot generate without a valid imageGenerationModel` + `HuggingFace.generateImage: cannot generate without a valid imageGenerationWorkflow` ) } @@ -27,7 +27,7 @@ export async function generateImage(request: ResolveRequest): Promise { ) const blob: Blob = await hf.textToImage({ - model: request.settings.imageGenerationModel, + model: request.settings.imageGenerationWorkflow.data, inputs: request.prompts.image.positive, parameters: { height: request.meta.height, diff --git a/src/app/api/resolve/providers/huggingface/generateVideo.ts b/src/app/api/resolve/providers/huggingface/generateVideo.ts index da685545..24a45398 100644 --- a/src/app/api/resolve/providers/huggingface/generateVideo.ts +++ b/src/app/api/resolve/providers/huggingface/generateVideo.ts @@ -2,9 +2,9 @@ import { ResolveRequest } from '@aitube/clapper-services' import { callGradioApi } from '@/lib/hf/callGradioApi' export async function generateVideo(request: ResolveRequest): Promise { - if (!request.settings.videoGenerationModel) { + if (!request.settings.videoGenerationWorkflow.data) { throw new Error( - `HuggingFace.generateVideo: cannot generate without a valid videoGenerationModel` + `HuggingFace.generateVideo: cannot generate without a valid videoGenerationWorkflow.data` ) } @@ -22,7 +22,7 @@ export async function generateVideo(request: ResolveRequest): Promise { // TODO pass a type to the template function const assetUrl = await callGradioApi({ - url: request.settings.videoGenerationModel, + url: request.settings.videoGenerationWorkflow.data, inputs: request.prompts.video, apiKey: request.settings.huggingFaceApiKey, }) diff --git a/src/app/api/resolve/providers/huggingface/generateVoice.ts b/src/app/api/resolve/providers/huggingface/generateVoice.ts index 497dc591..cd51e51f 100644 --- a/src/app/api/resolve/providers/huggingface/generateVoice.ts +++ b/src/app/api/resolve/providers/huggingface/generateVoice.ts @@ -3,9 +3,9 @@ import { HfInference, HfInferenceEndpoint } from '@huggingface/inference' import { ResolveRequest } from '@aitube/clapper-services' export async function generateVoice(request: ResolveRequest): Promise { - if (!request.settings.voiceGenerationModel) { + if (!request.settings.voiceGenerationWorkflow.data) { throw new Error( - `HuggingFace.generateVoice: cannot generate without a valid voiceGenerationModel` + `HuggingFace.generateVoice: cannot generate without a valid voiceGenerationWorkflow` ) } @@ -26,7 +26,7 @@ export async function generateVoice(request: ResolveRequest): Promise { ) const blob: Blob = await hf.textToSpeech({ - model: request.settings.voiceGenerationModel, + model: request.settings.voiceGenerationWorkflow.data, inputs: request.prompts.voice.positive, }) diff --git a/src/app/api/resolve/providers/huggingface/index.ts b/src/app/api/resolve/providers/huggingface/index.ts index 245800de..0f867716 100644 --- a/src/app/api/resolve/providers/huggingface/index.ts +++ b/src/app/api/resolve/providers/huggingface/index.ts @@ -31,7 +31,7 @@ export async function resolveSegment( segment.assetUrl = await generateVideo(request) } else { throw new Error( - `Clapper doesn't support ${request.segment.category} generation for provider "Hugging Face" with model (or space) "${request.settings.videoGenerationModel}". Please open a pull request with (working code) to solve this!` + `Clapper doesn't support ${request.segment.category} generation for provider "Hugging Face" with model (or space) "${request.settings.videoGenerationWorkflow}". Please open a pull request with (working code) to solve this!` ) } return segment diff --git a/src/app/api/resolve/providers/replicate/index.ts b/src/app/api/resolve/providers/replicate/index.ts index 5c1424f3..0cb20fbb 100644 --- a/src/app/api/resolve/providers/replicate/index.ts +++ b/src/app/api/resolve/providers/replicate/index.ts @@ -24,12 +24,16 @@ export async function resolveSegment( // like we are doing for Hugging Face (match the fields etc) if (request.segment.category === ClapSegmentCategory.STORYBOARD) { let params: object = {} - if (request.settings.imageGenerationModel === 'fofr/pulid-lightning') { + if ( + request.settings.imageGenerationWorkflow.data === 'fofr/pulid-lightning' + ) { params = { prompt: request.prompts.image.positive, face_image: request.prompts.image.identity, } - } else if (request.settings.imageGenerationModel === 'zsxkib/pulid') { + } else if ( + request.settings.imageGenerationWorkflow.data === 'zsxkib/pulid' + ) { params = { prompt: request.prompts.image.positive, main_face_image: request.prompts.image.identity, @@ -40,13 +44,13 @@ export async function resolveSegment( } } const response = (await replicate.run( - request.settings.imageGenerationModel as any, + request.settings.imageGenerationWorkflow as any, { input: params } )) as any segment.assetUrl = `${response.output || ''}` } else if (request.segment.category === ClapSegmentCategory.DIALOGUE) { const response = (await replicate.run( - request.settings.voiceGenerationModel as any, + request.settings.voiceGenerationWorkflow.data as any, { input: { text: request.prompts.voice.positive, @@ -57,7 +61,7 @@ export async function resolveSegment( segment.assetUrl = `${response.output || ''}` } else if (request.segment.category === ClapSegmentCategory.VIDEO) { const response = (await replicate.run( - request.settings.videoGenerationModel as any, + request.settings.videoGenerationWorkflow.data as any, { input: { image: request.prompts.video.image, diff --git a/src/app/api/resolve/providers/stabilityai/generateImage.ts b/src/app/api/resolve/providers/stabilityai/generateImage.ts index 065243fd..31913951 100644 --- a/src/app/api/resolve/providers/stabilityai/generateImage.ts +++ b/src/app/api/resolve/providers/stabilityai/generateImage.ts @@ -9,7 +9,7 @@ export async function generateImage(request: ResolveRequest): Promise { ) } - if (!request.settings.imageGenerationModel) { + if (!request.settings.imageGenerationWorkflow.data) { throw new Error( `StabilityAI.generateImage: cannot generate without a valid stabilityAiModelForImage` ) @@ -45,7 +45,7 @@ export async function generateImage(request: ResolveRequest): Promise { body.set('aspect_ratio', `${aspectRatio || ''}`) const response = await fetch( - `https://api.stability.ai/v2beta/${request.settings.imageGenerationModel}`, + `https://api.stability.ai/v2beta/${request.settings.imageGenerationWorkflow.data}`, { method: 'POST', headers: { diff --git a/src/app/api/resolve/providers/stabilityai/generateVideo.ts b/src/app/api/resolve/providers/stabilityai/generateVideo.ts index 714ed983..88c35a70 100644 --- a/src/app/api/resolve/providers/stabilityai/generateVideo.ts +++ b/src/app/api/resolve/providers/stabilityai/generateVideo.ts @@ -27,9 +27,9 @@ export async function generateVideo(request: ResolveRequest): Promise { throw new Error(`${TAG}: cannot generate without a valid stabilityAiApiKey`) } - if (!request.settings.videoGenerationModel) { + if (!request.settings.videoGenerationWorkflow.data) { throw new Error( - `${TAG}: cannot generate without a valid videoGenerationModel` + `${TAG}: cannot generate without a valid videoGenerationWorkflow` ) } diff --git a/src/app/api/resolve/route.ts b/src/app/api/resolve/route.ts index f86cf400..aa5a02c1 100644 --- a/src/app/api/resolve/route.ts +++ b/src/app/api/resolve/route.ts @@ -4,6 +4,8 @@ import { ClapSegmentCategory, ClapSegmentStatus, getClapAssetSourceType, + ClapWorkflowProvider, + ClapWorkflow, } from '@aitube/clap' import { @@ -16,7 +18,7 @@ import { resolveSegmentUsingStabilityAi, } from './providers' -import { ComputeProvider, ResolveRequest } from '@aitube/clapper-services' +import { ResolveRequest } from '@aitube/clapper-services' import { decodeOutput } from '@/lib/utils/decodeOutput' import { getTypeAndExtension } from '@/lib/utils/getTypeAndExtension' import { getMediaInfo } from '@/lib/ffmpeg/getMediaInfo' @@ -29,18 +31,21 @@ export async function POST(req: NextRequest) { // await throwIfInvalidToken(req.headers.get("Authorization")) const request = (await req.json()) as ResolveRequest - const provider = + const workflow: ClapWorkflow | undefined = request.segment.category === ClapSegmentCategory.STORYBOARD - ? request.settings.imageProvider + ? request.settings.imageGenerationWorkflow : request.segment.category === ClapSegmentCategory.VIDEO - ? request.settings.videoProvider + ? request.settings.videoGenerationWorkflow : request.segment.category === ClapSegmentCategory.DIALOGUE - ? request.settings.voiceProvider + ? request.settings.voiceGenerationWorkflow : request.segment.category === ClapSegmentCategory.SOUND - ? request.settings.soundProvider + ? request.settings.soundGenerationWorkflow : request.segment.category === ClapSegmentCategory.MUSIC - ? request.settings.musicProvider - : null + ? request.settings.musicGenerationWorkflow + : undefined + + const provider: ClapWorkflowProvider | undefined = + workflow?.provider || undefined if (!provider) { throw new Error( @@ -50,19 +55,19 @@ export async function POST(req: NextRequest) { // console.log(`API ResolveRequest = `, request.settings) const resolveSegment = - provider === ComputeProvider.HUGGINGFACE + provider === ClapWorkflowProvider.HUGGINGFACE ? resolveSegmentUsingHuggingFace - : provider === ComputeProvider.COMFY_HUGGINGFACE + : provider === ClapWorkflowProvider.COMFY_HUGGINGFACE ? resolveSegmentUsingComfyReplicate - : provider === ComputeProvider.REPLICATE + : provider === ClapWorkflowProvider.REPLICATE ? resolveSegmentUsingReplicate - : provider === ComputeProvider.COMFY_COMFYICU + : provider === ClapWorkflowProvider.COMFY_COMFYICU ? resolveSegmentUsingComfyComfyIcu - : provider === ComputeProvider.STABILITYAI + : provider === ClapWorkflowProvider.STABILITYAI ? resolveSegmentUsingStabilityAi - : provider === ComputeProvider.FALAI + : provider === ClapWorkflowProvider.FALAI ? resolveSegmentUsingFalAi - : provider === ComputeProvider.MODELSLAB + : provider === ClapWorkflowProvider.MODELSLAB ? resolveSegmentUsingModelsLab : null diff --git a/src/components/core/providers/ComputeProviderLogo.tsx b/src/components/core/providers/ClapWorkflowProviderLogo.tsx similarity index 53% rename from src/components/core/providers/ComputeProviderLogo.tsx rename to src/components/core/providers/ClapWorkflowProviderLogo.tsx index 8f36af7b..60bb3d7b 100644 --- a/src/components/core/providers/ComputeProviderLogo.tsx +++ b/src/components/core/providers/ClapWorkflowProviderLogo.tsx @@ -1,22 +1,22 @@ import { cn } from '@aitube/timeline' -import { ComputeProvider } from '@aitube/clapper-services' import { formatProvider } from '@/components/toolbars/top-menu/lists/formatProvider' -import { computeProvidersLogos } from './logos' +import { ClapWorkflowProvidersLogos } from './logos' +import { ClapWorkflowProvider } from '@aitube/clap' -export function ComputeProviderLogo({ - provider = ComputeProvider.NONE, +export function ClapWorkflowProviderLogo({ + provider = ClapWorkflowProvider.NONE, height = 28, className = '', }: { - provider?: ComputeProvider + provider?: ClapWorkflowProvider height?: number | string className?: string }) { const src = - computeProvidersLogos[provider || ComputeProvider.NONE] || - computeProvidersLogos.NONE + ClapWorkflowProvidersLogos[provider || ClapWorkflowProvider.NONE] || + ClapWorkflowProvidersLogos.NONE return ( - = { - [ComputeProvider.NONE]: none, - [ComputeProvider.ANTHROPIC]: anthropic, - [ComputeProvider.COHERE]: cohere, - [ComputeProvider.ELEVENLABS]: elevenlabs, - [ComputeProvider.FALAI]: falai, - [ComputeProvider.FIREWORKSAI]: fireworks, - [ComputeProvider.GOOGLE]: google, - [ComputeProvider.GROQ]: groq, - [ComputeProvider.HEDRA]: hedra, - [ComputeProvider.HUGGINGFACE]: huggingface, - [ComputeProvider.KITSAI]: kitsai, - [ComputeProvider.LUMALABS]: lumalabs, - [ComputeProvider.MIDJOURNEY]: midjourney, - [ComputeProvider.MISTRALAI]: mistralai, - [ComputeProvider.MODELSLAB]: modelslab, - [ComputeProvider.OPENAI]: openai, - [ComputeProvider.REPLICATE]: replicate, - [ComputeProvider.RUNWAYML]: runwayml, - [ComputeProvider.STABILITYAI]: stabilityai, - [ComputeProvider.SUNO]: suno, - [ComputeProvider.UDIO]: udio, - [ComputeProvider.CUSTOM]: none, - [ComputeProvider.COMFY_HUGGINGFACE]: huggingface, - [ComputeProvider.COMFY_REPLICATE]: replicate, - [ComputeProvider.COMFY_COMFYICU]: none, - [ComputeProvider.KUAISHOU]: kuaishou, - [ComputeProvider.LEONARDOAI]: leonardoai, - [ComputeProvider.EVERARTAI]: everartai, -} +export const ClapWorkflowProvidersLogos: Record = + { + [ClapWorkflowProvider.NONE]: none, + [ClapWorkflowProvider.BUILTIN]: none, // <- TODO: use Clapper logo here + [ClapWorkflowProvider.ANTHROPIC]: anthropic, + [ClapWorkflowProvider.COHERE]: cohere, + [ClapWorkflowProvider.ELEVENLABS]: elevenlabs, + [ClapWorkflowProvider.FALAI]: falai, + [ClapWorkflowProvider.FIREWORKSAI]: fireworks, + [ClapWorkflowProvider.GOOGLE]: google, + [ClapWorkflowProvider.GROQ]: groq, + [ClapWorkflowProvider.HEDRA]: hedra, + [ClapWorkflowProvider.HUGGINGFACE]: huggingface, + [ClapWorkflowProvider.KITSAI]: kitsai, + [ClapWorkflowProvider.LUMALABS]: lumalabs, + [ClapWorkflowProvider.MIDJOURNEY]: midjourney, + [ClapWorkflowProvider.MISTRALAI]: mistralai, + [ClapWorkflowProvider.MODELSLAB]: modelslab, + [ClapWorkflowProvider.OPENAI]: openai, + [ClapWorkflowProvider.REPLICATE]: replicate, + [ClapWorkflowProvider.RUNWAYML]: runwayml, + [ClapWorkflowProvider.STABILITYAI]: stabilityai, + [ClapWorkflowProvider.SUNO]: suno, + [ClapWorkflowProvider.UDIO]: udio, + [ClapWorkflowProvider.CUSTOM]: none, + [ClapWorkflowProvider.COMFY_HUGGINGFACE]: huggingface, + [ClapWorkflowProvider.COMFY_REPLICATE]: replicate, + [ClapWorkflowProvider.COMFY_COMFYICU]: none, + [ClapWorkflowProvider.KUAISHOU]: kuaishou, + [ClapWorkflowProvider.LEONARDOAI]: leonardoai, + [ClapWorkflowProvider.EVERARTAI]: everartai, + } diff --git a/src/components/settings/assistant.tsx b/src/components/settings/assistant.tsx index ebdd1253..efd31e4c 100644 --- a/src/components/settings/assistant.tsx +++ b/src/components/settings/assistant.tsx @@ -1,34 +1,11 @@ import { FormSection } from '@/components/forms/FormSection' -import { useSettings } from '@/services/settings' -import { ComputeProvider } from '@aitube/clapper-services' - -import { FormSelect } from '../forms/FormSelect' -import { - availableComputeProvidersForAssistant, - computeProviderShortNames, -} from './constants' export function SettingsSectionAssistant() { - const assistantProvider = useSettings((s) => s.assistantProvider) - const setAssistantProvider = useSettings((s) => s.setAssistantProvider) - return (
- - label="Assistant provider" - selectedItemId={assistantProvider} - selectedItemLabel={ - computeProviderShortNames[assistantProvider] || ComputeProvider.NONE - } - items={availableComputeProvidersForAssistant.map((provider) => ({ - id: provider, - label: computeProviderShortNames[provider] || '(missing name)', - disabled: false, - value: provider, - }))} - onSelect={setAssistantProvider} - /> +

No settings for the AI assistant yet.

+

(in the future we might add a system prompt here)

) diff --git a/src/components/settings/constants.ts b/src/components/settings/constants.ts index 4f6d9de1..e4514614 100644 --- a/src/components/settings/constants.ts +++ b/src/components/settings/constants.ts @@ -1,118 +1,39 @@ -import { ComfyIcuAccelerator, ComputeProvider } from '@aitube/clapper-services' - -export const computeProviderShortNames = { - [ComputeProvider.ANTHROPIC]: 'Anthropic', - [ComputeProvider.COHERE]: 'Cohere', - [ComputeProvider.COMFY_COMFYICU]: 'Comfy.icu', - [ComputeProvider.COMFY_HUGGINGFACE]: 'Hugging Face Comfy', - [ComputeProvider.COMFY_REPLICATE]: 'Replicate Comfy', - [ComputeProvider.CUSTOM]: 'Custom API', - [ComputeProvider.ELEVENLABS]: 'ElevenLabs', - [ComputeProvider.FALAI]: 'Fal.ai', - [ComputeProvider.FIREWORKSAI]: 'FireworksAI', - [ComputeProvider.GOOGLE]: 'Google (VertexAI)', - [ComputeProvider.GROQ]: 'Groq', - [ComputeProvider.HUGGINGFACE]: 'Hugging Face', - [ComputeProvider.KITSAI]: 'Kits.ai', - [ComputeProvider.MISTRALAI]: 'MistralAI', - [ComputeProvider.MODELSLAB]: 'ModelsLab', - [ComputeProvider.NONE]: 'None', // <-- this is the default - [ComputeProvider.OPENAI]: 'OpenAI', - [ComputeProvider.REPLICATE]: 'Replicate', - [ComputeProvider.STABILITYAI]: 'StabilityAI', - [ComputeProvider.MIDJOURNEY]: 'Midjourney (no API)', - [ComputeProvider.SUNO]: 'Suno (no music API)', - [ComputeProvider.UDIO]: 'Udio (no music API)', - [ComputeProvider.LUMALABS]: 'Luma: Dream Machine (no API)', - [ComputeProvider.KUAISHOU]: 'KuaiShou: Kling (no API)', - [ComputeProvider.RUNWAYML]: 'RunwayML: GEN-3 (no API)', - [ComputeProvider.HEDRA]: 'Hedra: Character-1 (no API)', - [ComputeProvider.LEONARDOAI]: 'Leonardo.ai (no API)', - [ComputeProvider.EVERARTAI]: 'Everart.ai (no API)', +import { ClapWorkflowProvider } from '@aitube/clap' + +import { ComfyIcuAccelerator } from '@aitube/clapper-services' + +export const ClapWorkflowProviderShortNames = { + [ClapWorkflowProvider.BUILTIN]: 'BUilt-in', + [ClapWorkflowProvider.ANTHROPIC]: 'Anthropic', + [ClapWorkflowProvider.COHERE]: 'Cohere', + [ClapWorkflowProvider.COMFY_COMFYICU]: 'Comfy.icu', + [ClapWorkflowProvider.COMFY_HUGGINGFACE]: 'Hugging Face Comfy', + [ClapWorkflowProvider.COMFY_REPLICATE]: 'Replicate Comfy', + [ClapWorkflowProvider.CUSTOM]: 'Custom API', + [ClapWorkflowProvider.ELEVENLABS]: 'ElevenLabs', + [ClapWorkflowProvider.FALAI]: 'Fal.ai', + [ClapWorkflowProvider.FIREWORKSAI]: 'FireworksAI', + [ClapWorkflowProvider.GOOGLE]: 'Google (VertexAI)', + [ClapWorkflowProvider.GROQ]: 'Groq', + [ClapWorkflowProvider.HUGGINGFACE]: 'Hugging Face', + [ClapWorkflowProvider.KITSAI]: 'Kits.ai', + [ClapWorkflowProvider.MISTRALAI]: 'MistralAI', + [ClapWorkflowProvider.MODELSLAB]: 'ModelsLab', + [ClapWorkflowProvider.NONE]: 'None', // <-- this is the default + [ClapWorkflowProvider.OPENAI]: 'OpenAI', + [ClapWorkflowProvider.REPLICATE]: 'Replicate', + [ClapWorkflowProvider.STABILITYAI]: 'StabilityAI', + [ClapWorkflowProvider.MIDJOURNEY]: 'Midjourney (no API)', + [ClapWorkflowProvider.SUNO]: 'Suno (no music API)', + [ClapWorkflowProvider.UDIO]: 'Udio (no music API)', + [ClapWorkflowProvider.LUMALABS]: 'Luma: Dream Machine (no API)', + [ClapWorkflowProvider.KUAISHOU]: 'KuaiShou: Kling (no API)', + [ClapWorkflowProvider.RUNWAYML]: 'RunwayML: GEN-3 (no API)', + [ClapWorkflowProvider.HEDRA]: 'Hedra: Character-1 (no API)', + [ClapWorkflowProvider.LEONARDOAI]: 'Leonardo.ai (no API)', + [ClapWorkflowProvider.EVERARTAI]: 'Everart.ai (no API)', } -// for developer sanity purposes, we only support LangChain for now. -// if you wish to add or enable a new provider, please provide a working -// implementation of the LangChain module (even if it's in alpha eg. a GitHub NPM link, that's okay) -export const availableComputeProvidersForAssistant = [ - // disabled since this LangChain bridge is not available through NPM yet - // ComputeProvider.HUGGINGFACE, - - ComputeProvider.GROQ, - ComputeProvider.OPENAI, - ComputeProvider.GOOGLE, - ComputeProvider.COHERE, - ComputeProvider.ANTHROPIC, - ComputeProvider.MISTRALAI, - - // disabled since this LangChain bridge is not available through NPM yet - // ComputeProvider.FIREWORKSAI, -] - -export const availableComputeProvidersForImages = [ - ComputeProvider.HUGGINGFACE, - ComputeProvider.REPLICATE, - ComputeProvider.COMFY_REPLICATE, - ComputeProvider.COMFY_COMFYICU, - ComputeProvider.STABILITYAI, - ComputeProvider.FIREWORKSAI, - ComputeProvider.FALAI, - ComputeProvider.MODELSLAB, - ComputeProvider.MIDJOURNEY, - ComputeProvider.EVERARTAI, -] - -export const availableComputeProvidersForVideos = [ - ComputeProvider.HUGGINGFACE, - ComputeProvider.REPLICATE, - ComputeProvider.COMFY_REPLICATE, - ComputeProvider.COMFY_COMFYICU, - ComputeProvider.STABILITYAI, - // ComputeProvider.FIREWORKSAI, - ComputeProvider.FALAI, - ComputeProvider.MODELSLAB, - ComputeProvider.OPENAI, - ComputeProvider.GOOGLE, - ComputeProvider.LUMALABS, - ComputeProvider.KUAISHOU, - ComputeProvider.HEDRA, - ComputeProvider.LEONARDOAI, -] - -export const availableComputeProvidersForMusic = [ - ComputeProvider.HUGGINGFACE, - ComputeProvider.COMFY_REPLICATE, - ComputeProvider.COMFY_COMFYICU, - ComputeProvider.STABILITYAI, - // ComputeProvider.FIREWORKSAI, - ComputeProvider.FALAI, - ComputeProvider.MODELSLAB, - ComputeProvider.SUNO, - ComputeProvider.UDIO, -] - -export const availableComputeProvidersForSound = [ - ComputeProvider.HUGGINGFACE, - ComputeProvider.COMFY_REPLICATE, - ComputeProvider.COMFY_COMFYICU, - ComputeProvider.STABILITYAI, - // ComputeProvider.FIREWORKSAI, - ComputeProvider.FALAI, - ComputeProvider.ELEVENLABS, -] - -export const availableComputeProvidersForVoice = [ - ComputeProvider.ELEVENLABS, - ComputeProvider.KITSAI, - ComputeProvider.STABILITYAI, - // ComputeProvider.FIREWORKSAI, - ComputeProvider.HUGGINGFACE, - ComputeProvider.COMFY_REPLICATE, - ComputeProvider.COMFY_COMFYICU, - ComputeProvider.FALAI, - ComputeProvider.MODELSLAB, -] - export const availableComfyIcuAccelerators = { [ComfyIcuAccelerator.L4]: 'L4', [ComfyIcuAccelerator.T4]: 'T4', @@ -121,227 +42,3 @@ export const availableComfyIcuAccelerators = { [ComfyIcuAccelerator.A100_80GB]: 'A100 (80 GB)', [ComfyIcuAccelerator.H100]: 'H100', } - -export const availableModelsForAssistant: Partial< - Record -> = { - [ComputeProvider.OPENAI]: ['gpt-4o-mini', 'gpt-4o', 'gpt-4-turbo', 'gpt-4'], - [ComputeProvider.GROQ]: [ - 'Mixtral-8x7b-32768', - 'Gemma-7b-lt', - 'Llama3-70b-8192', - 'Llama3-8b-8192', - ], - [ComputeProvider.COHERE]: [ - 'command', - 'command-r', - 'command-r-plus', // the latest one I think - 'command-light', - 'command-nightly', - 'command-light-nightly', - 'c4-aya-23', - ], - [ComputeProvider.ANTHROPIC]: [ - // you can find this list here: https://docs.anthropic.com/en/docs/models-overview - 'claude-3-5-sonnet-20240620', - 'claude-3-opus-20240229', - 'claude-3-haiku-20240307', - ], - [ComputeProvider.GOOGLE]: [ - // you can find this list here: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/model-versioning - 'gemini-1.5-flash-001', - 'gemini-1.5-pro-001', - 'gemini-1.0-pro-vision-001', - 'gemini-1.0-pro-002', - - // The auto-updated version of a Gemini model points to the most recent stable version - - // you can find this list here: https://docs.anthropic.com/en/docs/models-overview - 'claude-3-5-sonnet@20240620', - 'claude-3-opus@20240229', - 'claude-3-haiku@20240307', - ], - [ComputeProvider.MISTRALAI]: [ - 'open-mistral-7b', - 'open-mixtral-8x7b', - 'open-mixtral-8x22b', - 'mistral-medium', - 'mistral-large-2402', - ], - [ComputeProvider.HUGGINGFACE]: [ - 'HuggingFaceH4/zephyr-7b-beta', - 'mistralai/Mixtral-8x7B-Instruct-v0.1', - ], - [ComputeProvider.FIREWORKSAI]: ['fireworks/llama-v3-70b-instruct'], -} - -export const availableModelsForAssistantTurbo: Partial< - Record -> = { - [ComputeProvider.OPENAI]: ['gpt-4o-turbo', 'gpt-4-turbo'], -} - -// note: each of those models do different things, have different parameters.. -// so it will have to be taken into account -export const availableModelsForImageGeneration: Partial< - Record -> = { - [ComputeProvider.FALAI]: [ - 'fal-ai/flux-pro', - 'fal-ai/flux/schnell', - 'fal-ai/flux/dev', - 'fal-ai/stable-diffusion-v3-medium', - 'fal-ai/fast-sdxl', - 'fal-ai/stable-cascade', - 'fal-ai/fast-lightning-sdxl', - 'fal-ai/hyper-sdxl', - // "fal-ai/photomaker", - // "fal-ai/pulid", - // "fal-ai/image-to-image", - // "fal-ai/omni-zero", - ], - [ComputeProvider.STABILITYAI]: [ - 'stable-image/generate/ultra', - 'stable-image/generate/core', - 'stable-image/generate/sd3', - ], - [ComputeProvider.FIREWORKSAI]: [ - 'stability/sd3', - 'accounts/stability/models/sd3-turbo', - 'fireworks/stable-diffusion-xl-1024-v1-0', - 'accounts/fireworks/models/playground-v2-5-1024px-aesthetic', - ], - [ComputeProvider.MIDJOURNEY]: ['(No public API)'], - [ComputeProvider.EVERARTAI]: ['(No public API)'], -} - -export const availableModelsForImageUpscaling: Partial< - Record -> = { - [ComputeProvider.FALAI]: [ - 'fal-ai/aura-sr', // "input": { "image_url": "" } - 'fal-ai/ccsr', - ], - [ComputeProvider.STABILITYAI]: [ - 'stable-image/upscale/conservative', - 'stable-image/upscale/creative', - ], -} - -export const availableModelsForImageDepth: Partial< - Record -> = { - [ComputeProvider.FALAI]: [ - 'fal-ai/imageutils/marigold-depth', - 'fal-ai/imageutils/depth', - ], - [ComputeProvider.HUGGINGFACE]: [ - 'depth-anything/Depth-Anything-V2-Large', - 'depth-anything/Depth-Anything-V2-Base', - 'depth-anything/Depth-Anything-V2-Small', - ], - [ComputeProvider.REPLICATE]: ['cjwbw/depth-anything', 'adirik/marigold'], -} - -export const availableModelsForImageSegmentation: Partial< - Record -> = { - [ComputeProvider.FALAI]: ['fal-ai/imageutils/sam', 'fal-ai/tiny-sam'], - [ComputeProvider.HUGGINGFACE]: ['ybelkada/segment-anything'], - [ComputeProvider.REPLICATE]: [ - 'yyjim/segment-anything-everything', - 'cjwbw/semantic-segment-anything', - 'pablodawson/segment-anything-automatic', - ], -} - -export const availableModelsForVideoGeneration: Partial< - Record -> = { - [ComputeProvider.FALAI]: ['fal-ai/stable-video'], - [ComputeProvider.STABILITYAI]: ['image-to-video'], - [ComputeProvider.HUGGINGFACE]: [ - 'spaces/hpcai-tech/open-sora', - 'spaces/jbilcke-hf/hallo-api', // supports audio input - ], - [ComputeProvider.REPLICATE]: [ - // note: we need a model that accepts cinematic ratios - // "camenduru/open-sora" - - 'anotherjesse/zeroscope-v2-xl', - ], - [ComputeProvider.OPENAI]: ['Sora is unavailable (no public API)'], - [ComputeProvider.GOOGLE]: ['Veo is unavailable (no public API)'], - [ComputeProvider.RUNWAYML]: ['Gen-3 is unavailable (no public API)'], - [ComputeProvider.LUMALABS]: ['Dream Machine is unavailable (no public API)'], - [ComputeProvider.KUAISHOU]: ['Kling is unavailable (no public API)'], - [ComputeProvider.HEDRA]: ['Hedra is unavailable (no public API)'], - [ComputeProvider.LEONARDOAI]: ['Leonardo.ai is unavailable (no public API)'], -} - -export const availableModelsForVideoUpscaling: Partial< - Record -> = { - [ComputeProvider.REPLICATE]: [ - 'lucataco/real-esrgan-video', - 'pbarker/gfpgan-video', - ], -} - -export const availableModelsForVideoDepth: Partial< - Record -> = { - [ComputeProvider.REPLICATE]: ['lucataco/depth-anything-video'], -} - -export const availableModelsForVideoSegmentation: Partial< - Record -> = { - [ComputeProvider.REPLICATE]: ['cjwbw/cutie'], -} - -export const availableModelsForSoundGeneration: Partial< - Record -> = { - [ComputeProvider.HUGGINGFACE]: [ - 'cvssp/audioldm2', - 'cvssp/audioldm2-large', - 'cvssp/audioldm', - ], - [ComputeProvider.FALAI]: ['fal-ai/stable-audio'], - [ComputeProvider.ELEVENLABS]: ['v1/sound-generation'], - [ComputeProvider.REPLICATE]: [ - 'declare-lab/tango', - 'suno-ai/bark', - 'sepal/audiogen', - ], -} - -export const availableModelsForVoiceGeneration: Partial< - Record -> = { - [ComputeProvider.HUGGINGFACE]: [ - 'coqui/XTTS-v2', - 'myshell-ai/OpenVoiceV2', - 'myshell-ai/OpenVoice', - 'WhisperSpeech/WhisperSpeech', - 'metavoiceio/metavoice-1B-v0.1', - 'parler-tts/parler_tts_mini_v0.1', - 'parler-tts/parler-tts-mini-expresso', - ], - [ComputeProvider.FALAI]: ['fal-ai/metavoice-v1'], - [ComputeProvider.REPLICATE]: ['chenxwh/openvoice'], - [ComputeProvider.ELEVENLABS]: ['v1/text-to-speech'], -} - -export const availableModelsForMusicGeneration: Partial< - Record -> = { - [ComputeProvider.HUGGINGFACE]: [ - 'cvssp/audioldm2-music', - 'facebook/musicgen-large', - ], - [ComputeProvider.FALAI]: ['fal-ai/stable-audio'], - [ComputeProvider.SUNO]: ['Suno is unavailable (No public API)'], - [ComputeProvider.UDIO]: ['Udio is unavailable (No public API)'], -} diff --git a/src/components/settings/image.tsx b/src/components/settings/image.tsx index df8a8e73..89cb1ad7 100644 --- a/src/components/settings/image.tsx +++ b/src/components/settings/image.tsx @@ -2,34 +2,10 @@ import { FormSection } from '@/components/forms/FormSection' import { getDefaultSettingsState, useSettings } from '@/services/settings' import { FormInput } from '../forms/FormInput' -import { ComputeProvider } from '@aitube/clapper-services' -import { - availableComputeProvidersForImages, - computeProviderShortNames, -} from './constants' -import { FormSelect } from '../forms/FormSelect' export function SettingsSectionImage() { const defaultSettings = getDefaultSettingsState() - const imageProvider = useSettings((s) => s.imageProvider) - const setImageProvider = useSettings((s) => s.setImageProvider) - - /* - to deprecate I think - or replace by defaultHuggingFaceModelForXXXX - const huggingFaceModelForImage = useSettings(s => s.huggingFaceModelForImage) - const setHuggingFaceModelForImage = useSettings(s => s.setHuggingFaceModelForImage) - - const replicateModelForImage = useSettings(s => s.replicateModelForImage) - const setReplicateModelForImage = useSettings(s => s.setReplicateModelForImage) - - const falAiModelForImage = useSettings(s => s.falAiModelForImage) - const setFalAiModelForImage = useSettings(s => s.setFalAiModelForImage) - - const modelsLabModelForImage = useSettings(s => s.modelsLabModelForImage) - const setModelsLabModelForImage = useSettings(s => s.setModelsLabModelForImage) - */ - const imagePromptPrefix = useSettings((s) => s.imagePromptPrefix) const setImagePromptPrefix = useSettings((s) => s.setImagePromptPrefix) @@ -46,29 +22,9 @@ export function SettingsSectionImage() { (s) => s.setMaxImagesToGenerateInParallel ) - const comfyWorkflowForImage = useSettings((s) => s.comfyWorkflowForImage) - const setComfyWorkflowForImage = useSettings( - (s) => s.setComfyWorkflowForImage - ) - return (
- - label="Image provider" - selectedItemId={imageProvider} - selectedItemLabel={ - computeProviderShortNames[imageProvider] || ComputeProvider.NONE - } - items={availableComputeProvidersForImages.map((provider) => ({ - id: provider, - label: computeProviderShortNames[provider] || '(missing name)', - disabled: false, - value: provider, - }))} - onSelect={setImageProvider} - /> - - - { - imageProvider.startsWith('COMFY_') ? ( - <> - - - ) : // "proprietary" parameters - null /* - <> - {imageProvider === ComputeProvider.HUGGINGFACE && } - {imageProvider === ComputeProvider.REPLICATE && } - {imageProvider === ComputeProvider.FALAI && } - {imageProvider === ComputeProvider.MODELSLAB && } - - */ - }
) diff --git a/src/components/settings/music.tsx b/src/components/settings/music.tsx index ec8527c9..a1e52267 100644 --- a/src/components/settings/music.tsx +++ b/src/components/settings/music.tsx @@ -1,94 +1,14 @@ import { FormSection } from '@/components/forms/FormSection' -import { getDefaultSettingsState, useSettings } from '@/services/settings' -import { ComputeProvider } from '@aitube/clapper-services' - -import { FormSelect } from '../forms/FormSelect' -import { - availableComputeProvidersForMusic, - computeProviderShortNames, -} from './constants' -import { FormInput } from '../forms/FormInput' +import { getDefaultSettingsState } from '@/services/settings' export function SettingsSectionMusic() { - const defaultSettings = getDefaultSettingsState() - - const musicProvider = useSettings((s) => s.musicProvider) - const setMusicProvider = useSettings((s) => s.setMusicProvider) - - /* - const huggingFaceModelForMusic = useSettings(s => s.huggingFaceModelForMusic) - const setHuggingFaceModelForMusic = useSettings(s => s.setHuggingFaceModelForMusic) - - const replicateModelForMusic = useSettings(s => s.replicateModelForMusic) - const setReplicateModelForMusic = useSettings(s => s.setReplicateModelForMusic) - - const falAiModelForMusic = useSettings(s => s.falAiModelForMusic) - const setFalAiModelForMusic = useSettings(s => s.setFalAiModelForMusic) - - const modelsLabModelForMusic = useSettings(s => s.modelsLabModelForMusic) - const setModelsLabModelForMusic = useSettings(s => s.setModelsLabModelForMusic) - */ - - const comfyWorkflowForMusic = useSettings((s) => s.comfyWorkflowForMusic) - const setComfyWorkflowForMusic = useSettings( - (s) => s.setComfyWorkflowForMusic - ) - return (
- - label="Music provider" - selectedItemId={musicProvider} - selectedItemLabel={ - computeProviderShortNames[musicProvider] || ComputeProvider.NONE - } - items={availableComputeProvidersForMusic.map((provider) => ({ - id: provider, - label: computeProviderShortNames[provider] || '(missing name)', - disabled: false, - value: provider, - }))} - onSelect={setMusicProvider} - /> - { - musicProvider.startsWith('COMFY_') ? ( - - ) : // "proprietary" parameters - null /* - <> - {musicProvider === ComputeProvider.HUGGINGFACE && } - {musicProvider === ComputeProvider.REPLICATE && } - {musicProvider === ComputeProvider.FALAI && } - {musicProvider === ComputeProvider.MODELSLAB && } - - */ - } +

No settings for the music yet.

+

+ (In the future we might add a system prompt or prompt template here) +

) diff --git a/src/components/settings/sound.tsx b/src/components/settings/sound.tsx index 7be1c64c..11b2194a 100644 --- a/src/components/settings/sound.tsx +++ b/src/components/settings/sound.tsx @@ -1,93 +1,13 @@ import { FormSection } from '@/components/forms/FormSection' -import { getDefaultSettingsState, useSettings } from '@/services/settings' -import { ComputeProvider } from '@aitube/clapper-services' - -import { FormSelect } from '../forms/FormSelect' -import { - availableComputeProvidersForSound, - computeProviderShortNames, -} from './constants' -import { FormInput } from '../forms/FormInput' export function SettingsSectionSound() { - const defaultSettings = getDefaultSettingsState() - - const soundProvider = useSettings((s) => s.soundProvider) - const setSoundProvider = useSettings((s) => s.setSoundProvider) - - /* - const huggingFaceModelForSound = useSettings(s => s.huggingFaceModelForSound) - const setHuggingFaceModelForSound = useSettings(s => s.setHuggingFaceModelForSound) - - const replicateModelForSound = useSettings(s => s.replicateModelForSound) - const setReplicateModelForSound = useSettings(s => s.setReplicateModelForSound) - - const falAiModelForSound = useSettings(s => s.falAiModelForSound) - const setFalAiModelForSound = useSettings(s => s.setFalAiModelForSound) - - const modelsLabModelForSound = useSettings(s => s.modelsLabModelForSound) - const setModelsLabModelForSound = useSettings(s => s.setModelsLabModelForSound) - */ - const comfyWorkflowForSound = useSettings((s) => s.comfyWorkflowForSound) - const setComfyWorkflowForSound = useSettings( - (s) => s.setComfyWorkflowForSound - ) - return (
- - label="Sound provider" - selectedItemId={soundProvider} - selectedItemLabel={ - computeProviderShortNames[soundProvider] || ComputeProvider.NONE - } - items={availableComputeProvidersForSound.map((provider) => ({ - id: provider, - label: computeProviderShortNames[provider] || '(missing name)', - disabled: false, - value: provider, - }))} - onSelect={setSoundProvider} - /> - { - soundProvider.startsWith('COMFY_') ? ( - - ) : // "proprietary" parameters - null /* - <> - {soundProvider === ComputeProvider.HUGGINGFACE && } - {soundProvider === ComputeProvider.REPLICATE && } - {soundProvider === ComputeProvider.FALAI && } - {soundProvider === ComputeProvider.MODELSLAB && } - - */ - } +

No settings for the sound yet.

+

+ (In the future we might add a system prompt or prompt template here) +

) diff --git a/src/components/settings/video.tsx b/src/components/settings/video.tsx index 9037518c..6afe740c 100644 --- a/src/components/settings/video.tsx +++ b/src/components/settings/video.tsx @@ -1,31 +1,10 @@ import { FormSection } from '@/components/forms/FormSection' import { getDefaultSettingsState, useSettings } from '@/services/settings' -import { FormSelect } from '../forms/FormSelect' -import { ComputeProvider } from '@aitube/clapper-services' import { FormInput } from '../forms/FormInput' -import { APP_NAME } from '@/lib/core/constants' -import { - availableComputeProvidersForVideos, - computeProviderShortNames, -} from './constants' export function SettingsSectionVideo() { const defaultSettings = getDefaultSettingsState() - /* - const huggingFaceModelForVideo = useSettings(s => s.huggingFaceModelForVideo) - const setHuggingFaceModelForVideo = useSettings(s => s.setHuggingFaceModelForVideo) - - const replicateModelForVideo = useSettings(s => s.replicateModelForVideo) - const setReplicateModelForVideo = useSettings(s => s.setReplicateModelForVideo) - - const falAiModelForVideo = useSettings(s => s.falAiModelForVideo) - const setFalAiModelForVideo = useSettings(s => s.setFalAiModelForVideo) - - const modelsLabModelForVideo = useSettings(s => s.modelsLabModelForVideo) - const setModelsLabModelForVideo = useSettings(s => s.setModelsLabModelForVideo) - */ - const videoPromptPrefix = useSettings((s) => s.videoPromptPrefix) const setVideoPromptPrefix = useSettings((s) => s.setVideoPromptPrefix) @@ -35,39 +14,6 @@ export function SettingsSectionVideo() { const videoNegativePrompt = useSettings((s) => s.videoNegativePrompt) const setVideoNegativePrompt = useSettings((s) => s.setVideoNegativePrompt) - const videoProvider = useSettings((s) => s.videoProvider) - const setVideoProvider = useSettings((s) => s.setVideoProvider) - const videoGenerationModel = useSettings((s) => s.videoGenerationModel) - const setVideoGenerationModel = useSettings((s) => s.setVideoGenerationModel) - - const videoUpscalingProvider = useSettings((s) => s.videoUpscalingProvider) - const setVideoUpscalingProvider = useSettings( - (s) => s.setVideoUpscalingProvider - ) - const videoUpscalingModel = useSettings((s) => s.videoUpscalingModel) - const setVideoUpscalingModel = useSettings((s) => s.setVideoUpscalingModel) - - const videoDepthProvider = useSettings((s) => s.videoDepthProvider) - const setVideoDepthProvider = useSettings((s) => s.setVideoDepthProvider) - const videoDepthModel = useSettings((s) => s.videoDepthModel) - const setVideoDepthModel = useSettings((s) => s.setVideoDepthModel) - - const videoSegmentationProvider = useSettings( - (s) => s.videoSegmentationProvider - ) - const setVideoSegmentationProvider = useSettings( - (s) => s.setVideoSegmentationProvider - ) - const videoSegmentationModel = useSettings((s) => s.videoSegmentationModel) - const setVideoSegmentationModel = useSettings( - (s) => s.setVideoSegmentationModel - ) - - const videoRenderingStrategy = useSettings((s) => s.videoRenderingStrategy) - const setVideoRenderingStrategy = useSettings( - (s) => s.setVideoRenderingStrategy - ) - const maxVideosToGenerateInParallel = useSettings( (s) => s.maxVideosToGenerateInParallel ) @@ -75,29 +21,9 @@ export function SettingsSectionVideo() { (s) => s.setMaxVideosToGenerateInParallel ) - const comfyWorkflowForVideo = useSettings((s) => s.comfyWorkflowForVideo) - const setComfyWorkflowForVideo = useSettings( - (s) => s.setComfyWorkflowForVideo - ) - return (
- - label="Video provider" - selectedItemId={videoProvider} - selectedItemLabel={ - computeProviderShortNames[videoProvider] || ComputeProvider.NONE - } - items={availableComputeProvidersForVideos.map((provider) => ({ - id: provider, - label: computeProviderShortNames[provider] || '(missing name)', - disabled: false, - value: provider, - }))} - onSelect={setVideoProvider} - /> - - - { - videoProvider.startsWith('COMFY_') ? ( - - ) : // "proprietary" parameters - null /* <> - {videoProvider === ComputeProvider.HUGGINGFACE && } - {videoProvider === ComputeProvider.REPLICATE && } - {videoProvider === ComputeProvider.FALAI && } - {videoProvider === ComputeProvider.MODELSLAB && } - - */ - }
) diff --git a/src/components/settings/voice.tsx b/src/components/settings/voice.tsx index 5282cbfb..60252bff 100644 --- a/src/components/settings/voice.tsx +++ b/src/components/settings/voice.tsx @@ -1,93 +1,13 @@ import { FormSection } from '@/components/forms/FormSection' -import { getDefaultSettingsState, useSettings } from '@/services/settings' -import { ComputeProvider } from '@aitube/clapper-services' - -import { FormSelect } from '../forms/FormSelect' -import { - availableComputeProvidersForVoice, - computeProviderShortNames, -} from './constants' -import { FormInput } from '../forms/FormInput' export function SettingsSectionVoice() { - const defaultSettings = getDefaultSettingsState() - - const voiceProvider = useSettings((s) => s.voiceProvider) - const setVoiceProvider = useSettings((s) => s.setVoiceProvider) - - /* - const huggingFaceModelForVoice = useSettings(s => s.huggingFaceModelForVoice) - const setHuggingFaceModelForVoice = useSettings(s => s.setHuggingFaceModelForVoice) - - const replicateModelForVoice = useSettings(s => s.replicateModelForVoice) - const setReplicateModelForVoice = useSettings(s => s.setReplicateModelForVoice) - - const falAiModelForVoice = useSettings(s => s.falAiModelForVoice) - const setFalAiModelForVoice = useSettings(s => s.setFalAiModelForVoice) - - const modelsLabModelForVoice = useSettings(s => s.modelsLabModelForVoice) - const setModelsLabModelForVoice = useSettings(s => s.setModelsLabModelForVoice) - */ - - const comfyWorkflowForVoice = useSettings((s) => s.comfyWorkflowForVoice) - const setComfyWorkflowForVoice = useSettings( - (s) => s.setComfyWorkflowForVoice - ) - return (
- - label="Voice provider" - selectedItemId={voiceProvider} - selectedItemLabel={ - computeProviderShortNames[voiceProvider] || ComputeProvider.NONE - } - items={availableComputeProvidersForVoice.map((provider) => ({ - id: provider, - label: computeProviderShortNames[provider] || '(missing name)', - disabled: false, - value: provider, - }))} - onSelect={setVoiceProvider} - /> - { - voiceProvider.startsWith('COMFY_') ? ( - - ) : // "proprietary" parameters - null /* <> - {voiceProvider === ComputeProvider.HUGGINGFACE && } - {voiceProvider === ComputeProvider.REPLICATE && } - {voiceProvider === ComputeProvider.FALAI && } - {voiceProvider === ComputeProvider.MODELSLAB && } - - */ - } +

No settings for the voice yet.

+

+ (In the future we might add a system prompt or prompt template here) +

) diff --git a/src/components/toolbars/top-menu/assistant/index.tsx b/src/components/toolbars/top-menu/assistant/index.tsx index 0c2d4586..145fe13d 100644 --- a/src/components/toolbars/top-menu/assistant/index.tsx +++ b/src/components/toolbars/top-menu/assistant/index.tsx @@ -13,7 +13,7 @@ import { } from '@/components/ui/menubar' import { useUI } from '@/services/ui' import { SettingsCategory } from '@aitube/clapper-services' -import { AssistantModelList } from '../lists/AssistantModelList' +import { AssistantWorkflows } from '../lists/AssistantWorkflows' import { useAutocomplete } from '@/services/autocomplete/useAutocomplete' export function TopMenuAssistant() { @@ -35,7 +35,7 @@ export function TopMenuAssistant() { Show advanced settings - + {hasBetaAccess && ( <> diff --git a/src/components/toolbars/top-menu/image/index.tsx b/src/components/toolbars/top-menu/image/index.tsx index 2a9d84dc..52b88183 100644 --- a/src/components/toolbars/top-menu/image/index.tsx +++ b/src/components/toolbars/top-menu/image/index.tsx @@ -15,16 +15,18 @@ import { useSettings } from '@/services/settings' import { useUI } from '@/services/ui' import { RenderingStrategyList } from '../lists/RenderingStrategyList' -import { ImageGenerationModelList } from '../lists/ImageGenerationModelList' -import { ImageUpscalingModelList } from '../lists/ImageUpscalingModelList' +import { ImageGenerationWorkflows } from '../lists/ImageGenerationWorkflows' +import { ImageUpscalingWorkflows } from '../lists/ImageUpscalingWorkflows' import { IsBusy } from '../IsBusy' import { SettingsCategory } from '@aitube/clapper-services' import { useResolver } from '@/services/resolver/useResolver' -import { ImageDepthModelList } from '../lists/ImageDepthModelList' -import { ImageSegmentationModelList } from '../lists/ImageSegmentationModelList' +import { ImageDepthWorkflows } from '../lists/ImageDepthWorkflows' +import { ImageSegmentationWorkflows } from '../lists/ImageSegmentationWorkflows' export function TopMenuImage() { + const hasBetaAccess = useUI((s) => s.hasBetaAccess) + const nbPendingRequestsForImage = useResolver( (s) => s.nbPendingRequestsForImage ) @@ -50,10 +52,14 @@ export function TopMenuImage() { Show advanced settings - - - - + + {hasBetaAccess && ( + <> + + + + + )} s.assistantWorkflow) + const setWorkflowId = useSettings((s) => s.setAssistantWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.ASSISTANT } + ) -export function AssistantModelList() { - const provider = useSettings((s) => s.assistantProvider) - const setProvider = useSettings((s) => s.setAssistantProvider) - const model = useSettings((s) => s.assistantModel) - const setModel = useSettings((s) => s.setAssistantModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForAssistant - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -38,40 +45,41 @@ export function AssistantModelList() { ai assistant
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForAssistant[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/VideoDepthModelList.tsx b/src/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx similarity index 51% rename from src/components/toolbars/top-menu/lists/VideoDepthModelList.tsx rename to src/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx index d943e90b..76c65431 100644 --- a/src/components/toolbars/top-menu/lists/VideoDepthModelList.tsx +++ b/src/components/toolbars/top-menu/lists/ImageDepthWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForVideoDepth } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function ImageDepthWorkflows() { + const workflowId = useSettings((s) => s.imageDepthWorkflow) + const setWorkflowId = useSettings((s) => s.setImageDepthWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.IMAGE_DEPTH_MAPPING } + ) -export function VideoDepthModelList() { - const provider = useSettings((s) => s.videoDepthProvider) - const setProvider = useSettings((s) => s.setVideoDepthProvider) - const model = useSettings((s) => s.videoDepthModel) - const setModel = useSettings((s) => s.setVideoDepthModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForVideoDepth - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function VideoDepthModelList() { depth mapper
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForVideoDepth[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/ImageGenerationModelList.tsx b/src/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/ImageGenerationModelList.tsx rename to src/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx index cf098163..3d43c47e 100644 --- a/src/components/toolbars/top-menu/lists/ImageGenerationModelList.tsx +++ b/src/components/toolbars/top-menu/lists/ImageGenerationWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForImageGeneration } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function ImageGenerationWorkflows() { + const workflowId = useSettings((s) => s.imageGenerationWorkflow) + const setWorkflowId = useSettings((s) => s.setImageGenerationWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.IMAGE_GENERATION } + ) -export function ImageGenerationModelList() { - const provider = useSettings((s) => s.imageProvider) - const setProvider = useSettings((s) => s.setImageProvider) - const model = useSettings((s) => s.imageGenerationModel) - const setModel = useSettings((s) => s.setImageGenerationModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForImageGeneration - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function ImageGenerationModelList() { generate image
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForImageGeneration[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/ImageSegmentationModelList.tsx b/src/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/ImageSegmentationModelList.tsx rename to src/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx index 9b017346..99a40831 100644 --- a/src/components/toolbars/top-menu/lists/ImageSegmentationModelList.tsx +++ b/src/components/toolbars/top-menu/lists/ImageSegmentationWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,25 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForImageSegmentation } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function ImageSegmentationWorkflows() { + const workflowId = useSettings((s) => s.imageSegmentationWorkflow) + const setWorkflowId = useSettings((s) => s.setImageSegmentationWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.IMAGE_SEGMENTATION } + ) -export function ImageSegmentationModelList() { - const provider = useSettings((s) => s.imageSegmentationProvider) - const setProvider = useSettings((s) => s.setImageSegmentationProvider) - const model = useSettings((s) => s.imageSegmentationModel) - const setModel = useSettings((s) => s.setImageSegmentationModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForImageSegmentation - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -38,40 +45,41 @@ export function ImageSegmentationModelList() { segmentation
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForImageSegmentation[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/ImageUpscalingModelList.tsx b/src/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/ImageUpscalingModelList.tsx rename to src/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx index 5b39aefc..3a43eec3 100644 --- a/src/components/toolbars/top-menu/lists/ImageUpscalingModelList.tsx +++ b/src/components/toolbars/top-menu/lists/ImageUpscalingWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForImageUpscaling } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function ImageUpscalingWorkflows() { + const workflowId = useSettings((s) => s.imageUpscalingWorkflow) + const setWorkflowId = useSettings((s) => s.setImageUpscalingWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.IMAGE_UPSCALING } + ) -export function ImageUpscalingModelList() { - const provider = useSettings((s) => s.imageUpscalingProvider) - const setProvider = useSettings((s) => s.setImageUpscalingProvider) - const model = useSettings((s) => s.imageUpscalingModel) - const setModel = useSettings((s) => s.setImageUpscalingModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForImageUpscaling - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function ImageUpscalingModelList() { upscale image
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForImageUpscaling[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/MusicGenerationModelList.tsx b/src/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/MusicGenerationModelList.tsx rename to src/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx index 6ca99ee9..b7926544 100644 --- a/src/components/toolbars/top-menu/lists/MusicGenerationModelList.tsx +++ b/src/components/toolbars/top-menu/lists/MusicGenerationWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForMusicGeneration } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function MusicGenerationWorkflows() { + const workflowId = useSettings((s) => s.musicGenerationWorkflow) + const setWorkflowId = useSettings((s) => s.setMusicGenerationWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.MUSIC_GENERATION } + ) -export function MusicGenerationModelList() { - const provider = useSettings((s) => s.musicProvider) - const setProvider = useSettings((s) => s.setMusicProvider) - const model = useSettings((s) => s.musicGenerationModel) - const setModel = useSettings((s) => s.setMusicGenerationModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForMusicGeneration - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function MusicGenerationModelList() { generate music
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForMusicGeneration[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/ProviderList.tsx b/src/components/toolbars/top-menu/lists/ProviderList.tsx deleted file mode 100644 index a70df64d..00000000 --- a/src/components/toolbars/top-menu/lists/ProviderList.tsx +++ /dev/null @@ -1,75 +0,0 @@ -'use client' - -import { - MenubarCheckboxItem, - MenubarContent, - MenubarItem, - MenubarMenu, - MenubarSeparator, - MenubarSub, - MenubarSubContent, - MenubarSubTrigger, -} from '@/components/ui/menubar' - -import { computeProviderShortNames } from '@/components/settings/constants' - -import { ComputeProvider } from '@aitube/clapper-services' -import { TagColor } from '@/components/tags/types' -import { Tag } from '@/components/tags/Tag' -import { hasNoPublicAPI } from './hasNoPublicAPI' - -const defaultProviders: ComputeProvider[] = Object.keys( - computeProviderShortNames -) as ComputeProvider[] - -export function ProviderList({ - providers = defaultProviders, - current, - setter, -}: { - providers?: ComputeProvider[] - current?: ComputeProvider - setter: (provider: ComputeProvider) => void -}) { - return ( - - - - cloud vendor - - {(computeProviderShortNames as any)[current || ''] || 'None'} - - - {providers.map((provider) => ( - { - if ( - hasNoPublicAPI(provider) || - hasNoPublicAPI(computeProviderShortNames[provider]) - ) { - e.stopPropagation() - e.preventDefault() - return false - } - setter(provider) - e.stopPropagation() - e.preventDefault() - return false - }} - > - {computeProviderShortNames[provider]} - - ))} - - - ) -} diff --git a/src/components/toolbars/top-menu/lists/SoundGenerationModelList.tsx b/src/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/SoundGenerationModelList.tsx rename to src/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx index 36cfd871..e7d4419b 100644 --- a/src/components/toolbars/top-menu/lists/SoundGenerationModelList.tsx +++ b/src/components/toolbars/top-menu/lists/SoundGenerationWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForSoundGeneration } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function SoundGenerationWorkflows() { + const workflowId = useSettings((s) => s.soundGenerationWorkflow) + const setWorkflowId = useSettings((s) => s.setSoundGenerationWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.SOUND_GENERATION } + ) -export function SoundGenerationModelList() { - const provider = useSettings((s) => s.soundProvider) - const setProvider = useSettings((s) => s.setSoundProvider) - const model = useSettings((s) => s.soundGenerationModel) - const setModel = useSettings((s) => s.setSoundGenerationModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForSoundGeneration - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function SoundGenerationModelList() { generate sound
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForSoundGeneration[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/ImageDepthModelList.tsx b/src/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx similarity index 51% rename from src/components/toolbars/top-menu/lists/ImageDepthModelList.tsx rename to src/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx index 2814f463..e29e86fe 100644 --- a/src/components/toolbars/top-menu/lists/ImageDepthModelList.tsx +++ b/src/components/toolbars/top-menu/lists/VideoDepthWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForImageDepth } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function VideoDepthWorkflows() { + const workflowId = useSettings((s) => s.videoDepthWorkflow) + const setWorkflowId = useSettings((s) => s.setVideoDepthWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.VIDEO_DEPTH_MAPPING } + ) -export function ImageDepthModelList() { - const provider = useSettings((s) => s.imageDepthProvider) - const setProvider = useSettings((s) => s.setImageDepthProvider) - const model = useSettings((s) => s.imageDepthModel) - const setModel = useSettings((s) => s.setImageDepthModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForImageDepth - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function ImageDepthModelList() { depth mapper
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForImageDepth[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/VideoGenerationModelList.tsx b/src/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/VideoGenerationModelList.tsx rename to src/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx index 46b9d0b3..bf2ab108 100644 --- a/src/components/toolbars/top-menu/lists/VideoGenerationModelList.tsx +++ b/src/components/toolbars/top-menu/lists/VideoGenerationWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForVideoGeneration } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function VideoGenerationWorkflows() { + const workflowId = useSettings((s) => s.videoGenerationWorkflow) + const setWorkflowId = useSettings((s) => s.setVideoGenerationWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.VIDEO_GENERATION } + ) -export function VideoGenerationModelList() { - const provider = useSettings((s) => s.videoProvider) - const setProvider = useSettings((s) => s.setVideoProvider) - const model = useSettings((s) => s.videoGenerationModel) - const setModel = useSettings((s) => s.setVideoGenerationModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForVideoGeneration - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function VideoGenerationModelList() { generate video
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForVideoGeneration[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/VideoSegmentationModelList.tsx b/src/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/VideoSegmentationModelList.tsx rename to src/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx index be2ab03b..05f742a4 100644 --- a/src/components/toolbars/top-menu/lists/VideoSegmentationModelList.tsx +++ b/src/components/toolbars/top-menu/lists/VideoSegmentationWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForVideoSegmentation } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function VideoSegmentationWorkflows() { + const workflowId = useSettings((s) => s.videoSegmentationWorkflow) + const setWorkflowId = useSettings((s) => s.setVideoSegmentationWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.VIDEO_SEGMENTATION } + ) -export function VideoSegmentationModelList() { - const provider = useSettings((s) => s.videoSegmentationProvider) - const setProvider = useSettings((s) => s.setVideoSegmentationProvider) - const model = useSettings((s) => s.videoSegmentationModel) - const setModel = useSettings((s) => s.setVideoSegmentationModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForVideoSegmentation - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function VideoSegmentationModelList() { segmentation
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForVideoSegmentation[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/VideoUpscalingModelList.tsx b/src/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/VideoUpscalingModelList.tsx rename to src/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx index 5bf26a1b..173ce543 100644 --- a/src/components/toolbars/top-menu/lists/VideoUpscalingModelList.tsx +++ b/src/components/toolbars/top-menu/lists/VideoUpscalingWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForVideoUpscaling } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function VideoUpscalingWorkflows() { + const workflowId = useSettings((s) => s.videoUpscalingWorkflow) + const setWorkflowId = useSettings((s) => s.setVideoUpscalingWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.VIDEO_UPSCALING } + ) -export function VideoUpscalingModelList() { - const provider = useSettings((s) => s.videoUpscalingProvider) - const setProvider = useSettings((s) => s.setVideoUpscalingProvider) - const model = useSettings((s) => s.videoUpscalingModel) - const setModel = useSettings((s) => s.setVideoUpscalingModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForVideoUpscaling - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function VideoUpscalingModelList() { upscale video
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForVideoUpscaling[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/VoiceGenerationModelList.tsx b/src/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx similarity index 50% rename from src/components/toolbars/top-menu/lists/VoiceGenerationModelList.tsx rename to src/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx index 53019533..f0c0588b 100644 --- a/src/components/toolbars/top-menu/lists/VoiceGenerationModelList.tsx +++ b/src/components/toolbars/top-menu/lists/VoiceGenerationWorkflows.tsx @@ -1,5 +1,7 @@ 'use client' +import { ClapWorkflowCategory, ClapWorkflowProvider } from '@aitube/clap' + import { MenubarCheckboxItem, MenubarSub, @@ -9,26 +11,30 @@ import { import { TagColor } from '@/components/tags/types' import { Tag } from '@/components/tags/Tag' -import { ComputeProvider } from '@aitube/clapper-services' -import { availableModelsForVoiceGeneration } from '@/components/settings/constants' import { useSettings } from '@/services/settings' -import { ComputeProviderName } from '@/components/core/providers/ComputeProviderName' -import { ComputeProviderLogo } from '@/components/core/providers/ComputeProviderLogo' import { cn } from '@/lib/utils' import { hasNoPublicAPI } from './hasNoPublicAPI' -import { formatProvider } from './formatProvider' +import { useWorkflowEditor } from '@/services/editors' +import { findWorkflows } from './getWorkflowProviders' +import { + ClapWorkflowProviderLogo, + ClapWorkflowProviderName, +} from '@/components/core/providers' + +export function VoiceGenerationWorkflows() { + const workflowId = useSettings((s) => s.voiceGenerationWorkflow) + const setWorkflowId = useSettings((s) => s.setVoiceGenerationWorkflow) + const availableWorkflows = useWorkflowEditor((s) => s.availableWorkflows) + + const { workflows, providers, nbProviders } = findWorkflows( + availableWorkflows, + { category: ClapWorkflowCategory.VOICE_GENERATION } + ) -export function VoiceGenerationModelList() { - const provider = useSettings((s) => s.voiceProvider) - const setProvider = useSettings((s) => s.setVoiceProvider) - const model = useSettings((s) => s.voiceGenerationModel) - const setModel = useSettings((s) => s.setVoiceGenerationModel) + const { workflow } = findWorkflows(workflows, { workflowId }) - const availableProviders = Object.keys( - availableModelsForVoiceGeneration - ) as ComputeProvider[] - if (!availableProviders) { + if (!nbProviders) { return null } @@ -39,40 +45,41 @@ export function VoiceGenerationModelList() { generate voice
- -
{model || 'None'}
+
{workflow?.label || 'None'}
- {availableProviders.map((p) => ( + {Object.entries(providers).map(([p, workflows]) => ( - {p} + + {p as ClapWorkflowProvider} + - {(availableModelsForVoiceGeneration[p] || []).map((m) => ( + {workflows.map((w) => ( { - if (hasNoPublicAPI(m)) { + if (hasNoPublicAPI(w)) { e.stopPropagation() e.preventDefault() return false } - setProvider(p) - setModel(m) + setWorkflowId(w.id) e.stopPropagation() e.preventDefault() return false }} > - {m} + {w.label} ))} diff --git a/src/components/toolbars/top-menu/lists/formatProvider.ts b/src/components/toolbars/top-menu/lists/formatProvider.ts index 4cf6fd43..87660e65 100644 --- a/src/components/toolbars/top-menu/lists/formatProvider.ts +++ b/src/components/toolbars/top-menu/lists/formatProvider.ts @@ -1,8 +1,12 @@ -import { computeProviderShortNames } from '@/components/settings/constants' -import { ComputeProvider } from '@aitube/clapper-services' +import { ClapWorkflowProvider } from '@aitube/clap' -export function formatProvider(computeProvider?: ComputeProvider): string { +import { ClapWorkflowProviderShortNames } from '@/components/settings/constants' + +export function formatProvider( + ClapWorkflowProvider?: ClapWorkflowProvider +): string { return `${ - (computeProviderShortNames as any)[computeProvider || ''] || 'None' + (ClapWorkflowProviderShortNames as any)[ClapWorkflowProvider || ''] || + 'None' }` } diff --git a/src/components/toolbars/top-menu/lists/getWorkflowProviders.ts b/src/components/toolbars/top-menu/lists/getWorkflowProviders.ts new file mode 100644 index 00000000..331c55ec --- /dev/null +++ b/src/components/toolbars/top-menu/lists/getWorkflowProviders.ts @@ -0,0 +1,68 @@ +import { + ClapWorkflow, + ClapWorkflowCategory, + ClapWorkflowEngine, + ClapWorkflowProvider, +} from '@aitube/clap' + +/** + * Helper to find workflows by id, category, provider or engine + * + * @param allWorkflows + * @param filter + * @returns + */ +export function findWorkflows( + allWorkflows: ClapWorkflow[], + filter?: { + workflowId?: string + workflowIds?: string[] + category?: ClapWorkflowCategory + provider?: ClapWorkflowProvider + engine?: ClapWorkflowEngine + } +): { + workflow?: ClapWorkflow + workflows: ClapWorkflow[] + nbWorkflows: number + providers: Partial> + nbProviders: number + workflowIds: Record +} { + const workflows: ClapWorkflow[] = [] + const providers: Partial> = {} + const workflowIds: Record = {} + + for (const workflow of allWorkflows) { + if (filter?.workflowId && workflow.id !== filter.workflowId) { + continue + } + if (Array.isArray(filter?.workflowIds) && filter.workflowIds.length) { + // TODO: replace by a hashmap + if (!filter.workflowIds.includes(workflow.id)) { + continue + } + } + if (filter?.category && workflow.category !== filter.category) { + continue + } + if (filter?.engine && workflow.engine !== filter.engine) { + continue + } + if (filter?.provider && workflow.provider !== filter.provider) { + continue + } + workflows.push(workflow) + workflowIds[workflow.id] = workflow + providers[workflow.provider] = workflows + } + + return { + workflow: workflows[0], + workflowIds, + workflows: workflows, + nbWorkflows: workflows.length, + providers, + nbProviders: Object.keys(providers).length, + } +} diff --git a/src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts b/src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts index dd1b430c..b7068249 100644 --- a/src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts +++ b/src/components/toolbars/top-menu/lists/hasNoPublicAPI.ts @@ -1,23 +1,23 @@ -import { ComputeProvider } from '@aitube/clapper-services' +import { ClapWorkflow, ClapWorkflowProvider } from '@aitube/clap' -export function hasNoPublicAPI(model: string) { - model = model.toLowerCase() +export function hasNoPublicAPI({ provider }: ClapWorkflow) { + const providerStr = provider.toLowerCase() if ( - model.includes('no public api') || - model.includes('no api') || - model.includes('not available') || - model.includes('no image api') || - model.includes('no video api') || - model.includes('no music api') || - model.includes('no sound api') || - model.includes('no voice api') || - model.includes('unavailable') || - model === ComputeProvider.SUNO || - model === ComputeProvider.KUAISHOU || - model === ComputeProvider.RUNWAYML || - model === ComputeProvider.LUMALABS || - model === ComputeProvider.HEDRA || - model === ComputeProvider.UDIO + provider === ClapWorkflowProvider.SUNO || + provider === ClapWorkflowProvider.KUAISHOU || + provider === ClapWorkflowProvider.RUNWAYML || + provider === ClapWorkflowProvider.LUMALABS || + provider === ClapWorkflowProvider.HEDRA || + provider === ClapWorkflowProvider.UDIO || + providerStr.includes('no public api') || + providerStr.includes('no api') || + providerStr.includes('not available') || + providerStr.includes('no image api') || + providerStr.includes('no video api') || + providerStr.includes('no music api') || + providerStr.includes('no sound api') || + providerStr.includes('no voice api') || + providerStr.includes('unavailable') ) { return true } diff --git a/src/components/toolbars/top-menu/music/index.tsx b/src/components/toolbars/top-menu/music/index.tsx index 95387680..bf71f276 100644 --- a/src/components/toolbars/top-menu/music/index.tsx +++ b/src/components/toolbars/top-menu/music/index.tsx @@ -16,7 +16,7 @@ import { useUI } from '@/services/ui' import { RenderingStrategyList } from '../lists/RenderingStrategyList' import { SettingsCategory } from '@aitube/clapper-services' -import { MusicGenerationModelList } from '../lists/MusicGenerationModelList' +import { MusicGenerationWorkflows } from '../lists/MusicGenerationWorkflows' import { useResolver } from '@/services/resolver/useResolver' import { IsBusy } from '../IsBusy' @@ -46,7 +46,7 @@ export function TopMenuMusic() { Show advanced settings - + - + - - - - + + + + - + ((set, get) => ({ // but a snapshot of the serializable state values only // // when need that because we are going send those settings in HTTPS to our gateway - const settings = useSettings.getState().getSettings() + const settings = useSettings.getState().getRequestSettings() addEventToHistory({ senderId: 'director', diff --git a/src/services/editors/workflow-editor/getDefaultWorkflowtEditorState.ts b/src/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts similarity index 69% rename from src/services/editors/workflow-editor/getDefaultWorkflowtEditorState.ts rename to src/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts index b7cf384a..cbfc35b8 100644 --- a/src/services/editors/workflow-editor/getDefaultWorkflowtEditorState.ts +++ b/src/services/editors/workflow-editor/getDefaultWorkflowEditorState.ts @@ -1,11 +1,16 @@ import { WorkflowEditorState } from '@aitube/clapper-services' +import { workflows } from './workflows' + export function getDefaultWorkflowEditorState(): WorkflowEditorState { const state: WorkflowEditorState = { before: [], current: undefined, after: [], version: 0, + + // we clone + availableWorkflows: workflows.map((w) => ({ ...w })), } return state diff --git a/src/services/editors/workflow-editor/useWorkflowEditor.ts b/src/services/editors/workflow-editor/useWorkflowEditor.ts index 88aada17..8fbfbc21 100644 --- a/src/services/editors/workflow-editor/useWorkflowEditor.ts +++ b/src/services/editors/workflow-editor/useWorkflowEditor.ts @@ -4,7 +4,7 @@ import { create } from 'zustand' import { WorkflowEditorStore } from '@aitube/clapper-services' import { ClapWorkflow } from '@aitube/clap' -import { getDefaultWorkflowEditorState } from './getDefaultWorkflowtEditorState' +import { getDefaultWorkflowEditorState } from './getDefaultWorkflowEditorState' export const useWorkflowEditor = create((set, get) => ({ ...getDefaultWorkflowEditorState(), @@ -13,4 +13,8 @@ export const useWorkflowEditor = create((set, get) => ({ }, undo: () => {}, redo: () => {}, + + updateAvailableWorkflows: async () => { + // TODO pull data from.. somewhere + }, })) diff --git a/src/services/editors/workflow-editor/workflows/comfyicu/index.ts b/src/services/editors/workflow-editor/workflows/comfyicu/index.ts new file mode 100644 index 00000000..bdb923a1 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/comfyicu/index.ts @@ -0,0 +1,3 @@ +import { ClapWorkflow } from '@aitube/clap' + +export const comfyicuWorkflows: ClapWorkflow[] = [] diff --git a/src/services/editors/workflow-editor/workflows/common/defaultValues.ts b/src/services/editors/workflow-editor/workflows/common/defaultValues.ts new file mode 100644 index 00000000..809881c1 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/common/defaultValues.ts @@ -0,0 +1,55 @@ +import { ClapInputField } from '@aitube/clap' + +// IMPORTANT: do NOT modify those default fields, +// otherwise you might break the workflow of someone else! +// +// instead you should extend/overwrite them in your own workflow + +export const genericTextPrompt: ClapInputField = { + id: 'prompt', + label: 'Prompt', + description: 'Prompt', + type: 'string', + allowedValues: [], + defaultValue: '', +} + +export const genericWidth1024: ClapInputField = { + id: 'width', + label: 'Width', + description: 'Width', + type: 'number', + minValue: 256, + maxValue: 1024, + defaultValue: 1024, +} + +export const genericWidth2048: ClapInputField = { + id: 'width', + label: 'Width', + description: 'Width', + type: 'number', + minValue: 256, + maxValue: 2048, + defaultValue: 1024, +} + +export const genericHeight1024: ClapInputField = { + id: 'height', + label: 'Height', + description: 'Height', + type: 'number', + minValue: 256, + maxValue: 1024, + defaultValue: 576, +} + +export const genericHeight2048: ClapInputField = { + id: 'height', + label: 'Height', + description: 'Height', + type: 'number', + minValue: 256, + maxValue: 2048, + defaultValue: 576, +} diff --git a/src/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts b/src/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts new file mode 100644 index 00000000..04452c50 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/falai/comfyuiWorkflows.ts @@ -0,0 +1,8 @@ +import { + ClapWorkflow, + ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, +} from '@aitube/clap' + +export const comfyuiWorkflows: ClapWorkflow[] = [] diff --git a/src/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts b/src/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts new file mode 100644 index 00000000..cc2a60a9 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/falai/defaultWorkflows.ts @@ -0,0 +1,162 @@ +import { + ClapWorkflow, + ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, +} from '@aitube/clap' + +import { + genericHeight1024, + genericHeight2048, + genericTextPrompt, + genericWidth1024, + genericWidth2048, +} from '../common/defaultValues' + +/* + +TODO: add those as well + +"fal-ai/photomaker", +"fal-ai/pulid", +"fal-ai/image-to-image", +"fal-ai/omni-zero", + +*/ + +export const defaultWorkflows: ClapWorkflow[] = [ + { + id: 'falai://fal-ai/flux-pro', + label: 'FLUX.1 [pro]', + description: '', + tags: ['flux'], + author: 'BFL (https://BlackForestLabs.ai)', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'fal-ai/flux-pro', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth2048, + genericHeight2048, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth2048.defaultValue, + height: genericHeight2048.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'falai://fal-ai/flux-schnell', + label: 'FLUX.1 [schnell]', + description: '', + tags: ['flux'], + author: 'BFL (https://BlackForestLabs.ai)', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'fal-ai/flux-schnell', + inputFields: [genericTextPrompt, genericWidth2048, genericHeight2048], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth2048.defaultValue, + height: genericHeight2048.defaultValue, + }, + }, + { + id: 'falai://fal-ai/flux-dev', + label: 'FLUX.1 [dev]', + description: '', + tags: ['flux'], + author: 'BFL (https://BlackForestLabs.ai)', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'fal-ai/flux-dev', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth2048, + genericHeight2048, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth2048.defaultValue, + height: genericHeight2048.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'falai://fal-ai/fast-sdxl', + label: 'Fast SDXL', + description: '', + tags: ['SD3'], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'fal-ai/fast-sdxl', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'falai://fal-ai/stable-diffusion-v3-medium', + label: 'Stable Diffusion 3 (Medium)', + description: '', + tags: ['SD3'], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'fal-ai/stable-diffusion-v3-medium', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, +] diff --git a/src/services/editors/workflow-editor/workflows/falai/index.ts b/src/services/editors/workflow-editor/workflows/falai/index.ts new file mode 100644 index 00000000..3b7406a8 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/falai/index.ts @@ -0,0 +1,4 @@ +import { defaultWorkflows } from './defaultWorkflows' +import { comfyuiWorkflows } from './comfyuiWorkflows' + +export const falaiWorkflows = [...defaultWorkflows, ...comfyuiWorkflows] diff --git a/src/services/editors/workflow-editor/workflows/fireworksai/index.ts b/src/services/editors/workflow-editor/workflows/fireworksai/index.ts new file mode 100644 index 00000000..48ef8971 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/fireworksai/index.ts @@ -0,0 +1,130 @@ +import { + ClapWorkflow, + ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, +} from '@aitube/clap' +import { + genericHeight1024, + genericTextPrompt, + genericWidth1024, +} from '../common/defaultValues' + +export const fireworksaiWorkflows: ClapWorkflow[] = [ + { + id: 'fireworksai://stability/sd3', + label: 'SD3', + description: '', + tags: [], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FIREWORKSAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'stability/sd3', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'fireworksai://stability/sd3-turbo', + label: 'SD3 Turbo', + description: '', + tags: [], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FIREWORKSAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'accounts/stability/models/sd3-turbo', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'fireworksai://fireworks/stable-diffusion-xl-1024-v1-0', + label: 'SDXL', + description: '', + tags: [], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FIREWORKSAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'fireworks/stable-diffusion-xl-1024-v1-0', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'fireworksai://fireworksai/playground-v2-5-1024px-aesthetic', + label: 'Playground 2.5', + description: '', + tags: [], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FIREWORKSAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'accounts/fireworks/models/playground-v2-5-1024px-aesthetic', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, +] diff --git a/src/services/editors/workflow-editor/workflows/huggingface/index.ts b/src/services/editors/workflow-editor/workflows/huggingface/index.ts new file mode 100644 index 00000000..b9fcd97f --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/huggingface/index.ts @@ -0,0 +1,8 @@ +import { + ClapWorkflow, + ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, +} from '@aitube/clap' + +export const huggingfaceWorkflows: ClapWorkflow[] = [] diff --git a/src/services/editors/workflow-editor/workflows/index.ts b/src/services/editors/workflow-editor/workflows/index.ts new file mode 100644 index 00000000..72aa8feb --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/index.ts @@ -0,0 +1,17 @@ +import { ClapWorkflow } from '@aitube/clap' + +import { falaiWorkflows } from './falai' +import { stabilityaiWorkflows } from './stabilityai' +import { replicateWorkflows } from './replicate' +import { fireworksaiWorkflows } from './fireworksai' +import { huggingfaceWorkflows } from './huggingface' +import { comfyicuWorkflows } from './comfyicu' + +export const workflows: ClapWorkflow[] = [ + ...falaiWorkflows, + ...stabilityaiWorkflows, + ...replicateWorkflows, + ...fireworksaiWorkflows, + ...huggingfaceWorkflows, + ...comfyicuWorkflows, +] diff --git a/src/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts b/src/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts new file mode 100644 index 00000000..04452c50 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/replicate/comfyuiWorkflows.ts @@ -0,0 +1,8 @@ +import { + ClapWorkflow, + ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, +} from '@aitube/clap' + +export const comfyuiWorkflows: ClapWorkflow[] = [] diff --git a/src/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts b/src/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts new file mode 100644 index 00000000..579bb275 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/replicate/defaultWorkflows.ts @@ -0,0 +1,125 @@ +import { + ClapWorkflow, + ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, +} from '@aitube/clap' + +import { + genericHeight1024, + genericHeight2048, + genericTextPrompt, + genericWidth1024, + genericWidth2048, +} from '../common/defaultValues' + +export const defaultWorkflows: ClapWorkflow[] = [ + { + id: 'replicate://black-forest-labs/flux-pro', + label: 'FLUX.1 [pro]', + description: '', + tags: ['flux'], + author: 'BFL (https://BlackForestLabs.ai)', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + category: ClapWorkflowCategory.IMAGE_GENERATION, + provider: ClapWorkflowProvider.REPLICATE, + data: 'black-forest-labs/flux-pro', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth2048, + genericHeight2048, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth2048.defaultValue, + height: genericHeight2048.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'replicate://black-forest-labs/flux-schnell', + label: 'FLUX.1 [schnell]', + description: '', + tags: ['flux'], + author: 'BFL (https://BlackForestLabs.ai)', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.REPLICATE, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'black-forest-labs/flux-schnell', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [genericTextPrompt, genericWidth2048, genericHeight2048], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth2048.defaultValue, + height: genericHeight2048.defaultValue, + }, + }, + { + id: 'replicate://black-forest-labs/flux-dev', + label: 'FLUX.1 [dev]', + description: '', + tags: ['flux'], + author: 'BFL (https://BlackForestLabs.ai)', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.REPLICATE, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'black-forest-labs/flux-dev', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth2048, + genericHeight2048, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth2048.defaultValue, + height: genericHeight2048.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'replicate://stability-ai/sdxl', + label: 'SDXL', + description: '', + tags: ['SDXL'], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.REPLICATE, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'stability-ai/fast-sdxl', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, +] diff --git a/src/services/editors/workflow-editor/workflows/replicate/index.ts b/src/services/editors/workflow-editor/workflows/replicate/index.ts new file mode 100644 index 00000000..ba65f4c1 --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/replicate/index.ts @@ -0,0 +1,4 @@ +import { defaultWorkflows } from './defaultWorkflows' +import { comfyuiWorkflows } from './comfyuiWorkflows' + +export const replicateWorkflows = [...defaultWorkflows, ...comfyuiWorkflows] diff --git a/src/services/editors/workflow-editor/workflows/stabilityai/index.ts b/src/services/editors/workflow-editor/workflows/stabilityai/index.ts new file mode 100644 index 00000000..0fc5db4d --- /dev/null +++ b/src/services/editors/workflow-editor/workflows/stabilityai/index.ts @@ -0,0 +1,103 @@ +import { + ClapWorkflow, + ClapWorkflowEngine, + ClapWorkflowCategory, + ClapWorkflowProvider, +} from '@aitube/clap' + +import { + genericHeight1024, + genericTextPrompt, + genericWidth1024, + genericWidth2048, +} from '../common/defaultValues' + +export const stabilityaiWorkflows: ClapWorkflow[] = [ + { + id: 'stabilityai://stable-image/generate/ultra', + label: 'Stable Image Ultra', + description: '', + tags: ['SD', 'Ultra'], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'stable-image/generate/ultra', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'stabilityai://stable-image/generate/core', + label: 'Stable Image Core', + description: '', + tags: ['SD', 'Core'], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'stable-image/generate/core', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, + { + id: 'stabilityai://stable-image/generate/sd3', + label: 'Stable Diffusion 3', + description: '', + tags: ['SD', 'SD3'], + author: 'Stability AI', + thumbnailUrl: '', + engine: ClapWorkflowEngine.REST_API, + provider: ClapWorkflowProvider.FALAI, + category: ClapWorkflowCategory.IMAGE_GENERATION, + data: 'stable-image/generate/sd3', + /** + * Inputs of the workflow (this is used to build an UI for the automatically) + */ + inputFields: [ + genericTextPrompt, + genericWidth1024, + genericHeight1024, + + // TODO: add guidance scale and number of steps + ], + inputValues: { + prompt: genericTextPrompt.defaultValue, + width: genericWidth1024.defaultValue, + height: genericHeight1024.defaultValue, + + // TODO: add guidance scale and number of steps + }, + }, +] diff --git a/src/services/metrics/constants.ts b/src/services/metrics/constants.ts index bcb3d856..c616dcb1 100644 --- a/src/services/metrics/constants.ts +++ b/src/services/metrics/constants.ts @@ -1,7 +1,7 @@ // some providers don't provide APIs to get those statistics // so we have to resort to using very approximative estimations -import { ComputeProvider } from '@aitube/clapper-services' +import { ClapWorkflowProvider } from '@aitube/clap' import { ProviderMetricsEstimationType, ProviderMetricsModelEstimations, @@ -14,59 +14,60 @@ import { // provider load etc.. so sometimes there is a big delta between what // is announced on the corporate websites and the reality export const estimatedMetrics: Record< - ComputeProvider, + ClapWorkflowProvider, Record > = { - [ComputeProvider.NONE]: { + [ClapWorkflowProvider.BUILTIN]: {}, + [ClapWorkflowProvider.NONE]: { // TODO list the most popular models }, - [ComputeProvider.CUSTOM]: { + [ClapWorkflowProvider.CUSTOM]: { // TODO list the most popular models }, - [ComputeProvider.HUGGINGFACE]: { + [ClapWorkflowProvider.HUGGINGFACE]: { // TODO list the most popular models }, - [ComputeProvider.COMFY_HUGGINGFACE]: { + [ClapWorkflowProvider.COMFY_HUGGINGFACE]: { // TODO list the most popular models }, - [ComputeProvider.REPLICATE]: { + [ClapWorkflowProvider.REPLICATE]: { // TODO list the most popular models }, - [ComputeProvider.COMFY_REPLICATE]: { + [ClapWorkflowProvider.COMFY_REPLICATE]: { // TODO list the most popular models }, - [ComputeProvider.COMFY_COMFYICU]: { + [ClapWorkflowProvider.COMFY_COMFYICU]: { // TODO list the most popular models }, - [ComputeProvider.ELEVENLABS]: { + [ClapWorkflowProvider.ELEVENLABS]: { // TODO list the most popular models }, - [ComputeProvider.OPENAI]: { + [ClapWorkflowProvider.OPENAI]: { // TODO list the most popular models }, - [ComputeProvider.STABILITYAI]: { + [ClapWorkflowProvider.STABILITYAI]: { // TODO list the most popular models }, - [ComputeProvider.FIREWORKSAI]: {}, - [ComputeProvider.GROQ]: { + [ClapWorkflowProvider.FIREWORKSAI]: {}, + [ClapWorkflowProvider.GROQ]: { // TODO list the most popular models }, - [ComputeProvider.KITSAI]: { + [ClapWorkflowProvider.KITSAI]: { // TODO list the most popular models }, - [ComputeProvider.ANTHROPIC]: { + [ClapWorkflowProvider.ANTHROPIC]: { // TODO list the most popular models }, - [ComputeProvider.GOOGLE]: { + [ClapWorkflowProvider.GOOGLE]: { // TODO list the most popular models }, - [ComputeProvider.MISTRALAI]: { + [ClapWorkflowProvider.MISTRALAI]: { // TODO list the most popular models }, - [ComputeProvider.COHERE]: { + [ClapWorkflowProvider.COHERE]: { // TODO list the most popular models }, - [ComputeProvider.FALAI]: { + [ClapWorkflowProvider.FALAI]: { 'fal-ai/metavoice-v1': { estimationType: ProviderMetricsEstimationType.MANUAL_MEASUREMENTS, averageCostPerComputeTimeInSec: 0.0006666666666666666, @@ -111,34 +112,34 @@ export const estimatedMetrics: Record< averageCostPerGeneration: 0.015, }, }, - [ComputeProvider.MODELSLAB]: { + [ClapWorkflowProvider.MODELSLAB]: { // TODO list the most popular models }, - [ComputeProvider.MIDJOURNEY]: { + [ClapWorkflowProvider.MIDJOURNEY]: { // TODO list the most popular models }, - [ComputeProvider.SUNO]: { + [ClapWorkflowProvider.SUNO]: { // TODO list the most popular models }, - [ComputeProvider.UDIO]: { + [ClapWorkflowProvider.UDIO]: { // TODO list the most popular models }, - [ComputeProvider.LUMALABS]: { + [ClapWorkflowProvider.LUMALABS]: { // TODO list the most popular models }, - [ComputeProvider.KUAISHOU]: { + [ClapWorkflowProvider.KUAISHOU]: { // TODO list the most popular models }, - [ComputeProvider.RUNWAYML]: { + [ClapWorkflowProvider.RUNWAYML]: { // TODO list the most popular models }, - [ComputeProvider.HEDRA]: { + [ClapWorkflowProvider.HEDRA]: { // TODO list the most popular models }, - [ComputeProvider.LEONARDOAI]: { + [ClapWorkflowProvider.LEONARDOAI]: { // TODO list the most popular models }, - [ComputeProvider.EVERARTAI]: { + [ClapWorkflowProvider.EVERARTAI]: { // TODO list the most popular models }, } diff --git a/src/services/metrics/getDefaultComputeProviderMetrics.ts b/src/services/metrics/getDefaultClapWorkflowProviderMetrics.ts similarity index 62% rename from src/services/metrics/getDefaultComputeProviderMetrics.ts rename to src/services/metrics/getDefaultClapWorkflowProviderMetrics.ts index b4974772..fd629de1 100644 --- a/src/services/metrics/getDefaultComputeProviderMetrics.ts +++ b/src/services/metrics/getDefaultClapWorkflowProviderMetrics.ts @@ -1,7 +1,7 @@ -import { ComputeProviderMetrics } from './types' +import { ClapWorkflowProviderMetrics } from './types' -export function getDefaultComputeProviderMetrics(): ComputeProviderMetrics { - const metrics: ComputeProviderMetrics = { +export function getDefaultClapWorkflowProviderMetrics(): ClapWorkflowProviderMetrics { + const metrics: ClapWorkflowProviderMetrics = { // used to estimate live wait times averageDurationPerModel: {}, diff --git a/src/services/metrics/getDefaultMetricsPerProvider.ts b/src/services/metrics/getDefaultMetricsPerProvider.ts index bf0ab21f..1e80e2f4 100644 --- a/src/services/metrics/getDefaultMetricsPerProvider.ts +++ b/src/services/metrics/getDefaultMetricsPerProvider.ts @@ -1,93 +1,96 @@ -import { ComputeProvider } from '@aitube/clapper-services' +import { ClapWorkflowProvider } from '@aitube/clap' import { MetricsPerProvider } from './types' -import { getDefaultComputeProviderMetrics } from './getDefaultComputeProviderMetrics' +import { getDefaultClapWorkflowProviderMetrics } from './getDefaultClapWorkflowProviderMetrics' export function getDefaultMetricsPerProvider(): MetricsPerProvider { const metricsPerProvider: MetricsPerProvider = { - [ComputeProvider.NONE]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.NONE]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.CUSTOM]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.BUILTIN]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.HUGGINGFACE]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.CUSTOM]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.COMFY_HUGGINGFACE]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.HUGGINGFACE]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.REPLICATE]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.COMFY_HUGGINGFACE]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.COMFY_REPLICATE]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.REPLICATE]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.COMFY_COMFYICU]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.COMFY_REPLICATE]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.ELEVENLABS]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.COMFY_COMFYICU]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.OPENAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.ELEVENLABS]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.STABILITYAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.OPENAI]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.FIREWORKSAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.STABILITYAI]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.GROQ]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.FIREWORKSAI]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.FALAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.GROQ]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.MODELSLAB]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.FALAI]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.KITSAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.MODELSLAB]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.ANTHROPIC]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.KITSAI]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.GOOGLE]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.ANTHROPIC]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.MISTRALAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.GOOGLE]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.COHERE]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.MISTRALAI]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.MIDJOURNEY]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.COHERE]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.SUNO]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.MIDJOURNEY]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.UDIO]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.SUNO]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.LUMALABS]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.UDIO]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.KUAISHOU]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.LUMALABS]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.RUNWAYML]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.KUAISHOU]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.HEDRA]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.RUNWAYML]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.LEONARDOAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.HEDRA]: { + ...getDefaultClapWorkflowProviderMetrics(), }, - [ComputeProvider.EVERARTAI]: { - ...getDefaultComputeProviderMetrics(), + [ClapWorkflowProvider.LEONARDOAI]: { + ...getDefaultClapWorkflowProviderMetrics(), + }, + [ClapWorkflowProvider.EVERARTAI]: { + ...getDefaultClapWorkflowProviderMetrics(), }, } return metricsPerProvider diff --git a/src/services/metrics/types.ts b/src/services/metrics/types.ts index 5effb0c6..e93581f4 100644 --- a/src/services/metrics/types.ts +++ b/src/services/metrics/types.ts @@ -1,4 +1,4 @@ -import { ComputeProvider } from '@aitube/clapper-services' +import { ClapWorkflowProvider } from '@aitube/clap' export enum ProviderMetricsEstimationType { // the metrics come from the provider's live API, @@ -34,7 +34,7 @@ export type ProviderMetricsModelStats = { totalCost: number } -export type ComputeProviderMetrics = { +export type ClapWorkflowProviderMetrics = { // used to estimate live wait times averageDurationPerModel: Record @@ -48,7 +48,10 @@ export type ComputeProviderMetrics = { totalCost: number } -export type MetricsPerProvider = Record +export type MetricsPerProvider = Record< + ClapWorkflowProvider, + ClapWorkflowProviderMetrics +> export type MetricsState = { metricsPerProvider: MetricsPerProvider diff --git a/src/services/mic/useMic.ts b/src/services/mic/useMic.ts index 63c920dc..a12bfce6 100644 --- a/src/services/mic/useMic.ts +++ b/src/services/mic/useMic.ts @@ -45,13 +45,13 @@ export const useMic = create((set, get) => ({ const handleResult = (event: SpeechRecognitionEvent) => { const currentTime = Date.now() - + // Check if it's been more than $cutoffTimeInMs since the last speech if (currentTime - lastSpeechTime > cutoffTimeInMs) { lastCompleteTranscript = '' currentTranscript = '' } - + lastSpeechTime = currentTime // Get the most recent result @@ -63,8 +63,11 @@ export const useMic = create((set, get) => ({ lastCompleteTranscript = currentTranscript } - const fullTranscript = lastCompleteTranscript + - (currentTranscript !== lastCompleteTranscript ? ' ' + currentTranscript : '') + const fullTranscript = + lastCompleteTranscript + + (currentTranscript !== lastCompleteTranscript + ? ' ' + currentTranscript + : '') if (debounceTimer) { clearTimeout(debounceTimer) @@ -88,8 +91,11 @@ export const useMic = create((set, get) => ({ const handleEnd = () => { if (debounceTimer) { clearTimeout(debounceTimer) - const fullTranscript = lastCompleteTranscript + - (currentTranscript !== lastCompleteTranscript ? ' ' + currentTranscript : '') + const fullTranscript = + lastCompleteTranscript + + (currentTranscript !== lastCompleteTranscript + ? ' ' + currentTranscript + : '') set({ transcript: fullTranscript.trim() }) } set({ isListening: false }) @@ -124,4 +130,4 @@ export const useMic = create((set, get) => ({ if (typeof window !== 'undefined') { useMic.getState().init() -} \ No newline at end of file +} diff --git a/src/services/resolver/useResolver.ts b/src/services/resolver/useResolver.ts index 8b10e089..04d6e64b 100644 --- a/src/services/resolver/useResolver.ts +++ b/src/services/resolver/useResolver.ts @@ -450,7 +450,7 @@ export const useResolver = create((set, get) => ({ resolveSegment: async ( segment: TimelineSegment ): Promise => { - const settings = useSettings.getState().getSettings() + const settings = useSettings.getState().getRequestSettings() const timeline: TimelineStore = useTimeline.getState() diff --git a/src/services/settings/getDefaultSettingsState.ts b/src/services/settings/getDefaultSettingsState.ts index 7228d880..19409cb1 100644 --- a/src/services/settings/getDefaultSettingsState.ts +++ b/src/services/settings/getDefaultSettingsState.ts @@ -1,9 +1,5 @@ import { RenderingStrategy } from '@aitube/timeline' -import { - ComfyIcuAccelerator, - ComputeProvider, - SettingsState, -} from '@aitube/clapper-services' +import { ComfyIcuAccelerator, SettingsState } from '@aitube/clapper-services' import { defaultWorkflowForImages } from './workflows/image' @@ -31,19 +27,6 @@ export function getDefaultSettingsState(): SettingsState { broadcastObsServerPort: 4455, broadcastObsServerPass: '', - assistantProvider: ComputeProvider.NONE, - imageProvider: ComputeProvider.NONE, - imageDepthProvider: ComputeProvider.NONE, - imageSegmentationProvider: ComputeProvider.NONE, - imageUpscalingProvider: ComputeProvider.NONE, - videoProvider: ComputeProvider.NONE, - videoDepthProvider: ComputeProvider.NONE, - videoSegmentationProvider: ComputeProvider.NONE, - videoUpscalingProvider: ComputeProvider.NONE, - soundProvider: ComputeProvider.NONE, - voiceProvider: ComputeProvider.NONE, - musicProvider: ComputeProvider.NONE, - censorNotForAllAudiencesContent: false, imagePromptPrefix: 'screencap', @@ -55,20 +38,20 @@ export function getDefaultSettingsState(): SettingsState { videoNegativePrompt: 'black banding, ugly, imperfect, cropped, low resolution', - assistantModel: '', - assistantTurboModel: '', - imageGenerationModel: '', - imageGenerationTurboModel: '', - imageUpscalingModel: '', - imageDepthModel: '', - imageSegmentationModel: '', - videoGenerationModel: '', - videoUpscalingModel: '', - videoDepthModel: '', - videoSegmentationModel: '', - soundGenerationModel: '', - voiceGenerationModel: '', - musicGenerationModel: '', + assistantWorkflow: '', + assistantTurboWorkflow: '', + imageGenerationWorkflow: '', + imageGenerationTurboWorkflow: '', + imageUpscalingWorkflow: '', + imageDepthWorkflow: '', + imageSegmentationWorkflow: '', + videoGenerationWorkflow: '', + videoUpscalingWorkflow: '', + videoDepthWorkflow: '', + videoSegmentationWorkflow: '', + soundGenerationWorkflow: '', + voiceGenerationWorkflow: '', + musicGenerationWorkflow: '', imageRenderingStrategy: RenderingStrategy.ON_DEMAND, imageUpscalingRenderingStrategy: RenderingStrategy.ON_DEMAND, diff --git a/src/services/settings/useSettings.ts b/src/services/settings/useSettings.ts index fdb90e39..89d2780d 100644 --- a/src/services/settings/useSettings.ts +++ b/src/services/settings/useSettings.ts @@ -2,155 +2,29 @@ import { create } from 'zustand' import { persist } from 'zustand/middleware' -import { getValidNumber } from '@aitube/clap' +import { getValidNumber, ClapWorkflowProvider } from '@aitube/clap' import { parseRenderingStrategy, RenderingStrategy } from '@aitube/timeline' import { ComfyIcuAccelerator, - ComputeProvider, + RequestSettings, SettingsState, SettingsStore, } from '@aitube/clapper-services' -import { - getValidBoolean, - getValidString, - parseComputeProvider, -} from '@/lib/utils' +import { getValidBoolean, getValidString } from '@/lib/utils' import { HARD_LIMIT_NB_MAX_ASSETS_TO_GENERATE_IN_PARALLEL } from '@/lib/core/constants' import { getDefaultSettingsState } from './getDefaultSettingsState' import { getValidComfyWorkflowTemplate } from '@/lib/utils/getValidComfyWorkflowTemplate' import { parseComfyIcuAccelerator } from '@/lib/utils/parseComfyIcuAccelerator' +import { findWorkflows } from '@/components/toolbars/top-menu/lists/getWorkflowProviders' +import { useWorkflowEditor } from '../editors' export const useSettings = create()( persist( (set, get) => ({ ...getDefaultSettingsState(), - setAssistantProvider: (assistantProvider?: ComputeProvider) => { - const { videoProvider: defaultAssistantProvider } = - getDefaultSettingsState() - set({ - assistantProvider: parseComputeProvider( - assistantProvider, - defaultAssistantProvider - ), - }) - }, - setImageProvider: (imageProvider?: ComputeProvider) => { - const { imageProvider: defaultImageProvider } = - getDefaultSettingsState() - set({ - imageProvider: parseComputeProvider( - imageProvider, - defaultImageProvider - ), - }) - }, - setImageDepthProvider: (imageDepthProvider?: ComputeProvider) => { - const { imageDepthProvider: defaultImageDepthProvider } = - getDefaultSettingsState() - set({ - imageDepthProvider: parseComputeProvider( - imageDepthProvider, - defaultImageDepthProvider - ), - }) - }, - setImageSegmentationProvider: ( - imageSegmentationProvider?: ComputeProvider - ) => { - const { imageSegmentationProvider: defaultImageSegmentationProvider } = - getDefaultSettingsState() - set({ - imageSegmentationProvider: parseComputeProvider( - imageSegmentationProvider, - defaultImageSegmentationProvider - ), - }) - }, - setImageUpscalingProvider: (imageUpscalingProvider?: ComputeProvider) => { - const { imageUpscalingProvider: defaultImageUpscalingProvider } = - getDefaultSettingsState() - set({ - imageUpscalingProvider: parseComputeProvider( - imageUpscalingProvider, - defaultImageUpscalingProvider - ), - }) - }, - setVideoProvider: (videoProvider?: ComputeProvider) => { - const { videoProvider: defaultVideoProvider } = - getDefaultSettingsState() - set({ - videoProvider: parseComputeProvider( - videoProvider, - defaultVideoProvider - ), - }) - }, - setVideoDepthProvider: (videoDepthProvider?: ComputeProvider) => { - const { videoDepthProvider: defaultVideoDepthProvider } = - getDefaultSettingsState() - set({ - videoDepthProvider: parseComputeProvider( - videoDepthProvider, - defaultVideoDepthProvider - ), - }) - }, - setVideoSegmentationProvider: ( - videoSegmentationProvider?: ComputeProvider - ) => { - const { videoSegmentationProvider: defaultVideoSegmentationProvider } = - getDefaultSettingsState() - set({ - videoSegmentationProvider: parseComputeProvider( - videoSegmentationProvider, - defaultVideoSegmentationProvider - ), - }) - }, - setVideoUpscalingProvider: (videoUpscalingProvider?: ComputeProvider) => { - const { videoUpscalingProvider: defaultVideoUpscalingProvider } = - getDefaultSettingsState() - set({ - videoUpscalingProvider: parseComputeProvider( - videoUpscalingProvider, - defaultVideoUpscalingProvider - ), - }) - }, - setVoiceProvider: (voiceProvider?: ComputeProvider) => { - const { voiceProvider: defaultSpeechProvider } = - getDefaultSettingsState() - set({ - voiceProvider: parseComputeProvider( - voiceProvider, - defaultSpeechProvider - ), - }) - }, - setSoundProvider: (soundProvider?: ComputeProvider) => { - const { soundProvider: defaultSoundProvider } = - getDefaultSettingsState() - set({ - soundProvider: parseComputeProvider( - soundProvider, - defaultSoundProvider - ), - }) - }, - setMusicProvider: (musicProvider?: ComputeProvider) => { - const { musicProvider: defaultMusicProvider } = - getDefaultSettingsState() - set({ - musicProvider: parseComputeProvider( - musicProvider, - defaultMusicProvider - ), - }) - }, setCustomComfyUiApiKey: (customComfyUiApiKey?: string) => { const { customComfyUiApiKey: defaulCustomComfyUiApiKey } = getDefaultSettingsState() @@ -363,140 +237,146 @@ export const useSettings = create()( ), }) }, - setAssistantModel: (assistantModel?: string) => { - const { assistantModel: defaultAssistantModel } = + setAssistantWorkflow: (assistantWorkflow?: string) => { + const { assistantWorkflow: defaultAssistantWorkflow } = getDefaultSettingsState() set({ - assistantModel: getValidString(assistantModel, defaultAssistantModel), + assistantWorkflow: getValidString( + assistantWorkflow, + defaultAssistantWorkflow + ), }) }, - setAssistantTurboModel: (assistantTurboModel?: string) => { - const { assistantTurboModel: defaultAssistantTurboModel } = + setAssistantTurboWorkflow: (assistantTurboWorkflow?: string) => { + const { assistantTurboWorkflow: defaultAssistantTurboWorkflow } = getDefaultSettingsState() set({ - assistantTurboModel: getValidString( - assistantTurboModel, - defaultAssistantTurboModel + assistantTurboWorkflow: getValidString( + assistantTurboWorkflow, + defaultAssistantTurboWorkflow ), }) }, - setImageGenerationModel: (imageGenerationModel?: string) => { - const { imageGenerationModel: defaultImageGenerationModel } = + setImageGenerationWorkflow: (imageGenerationWorkflow?: string) => { + const { imageGenerationWorkflow: defaultImageGenerationWorkflow } = getDefaultSettingsState() set({ - imageGenerationModel: getValidString( - imageGenerationModel, - defaultImageGenerationModel + imageGenerationWorkflow: getValidString( + imageGenerationWorkflow, + defaultImageGenerationWorkflow ), }) }, - setImageGenerationTurboModel: (imageGenerationTurboModel?: string) => { - const { imageGenerationTurboModel: defaultImageGenerationTurboModel } = - getDefaultSettingsState() + setImageGenerationTurboWorkflow: ( + imageGenerationTurboWorkflow?: string + ) => { + const { + imageGenerationTurboWorkflow: defaultImageGenerationTurboWorkflow, + } = getDefaultSettingsState() set({ - imageGenerationTurboModel: getValidString( - imageGenerationTurboModel, - defaultImageGenerationTurboModel + imageGenerationTurboWorkflow: getValidString( + imageGenerationTurboWorkflow, + defaultImageGenerationTurboWorkflow ), }) }, - setImageUpscalingModel: (imageUpscalingModel?: string) => { - const { imageUpscalingModel: defaultImageUpscalingModel } = + setImageUpscalingWorkflow: (imageUpscalingWorkflow?: string) => { + const { imageUpscalingWorkflow: defaultImageUpscalingWorkflow } = getDefaultSettingsState() set({ - imageUpscalingModel: getValidString( - imageUpscalingModel, - defaultImageUpscalingModel + imageUpscalingWorkflow: getValidString( + imageUpscalingWorkflow, + defaultImageUpscalingWorkflow ), }) }, - setImageDepthModel: (imageDepthModel?: string) => { - const { imageDepthModel: defaultImageDepthModel } = + setImageDepthWorkflow: (imageDepthWorkflow?: string) => { + const { imageDepthWorkflow: defaultImageDepthWorkflow } = getDefaultSettingsState() set({ - imageDepthModel: getValidString( - imageDepthModel, - defaultImageDepthModel + imageDepthWorkflow: getValidString( + imageDepthWorkflow, + defaultImageDepthWorkflow ), }) }, - setImageSegmentationModel: (imageSegmentationModel?: string) => { - const { imageSegmentationModel: defaultImageSegmentationModel } = + setImageSegmentationWorkflow: (imageSegmentationWorkflow?: string) => { + const { imageSegmentationWorkflow: defaultImageSegmentationWorkflow } = getDefaultSettingsState() set({ - imageSegmentationModel: getValidString( - imageSegmentationModel, - defaultImageSegmentationModel + imageSegmentationWorkflow: getValidString( + imageSegmentationWorkflow, + defaultImageSegmentationWorkflow ), }) }, - setVideoGenerationModel: (videoGenerationModel?: string) => { - const { videoGenerationModel: defaultVideoGenerationModel } = + setVideoGenerationWorkflow: (videoGenerationWorkflow?: string) => { + const { videoGenerationWorkflow: defaultVideoGenerationWorkflow } = getDefaultSettingsState() set({ - videoGenerationModel: getValidString( - videoGenerationModel, - defaultVideoGenerationModel + videoGenerationWorkflow: getValidString( + videoGenerationWorkflow, + defaultVideoGenerationWorkflow ), }) }, - setVideoUpscalingModel: (videoUpscalingModel?: string) => { - const { videoUpscalingModel: defaultVideoUpscalingModel } = + setVideoUpscalingWorkflow: (videoUpscalingWorkflow?: string) => { + const { videoUpscalingWorkflow: defaultVideoUpscalingWorkflow } = getDefaultSettingsState() set({ - videoUpscalingModel: getValidString( - videoUpscalingModel, - defaultVideoUpscalingModel + videoUpscalingWorkflow: getValidString( + videoUpscalingWorkflow, + defaultVideoUpscalingWorkflow ), }) }, - setVideoDepthModel: (videoDepthModel?: string) => { - const { videoDepthModel: defaultVideoDepthModel } = + setVideoDepthWorkflow: (videoDepthWorkflow?: string) => { + const { videoDepthWorkflow: defaultVideoDepthWorkflow } = getDefaultSettingsState() set({ - videoDepthModel: getValidString( - videoDepthModel, - defaultVideoDepthModel + videoDepthWorkflow: getValidString( + videoDepthWorkflow, + defaultVideoDepthWorkflow ), }) }, - setVideoSegmentationModel: (videoSegmentationModel?: string) => { - const { videoSegmentationModel: defaultVideoSegmentationModel } = + setVideoSegmentationWorkflow: (videoSegmentationWorkflow?: string) => { + const { videoSegmentationWorkflow: defaultVideoSegmentationWorkflow } = getDefaultSettingsState() set({ - videoSegmentationModel: getValidString( - videoSegmentationModel, - defaultVideoSegmentationModel + videoSegmentationWorkflow: getValidString( + videoSegmentationWorkflow, + defaultVideoSegmentationWorkflow ), }) }, - setSoundGenerationModel: (soundGenerationModel?: string) => { - const { soundGenerationModel: defaultSoundGenerationModel } = + setSoundGenerationWorkflow: (soundGenerationWorkflow?: string) => { + const { soundGenerationWorkflow: defaultSoundGenerationWorkflow } = getDefaultSettingsState() set({ - soundGenerationModel: getValidString( - soundGenerationModel, - defaultSoundGenerationModel + soundGenerationWorkflow: getValidString( + soundGenerationWorkflow, + defaultSoundGenerationWorkflow ), }) }, - setVoiceGenerationModel: (voiceGenerationModel?: string) => { - const { voiceGenerationModel: defaultVoiceGenerationModel } = + setVoiceGenerationWorkflow: (voiceGenerationWorkflow?: string) => { + const { voiceGenerationWorkflow: defaultVoiceGenerationWorkflow } = getDefaultSettingsState() set({ - voiceGenerationModel: getValidString( - voiceGenerationModel, - defaultVoiceGenerationModel + voiceGenerationWorkflow: getValidString( + voiceGenerationWorkflow, + defaultVoiceGenerationWorkflow ), }) }, - setMusicGenerationModel: (musicGenerationModel?: string) => { - const { musicGenerationModel: defaultVoiceGenerationModel } = + setMusicGenerationWorkflow: (musicGenerationWorkflow?: string) => { + const { musicGenerationWorkflow: defaultVoiceGenerationWorkflow } = getDefaultSettingsState() set({ - musicGenerationModel: getValidString( - musicGenerationModel, - defaultVoiceGenerationModel + musicGenerationWorkflow: getValidString( + musicGenerationWorkflow, + defaultVoiceGenerationWorkflow ), }) }, @@ -970,35 +850,86 @@ export const useSettings = create()( set({ kitsAiModelForVoice: getValidString(kitsAiModelForVoice, getDefaultSettingsState().kitsAiModelForVoice) }) }, */ - getSettings: (): SettingsState => { + getRequestSettings: (): RequestSettings => { const state = get() const defaultSettings = getDefaultSettingsState() + + const availableWorkflows = + useWorkflowEditor.getState().availableWorkflows + + const assistantWorkflowId = + state.assistantWorkflow || defaultSettings.assistantWorkflow + + const assistantTurboWorkflowId = + state.assistantTurboWorkflow || defaultSettings.assistantTurboWorkflow + + const imageGenerationWorkflowId = + state.imageGenerationWorkflow || + defaultSettings.imageGenerationWorkflow + + const imageGenerationTurboWorkflowId = + state.imageGenerationTurboWorkflow || + defaultSettings.imageGenerationTurboWorkflow + + const imageUpscalingWorkflowId = + state.imageUpscalingWorkflow || defaultSettings.imageUpscalingWorkflow + + const imageDepthWorkflowId = + state.imageDepthWorkflow || defaultSettings.imageDepthWorkflow + + const imageSegmentationWorkflowId = + state.imageSegmentationWorkflow || + defaultSettings.imageSegmentationWorkflow + + const videoGenerationWorkflowId = + state.videoGenerationWorkflow || + defaultSettings.videoGenerationWorkflow + + const videoDepthWorkflowId = + state.videoDepthWorkflow || defaultSettings.videoDepthWorkflow + + const videoSegmentationWorkflowId = + state.videoSegmentationWorkflow || + defaultSettings.videoSegmentationWorkflow + + const videoUpscalingWorkflowId = + state.videoUpscalingWorkflow || defaultSettings.videoUpscalingWorkflow + + const soundGenerationWorkflowId = + state.soundGenerationWorkflow || + defaultSettings.soundGenerationWorkflow + + const voiceGenerationWorkflowId = + state.voiceGenerationWorkflow || + defaultSettings.voiceGenerationWorkflow + + const musicGenerationWorkflowId = + state.musicGenerationWorkflow || + defaultSettings.musicGenerationWorkflow + + const { workflowIds } = findWorkflows(availableWorkflows, { + workflowIds: [ + assistantWorkflowId, + assistantTurboWorkflowId, + imageGenerationWorkflowId, + imageGenerationTurboWorkflowId, + imageUpscalingWorkflowId, + imageDepthWorkflowId, + imageSegmentationWorkflowId, + videoGenerationWorkflowId, + videoDepthWorkflowId, + videoSegmentationWorkflowId, + videoUpscalingWorkflowId, + soundGenerationWorkflowId, + voiceGenerationWorkflowId, + musicGenerationWorkflowId, + ], + }) + return { // why do we need those fallbacks? because some users will leave the fields empty, // eg. an empty model string.. basically we want to allow empty config that still works! - assistantProvider: - state.assistantProvider || defaultSettings.assistantProvider, - imageProvider: state.imageProvider || defaultSettings.imageProvider, - imageUpscalingProvider: - state.imageUpscalingProvider || - defaultSettings.imageUpscalingProvider, - imageDepthProvider: - state.imageDepthProvider || defaultSettings.imageDepthProvider, - imageSegmentationProvider: - state.imageSegmentationProvider || - defaultSettings.imageSegmentationProvider, - videoProvider: state.videoProvider || defaultSettings.videoProvider, - videoUpscalingProvider: - state.videoUpscalingProvider || - defaultSettings.videoUpscalingProvider, - videoDepthProvider: - state.videoDepthProvider || defaultSettings.videoDepthProvider, - videoSegmentationProvider: - state.videoSegmentationProvider || - defaultSettings.videoSegmentationProvider, - soundProvider: state.soundProvider || defaultSettings.soundProvider, - voiceProvider: state.voiceProvider || defaultSettings.voiceProvider, - musicProvider: state.musicProvider || defaultSettings.musicProvider, + customComfyUiApiKey: state.customComfyUiApiKey || defaultSettings.customComfyUiApiKey, replicateApiKey: @@ -1054,40 +985,21 @@ export const useSettings = create()( videoNegativePrompt: state.videoNegativePrompt || defaultSettings.videoNegativePrompt, - assistantModel: - state.assistantModel || defaultSettings.assistantModel, - assistantTurboModel: - state.assistantTurboModel || defaultSettings.assistantTurboModel, - - imageGenerationModel: - state.imageGenerationModel || defaultSettings.imageGenerationModel, - imageGenerationTurboModel: - state.imageGenerationTurboModel || - defaultSettings.imageGenerationTurboModel, - imageUpscalingModel: - state.imageUpscalingModel || defaultSettings.imageUpscalingModel, - imageDepthModel: - state.imageDepthModel || defaultSettings.imageDepthModel, - imageSegmentationModel: - state.imageSegmentationModel || - defaultSettings.imageSegmentationModel, - - videoGenerationModel: - state.videoGenerationModel || defaultSettings.videoGenerationModel, - videoDepthModel: - state.videoDepthModel || defaultSettings.videoDepthModel, - videoSegmentationModel: - state.videoSegmentationModel || - defaultSettings.videoSegmentationModel, - videoUpscalingModel: - state.videoUpscalingModel || defaultSettings.videoUpscalingModel, - - soundGenerationModel: - state.soundGenerationModel || defaultSettings.soundGenerationModel, - voiceGenerationModel: - state.voiceGenerationModel || defaultSettings.voiceGenerationModel, - musicGenerationModel: - state.musicGenerationModel || defaultSettings.musicGenerationModel, + assistantWorkflow: workflowIds[assistantWorkflowId], + assistantTurboWorkflow: workflowIds[assistantTurboWorkflowId], + imageGenerationWorkflow: workflowIds[imageGenerationWorkflowId], + imageGenerationTurboWorkflow: + workflowIds[imageGenerationTurboWorkflowId], + imageUpscalingWorkflow: workflowIds[imageUpscalingWorkflowId], + imageDepthWorkflow: workflowIds[imageDepthWorkflowId], + imageSegmentationWorkflow: workflowIds[imageSegmentationWorkflowId], + videoGenerationWorkflow: workflowIds[videoGenerationWorkflowId], + videoDepthWorkflow: workflowIds[videoDepthWorkflowId], + videoSegmentationWorkflow: workflowIds[videoSegmentationWorkflowId], + videoUpscalingWorkflow: workflowIds[videoUpscalingWorkflowId], + soundGenerationWorkflow: workflowIds[soundGenerationWorkflowId], + voiceGenerationWorkflow: workflowIds[voiceGenerationWorkflowId], + musicGenerationWorkflow: workflowIds[musicGenerationWorkflowId], imageRenderingStrategy: state.imageRenderingStrategy || @@ -1164,72 +1076,6 @@ export const useSettings = create()( scriptEditorShowMinimap: state.scriptEditorShowMinimap || defaultSettings.scriptEditorShowMinimap, - /* - should we deprecate this? or rename to "default"? - huggingFaceModelForAssistant: state.huggingFaceModelForAssistant || defaultSettings.huggingFaceModelForAssistant, - huggingFaceModelForImage: state.huggingFaceModelForImage || defaultSettings.huggingFaceModelForImage, - huggingFaceModelForImageDepth: state.huggingFaceModelForImageDepth || defaultSettings.huggingFaceModelForImageDepth, - huggingFaceModelForImageSegmentation: state.huggingFaceModelForImageSegmentation || defaultSettings.huggingFaceModelForImageSegmentation, - huggingFaceModelForImageUpscaling: state.huggingFaceModelForImageUpscaling || defaultSettings.huggingFaceModelForImageUpscaling, - huggingFaceModelForVideo: state.huggingFaceModelForVideo || defaultSettings.huggingFaceModelForVideo, - huggingFaceModelForVideoDepth: state.huggingFaceModelForVideoDepth || defaultSettings.huggingFaceModelForVideoDepth, - huggingFaceModelForVideoSegmentation: state.huggingFaceModelForVideoSegmentation || defaultSettings.huggingFaceModelForVideoSegmentation, - huggingFaceModelForVideoUpscaling: state.huggingFaceModelForVideoUpscaling || defaultSettings.huggingFaceModelForVideoUpscaling, - huggingFaceModelForVoice: state.huggingFaceModelForVoice || defaultSettings.huggingFaceModelForVoice, - huggingFaceModelForSound: state.huggingFaceModelForSound || defaultSettings.huggingFaceModelForSound, - huggingFaceModelForMusic: state.huggingFaceModelForMusic || defaultSettings.huggingFaceModelForMusic, - replicateModelForImage: state.replicateModelForImage || defaultSettings.replicateModelForImage, - replicateModelForImageDepth: state.replicateModelForImageDepth || defaultSettings.replicateModelForImageDepth, - replicateModelForImageSegmentation: state.replicateModelForImageSegmentation || defaultSettings.replicateModelForImageSegmentation, - replicateModelForImageUpscaling: state.replicateModelForImageUpscaling || defaultSettings.replicateModelForImageUpscaling, - replicateModelForVideo: state.replicateModelForVideo || defaultSettings.replicateModelForVideo, - replicateModelForVideoDepth: state.replicateModelForVideoDepth || defaultSettings.replicateModelForVideoDepth, - replicateModelForVideoSegmentation: state.replicateModelForVideoSegmentation || defaultSettings.replicateModelForVideoSegmentation, - replicateModelForVideoUpscaling: state.replicateModelForVideoUpscaling || defaultSettings.replicateModelForVideoUpscaling, - replicateModelForVoice: state.replicateModelForVoice || defaultSettings.replicateModelForVoice, - replicateModelForSound: state.replicateModelForSound || defaultSettings.replicateModelForSound, - replicateModelForMusic: state.replicateModelForMusic || defaultSettings.replicateModelForMusic, - stabilityAiModelForImage: state.stabilityAiModelForImage || defaultSettings.stabilityAiModelForImage, - stabilityAiModelForVideo: state.stabilityAiModelForVideo || defaultSettings.stabilityAiModelForVideo, - stabilityAiModelForVoice: state.stabilityAiModelForVoice || defaultSettings.stabilityAiModelForVoice, - stabilityAiModelForSound: state.stabilityAiModelForSound || defaultSettings.stabilityAiModelForSound, - stabilityAiModelForMusic: state.stabilityAiModelForMusic || defaultSettings.stabilityAiModelForMusic, - fireworksAiModelForAssistant: state.fireworksAiModelForAssistant || defaultSettings.fireworksAiModelForAssistant, - fireworksAiModelForImage: state.fireworksAiModelForImage || defaultSettings.fireworksAiModelForImage, - fireworksAiModelForVideo: state.fireworksAiModelForVideo || defaultSettings.fireworksAiModelForVideo, - fireworksAiModelForVoice: state.fireworksAiModelForVoice || defaultSettings.fireworksAiModelForVoice, - fireworksAiModelForSound: state.fireworksAiModelForSound || defaultSettings.fireworksAiModelForSound, - fireworksAiModelForMusic: state.fireworksAiModelForMusic || defaultSettings.fireworksAiModelForMusic, - falAiModelForImage: state.falAiModelForImage || defaultSettings.falAiModelForImage, - falAiModelForImageDepth: state.falAiModelForImageDepth || defaultSettings.falAiModelForImageDepth, - falAiModelForImageUpscaling: state.falAiModelForImageUpscaling || defaultSettings.falAiModelForImageUpscaling, - falAiModelForImageSegmentation: state.falAiModelForImageSegmentation || defaultSettings.falAiModelForImageSegmentation, - falAiModelForVideo: state.falAiModelForVideo || defaultSettings.falAiModelForVideo, - falAiModelForVoice: state.falAiModelForVoice || defaultSettings.falAiModelForVoice, - falAiModelForSound: state.falAiModelForSound || defaultSettings.falAiModelForSound, - falAiModelForMusic: state.falAiModelForMusic || defaultSettings.falAiModelForMusic, - modelsLabModelForImage: state.modelsLabModelForImage || defaultSettings.modelsLabModelForImage, - modelsLabModelForVideo: state.modelsLabModelForVideo || defaultSettings.modelsLabModelForVideo, - modelsLabModelForVoice: state.modelsLabModelForVoice || defaultSettings.modelsLabModelForVoice, - modelsLabModelForSound: state.modelsLabModelForSound || defaultSettings.modelsLabModelForSound, - modelsLabModelForMusic: state.modelsLabModelForMusic || defaultSettings.modelsLabModelForMusic, - openaiModelForAssistant: state.openaiModelForAssistant || defaultSettings.openaiModelForAssistant, - openaiModelForImage: state.openaiModelForImage || defaultSettings.openaiModelForImage, - openaiModelForVideo: state.openaiModelForVideo || defaultSettings.openaiModelForVideo, - openaiModelForVoice: state.openaiModelForVoice || defaultSettings.openaiModelForVoice, - groqModelForAssistant: state.groqModelForAssistant || defaultSettings.groqModelForAssistant, - googleModelForAssistant: state.googleModelForAssistant || defaultSettings.googleModelForAssistant, - googleModelForImage: state.googleModelForImage || defaultSettings.googleModelForImage, - googleModelForVideo: state.googleModelForVideo || defaultSettings.googleModelForVideo, - googleModelForVoice: state.googleModelForVoice || defaultSettings.googleModelForVoice, - googleModelForMusic: state.googleModelForMusic || defaultSettings.googleModelForMusic, - anthropicModelForAssistant: state.anthropicModelForAssistant || defaultSettings.anthropicModelForAssistant, - elevenLabsModelForVoice: state.elevenLabsModelForVoice || defaultSettings.elevenLabsModelForVoice, - elevenLabsModelForSound: state.elevenLabsModelForSound || defaultSettings.elevenLabsModelForSound, - cohereModelForAssistant: state.cohereModelForAssistant || defaultSettings.cohereModelForAssistant, - mistralAiModelForAssistant: state.mistralAiModelForAssistant || defaultSettings.mistralAiModelForAssistant, - kitsAiModelForVoice: state.kitsAiModelForVoice || defaultSettings.kitsAiModelForVoice, - */ } }, }),