This commit is contained in:
BordedDev 2025-07-08 23:05:50 +02:00
parent 4e5fd24774
commit 6f9daa7321
28 changed files with 6444 additions and 505 deletions

View File

@ -11,11 +11,11 @@
"@std/collections": "jsr:@std/collections@^1.0.10", "@std/collections": "jsr:@std/collections@^1.0.10",
"@std/dotenv": "jsr:@std/dotenv@^0.225.3", "@std/dotenv": "jsr:@std/dotenv@^0.225.3",
"@std/path": "jsr:@std/path@^1.0.8", "@std/path": "jsr:@std/path@^1.0.8",
"@types/node": "npm:@types/node@^22.13.9", "@types/node": "npm:@types/node@^22.15.29",
"jmespath": "npm:jmespath@^0.16.0", "jmespath": "npm:jmespath@^0.16.0",
"lodash-es": "npm:lodash-es@^4.17.21", "lodash-es": "npm:lodash-es@^4.17.21",
"node-llama-cpp": "npm:node-llama-cpp@^3.6.0", "node-llama-cpp": "npm:node-llama-cpp@^3.10.0",
"octokit": "npm:octokit@^4.1.0" "octokit": "npm:octokit@^5.0.3"
}, },
"fmt": { "fmt": {
"semiColons": false "semiColons": false

702
deno.lock
View File

@ -3,56 +3,53 @@
"specifiers": { "specifiers": {
"jsr:@eta-dev/eta@*": "3.5.0", "jsr:@eta-dev/eta@*": "3.5.0",
"jsr:@eta-dev/eta@^3.5.0": "3.5.0", "jsr:@eta-dev/eta@^3.5.0": "3.5.0",
"jsr:@logtape/logtape@~0.8.1": "0.8.1", "jsr:@logtape/logtape@~0.8.1": "0.8.2",
"jsr:@std/assert@1": "1.0.11", "jsr:@std/assert@1": "1.0.13",
"jsr:@std/cli@^1.0.12": "1.0.12", "jsr:@std/cli@^1.0.12": "1.0.20",
"jsr:@std/collections@^1.0.10": "1.0.10", "jsr:@std/collections@^1.0.10": "1.1.1",
"jsr:@std/dotenv@~0.225.3": "0.225.3", "jsr:@std/dotenv@~0.225.3": "0.225.5",
"jsr:@std/internal@^1.0.5": "1.0.5", "jsr:@std/internal@^1.0.6": "1.0.8",
"jsr:@std/path@*": "1.0.8", "jsr:@std/path@^1.0.8": "1.1.0",
"jsr:@std/path@^1.0.8": "1.0.8", "npm:@types/node@^22.15.29": "22.15.31",
"npm:@types/node@^22.13.9": "22.13.9",
"npm:jmespath@*": "0.16.0",
"npm:jmespath@0.16": "0.16.0", "npm:jmespath@0.16": "0.16.0",
"npm:lodash-es@*": "4.17.21", "npm:lodash-es@*": "4.17.21",
"npm:lodash-es@^4.17.21": "4.17.21", "npm:lodash-es@^4.17.21": "4.17.21",
"npm:node-llama-cpp@*": "3.6.0", "npm:node-llama-cpp@*": "3.10.0",
"npm:node-llama-cpp@^3.6.0": "3.6.0", "npm:node-llama-cpp@^3.10.0": "3.10.0",
"npm:octokit@*": "4.1.0_@octokit+core@6.1.3", "npm:octokit@^5.0.3": "5.0.3_@octokit+core@7.0.2"
"npm:octokit@^4.1.0": "4.1.0_@octokit+core@6.1.3"
}, },
"jsr": { "jsr": {
"@eta-dev/eta@3.5.0": { "@eta-dev/eta@3.5.0": {
"integrity": "6b70827efc14c7cbf08498ac7a922ecab003641caf3852a6cb5b1b12ee58fb37" "integrity": "6b70827efc14c7cbf08498ac7a922ecab003641caf3852a6cb5b1b12ee58fb37"
}, },
"@logtape/logtape@0.8.1": { "@logtape/logtape@0.8.2": {
"integrity": "deb3b276d4be0a697e94f6a79ddb309f993e1870166a6d43d8eca86cd00871a8" "integrity": "e2ae1fc2561e8d010359b9894efb39bdb559dae44f5824540cbb26a78eee36bc"
}, },
"@std/assert@1.0.11": { "@std/assert@1.0.13": {
"integrity": "2461ef3c368fe88bc60e186e7744a93112f16fd110022e113a0849e94d1c83c1", "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29",
"dependencies": [ "dependencies": [
"jsr:@std/internal" "jsr:@std/internal"
] ]
}, },
"@std/cli@1.0.12": { "@std/cli@1.0.20": {
"integrity": "e5cfb7814d189da174ecd7a34fbbd63f3513e24a1b307feb2fcd5da47a070d90" "integrity": "a8c384a2c98cec6ec6a2055c273a916e2772485eb784af0db004c5ab8ba52333"
}, },
"@std/collections@1.0.10": { "@std/collections@1.1.1": {
"integrity": "903af106a3d92970d74e20f7ebff77d9658af9bef4403f1dc42a7801c0575899" "integrity": "eff6443fbd9d5a6697018fb39c5d13d5f662f0045f21392d640693d0008ab2af"
}, },
"@std/dotenv@0.225.3": { "@std/dotenv@0.225.5": {
"integrity": "a95e5b812c27b0854c52acbae215856d9cce9d4bbf774d938c51d212711e8d4a" "integrity": "9ce6f9d0ec3311f74a32535aa1b8c62ed88b1ab91b7f0815797d77a6f60c922f"
}, },
"@std/internal@1.0.5": { "@std/internal@1.0.8": {
"integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" "integrity": "fc66e846d8d38a47cffd274d80d2ca3f0de71040f855783724bb6b87f60891f5"
}, },
"@std/path@1.0.8": { "@std/path@1.1.0": {
"integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" "integrity": "ddc94f8e3c275627281cbc23341df6b8bcc874d70374f75fec2533521e3d6886"
} }
}, },
"npm": { "npm": {
"@huggingface/jinja@0.3.3": { "@huggingface/jinja@0.5.0": {
"integrity": "sha512-vQQr2JyWvVFba3Lj9es4q9vCl1sAc74fdgnEMoX8qHrXtswap9ge9uO3ONDzQB0cQ0PUyaKY2N6HaVbTBvSXvw==" "integrity": "sha512-Ptc03/jGRiYRoi0bUYKZ14MkDslsBRT24oxmsvUlfYrvQMldrxCevhPnT+hfX8awKTT8/f/0ZBBWldoeAcMHdQ=="
}, },
"@kwsites/file-exists@1.1.1": { "@kwsites/file-exists@1.1.1": {
"integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
@ -63,89 +60,143 @@
"@kwsites/promise-deferred@1.1.1": { "@kwsites/promise-deferred@1.1.1": {
"integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="
}, },
"@node-llama-cpp/linux-arm64@3.6.0": { "@node-llama-cpp/linux-arm64@3.10.0": {
"integrity": "sha512-hE/hqxtr5DQyY1DohwOcY742NQZtEFag8H/FQP2Y7fnlNQYhiOe45PcAJDiqmEUMmlCGVvHZaCWbaNVoTMYdWg==" "integrity": "sha512-FMVMU9dlBzG3p/v99UwTAH1UIqtpbhbxTzlpopqpWmjOqXc+QP1ryukqyVwvjllJFtYOkdns0V2k8bSF/4qW/w=="
}, },
"@node-llama-cpp/linux-armv7l@3.6.0": { "@node-llama-cpp/linux-armv7l@3.10.0": {
"integrity": "sha512-aRyDVf8szfJJWHnNWG56Ir3LtfXxj9vwLXbXy4XwfHlMTuBHWhmrRXyB8f3A/aJ8h6u48wMVxqxdmwnXigSKWg==" "integrity": "sha512-VwWdkww6on/X1RAfyWhxy94u1q0yw3oSw3upJkvCed9zFx2VRC9WGws13mmLsjAZXzJ5c8CJhtirgv4/U2MF7g=="
}, },
"@node-llama-cpp/linux-x64-cuda@3.6.0": { "@node-llama-cpp/linux-x64-cuda@3.10.0": {
"integrity": "sha512-lS9F+aX2cGV1I/pAuCNeQm9bGELNmnvKqbF4k4ZjNk64ZT2sE74o2S/uN6GvMJETG+rgQiKRuKb1l/yIm0LOfA==" "integrity": "sha512-FnTXEArNUAUkNO8x+Zd3tojvkPfIC1HlShx7x60eWm+pnBr7VFk6SWzuqllcm+GqD+Uy/5y6P7ey5Q3FnFEy0g=="
}, },
"@node-llama-cpp/linux-x64-vulkan@3.6.0": { "@node-llama-cpp/linux-x64-vulkan@3.10.0": {
"integrity": "sha512-1Wc6e1YJRpjllD6MRfwYPxE7z8qvmaYrEFyVPzTe9sghKXUswpBmmb0mM/yOzwT/mUBygSwOEBvTkp3nG+pWhg==" "integrity": "sha512-t+QBM80hYX4zJpePbHQiKDdy9MgicoxPTGQyXvF63gcRvmfUTgYqajgSP/4vRA5ZoWOpdcNnuPzUmhZt/44+lQ=="
}, },
"@node-llama-cpp/linux-x64@3.6.0": { "@node-llama-cpp/linux-x64@3.10.0": {
"integrity": "sha512-lUzTTY7AwRz5j/f6rss6fPc2u3YNOmo4k8Zap38kzy9H6rL+U2nlanN+4STs5j/7gcx5f/VHRnPrYDl5OPcmTw==" "integrity": "sha512-FbhcI5vfte5usxL4VOU+VmVSaA8QQ+Y3lqWym22PtB3BbLpvDbUK5NF060RvApOBUcLdHM08de8Cu91ta87zhQ=="
}, },
"@node-llama-cpp/mac-arm64-metal@3.6.0": { "@node-llama-cpp/mac-arm64-metal@3.10.0": {
"integrity": "sha512-bOtZkJ6dCWHnZ1SP8EJ+LOdIFKo/7clb0ck+IwD/Bn/2ePzObVBsq30IxpRnUXx8pZ54+CzmTQuS2NOMHXS0PQ==" "integrity": "sha512-2ck6oM17XzR4ZVezLl5RxsYacGWDgoiHTwOwbV7ZZ2TynNuhvXioBgITZttTMyzUbXOmr43mf5r0Pa6UtMhZGQ=="
}, },
"@node-llama-cpp/mac-x64@3.6.0": { "@node-llama-cpp/mac-x64@3.10.0": {
"integrity": "sha512-xjyEAsOXQ6i3VuXoQYB5llYuNz0sP9YnrDzAJ8sqovXXYkSyXPRyTCF5/PaAFc6QMkpsFIw3fSbavJeSzR5IGw==" "integrity": "sha512-ujq2wh+bX6uqy3+SEhHyxBQSwq+lJO4cKIRVqX9FQThUylnN2PM8Ahp1oAhg741/jlo6K+FR9TaJ2Oc2+uVSJw=="
}, },
"@node-llama-cpp/win-arm64@3.6.0": { "@node-llama-cpp/win-arm64@3.10.0": {
"integrity": "sha512-o4gEUBVMZ1R3Oy1f642UA1vJtnVLAJq2W+diPUxJVqXs9KYDOf7+JuxVcTEzSj6+wBsN3ZRtt36Xst41Jwp6FQ==" "integrity": "sha512-ZONkUz39lNhqT0+EjunbKF8AIwUicx9hUUMOQeVafZ0uvYqbScg6AdLagblXonbhEwo3M5DVFfl6Ffp+0Mgf6A=="
}, },
"@node-llama-cpp/win-x64-cuda@3.6.0": { "@node-llama-cpp/win-x64-cuda@3.10.0": {
"integrity": "sha512-vxNrz4BwMNgmfbRxALdTnb7RlJnO6p5uXlZP8fxpaD0zyBllenURTTzEo3Wobpa98af5DWEY1AueH9RFixvscA==" "integrity": "sha512-tuhkdrZnIyuWda5OoYQ85zj0MhxwV04sUkNfcJiTbzkGbsyfWY+a/u7L0TMNKJD8nleYK+Meu22EYezNkP5ZRg=="
}, },
"@node-llama-cpp/win-x64-vulkan@3.6.0": { "@node-llama-cpp/win-x64-vulkan@3.10.0": {
"integrity": "sha512-2XhzVQaRw5QxMqtg+517W+tn0fgDqvo12I0/wVpaBctwIaX+yOcj+njGlVUbMBFzhR9VM9wo5N2bjfRYI6y+PA==" "integrity": "sha512-C9KVZOLWFzYzSeGmSdMGrNRbe90rnT/8FZqRl9w3fNRMmNSKaSMYBwdf6Z15MUBz/wGvw3qpVCePgtgq2wD9Yg=="
}, },
"@node-llama-cpp/win-x64@3.6.0": { "@node-llama-cpp/win-x64@3.10.0": {
"integrity": "sha512-JDJoDeBkJhvFlINwi7tyTuOjSTJoBF6yyf7o89iMZ2xniyo6BzhI2d/79PGLkXht/1+sGNoCyzbuz3cBgP06Fg==" "integrity": "sha512-aVnop9EvRN6nXD0OGtFAFITmNPA30ZezUib0N5hRgYJeJpHr0MQMVirO9OOP5FkaMyS7P3Y55bilfvNiEykqug=="
}, },
"@octokit/app@15.1.2_@octokit+core@6.1.3": { "@octokit/app@15.1.6_@octokit+core@6.1.5": {
"integrity": "sha512-6aKmKvqnJKoVK+kx0mLlBMKmQYoziPw4Rd/PWr0j65QVQlrDXlu6hGU8fmTXt7tNkf/DsubdIaTT4fkoWzCh5g==", "integrity": "sha512-WELCamoCJo9SN0lf3SWZccf68CF0sBNPQuLYmZ/n87p5qvBJDe9aBtr5dHkh7T9nxWZ608pizwsUbypSzZAiUw==",
"dependencies": [ "dependencies": [
"@octokit/auth-app", "@octokit/auth-app@7.2.1",
"@octokit/auth-unauthenticated", "@octokit/auth-unauthenticated@6.1.3",
"@octokit/core", "@octokit/core@6.1.5",
"@octokit/oauth-app", "@octokit/oauth-app@7.1.6",
"@octokit/plugin-paginate-rest", "@octokit/plugin-paginate-rest@12.0.0_@octokit+core@6.1.5",
"@octokit/types", "@octokit/types",
"@octokit/webhooks" "@octokit/webhooks@13.9.0"
] ]
}, },
"@octokit/auth-app@7.1.4": { "@octokit/app@16.0.1_@octokit+core@7.0.2": {
"integrity": "sha512-5F+3l/maq9JfWQ4bV28jT2G/K8eu9OJ317yzXPTGe4Kw+lKDhFaS4dQ3Ltmb6xImKxfCQdqDqMXODhc9YLipLw==", "integrity": "sha512-kgTeTsWmpUX+s3Fs4EK4w1K+jWCDB6ClxLSWUWTyhlw7+L3jHtuXDR4QtABu2GsmCMdk67xRhruiXotS3ay3Yw==",
"dependencies": [ "dependencies": [
"@octokit/auth-oauth-app", "@octokit/auth-app@8.0.1",
"@octokit/auth-oauth-user", "@octokit/auth-unauthenticated@7.0.1",
"@octokit/request", "@octokit/core@7.0.2",
"@octokit/request-error", "@octokit/oauth-app@8.0.1",
"@octokit/plugin-paginate-rest@13.0.1_@octokit+core@7.0.2",
"@octokit/types",
"@octokit/webhooks@14.0.2"
]
},
"@octokit/auth-app@7.2.1": {
"integrity": "sha512-4jaopCVOtWN0V8qCx/1s2pkRqC6tcvIQM3kFB99eIpsP53GfsoIKO08D94b83n/V3iGihHmxWR2lXzE0NicUGg==",
"dependencies": [
"@octokit/auth-oauth-app@8.1.4",
"@octokit/auth-oauth-user@5.1.6",
"@octokit/request-error@6.1.8",
"@octokit/request@9.2.3",
"@octokit/types", "@octokit/types",
"toad-cache", "toad-cache",
"universal-github-app-jwt", "universal-github-app-jwt",
"universal-user-agent" "universal-user-agent"
] ]
}, },
"@octokit/auth-oauth-app@8.1.2": { "@octokit/auth-app@8.0.1": {
"integrity": "sha512-3woNZgq5/S6RS+9ZTq+JdymxVr7E0s4EYxF20ugQvgX3pomdPUL5r/XdTY9wALoBM2eHVy4ettr5fKpatyTyHw==", "integrity": "sha512-P2J5pB3pjiGwtJX4WqJVYCtNkcZ+j5T2Wm14aJAEIC3WJOrv12jvBley3G1U/XI8q9o1A7QMG54LiFED2BiFlg==",
"dependencies": [ "dependencies": [
"@octokit/auth-oauth-device", "@octokit/auth-oauth-app@9.0.1",
"@octokit/auth-oauth-user", "@octokit/auth-oauth-user@6.0.0",
"@octokit/request", "@octokit/request-error@7.0.0",
"@octokit/request@10.0.2",
"@octokit/types",
"toad-cache",
"universal-github-app-jwt",
"universal-user-agent"
]
},
"@octokit/auth-oauth-app@8.1.4": {
"integrity": "sha512-71iBa5SflSXcclk/OL3lJzdt4iFs56OJdpBGEBl1wULp7C58uiswZLV6TdRaiAzHP1LT8ezpbHlKuxADb+4NkQ==",
"dependencies": [
"@octokit/auth-oauth-device@7.1.5",
"@octokit/auth-oauth-user@5.1.6",
"@octokit/request@9.2.3",
"@octokit/types", "@octokit/types",
"universal-user-agent" "universal-user-agent"
] ]
}, },
"@octokit/auth-oauth-device@7.1.2": { "@octokit/auth-oauth-app@9.0.1": {
"integrity": "sha512-gTOIzDeV36OhVfxCl69FmvJix7tJIiU6dlxuzLVAzle7fYfO8UDyddr9B+o4CFQVaMBLMGZ9ak2CWMYcGeZnPw==", "integrity": "sha512-TthWzYxuHKLAbmxdFZwFlmwVyvynpyPmjwc+2/cI3cvbT7mHtsAW9b1LvQaNnAuWL+pFnqtxdmrU8QpF633i1g==",
"dependencies": [ "dependencies": [
"@octokit/oauth-methods", "@octokit/auth-oauth-device@8.0.1",
"@octokit/request", "@octokit/auth-oauth-user@6.0.0",
"@octokit/request@10.0.2",
"@octokit/types", "@octokit/types",
"universal-user-agent" "universal-user-agent"
] ]
}, },
"@octokit/auth-oauth-user@5.1.2": { "@octokit/auth-oauth-device@7.1.5": {
"integrity": "sha512-PgVDDPJgZYb3qSEXK4moksA23tfn68zwSAsQKZ1uH6IV9IaNEYx35OXXI80STQaLYnmEE86AgU0tC1YkM4WjsA==", "integrity": "sha512-lR00+k7+N6xeECj0JuXeULQ2TSBB/zjTAmNF2+vyGPDEFx1dgk1hTDmL13MjbSmzusuAmuJD8Pu39rjp9jH6yw==",
"dependencies": [ "dependencies": [
"@octokit/auth-oauth-device", "@octokit/oauth-methods@5.1.5",
"@octokit/oauth-methods", "@octokit/request@9.2.3",
"@octokit/request", "@octokit/types",
"universal-user-agent"
]
},
"@octokit/auth-oauth-device@8.0.1": {
"integrity": "sha512-TOqId/+am5yk9zor0RGibmlqn4V0h8vzjxlw/wYr3qzkQxl8aBPur384D1EyHtqvfz0syeXji4OUvKkHvxk/Gw==",
"dependencies": [
"@octokit/oauth-methods@6.0.0",
"@octokit/request@10.0.2",
"@octokit/types",
"universal-user-agent"
]
},
"@octokit/auth-oauth-user@5.1.6": {
"integrity": "sha512-/R8vgeoulp7rJs+wfJ2LtXEVC7pjQTIqDab7wPKwVG6+2v/lUnCOub6vaHmysQBbb45FknM3tbHW8TOVqYHxCw==",
"dependencies": [
"@octokit/auth-oauth-device@7.1.5",
"@octokit/oauth-methods@5.1.5",
"@octokit/request@9.2.3",
"@octokit/types",
"universal-user-agent"
]
},
"@octokit/auth-oauth-user@6.0.0": {
"integrity": "sha512-GV9IW134PHsLhtUad21WIeP9mlJ+QNpFd6V9vuPWmaiN25HEJeEQUcS4y5oRuqCm9iWDLtfIs+9K8uczBXKr6A==",
"dependencies": [
"@octokit/auth-oauth-device@8.0.1",
"@octokit/oauth-methods@6.0.0",
"@octokit/request@10.0.2",
"@octokit/types", "@octokit/types",
"universal-user-agent" "universal-user-agent"
] ]
@ -153,49 +204,99 @@
"@octokit/auth-token@5.1.2": { "@octokit/auth-token@5.1.2": {
"integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==" "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw=="
}, },
"@octokit/auth-unauthenticated@6.1.1": { "@octokit/auth-token@6.0.0": {
"integrity": "sha512-bGXqdN6RhSFHvpPq46SL8sN+F3odQ6oMNLWc875IgoqcC3qus+fOL2th6Tkl94wvdSTy8/OeHzWy/lZebmnhog==", "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="
},
"@octokit/auth-unauthenticated@6.1.3": {
"integrity": "sha512-d5gWJla3WdSl1yjbfMpET+hUSFCE15qM0KVSB0H1shyuJihf/RL1KqWoZMIaonHvlNojkL9XtLFp8QeLe+1iwA==",
"dependencies": [ "dependencies": [
"@octokit/request-error", "@octokit/request-error@6.1.8",
"@octokit/types" "@octokit/types"
] ]
}, },
"@octokit/core@6.1.3": { "@octokit/auth-unauthenticated@7.0.1": {
"integrity": "sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==", "integrity": "sha512-qVq1vdjLLZdE8kH2vDycNNjuJRCD1q2oet1nA/GXWaYlpDxlR7rdVhX/K/oszXslXiQIiqrQf+rdhDlA99JdTQ==",
"dependencies": [ "dependencies": [
"@octokit/auth-token", "@octokit/request-error@7.0.0",
"@octokit/graphql", "@octokit/types"
"@octokit/request", ]
"@octokit/request-error", },
"@octokit/core@6.1.5": {
"integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==",
"dependencies": [
"@octokit/auth-token@5.1.2",
"@octokit/graphql@8.2.2",
"@octokit/request-error@6.1.8",
"@octokit/request@9.2.3",
"@octokit/types", "@octokit/types",
"before-after-hook", "before-after-hook@3.0.2",
"universal-user-agent" "universal-user-agent"
] ]
}, },
"@octokit/endpoint@10.1.2": { "@octokit/core@7.0.2": {
"integrity": "sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==", "integrity": "sha512-ODsoD39Lq6vR6aBgvjTnA3nZGliknKboc9Gtxr7E4WDNqY24MxANKcuDQSF0jzapvGb3KWOEDrKfve4HoWGK+g==",
"dependencies": [
"@octokit/auth-token@6.0.0",
"@octokit/graphql@9.0.1",
"@octokit/request-error@7.0.0",
"@octokit/request@10.0.2",
"@octokit/types",
"before-after-hook@4.0.0",
"universal-user-agent"
]
},
"@octokit/endpoint@10.1.4": {
"integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==",
"dependencies": [ "dependencies": [
"@octokit/types", "@octokit/types",
"universal-user-agent" "universal-user-agent"
] ]
}, },
"@octokit/graphql@8.2.0": { "@octokit/endpoint@11.0.0": {
"integrity": "sha512-gejfDywEml/45SqbWTWrhfwvLBrcGYhOn50sPOjIeVvH6i7D16/9xcFA8dAJNp2HMcd+g4vru41g4E2RBiZvfQ==", "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==",
"dependencies": [ "dependencies": [
"@octokit/request",
"@octokit/types", "@octokit/types",
"universal-user-agent" "universal-user-agent"
] ]
}, },
"@octokit/oauth-app@7.1.5": { "@octokit/graphql@8.2.2": {
"integrity": "sha512-/Y2MiwWDlGUK4blKKfjJiwjzu/FzwKTTTfTZAAQ0QbdBIDEGJPWhOFH6muSN86zaa4tNheB4YS3oWIR2e4ydzA==", "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==",
"dependencies": [ "dependencies": [
"@octokit/auth-oauth-app", "@octokit/request@9.2.3",
"@octokit/auth-oauth-user", "@octokit/types",
"@octokit/auth-unauthenticated", "universal-user-agent"
"@octokit/core", ]
"@octokit/oauth-authorization-url", },
"@octokit/oauth-methods", "@octokit/graphql@9.0.1": {
"integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==",
"dependencies": [
"@octokit/request@10.0.2",
"@octokit/types",
"universal-user-agent"
]
},
"@octokit/oauth-app@7.1.6": {
"integrity": "sha512-OMcMzY2WFARg80oJNFwWbY51TBUfLH4JGTy119cqiDawSFXSIBujxmpXiKbGWQlvfn0CxE6f7/+c6+Kr5hI2YA==",
"dependencies": [
"@octokit/auth-oauth-app@8.1.4",
"@octokit/auth-oauth-user@5.1.6",
"@octokit/auth-unauthenticated@6.1.3",
"@octokit/core@6.1.5",
"@octokit/oauth-authorization-url@7.1.1",
"@octokit/oauth-methods@5.1.5",
"@types/aws-lambda",
"universal-user-agent"
]
},
"@octokit/oauth-app@8.0.1": {
"integrity": "sha512-QnhMYEQpnYbEPn9cae+wXL2LuPMFglmfeuDJXXsyxIXdoORwkLK8y0cHhd/5du9MbO/zdG/BXixzB7EEwU63eQ==",
"dependencies": [
"@octokit/auth-oauth-app@9.0.1",
"@octokit/auth-oauth-user@6.0.0",
"@octokit/auth-unauthenticated@7.0.1",
"@octokit/core@7.0.2",
"@octokit/oauth-authorization-url@8.0.0",
"@octokit/oauth-methods@6.0.0",
"@types/aws-lambda", "@types/aws-lambda",
"universal-user-agent" "universal-user-agent"
] ]
@ -203,89 +304,168 @@
"@octokit/oauth-authorization-url@7.1.1": { "@octokit/oauth-authorization-url@7.1.1": {
"integrity": "sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==" "integrity": "sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA=="
}, },
"@octokit/oauth-methods@5.1.3": { "@octokit/oauth-authorization-url@8.0.0": {
"integrity": "sha512-M+bDBi5H8FnH0xhCTg0m9hvcnppdDnxUqbZyOkxlLblKpLAR+eT2nbDPvJDp0eLrvJWA1I8OX0KHf/sBMQARRA==", "integrity": "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ=="
},
"@octokit/oauth-methods@5.1.5": {
"integrity": "sha512-Ev7K8bkYrYLhoOSZGVAGsLEscZQyq7XQONCBBAl2JdMg7IT3PQn/y8P0KjloPoYpI5UylqYrLeUcScaYWXwDvw==",
"dependencies": [ "dependencies": [
"@octokit/oauth-authorization-url", "@octokit/oauth-authorization-url@7.1.1",
"@octokit/request", "@octokit/request-error@6.1.8",
"@octokit/request-error", "@octokit/request@9.2.3",
"@octokit/types" "@octokit/types"
] ]
}, },
"@octokit/openapi-types@23.0.1": { "@octokit/oauth-methods@6.0.0": {
"integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==" "integrity": "sha512-Q8nFIagNLIZgM2odAraelMcDssapc+lF+y3OlcIPxyAU+knefO8KmozGqfnma1xegRDP4z5M73ABsamn72bOcA==",
"dependencies": [
"@octokit/oauth-authorization-url@8.0.0",
"@octokit/request-error@7.0.0",
"@octokit/request@10.0.2",
"@octokit/types"
]
}, },
"@octokit/openapi-webhooks-types@8.5.1": { "@octokit/openapi-types@25.1.0": {
"integrity": "sha512-i3h1b5zpGSB39ffBbYdSGuAd0NhBAwPyA3QV3LYi/lx4lsbZiu7u2UHgXVUR6EpvOI8REOuVh1DZTRfHoJDvuQ==" "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA=="
}, },
"@octokit/plugin-paginate-graphql@5.2.4_@octokit+core@6.1.3": { "@octokit/openapi-webhooks-types@11.0.0": {
"integrity": "sha512-ZBzCFj98v3SuRM7oBas6BHZMJRadlnDoeFfvm1olVxZnYeU6Vh97FhPxyS5aLh5pN51GYv2I51l/hVUAVkGBlA=="
},
"@octokit/openapi-webhooks-types@12.0.3": {
"integrity": "sha512-90MF5LVHjBedwoHyJsgmaFhEN1uzXyBDRLEBe7jlTYx/fEhPAk3P3DAJsfZwC54m8hAIryosJOL+UuZHB3K3yA=="
},
"@octokit/plugin-paginate-graphql@5.2.4_@octokit+core@6.1.5": {
"integrity": "sha512-pLZES1jWaOynXKHOqdnwZ5ULeVR6tVVCMm+AUbp0htdcyXDU95WbkYdU4R2ej1wKj5Tu94Mee2Ne0PjPO9cCyA==", "integrity": "sha512-pLZES1jWaOynXKHOqdnwZ5ULeVR6tVVCMm+AUbp0htdcyXDU95WbkYdU4R2ej1wKj5Tu94Mee2Ne0PjPO9cCyA==",
"dependencies": [ "dependencies": [
"@octokit/core" "@octokit/core@6.1.5"
] ]
}, },
"@octokit/plugin-paginate-rest@11.4.0_@octokit+core@6.1.3": { "@octokit/plugin-paginate-graphql@6.0.0_@octokit+core@7.0.2": {
"integrity": "sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g==", "integrity": "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==",
"dependencies": [ "dependencies": [
"@octokit/core", "@octokit/core@7.0.2"
]
},
"@octokit/plugin-paginate-rest@12.0.0_@octokit+core@6.1.5": {
"integrity": "sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==",
"dependencies": [
"@octokit/core@6.1.5",
"@octokit/types" "@octokit/types"
] ]
}, },
"@octokit/plugin-rest-endpoint-methods@13.3.0_@octokit+core@6.1.3": { "@octokit/plugin-paginate-rest@13.0.1_@octokit+core@7.0.2": {
"integrity": "sha512-LUm44shlmkp/6VC+qQgHl3W5vzUP99ZM54zH6BuqkJK4DqfFLhegANd+fM4YRLapTvPm4049iG7F3haANKMYvQ==", "integrity": "sha512-m1KvHlueScy4mQJWvFDCxFBTIdXS0K1SgFGLmqHyX90mZdCIv6gWBbKRhatxRjhGlONuTK/hztYdaqrTXcFZdQ==",
"dependencies": [ "dependencies": [
"@octokit/core", "@octokit/core@7.0.2",
"@octokit/types" "@octokit/types"
] ]
}, },
"@octokit/plugin-retry@7.1.3_@octokit+core@6.1.3": { "@octokit/plugin-rest-endpoint-methods@14.0.0_@octokit+core@6.1.5": {
"integrity": "sha512-8nKOXvYWnzv89gSyIvgFHmCBAxfQAOPRlkacUHL9r5oWtp5Whxl8Skb2n3ACZd+X6cYijD6uvmrQuPH/UCL5zQ==", "integrity": "sha512-iQt6ovem4b7zZYZQtdv+PwgbL5VPq37th1m2x2TdkgimIDJpsi2A6Q/OI/23i/hR6z5mL0EgisNR4dcbmckSZQ==",
"dependencies": [ "dependencies": [
"@octokit/core", "@octokit/core@6.1.5",
"@octokit/request-error", "@octokit/types"
]
},
"@octokit/plugin-rest-endpoint-methods@16.0.0_@octokit+core@7.0.2": {
"integrity": "sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==",
"dependencies": [
"@octokit/core@7.0.2",
"@octokit/types"
]
},
"@octokit/plugin-retry@7.2.1_@octokit+core@6.1.5": {
"integrity": "sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==",
"dependencies": [
"@octokit/core@6.1.5",
"@octokit/request-error@6.1.8",
"@octokit/types", "@octokit/types",
"bottleneck" "bottleneck"
] ]
}, },
"@octokit/plugin-throttling@9.4.0_@octokit+core@6.1.3": { "@octokit/plugin-retry@8.0.1_@octokit+core@7.0.2": {
"integrity": "sha512-IOlXxXhZA4Z3m0EEYtrrACkuHiArHLZ3CvqWwOez/pURNqRuwfoFlTPbN5Muf28pzFuztxPyiUiNwz8KctdZaQ==", "integrity": "sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw==",
"dependencies": [ "dependencies": [
"@octokit/core", "@octokit/core@7.0.2",
"@octokit/request-error@7.0.0",
"@octokit/types", "@octokit/types",
"bottleneck" "bottleneck"
] ]
}, },
"@octokit/request-error@6.1.6": { "@octokit/plugin-throttling@10.0.0_@octokit+core@6.1.5": {
"integrity": "sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==", "integrity": "sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==",
"dependencies": [
"@octokit/core@6.1.5",
"@octokit/types",
"bottleneck"
]
},
"@octokit/plugin-throttling@11.0.1_@octokit+core@7.0.2": {
"integrity": "sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw==",
"dependencies": [
"@octokit/core@7.0.2",
"@octokit/types",
"bottleneck"
]
},
"@octokit/request-error@6.1.8": {
"integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==",
"dependencies": [ "dependencies": [
"@octokit/types" "@octokit/types"
] ]
}, },
"@octokit/request@9.2.0": { "@octokit/request-error@7.0.0": {
"integrity": "sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw==", "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==",
"dependencies": [ "dependencies": [
"@octokit/endpoint", "@octokit/types"
"@octokit/request-error", ]
},
"@octokit/request@10.0.2": {
"integrity": "sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==",
"dependencies": [
"@octokit/endpoint@11.0.0",
"@octokit/request-error@7.0.0",
"@octokit/types", "@octokit/types",
"fast-content-type-parse", "fast-content-type-parse@3.0.0",
"universal-user-agent" "universal-user-agent"
] ]
}, },
"@octokit/types@13.8.0": { "@octokit/request@9.2.3": {
"integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==", "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==",
"dependencies": [
"@octokit/endpoint@10.1.4",
"@octokit/request-error@6.1.8",
"@octokit/types",
"fast-content-type-parse@2.0.1",
"universal-user-agent"
]
},
"@octokit/types@14.1.0": {
"integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==",
"dependencies": [ "dependencies": [
"@octokit/openapi-types" "@octokit/openapi-types"
] ]
}, },
"@octokit/webhooks-methods@5.1.0": { "@octokit/webhooks-methods@5.1.1": {
"integrity": "sha512-yFZa3UH11VIxYnnoOYCVoJ3q4ChuSOk2IVBBQ0O3xtKX4x9bmKb/1t+Mxixv2iUhzMdOl1qeWJqEhouXXzB3rQ==" "integrity": "sha512-NGlEHZDseJTCj8TMMFehzwa9g7On4KJMPVHDSrHxCQumL6uSQR8wIkP/qesv52fXqV1BPf4pTxwtS31ldAt9Xg=="
}, },
"@octokit/webhooks@13.5.0": { "@octokit/webhooks-methods@6.0.0": {
"integrity": "sha512-uSO/TCCfi9vaZHOBsGWsRNBXYYKtLnSDbHI+std0M80AaEd7AnVfLqvk+9V3GP1faPcOx06ADx+h8UWwvemIGw==", "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ=="
},
"@octokit/webhooks@13.9.0": {
"integrity": "sha512-5Kva+/Gi7c+39d0/0MM/v/5RCZuwqm75fUD+t7Es3Iz/adui54GnjfNmJpkkPkXGC+5IWnEvgqwY6gstK/JlUQ==",
"dependencies": [ "dependencies": [
"@octokit/openapi-webhooks-types", "@octokit/openapi-webhooks-types@11.0.0",
"@octokit/request-error", "@octokit/request-error@6.1.8",
"@octokit/webhooks-methods" "@octokit/webhooks-methods@5.1.1"
]
},
"@octokit/webhooks@14.0.2": {
"integrity": "sha512-16TtZXNOfH8RaRsV+iag5dTYeJvdOdZDBcpEPCULdKS3eTRJqAYxBNZPFaDJ3cx3WNyvbaQ0IxsPpnaR/tgGFA==",
"dependencies": [
"@octokit/openapi-webhooks-types@12.0.3",
"@octokit/request-error@7.0.0",
"@octokit/webhooks-methods@6.0.0"
] ]
}, },
"@reflink/reflink-darwin-arm64@0.1.19": { "@reflink/reflink-darwin-arm64@0.1.19": {
@ -328,11 +508,11 @@
"@tinyhttp/content-disposition@2.2.2": { "@tinyhttp/content-disposition@2.2.2": {
"integrity": "sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==" "integrity": "sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g=="
}, },
"@types/aws-lambda@8.10.147": { "@types/aws-lambda@8.10.149": {
"integrity": "sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew==" "integrity": "sha512-NXSZIhfJjnXqJgtS7IwutqIF/SOy1Wz5Px4gUY1RWITp3AYTyuJS4xaXr/bIJY1v15XMzrJ5soGnPM+7uigZjA=="
}, },
"@types/node@22.13.9": { "@types/node@22.15.31": {
"integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", "integrity": "sha512-jnVe5ULKl6tijxUhvQeNbQG/84fHfg+yMak02cT8QVhBx/F05rAVxCGBYYTh2EKz22D6JF5ktXuNwdx7b9iEGw==",
"dependencies": [ "dependencies": [
"undici-types" "undici-types"
] ]
@ -374,8 +554,8 @@
"asynckit@0.4.0": { "asynckit@0.4.0": {
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
}, },
"axios@1.8.1": { "axios@1.9.0": {
"integrity": "sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==", "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
"dependencies": [ "dependencies": [
"follow-redirects", "follow-redirects",
"form-data", "form-data",
@ -385,6 +565,9 @@
"before-after-hook@3.0.2": { "before-after-hook@3.0.2": {
"integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="
}, },
"before-after-hook@4.0.0": {
"integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="
},
"bottleneck@2.19.5": { "bottleneck@2.19.5": {
"integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
}, },
@ -407,8 +590,8 @@
"chownr@2.0.0": { "chownr@2.0.0": {
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
}, },
"ci-info@4.1.0": { "ci-info@4.2.0": {
"integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==" "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg=="
}, },
"cli-cursor@5.0.0": { "cli-cursor@5.0.0": {
"integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
@ -427,13 +610,12 @@
"wrap-ansi" "wrap-ansi"
] ]
}, },
"cmake-js@7.3.0": { "cmake-js@7.3.1": {
"integrity": "sha512-dXs2zq9WxrV87bpJ+WbnGKv8WUBXDw8blNiwNHoRe/it+ptscxhQHKB1SJXa1w+kocLMeP28Tk4/eTCezg4o+w==", "integrity": "sha512-aJtHDrTFl8qovjSSqXT9aC2jdGfmP8JQsPtjdLAXFfH1BF4/ImZ27Jx0R61TFg8Apc3pl6e2yBKMveAeRXx2Rw==",
"dependencies": [ "dependencies": [
"axios", "axios",
"debug", "debug",
"fs-extra", "fs-extra",
"lodash.isplainobject",
"memory-stream", "memory-stream",
"node-api-headers", "node-api-headers",
"npmlog", "npmlog",
@ -483,8 +665,8 @@
"which@2.0.2" "which@2.0.2"
] ]
}, },
"debug@4.4.0": { "debug@4.4.1": {
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dependencies": [ "dependencies": [
"ms" "ms"
] ]
@ -545,6 +727,9 @@
"fast-content-type-parse@2.0.1": { "fast-content-type-parse@2.0.1": {
"integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==" "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q=="
}, },
"fast-content-type-parse@3.0.0": {
"integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="
},
"filename-reserved-regex@3.0.0": { "filename-reserved-regex@3.0.0": {
"integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==" "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw=="
}, },
@ -557,12 +742,13 @@
"follow-redirects@1.15.9": { "follow-redirects@1.15.9": {
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
}, },
"form-data@4.0.2": { "form-data@4.0.3": {
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
"dependencies": [ "dependencies": [
"asynckit", "asynckit",
"combined-stream", "combined-stream",
"es-set-tostringtag", "es-set-tostringtag",
"hasown",
"mime-types" "mime-types"
] ]
}, },
@ -648,8 +834,8 @@
"function-bind" "function-bind"
] ]
}, },
"ignore@7.0.3": { "ignore@7.0.5": {
"integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==" "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="
}, },
"inherits@2.0.4": { "inherits@2.0.4": {
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
@ -719,8 +905,8 @@
"lifecycle-utils@1.7.3": { "lifecycle-utils@1.7.3": {
"integrity": "sha512-T7zs7J6/sgsqwVyG34Sfo5LTQmlPmmqaUe3yBhdF8nq24RtR/HtbkNZRhNbr9BEaKySdSgH+P9H5U9X+p0WjXw==" "integrity": "sha512-T7zs7J6/sgsqwVyG34Sfo5LTQmlPmmqaUe3yBhdF8nq24RtR/HtbkNZRhNbr9BEaKySdSgH+P9H5U9X+p0WjXw=="
}, },
"lifecycle-utils@2.0.0": { "lifecycle-utils@2.0.1": {
"integrity": "sha512-KIkV6NeD2n0jZnO+fdIGKI5Or7alyhb6UTFzeaqf6EnE5y3pdK821+kd7yOMBUL/sPYhHU5ny74J0QKslLikGw==" "integrity": "sha512-jVso5WXIHfDL7Lf9sCRbLbPwgpoha5qUPgi+RMNVIMuOcb0nJ9Qr0r1OXbqLaxzBUQBhN8jYy92RLSk2OGJ6Cg=="
}, },
"lodash-es@4.17.21": { "lodash-es@4.17.21": {
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
@ -728,9 +914,6 @@
"lodash.debounce@4.0.8": { "lodash.debounce@4.0.8": {
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
}, },
"lodash.isplainobject@4.0.6": {
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
},
"log-symbols@6.0.0": { "log-symbols@6.0.0": {
"integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
"dependencies": [ "dependencies": [
@ -738,8 +921,8 @@
"is-unicode-supported@1.3.0" "is-unicode-supported@1.3.0"
] ]
}, },
"log-symbols@7.0.0": { "log-symbols@7.0.1": {
"integrity": "sha512-zrc91EDk2M+2AXo/9BTvK91pqb7qrPg2nX/Hy+u8a5qQlbaOflCKO+6SqgZ+M+xUFxGdKTgwnGiL96b1W3ikRA==", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==",
"dependencies": [ "dependencies": [
"is-unicode-supported@2.1.0", "is-unicode-supported@2.1.0",
"yoctocolors" "yoctocolors"
@ -797,17 +980,17 @@
"ms@2.1.3": { "ms@2.1.3": {
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}, },
"nanoid@5.1.2": { "nanoid@5.1.5": {
"integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==" "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw=="
}, },
"node-addon-api@8.3.1": { "node-addon-api@8.4.0": {
"integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==" "integrity": "sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg=="
}, },
"node-api-headers@1.5.0": { "node-api-headers@1.5.0": {
"integrity": "sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ==" "integrity": "sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ=="
}, },
"node-llama-cpp@3.6.0": { "node-llama-cpp@3.10.0": {
"integrity": "sha512-SzjsZLuG2pQPPkgMniTgK4sCcslA6ion5L55L8qeGnIb0cAhzVDbJ0Lxl5NhuTMm8KkxVZXF2yTihyulPMSLhw==", "integrity": "sha512-/l8p+cYzBaw7YNl/xxFR2Q1sqL07LDia5+7ZQ704THbbB2BAHyUGWHg1U3N7PZCw7FlQn50XDHBx2qbDVtbKnQ==",
"dependencies": [ "dependencies": [
"@huggingface/jinja", "@huggingface/jinja",
"@node-llama-cpp/linux-arm64", "@node-llama-cpp/linux-arm64",
@ -834,11 +1017,11 @@
"ignore", "ignore",
"ipull", "ipull",
"is-unicode-supported@2.1.0", "is-unicode-supported@2.1.0",
"lifecycle-utils@2.0.0", "lifecycle-utils@2.0.1",
"log-symbols@7.0.0", "log-symbols@7.0.1",
"nanoid", "nanoid",
"node-addon-api", "node-addon-api",
"octokit", "octokit@4.1.4_@octokit+core@6.1.5",
"ora", "ora",
"pretty-ms@9.2.0", "pretty-ms@9.2.0",
"proper-lockfile", "proper-lockfile",
@ -861,19 +1044,36 @@
"set-blocking" "set-blocking"
] ]
}, },
"octokit@4.1.0_@octokit+core@6.1.3": { "octokit@4.1.4_@octokit+core@6.1.5": {
"integrity": "sha512-/UrQAOSvkc+lUUWKNzy4ByAgYU9KpFzZQt8DnC962YmQuDiZb1SNJ90YukCCK5aMzKqqCA+z1kkAlmzYvdYKag==", "integrity": "sha512-cRvxRte6FU3vAHRC9+PMSY3D+mRAs2Rd9emMoqp70UGRvJRM3sbAoim2IXRZNNsf8wVfn4sGxVBHRAP+JBVX/g==",
"dependencies": [ "dependencies": [
"@octokit/app", "@octokit/app@15.1.6_@octokit+core@6.1.5",
"@octokit/core", "@octokit/core@6.1.5",
"@octokit/oauth-app", "@octokit/oauth-app@7.1.6",
"@octokit/plugin-paginate-graphql", "@octokit/plugin-paginate-graphql@5.2.4_@octokit+core@6.1.5",
"@octokit/plugin-paginate-rest", "@octokit/plugin-paginate-rest@12.0.0_@octokit+core@6.1.5",
"@octokit/plugin-rest-endpoint-methods", "@octokit/plugin-rest-endpoint-methods@14.0.0_@octokit+core@6.1.5",
"@octokit/plugin-retry", "@octokit/plugin-retry@7.2.1_@octokit+core@6.1.5",
"@octokit/plugin-throttling", "@octokit/plugin-throttling@10.0.0_@octokit+core@6.1.5",
"@octokit/request-error", "@octokit/request-error@6.1.8",
"@octokit/types" "@octokit/types",
"@octokit/webhooks@13.9.0"
]
},
"octokit@5.0.3_@octokit+core@7.0.2": {
"integrity": "sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ==",
"dependencies": [
"@octokit/app@16.0.1_@octokit+core@7.0.2",
"@octokit/core@7.0.2",
"@octokit/oauth-app@8.0.1",
"@octokit/plugin-paginate-graphql@6.0.0_@octokit+core@7.0.2",
"@octokit/plugin-paginate-rest@13.0.1_@octokit+core@7.0.2",
"@octokit/plugin-rest-endpoint-methods@16.0.0_@octokit+core@7.0.2",
"@octokit/plugin-retry@8.0.1_@octokit+core@7.0.2",
"@octokit/plugin-throttling@11.0.1_@octokit+core@7.0.2",
"@octokit/request-error@7.0.0",
"@octokit/types",
"@octokit/webhooks@14.0.2"
] ]
}, },
"onetime@7.0.0": { "onetime@7.0.0": {
@ -967,8 +1167,8 @@
"safe-buffer@5.2.1": { "safe-buffer@5.2.1": {
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
}, },
"semver@7.7.1": { "semver@7.7.2": {
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==" "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="
}, },
"set-blocking@2.0.0": { "set-blocking@2.0.0": {
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
@ -988,8 +1188,8 @@
"signal-exit@4.1.0": { "signal-exit@4.1.0": {
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
}, },
"simple-git@3.27.0": { "simple-git@3.28.0": {
"integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==",
"dependencies": [ "dependencies": [
"@kwsites/file-exists", "@kwsites/file-exists",
"@kwsites/promise-deferred", "@kwsites/promise-deferred",
@ -1072,14 +1272,14 @@
"toad-cache@3.7.0": { "toad-cache@3.7.0": {
"integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==" "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw=="
}, },
"undici-types@6.20.0": { "undici-types@6.21.0": {
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="
}, },
"universal-github-app-jwt@2.2.0": { "universal-github-app-jwt@2.2.2": {
"integrity": "sha512-G5o6f95b5BggDGuUfKDApKaCgNYy2x7OdHY0zSMF081O0EJobw+1130VONhrA7ezGSV2FNOGyM+KQpQZAr9bIQ==" "integrity": "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw=="
}, },
"universal-user-agent@7.0.2": { "universal-user-agent@7.0.3": {
"integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="
}, },
"universalify@2.0.1": { "universalify@2.0.1": {
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="
@ -1090,8 +1290,8 @@
"util-deprecate@1.0.2": { "util-deprecate@1.0.2": {
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
}, },
"validate-npm-package-name@6.0.0": { "validate-npm-package-name@6.0.1": {
"integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==" "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg=="
}, },
"which@2.0.2": { "which@2.0.2": {
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
@ -1144,102 +1344,6 @@
"integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==" "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="
} }
}, },
"redirects": {
"https://esm.sh/@octokit/app@^15.1.2?target=denonext": "https://esm.sh/@octokit/app@15.1.2?target=denonext",
"https://esm.sh/@octokit/auth-app@^7.1.4?target=denonext": "https://esm.sh/@octokit/auth-app@7.1.4?target=denonext",
"https://esm.sh/@octokit/auth-oauth-app@^8.1.2?target=denonext": "https://esm.sh/@octokit/auth-oauth-app@8.1.2?target=denonext",
"https://esm.sh/@octokit/auth-oauth-device@^7.1.2?target=denonext": "https://esm.sh/@octokit/auth-oauth-device@7.1.2?target=denonext",
"https://esm.sh/@octokit/auth-oauth-user@^5.1.2?target=denonext": "https://esm.sh/@octokit/auth-oauth-user@5.1.2?target=denonext",
"https://esm.sh/@octokit/auth-token@^5.0.0?target=denonext": "https://esm.sh/@octokit/auth-token@5.1.2?target=denonext",
"https://esm.sh/@octokit/auth-unauthenticated@^6.1.1?target=denonext": "https://esm.sh/@octokit/auth-unauthenticated@6.1.1?target=denonext",
"https://esm.sh/@octokit/core@^6.1.3?target=denonext": "https://esm.sh/@octokit/core@6.1.3?target=denonext",
"https://esm.sh/@octokit/endpoint@^10.0.0?target=denonext": "https://esm.sh/@octokit/endpoint@10.1.2?target=denonext",
"https://esm.sh/@octokit/graphql@^8.1.2?target=denonext": "https://esm.sh/@octokit/graphql@8.2.0?target=denonext",
"https://esm.sh/@octokit/oauth-app@^7.1.4?target=denonext": "https://esm.sh/@octokit/oauth-app@7.1.5?target=denonext",
"https://esm.sh/@octokit/oauth-app@^7.1.5?target=denonext": "https://esm.sh/@octokit/oauth-app@7.1.5?target=denonext",
"https://esm.sh/@octokit/oauth-authorization-url@^7.0.0?target=denonext": "https://esm.sh/@octokit/oauth-authorization-url@7.1.1?target=denonext",
"https://esm.sh/@octokit/oauth-methods@^5.1.2?target=denonext": "https://esm.sh/@octokit/oauth-methods@5.1.3?target=denonext",
"https://esm.sh/@octokit/oauth-methods@^5.1.3?target=denonext": "https://esm.sh/@octokit/oauth-methods@5.1.3?target=denonext",
"https://esm.sh/@octokit/plugin-paginate-graphql@^5.2.4?target=denonext": "https://esm.sh/@octokit/plugin-paginate-graphql@5.2.4?target=denonext",
"https://esm.sh/@octokit/plugin-paginate-rest@^11.3.6?target=denonext": "https://esm.sh/@octokit/plugin-paginate-rest@11.4.0?target=denonext",
"https://esm.sh/@octokit/plugin-paginate-rest@^11.4.0?target=denonext": "https://esm.sh/@octokit/plugin-paginate-rest@11.4.0?target=denonext",
"https://esm.sh/@octokit/plugin-rest-endpoint-methods@^13.3.0?target=denonext": "https://esm.sh/@octokit/plugin-rest-endpoint-methods@13.3.0?target=denonext",
"https://esm.sh/@octokit/plugin-retry@^7.1.3?target=denonext": "https://esm.sh/@octokit/plugin-retry@7.1.3?target=denonext",
"https://esm.sh/@octokit/plugin-throttling@^9.4.0?target=denonext": "https://esm.sh/@octokit/plugin-throttling@9.4.0?target=denonext",
"https://esm.sh/@octokit/request-error@^6.0.1?target=denonext": "https://esm.sh/@octokit/request-error@6.1.6?target=denonext",
"https://esm.sh/@octokit/request-error@^6.1.6?target=denonext": "https://esm.sh/@octokit/request-error@6.1.6?target=denonext",
"https://esm.sh/@octokit/request@^9.1.4?target=denonext": "https://esm.sh/@octokit/request@9.2.0?target=denonext",
"https://esm.sh/@octokit/webhooks-methods@^5.0.0?target=denonext": "https://esm.sh/@octokit/webhooks-methods@5.1.0?target=denonext",
"https://esm.sh/@octokit/webhooks@^13.4.2?target=denonext": "https://esm.sh/@octokit/webhooks@13.5.0?target=denonext",
"https://esm.sh/before-after-hook@^3.0.2?target=denonext": "https://esm.sh/before-after-hook@3.0.2?target=denonext",
"https://esm.sh/bottleneck@^2.15.3/light?target=denonext": "https://esm.sh/bottleneck@2.19.5/light?target=denonext",
"https://esm.sh/fast-content-type-parse@^2.0.0?target=denonext": "https://esm.sh/fast-content-type-parse@2.0.1?target=denonext",
"https://esm.sh/octokit?dts": "https://esm.sh/octokit@4.1.0?dts",
"https://esm.sh/toad-cache@^3.7.0?target=denonext": "https://esm.sh/toad-cache@3.7.0?target=denonext",
"https://esm.sh/universal-github-app-jwt@^2.2.0?target=denonext": "https://esm.sh/universal-github-app-jwt@2.2.0?target=denonext",
"https://esm.sh/universal-user-agent@^7.0.0?target=denonext": "https://esm.sh/universal-user-agent@7.0.2?target=denonext",
"https://esm.sh/universal-user-agent@^7.0.2?target=denonext": "https://esm.sh/universal-user-agent@7.0.2?target=denonext"
},
"remote": {
"https://esm.sh/@octokit/app@15.1.2/denonext/app.mjs": "21c4fdfecfc4540b17c21b3c0cf1e0a5c7eb55bab034978af33d7dd7a06ab4ab",
"https://esm.sh/@octokit/app@15.1.2?target=denonext": "51ad31b108532bc255a43647574518580d5e95d5ad7a968df7bb477b71b59e79",
"https://esm.sh/@octokit/auth-app@7.1.4/denonext/auth-app.mjs": "c2c8bc96d4760e5a0af7535c1aa669ebc8b490764b575d8113632515f11760c6",
"https://esm.sh/@octokit/auth-app@7.1.4?target=denonext": "a4632ee3c6af2cfde6e6249c13d5d7706575649ac570389f6117bd37eab0b523",
"https://esm.sh/@octokit/auth-oauth-app@8.1.2/denonext/auth-oauth-app.mjs": "1803a9d024ec1d9b53c9fdc5d386d05990ee6b6715d2ad79619f8452fd9d5d13",
"https://esm.sh/@octokit/auth-oauth-app@8.1.2?target=denonext": "8c48ca11c1b9e2d08c56555fa61b13cb5050366b3e0412ceb19a1e314f355015",
"https://esm.sh/@octokit/auth-oauth-device@7.1.2/denonext/auth-oauth-device.mjs": "24ac890f2a933a5532ea37f9e94b1185c24dfd163339300fce36a132f2ccd6d3",
"https://esm.sh/@octokit/auth-oauth-device@7.1.2?target=denonext": "f2d03bf3a4208a0cabd8e4b85c98d633f857678e811bf6de4429d1d9439da0eb",
"https://esm.sh/@octokit/auth-oauth-user@5.1.2/denonext/auth-oauth-user.mjs": "4f1ce58465e50c7f79d58794976da1853f9785bf5434b19d81a50c400a9ed858",
"https://esm.sh/@octokit/auth-oauth-user@5.1.2?target=denonext": "54d806f7a2b19086b880d27cbbf863985c9f9f26914c031a99ad849a85cdbcbe",
"https://esm.sh/@octokit/auth-token@5.1.2/denonext/auth-token.mjs": "360feb2cb940bfa2e20ba6e5b7c366b207e7b8cb3a2ff983f3d33b19087cdc50",
"https://esm.sh/@octokit/auth-token@5.1.2?target=denonext": "0e5dc846d0c00da36580f08e0d4115526daf6256acf07fabedc06716dfbf72c9",
"https://esm.sh/@octokit/auth-unauthenticated@6.1.1/denonext/auth-unauthenticated.mjs": "1cd86628013b6444922993cd740ed0a327dd220ac465595ccad05de8fb2f80f8",
"https://esm.sh/@octokit/auth-unauthenticated@6.1.1?target=denonext": "a00a18f165e48e1d98e6d5e4266aee4a0bde051b7342c54ebd838d2547538ae4",
"https://esm.sh/@octokit/core@6.1.3/denonext/core.mjs": "27711bac5522d962bca6513035a3ab2e55c001f49e050175bb67bbedd4049535",
"https://esm.sh/@octokit/core@6.1.3?target=denonext": "48e4022a4e8ae6df3eec7b9028bfc452b113f1746c81737861b06d44c6791f03",
"https://esm.sh/@octokit/endpoint@10.1.2/denonext/endpoint.mjs": "10aa9cb55330d89ef4392f710c7f1132b30d3018d1a548af90d50837ad8d8640",
"https://esm.sh/@octokit/endpoint@10.1.2?target=denonext": "e44433015f71eb9ebf694f7e66880a96505b503e0d6f172c63267259cf7810e7",
"https://esm.sh/@octokit/graphql@8.2.0/denonext/graphql.mjs": "a26719a9e0adfc72773caaca5857a67ddf54b7824efd0f4585c4a14bba66a566",
"https://esm.sh/@octokit/graphql@8.2.0?target=denonext": "f1f248a1461a1c8a230e0d45dd6979a21205c29941ee790ef9d779da05259305",
"https://esm.sh/@octokit/oauth-app@7.1.5/denonext/oauth-app.mjs": "946907b1ce34610a973305985d4861e2377b83cb463dcd1724ffb917af8188c9",
"https://esm.sh/@octokit/oauth-app@7.1.5?target=denonext": "373b5044d98bccffa8aa0dc180c9f013a5e6ae95eba0b4481feb7204458d4c1b",
"https://esm.sh/@octokit/oauth-authorization-url@7.1.1/denonext/oauth-authorization-url.mjs": "209de15074485c12e6bffaed0f33d857c789df4a577b19ddbd78caa9646b77dc",
"https://esm.sh/@octokit/oauth-authorization-url@7.1.1?target=denonext": "fdaed10ede57c5e5a3ae67b487331336916d5401d366bed1425515e104b95de1",
"https://esm.sh/@octokit/oauth-methods@5.1.3/denonext/oauth-methods.mjs": "9043d6ed33f54207cab9966eb6f984f87e62c5c4ed3e019aa3b28d02ea738eac",
"https://esm.sh/@octokit/oauth-methods@5.1.3?target=denonext": "d185bf52b6cd01f4d13fcf25ca7bce03e8534b06835c0ad6783366c6676311a6",
"https://esm.sh/@octokit/plugin-paginate-graphql@5.2.4/denonext/plugin-paginate-graphql.mjs": "a2b0869cb5eb1e14516d1d2ba227e2b968afe05ed9b3895f005ac196e7b5c5a1",
"https://esm.sh/@octokit/plugin-paginate-graphql@5.2.4?target=denonext": "1512bade9daddb1ffe8fc46693db5dd3df429d51264e6848e3de3ea0cd16bc61",
"https://esm.sh/@octokit/plugin-paginate-rest@11.4.0/denonext/plugin-paginate-rest.mjs": "3bb02e7f514dee857103ceb9d922621bed80115bfe0fb1d7197a7a7cd44cfa6f",
"https://esm.sh/@octokit/plugin-paginate-rest@11.4.0?target=denonext": "b4e0d949bdd6a34257cddde0262ca67e82a158aba5bbfeb00f54e6939770c17b",
"https://esm.sh/@octokit/plugin-rest-endpoint-methods@13.3.0/denonext/plugin-rest-endpoint-methods.mjs": "8254da50e1460596143fb2d49314f97fc0b9bae60d0259594c3a6b98bca5c266",
"https://esm.sh/@octokit/plugin-rest-endpoint-methods@13.3.0?target=denonext": "b54fb93130dea1a56de1d434e6c900793ab05281c0086129cbd60411a07039bd",
"https://esm.sh/@octokit/plugin-retry@7.1.3/denonext/plugin-retry.mjs": "b55a731984d30e256309ef0ad6eca64d34ea4cc61c747f711b7c45b0e4e1b086",
"https://esm.sh/@octokit/plugin-retry@7.1.3?target=denonext": "5f0e94e59f4a593ef911c8c10796a73d9ef5289505c129a647f90fdf3405d833",
"https://esm.sh/@octokit/plugin-throttling@9.4.0/denonext/plugin-throttling.mjs": "50c4a67edc2bba79d81f5ea8966175a3acffbffe3403b5815da172e0c12ab686",
"https://esm.sh/@octokit/plugin-throttling@9.4.0?target=denonext": "d40a7eb26c4897bb17e4cddd341a25f85ea0607798d5ee3e48014693f07e98b5",
"https://esm.sh/@octokit/request-error@6.1.6/denonext/request-error.mjs": "a3bb74761fbdc7b1fbc406f0a2ace10f82f64706ffc9596a90badef765414c5e",
"https://esm.sh/@octokit/request-error@6.1.6?target=denonext": "bfebd513aea83d3df72e2f0b70f9e2dcd7aafed463c095f7388ca3dd10621e7d",
"https://esm.sh/@octokit/request@9.2.0/denonext/request.mjs": "662411deed3a6c54a960c802b24795bc8ce65649e0a941ba848fa6f68e7d0070",
"https://esm.sh/@octokit/request@9.2.0?target=denonext": "550f4054c2e0eba7174dd21aa9117e6934f3bb3d3b3c43f6d4a1471cef3a04d9",
"https://esm.sh/@octokit/webhooks-methods@5.1.0/denonext/webhooks-methods.mjs": "fdaefa3e104afcf645fb3a35a1bb557c31e7d069342f1518df72fd5662c28932",
"https://esm.sh/@octokit/webhooks-methods@5.1.0?target=denonext": "5a77eef071b9134be9a6ed9358b553195aae275b36e7b7e7c146f0b90d1baa92",
"https://esm.sh/@octokit/webhooks@13.5.0/denonext/webhooks.mjs": "b94ff89a92ac22f1cd0307314d976fa5a34a0a731d7e79bf8962201fb3ecd013",
"https://esm.sh/@octokit/webhooks@13.5.0?target=denonext": "6e3bc47e2034b2421d1c5e4cf652aa0a330c887aa69c6bf704923eda42722ae7",
"https://esm.sh/before-after-hook@3.0.2/denonext/before-after-hook.mjs": "1a862839e15e4816de946c11023cbec3cb1d276e3a86073adfaac9dca6871aca",
"https://esm.sh/before-after-hook@3.0.2?target=denonext": "923592fc40b4609eac335800f88c890d81c5f5f12e0b22fd8fd0646313c634f7",
"https://esm.sh/bottleneck@2.19.5/denonext/light.mjs": "943b72d08b33e678a4f64bf2ce9a0468f9356ee65092af9c893fa25d3be6518b",
"https://esm.sh/bottleneck@2.19.5/light?target=denonext": "c53ee9007926e5a49e291e0a0f2e1113735d65271a33eb609ac9ad309def4878",
"https://esm.sh/fast-content-type-parse@2.0.1/denonext/fast-content-type-parse.mjs": "436d0ff6ce4508efcb9023892d25cc9d7eb321e9321a0d3aaf870300dc2e8578",
"https://esm.sh/fast-content-type-parse@2.0.1?target=denonext": "7170ebd0186887d73afc67050a28e5350171e5e842e82a10309e829eabdf138a",
"https://esm.sh/octokit@4.1.0/denonext/octokit.mjs": "0e522b2239c7f7d673022e81dd55b2dcb6ce42b905f1cfc82a5dfbbd2c24af28",
"https://esm.sh/octokit@4.1.0?dts": "094de1c868d2aaa8be65d7135d3feeee8006a5e2d76683f5bfcc32243557cdfc",
"https://esm.sh/toad-cache@3.7.0/denonext/toad-cache.mjs": "63b78525dcc99d8f736de244e46b306b2b5f6c72db75bf1d230230d46a06ab37",
"https://esm.sh/toad-cache@3.7.0?target=denonext": "e17c2f2729b3268a6ecb412b975002ebaa66894c2e5e0a657a38d1176a1f02d4",
"https://esm.sh/universal-github-app-jwt@2.2.0/denonext/universal-github-app-jwt.mjs": "c7cb04f796b43f163b1bcaf2b85c742d11ae724ae5ea82dbe517617c33bd0467",
"https://esm.sh/universal-github-app-jwt@2.2.0?target=denonext": "75d402511284eb488f2f2c0f39cc5122ec91c3de1a18eebe1360f2935a0e577a",
"https://esm.sh/universal-user-agent@7.0.2/denonext/universal-user-agent.mjs": "c5370728870841e1061776d12f5776929bb04945b0f8d5e4251207eab57d35ea",
"https://esm.sh/universal-user-agent@7.0.2?target=denonext": "1c7589a3ed835be8bf13e6c78c7d507af65b7945b92edbf3ad25428e60e072f4"
},
"workspace": { "workspace": {
"dependencies": [ "dependencies": [
"jsr:@eta-dev/eta@^3.5.0", "jsr:@eta-dev/eta@^3.5.0",
@ -1249,11 +1353,11 @@
"jsr:@std/collections@^1.0.10", "jsr:@std/collections@^1.0.10",
"jsr:@std/dotenv@~0.225.3", "jsr:@std/dotenv@~0.225.3",
"jsr:@std/path@^1.0.8", "jsr:@std/path@^1.0.8",
"npm:@types/node@^22.13.9", "npm:@types/node@^22.15.29",
"npm:jmespath@0.16", "npm:jmespath@0.16",
"npm:lodash-es@^4.17.21", "npm:lodash-es@^4.17.21",
"npm:node-llama-cpp@^3.6.0", "npm:node-llama-cpp@^3.10.0",
"npm:octokit@^4.1.0" "npm:octokit@^5.0.3"
] ]
} }
} }

View File

@ -0,0 +1,96 @@
import { getLogger } from "@logtape/logtape"
import {
ChatSessionModelFunctions,
defineChatSessionFunction,
GbnfJsonSchema,
} from "npm:node-llama-cpp"
type RemoteFunction = {
name: string
description: string
parameters?: Readonly<GbnfJsonSchema>
[key: string]: unknown
}
const remoteLogger = getLogger(["remote-functions"])
export async function fetchRemoteFunctions(
host = Deno.env.get("REMOTE_FUNCTIONS_HOST") ||
"http://localhost:1337/",
): Promise<ChatSessionModelFunctions> {
const url = new URL(host)
url.pathname = url.pathname.replace(/\/$/, "") + "/client/functions.json"
const response = await fetch(url.toString(), {
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${Deno.env.get("REMOTE_FUNCTIONS_TOKEN") || ""}`,
},
})
if (!response.ok) {
throw new Error(`Failed to call remote function: ${response.statusText}`)
}
const functions = await response.json() as RemoteFunction[]
if (!Array.isArray(functions)) {
throw new Error("Invalid response format, expected an array of functions")
}
return functions.reduce((acc, func) => {
if (!func.name || !func.description) {
throw new Error(
`Function ${JSON.stringify(func)} is missing required fields`,
)
}
acc[func.name] = defineChatSessionFunction({
description: func.description,
params: func.parameters,
handler: async (args) => {
try {
const url = new URL(host)
url.pathname = url.pathname.replace(/\/$/, "") +
"/client/remote-function/" + func.name
const requestBody = {
arguments: args,
}
const requestHeaders = {
"Content-Type": "application/json",
Authorization: `Bearer ${
Deno.env.get("REMOTE_FUNCTIONS_TOKEN") || ""
}`,
}
remoteLogger.info("Calling backend:", {
url: url.toString(),
headers: requestHeaders,
body: requestBody,
})
const response = await fetch(url.toString(), {
method: "POST",
headers: requestHeaders,
body: JSON.stringify(requestBody),
})
remoteLogger.info("Response status:", { status: response.status })
if (!response.ok) {
return (
`Failed to call remote function: ${response.statusText} ${await response
.text()}`
)
}
const responseText = await response.text()
remoteLogger.info("Response text:", { responseText })
return responseText
} catch (error) {
console.error(
`Error calling remote function ${func.name}: \n`,
error,
)
throw error
}
},
})
return acc
}, {} as Record<string, ReturnType<typeof defineChatSessionFunction>>)
}

View File

@ -1,10 +1,12 @@
import { EventEmitter } from "node:events" import { EventEmitter } from "node:events"
import {Bot, Message, User} from "../snek/snek-socket.ts" import { Bot, Message, User } from "../snek/snek-socket.ts"
import { trim } from "npm:lodash-es" import { trim } from "npm:lodash-es"
export abstract class BaseHandler extends EventEmitter { export abstract class BaseHandler extends EventEmitter {
prefix = "msg-handler" prefix = "msg-handler"
user: User|null = null user: User | null = null
autoTyping = true
constructor(prefix: string) { constructor(prefix: string) {
super() super()
@ -16,22 +18,31 @@ export abstract class BaseHandler extends EventEmitter {
bot.on("message", async (message) => { bot.on("message", async (message) => {
try { try {
if (await this.isMatch(message)) { if (await this.isMatch(message)) {
let typingIndicator: number | undefined = undefined
if (this.autoTyping) {
typingIndicator = setInterval(() => {
bot.setTyping(message.channelUID).catch(console.error)
}, 2000)
}
try { try {
await this.handleMessage(message, bot) await this.handleMessage(message, bot)
} catch (e) { } catch (e) {
message.reply("An error occurred while handling your message") message.reply("An error occurred while handling your message")
console.error("Error handling message", e) console.error("Error handling message", e, message)
} finally {
clearInterval(typingIndicator)
} }
} }
} catch (e) { } catch (e) {
console.error("Error checking message", e) console.error("Error checking message", e, message)
} }
}) })
} }
async isMatch(message: Message): Promise<boolean> { async isMatch(message: Message): Promise<boolean> {
return message.userUID !== this.user?.uid && return message.message && message.userUID !== this.user?.uid &&
trim(message?.message, ' `').toLowerCase().startsWith(this.prefix) message.isFinal &&
trim(message?.message, " `").toLowerCase().startsWith(this.prefix)
} }
abstract handleMessage( abstract handleMessage(

View File

@ -1,10 +1,10 @@
import {Bot, Message} from "../snek/snek-socket.ts" import { Bot, Message } from "../snek/snek-socket.ts"
import {BaseHandler} from "./base-handler.ts" import { BaseHandler } from "./base-handler.ts"
import {ImgGen} from "../util/img-gen.ts" import { ImgGen } from "../util/img-gen.ts"
import {Eta} from "jsr:@eta-dev/eta" import { Eta } from "jsr:@eta-dev/eta"
import { trim } from "npm:lodash-es"
import { getLogger } from "@logtape/logtape" import { getLogger } from "@logtape/logtape"
import * as path from "node:path" import * as path from "node:path"
import {randomUUID} from "node:crypto";
const TEMPLATES = new Eta({ views: path.join(Deno.cwd(), "templates/img-gen") }) const TEMPLATES = new Eta({ views: path.join(Deno.cwd(), "templates/img-gen") })
@ -15,7 +15,7 @@ const logger = getLogger(["img-gen-handler"])
const parsePrompt = (prompt: string): Record<string, unknown> => { const parsePrompt = (prompt: string): Record<string, unknown> => {
try { try {
return JSON.parse(prompt) return JSON.parse(prompt)
} catch (e) { } catch (_e) {
prompt = prompt.replace(FORMATTING_WRAPPER, "$1") prompt = prompt.replace(FORMATTING_WRAPPER, "$1")
return JSON.parse(prompt) return JSON.parse(prompt)
} }
@ -23,12 +23,12 @@ const parsePrompt = (prompt: string): Record<string, unknown> => {
export class ImgGenHandler extends BaseHandler { export class ImgGenHandler extends BaseHandler {
#imageGenerator = new ImgGen() #imageGenerator = new ImgGen()
#activeTemplate = "ultra-real.eta" #activeTemplate = "ddmv4.eta"
#templateVariables: Record<string, unknown> = { #templateVariables: Record<string, unknown> = {
steps: 20, steps: 0,
seed: 0, seed: 0,
cfg: 3.0, cfg: 0,
sampler: "euler", sampler: "",
negativePrompt: "", negativePrompt: "",
batchSize: 1, batchSize: 1,
width: 1024, width: 1024,
@ -39,6 +39,12 @@ export class ImgGenHandler extends BaseHandler {
"prompt": this.prompt.bind(this), "prompt": this.prompt.bind(this),
"template": this.template.bind(this), "template": this.template.bind(this),
"variables": this.variables.bind(this), "variables": this.variables.bind(this),
"status": this.status.bind(this),
"clear": this.clear.bind(this),
"interrupt": this.interrupt.bind(this),
"delete": this.delete.bind(this),
"free": this.free.bind(this),
"help": this.help.bind(this),
} as Record<string, (command: string, message: Message, bot: Bot) => void> } as Record<string, (command: string, message: Message, bot: Bot) => void>
constructor() { constructor() {
@ -46,11 +52,15 @@ export class ImgGenHandler extends BaseHandler {
} }
override async handleMessage(message: Message, bot: Bot) { override async handleMessage(message: Message, bot: Bot) {
const newMessage = message.message.substring(this.prefix.length).trim() const newMessage = message.message.substring(
if (!newMessage) { message.message.indexOf(" "),
message.message.length,
).trim()
if (!newMessage || !message.message.includes(" ")) {
message.reply( message.reply(
"No command given, try one of: " + `No command given, try one of: ${
Object.keys(this.#subCommands).join(", "), Object.keys(this.#subCommands).join(", ")
}`,
) )
return return
} }
@ -58,16 +68,16 @@ export class ImgGenHandler extends BaseHandler {
const [[_, command, rest]] = newMessage.matchAll(/^(\S+)\s*(.*)$/gs) const [[_, command, rest]] = newMessage.matchAll(/^(\S+)\s*(.*)$/gs)
if (command in this.#subCommands) { if (command in this.#subCommands) {
this.#subCommands[command]?.(rest.trim(), message, bot) return this.#subCommands[command]?.(rest.trim(), message, bot)
return
} }
message.reply( // message.reply(
"Invalid command, assuming prompt. Otherwise these are the correct ones: " + // `Invalid command, assuming prompt. Otherwise these are the correct ones: ${
Object.keys(this.#subCommands).join(", "), // Object.keys(this.#subCommands).join(", ")
) // }`,
// )
await this.prompt(newMessage, message, bot) return this.prompt(newMessage, message, bot)
} }
async prompt(command: string, message: Message, bot: Bot) { async prompt(command: string, message: Message, bot: Bot) {
@ -75,44 +85,69 @@ export class ImgGenHandler extends BaseHandler {
message.reply("No prompt given") message.reply("No prompt given")
return return
} }
let messageId: string | undefined = undefined
try { try {
logger.info("Generating image", { command, variables: this.#templateVariables, message }) logger.info("Generating image", {
command,
variables: this.#templateVariables,
message,
})
const randomSeed = (
min: number = 0,
max: number = Number.MAX_SAFE_INTEGER,
) => Math.floor(Math.random() * (max - min + 1)) + min
const basePrompt = trim(command.replaceAll("\n", " "), " `.,\"'")
const prompt = parsePrompt( const prompt = parsePrompt(
await TEMPLATES.renderAsync(this.#activeTemplate, { await TEMPLATES.renderAsync(this.#activeTemplate, {
...this.#templateVariables, ...this.#templateVariables,
randomSeed: ( randomSeed,
min: number = 0, iterationSeed: randomSeed(),
max: number = Number.MAX_SAFE_INTEGER, prompt: basePrompt,
) => Math.floor(Math.random() * (max - min + 1)) + min,
prompt: command.replaceAll("\n", " "),
}), }),
) )
message.reply("image generated called")
const promptResults = await this.#imageGenerator.dispatchPrompt( const promptResults = await this.#imageGenerator.dispatchPrompt(
prompt, prompt,
(promptResponse) => {
messageId = promptResponse.prompt_id
message.reply(`Started generating the image with ID: ${messageId}`)
},
) )
const blob = promptResults.filter((result) => result instanceof Blob) const blob = promptResults.filter((result) => result instanceof Blob)
if (blob.length === 0) { if (blob.length === 0) {
console.log("Prompt Results: ", promptResults) console.error("No images for ", promptResults)
message.reply("Failed to generate image") message.reply(`No images were generated for ${messageId}`)
return return
} }
const files = await Promise.all( const files = await Promise.all(
blob.map(async (blob) => blob.map(async (blob) =>
new File([(await blob.arrayBuffer()).slice(8)], `${randomUUID()}.png`) new File([(await blob.arrayBuffer()).slice(8)], `${messageId}.png`)
), ),
) )
await bot.uploadFiles(message.channelUID, ...files) const upload = await bot.uploadFiles(message.channelUID, ...files)
const res = await upload.json()
message.messageChannel(
res.files.map((file) =>
`[${file.name}](/channel/attachment/${file.relative_url})`
).join("\n\n"),
)
message.reply(
`Finished generating image ${messageId} of \`${basePrompt}\``,
)
} catch (e) { } catch (e) {
console.error(e) logger.error("Failed to generate image", { error: e })
message.reply(`Failed to generate image: ${e.message}`) message.reply(
`Failed to generate image (${messageId}): ${(e as Error).message}`,
)
} }
} }
@ -151,7 +186,7 @@ export class ImgGenHandler extends BaseHandler {
this.#activeTemplate = template this.#activeTemplate = template
message.reply(`Template set to ${template}`) message.reply(`Template set to ${template}`)
} catch (e) { } catch (e) {
message.reply(`Failed to load template: ${e.message}`) message.reply(`Failed to load template: ${(e as Error).message}`)
return return
} }
} }
@ -184,4 +219,60 @@ export class ImgGenHandler extends BaseHandler {
this.#templateVariables[variable] = value this.#templateVariables[variable] = value
message.reply(`Variable set: ${variable} = ${value}`) message.reply(`Variable set: ${variable} = ${value}`)
} }
async status(command: string, message: Message, bot: Bot) {
message.reply(`Status: ${this.#imageGenerator.lastMessage}`)
}
override async isMatch(message: Message): Promise<boolean> {
if (!message.message || !message.isFinal) {
return false
}
const botName = (await message.bot.user)?.username.toLowerCase()
return await super.isMatch(message) ||
(!!message.message &&
message.message.toLowerCase().startsWith(`@${botName}`) &&
!message.message.toLowerCase().startsWith(`@${botName}:`))
}
async clear(command: string, message: Message, bot: Bot) {
await this.#imageGenerator.clearPromptQueue()
message.reply("Cleared prompt queue")
}
async interrupt(command: string, message: Message, bot: Bot) {
await this.#imageGenerator.interruptActivePrompt()
message.reply("Interrupted active prompt")
}
async free(command: string, message: Message, bot: Bot) {
await this.#imageGenerator.freeVRAM()
message.reply("vram freed")
}
async delete(command: string, message: Message, bot: Bot) {
if (!command) {
message.reply("No id given to delete")
return
}
const ids = command.split(/\s+/g)
if (ids.length === 0) {
message.reply("No IDs found")
return
}
await this.#imageGenerator.cancelPrompts(...ids)
message.reply(`Deleted prompt(s) ${ids.join(", ")}`)
}
async help(command: string, message: Message, bot: Bot) {
message.reply(
`Commands: ${Object.keys(this.#subCommands).join(", ")}\n\n` +
`Use \`${this.prefix} <command> <args>\` to use the commands.\n\n`,
)
}
} }

View File

@ -0,0 +1,440 @@
import { BaseHandler } from "./base-handler.ts"
import { Bot, Channel, Message } from "../snek/snek-socket.ts"
import { trim, trimStart } from "npm:lodash-es"
import {
ChatSessionModelFunctions,
ChatWrapper,
defineChatSessionFunction,
GemmaChatWrapper,
GeneralChatWrapper,
getLlama,
LLamaChatPromptOptions,
LlamaChatSession,
LlamaContext,
LlamaModel,
resolveChatWrapper,
Token,
} from "npm:node-llama-cpp"
import { getLogger } from "@logtape/logtape"
import { deepMerge } from "@std/collections/deep-merge"
import { fetchRemoteFunctions } from "../ai/remote-functions.ts"
const llama = await getLlama()
const textEncoder = new TextEncoder()
function printSync(input: string | Uint8Array, to = Deno.stdout) {
let bytesWritten = 0
const bytes = typeof input === "string" ? textEncoder.encode(input) : input
while (bytesWritten < bytes.length) {
bytesWritten += to.writeSync(bytes.subarray(bytesWritten))
}
}
const logger = getLogger(["llama-gen-handler"])
const optionsGenerator = <
const Functions extends ChatSessionModelFunctions | undefined =
| ChatSessionModelFunctions
| undefined,
LLamaOptions extends LLamaChatPromptOptions<Functions> =
LLamaChatPromptOptions<Functions>,
>(
model: LlamaModel,
debugOutput: boolean = true,
defaultTimeout = 5 * 60 * 1000,
options?: LLamaOptions,
): LLamaOptions => {
const manager = AbortSignal.timeout(defaultTimeout)
const defaultOptions = {
repeatPenalty: {
lastTokens: 24,
penalty: 1.12,
penalizeNewLine: true,
frequencyPenalty: 0.02,
presencePenalty: 0.02,
punishTokensFilter: (tokens: Token[]) => {
return tokens.filter((token) => {
const text = model.detokenize([token])
// allow the model to repeat tokens
// that contain the word "better"
return !text.toLowerCase().includes("@")
// TODO: Exclude usernames
})
},
},
temperature: 0.7,
minP: 0.03,
// topK: 64,
// topP: 0.95,
// minP: 0.01,
signal: manager,
stopOnAbortSignal: true,
} as LLamaOptions
if (debugOutput) {
defaultOptions.onResponseChunk = (chunk) => {
options?.onResponseChunk?.(chunk)
const isThoughtSegment = chunk.type === "segment" &&
chunk.segmentType === "thought"
if (
chunk.type === "segment" && chunk.segmentStartTime != null
) {
printSync(` [segment start: ${chunk.segmentType}] `)
}
printSync(chunk.text)
if (chunk.type === "segment" && chunk.segmentEndTime != null) {
printSync(` [segment end: ${chunk.segmentType}] `)
}
}
}
return deepMerge(defaultOptions, options ?? {})
}
export class LLamaFuncHandler extends BaseHandler {
joinMode = new Map<string, boolean>()
streamMode = false
debugLogResponses = true
systemPrompt: string
#activeModel: string
#model: LlamaModel | null = null
#context: LlamaContext | null = null
#chatWrapper: ChatWrapper | null = null
#session: LlamaChatSession | null = null
#subCommands = {
"prompt": this.prompt.bind(this),
"join": this.join.bind(this),
"stream": this.stream.bind(this),
"reset": this.reset.bind(this),
} as Record<string, (command: string, message: Message, bot: Bot) => void>
constructor(
activeModel: string,
systemPrompt: string = "You are an AI chatbot.",
) {
super("")
this.#activeModel = activeModel
this.systemPrompt = systemPrompt
this.autoTyping = false
}
async calculateSystemPrompt(): Promise<string> {
return this.systemPrompt
}
override async bind(bot: Bot): Promise<void> {
await super.bind(bot)
this.prefix = this.user!.username.toLowerCase()
this.#model = await llama.loadModel({
modelPath: this.#activeModel,
defaultContextFlashAttention: true,
})
this.#context = await this.#model.createContext({
flashAttention: true,
})
logger.info("Model loaded", {
batchSize: this.#context.batchSize,
contextSize: this.#context.contextSize,
})
this.#chatWrapper = //new Llama3ChatWrapper()
resolveChatWrapper(this.#model) ?? new GeneralChatWrapper()
this.#session = new LlamaChatSession({
contextSequence: this.#context.getSequence(),
chatWrapper: this.#chatWrapper,
systemPrompt: await this.calculateSystemPrompt(),
})
// const channels = await bot.channels
// const channel = channels.find((v) => v.tag === "public") || channels[0]
// if (channel) {
// await bot.sendMessage(
// channel.uid,
// await this.cleanResponse(
// await this.#session.prompt(
// "Welcome to chat, greet everyone\n",
// optionsGenerator(this.#model, this.debugLogResponses),
// ),
// null,
// bot,
// ),
// )
// this.#session.resetChatHistory()
// }
// logger.info("LLamaHandler bound to bot")
}
cachedChannels: Channel[] | null = null
async isInJoinMode(channelUID: string, bot: Bot): Promise<boolean> {
if (!this.joinMode.has(channelUID)) {
if (!this.cachedChannels) {
this.cachedChannels = await bot.channels
}
const channel = this.cachedChannels?.find((c) => c.uid === channelUID)
if (channel) {
this.joinMode.set(channelUID, channel.tag === "dm")
} else {
logger.warn("Channel not found in cached channels", { channelUID })
this.cachedChannels = await bot.channels
}
}
return this.joinMode.get(channelUID) ?? false
}
override async isMatch(message: Message): Promise<boolean> {
return message
.userUID !== this.user?.uid &&
message.isFinal &&
(await this.isInJoinMode(message.channelUID, message.bot) ||
trim(message?.message, " `").toLowerCase().includes(this.prefix))
}
async cleanResponse(
response: string,
message: Message | null,
bot: Bot,
): Promise<string> {
const session = this.#session
const user = this.user
response = trim(response.replace(/<think>.*?<\/think>/gs, ""), '" \t')
let lwResponse = response.toLowerCase()
if (lwResponse.startsWith("ai")) {
response = response.substring(2).trim()
lwResponse = response.toLowerCase()
}
if (user && lwResponse.startsWith(`@${user.username.toLowerCase()}:`)) {
response = response.substring(user.username.length + 2).trim()
lwResponse = response.toLowerCase()
}
if (
message && lwResponse.startsWith(`@${message.username.toLowerCase()}:`)
) {
response = response.substring(message.username.length + 2).trim()
lwResponse = response.toLowerCase()
}
if (user && lwResponse.startsWith(`${user.username.toLowerCase()}:`)) {
response = response.substring(user.username.length + 2).trim()
lwResponse = response.toLowerCase()
}
if (
message && lwResponse.startsWith(`${message.username.toLowerCase()}:`)
) {
response = response.substring(message.username.length + 2).trim()
lwResponse = response.toLowerCase()
}
response = trimStart(response, ":").trim()
response = trim(response, '"')
return response
}
async join(command: string, message: Message, bot: Bot): Promise<void> {
this.joinMode.set(
message.channelUID,
!await this.isInJoinMode(message.channelUID, bot),
)
}
async stream(command: string, message: Message, bot: Bot): Promise<void> {
this.streamMode = !this.streamMode
}
async reset(command: string, message: Message, bot: Bot): Promise<void> {
const session = this.#session
if (!session) {
return
}
await session.resetChatHistory()
bot.sendMessage(
message.channelUID,
await this.cleanResponse(
await session.prompt(
"Your memory was just reset. Welcome to chat, greet everyone\n",
optionsGenerator(this.#model!, this.debugLogResponses),
),
message,
bot,
),
)
await session.resetChatHistory()
}
async prompt(command: string, message: Message, bot: Bot): Promise<void> {
const session = this.#session
const user = this.user
if (!session || !user) {
return
}
let msgSoFar = ""
let sentMessageInfo: Promise<unknown> | null = null
let streamId: number | undefined = undefined
if (this.streamMode) {
streamId = setInterval(async () => {
if (
msgSoFar.length < 1 ||
(msgSoFar.startsWith("@") && !msgSoFar.includes(" "))
) {
return
}
sentMessageInfo = sentMessageInfo?.then(async (msgInfo) => {
const msg = await this.cleanResponse(msgSoFar, message, bot)
try {
const msgRes = await bot.updateMessageText(
msgInfo as string,
msg,
)
if ("error" in msgRes) {
console.error("Error updating message text", msgRes)
msgSoFar = ""
return bot.sendMessage(message.channelUID, msg)
}
} catch (data) {
console.error(data)
}
return msgInfo
}) ??
bot.sendMessage(
message.channelUID,
await this.cleanResponse(msgSoFar, message, bot),
)
}, 50)
}
console.log("Prompting model", {
model: this.#activeModel,
command,
message,
user: user.username,
})
let response = await session.prompt(
`@${message.username}: ${message.message}`,
optionsGenerator(this.#model!, this.debugLogResponses, 5 * 60 * 1000, {
onTextChunk: (text) => {
bot.setTyping(message.channelUID).catch(() => {})
msgSoFar += text
if (this.streamMode) {
// sentMessageInfo = sentMessageInfo
// ? sentMessageInfo.then(([msgInfo, msg]) => {
// const newMsg = msg + text
// return this.cleanResponse(newMsg, message, bot).then((msg) => {
// return bot.updateMessageText(
// msgInfo,
// msg,
// ).catch(console.error).then(() => [msgInfo, newMsg])
// })
// })
// : bot.sendMessage(
// message.channelUID,
// text,
// ).then((msg) => [msg as string, text])
}
},
functions: {
generateImage: defineChatSessionFunction({
description: "Generate an image from a prompt",
params: {
type: "object",
properties: {
prompt: {
type: "string",
description: "The prompt to generate the image from",
},
},
required: ["prompt"],
},
handler: async ({ prompt }) => {
bot.sendMessage(message.channelUID, "@abot prompt " + prompt)
},
}),
now: defineChatSessionFunction({
description: "Get the current time",
params: {
type: "object",
properties: {},
},
handler: async () => {
const now = new Date()
return now.toLocaleString()
},
}),
...(await fetchRemoteFunctions().catch((e) => {
logger.error("Failed to fetch remote functions", { error: e })
return ({})
})),
},
}),
)
response = await this.cleanResponse(response, message, bot)
clearInterval(streamId)
if (sentMessageInfo) {
const msgInfo = await sentMessageInfo
bot.updateMessageText(
msgInfo,
response,
)
} else {
bot.sendMessage(message.channelUID, response)
}
}
override async handleMessage(message: Message, bot: Bot): Promise<void> {
const user = this.user
if (!user) {
return
}
if (
message.message.toLowerCase().startsWith(
`@${user.username.toLowerCase()}`,
)
) {
const newMessage = message.message.substring(
message.message.indexOf(" "),
message.message.length,
).trim()
if (newMessage && message.message.includes(" ")) {
const [[_, command, rest]] = newMessage.matchAll(/^(\S+)\s*(.*)$/gs)
if (command in this.#subCommands) {
return this.#subCommands[command]?.(rest.trim(), message, bot)
}
}
}
return this.prompt(message.message, message, bot)
}
}

View File

@ -1,20 +1,21 @@
import {BaseHandler} from "./base-handler.ts" import { BaseHandler } from "./base-handler.ts"
import {Bot, Message} from "../snek/snek-socket.ts" import { Bot, Message } from "../snek/snek-socket.ts"
import {trim, trimStart} from "npm:lodash-es" import { trim, trimStart } from "npm:lodash-es"
import { import {
ChatSessionModelFunctions, ChatSessionModelFunctions,
ChatWrapper, ChatWrapper,
GeneralChatWrapper, defineChatSessionFunction,
getLlama, GeneralChatWrapper,
LLamaChatPromptOptions, getLlama,
LlamaChatSession, LLamaChatPromptOptions,
LlamaContext, LlamaChatSession,
LlamaModel, LlamaContext,
resolveChatWrapper, LlamaModel,
Token, resolveChatWrapper,
Token,
} from "npm:node-llama-cpp" } from "npm:node-llama-cpp"
import {getLogger} from "@logtape/logtape" import { getLogger } from "@logtape/logtape"
import {deepMerge} from "@std/collections/deep-merge" import { deepMerge } from "@std/collections/deep-merge"
const llama = await getLlama() const llama = await getLlama()
@ -30,17 +31,20 @@ function printSync(input: string | Uint8Array, to = Deno.stdout) {
const logger = getLogger(["llama-gen-handler"]) const logger = getLogger(["llama-gen-handler"])
const optionsGenerator = < const optionsGenerator = <
const Functions extends ChatSessionModelFunctions | undefined = undefined, const Functions extends ChatSessionModelFunctions | undefined =
LLamaOptions = LLamaChatPromptOptions<Functions> | ChatSessionModelFunctions
| undefined,
LLamaOptions extends LLamaChatPromptOptions<Functions> =
LLamaChatPromptOptions<Functions>,
>( >(
model: LlamaModel, model: LlamaModel,
debugOutput: boolean = true, debugOutput: boolean = true,
defaultTimeout = 5 * 60 * 1000, defaultTimeout = 5 * 60 * 1000,
options?: LLamaOptions, options?: LLamaOptions,
): LLamaChatPromptOptions<Functions> => { ): LLamaOptions => {
const manager = AbortSignal.timeout(defaultTimeout) const manager = AbortSignal.timeout(defaultTimeout)
const defaultOptions: LLamaChatPromptOptions<Functions> = { const defaultOptions = {
repeatPenalty: { repeatPenalty: {
lastTokens: 24, lastTokens: 24,
penalty: 1.12, penalty: 1.12,
@ -54,18 +58,20 @@ const optionsGenerator = <
// allow the model to repeat tokens // allow the model to repeat tokens
// that contain the word "better" // that contain the word "better"
return !text.toLowerCase().includes("@") return !text.toLowerCase().includes("@")
// TODO: Exclude usernames // TODO: Exclude usernames
}) })
}, },
}, },
temperature: 0.6, temperature: 0.7,
minP: 0.03,
signal: manager, signal: manager,
stopOnAbortSignal: true, stopOnAbortSignal: true,
} } as LLamaOptions
if (debugOutput) { if (debugOutput) {
defaultOptions.onResponseChunk = (chunk) => { defaultOptions.onResponseChunk = (chunk) => {
options?.onResponseChunk?.(chunk)
const isThoughtSegment = chunk.type === "segment" && const isThoughtSegment = chunk.type === "segment" &&
chunk.segmentType === "thought" chunk.segmentType === "thought"
@ -83,11 +89,12 @@ const optionsGenerator = <
} }
} }
return deepMerge(defaultOptions, options ?? {}) return deepMerge(defaultOptions, options ?? {})
} }
export class LLamaHandler extends BaseHandler { export class LLamaHandler extends BaseHandler {
joinMode = false joinMode = false
streamMode = false
debugLogResponses = true debugLogResponses = true
systemPrompt: string systemPrompt: string
@ -100,14 +107,23 @@ export class LLamaHandler extends BaseHandler {
#chatWrapper: ChatWrapper | null = null #chatWrapper: ChatWrapper | null = null
#session: LlamaChatSession | null = null #session: LlamaChatSession | null = null
#subCommands = {
"prompt": this.prompt.bind(this),
"join": this.join.bind(this),
"stream": this.stream.bind(this),
"reset": this.reset.bind(this),
} as Record<string, (command: string, message: Message, bot: Bot) => void>
constructor( constructor(
activeModel: string, activeModel: string,
systemPrompt: string = "You are an AI chatbot.", systemPrompt: string = "You are an AI chatbot.",
joinMode: boolean = false,
) { ) {
super("") super("")
this.#activeModel = activeModel this.#activeModel = activeModel
this.systemPrompt = systemPrompt this.systemPrompt = systemPrompt
this.joinMode = joinMode
this.autoTyping = false
} }
async calculateSystemPrompt(): Promise<string> { async calculateSystemPrompt(): Promise<string> {
@ -116,7 +132,7 @@ export class LLamaHandler extends BaseHandler {
override async bind(bot: Bot): Promise<void> { override async bind(bot: Bot): Promise<void> {
await super.bind(bot) await super.bind(bot)
this.prefix = "@" + this.user?.username.toLowerCase() this.prefix = this.user!.username.toLowerCase()
this.#model = await llama.loadModel({ this.#model = await llama.loadModel({
modelPath: this.#activeModel, modelPath: this.#activeModel,
@ -131,23 +147,9 @@ export class LLamaHandler extends BaseHandler {
batchSize: this.#context.batchSize, batchSize: this.#context.batchSize,
contextSize: this.#context.contextSize, contextSize: this.#context.contextSize,
}) })
console.log("Model loaded", {
batchSize: this.#context.batchSize,
contextSize: this.#context.contextSize,
})
this.#chatWrapper = //new Llama3ChatWrapper() this.#chatWrapper = //new Llama3ChatWrapper()
resolveChatWrapper({ resolveChatWrapper(this.#model) ?? new GeneralChatWrapper()
bosString: this.#model
.tokens
.bosString,
filename: this.#model
.filename,
fileInfo: this.#model
.fileInfo,
tokenizer: this.#model
.tokenizer,
}) ?? new GeneralChatWrapper()
this.#session = new LlamaChatSession({ this.#session = new LlamaChatSession({
contextSequence: this.#context.getSequence(), contextSequence: this.#context.getSequence(),
@ -160,35 +162,38 @@ export class LLamaHandler extends BaseHandler {
const channel = channels.find((v) => v.tag === "public") || channels[0] const channel = channels.find((v) => v.tag === "public") || channels[0]
if (channel) { if (channel) {
await bot.sendMessage( // await bot.sendMessage(
channel.uid, // channel.uid,
await this.#session.prompt( // await this.cleanResponse(
"Welcome to chat, greet everyone\n", // await this.#session.prompt(
optionsGenerator(this.#model, this.debugLogResponses), // "Welcome to chat, greet everyone\n",
), // optionsGenerator(this.#model, this.debugLogResponses),
) // ),
this.#session.resetChatHistory() // null,
// bot,
// ),
// )
// this.#session.resetChatHistory()
} }
logger.info("LLamaHandler bound to bot")
} }
override async isMatch(message: Message): Promise<boolean> { override async isMatch(message: Message): Promise<boolean> {
return message.userUID !== this.user?.uid && (this.joinMode || return message.userUID !== this.user?.uid && message.isFinal &&
trim(message?.message, " `").toLowerCase().includes(this.prefix)) (this.joinMode ||
trim(message?.message, " `").toLowerCase().includes(this.prefix))
} }
override async handleMessage(message: Message, bot: Bot): Promise<void> { async cleanResponse(
response: string,
message: Message | null,
bot: Bot,
): Promise<string> {
const session = this.#session const session = this.#session
const user = this.user const user = this.user
if (!session || !user) {
return
}
let response = await session.prompt( response = trim(response.replace(/<think>.*?<\/think>/gs, ""), '" \t')
`@${message.username}: ${message.message}`,
optionsGenerator(this.#model!, this.debugLogResponses),
)
response = response.replace(/<think>.*?<\/think>/gs, "")
let lwResponse = response.toLowerCase() let lwResponse = response.toLowerCase()
if (lwResponse.startsWith("ai")) { if (lwResponse.startsWith("ai")) {
@ -196,17 +201,192 @@ export class LLamaHandler extends BaseHandler {
lwResponse = response.toLowerCase() lwResponse = response.toLowerCase()
} }
if (lwResponse.startsWith(`@${user.username.toLowerCase()}`)) { if (user && lwResponse.startsWith(`@${user.username.toLowerCase()}`)) {
response = response.substring(user.username.length + 1).trim() response = response.substring(user.username.length + 1).trim()
lwResponse = response.toLowerCase() lwResponse = response.toLowerCase()
} }
if (lwResponse.startsWith(`@${message.username.toLowerCase()}`)) { if (
message && lwResponse.startsWith(`@${message.username.toLowerCase()}`)
) {
response = response.substring(message.username.length + 1).trim()
lwResponse = response.toLowerCase()
}
if (user && lwResponse.startsWith(`${user.username.toLowerCase()}`)) {
response = response.substring(user.username.length + 1).trim()
lwResponse = response.toLowerCase()
}
if (message && lwResponse.startsWith(`${message.username.toLowerCase()}`)) {
response = response.substring(message.username.length + 1).trim() response = response.substring(message.username.length + 1).trim()
lwResponse = response.toLowerCase() lwResponse = response.toLowerCase()
} }
response = trimStart(response, ":").trim() response = trimStart(response, ":").trim()
bot.send("send_message", message.channelUID, response) response = trim(response, '"')
return response
}
async join(command: string, message: Message, bot: Bot): Promise<void> {
this.joinMode = !this.joinMode
}
async stream(command: string, message: Message, bot: Bot): Promise<void> {
this.streamMode = !this.streamMode
}
async reset(command: string, message: Message, bot: Bot): Promise<void> {
const session = this.#session
if (!session) {
return
}
await session.resetChatHistory()
bot.sendMessage(
message.channelUID,
await this.cleanResponse(
await session.prompt(
"Your memory was just reset. Welcome to chat, greet everyone\n",
optionsGenerator(this.#model!, this.debugLogResponses),
),
message,
bot,
),
)
await session.resetChatHistory()
}
async prompt(command: string, message: Message, bot: Bot): Promise<void> {
const session = this.#session
const user = this.user
if (!session || !user) {
return
}
let msgSoFar = ""
let sentMessageInfo: Promise<unknown> | null = null
let streamId: number | undefined = undefined
if (this.streamMode) {
streamId = setInterval(async () => {
if (
msgSoFar.length < 1 ||
(msgSoFar.startsWith("@") && !msgSoFar.includes(" "))
) {
return
}
sentMessageInfo = sentMessageInfo?.then(async (msgInfo) => {
const msg = await this.cleanResponse(msgSoFar, message, bot)
try {
const msgRes = await bot.updateMessageText(
msgInfo as string,
msg,
)
if ("error" in msgRes) {
console.error("Error updating message text", msgRes)
msgSoFar = ""
return bot.sendMessage(message.channelUID, msg)
}
} catch (data) {
console.error(data)
}
return msgInfo
})
?? bot.sendMessage(
message.channelUID,
await this.cleanResponse(msgSoFar, message, bot),
)
}, 50)
}
let response = await session.prompt(
`@${message.username}: ${message.message}`,
optionsGenerator(this.#model!, this.debugLogResponses, 5 * 60 * 1000, {
onTextChunk: (text) => {
bot.setTyping(message.channelUID).catch(() => {})
msgSoFar += text
if (this.streamMode) {
// sentMessageInfo = sentMessageInfo
// ? sentMessageInfo.then(([msgInfo, msg]) => {
// const newMsg = msg + text
// return this.cleanResponse(newMsg, message, bot).then((msg) => {
// return bot.updateMessageText(
// msgInfo,
// msg,
// ).catch(console.error).then(() => [msgInfo, newMsg])
// })
// })
// : bot.sendMessage(
// message.channelUID,
// text,
// ).then((msg) => [msg as string, text])
}
},
functions: {
generateImage: defineChatSessionFunction({
description: "Generate an image from a prompt",
params: {
type: "object",
properties: {
prompt: {
type: "string",
description: "The prompt to generate the image from",
},
},
required: ["prompt"],
},
handler: async ({ prompt }) => {
bot.sendMessage(message.channelUID, "@abot prompt " + prompt)
},
}),
},
}),
)
response = await this.cleanResponse(response, message, bot)
clearInterval(streamId)
if (sentMessageInfo) {
const msgInfo = await sentMessageInfo
bot.updateMessageText(
msgInfo,
response,
)
} else {
bot.sendMessage(message.channelUID, response)
}
}
override async handleMessage(message: Message, bot: Bot): Promise<void> {
const user = this.user
if (!user) {
return
}
if (
message.message.toLowerCase().startsWith(
`@${user.username.toLowerCase()}`,
)
) {
const newMessage = message.message.substring(
message.message.indexOf(" "),
message.message.length,
).trim()
if (newMessage && message.message.includes(" ")) {
const [[_, command, rest]] = newMessage.matchAll(/^(\S+)\s*(.*)$/gs)
if (command in this.#subCommands) {
return this.#subCommands[command]?.(rest.trim(), message, bot)
}
}
}
return this.prompt(message.message, message, bot)
} }
} }

View File

@ -1,8 +1,8 @@
import {EventEmitter} from "node:events" import { EventEmitter } from "node:events"
import {debounce} from "npm:lodash-es" import { debounce, isString } from "npm:lodash-es"
import {getLogger} from "@logtape/logtape" import { getLogger } from "@logtape/logtape"
const logger = getLogger(["ws-socket"]) const logger = getLogger(["snek-socket"])
export const BASE_URL = "https://molodetz.online/login.json" export const BASE_URL = "https://molodetz.online/login.json"
@ -12,7 +12,7 @@ const baseRequest = async (
password: string, password: string,
) => { ) => {
const loginPayloadRed = await fetch(BASE_URL) const loginPayloadRed = await fetch(BASE_URL)
console.log(loginPayloadRed) // console.log(loginPayloadRed)
const basePayload = await loginPayloadRed.json() const basePayload = await loginPayloadRed.json()
basePayload.fields.username.value = username basePayload.fields.username.value = username
@ -75,9 +75,11 @@ export interface Channel {
tag: string tag: string
} }
const SILENT_MESSAGES = ["set_typing", "ping", "pong", 'is_final": false']
export class Message { export class Message {
message: string message: string
html: string html: string | undefined
userUID: string userUID: string
color: string color: string
channelUID: string channelUID: string
@ -86,6 +88,7 @@ export class Message {
username: string username: string
uid: string uid: string
userNick: string userNick: string
isFinal: boolean | undefined
bot: Bot bot: Bot
@ -100,10 +103,15 @@ export class Message {
this.username = data.username this.username = data.username
this.uid = data.uid this.uid = data.uid
this.userNick = data.user_nick this.userNick = data.user_nick
this.isFinal = data.is_final
this.bot = bot this.bot = bot
} }
reply(message: string) { reply(message: string) {
return this.messageChannel(`@${this.username}: ${message}`)
}
messageChannel(message: string) {
return this.bot.send("send_message", this.channelUID, message) return this.bot.send("send_message", this.channelUID, message)
} }
} }
@ -141,9 +149,21 @@ export class Bot extends EventEmitter<
return this.send<Channel[]>("get_channels") return this.send<Channel[]>("get_channels")
} }
cachedUserPromise: Promise<User> | null = null
cachedUserTime: number | null = null
get user() { get user() {
return this.send<User>("get_user", null) if (this.cachedUserPromise && this.cachedUserTime) {
const now = new Date().getTime()
if (now - this.cachedUserTime < 1000 * 60 * 30) {
return this.cachedUserPromise
}
}
this.cachedUserPromise = this.send<User>("get_user", null)
this.cachedUserTime = new Date().getTime()
return this.cachedUserPromise
} }
get messages() { get messages() {
return this.send("get_messages", null) return this.send("get_messages", null)
} }
@ -173,7 +193,10 @@ export class Bot extends EventEmitter<
const ws = this.#ws const ws = this.#ws
if (ws && ws.readyState === ws.OPEN) { if (ws && ws.readyState === ws.OPEN) {
const callId = Math.random().toString(36).slice(2) const callId = Math.random().toString(36).slice(2)
logger.debug("Sending message", { name, args, callId }) const silentMessage = SILENT_MESSAGES.some((v) => name.includes(v))
if (!silentMessage) {
logger.debug("Sending message", { name, args, callId })
}
const res = Promise.withResolvers<T>() const res = Promise.withResolvers<T>()
this.#processingMessages.set(callId, { this.#processingMessages.set(callId, {
data: res as PromiseWithResolvers<unknown>, data: res as PromiseWithResolvers<unknown>,
@ -195,30 +218,42 @@ export class Bot extends EventEmitter<
}) })
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
setTimeout(() => { setTimeout(async () => {
this.connect().then(() => this.send(name, ...args)).catch(reject).then(resolve) try {
await this.connect()
resolve(await this.send(name, ...args))
} catch (e) {
reject(e)
}
}, 1000) }, 1000)
}) })
}) })
} }
return Promise.reject(new Error("Connection not open")) return this.connect().then(() => {
return this.send(name, ...args)
})
} }
receive(data: string) { receive(data: string) {
const silentMessages = (SILENT_MESSAGES.some((v) => data.includes(v))) &&
!data.includes("error")
if (!silentMessages) {
// logger.debug("Received message", { data })
}
const parsedData = JSON.parse(data) const parsedData = JSON.parse(data)
const callId = parsedData.callId const callId = parsedData.callId
const message = this.#processingMessages.get(callId) const message = this.#processingMessages.get(callId)
if (message) { if (message) {
logger.debug("Resolving message", { if (!silentMessages && !(parsedData?.success && !parsedData?.data)) {
data: parsedData.data, logger.debug("Resolving remote call", parsedData)
callId, }
raw: parsedData,
})
message.data.resolve(parsedData.data) message.data.resolve(parsedData.data)
this.#processingMessages.delete(callId) this.#processingMessages.delete(callId)
} else { } else if (parsedData?.message) {
logger.debug("Emitting message", parsedData) if (!silentMessages) {
logger.debug("Received message", parsedData)
}
this.emit("message", new Message(parsedData, this)) this.emit("message", new Message(parsedData, this))
} }
} }
@ -226,7 +261,9 @@ export class Bot extends EventEmitter<
connect = debounce( connect = debounce(
function (this: Bot) { function (this: Bot) {
if (this.#ws) { if (this.#ws) {
return this.send("get_user", null) return this.send("get_user", null).catch(() => {
return this.connect()
})
} }
logger.debug("Connecting to", { url: this.#url }) logger.debug("Connecting to", { url: this.#url })
const connectedPromise = Promise.withResolvers<unknown>() const connectedPromise = Promise.withResolvers<unknown>()
@ -239,8 +276,9 @@ export class Bot extends EventEmitter<
) )
} }
this.#ws.onmessage = (event) => { this.#ws.onmessage = (event) => {
logger.debug("Received message", { data: event.data }) if (isString(event.data)) {
this.receive(event.data) this.receive(event.data)
}
} }
this.#ws.onclose = (event) => { this.#ws.onclose = (event) => {
@ -259,7 +297,9 @@ export class Bot extends EventEmitter<
this.#processingMessages.clear() this.#processingMessages.clear()
if (this.autoReconnect) { if (this.autoReconnect) {
this.connect() setTimeout(() => {
this.connect().catch(() => {})
}, 1000)
} }
} }
@ -273,23 +313,71 @@ export class Bot extends EventEmitter<
{ leading: true, trailing: true }, { leading: true, trailing: true },
) )
stop() {
if (this.#ws) {
this.#ws.close()
this.#ws = null
}
}
sendMessage(channelUID: string, message: string) { sendMessage(channelUID: string, message: string) {
return this.send("send_message", channelUID, message) return this.send("send_message", channelUID, message)
} }
updateMessageText(
messageUID: string,
message: string,
) {
return this.send("update_message_text", messageUID, message)
}
async setTyping(channelUID: string, colour?: string) {
if (!colour) {
const user = await this.user
colour = user.color
}
return this.send("set_typing", channelUID, colour)
}
async uploadFiles(channelUID: string, ...files: File[]) { async uploadFiles(channelUID: string, ...files: File[]) {
if (files.length === 0) {
throw new Error("No files to upload")
}
const imageForm = new FormData() const imageForm = new FormData()
imageForm.append("channel_uid", channelUID) // imageForm.append("channel_uid", channelUID)
for (const file of files) { for (const file of files) {
imageForm.append("files[]", file) imageForm.append("files[]", file)
} }
return await fetch("https://molodetz.online/drive.bin", { return await fetch(
method: "POST", `https://molodetz.online/channel/${channelUID}/attachment.bin`,
body: imageForm, {
headers: { method: "POST",
"Cookie": await this.authCookie, body: imageForm,
headers: {
"Cookie": await this.authCookie as string,
},
}, },
}) )
}
ping() {
return this.send("ping", "online")
}
_pingInterval: number | null = null
startAppearingOnline() {
this.ping().catch(() => {})
this._pingInterval = setInterval(() => {
this.ping().catch(() => {})
}, 1000 * 60)
}
stopAppearingOnline() {
if (this._pingInterval) {
clearInterval(this._pingInterval)
this._pingInterval = null
}
} }
} }

View File

@ -1,15 +1,24 @@
import {randomUUID} from "node:crypto" import { randomUUID } from "node:crypto"
import {getLogger} from "@logtape/logtape" import { getLogger } from "@logtape/logtape"
const logger = getLogger(["img-gen"]) const logger = getLogger(["img-gen"])
type PromptResponse = {
prompt_id: string
number: number
node_error: Record<string, unknown>
}
export class ImgGen { export class ImgGen {
#host: string #host: string
#clientId = randomUUID() #clientId = randomUUID()
#ws: WebSocket #ws: WebSocket | null = null
lastMessage: string | null = null
#promptQueue = new Map< #promptQueue = new Map<
string, string,
{ promise: PromiseWithResolvers<unknown[]>; msgs: unknown[] } { promise: PromiseWithResolvers<unknown[]>; msgs: unknown[]; id: string }
>() >()
constructor(host: string = "127.0.0.1:8188") { constructor(host: string = "127.0.0.1:8188") {
@ -17,7 +26,7 @@ export class ImgGen {
this.#initiateWebSocket() this.#initiateWebSocket()
} }
async queuePrompt(prompt: string) { async queuePrompt(prompt: string): Promise<PromptResponse> {
const response = await fetch(`http://${this.#host}/prompt`, { const response = await fetch(`http://${this.#host}/prompt`, {
method: "POST", method: "POST",
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
@ -43,8 +52,8 @@ export class ImgGen {
#initiateWebSocket() { #initiateWebSocket() {
if ( if (
!this.#ws || this.#ws.readyState === this.#ws.CLOSED || !this.#ws || this.#ws.readyState === WebSocket.CLOSED ||
this.#ws.readyState === this.#ws.CLOSING this.#ws.readyState === WebSocket.CLOSING
) { ) {
const res = Promise.withResolvers<void>() const res = Promise.withResolvers<void>()
this.#ws = new WebSocket( this.#ws = new WebSocket(
@ -52,33 +61,43 @@ export class ImgGen {
) )
let lastExportId: string | null = null let lastExportId: string | null = null
this.#ws.addEventListener("message", (event) => { this.#ws.addEventListener("message", (event) => {
if (typeof event.data === "string") { try {
console.log("Received message", event, event.data) if (typeof event.data === "string") {
const data = JSON.parse(event.data) this.lastMessage = event.data
const res = this.#promptQueue.get(data.data.prompt_id) const data = JSON.parse(event.data)
if (res) { logger.info("Received message", { data })
res.msgs.push(data) const res = this.#promptQueue.get(data.data.prompt_id)
if (data.type === "execution_success") { if (res) {
res.promise.resolve(res.msgs) res.msgs.push(data)
this.#promptQueue.delete(data.data.prompt_id) if (data.type === "execution_success") {
} else if (data.type === "executing") { res.promise.resolve(res.msgs)
if (data.data.node === "save_image_websocket_node") { this.#promptQueue.delete(data.data.prompt_id)
lastExportId = data.data.prompt_id } else if (data.type === "executing") {
if (data.data.node === "save_image_websocket_node") {
lastExportId = data.data.prompt_id
}
}
}
} else {
logger.info("Received img message, assuming part of image export", {
lastExportId,
})
this.lastMessage =
`Received binary data (assuming image) for ${lastExportId}`
if (lastExportId) {
const res = this.#promptQueue.get(lastExportId)
if (res) {
res.msgs.push(event.data)
} }
} }
} }
} else { } catch (e) {
console.error( logger.error("Error processing WebSocket message", {
"Received img message",
event, event,
"assuming is part of", error: e,
lastExportId, })
) for (const [_, { promise }] of this.#promptQueue) {
if (lastExportId) { promise.reject(e)
const res = this.#promptQueue.get(lastExportId)
if (res) {
res.msgs.push(event.data)
}
} }
} }
}) })
@ -100,34 +119,91 @@ export class ImgGen {
}) })
this.#ws.addEventListener("error", (e) => { this.#ws.addEventListener("error", (e) => {
logger.error("WebSocket error", {e}) logger.error("WebSocket error", { e })
}) })
return res.promise return res.promise
} else if (this.#ws.readyState === this.#ws.CONNECTING) { } else if (this.#ws.readyState === WebSocket.CONNECTING) {
return new Promise<void>((resolve) => { const res = Promise.withResolvers<void>()
this.#ws.addEventListener("open", () => { this.#ws.addEventListener("open", () => {
resolve() res.resolve()
}, { once: true }) }, { once: true })
}) return res.promise
} }
return Promise.resolve() return Promise.resolve()
} }
async dispatchPrompt(prompt: Record<string, unknown> | string) { async dispatchPrompt(
prompt: Record<string, unknown> | string,
enqueueCallback: (promptResponse: PromptResponse) => Promise<void> | void =
() => {},
): Promise<unknown[]> {
const res = Promise.withResolvers<unknown[]>() const res = Promise.withResolvers<unknown[]>()
await this.#initiateWebSocket() if (this.#ws?.readyState !== WebSocket.OPEN) {
if (this.#ws.readyState !== this.#ws.OPEN) {
return Promise.reject(new Error("WebSocket not open")) return Promise.reject(new Error("WebSocket not open"))
} }
const promptData = await this.queuePrompt(prompt as string) await this.#initiateWebSocket()
console.log("Prompt data", promptData)
this.#promptQueue.set(promptData.prompt_id, { promise: res, msgs: [] }) let promptData: Awaited<ReturnType<typeof this.queuePrompt>>
try {
promptData = await this.queuePrompt(prompt as string)
logger.info("Prompt data", promptData)
} catch (e) {
logger.error("Failed to enqueue prompt", { e })
res.reject(e)
return res.promise
}
this.#promptQueue.set(promptData.prompt_id, {
promise: res,
msgs: [],
id: promptData.prompt_id,
})
try {
await enqueueCallback(promptData)
} catch (e) {
logger.error("Callback errored", { e })
}
return res.promise return res.promise
} }
async interruptActivePrompt() {
const response = await fetch(`http://${this.#host}/interrupt`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ client_id: this.#clientId }),
})
return response.ok
}
async clearPromptQueue() {
const response = await fetch(`http://${this.#host}/queue`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ client_id: this.#clientId, clear: true }),
})
return response.ok
}
async cancelPrompts(...ids: string[]) {
const response = await fetch(`http://${this.#host}/queue`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ client_id: this.#clientId, delete: ids }),
})
return response.ok
}
async freeVRAM() {
const response = await fetch(`http://${this.#host}/free`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ client_id: this.#clientId }),
})
return response.ok
}
} }

View File

@ -1,16 +1,18 @@
import {configure, getConsoleSink} from "@logtape/logtape"; import {
configure,
defaultConsoleFormatter,
getConsoleSink,
} from "@logtape/logtape"
import { isEmpty } from "lodash-es"
await configure({ await configure({
sinks: { sinks: {
console: getConsoleSink( console: getConsoleSink(
{ {
formatter: (logEvent) => { formatter: (logEvent) => {
const { timestamp, level, category, message, properties } = logEvent const { properties } = logEvent
return `${timestamp} [${level.toUpperCase()}] [${category}] ${message} ${ const baseLog = defaultConsoleFormatter(logEvent)
properties && Object.keys(properties).length return [...baseLog, isEmpty(properties) ? "" : properties]
? JSON.stringify(properties)
: ""
}`
}, },
}, },
), ),
@ -20,6 +22,7 @@ await configure({
{ category: "img-gen", lowestLevel: "debug", sinks: ["console"] }, { category: "img-gen", lowestLevel: "debug", sinks: ["console"] },
{ category: "img-gen-handler", lowestLevel: "debug", sinks: ["console"] }, { category: "img-gen-handler", lowestLevel: "debug", sinks: ["console"] },
{ category: "llama-gen-handler", lowestLevel: "debug", sinks: ["console"] }, { category: "llama-gen-handler", lowestLevel: "debug", sinks: ["console"] },
{ category: "ws-socket", lowestLevel: "debug", sinks: ["console"] }, { category: "snek-socket", lowestLevel: "debug", sinks: ["console"] },
{ category: "remote-functions", lowestLevel: "debug", sinks: ["console"] },
], ],
}) })

18
src/ws-snek-basic-bot.ts Normal file
View File

@ -0,0 +1,18 @@
import "@std/dotenv/load"
import "./util/logging.ts"
import { Bot } from "./snek/snek-socket.ts"
const bot = new Bot(
Deno.env.get("SNEK_USERNAME")!,
Deno.env.get("SNEK_PASSWORD")!,
)
await bot.connect()
const user = await bot.user
console.log("We are user: ", user, await bot.authCookie)
await Promise.all([])
bot.startAppearingOnline()

View File

@ -1,9 +1,11 @@
import "@std/dotenv/load" import "@std/dotenv/load"
import "./util/logging.ts" import "./util/logging.ts"
import {Bot} from "./snek/snek-socket.ts" import { Bot } from "./snek/snek-socket.ts"
import {PingHandler} from "./msg-handlers/ping-handler.ts"; import { PingHandler } from "./msg-handlers/ping-handler.ts"
import {ImgGenHandler} from "./msg-handlers/img-gen-handler.ts"; import { ImgGenHandler } from "./msg-handlers/img-gen-handler.ts"
import { getLogger } from "@logtape/logtape"
const logger = getLogger("ws-snek-llama-func-bot")
const bot = new Bot( const bot = new Bot(
Deno.env.get("SNEK_USERNAME")!, Deno.env.get("SNEK_USERNAME")!,
Deno.env.get("SNEK_PASSWORD")!, Deno.env.get("SNEK_PASSWORD")!,
@ -13,7 +15,9 @@ await bot.connect()
const user = await bot.user const user = await bot.user
console.log("We are user: ", user, await bot.authCookie) logger.info("We are user: ", { user, authCookie: await bot.authCookie })
new PingHandler().bind(bot) new PingHandler().bind(bot)
new ImgGenHandler().bind(bot) new ImgGenHandler().bind(bot)
bot.startAppearingOnline()

View File

@ -1,8 +1,8 @@
import "@std/dotenv/load" import "@std/dotenv/load"
import "./util/logging.ts" import "./util/logging.ts"
import {Bot} from "./snek/snek-socket.ts" import { Bot } from "./snek/snek-socket.ts"
import {PingHandler} from "./msg-handlers/ping-handler.ts"; import { PingHandler } from "./msg-handlers/ping-handler.ts"
import {LLamaHandler} from "./msg-handlers/llama-handler.ts"; import { LLamaHandler } from "./msg-handlers/llama-handler.ts"
const bot = new Bot( const bot = new Bot(
Deno.env.get("SNEK_USERNAME")!, Deno.env.get("SNEK_USERNAME")!,
@ -22,3 +22,5 @@ await Promise.all([
Deno.env.get("SNEK_LLAMA_SYSTEM_PROMPT")!, Deno.env.get("SNEK_LLAMA_SYSTEM_PROMPT")!,
).bind(bot), ).bind(bot),
]) ])
bot.startAppearingOnline()

View File

@ -0,0 +1,28 @@
import "@std/dotenv/load"
import "./util/logging.ts"
import { Bot } from "./snek/snek-socket.ts"
import { PingHandler } from "./msg-handlers/ping-handler.ts"
import { LLamaFuncHandler } from "./msg-handlers/llama-func-handler.ts"
import { getLogger } from "@logtape/logtape"
const logger = getLogger("ws-snek-llama-func-bot")
const bot = new Bot(
Deno.env.get("SNEK_USERNAME")!,
Deno.env.get("SNEK_PASSWORD")!,
)
await bot.connect()
const user = await bot.user
logger.info("We are user: ", { user, authCookie: await bot.authCookie })
await Promise.all([
new PingHandler().bind(bot),
new LLamaFuncHandler(
Deno.env.get("SNEK_LLAMA_MODEL")!,
Deno.env.get("SNEK_LLAMA_SYSTEM_PROMPT")!,
).bind(bot),
])
bot.startAppearingOnline()

39
src/ws-snek-perf-check.ts Normal file
View File

@ -0,0 +1,39 @@
import "@std/dotenv/load"
import "./util/logging.ts"
import { Bot } from "./snek/snek-socket.ts"
const bot = new Bot(
Deno.env.get("SNEK_USERNAME")!,
Deno.env.get("SNEK_PASSWORD")!,
)
await bot.connect()
const user = await bot.user
console.log("We are user: ", user, await bot.authCookie)
const channel = await bot.channels
console.log("We are in channel: ", channel)
const activeChannel = channel.find((c) => c.tag != "dm")!.uid
const endTime = new Date()
// 5 seconds
endTime.setSeconds(endTime.getSeconds() + 5)
let counter = 0
let messageCollect = []
while (new Date() < endTime) {
messageCollect.push(
bot.sendMessage(activeChannel, `Test message ${counter++}`),
)
}
await Promise.all(messageCollect)
console.log("Finished sending messages", counter)
bot.stop()

View File

@ -0,0 +1,219 @@
{
"6": {
"inputs": {
"ckpt_name": "randomanime_Illust.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"7": {
"inputs": {
"text": "<%= it.negativePrompt || 'score_4_up, score_5_up, worst quality,bad quality,very displeasing,extra digit,fewer digits,jpeg artifacts,signature,username,reference,mutated,lineup,manga,comic,disembodied,turnaround,2koma,4koma,monster,cropped,amputee,text,bad foreshortening,what,logo,bad anatomy,bad perspective,bad proportions,artistic error,anatomical nonsense,amateur,out of frame,multiple views, non detailed eyes' %>"
},
"class_type": "Text Multiline",
"_meta": {
"title": "Negative"
}
},
"8": {
"inputs": {
"prompt": "<%= it.prompt || 'masterpiece, best quality, score_9, score_8_up' %>",
"seed": [
"9",
0
]
},
"class_type": "Wildcard Processor",
"_meta": {
"title": "wildcard processor(Pos prompt)"
}
},
"9": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "Seed Everywhere",
"_meta": {
"title": "Seed Everywhere"
}
},
"12": {
"inputs": {
"steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 8 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "beta",
"denoise": 1,
"model": [
"16",
0
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"latent_image": [
"23",
0
],
"seed": [
"9",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"13": {
"inputs": {
"samples": [
"12",
0
],
"vae": [
"6",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"16": {
"inputs": {
"text": [
"8",
0
],
"model": [
"6",
0
],
"clip": [
"6",
1
]
},
"class_type": "LoraTagLoader",
"_meta": {
"title": "Load LoRA Tag"
}
},
"17": {
"inputs": {
"text": [
"16",
2
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"18": {
"inputs": {
"stop_at_clip_layer": -2,
"clip": [
"16",
1
]
},
"class_type": "CLIPSetLastLayer",
"_meta": {
"title": "CLIP Set Last Layer"
}
},
"19": {
"inputs": {
"text": [
"7",
0
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"21": {
"inputs": {
"images": [
"13",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"22": {
"inputs": {
"filename_prefix": "RandomAnime",
"images": [
"13",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"23": {
"inputs": {
"batch_size": <%= it.batchSize || 1 %>,
"seed": [
"9",
0
]
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"24": {
"inputs": {
"text": [
"8",
0
],
"text2": "masterpiece, best quality, score_9, score_8_up"
},
"class_type": "ShowText|pysssss",
"_meta": {
"title": "Show Text 🐍"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"13",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}

View File

@ -0,0 +1,495 @@
{
"4": {
"inputs": {
"ckpt_name": "stableDiffusion35_large.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"6": {
"inputs": {
"text": "<%= it.prompt %>",
"clip": [
"11",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"8": {
"inputs": {
"samples": [
"294",
0
],
"vae": [
"4",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"11": {
"inputs": {
"clip_name1": "long_clip/ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors",
"clip_name2": "clip_g.safetensors",
"clip_name3": "t5/google_t5-v1_1-xxl_encoderonly-fp8_e4m3fn.safetensors"
},
"class_type": "TripleCLIPLoader",
"_meta": {
"title": "TripleCLIPLoader"
}
},
"13": {
"inputs": {
"shift": 3,
"model": [
"4",
0
]
},
"class_type": "ModelSamplingSD3",
"_meta": {
"title": "ModelSamplingSD3"
}
},
"67": {
"inputs": {
"conditioning": [
"71",
0
]
},
"class_type": "ConditioningZeroOut",
"_meta": {
"title": "ConditioningZeroOut"
}
},
"68": {
"inputs": {
"start": 0.1,
"end": 1,
"conditioning": [
"67",
0
]
},
"class_type": "ConditioningSetTimestepRange",
"_meta": {
"title": "ConditioningSetTimestepRange"
}
},
"69": {
"inputs": {
"conditioning_1": [
"68",
0
],
"conditioning_2": [
"70",
0
]
},
"class_type": "ConditioningCombine",
"_meta": {
"title": "Conditioning (Combine)"
}
},
"70": {
"inputs": {
"start": 0,
"end": 0.1,
"conditioning": [
"71",
0
]
},
"class_type": "ConditioningSetTimestepRange",
"_meta": {
"title": "ConditioningSetTimestepRange"
}
},
"71": {
"inputs": {
"text": "<%= it.negativePrompt ||'' %>",
"clip": [
"11",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"294": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1,
"model": [
"13",
0
],
"positive": [
"6",
0
],
"negative": [
"69",
0
],
"latent_image": [
"302",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"301": {
"inputs": {
"filename_prefix": "SD3.5_Large_improved_",
"images": [
"325",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"302": {
"inputs": {
"batch_size": <%= it.batchSize || 1 %>,
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"304": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "CPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"305": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": false,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": false,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"306": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"308": {
"inputs": {
"model_name": "bbox/hand_yolov8s.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"309": {
"inputs": {
"images": [
"324",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"310": {
"inputs": {
"images": [
"324",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"311": {
"inputs": {
"images": [
"324",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"312": {
"inputs": {
"images": [
"324",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"314": {
"inputs": {
"images": [
"325",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"315": {
"inputs": {
"images": [
"325",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"316": {
"inputs": {
"images": [
"325",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"317": {
"inputs": {
"images": [
"325",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"321": {
"inputs": {
"images": [
"8",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"324": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 0.5,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"8",
0
],
"model": [
"13",
0
],
"clip": [
"11",
0
],
"vae": [
"4",
2
],
"positive": [
"6",
0
],
"negative": [
"69",
0
],
"bbox_detector": [
"305",
0
],
"sam_model_opt": [
"304",
0
],
"segm_detector_opt": [
"305",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"325": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 0.5,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"324",
0
],
"model": [
"13",
0
],
"clip": [
"11",
0
],
"vae": [
"4",
2
],
"positive": [
"6",
0
],
"negative": [
"69",
0
],
"bbox_detector": [
"308",
0
],
"sam_model_opt": [
"304",
0
],
"segm_detector_opt": [
"306",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"325",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}

View File

@ -39,9 +39,9 @@
}, },
"11": { "11": {
"inputs": { "inputs": {
"clip_name1": "long_clip\\ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors", "clip_name1": "long_clip/ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors",
"clip_name2": "clip_g.safetensors", "clip_name2": "clip_g.safetensors",
"clip_name3": "t5\\google_t5-v1_1-xxl_encoderonly-fp8_e4m3fn.safetensors" "clip_name3": "t5/google_t5-v1_1-xxl_encoderonly-fp8_e4m3fn.safetensors"
}, },
"class_type": "TripleCLIPLoader", "class_type": "TripleCLIPLoader",
"_meta": { "_meta": {
@ -144,10 +144,10 @@
"294": { "294": {
"inputs": { "inputs": {
"seed": <%= it.seed || it.randomSeed() %>, "seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 2 %>, "steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 1 %>, "cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>", "sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "beta", "scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1, "denoise": 1,
"model": [ "model": [
"13", "13",

View File

@ -144,10 +144,10 @@
"294": { "294": {
"inputs": { "inputs": {
"seed": <%= it.seed || it.randomSeed() %>, "seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 2 %>, "steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 1 %>, "cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>", "sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "beta", "scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1, "denoise": 1,
"model": [ "model": [
"13", "13",

View File

@ -144,10 +144,10 @@
"294": { "294": {
"inputs": { "inputs": {
"seed": <%= it.seed || it.randomSeed() %>, "seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 2 %>, "steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 1 %>, "cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>", "sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "beta", "scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1, "denoise": 1,
"model": [ "model": [
"13", "13",

View File

@ -0,0 +1,495 @@
{
"4": {
"inputs": {
"ckpt_name": "stableDiffusion35_medium.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"6": {
"inputs": {
"text": "<%= it.prompt %>",
"clip": [
"11",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"8": {
"inputs": {
"samples": [
"294",
0
],
"vae": [
"4",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"11": {
"inputs": {
"clip_name1": "long_clip/ViT-L-14-TEXT-detail-improved-hiT-GmP-HF.safetensors",
"clip_name2": "clip_g.safetensors",
"clip_name3": "t5/google_t5-v1_1-xxl_encoderonly-fp8_e4m3fn.safetensors"
},
"class_type": "TripleCLIPLoader",
"_meta": {
"title": "TripleCLIPLoader"
}
},
"13": {
"inputs": {
"shift": 3,
"model": [
"4",
0
]
},
"class_type": "ModelSamplingSD3",
"_meta": {
"title": "ModelSamplingSD3"
}
},
"67": {
"inputs": {
"conditioning": [
"71",
0
]
},
"class_type": "ConditioningZeroOut",
"_meta": {
"title": "ConditioningZeroOut"
}
},
"68": {
"inputs": {
"start": 0.1,
"end": 1,
"conditioning": [
"67",
0
]
},
"class_type": "ConditioningSetTimestepRange",
"_meta": {
"title": "ConditioningSetTimestepRange"
}
},
"69": {
"inputs": {
"conditioning_1": [
"68",
0
],
"conditioning_2": [
"70",
0
]
},
"class_type": "ConditioningCombine",
"_meta": {
"title": "Conditioning (Combine)"
}
},
"70": {
"inputs": {
"start": 0,
"end": 0.1,
"conditioning": [
"71",
0
]
},
"class_type": "ConditioningSetTimestepRange",
"_meta": {
"title": "ConditioningSetTimestepRange"
}
},
"71": {
"inputs": {
"text": "<%= it.negativePrompt ||'' %>",
"clip": [
"11",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"294": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1,
"model": [
"13",
0
],
"positive": [
"6",
0
],
"negative": [
"69",
0
],
"latent_image": [
"302",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"301": {
"inputs": {
"filename_prefix": "SD3.5_Medium_improved_",
"images": [
"325",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"302": {
"inputs": {
"batch_size": <%= it.batchSize || 1 %>,
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"304": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "CPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"305": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": false,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": false,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"306": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"308": {
"inputs": {
"model_name": "bbox/hand_yolov8s.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"309": {
"inputs": {
"images": [
"324",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"310": {
"inputs": {
"images": [
"324",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"311": {
"inputs": {
"images": [
"324",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"312": {
"inputs": {
"images": [
"324",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"314": {
"inputs": {
"images": [
"325",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"315": {
"inputs": {
"images": [
"325",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"316": {
"inputs": {
"images": [
"325",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"317": {
"inputs": {
"images": [
"325",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"321": {
"inputs": {
"images": [
"8",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"324": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 0.5,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"8",
0
],
"model": [
"13",
0
],
"clip": [
"11",
0
],
"vae": [
"4",
2
],
"positive": [
"6",
0
],
"negative": [
"69",
0
],
"bbox_detector": [
"305",
0
],
"sam_model_opt": [
"304",
0
],
"segm_detector_opt": [
"305",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"325": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 20 %>,
"cfg": <%= it.cfg || 2 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 0.5,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"324",
0
],
"model": [
"13",
0
],
"clip": [
"11",
0
],
"vae": [
"4",
2
],
"positive": [
"6",
0
],
"negative": [
"69",
0
],
"bbox_detector": [
"308",
0
],
"sam_model_opt": [
"304",
0
],
"segm_detector_opt": [
"306",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"325",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}

View File

@ -0,0 +1,533 @@
{
"6": {
"inputs": {
"ckpt_name": "CrowPonyQp_ponyV7.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"7": {
"inputs": {
"text": "<%= it.negativePrompt || 'score_4_up, score_5_up, worst quality,bad quality,very displeasing,extra digit,fewer digits,jpeg artifacts,signature,username,reference,mutated,lineup,manga,comic,disembodied,turnaround,2koma,4koma,monster,cropped,amputee,text,bad foreshortening,what,logo,bad anatomy,bad perspective,bad proportions,artistic error,anatomical nonsense,amateur,out of frame,multiple views, non detailed eyes' %>"
},
"class_type": "Text Multiline",
"_meta": {
"title": "Negative"
}
},
"8": {
"inputs": {
"prompt": "<%= it.prompt %>",
"seed": [
"9",
0
]
},
"class_type": "Wildcard Processor",
"_meta": {
"title": "wildcard processor(Pos prompt)"
}
},
"9": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "Seed Everywhere",
"_meta": {
"title": "Seed Everywhere"
}
},
"12": {
"inputs": {
"seed": [
"9",
0
],
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 6 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 1,
"model": [
"16",
0
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"latent_image": [
"23",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"13": {
"inputs": {
"samples": [
"12",
0
],
"vae": [
"6",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"16": {
"inputs": {
"text": [
"8",
0
],
"model": [
"25",
0
],
"clip": [
"25",
1
]
},
"class_type": "LoraTagLoader",
"_meta": {
"title": "Load LoRA Tag"
}
},
"17": {
"inputs": {
"text": [
"16",
2
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"18": {
"inputs": {
"stop_at_clip_layer": -2,
"clip": [
"16",
1
]
},
"class_type": "CLIPSetLastLayer",
"_meta": {
"title": "CLIP Set Last Layer"
}
},
"19": {
"inputs": {
"text": [
"7",
0
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"21": {
"inputs": {
"images": [
"13",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"22": {
"inputs": {
"filename_prefix": "crow_pony_",
"images": [
"33",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"23": {
"inputs": {
"batch_size": 1,
"seed": [
"9",
0
]
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"24": {
"inputs": {
"text": [
"8",
0
],
"text2": "<%= it.prompt %>"
},
"class_type": "ShowText|pysssss",
"_meta": {
"title": "Show Text 🐍"
}
},
"25": {
"inputs": {
"lora_name": "zy_Realism_Enhancer_v2.safetensors",
"strength_model": 0.9000000000000001,
"strength_clip": 0.9000000000000001,
"model": [
"6",
0
],
"clip": [
"6",
1
]
},
"class_type": "LoraLoader",
"_meta": {
"title": "Load LoRA"
}
},
"26": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"27": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": false,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": false,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"28": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 6 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.35000000000000003,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"13",
0
],
"model": [
"16",
0
],
"clip": [
"18",
0
],
"vae": [
"6",
2
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"bbox_detector": [
"27",
0
],
"sam_model_opt": [
"26",
0
],
"segm_detector_opt": [
"27",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"30": {
"inputs": {
"images": [
"28",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"31": {
"inputs": {
"images": [
"28",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"32": {
"inputs": {
"images": [
"28",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"33": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 6 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.35000000000000003,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"28",
0
],
"model": [
"16",
0
],
"clip": [
"18",
0
],
"vae": [
"6",
2
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"bbox_detector": [
"39",
0
],
"sam_model_opt": [
"40",
0
],
"segm_detector_opt": [
"41",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"34": {
"inputs": {
"images": [
"33",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"35": {
"inputs": {
"images": [
"33",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"36": {
"inputs": {
"images": [
"33",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"37": {
"inputs": {
"images": [
"33",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"38": {
"inputs": {
"images": [
"28",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"39": {
"inputs": {
"model_name": "bbox/hand_yolov8s.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"40": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"41": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"33",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}

View File

@ -0,0 +1,533 @@
{
"6": {
"inputs": {
"ckpt_name": "cyberrealisticXL_v53.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"7": {
"inputs": {
"text": "<%= it.negativePrompt || 'score_4_up, score_5_up, worst quality,bad quality,very displeasing,extra digit,fewer digits,jpeg artifacts,signature,username,reference,mutated,lineup,manga,comic,disembodied,turnaround,2koma,4koma,monster,cropped,amputee,text,bad foreshortening,what,logo,bad anatomy,bad perspective,bad proportions,artistic error,anatomical nonsense,amateur,out of frame,multiple views, non detailed eyes, embedding:CyberRealistic_Negative_SDXL-neg' %>"
},
"class_type": "Text Multiline",
"_meta": {
"title": "Negative"
}
},
"8": {
"inputs": {
"prompt": "<%= it.prompt %>",
"seed": [
"9",
0
]
},
"class_type": "Wildcard Processor",
"_meta": {
"title": "wildcard processor(Pos prompt)"
}
},
"9": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "Seed Everywhere",
"_meta": {
"title": "Seed Everywhere"
}
},
"12": {
"inputs": {
"seed": [
"9",
0
],
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 1,
"model": [
"16",
0
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"latent_image": [
"23",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"13": {
"inputs": {
"samples": [
"12",
0
],
"vae": [
"6",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"16": {
"inputs": {
"text": [
"8",
0
],
"model": [
"25",
0
],
"clip": [
"25",
1
]
},
"class_type": "LoraTagLoader",
"_meta": {
"title": "Load LoRA Tag"
}
},
"17": {
"inputs": {
"text": [
"16",
2
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"18": {
"inputs": {
"stop_at_clip_layer": -2,
"clip": [
"16",
1
]
},
"class_type": "CLIPSetLastLayer",
"_meta": {
"title": "CLIP Set Last Layer"
}
},
"19": {
"inputs": {
"text": [
"7",
0
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"21": {
"inputs": {
"images": [
"13",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"22": {
"inputs": {
"filename_prefix": "cyber_illust_",
"images": [
"33",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"23": {
"inputs": {
"batch_size": 1,
"seed": [
"9",
0
]
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"24": {
"inputs": {
"text": [
"8",
0
],
"text2": "<%= it.prompt %>"
},
"class_type": "ShowText|pysssss",
"_meta": {
"title": "Show Text 🐍"
}
},
"25": {
"inputs": {
"lora_name": "Add_Details_v1.2.safetensors",
"strength_model": 2.5,
"strength_clip": 2.5,
"model": [
"6",
0
],
"clip": [
"6",
1
]
},
"class_type": "LoraLoader",
"_meta": {
"title": "Load LoRA"
}
},
"26": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"27": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": false,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": false,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"28": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.35000000000000003,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"13",
0
],
"model": [
"16",
0
],
"clip": [
"18",
0
],
"vae": [
"6",
2
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"bbox_detector": [
"27",
0
],
"sam_model_opt": [
"26",
0
],
"segm_detector_opt": [
"27",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"30": {
"inputs": {
"images": [
"28",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"31": {
"inputs": {
"images": [
"28",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"32": {
"inputs": {
"images": [
"28",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"33": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.35000000000000003,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"28",
0
],
"model": [
"16",
0
],
"clip": [
"18",
0
],
"vae": [
"6",
2
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"bbox_detector": [
"39",
0
],
"sam_model_opt": [
"40",
0
],
"segm_detector_opt": [
"41",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"34": {
"inputs": {
"images": [
"33",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"35": {
"inputs": {
"images": [
"33",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"36": {
"inputs": {
"images": [
"33",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"37": {
"inputs": {
"images": [
"33",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"38": {
"inputs": {
"images": [
"28",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"39": {
"inputs": {
"model_name": "bbox/hand_yolov8s.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"40": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"41": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"33",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}

734
templates/img-gen/ddmv4.eta Normal file
View File

@ -0,0 +1,734 @@
{
"2": {
"inputs": {
"filename_prefix": "DDMv4_",
"images": [
"36",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"3": {
"inputs": {
"batch_size": 1,
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"4": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 1,
"model": [
"13",
0
],
"positive": [
"7",
0
],
"negative": [
"5",
0
],
"latent_image": [
"3",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"5": {
"inputs": {
"text": "<%= it.negativePrompt || 'score_4_up, score_5_up, worst quality,bad quality,very displeasing,extra digit,fewer digits,jpeg artifacts,signature,username,reference,mutated,lineup,manga,comic,disembodied,turnaround,2koma,4koma,cropped,amputee,bad foreshortening,what,bad anatomy,bad perspective,bad proportions,artistic error,anatomical nonsense,amateur,out of frame,multiple views, non detailed eyes, ugly, airbrushed, simple background, cgi, cartoon, anime, bad, ugly' %>",
"clip": [
"17",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Negative Prompt"
}
},
"7": {
"inputs": {
"text": [
"49",
0
],
"clip": [
"17",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Positive Prompt"
}
},
"10": {
"inputs": {
"images": [
"36",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"11": {
"inputs": {
"samples": [
"4",
0
],
"vae": [
"13",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"36",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
},
"13": {
"inputs": {
"ckpt_name": "donutsdeliverymixV4_v41.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"15": {
"inputs": {
"images": [
"11",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"17": {
"inputs": {
"clip_name": "longclip-L.pt",
"clip": [
"13",
1
]
},
"class_type": "SeaArtLongXLClipMerge",
"_meta": {
"title": "SeaArtLongXLClipMerge"
}
},
"20": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"21": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"22": {
"inputs": {
"model_name": "bbox/hand_yolov8s.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"24": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": false,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": false,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"25": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"27": {
"inputs": {
"images": [
"39",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"28": {
"inputs": {
"images": [
"39",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"29": {
"inputs": {
"images": [
"39",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"30": {
"inputs": {
"images": [
"39",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"31": {
"inputs": {
"images": [
"36",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"32": {
"inputs": {
"images": [
"36",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"33": {
"inputs": {
"images": [
"36",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"34": {
"inputs": {
"images": [
"36",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"35": {
"inputs": {
"model": [
"13",
0
],
"clip": [
"17",
0
],
"vae": [
"13",
2
],
"positive": [
"7",
0
],
"negative": [
"5",
0
]
},
"class_type": "ToBasicPipe",
"_meta": {
"title": "ToBasicPipe"
}
},
"36": {
"inputs": {
"guide_size": 1024,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": 8,
"cfg": 3,
"sampler_name": "<%= it.sampler || 'dpmpp_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.45,
"feather": 10,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"refiner_ratio": 0.2,
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"42",
0
],
"detailer_pipe": [
"58",
0
]
},
"class_type": "FaceDetailerPipe",
"_meta": {
"title": "FaceDetailer (pipe)"
}
},
"37": {
"inputs": {
"wildcard": [
"52",
0
],
"Select to add LoRA": "Select the LoRA to add to the text",
"Select to add Wildcard": "Select the Wildcard to add to the text",
"basic_pipe": [
"35",
0
],
"bbox_detector": [
"24",
0
],
"sam_model_opt": [
"25",
0
],
"segm_detector_opt": [
"24",
1
]
},
"class_type": "BasicPipeToDetailerPipe",
"_meta": {
"title": "BasicPipe -> DetailerPipe"
}
},
"39": {
"inputs": {
"guide_size": 1024,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": 8,
"cfg": 3,
"sampler_name": "<%= it.sampler || 'dpmpp_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.45000000000000007,
"feather": 10,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"refiner_ratio": 0.2,
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"11",
0
],
"detailer_pipe": [
"55",
0
]
},
"class_type": "FaceDetailerPipe",
"_meta": {
"title": "FaceDetailer (pipe)"
}
},
"40": {
"inputs": {
"wildcard": [
"59",
0
],
"Select to add LoRA": "Select the LoRA to add to the text",
"Select to add Wildcard": "Select the Wildcard to add to the text",
"basic_pipe": [
"35",
0
],
"bbox_detector": [
"22",
0
],
"sam_model_opt": [
"21",
0
],
"segm_detector_opt": [
"20",
1
]
},
"class_type": "BasicPipeToDetailerPipe",
"_meta": {
"title": "BasicPipe -> DetailerPipe"
}
},
"42": {
"inputs": {
"guide_size": 1024,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": 8,
"cfg": 3,
"sampler_name": "<%= it.sampler || 'dpmpp_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.45000000000000007,
"feather": 10,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"refiner_ratio": 0.2,
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"39",
0
],
"detailer_pipe": [
"43",
0
]
},
"class_type": "FaceDetailerPipe",
"_meta": {
"title": "FaceDetailer (pipe)"
}
},
"43": {
"inputs": {
"wildcard": "",
"Select to add LoRA": "Select the LoRA to add to the text",
"Select to add Wildcard": "Select the Wildcard to add to the text",
"basic_pipe": [
"35",
0
],
"bbox_detector": [
"45",
0
],
"sam_model_opt": [
"25",
0
],
"segm_detector_opt": [
"45",
1
]
},
"class_type": "BasicPipeToDetailerPipe",
"_meta": {
"title": "BasicPipe -> DetailerPipe"
}
},
"44": {
"inputs": {
"images": [
"42",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"45": {
"inputs": {
"max_faces": 10,
"face": false,
"mouth": false,
"left_eyebrow": false,
"left_eye": true,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": true,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"46": {
"inputs": {
"images": [
"42",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"47": {
"inputs": {
"images": [
"42",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"48": {
"inputs": {
"images": [
"42",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"49": {
"inputs": {
"string": "<%= it.prompt %>"
},
"class_type": "Simple String",
"_meta": {
"title": "Simple String"
}
},
"52": {
"inputs": {
"text1": "The face of",
"text2": [
"49",
0
],
"operation": "text1 + text2 to output1, text1 + text2 to output2",
"delimiter": " ",
"use_seed": "false",
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "TextCombinations",
"_meta": {
"title": "Text Combinations 2 (Mikey)"
}
},
"55": {
"inputs": {
"wildcard": "",
"Select to add LoRA": "Select the LoRA to add to the text",
"Select to add Wildcard": "Select the Wildcard to add to the text",
"detailer_pipe": [
"37",
0
],
"positive": [
"56",
0
]
},
"class_type": "EditDetailerPipe",
"_meta": {
"title": "Edit DetailerPipe"
}
},
"56": {
"inputs": {
"text": [
"52",
0
],
"clip": [
"17",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Positive Prompt"
}
},
"58": {
"inputs": {
"wildcard": "",
"Select to add LoRA": "Select the LoRA to add to the text",
"Select to add Wildcard": "Select the Wildcard to add to the text",
"detailer_pipe": [
"40",
0
],
"positive": [
"60",
0
]
},
"class_type": "EditDetailerPipe",
"_meta": {
"title": "Edit DetailerPipe"
}
},
"59": {
"inputs": {
"text1": "The hand of",
"text2": [
"49",
0
],
"operation": "text1 + text2 to output1, text1 + text2 to output2",
"delimiter": " ",
"use_seed": "false",
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "TextCombinations",
"_meta": {
"title": "Text Combinations 2 (Mikey)"
}
},
"60": {
"inputs": {
"text": [
"59",
0
],
"clip": [
"17",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Positive Prompt"
}
}
}

View File

@ -0,0 +1,164 @@
{
"1": {
"inputs": {
"text": "<%= it.negativePrompt ||'bad ugly jpeg artifacts' %>",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Negative Prompt"
}
},
"2": {
"inputs": {
"vae_name": "HiDream-ae.safetensors"
},
"class_type": "VAELoader",
"_meta": {
"title": "Load VAE"
}
},
"4": {
"inputs": {
"unet_name": "hidreamI1FP8Uncensored_fullV02AlphaNude.safetensors",
"weight_dtype": "default"
},
"class_type": "UNETLoader",
"_meta": {
"title": "Load Diffusion Model"
}
},
"5": {
"inputs": {
"shift": 3,
"model": [
"4",
0
]
},
"class_type": "ModelSamplingSD3",
"_meta": {
"title": "ModelSamplingSD3"
}
},
"6": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 30 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1,
"model": [
"5",
0
],
"positive": [
"10",
0
],
"negative": [
"1",
0
],
"latent_image": [
"11",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"7": {
"inputs": {
"samples": [
"6",
0
],
"vae": [
"2",
0
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"8": {
"inputs": {
"images": [
"7",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"9": {
"inputs": {
"filename_prefix": "HiDream_uncen_",
"images": [
"7",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"10": {
"inputs": {
"text": "<%= it.prompt %>",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Positive Prompt"
}
},
"11": {
"inputs": {
"batch_size": <%= it.batchSize || 1 %>,
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"12": {
"inputs": {
"clip_name": "llama_3.1_8b_instruct_abli.safetensors",
"type": "hidream",
"device": "default"
},
"class_type": "CLIPLoader",
"_meta": {
"title": "Load CLIP"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"7",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}

View File

@ -0,0 +1,164 @@
{
"1": {
"inputs": {
"text": "<%= it.negativePrompt ||'bad ugly jpeg artifacts' %>",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Negative Prompt"
}
},
"2": {
"inputs": {
"vae_name": "HiDream-ae.safetensors"
},
"class_type": "VAELoader",
"_meta": {
"title": "Load VAE"
}
},
"4": {
"inputs": {
"unet_name": "hidreamI1FP8Uncensored_fullV02AlphaNude.safetensors",
"weight_dtype": "default"
},
"class_type": "UNETLoader",
"_meta": {
"title": "Load Diffusion Model"
}
},
"5": {
"inputs": {
"shift": 3,
"model": [
"4",
0
]
},
"class_type": "ModelSamplingSD3",
"_meta": {
"title": "ModelSamplingSD3"
}
},
"6": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 30 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || "euler" %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1,
"model": [
"5",
0
],
"positive": [
"10",
0
],
"negative": [
"1",
0
],
"latent_image": [
"11",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"7": {
"inputs": {
"samples": [
"6",
0
],
"vae": [
"2",
0
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"8": {
"inputs": {
"images": [
"7",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"9": {
"inputs": {
"filename_prefix": "HiDream_uncen_",
"images": [
"7",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"10": {
"inputs": {
"text": "<%= it.prompt %>",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "Positive Prompt"
}
},
"11": {
"inputs": {
"batch_size": <%= it.batchSize || 1 %>,
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"12": {
"inputs": {
"clip_name": "llama_3.1_8b_instruct_fp8_scaled.safetensors",
"type": "hidream",
"device": "default"
},
"class_type": "CLIPLoader",
"_meta": {
"title": "Load CLIP"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"7",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}

View File

@ -0,0 +1,889 @@
{
"1": {
"inputs": {
"samples": [
"27",
0
],
"vae": [
"31",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"2": {
"inputs": {
"text_0": "<%= it.prompt %>",
"text": [
"30",
2
]
},
"class_type": "ShowText|pysssss",
"_meta": {
"title": "Show Text 🐍"
}
},
"3": {
"inputs": {
"images": [
"1",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"4": {
"inputs": {
"images": [
"25",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"5": {
"inputs": {
"images": [
"25",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"6": {
"inputs": {
"images": [
"26",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"7": {
"inputs": {
"images": [
"26",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"8": {
"inputs": {
"images": [
"26",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"9": {
"inputs": {
"images": [
"26",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"10": {
"inputs": {
"images": [
"25",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"11": {
"inputs": {
"images": [
"25",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"14": {
"inputs": {
"model_name": "bbox/hand_yolov8s.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"15": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"16": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"17": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": false,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": false,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"18": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"19": {
"inputs": {
"batch_size": 1,
"seed": [
"22",
0
]
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"20": {
"inputs": {
"text": [
"30",
2
],
"clip": [
"30",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"21": {
"inputs": {
"text": [
"29",
0
],
"clip": [
"30",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"22": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "Seed Everywhere",
"_meta": {
"title": "Seed Everywhere"
}
},
"23": {
"inputs": {
"prompt": "<%= it.prompt %>",
"seed": [
"22",
0
]
},
"class_type": "Wildcard Processor",
"_meta": {
"title": "wildcard processor(Pos prompt)"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"26",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
},
"25": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps":<%= it.steps || 28 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'euler_ancestral' %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 0.0001,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"1",
0
],
"model": [
"30",
0
],
"clip": [
"30",
1
],
"vae": [
"31",
2
],
"positive": [
"20",
0
],
"negative": [
"21",
0
],
"bbox_detector": [
"17",
0
],
"sam_model_opt": [
"18",
0
],
"segm_detector_opt": [
"17",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"26": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps":<%= it.steps || 28 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'euler_ancestral' %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"43",
0
],
"model": [
"30",
0
],
"clip": [
"30",
1
],
"vae": [
"31",
2
],
"positive": [
"53",
0
],
"negative": [
"21",
0
],
"bbox_detector": [
"14",
0
],
"sam_model_opt": [
"15",
0
],
"segm_detector_opt": [
"16",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"27": {
"inputs": {
"seed": [
"22",
0
],
"steps":<%= it.steps || 28 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'euler_ancestral' %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1,
"model": [
"30",
0
],
"positive": [
"20",
0
],
"negative": [
"21",
0
],
"latent_image": [
"19",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"28": {
"inputs": {
"filename_prefix": "plant_milk_",
"images": [
"26",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"29": {
"inputs": {
"text": "<%= it.negativePrompt || 'embedding:lazyhand, embedding:lazyneg, bad quality, worst quality, lowres, jpeg artifacts, bad anatomy, bad hands, multiple views, signature, watermark, censored, ugly, messy' %>"
},
"class_type": "Text Multiline",
"_meta": {
"title": "Negative"
}
},
"30": {
"inputs": {
"text": [
"23",
0
],
"model": [
"31",
0
],
"clip": [
"31",
1
]
},
"class_type": "LoraTagLoader",
"_meta": {
"title": "Load LoRA Tag"
}
},
"31": {
"inputs": {
"ckpt_name": "plantMilkModelSuite_walnut.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"33": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps":<%= it.steps || 28 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'euler_ancestral' %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 0.35000000000000003,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"25",
0
],
"model": [
"30",
0
],
"clip": [
"30",
1
],
"vae": [
"31",
2
],
"positive": [
"20",
0
],
"negative": [
"21",
0
],
"bbox_detector": [
"34",
0
],
"sam_model_opt": [
"18",
0
],
"segm_detector_opt": [
"34",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"34": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": true,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": true,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"35": {
"inputs": {
"images": [
"33",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"36": {
"inputs": {
"images": [
"33",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"37": {
"inputs": {
"images": [
"33",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"38": {
"inputs": {
"images": [
"33",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"39": {
"inputs": {
"text": [
"40",
0
],
"clip": [
"30",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"40": {
"inputs": {
"prompt": "(perfect hands)",
"seed": [
"22",
0
]
},
"class_type": "Wildcard Processor",
"_meta": {
"title": "wildcard processor(Pos prompt)"
}
},
"41": {
"inputs": {
"prompt": "face",
"seed": [
"22",
0
]
},
"class_type": "Wildcard Processor",
"_meta": {
"title": "wildcard processor(Pos prompt)"
}
},
"42": {
"inputs": {
"text": [
"41",
0
],
"clip": [
"30",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"43": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps":<%= it.steps || 28 %>,
"cfg": <%= it.cfg || 5 %>,
"sampler_name": "<%= it.sampler || 'euler_ancestral' %>",
"scheduler": "<%= it.scheduler || 'beta' %>",
"denoise": 1,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"33",
0
],
"model": [
"30",
0
],
"clip": [
"30",
1
],
"vae": [
"31",
2
],
"positive": [
"51",
0
],
"negative": [
"21",
0
],
"bbox_detector": [
"44",
0
],
"sam_model_opt": [
"49",
0
],
"segm_detector_opt": [
"50",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"44": {
"inputs": {
"model_name": "bbox/face_yolov8m.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"45": {
"inputs": {
"images": [
"43",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"46": {
"inputs": {
"images": [
"43",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"47": {
"inputs": {
"images": [
"43",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"48": {
"inputs": {
"images": [
"43",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"49": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"50": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"51": {
"inputs": {
"conditioning1": [
"42",
0
],
"conditioning2": [
"20",
0
]
},
"class_type": "ImpactCombineConditionings",
"_meta": {
"title": "Combine Conditionings"
}
},
"53": {
"inputs": {
"conditioning_1": [
"39",
0
],
"conditioning_2": [
"20",
0
]
},
"class_type": "ConditioningCombine",
"_meta": {
"title": "Conditioning (Combine)"
}
},
"54": {
"inputs": {
"text_0": "embedding:lazyhand, embedding:lazyneg, bad quality, worst quality, lowres, jpeg artifacts, bad anatomy, bad hands, multiple views, signature, watermark, censored, ugly, messy",
"text": [
"29",
0
]
},
"class_type": "ShowText|pysssss",
"_meta": {
"title": "Show Text 🐍"
}
}
}

View File

@ -0,0 +1,533 @@
{
"6": {
"inputs": {
"ckpt_name": "ponyRealism_V23.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"7": {
"inputs": {
"text": "<%= it.negativePrompt || 'score_4_up, score_5_up, worst quality,bad quality,very displeasing,extra digit,fewer digits,jpeg artifacts,signature,username,reference,mutated,lineup,manga,comic,disembodied,turnaround,2koma,4koma,cropped,amputee,text,bad foreshortening,what,logo,bad anatomy,bad perspective,bad proportions,artistic error,anatomical nonsense,amateur,out of frame,multiple views, non detailed eyes' %>"
},
"class_type": "Text Multiline",
"_meta": {
"title": "Negative"
}
},
"8": {
"inputs": {
"prompt": "<%= it.prompt %>",
"seed": [
"9",
0
]
},
"class_type": "Wildcard Processor",
"_meta": {
"title": "wildcard processor(Pos prompt)"
}
},
"9": {
"inputs": {
"seed": <%= it.seed || it.randomSeed() %>
},
"class_type": "Seed Everywhere",
"_meta": {
"title": "Seed Everywhere"
}
},
"12": {
"inputs": {
"seed": [
"9",
0
],
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 6 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 1,
"model": [
"16",
0
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"latent_image": [
"23",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"13": {
"inputs": {
"samples": [
"12",
0
],
"vae": [
"6",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"16": {
"inputs": {
"text": [
"8",
0
],
"model": [
"25",
0
],
"clip": [
"25",
1
]
},
"class_type": "LoraTagLoader",
"_meta": {
"title": "Load LoRA Tag"
}
},
"17": {
"inputs": {
"text": [
"16",
2
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"18": {
"inputs": {
"stop_at_clip_layer": -2,
"clip": [
"16",
1
]
},
"class_type": "CLIPSetLastLayer",
"_meta": {
"title": "CLIP Set Last Layer"
}
},
"19": {
"inputs": {
"text": [
"7",
0
],
"clip": [
"18",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"21": {
"inputs": {
"images": [
"13",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"22": {
"inputs": {
"filename_prefix": "pony_realism",
"images": [
"33",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"23": {
"inputs": {
"batch_size": 1,
"seed": [
"9",
0
]
},
"class_type": "RandomEmptyLatentImageFromPresetsSDXL",
"_meta": {
"title": "Random Empty Latent Image From Presets (SDXL)"
}
},
"24": {
"inputs": {
"text": [
"8",
0
],
"text2": "<%= it.prompt %>"
},
"class_type": "ShowText|pysssss",
"_meta": {
"title": "Show Text 🐍"
}
},
"25": {
"inputs": {
"lora_name": "zy_Realism_Enhancer_v2.safetensors",
"strength_model": 0.9000000000000001,
"strength_clip": 0.9000000000000001,
"model": [
"6",
0
],
"clip": [
"6",
1
]
},
"class_type": "LoraLoader",
"_meta": {
"title": "Load LoRA"
}
},
"26": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"27": {
"inputs": {
"max_faces": 10,
"face": true,
"mouth": false,
"left_eyebrow": false,
"left_eye": false,
"left_pupil": false,
"right_eyebrow": false,
"right_eye": false,
"right_pupil": false
},
"class_type": "MediaPipeFaceMeshDetectorProvider //Inspire",
"_meta": {
"title": "MediaPipeFaceMesh Detector Provider"
}
},
"28": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 6 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.35000000000000003,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"13",
0
],
"model": [
"16",
0
],
"clip": [
"18",
0
],
"vae": [
"6",
2
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"bbox_detector": [
"27",
0
],
"sam_model_opt": [
"26",
0
],
"segm_detector_opt": [
"27",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"30": {
"inputs": {
"images": [
"28",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"31": {
"inputs": {
"images": [
"28",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"32": {
"inputs": {
"images": [
"28",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"33": {
"inputs": {
"guide_size": 512,
"guide_size_for": true,
"max_size": 1024,
"seed": <%= it.seed || it.randomSeed() %>,
"steps": <%= it.steps || 40 %>,
"cfg": <%= it.cfg || 6 %>,
"sampler_name": "<%= it.sampler || 'dpmpp_2m_sde_gpu' %>",
"scheduler": "<%= it.scheduler || 'karras' %>",
"denoise": 0.35000000000000003,
"feather": 5,
"noise_mask": true,
"force_inpaint": true,
"bbox_threshold": 0.5,
"bbox_dilation": 10,
"bbox_crop_factor": 3,
"sam_detection_hint": "center-1",
"sam_dilation": 0,
"sam_threshold": 0.93,
"sam_bbox_expansion": 0,
"sam_mask_hint_threshold": 0.7,
"sam_mask_hint_use_negative": "False",
"drop_size": 10,
"wildcard": "",
"cycle": 1,
"inpaint_model": false,
"noise_mask_feather": 20,
"tiled_encode": false,
"tiled_decode": false,
"image": [
"28",
0
],
"model": [
"16",
0
],
"clip": [
"18",
0
],
"vae": [
"6",
2
],
"positive": [
"17",
0
],
"negative": [
"19",
0
],
"bbox_detector": [
"39",
0
],
"sam_model_opt": [
"40",
0
],
"segm_detector_opt": [
"41",
1
]
},
"class_type": "FaceDetailer",
"_meta": {
"title": "FaceDetailer"
}
},
"34": {
"inputs": {
"images": [
"33",
5
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"35": {
"inputs": {
"images": [
"33",
2
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"36": {
"inputs": {
"images": [
"33",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"37": {
"inputs": {
"images": [
"33",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"38": {
"inputs": {
"images": [
"28",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"39": {
"inputs": {
"model_name": "bbox/hand_yolov8s.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"40": {
"inputs": {
"model_name": "sam_vit_h_4b8939.pth",
"device_mode": "Prefer GPU"
},
"class_type": "SAMLoader",
"_meta": {
"title": "SAMLoader (Impact)"
}
},
"41": {
"inputs": {
"model_name": "segm/person_yolov8m-seg.pt"
},
"class_type": "UltralyticsDetectorProvider",
"_meta": {
"title": "UltralyticsDetectorProvider"
}
},
"save_image_websocket_node": {
"inputs": {
"images": [
"33",
0
]
},
"class_type": "SaveImageWebsocket",
"_meta": {
"title": "SaveImageWebsocket"
}
}
}