├── .github └── workflows │ └── publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── __init__.py ├── assets ├── icon.png └── outputs │ ├── sample_01.jpg │ ├── sample_02.jpg │ └── sample_03.jpg ├── config ├── models.yml └── prompt_templates.yml ├── pyproject.toml ├── requirements.txt ├── src ├── __init__.py ├── config.py ├── js │ └── print_string.js ├── models │ ├── __init__.py │ ├── utils.py │ └── v2408.py ├── nodes │ ├── __init__.py │ ├── auto_aspect_ratio_tag.py │ ├── ban_tags.py │ ├── extractor.py │ ├── formatter.py │ ├── generation_config.py │ ├── generator.py │ ├── load_model.py │ ├── pipeline.py │ ├── type.py │ └── utils │ │ ├── concat_string.py │ │ ├── print_string.py │ │ └── text_input.py └── tags.py ├── tags └── ban_template │ ├── BAN_TAGS_LIST_HERE │ ├── all_text.txt │ ├── alternate_attire.txt │ ├── major_concepts.txt │ ├── military.txt │ └── year.txt ├── uv.lock └── workflows ├── Manual_Translation+Extension.json ├── Translation+Extension+Image_Generation.json └── Translation+Extension.json /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to Comfy registry 2 | on: 3 | workflow_dispatch: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - "pyproject.toml" 9 | 10 | permissions: 11 | issues: write 12 | 13 | jobs: 14 | publish-node: 15 | name: Publish Custom Node to registry 16 | runs-on: ubuntu-latest 17 | if: ${{ github.repository_owner == 'p1atdev' }} 18 | steps: 19 | - name: Check out code 20 | uses: actions/checkout@v4 21 | - name: Publish Custom Node 22 | uses: Comfy-Org/publish-node-action@v1 23 | with: 24 | personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 110 | .pdm.toml 111 | .pdm-python 112 | .pdm-build/ 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | #.idea/ 163 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # danbot-comfy-node 2 | 3 | Danbooru Tags Translator for ComfyUI. 4 | This custom node allows you to convert natural language prompts in Japanese and English into Danbooru tags. 5 | 6 | ## Installation 7 | 8 | ### Manual Installation 9 | 10 | ```bash 11 | # activate your python env 12 | cd custom_nodes 13 | git clone https://github.com/p1atdev/danbot-comfy-node 14 | cd danbot-comfy-node 15 | pip install -r requirements.txt 16 | ``` 17 | 18 | If you are using portable ComfyUI, use `your/ComfyUI_windows_portable/python_embeded/python.exe -s -m pip` intead of `pip`. For example: 19 | 20 | ```bash 21 | cd custom_nodes 22 | git clone https://github.com/p1atdev/danbot-comfy-node 23 | cd danbot-comfy-node 24 | ../../../python_embeded/python.exe -s -m pip install -r requirements.txt 25 | ``` 26 | 27 | ### ComfyUI Registry 28 | 29 | ``` 30 | comfy node registry-install danbot-comfy-node 31 | ``` 32 | 33 | ## Example Workflows 34 | 35 | See [workflows directory](./workflows). 36 | 37 | | Filename | Description | 38 | | - | - | 39 | | [Translation+Extension.json](./workflows/Translation+Extension.json) | Example workflow of translating and extending Danbooru tags from a Japanese prompt. | 40 | | [Translation+Extension+Image_Generation.json](./workflows/Translation+Extension+Image_Generation.json) | Example workflow of translating and extending Danbooru tags from a Japanese prompt, and then generating an image using AnimagineXL 4.0. | 41 | 42 | ## Example Outputs 43 | 44 | | Input prompt | Translated tags | Extended tags | Generated image | 45 | | - | - | - | - | 46 | | `猫耳で黒髪ロング、制服を着ており、目は黄色の少女。背景はハーフトーンのついた青で、白枠が付いている。ソファーに座って足を組みながらこっちを見ている。` | `1girl, solo, blue background, halftone background, looking at viewer, animal ears, school uniform, yellow eyes, black hair, long hair, sitting, crossed legs, cat ears, border, halftone, white border, couch` | `shirt, skirt, closed mouth, very long hair, short sleeves, white shirt, full body, black skirt, pleated skirt, black footwear, collared shirt, socks, black socks, outside border` | | 47 | | `ピクセルアート。猫耳の女の子がダンボール箱に入っている。chibi。青と白の二色の髪色。パーカーを着ている。` | `1girl, multicolored hair, blue hair, white hair, two-tone hair, chibi, cat girl, hoodie, hood, box, pixel art, in container, in box` | `solo, long sleeves, animal ears, very long hair, sleeves past wrists, sleeves past fingers, blue eyes, long hair, full body, cat ears, chibi only, tail, cat tail, cardboard box` | | 48 | | `VOICEVOXのずんだもんと東北きりたんが東京の街中で立っている。写真の背景。全身が写ってる。笑顔。` | `voiceroid, voicevox, touhoku kiritan, zundamon, 2girls, multiple girls, photo background, smile, standing, full body, road, street` | `photo background, photo-referenced, open mouth, shirt, long sleeves, closed mouth, orange eyes, brown hair, green hair, ahoge, short sleeves, medium hair, white shirt, hands on own hips, looking at another, black footwear, half-closed eyes, closed eyes, t-shirt, layered sleeves, short over long sleeves, japanese clothes, kimono, sash, socks, white socks, green shorts, shorts, white kimono, headgear, obi, lamppost, green overalls` | | 49 | 50 |
51 | Generation settings 52 | 53 | - Prompt generation 54 | - Translation 55 | - rating: `general` 56 | - length: `very_short` 57 | - template_name: `translation` 58 | - Extension 59 | - rating: `general` 60 | - length: `long` 61 | - template_name: `extension` 62 | - Generation config 63 | - max_new_tokens: `256` 64 | - do_sample: `true` 65 | - temperature: `1.00` 66 | - top_p: `1.0` 67 | - top_k: `50` 68 | - min_p: `0.05` 69 | - num_beams: `1` 70 | - Seed: 347414205 71 | - Image generation 72 | - Image model: [AnimagineXL 4.0 opt](https://huggingface.co/cagliostrolab/animagine-xl-4.0/blob/main/animagine-xl-4.0-opt.safetensors) 73 | - Prompt suffix (quality tags): `masterpiece, best quality, high score, great score, latest` 74 | - Negative prompt: `lowres, bad anatomy, bad hands, text, error, missing finger, extra digits, fewer digits, cropped, worst quality, low quality, low score, bad score, average score, signature, watermark, username, blurry, ` 75 | - Image size: 1024x1024 76 | - Seed: `944162813372176` 77 | - Steps: `25` 78 | - CFG: `5.0` 79 | - Sampler name: `euler_ancestral` 80 | - Scheduler: `normal` 81 | - Denoise: `1.00` 82 | 83 |
84 | 85 | ## Available models 86 | 87 | | Model name | Knowledge cutoff | Param size | 88 | | - | - | - | 89 | | [🤗 DanbotNL 2408 260M](https://huggingface.co/dartags/DanbotNL-2408-260M)| 2024/8/31 | 262M | 90 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | from .src import nodes 2 | 3 | NODE_CLASS_MAPPINGS = { 4 | "DanbotLoadModel": nodes.LoadModelNode, 5 | "DanbotGeneratorNode": nodes.GeneratorNode, 6 | "DanbotGenerationConfig": nodes.GenerationConfigNode, 7 | "DanbotTranslationExtractorNode": nodes.TranslationExtractorNode, 8 | "DanbotEtensionExtractorNode": nodes.ExtensionExtractorNode, 9 | "DanbotLoadBanTagsNode": nodes.LoadBanTagsNode, 10 | # 11 | "DanbotV2408AutoAspectRatioTag": nodes.V2408AutoAspectRatioTagNode, 12 | "DanbotV2408PipelineNode": nodes.V2408PipelineNode, 13 | # 14 | "DanbotV2408TemplateConfigNode": nodes.V2408TemplateConfigNode, 15 | "DanbotV2408FormatterNode": nodes.V2408FormatterNode, 16 | # 17 | "DanbotUtilsPrintString": nodes.PrintStringNode, 18 | "DanbotUtilsConcatString": nodes.ConcatStringNode, 19 | "DanbotUtilsTextInput": nodes.TextInputNode, 20 | } 21 | 22 | NODE_DISPLAY_NAME_MAPPINGS = { 23 | "DanbotLoadModel": "Danbot Load Model", 24 | "DanbotGeneratorNode": "Danbot Generator", 25 | "DanbotGenerationConfig": "Danbot Generation Config", 26 | "DanbotTranslationExtractorNode": "Danbot Translation Extractor", 27 | "DanbotEtensionExtractorNode": "Danbot Extension Extractor", 28 | "DanbotLoadBanTagsNode": "Danbot Load Ban Tags", 29 | # 30 | "DanbotV2408AutoAspectRatioTag": "Danbot V2408 Auto Aspect Ratio Tag", 31 | "DanbotV2408PipelineNode": "Danbot V2408 Pipeline", 32 | # 33 | "DanbotV2408TemplateConfigNode": "Danbot V2408 Template Config", 34 | "DanbotV2408FormatterNode": "Danbot V2408 Formatter", 35 | # 36 | "DanbotUtilsPrintString": "Danbot Print String", 37 | "DanbotUtilsConcatString": "Danbot Concat String", 38 | "DanbotUtilsEscapeBrackets": "Danbot Escape Brackets", 39 | "DanbotUtilsTextInput": "Danbot Text Input", 40 | } 41 | 42 | WEB_DIRECTORY = "./src/js" 43 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p1atdev/danbot-comfy-node/175f9ba48453af5922f5a513e100ca18e7a92c0d/assets/icon.png -------------------------------------------------------------------------------- /assets/outputs/sample_01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p1atdev/danbot-comfy-node/175f9ba48453af5922f5a513e100ca18e7a92c0d/assets/outputs/sample_01.jpg -------------------------------------------------------------------------------- /assets/outputs/sample_02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p1atdev/danbot-comfy-node/175f9ba48453af5922f5a513e100ca18e7a92c0d/assets/outputs/sample_02.jpg -------------------------------------------------------------------------------- /assets/outputs/sample_03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p1atdev/danbot-comfy-node/175f9ba48453af5922f5a513e100ca18e7a92c0d/assets/outputs/sample_03.jpg -------------------------------------------------------------------------------- /config/models.yml: -------------------------------------------------------------------------------- 1 | ### 2408 models 2 | 3 | - name: DanbotNL 2408 260M 4 | version: v2408 5 | prompt_template_id: v2408 6 | model_name_or_path: dartags/DanbotNL-2408-260M 7 | trust_remote_code: true 8 | -------------------------------------------------------------------------------- /config/prompt_templates.yml: -------------------------------------------------------------------------------- 1 | # newlines are removed when loading 2 | 3 | v2408-dev: 4 | translation: |- 5 | <|bos|> 6 | {rating}{aspect_ratio}{length} 7 | <|reserved_2|><|reserved_3|><|reserved_4|> 8 | <|translate:exact|><|input_end|> 9 | 10 | 11 | extension: |- 12 | <|bos|> 13 | {rating}{aspect_ratio}{length} 14 | <|reserved_2|><|reserved_3|><|reserved_4|> 15 | <|translate:approx|><|input_end|> 16 | {copyright} 17 | {character} 18 | 19 | <|reserved_5|>{translation}<|reserved_6|> 20 | <|reserved_7|> 21 | 22 | v2408: 23 | translation: |- 24 | <|bos|> 25 | {rating}{aspect_ratio}{length} 26 | <|text|> 27 | <|translate:exact|><|input_end|> 28 | 29 | 30 | extension: |- 31 | <|bos|> 32 | {rating}{aspect_ratio}{length} 33 | <|text|> 34 | <|translate:approx|><|input_end|> 35 | {copyright} 36 | {character} 37 | 38 | {translation} 39 | 40 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "danbot-comfy-node" 3 | description = "Translate and extend danbooru tags using Danbot models." 4 | version = "0.1.1" 5 | license = { file = "LICENSE" } 6 | dependencies = [ 7 | "protobuf>=6.30.1", 8 | "sentencepiece>=0.2.0", 9 | "transformers>=4.49.0", 10 | ] 11 | 12 | [project.urls] 13 | Repository = "https://github.com/p1atdev/danbot-comfy-node" 14 | # Used by Comfy Registry https://comfyregistry.org 15 | 16 | [tool.comfy] 17 | PublisherId = "p1atdev" 18 | DisplayName = "danbot-comfy-node" 19 | Icon = "https://raw.githubusercontent.com/p1atdev/danbot-comfy-node/refs/heads/main/assets/icon.png" 20 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | protobuf 2 | sentencepiece 3 | transformers>=4.49.0 4 | -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p1atdev/danbot-comfy-node/175f9ba48453af5922f5a513e100ca18e7a92c0d/src/__init__.py -------------------------------------------------------------------------------- /src/config.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pathlib import Path 3 | import yaml 4 | from dataclasses import dataclass 5 | 6 | from .models import ( 7 | ModelWrapper, 8 | MODEL_VERSIONS, 9 | MODEL_VERSION_TO_CLASS, 10 | ) 11 | 12 | SELF_PATH_DIR = Path(os.path.dirname(os.path.abspath(__file__))) 13 | CONFIG_ROOT_DIR = SELF_PATH_DIR / ".." / "config" 14 | 15 | MODELS_CONFIG_FILE_PATH = CONFIG_ROOT_DIR / "models.yml" 16 | PROMPT_TEMPLATE_CONFIG_FILE_PATH = CONFIG_ROOT_DIR / "prompt_templates.yml" 17 | 18 | 19 | @dataclass 20 | class ModelConfig: 21 | version: MODEL_VERSIONS 22 | prompt_template_id: str 23 | 24 | data: dict[str, str] 25 | 26 | def load_model(self) -> ModelWrapper: 27 | model_cls = MODEL_VERSION_TO_CLASS[self.version] 28 | prompt_templates = load_prompt_templates() 29 | prompt_template = prompt_templates[self.prompt_template_id] 30 | return model_cls(prompt_templates=prompt_template, **self.data) 31 | 32 | 33 | # id: dict[name, template] pair 34 | PromptTemplates = dict[str, dict[str, str]] 35 | 36 | 37 | def load_models_configs() -> dict[str, ModelConfig]: 38 | with open(MODELS_CONFIG_FILE_PATH, "r") as file: 39 | models_configs: list[dict] = yaml.safe_load(file) 40 | 41 | return { 42 | model_config.pop("name"): ModelConfig( 43 | version=model_config.pop("version"), 44 | prompt_template_id=model_config.pop("prompt_template_id"), 45 | data=model_config, 46 | ) 47 | for model_config in models_configs 48 | } 49 | 50 | 51 | def load_prompt_templates() -> PromptTemplates: 52 | with open(PROMPT_TEMPLATE_CONFIG_FILE_PATH, "r") as file: 53 | config: dict[str, dict[str, str]] = yaml.safe_load(file) 54 | 55 | # remove all newlines 56 | return { 57 | id: {name: template.replace("\n", "") for name, template in templates.items()} 58 | for id, templates in config.items() 59 | } 60 | -------------------------------------------------------------------------------- /src/js/print_string.js: -------------------------------------------------------------------------------- 1 | // originally written by pythongosssss: 2 | // https://github.com/pythongosssss/ComfyUI-Custom-Scripts/blob/626e001a20c4a6ad8f987153538d7ff750cb2850/web/js/showText.js 3 | 4 | import { app } from "../../../scripts/app.js"; 5 | import { ComfyWidgets } from "../../../scripts/widgets.js"; 6 | 7 | // Displays input text on a node 8 | app.registerExtension({ 9 | name: "danbot-comfy-node.PrintString", 10 | async beforeRegisterNodeDef(nodeType, nodeData, app) { 11 | if (nodeData.name === "DanbotUtilsPrintString") { 12 | function populate(text) { 13 | if (this.widgets) { 14 | for (let i = 1; i < this.widgets.length; i++) { 15 | this.widgets[i].onRemove?.(); 16 | } 17 | this.widgets.length = 1; 18 | } 19 | 20 | const v = [...text]; 21 | if (!v[0]) { 22 | v.shift(); 23 | } 24 | for (const list of v) { 25 | const w = ComfyWidgets["STRING"](this, "text2", ["STRING", { multiline: true }], app).widget; 26 | w.inputEl.readOnly = true; 27 | w.inputEl.style.opacity = 0.6; 28 | w.value = list; 29 | } 30 | 31 | requestAnimationFrame(() => { 32 | const sz = this.computeSize(); 33 | if (sz[0] < this.size[0]) { 34 | sz[0] = this.size[0]; 35 | } 36 | if (sz[1] < this.size[1]) { 37 | sz[1] = this.size[1]; 38 | } 39 | this.onResize?.(sz); 40 | app.graph.setDirtyCanvas(true, false); 41 | }); 42 | } 43 | 44 | // When the node is executed we will be sent the input text, display this in the widget 45 | const onExecuted = nodeType.prototype.onExecuted; 46 | nodeType.prototype.onExecuted = function (message) { 47 | onExecuted?.apply(this, arguments); 48 | populate.call(this, message.text); 49 | }; 50 | 51 | const onConfigure = nodeType.prototype.onConfigure; 52 | nodeType.prototype.onConfigure = function () { 53 | onConfigure?.apply(this, arguments); 54 | if (this.widgets_values?.length) { 55 | populate.call(this, this.widgets_values.slice(+this.widgets_values.length > 1)); 56 | } 57 | }; 58 | } 59 | }, 60 | }); -------------------------------------------------------------------------------- /src/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .v2408 import V2408Model 2 | from .utils import ModelWrapper, MODEL_VERSIONS 3 | 4 | MODEL_VERSION_TO_CLASS: dict[MODEL_VERSIONS, type[ModelWrapper]] = { 5 | "v2408": V2408Model, 6 | } 7 | -------------------------------------------------------------------------------- /src/models/utils.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | from dataclasses import dataclass 3 | from typing import Literal 4 | from enum import Enum 5 | from pathlib import Path 6 | import logging 7 | import re 8 | 9 | import torch 10 | from transformers import ( 11 | GenerationConfig, 12 | PreTrainedTokenizerFast, 13 | ProcessorMixin, 14 | ) 15 | 16 | from comfy.sd1_clip import escape_important, token_weights, unescape_important 17 | from comfy.model_management import get_torch_device_name, get_torch_device 18 | 19 | from ..tags import estimate_rating, RATING_TYPE, load_tags 20 | 21 | MODEL_VERSIONS = Literal["v2408"] 22 | 23 | 24 | @dataclass 25 | class PromptParseResult: 26 | rating: RATING_TYPE 27 | 28 | 29 | class EncoderDecoderTokenizer(ProcessorMixin, ABC): 30 | encoder_tokenizer: PreTrainedTokenizerFast 31 | decoder_tokenizer: PreTrainedTokenizerFast 32 | 33 | 34 | @dataclass 35 | class AbstractTemplateConfig(ABC): 36 | pass 37 | 38 | 39 | class ModelWrapper(ABC): 40 | """ 41 | Wrapper class for dart models 42 | """ 43 | 44 | version: MODEL_VERSIONS 45 | 46 | processor: EncoderDecoderTokenizer 47 | 48 | prompt_templates: dict[str, str] 49 | prompt_templates_default: dict[str, dict[str, str]] 50 | 51 | @abstractmethod 52 | def __init__(self, **kwargs): 53 | raise NotImplementedError 54 | 55 | def _get_device(self) -> torch.device: 56 | return get_torch_device() 57 | 58 | @abstractmethod 59 | def generate( 60 | self, 61 | text_prompt: str, 62 | tag_template: str, 63 | generation_config: GenerationConfig, 64 | **kwargs, 65 | ) -> tuple[str, str, str]: 66 | raise NotImplementedError 67 | 68 | @abstractmethod 69 | def format_prompt(self, template_name: str, format_kwargs: dict[str, str]) -> str: 70 | raise NotImplementedError 71 | 72 | def parse_prompt(self, prompt: str) -> PromptParseResult: 73 | tags = split_tokens(prompt) # split by commas 74 | 75 | rating = estimate_rating(tags) 76 | 77 | return PromptParseResult( 78 | rating=rating, 79 | ) 80 | 81 | def encode_ban_tags(self, ban_tags: str) -> list[list[int]] | None: 82 | # wildcard tags support 83 | tags = [tag.strip() for tag in ban_tags.split(",")] 84 | vocab = self.processor.decoder_tokenizer.get_vocab() 85 | 86 | ban_token_ids: list[list[int]] = [] 87 | for tag in tags: # search tags in vocab 88 | if "*" in tag: 89 | pattern = re.compile(tag.replace("*", ".*")) 90 | for token, _id in vocab.items(): 91 | if pattern.match(token): 92 | ban_token_ids.append([_id]) 93 | else: 94 | if tag in vocab: 95 | ban_token_ids.append([vocab[tag]]) 96 | 97 | if len(ban_token_ids) == 0: 98 | return None 99 | 100 | return ban_token_ids 101 | 102 | def search_tags(self, text: str, pattern: re.Pattern) -> str: 103 | result = pattern.search(text) 104 | if result is None: 105 | return "" 106 | tags = [tag.strip() for tag in result.group(1).split(",") if tag.strip()] 107 | return ", ".join(tags) 108 | 109 | @abstractmethod 110 | def extract_translation_result(self, raw_output: str) -> dict[str, str]: 111 | raise NotImplementedError 112 | 113 | @abstractmethod 114 | def extract_extension_result(self, raw_output: str) -> dict[str, str]: 115 | raise NotImplementedError 116 | 117 | 118 | def unescape_important_all(text: str) -> list[str]: 119 | """ 120 | Remove all emphasis brackets and returns a list of tokens 121 | """ 122 | text = escape_important(text) 123 | parsed_weights: list[tuple[str, float]] = token_weights(text, 1.0) 124 | unescaped_tokens = [] 125 | 126 | for part, _weight in parsed_weights: 127 | tokens = part.split(",") 128 | for token in tokens: 129 | pure_token = token.strip() 130 | if pure_token: 131 | unescaped_tokens.append(unescape_important(pure_token)) 132 | 133 | return unescaped_tokens 134 | 135 | 136 | def split_tokens(text: str, separator: str = ",") -> list[str]: 137 | """ 138 | Split text into tokens without prefix and suffix spaces 139 | """ 140 | return [token.strip() for token in text.split(separator) if token.strip()] 141 | 142 | 143 | def is_flash_attn_available(): 144 | try: 145 | from flash_attn import flash_attn_func # type: ignore 146 | 147 | logging.info("Flash Attention is available") 148 | 149 | return True 150 | except ImportError: 151 | # not installed 152 | return False 153 | except Exception as e: 154 | logging.error(f"Flash Attention is not available: {e}") 155 | return False 156 | -------------------------------------------------------------------------------- /src/models/v2408.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass 2 | from typing import Any, Literal 3 | from abc import ABC 4 | import math 5 | import re 6 | 7 | import torch 8 | 9 | from transformers import ( 10 | AutoModelForPreTraining, 11 | AutoProcessor, 12 | GenerationConfig, 13 | PreTrainedModel, 14 | BatchFeature, 15 | ) 16 | 17 | from .utils import ( 18 | ModelWrapper, 19 | EncoderDecoderTokenizer, 20 | AbstractTemplateConfig, 21 | is_flash_attn_available, 22 | ) 23 | 24 | RATING_MAP = { 25 | "general": "<|rating:general|>", 26 | "sensitive": "<|rating:sensitive|>", 27 | "questionable": "<|rating:questionable|>", 28 | "explicit": "<|rating:explicit|>", 29 | } 30 | 31 | LENGTH_MAP = { 32 | "very_short": "<|length:very_short|>", 33 | "short": "<|length:short|>", 34 | "long": "<|length:long|>", 35 | "very_long": "<|length:very_long|>", 36 | } 37 | 38 | ASPECT_RATIO_MAP = { 39 | "too_tall": "<|aspect_ratio:too_tall|>", 40 | "tall_wallpaper": "<|aspect_ratio:tall_wallpaper|>", 41 | "tall": "<|aspect_ratio:tall|>", 42 | "square": "<|aspect_ratio:square|>", 43 | "wide": "<|aspect_ratio:wide|>", 44 | "wide_wallpaper": "<|aspect_ratio:wide_wallpaper|>", 45 | "too_wide": "<|aspect_ratio:too_wide|>", 46 | } 47 | 48 | INPUT_END = "<|input_end|>" 49 | TRANSLATION_END = "<|reserved_6|>" 50 | EXTENSION_END = "" 51 | 52 | COPYRIGHT_TAGS_PATTERN = re.compile(r"(.*?)") 53 | CHARACTER_TAGS_PATTERN = re.compile(r"(.*?)") 54 | TRANSLATION_TAGS_PATTERN = re.compile(r"(.*?)") 55 | EXTENSION_TAGS_PATTERN = re.compile(r"(.*?)") 56 | 57 | TEMPLATE_NAME = Literal["translation", "extension"] 58 | TEMPLATE_NAMES = ["translation", "extension"] 59 | 60 | 61 | def aspect_ratio_tag( 62 | width: int, 63 | height: int, 64 | ) -> str: 65 | """ 66 | Returns aspect ratio tag based on the aspect ratio of the image. 67 | """ 68 | ar = math.log2(width / height) 69 | 70 | if ar <= -1.25: 71 | return "too_tall" 72 | elif ar <= -0.75: 73 | return "tall_wallpaper" 74 | elif ar <= -0.25: 75 | return "tall" 76 | elif ar < 0.25: 77 | return "square" 78 | elif ar < 0.75: 79 | return "wide" 80 | elif ar < 1.25: 81 | return "wide_wallpaper" 82 | else: 83 | return "too_wide" 84 | 85 | 86 | @dataclass 87 | class TemplateConfig(AbstractTemplateConfig): 88 | aspect_ratio: str 89 | rating: str 90 | length: str 91 | 92 | 93 | class V2408Processor(EncoderDecoderTokenizer, ABC): 94 | def __call__(self, encoder_text: str, decoder_text: str, **kwargs) -> Any: 95 | pass 96 | 97 | 98 | class _Model(PreTrainedModel, ABC): 99 | encoder_model: PreTrainedModel 100 | decoder_model: PreTrainedModel 101 | 102 | 103 | class V2408Model(ModelWrapper): 104 | version = "v2408" 105 | 106 | copyright_tags_pattern = COPYRIGHT_TAGS_PATTERN 107 | character_tags_pattern = CHARACTER_TAGS_PATTERN 108 | 109 | model: _Model 110 | processor: V2408Processor 111 | 112 | prompt_templates: dict[TEMPLATE_NAME, str] 113 | prompt_templates_default: dict[TEMPLATE_NAME, dict[str, str]] = { 114 | "translation": {}, 115 | "extension": { 116 | "copyright": "", 117 | "character": "", 118 | "translation": "", 119 | }, 120 | } 121 | 122 | def __init__( 123 | self, 124 | model_name_or_path: str, 125 | prompt_templates: dict[TEMPLATE_NAME, str], 126 | revision: str | None = None, 127 | trust_remote_code: bool = False, 128 | ): 129 | load_device = self._get_device() 130 | 131 | self.model = AutoModelForPreTraining.from_pretrained( 132 | model_name_or_path, 133 | revision=revision, 134 | torch_dtype=torch.bfloat16, 135 | trust_remote_code=trust_remote_code, 136 | attn_implementation=( 137 | "flash_attention_2" 138 | if (is_flash_attn_available() and load_device.type == "cuda") 139 | else "sdpa" 140 | ), 141 | ) 142 | self.model.to(load_device) # type: ignore 143 | self.model.eval() 144 | self.processor = AutoProcessor.from_pretrained( 145 | model_name_or_path, 146 | revision=revision, 147 | trust_remote_code=trust_remote_code, 148 | ) 149 | self.prompt_templates = prompt_templates 150 | 151 | def format_prompt(self, template_name: str, format_kwargs: dict[str, str]) -> str: 152 | assert template_name in self.prompt_templates, ( 153 | f'Template name "{template_name}" not found.' 154 | ) 155 | return self.prompt_templates[template_name].format(**format_kwargs) 156 | 157 | @torch.inference_mode() 158 | def generate( 159 | self, 160 | text_prompt: str, 161 | tag_template: str, 162 | generation_config: GenerationConfig, 163 | ban_tags: str | None = None, 164 | stop_token: str | None = None, 165 | **kwargs, 166 | ) -> tuple[str, str, str]: 167 | inputs: BatchFeature = self.processor( 168 | encoder_text=text_prompt, 169 | decoder_text=tag_template, 170 | return_tensors="pt", 171 | ).to(self.model.device) 172 | input_ids_len = len(inputs.input_ids[0]) 173 | 174 | ban_token_ids = None 175 | if ban_tags is not None: 176 | ban_token_ids = self.encode_ban_tags(ban_tags) 177 | 178 | stop_token_id = self.processor.decoder_tokenizer.eos_token_id 179 | if stop_token is not None: 180 | stop_token_id = self.processor.decoder_tokenizer( 181 | stop_token, return_tensors="pt" 182 | ).input_ids 183 | 184 | output_ids = self.model.generate( 185 | **inputs, 186 | generation_config=generation_config, 187 | bad_words_ids=ban_token_ids, 188 | eos_token_id=stop_token_id, 189 | pad_token_id=self.processor.decoder_tokenizer.pad_token_id, 190 | )[0] # take the first sequence 191 | output_full = self.decode_ids(output_ids) 192 | output_completion = self.decode_ids(output_ids[input_ids_len:]) 193 | output_raw = self.decode_ids(output_ids, skip_special_tokens=False) 194 | 195 | return (output_full, output_completion, output_raw) 196 | 197 | def decode_ids( 198 | self, 199 | generated_ids: torch.Tensor, # (token_length,) 200 | skip_special_tokens: bool = True, 201 | ) -> str: 202 | # (token_length,) -> (token_length, 1) 203 | generated_ids = generated_ids.unsqueeze(1) 204 | 205 | return ", ".join( 206 | [ 207 | token 208 | for token in self.processor.decoder_tokenizer.batch_decode( 209 | generated_ids, skip_special_tokens=skip_special_tokens 210 | ) 211 | if token.strip() != "" 212 | ] 213 | ) 214 | 215 | def extract_translation_result(self, raw_output: str) -> dict[str, str]: 216 | copyright_tags = self.search_tags(raw_output, self.copyright_tags_pattern) 217 | character_tags = self.search_tags(raw_output, self.character_tags_pattern) 218 | translation_tags = self.search_tags(raw_output, TRANSLATION_TAGS_PATTERN) 219 | 220 | return { 221 | "copyright": copyright_tags, 222 | "character": character_tags, 223 | "translation": translation_tags, 224 | } 225 | 226 | def extract_extension_result(self, raw_output: str) -> dict[str, str]: 227 | extension_tags = self.search_tags(raw_output, EXTENSION_TAGS_PATTERN) 228 | 229 | return {"extension": extension_tags} 230 | -------------------------------------------------------------------------------- /src/nodes/__init__.py: -------------------------------------------------------------------------------- 1 | from .generator import GeneratorNode 2 | from .pipeline import V2408PipelineNode 3 | from .load_model import LoadModelNode 4 | from .auto_aspect_ratio_tag import V2408AutoAspectRatioTagNode 5 | from .generation_config import GenerationConfigNode 6 | from .formatter import V2408FormatterNode, V2408TemplateConfigNode 7 | from .extractor import TranslationExtractorNode, ExtensionExtractorNode 8 | from .ban_tags import LoadBanTagsNode 9 | 10 | from .utils.print_string import PrintStringNode 11 | from .utils.concat_string import ConcatStringNode 12 | from .utils.text_input import TextInputNode 13 | -------------------------------------------------------------------------------- /src/nodes/auto_aspect_ratio_tag.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | 3 | from ..models import v2408 4 | from .type import DANBOT_CATEGORY 5 | 6 | 7 | class AutoAspectRatioTagNodeMixin(ABC): 8 | def __init__(self): 9 | pass 10 | 11 | @classmethod 12 | def INPUT_TYPES(s): 13 | return { 14 | "required": { 15 | "width": ( 16 | "INT", 17 | { 18 | "default": 832, 19 | "step": 32, 20 | "force_input": True, 21 | }, 22 | ), 23 | "height": ( 24 | "INT", 25 | { 26 | "default": 1152, 27 | "step": 32, 28 | "force_input": True, 29 | }, 30 | ), 31 | }, 32 | } 33 | 34 | RETURN_NAMES = ("aspect_ratio_tag", "width", "height") 35 | 36 | FUNCTION = "calculate_aspect_ratio_tag" 37 | 38 | OUTPUT_NODE = False 39 | 40 | CATEGORY = DANBOT_CATEGORY 41 | 42 | @abstractmethod 43 | def calculate_aspect_ratio_tag( 44 | self, 45 | width: int, 46 | height: int, 47 | ): 48 | raise NotImplementedError 49 | 50 | 51 | class V2408AutoAspectRatioTagNode(AutoAspectRatioTagNodeMixin): 52 | DESCRIPTION = ( 53 | "Calculates the aspect ratio tag of an image to generate by v2408 rule." 54 | ) 55 | 56 | EXPERIMENTAL = True 57 | 58 | RETURN_TYPES = ( 59 | list(v2408.ASPECT_RATIO_MAP.keys()), 60 | "INT", 61 | "INT", 62 | ) 63 | OUTPUT_TOOLTIPS = ("Aspect ratio tag for v2408 model", "Width", "Height") 64 | 65 | def calculate_aspect_ratio_tag( 66 | self, 67 | width: int, 68 | height: int, 69 | ): 70 | return (v2408.aspect_ratio_tag(width, height), width, height) 71 | -------------------------------------------------------------------------------- /src/nodes/ban_tags.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pathlib import Path 3 | 4 | from ..tags import TAGS_ROOT_DIR, load_tags, normalize_tag_text 5 | from .type import DANBOT_CATEGORY 6 | 7 | BAN_TEMPLATE_DIR = TAGS_ROOT_DIR / "ban_template" 8 | 9 | 10 | def list_ban_template_files(dir: Path): 11 | files = os.listdir(BAN_TEMPLATE_DIR) 12 | files = [file for file in files if file.endswith(".txt")] 13 | 14 | return files 15 | 16 | 17 | def load_ban_template(file: str): 18 | return load_tags(BAN_TEMPLATE_DIR / file) 19 | 20 | 21 | class LoadBanTagsNode: 22 | def __init__(self): 23 | pass 24 | 25 | @classmethod 26 | def INPUT_TYPES(s): 27 | files = list_ban_template_files(BAN_TEMPLATE_DIR) 28 | 29 | return { 30 | "optional": { 31 | "template_name": (files,), 32 | }, 33 | } 34 | 35 | RETURN_TYPES = ("STRING",) 36 | RETURN_NAMES = ("ban_tags",) 37 | OUTPUT_TOOLTIPS = ("Comma separated tags to ban",) 38 | 39 | FUNCTION = "compose" 40 | 41 | OUTPUT_NODE = False 42 | 43 | CATEGORY = DANBOT_CATEGORY 44 | 45 | def compose( 46 | self, 47 | template: str | None, 48 | ): 49 | tags = load_ban_template(template) if template else [] 50 | 51 | tag_text = normalize_tag_text(",".join(tags)) 52 | 53 | return (tag_text,) 54 | -------------------------------------------------------------------------------- /src/nodes/extractor.py: -------------------------------------------------------------------------------- 1 | from ..models.utils import ModelWrapper 2 | from .type import DANBOT_MODEL_TYPE, FORMAT_KWARGS_DTYPE, DANBOT_CATEGORY 3 | 4 | 5 | class TranslationExtractorNode: 6 | @classmethod 7 | def INPUT_TYPES(s): 8 | return { 9 | "required": { 10 | "danbot_model": (DANBOT_MODEL_TYPE,), 11 | "generated_tags": ( 12 | "STRING", 13 | { 14 | "forceInput": True, 15 | "tooltip": "The tags generated by the model.", 16 | }, 17 | ), 18 | }, 19 | } 20 | 21 | RETURN_TYPES = (FORMAT_KWARGS_DTYPE,) 22 | RETURN_NAMES = ("translation_kwargs",) 23 | OUTPUT_TOOLIPS = ("The extracted translation tags as a dict",) 24 | 25 | FUNCTION = "extract" 26 | 27 | CATEGORY = DANBOT_CATEGORY 28 | 29 | def extract( 30 | self, 31 | danbot_model: ModelWrapper, 32 | generated_tags: str, 33 | ): 34 | translation = danbot_model.extract_translation_result(generated_tags) 35 | 36 | return (translation,) 37 | 38 | 39 | class ExtensionExtractorNode: 40 | @classmethod 41 | def INPUT_TYPES(s): 42 | return { 43 | "required": { 44 | "danbot_model": (DANBOT_MODEL_TYPE,), 45 | "generated_tags": ( 46 | "STRING", 47 | { 48 | "forceInput": True, 49 | "tooltip": "The tags generated by the model.", 50 | }, 51 | ), 52 | }, 53 | } 54 | 55 | RETURN_TYPES = (FORMAT_KWARGS_DTYPE,) 56 | RETURN_NAMES = ("extension_kwargs",) 57 | OUTPUT_TOOLIPS = ("The extracted extension tags as a dict",) 58 | 59 | FUNCTION = "extract" 60 | 61 | CATEGORY = DANBOT_CATEGORY 62 | 63 | def extract( 64 | self, 65 | danbot_model: ModelWrapper, 66 | generated_tags: str, 67 | ): 68 | extension = danbot_model.extract_extension_result(generated_tags) 69 | 70 | return (extension,) 71 | -------------------------------------------------------------------------------- /src/nodes/formatter.py: -------------------------------------------------------------------------------- 1 | from ..models.utils import ModelWrapper 2 | from ..models import v2408 3 | from .type import ( 4 | DANBOT_MODEL_TYPE, 5 | DANBOT_CATEGORY, 6 | FORMAT_KWARGS_DTYPE, 7 | TEMPLATE_CONFIG_DTYPE, 8 | ) 9 | 10 | STRING_OPTIONS = { 11 | "multiline": True, 12 | } 13 | 14 | INPUT_TAGS_OPTIONS = { 15 | **STRING_OPTIONS, 16 | "placeholder": "input tags (e.g. 1girl, solo, hatsune miku, ...)", 17 | "tooltip": "Comma separated tags. This is the condition for upsampling tags. The copyright/character tags in this field are automatically detected.", 18 | } 19 | 20 | 21 | class TemplateConfigNode: 22 | def __init__(self): 23 | pass 24 | 25 | RETURN_TYPES = (TEMPLATE_CONFIG_DTYPE, "STRING") 26 | RETURN_NAMES = ( 27 | "template_config", 28 | "template_name", 29 | ) 30 | OUTPUT_TOOLTIPS = ( 31 | "The template config.", 32 | "The template name.", 33 | ) 34 | 35 | FUNCTION = "get_template" 36 | 37 | OUTPUT_NODE = False 38 | 39 | CATEGORY = DANBOT_CATEGORY 40 | 41 | 42 | class V2408TemplateConfigNode(TemplateConfigNode): 43 | DESCRIPTION = "Formats a prompt for a Danbot-2408 model" 44 | 45 | EXPERIMENTAL = True 46 | 47 | RETURN_TYPES = (TEMPLATE_CONFIG_DTYPE, v2408.TEMPLATE_NAMES) 48 | 49 | @classmethod 50 | def INPUT_TYPES(s): 51 | return { 52 | "required": { 53 | "aspect_ratio": ( 54 | list(v2408.ASPECT_RATIO_MAP.keys()), 55 | { 56 | "default": "tall", 57 | }, 58 | ), 59 | "rating": ( 60 | ["auto"] + list(v2408.RATING_MAP.keys()), 61 | { 62 | "default": "general", 63 | }, 64 | ), 65 | "length": ( 66 | list(v2408.LENGTH_MAP.keys()), 67 | { 68 | "default": "very_short", 69 | }, 70 | ), 71 | "template_name": ( 72 | v2408.TEMPLATE_NAMES, 73 | { 74 | "default": "translation", 75 | }, 76 | ), 77 | }, 78 | } 79 | 80 | def get_template( 81 | self, 82 | aspect_ratio: str, 83 | rating: str, 84 | length: str, 85 | template_name: v2408.TEMPLATE_NAME, 86 | ): 87 | config = v2408.TemplateConfig( 88 | aspect_ratio=aspect_ratio, 89 | rating=rating, 90 | length=length, 91 | ) 92 | 93 | return (config, template_name) 94 | 95 | 96 | class FormatterNodeMixin: 97 | def __init__(self): 98 | pass 99 | 100 | RETURN_TYPES = ("STRING",) 101 | RETURN_NAMES = ("tag_template",) 102 | OUTPUT_TOOLTIPS = ( 103 | "Formatted tag template that should be passed to the upsampler node.", 104 | ) 105 | 106 | FUNCTION = "format" 107 | 108 | OUTPUT_NODE = False 109 | 110 | CATEGORY = DANBOT_CATEGORY 111 | 112 | 113 | class V2408FormatterNode(FormatterNodeMixin): 114 | DESCRIPTION = "Formats a prompt for a Danbot-2408 model" 115 | 116 | EXPERIMENTAL = True 117 | 118 | @classmethod 119 | def INPUT_TYPES(s): 120 | return { 121 | "required": { 122 | "model": (DANBOT_MODEL_TYPE,), 123 | "template_config": ( 124 | TEMPLATE_CONFIG_DTYPE, 125 | {}, 126 | ), 127 | "template_name": ( 128 | v2408.TEMPLATE_NAMES, 129 | { 130 | "forceInput": True, 131 | }, 132 | ), 133 | }, 134 | "optional": { 135 | "format_kwargs": (FORMAT_KWARGS_DTYPE,), 136 | }, 137 | } 138 | 139 | def format( 140 | self, 141 | model: ModelWrapper, 142 | template_config: v2408.TemplateConfig, 143 | template_name: v2408.TEMPLATE_NAME, 144 | format_kwargs: dict[str, str] = {}, 145 | ): 146 | default_kwargs = model.prompt_templates_default.get(template_name, {}) 147 | template = model.format_prompt( 148 | template_name=template_name, 149 | format_kwargs={ 150 | "aspect_ratio": v2408.ASPECT_RATIO_MAP[template_config.aspect_ratio], 151 | "rating": v2408.RATING_MAP[template_config.rating], 152 | "length": v2408.LENGTH_MAP[template_config.length], 153 | **default_kwargs, 154 | **format_kwargs, 155 | }, 156 | ) 157 | 158 | return (template,) 159 | -------------------------------------------------------------------------------- /src/nodes/generation_config.py: -------------------------------------------------------------------------------- 1 | from typing import Literal 2 | 3 | from transformers import GenerationConfig 4 | 5 | from .type import DANBOT_GENERATION_CONFIG_TYPE, DANBOT_CATEGORY 6 | 7 | 8 | class GenerationConfigNode: 9 | def __init__(self): 10 | pass 11 | 12 | @classmethod 13 | def INPUT_TYPES(s): 14 | return { 15 | "required": { 16 | "max_new_tokens": ( 17 | "INT", 18 | { 19 | "default": 256, 20 | "min": 1, 21 | "max": 512, 22 | "step": 1, 23 | "display": "number", 24 | "tooltip": "Maximum number of tokens to generate", 25 | }, 26 | ), 27 | "do_sample": ( 28 | ["true", "false"], 29 | { 30 | "default": "true", 31 | "tooltip": "Whether to use sampling or greedy decoding", 32 | }, 33 | ), 34 | "temperature": ( 35 | "FLOAT", 36 | { 37 | "default": 1.0, 38 | "min": 0.1, 39 | "max": 5.0, 40 | "step": 0.05, 41 | "display": "number", 42 | "tooltip": ( 43 | "Temperature for sampling. " 44 | "Lower values are more deterministic, higher values more random. " 45 | "Default value is 1.0. Recommended to be less than 1.5." 46 | ), 47 | }, 48 | ), 49 | "top_p": ( 50 | "FLOAT", 51 | { 52 | "default": 1.0, 53 | "min": 0.1, 54 | "max": 1.0, 55 | "step": 0.1, 56 | "display": "number", 57 | "tooltip": ( 58 | "Tokens are sampled from the smallest set whose cumulative probability exceeds the probability p. " 59 | "Default value is 1.0." 60 | ), 61 | }, 62 | ), 63 | "top_k": ( 64 | "INT", 65 | { 66 | "default": 50, 67 | "min": 10, 68 | "max": 1000, 69 | "step": 10, 70 | "display": "number", 71 | "tooltip": ( 72 | "Tokens are sampled from the top k most likely tokens. " 73 | "Larger values mean more diversity and randomness. " 74 | "Default value is 50. Recommended to be between 10 and 200." 75 | ), 76 | }, 77 | ), 78 | "min_p": ( 79 | "FLOAT", 80 | { 81 | "default": 0.0, 82 | "min": 0.0, 83 | "max": 1.0, 84 | "step": 0.05, 85 | "display": "number", 86 | "tooltip": ( 87 | "Minimum probability to select tokens from. " 88 | "Tokens with probability less than this value are going to be ignored. " 89 | "Default value is 0.00. If you set this value to around 0.1 ~ 0.2, " 90 | "you can set higher temperature and top_k values." 91 | ), 92 | }, 93 | ), 94 | "num_beams": ( 95 | "INT", 96 | { 97 | "default": 1, 98 | "min": 1, 99 | "max": 10, 100 | "step": 1, 101 | "display": "number", 102 | "tooltip": ( 103 | "Number of beams to use for beam search. " 104 | "1 means no beam search. It is effective when the temperature is too high. " 105 | "Default value is 1." 106 | ), 107 | }, 108 | ), 109 | } 110 | } 111 | 112 | RETURN_TYPES = (DANBOT_GENERATION_CONFIG_TYPE,) 113 | RETURN_NAMES = ("generation_config",) 114 | OUTPUT_TOOLTIPS = ("Generation config for the upsampler node.",) 115 | 116 | FUNCTION = "construct" 117 | 118 | OUTPUT_NODE = False 119 | 120 | CATEGORY = DANBOT_CATEGORY 121 | 122 | def construct( 123 | self, 124 | max_new_tokens: int, 125 | do_sample: Literal["true", "false"], 126 | temperature: float, 127 | top_p: float, 128 | top_k: int, 129 | min_p: float, 130 | num_beams: int, 131 | ): 132 | config = GenerationConfig( 133 | max_new_tokens=max_new_tokens, 134 | do_sample=do_sample == "true", 135 | temperature=temperature, 136 | top_p=top_p, 137 | top_k=top_k, 138 | min_p=min_p, 139 | num_beams=num_beams, 140 | use_cache=True, 141 | ) 142 | return (config,) 143 | -------------------------------------------------------------------------------- /src/nodes/generator.py: -------------------------------------------------------------------------------- 1 | from transformers import GenerationConfig, set_seed 2 | 3 | from ..models.utils import ModelWrapper 4 | from .type import ( 5 | DANBOT_MODEL_TYPE, 6 | DANBOT_GENERATION_CONFIG_TYPE, 7 | DANBOT_CATEGORY, 8 | ) 9 | 10 | UPSAMPLER_INPUT_TYPES = { 11 | "required": { 12 | "danbot_model": (DANBOT_MODEL_TYPE,), 13 | "text_prompt": ( 14 | "STRING", 15 | { 16 | "forceInput": True, 17 | "tooltip": "Natural language prompt. English and Japanese are supported.", 18 | }, 19 | ), 20 | "tag_template": ( 21 | "STRING", 22 | { 23 | "forceInput": True, 24 | "tooltip": "Formatted tag template that will be passed to the danbot model to upsample tags", 25 | }, 26 | ), 27 | "seed": ( 28 | "INT", 29 | { 30 | "default": 0, 31 | "step": 1, 32 | "min": 0, 33 | "max": 2**32 - 1, 34 | "display": "number", 35 | }, 36 | ), 37 | }, 38 | "optional": { 39 | "stop_token": ( 40 | "STRING", 41 | { 42 | "default": "", 43 | "tooltip": "Stop token to stop generation", 44 | }, 45 | ), 46 | "ban_tags": ( 47 | "STRING", 48 | { 49 | "forceInput": True, 50 | "tooltip": "Tags to ban during generation", 51 | }, 52 | ), 53 | "generation_config": ( 54 | DANBOT_GENERATION_CONFIG_TYPE, 55 | { 56 | "tooltip": "Generation configuration for the upmsapling tags", 57 | }, 58 | ), 59 | }, 60 | } 61 | 62 | 63 | class GeneratorNode: 64 | def __init__(self): 65 | pass 66 | 67 | @classmethod 68 | def INPUT_TYPES(s): 69 | return UPSAMPLER_INPUT_TYPES 70 | 71 | RETURN_TYPES = ( 72 | "STRING", 73 | "STRING", 74 | ) 75 | RETURN_NAMES = ( 76 | "generated_tags", 77 | "raw_output", 78 | ) 79 | OUTPUT_TOOLIPS = ( 80 | "The generated tags by the model.", 81 | "The raw output of the model. This includes the special tokens.", 82 | ) 83 | 84 | FUNCTION = "upsample" 85 | 86 | OUTPUT_NODE = False 87 | 88 | CATEGORY = DANBOT_CATEGORY 89 | 90 | def upsample( 91 | self, 92 | danbot_model: ModelWrapper, 93 | text_prompt: str, 94 | tag_template: str, 95 | seed: int, 96 | stop_token: str | None = "", 97 | ban_tags: str | None = None, 98 | generation_config: GenerationConfig = GenerationConfig( 99 | do_sample=False, 100 | ), 101 | ): 102 | set_seed(seed) 103 | _full, new, raw = danbot_model.generate( 104 | text_prompt=text_prompt, 105 | tag_template=tag_template, 106 | generation_config=generation_config, 107 | ban_tags=ban_tags, 108 | stop_token=stop_token, 109 | ) 110 | 111 | return (new, raw) 112 | -------------------------------------------------------------------------------- /src/nodes/load_model.py: -------------------------------------------------------------------------------- 1 | from ..config import load_models_configs 2 | from .type import DANBOT_MODEL_TYPE, DANBOT_CATEGORY 3 | 4 | 5 | class LoadModelNode: 6 | DESCRIPTION = "Loads a Danbot model." 7 | 8 | def __init__(self): 9 | pass 10 | 11 | @classmethod 12 | def INPUT_TYPES(s): 13 | configs = load_models_configs() 14 | return { 15 | "required": { 16 | "model_name": (list(configs.keys()),), 17 | }, 18 | } 19 | 20 | RETURN_TYPES = (DANBOT_MODEL_TYPE,) 21 | RETURN_NAMES = ("danbot_model",) 22 | OUTPUT_TOOLTIPS = ("Danbot model",) 23 | 24 | FUNCTION = "load_model" 25 | 26 | OUTPUT_NODE = False 27 | 28 | CATEGORY = DANBOT_CATEGORY 29 | 30 | def load_model(self, model_name: str): 31 | configs = load_models_configs() 32 | config = configs[model_name] 33 | model = config.load_model() 34 | return (model,) 35 | -------------------------------------------------------------------------------- /src/nodes/pipeline.py: -------------------------------------------------------------------------------- 1 | from transformers import GenerationConfig, set_seed 2 | 3 | 4 | from ..models.utils import ModelWrapper 5 | from ..models import v2408 6 | from .type import ( 7 | DANBOT_MODEL_TYPE, 8 | DANBOT_GENERATION_CONFIG_TYPE, 9 | DANBOT_CATEGORY, 10 | TEMPLATE_CONFIG_DTYPE, 11 | ) 12 | 13 | 14 | INPUT_TYPES = { 15 | "required": { 16 | "danbot_model": (DANBOT_MODEL_TYPE,), 17 | "text_prompt": ( 18 | "STRING", 19 | { 20 | "forceInput": True, 21 | "tooltip": "Natural language prompt. English and Japanese are supported.", 22 | }, 23 | ), 24 | "seed": ( 25 | "INT", 26 | { 27 | "default": 0, 28 | "step": 1, 29 | "min": 0, 30 | "max": 2**32 - 1, 31 | "display": "number", 32 | }, 33 | ), 34 | }, 35 | "optional": { 36 | "ban_tags": ( 37 | "STRING", 38 | { 39 | "forceInput": True, 40 | "tooltip": "Tags to ban during generation", 41 | }, 42 | ), 43 | "translation_template_config": (TEMPLATE_CONFIG_DTYPE,), 44 | "extension_template_config": (TEMPLATE_CONFIG_DTYPE,), 45 | "generation_config": ( 46 | DANBOT_GENERATION_CONFIG_TYPE, 47 | { 48 | "tooltip": "Generation configuration for the upmsapling tags", 49 | }, 50 | ), 51 | }, 52 | } 53 | 54 | 55 | class V2408PipelineNode: 56 | def __init__(self): 57 | pass 58 | 59 | @classmethod 60 | def INPUT_TYPES(s): 61 | return INPUT_TYPES 62 | 63 | RETURN_TYPES = ( 64 | "STRING", 65 | "STRING", 66 | "STRING", 67 | "STRING", 68 | ) 69 | RETURN_NAMES = ( 70 | "generated_tags", 71 | "translated_tags", 72 | "extended_tags", 73 | "raw_output", 74 | ) 75 | OUTPUT_TOOLIPS = ( 76 | "The generated tags.", 77 | "The raw output of the model. This includes the special tokens.", 78 | ) 79 | 80 | FUNCTION = "generate" 81 | 82 | OUTPUT_NODE = False 83 | 84 | CATEGORY = DANBOT_CATEGORY 85 | 86 | def generate( 87 | self, 88 | danbot_model: ModelWrapper, 89 | text_prompt: str, 90 | seed: int, 91 | ban_tags: str | None = None, 92 | translation_template_config: v2408.TemplateConfig = v2408.TemplateConfig( 93 | aspect_ratio="tall", 94 | rating="general", 95 | length="very_short", 96 | ), 97 | extension_template_config: v2408.TemplateConfig = v2408.TemplateConfig( 98 | aspect_ratio="tall", 99 | rating="general", 100 | length="long", 101 | ), 102 | generation_config: GenerationConfig = GenerationConfig( 103 | do_sample=False, 104 | max_new_tokens=256, 105 | ), 106 | ): 107 | set_seed(seed) 108 | # 1. translate 109 | translation_template = danbot_model.format_prompt( 110 | template_name="translation", 111 | format_kwargs={ 112 | "aspect_ratio": v2408.ASPECT_RATIO_MAP[ 113 | translation_template_config.aspect_ratio 114 | ], 115 | "rating": v2408.RATING_MAP[translation_template_config.rating], 116 | "length": v2408.LENGTH_MAP[translation_template_config.length], 117 | }, 118 | ) 119 | _full, _new, raw = danbot_model.generate( 120 | text_prompt=text_prompt, 121 | tag_template=translation_template, 122 | generation_config=GenerationConfig( 123 | do_sample=False, 124 | max_new_tokens=generation_config.max_new_tokens, 125 | ), 126 | ban_tags=ban_tags, 127 | stop_token=v2408.TRANSLATION_END, 128 | ) 129 | translation = danbot_model.extract_translation_result(raw) 130 | 131 | # 2. extend 132 | copyright_tags = translation.get("copyright", "") 133 | character_tags = translation.get("character", "") 134 | translation_tags = translation.get("translation", "") 135 | 136 | extension_template = danbot_model.format_prompt( 137 | template_name="extension", 138 | format_kwargs={ 139 | "aspect_ratio": v2408.ASPECT_RATIO_MAP[ 140 | extension_template_config.aspect_ratio 141 | ], 142 | "rating": v2408.RATING_MAP[extension_template_config.rating], 143 | "length": v2408.LENGTH_MAP[extension_template_config.length], 144 | "copyright": copyright_tags, 145 | "character": character_tags, 146 | "translation": translation_tags, 147 | }, 148 | ) 149 | _full, _new, raw = danbot_model.generate( 150 | text_prompt=text_prompt, 151 | tag_template=extension_template, 152 | generation_config=generation_config, 153 | ban_tags=ban_tags, 154 | stop_token=v2408.EXTENSION_END, 155 | ) 156 | extension = danbot_model.extract_extension_result(raw) 157 | 158 | extension_tags = extension.get("extension", "") 159 | output_tags = ", ".join( 160 | [ 161 | part 162 | for part in ( 163 | copyright_tags, 164 | character_tags, 165 | translation_tags, 166 | extension_tags, 167 | ) 168 | if part.strip() 169 | ] 170 | ) 171 | translated_tags = ", ".join( 172 | [ 173 | part 174 | for part in ( 175 | copyright_tags, 176 | character_tags, 177 | translation_tags, 178 | ) 179 | if part.strip() 180 | ] 181 | ) 182 | 183 | return ( 184 | output_tags, 185 | translated_tags, 186 | extension_tags, 187 | raw, 188 | ) 189 | -------------------------------------------------------------------------------- /src/nodes/type.py: -------------------------------------------------------------------------------- 1 | # comfyui node input/output types 2 | 3 | DANBOT_MODEL_TYPE = "DANBOT_MODEL" 4 | DANBOT_GENERATION_CONFIG_TYPE = "DANBOT_GENERATION_CONFIG" 5 | DANBOT_CATEGORY = "prompt/Danbooru Tags Translator" 6 | 7 | FORMAT_KWARGS_DTYPE = "DANBOT_FORMAT_KWARGS" 8 | TEMPLATE_CONFIG_DTYPE = "DANBOT_TEMPLATE_CONFIG" 9 | -------------------------------------------------------------------------------- /src/nodes/utils/concat_string.py: -------------------------------------------------------------------------------- 1 | from ..type import DANBOT_CATEGORY 2 | 3 | 4 | class ConcatStringNode: 5 | def __init__(self): 6 | pass 7 | 8 | @classmethod 9 | def INPUT_TYPES(s): 10 | return { 11 | "optional": { 12 | "string_1": ("STRING", {"forceInput": True}), 13 | "string_2": ("STRING", {"forceInput": True}), 14 | "string_3": ("STRING", {"forceInput": True}), 15 | "string_4": ("STRING", {"forceInput": True}), 16 | "string_5": ("STRING", {"forceInput": True}), 17 | "string_6": ("STRING", {"forceInput": True}), 18 | "separator": ("STRING", {"default": ", "}), 19 | }, 20 | } 21 | 22 | RETURN_TYPES = ("STRING",) 23 | 24 | FUNCTION = "concat" 25 | 26 | OUTPUT_NODE = False 27 | 28 | CATEGORY = DANBOT_CATEGORY + "/utils" 29 | DESCRIPTION = "Concats the input strings." 30 | 31 | def concat( 32 | self, 33 | string_1: str | None = "", 34 | string_2: str | None = "", 35 | string_3: str | None = "", 36 | string_4: str | None = "", 37 | string_5: str | None = "", 38 | string_6: str | None = "", 39 | separator: str | None = ", ", 40 | ): 41 | strings = [string_1, string_2, string_3, string_4, string_5, string_6] 42 | strings = [ 43 | string.strip() 44 | for string in strings 45 | if isinstance(string, str) and string.strip() 46 | ] 47 | result = (separator or ", ").join(strings) 48 | return (result,) 49 | -------------------------------------------------------------------------------- /src/nodes/utils/print_string.py: -------------------------------------------------------------------------------- 1 | from ..type import DANBOT_CATEGORY 2 | 3 | 4 | class PrintStringNode: 5 | def __init__(self): 6 | pass 7 | 8 | @classmethod 9 | def INPUT_TYPES(s): 10 | return { 11 | "optional": { 12 | "input_string": ("STRING", {"forceInput": True}), 13 | }, 14 | } 15 | 16 | RETURN_TYPES = ("STRING",) 17 | 18 | FUNCTION = "print_string" 19 | 20 | OUTPUT_NODE = True 21 | 22 | CATEGORY = DANBOT_CATEGORY + "/utils" 23 | DESCRIPTION = "Prints the input string to the console." 24 | 25 | def print_string(self, input_string=None): 26 | if input_string is not None: 27 | print("input_string:", input_string) 28 | return { 29 | "ui": {"text": (input_string,)}, # pass to JS message 30 | "result": (input_string,), 31 | } 32 | return () 33 | -------------------------------------------------------------------------------- /src/nodes/utils/text_input.py: -------------------------------------------------------------------------------- 1 | from ..type import DANBOT_CATEGORY 2 | 3 | 4 | class TextInputNode: 5 | def __init__(self): 6 | pass 7 | 8 | @classmethod 9 | def INPUT_TYPES(s): 10 | return { 11 | "optional": { 12 | "text": ( 13 | "STRING", 14 | { 15 | "multiline": True, 16 | }, 17 | ), 18 | }, 19 | } 20 | 21 | RETURN_TYPES = ("STRING",) 22 | 23 | FUNCTION = "passthrough" 24 | 25 | CATEGORY = DANBOT_CATEGORY + "/utils" 26 | DESCRIPTION = ( 27 | "Just pass the given text to the next nodes without any transformation." 28 | ) 29 | 30 | def passthrough(self, text=None): 31 | if text is not None: 32 | return (text,) 33 | return () 34 | -------------------------------------------------------------------------------- /src/tags.py: -------------------------------------------------------------------------------- 1 | from typing import Literal 2 | import os 3 | from pathlib import Path 4 | 5 | RATING_TYPE = Literal["general", "sensitive", "questionable", "explicit"] 6 | 7 | EXPLICIT_TAGS = ["explicit"] 8 | QUESTIONABLE_TAGS = ["nsfw", "questionable"] 9 | SENSITIVE_TAGS = ["sensitive"] 10 | GENERAL_TAGS = ["safe", "general"] 11 | 12 | 13 | SELF_PATH_DIR = Path(os.path.dirname(os.path.abspath(__file__))) 14 | TAGS_ROOT_DIR = SELF_PATH_DIR / ".." / "tags" 15 | 16 | 17 | def estimate_rating(tags: list[str]) -> RATING_TYPE: 18 | for tag in tags: 19 | if tag in EXPLICIT_TAGS: 20 | return "explicit" 21 | if tag in QUESTIONABLE_TAGS: 22 | return "questionable" 23 | if tag in SENSITIVE_TAGS: 24 | return "sensitive" 25 | return "general" 26 | 27 | 28 | def load_tags(path: str | Path) -> list[str]: 29 | with open(path, "r") as f: 30 | tags = f.read().splitlines() 31 | 32 | # remove comment out with "//" 33 | tags = [tag.split("//")[0] for tag in tags if not tag.startswith("//")] 34 | 35 | # remove empty lines 36 | tags = [tag for tag in tags if tag] 37 | 38 | return tags 39 | 40 | 41 | def normalize_tag_text(text: str, separator: str = ", ") -> str: 42 | """ 43 | Normalize tag text by removing extra spaces and joining tokens 44 | """ 45 | return separator.join( 46 | [token.strip().replace("_", " ") for token in text.split(",") if token.strip()] 47 | ) 48 | -------------------------------------------------------------------------------- /tags/ban_template/BAN_TAGS_LIST_HERE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p1atdev/danbot-comfy-node/175f9ba48453af5922f5a513e100ca18e7a92c0d/tags/ban_template/BAN_TAGS_LIST_HERE -------------------------------------------------------------------------------- /tags/ban_template/all_text.txt: -------------------------------------------------------------------------------- 1 | character name 2 | happy new year 3 | birthday 4 | happy birthday 5 | happy halloween 6 | happy valentine 7 | happy anniversary 8 | ad 9 | 10 | // languages 11 | afrikaans text 12 | albanian text 13 | amharic text 14 | arabic text 15 | aramaic text 16 | archaic japanese text 17 | armenian text 18 | australian english text 19 | azerbaijani text 20 | backwards text 21 | basque text 22 | belarusian text 23 | bengali text 24 | blurry text 25 | bopomofo text 26 | breton text 27 | british english text 28 | bulgarian text 29 | cantonese text 30 | catalan text 31 | cebuano text 32 | censored by text 33 | censored text 34 | chichewa text 35 | chinese text 36 | church slavonic text 37 | circling text 38 | corsican text 39 | czech text 40 | danish text 41 | dutch text 42 | english text 43 | engrish text 44 | esperanto text 45 | estonian text 46 | fake text 47 | fantasy text 48 | faux text 49 | filipino text 50 | finnish text 51 | foreground text 52 | french text 53 | galician text 54 | georgian text 55 | german text 56 | gibberish text 57 | gradient text 58 | greek text 59 | gyeongsang korean text 60 | haitian creole text 61 | hawaiian text 62 | hebrew text 63 | hindi text 64 | hmong text 65 | holding text 66 | hungarian text 67 | icelandic text 68 | igbo text 69 | indian text 70 | indonesian text 71 | interslavic text 72 | irish english text 73 | irish text 74 | italian text 75 | javanese text 76 | kazakh text 77 | khmer text 78 | kinyarwanda text 79 | kiriji text 80 | korean text 81 | kurdish text 82 | kyrgyz text 83 | lao text 84 | latin text 85 | latvian text 86 | lithuanian text 87 | luxembourgish text 88 | macedonian text 89 | malagasy text 90 | malay text 91 | malayalam text 92 | maltese text 93 | maori text 94 | metal band text 95 | middle english text 96 | minnan text 97 | mirrored text 98 | mixed-language text 99 | mojibake text 100 | mongolian text 101 | multicolored text 102 | nahuatl text 103 | nepali text 104 | norwegian text 105 | old norse text 106 | old turkic text 107 | overwritten text 108 | persian text 109 | pinyin text 110 | pixel text 111 | polish text 112 | portuguese text 113 | rainbow text 114 | romaja text 115 | romaji text 116 | romanian text 117 | russian text 118 | scots text 119 | scottish english text 120 | serbo-croatian text 121 | shenyang mandarin text 122 | sichuanese text 123 | simplified chinese text 124 | sindhi text 125 | singlish text 126 | slovak text 127 | slovenian text 128 | somali text 129 | spanish text 130 | sundanese text 131 | swabian german text 132 | swahili text 133 | swedish text 134 | tagalog text 135 | tamil text 136 | tangut text 137 | tatar text 138 | telugu text 139 | tengwar text 140 | thai text 141 | tibetan text 142 | traditional chinese text 143 | turkish text 144 | ukrainian text 145 | upside-down text 146 | uzbek text 147 | vertical text 148 | vietnamese text 149 | wall of text 150 | welsh text 151 | xhosa text 152 | yellow text 153 | yiddish text 154 | yoruba text 155 | yucatec mayan text 156 | zalgo text 157 | zulu text -------------------------------------------------------------------------------- /tags/ban_template/alternate_attire.txt: -------------------------------------------------------------------------------- 1 | // double slash to comment out a line 2 | 3 | official alternate costume 4 | alternate costume 5 | alternate hairstyle 6 | -------------------------------------------------------------------------------- /tags/ban_template/major_concepts.txt: -------------------------------------------------------------------------------- 1 | // too common maijor concepts 2 | school uniform 3 | serafuku 4 | sailor collar 5 | 6 | japanese clothes 7 | kimono -------------------------------------------------------------------------------- /tags/ban_template/military.txt: -------------------------------------------------------------------------------- 1 | military 2 | military uniform -------------------------------------------------------------------------------- /tags/ban_template/year.txt: -------------------------------------------------------------------------------- 1 | 2005 2 | 2006 3 | 2007 4 | 2008 5 | 2009 6 | 2010 7 | 2011 8 | 2012 9 | 2013 10 | 2014 11 | 2015 12 | 2016 13 | 2017 14 | 2018 15 | 2019 16 | 2020 17 | 2021 18 | 2022 19 | 2023 20 | 2024 21 | 22 | 2020s (style) -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 1 3 | requires-python = ">=3.11" 4 | 5 | [[package]] 6 | name = "certifi" 7 | version = "2025.1.31" 8 | source = { registry = "https://pypi.org/simple" } 9 | sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } 10 | wheels = [ 11 | { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, 12 | ] 13 | 14 | [[package]] 15 | name = "charset-normalizer" 16 | version = "3.4.1" 17 | source = { registry = "https://pypi.org/simple" } 18 | sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } 19 | wheels = [ 20 | { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, 21 | { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, 22 | { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, 23 | { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, 24 | { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, 25 | { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, 26 | { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, 27 | { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, 28 | { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, 29 | { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, 30 | { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, 31 | { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, 32 | { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, 33 | { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, 34 | { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, 35 | { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, 36 | { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, 37 | { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, 38 | { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, 39 | { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, 40 | { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, 41 | { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, 42 | { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, 43 | { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, 44 | { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, 45 | { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, 46 | { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, 47 | { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, 48 | { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, 49 | { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, 50 | { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, 51 | { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, 52 | { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, 53 | { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, 54 | { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, 55 | { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, 56 | { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, 57 | { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, 58 | { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, 59 | { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, 60 | ] 61 | 62 | [[package]] 63 | name = "colorama" 64 | version = "0.4.6" 65 | source = { registry = "https://pypi.org/simple" } 66 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } 67 | wheels = [ 68 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, 69 | ] 70 | 71 | [[package]] 72 | name = "danbot-comfy-node" 73 | version = "0.1.0" 74 | source = { virtual = "." } 75 | dependencies = [ 76 | { name = "protobuf" }, 77 | { name = "sentencepiece" }, 78 | { name = "transformers" }, 79 | ] 80 | 81 | [package.metadata] 82 | requires-dist = [ 83 | { name = "protobuf", specifier = ">=6.30.1" }, 84 | { name = "sentencepiece", specifier = ">=0.2.0" }, 85 | { name = "transformers", specifier = ">=4.49.0" }, 86 | ] 87 | 88 | [[package]] 89 | name = "filelock" 90 | version = "3.18.0" 91 | source = { registry = "https://pypi.org/simple" } 92 | sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } 93 | wheels = [ 94 | { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, 95 | ] 96 | 97 | [[package]] 98 | name = "fsspec" 99 | version = "2025.3.0" 100 | source = { registry = "https://pypi.org/simple" } 101 | sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491 } 102 | wheels = [ 103 | { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615 }, 104 | ] 105 | 106 | [[package]] 107 | name = "huggingface-hub" 108 | version = "0.29.3" 109 | source = { registry = "https://pypi.org/simple" } 110 | dependencies = [ 111 | { name = "filelock" }, 112 | { name = "fsspec" }, 113 | { name = "packaging" }, 114 | { name = "pyyaml" }, 115 | { name = "requests" }, 116 | { name = "tqdm" }, 117 | { name = "typing-extensions" }, 118 | ] 119 | sdist = { url = "https://files.pythonhosted.org/packages/e5/f9/851f34b02970e8143d41d4001b2d49e54ef113f273902103823b8bc95ada/huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5", size = 390123 } 120 | wheels = [ 121 | { url = "https://files.pythonhosted.org/packages/40/0c/37d380846a2e5c9a3c6a73d26ffbcfdcad5fc3eacf42fdf7cff56f2af634/huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa", size = 468997 }, 122 | ] 123 | 124 | [[package]] 125 | name = "idna" 126 | version = "3.10" 127 | source = { registry = "https://pypi.org/simple" } 128 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } 129 | wheels = [ 130 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, 131 | ] 132 | 133 | [[package]] 134 | name = "numpy" 135 | version = "2.2.4" 136 | source = { registry = "https://pypi.org/simple" } 137 | sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } 138 | wheels = [ 139 | { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 }, 140 | { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 }, 141 | { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 }, 142 | { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 }, 143 | { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 }, 144 | { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 }, 145 | { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 }, 146 | { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 }, 147 | { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 }, 148 | { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 }, 149 | { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, 150 | { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, 151 | { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, 152 | { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, 153 | { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, 154 | { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, 155 | { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, 156 | { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, 157 | { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, 158 | { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, 159 | { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 }, 160 | { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 }, 161 | { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 }, 162 | { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 }, 163 | { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 }, 164 | { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 }, 165 | { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 }, 166 | { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 }, 167 | { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 }, 168 | { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 }, 169 | { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 }, 170 | { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 }, 171 | { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 }, 172 | { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 }, 173 | { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 }, 174 | { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 }, 175 | { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 }, 176 | { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 }, 177 | { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 }, 178 | { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, 179 | ] 180 | 181 | [[package]] 182 | name = "packaging" 183 | version = "24.2" 184 | source = { registry = "https://pypi.org/simple" } 185 | sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } 186 | wheels = [ 187 | { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, 188 | ] 189 | 190 | [[package]] 191 | name = "protobuf" 192 | version = "6.30.1" 193 | source = { registry = "https://pypi.org/simple" } 194 | sdist = { url = "https://files.pythonhosted.org/packages/55/de/8216061897a67b2ffe302fd51aaa76bbf613001f01cd96e2416a4955dd2b/protobuf-6.30.1.tar.gz", hash = "sha256:535fb4e44d0236893d5cf1263a0f706f1160b689a7ab962e9da8a9ce4050b780", size = 429304 } 195 | wheels = [ 196 | { url = "https://files.pythonhosted.org/packages/83/f6/28460c49a8a93229e2264cd35fd147153fb524cbd944789db6b6f3cc9b13/protobuf-6.30.1-cp310-abi3-win32.whl", hash = "sha256:ba0706f948d0195f5cac504da156d88174e03218d9364ab40d903788c1903d7e", size = 419150 }, 197 | { url = "https://files.pythonhosted.org/packages/96/82/7045f5b3f3e338a8ab5852d22ce9c31e0a40d8b0f150a3735dc494be769a/protobuf-6.30.1-cp310-abi3-win_amd64.whl", hash = "sha256:ed484f9ddd47f0f1bf0648806cccdb4fe2fb6b19820f9b79a5adf5dcfd1b8c5f", size = 431007 }, 198 | { url = "https://files.pythonhosted.org/packages/b0/b6/732d04d0cdf457d05b7cba83ae73735d91ceced2439735b4500e311c44a5/protobuf-6.30.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aa4f7dfaed0d840b03d08d14bfdb41348feaee06a828a8c455698234135b4075", size = 417579 }, 199 | { url = "https://files.pythonhosted.org/packages/fc/22/29dd085f6e828ab0424e73f1bae9dbb9e8bb4087cba5a9e6f21dc614694e/protobuf-6.30.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:47cd320b7db63e8c9ac35f5596ea1c1e61491d8a8eb6d8b45edc44760b53a4f6", size = 317319 }, 200 | { url = "https://files.pythonhosted.org/packages/26/10/8863ba4baa4660e3f50ad9ae974c47fb63fa6d4089b15f7db82164b1c879/protobuf-6.30.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3083660225fa94748ac2e407f09a899e6a28bf9c0e70c75def8d15706bf85fc", size = 316213 }, 201 | { url = "https://files.pythonhosted.org/packages/a1/d6/683a3d470398e45b4ad9b6c95b7cbabc32f9a8daf454754f0e3df1edffa6/protobuf-6.30.1-py3-none-any.whl", hash = "sha256:3c25e51e1359f1f5fa3b298faa6016e650d148f214db2e47671131b9063c53be", size = 167064 }, 202 | ] 203 | 204 | [[package]] 205 | name = "pyyaml" 206 | version = "6.0.2" 207 | source = { registry = "https://pypi.org/simple" } 208 | sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } 209 | wheels = [ 210 | { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, 211 | { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, 212 | { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, 213 | { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, 214 | { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, 215 | { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, 216 | { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, 217 | { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, 218 | { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, 219 | { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, 220 | { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, 221 | { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, 222 | { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, 223 | { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, 224 | { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, 225 | { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, 226 | { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, 227 | { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, 228 | { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, 229 | { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, 230 | { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, 231 | { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, 232 | { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, 233 | { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, 234 | { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, 235 | { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, 236 | { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, 237 | ] 238 | 239 | [[package]] 240 | name = "regex" 241 | version = "2024.11.6" 242 | source = { registry = "https://pypi.org/simple" } 243 | sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } 244 | wheels = [ 245 | { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, 246 | { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, 247 | { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, 248 | { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, 249 | { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, 250 | { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, 251 | { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, 252 | { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, 253 | { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, 254 | { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, 255 | { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, 256 | { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, 257 | { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, 258 | { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, 259 | { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, 260 | { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, 261 | { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, 262 | { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, 263 | { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, 264 | { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, 265 | { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, 266 | { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, 267 | { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, 268 | { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, 269 | { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, 270 | { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, 271 | { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, 272 | { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, 273 | { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, 274 | { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, 275 | { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, 276 | { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, 277 | { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, 278 | { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, 279 | { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, 280 | { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, 281 | { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, 282 | { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, 283 | { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, 284 | { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, 285 | { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, 286 | { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, 287 | { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, 288 | { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, 289 | { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, 290 | ] 291 | 292 | [[package]] 293 | name = "requests" 294 | version = "2.32.3" 295 | source = { registry = "https://pypi.org/simple" } 296 | dependencies = [ 297 | { name = "certifi" }, 298 | { name = "charset-normalizer" }, 299 | { name = "idna" }, 300 | { name = "urllib3" }, 301 | ] 302 | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } 303 | wheels = [ 304 | { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, 305 | ] 306 | 307 | [[package]] 308 | name = "safetensors" 309 | version = "0.5.3" 310 | source = { registry = "https://pypi.org/simple" } 311 | sdist = { url = "https://files.pythonhosted.org/packages/71/7e/2d5d6ee7b40c0682315367ec7475693d110f512922d582fef1bd4a63adc3/safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965", size = 67210 } 312 | wheels = [ 313 | { url = "https://files.pythonhosted.org/packages/18/ae/88f6c49dbd0cc4da0e08610019a3c78a7d390879a919411a410a1876d03a/safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073", size = 436917 }, 314 | { url = "https://files.pythonhosted.org/packages/b8/3b/11f1b4a2f5d2ab7da34ecc062b0bc301f2be024d110a6466726bec8c055c/safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7", size = 418419 }, 315 | { url = "https://files.pythonhosted.org/packages/5d/9a/add3e6fef267658075c5a41573c26d42d80c935cdc992384dfae435feaef/safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467", size = 459493 }, 316 | { url = "https://files.pythonhosted.org/packages/df/5c/bf2cae92222513cc23b3ff85c4a1bb2811a2c3583ac0f8e8d502751de934/safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e", size = 472400 }, 317 | { url = "https://files.pythonhosted.org/packages/58/11/7456afb740bd45782d0f4c8e8e1bb9e572f1bf82899fb6ace58af47b4282/safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d", size = 522891 }, 318 | { url = "https://files.pythonhosted.org/packages/57/3d/fe73a9d2ace487e7285f6e157afee2383bd1ddb911b7cb44a55cf812eae3/safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9", size = 537694 }, 319 | { url = "https://files.pythonhosted.org/packages/a6/f8/dae3421624fcc87a89d42e1898a798bc7ff72c61f38973a65d60df8f124c/safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a", size = 471642 }, 320 | { url = "https://files.pythonhosted.org/packages/ce/20/1fbe16f9b815f6c5a672f5b760951e20e17e43f67f231428f871909a37f6/safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d", size = 502241 }, 321 | { url = "https://files.pythonhosted.org/packages/5f/18/8e108846b506487aa4629fe4116b27db65c3dde922de2c8e0cc1133f3f29/safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b", size = 638001 }, 322 | { url = "https://files.pythonhosted.org/packages/82/5a/c116111d8291af6c8c8a8b40628fe833b9db97d8141c2a82359d14d9e078/safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff", size = 734013 }, 323 | { url = "https://files.pythonhosted.org/packages/7d/ff/41fcc4d3b7de837963622e8610d998710705bbde9a8a17221d85e5d0baad/safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135", size = 670687 }, 324 | { url = "https://files.pythonhosted.org/packages/40/ad/2b113098e69c985a3d8fbda4b902778eae4a35b7d5188859b4a63d30c161/safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04", size = 643147 }, 325 | { url = "https://files.pythonhosted.org/packages/0a/0c/95aeb51d4246bd9a3242d3d8349c1112b4ee7611a4b40f0c5c93b05f001d/safetensors-0.5.3-cp38-abi3-win32.whl", hash = "sha256:cfc0ec0846dcf6763b0ed3d1846ff36008c6e7290683b61616c4b040f6a54ace", size = 296677 }, 326 | { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878 }, 327 | ] 328 | 329 | [[package]] 330 | name = "sentencepiece" 331 | version = "0.2.0" 332 | source = { registry = "https://pypi.org/simple" } 333 | sdist = { url = "https://files.pythonhosted.org/packages/c9/d2/b9c7ca067c26d8ff085d252c89b5f69609ca93fb85a00ede95f4857865d4/sentencepiece-0.2.0.tar.gz", hash = "sha256:a52c19171daaf2e697dc6cbe67684e0fa341b1248966f6aebb541de654d15843", size = 2632106 } 334 | wheels = [ 335 | { url = "https://files.pythonhosted.org/packages/32/43/8f8885168a47a02eba1455bd3f4f169f50ad5b8cebd2402d0f5e20854d04/sentencepiece-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17982700c4f6dbb55fa3594f3d7e5dd1c8659a274af3738e33c987d2a27c9d5c", size = 2409036 }, 336 | { url = "https://files.pythonhosted.org/packages/0f/35/e63ba28062af0a3d688a9f128e407a1a2608544b2f480cb49bf7f4b1cbb9/sentencepiece-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c867012c0e8bcd5bdad0f791609101cb5c66acb303ab3270218d6debc68a65e", size = 1238921 }, 337 | { url = "https://files.pythonhosted.org/packages/de/42/ae30952c4a0bd773e90c9bf2579f5533037c886dfc8ec68133d5694f4dd2/sentencepiece-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd6071249c74f779c5b27183295b9202f8dedb68034e716784364443879eaa6", size = 1181477 }, 338 | { url = "https://files.pythonhosted.org/packages/e3/ac/2f2ab1d60bb2d795d054eebe5e3f24b164bc21b5a9b75fba7968b3b91b5a/sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f90c55a65013cbb8f4d7aab0599bf925cde4adc67ae43a0d323677b5a1c6cb", size = 1259182 }, 339 | { url = "https://files.pythonhosted.org/packages/45/fb/14633c6ecf262c468759ffcdb55c3a7ee38fe4eda6a70d75ee7c7d63c58b/sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b293734059ef656dcd65be62ff771507bea8fed0a711b6733976e1ed3add4553", size = 1355537 }, 340 | { url = "https://files.pythonhosted.org/packages/fb/12/2f5c8d4764b00033cf1c935b702d3bb878d10be9f0b87f0253495832d85f/sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e58b47f933aca74c6a60a79dcb21d5b9e47416256c795c2d58d55cec27f9551d", size = 1301464 }, 341 | { url = "https://files.pythonhosted.org/packages/4e/b1/67afc0bde24f6dcb3acdea0dd8dcdf4b8b0db240f6bacd39378bd32d09f8/sentencepiece-0.2.0-cp311-cp311-win32.whl", hash = "sha256:c581258cf346b327c62c4f1cebd32691826306f6a41d8c4bec43b010dee08e75", size = 936749 }, 342 | { url = "https://files.pythonhosted.org/packages/a2/f6/587c62fd21fc988555b85351f50bbde43a51524caafd63bc69240ded14fd/sentencepiece-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0993dbc665f4113017892f1b87c3904a44d0640eda510abcacdfb07f74286d36", size = 991520 }, 343 | { url = "https://files.pythonhosted.org/packages/27/5a/141b227ed54293360a9ffbb7bf8252b4e5efc0400cdeac5809340e5d2b21/sentencepiece-0.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea5f536e32ea8ec96086ee00d7a4a131ce583a1b18d130711707c10e69601cb2", size = 2409370 }, 344 | { url = "https://files.pythonhosted.org/packages/2e/08/a4c135ad6fc2ce26798d14ab72790d66e813efc9589fd30a5316a88ca8d5/sentencepiece-0.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0cb51f53b6aae3c36bafe41e86167c71af8370a039f542c43b0cce5ef24a68c", size = 1239288 }, 345 | { url = "https://files.pythonhosted.org/packages/49/0a/2fe387f825ac5aad5a0bfe221904882106cac58e1b693ba7818785a882b6/sentencepiece-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3212121805afc58d8b00ab4e7dd1f8f76c203ddb9dc94aa4079618a31cf5da0f", size = 1181597 }, 346 | { url = "https://files.pythonhosted.org/packages/cc/38/e4698ee2293fe4835dc033c49796a39b3eebd8752098f6bd0aa53a14af1f/sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a3149e3066c2a75e0d68a43eb632d7ae728c7925b517f4c05c40f6f7280ce08", size = 1259220 }, 347 | { url = "https://files.pythonhosted.org/packages/12/24/fd7ef967c9dad2f6e6e5386d0cadaf65cda8b7be6e3861a9ab3121035139/sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632f3594d3e7ac8b367bca204cb3fd05a01d5b21455acd097ea4c0e30e2f63d7", size = 1355962 }, 348 | { url = "https://files.pythonhosted.org/packages/4f/d2/18246f43ca730bb81918f87b7e886531eda32d835811ad9f4657c54eee35/sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f295105c6bdbb05bd5e1b0cafbd78ff95036f5d3641e7949455a3f4e5e7c3109", size = 1301706 }, 349 | { url = "https://files.pythonhosted.org/packages/8a/47/ca237b562f420044ab56ddb4c278672f7e8c866e183730a20e413b38a989/sentencepiece-0.2.0-cp312-cp312-win32.whl", hash = "sha256:fb89f811e5efd18bab141afc3fea3de141c3f69f3fe9e898f710ae7fe3aab251", size = 936941 }, 350 | { url = "https://files.pythonhosted.org/packages/c6/97/d159c32642306ee2b70732077632895438867b3b6df282354bd550cf2a67/sentencepiece-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a673a72aab81fef5ebe755c6e0cc60087d1f3a4700835d40537183c1703a45f", size = 991994 }, 351 | ] 352 | 353 | [[package]] 354 | name = "tokenizers" 355 | version = "0.21.1" 356 | source = { registry = "https://pypi.org/simple" } 357 | dependencies = [ 358 | { name = "huggingface-hub" }, 359 | ] 360 | sdist = { url = "https://files.pythonhosted.org/packages/92/76/5ac0c97f1117b91b7eb7323dcd61af80d72f790b4df71249a7850c195f30/tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab", size = 343256 } 361 | wheels = [ 362 | { url = "https://files.pythonhosted.org/packages/a5/1f/328aee25f9115bf04262e8b4e5a2050b7b7cf44b59c74e982db7270c7f30/tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41", size = 2780767 }, 363 | { url = "https://files.pythonhosted.org/packages/ae/1a/4526797f3719b0287853f12c5ad563a9be09d446c44ac784cdd7c50f76ab/tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3", size = 2650555 }, 364 | { url = "https://files.pythonhosted.org/packages/4d/7a/a209b29f971a9fdc1da86f917fe4524564924db50d13f0724feed37b2a4d/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28da6b72d4fb14ee200a1bd386ff74ade8992d7f725f2bde2c495a9a98cf4d9f", size = 2937541 }, 365 | { url = "https://files.pythonhosted.org/packages/3c/1e/b788b50ffc6191e0b1fc2b0d49df8cff16fe415302e5ceb89f619d12c5bc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34d8cfde551c9916cb92014e040806122295a6800914bab5865deb85623931cf", size = 2819058 }, 366 | { url = "https://files.pythonhosted.org/packages/36/aa/3626dfa09a0ecc5b57a8c58eeaeb7dd7ca9a37ad9dd681edab5acd55764c/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaa852d23e125b73d283c98f007e06d4595732104b65402f46e8ef24b588d9f8", size = 3133278 }, 367 | { url = "https://files.pythonhosted.org/packages/a4/4d/8fbc203838b3d26269f944a89459d94c858f5b3f9a9b6ee9728cdcf69161/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a21a15d5c8e603331b8a59548bbe113564136dc0f5ad8306dd5033459a226da0", size = 3144253 }, 368 | { url = "https://files.pythonhosted.org/packages/d8/1b/2bd062adeb7c7511b847b32e356024980c0ffcf35f28947792c2d8ad2288/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fdbd4c067c60a0ac7eca14b6bd18a5bebace54eb757c706b47ea93204f7a37c", size = 3398225 }, 369 | { url = "https://files.pythonhosted.org/packages/8a/63/38be071b0c8e06840bc6046991636bcb30c27f6bb1e670f4f4bc87cf49cc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd9a0061e403546f7377df940e866c3e678d7d4e9643d0461ea442b4f89e61a", size = 3038874 }, 370 | { url = "https://files.pythonhosted.org/packages/ec/83/afa94193c09246417c23a3c75a8a0a96bf44ab5630a3015538d0c316dd4b/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db9484aeb2e200c43b915a1a0150ea885e35f357a5a8fabf7373af333dcc8dbf", size = 9014448 }, 371 | { url = "https://files.pythonhosted.org/packages/ae/b3/0e1a37d4f84c0f014d43701c11eb8072704f6efe8d8fc2dcdb79c47d76de/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed248ab5279e601a30a4d67bdb897ecbe955a50f1e7bb62bd99f07dd11c2f5b6", size = 8937877 }, 372 | { url = "https://files.pythonhosted.org/packages/ac/33/ff08f50e6d615eb180a4a328c65907feb6ded0b8f990ec923969759dc379/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:9ac78b12e541d4ce67b4dfd970e44c060a2147b9b2a21f509566d556a509c67d", size = 9186645 }, 373 | { url = "https://files.pythonhosted.org/packages/5f/aa/8ae85f69a9f6012c6f8011c6f4aa1c96154c816e9eea2e1b758601157833/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5a69c1a4496b81a5ee5d2c1f3f7fbdf95e90a0196101b0ee89ed9956b8a168f", size = 9384380 }, 374 | { url = "https://files.pythonhosted.org/packages/e8/5b/a5d98c89f747455e8b7a9504910c865d5e51da55e825a7ae641fb5ff0a58/tokenizers-0.21.1-cp39-abi3-win32.whl", hash = "sha256:1039a3a5734944e09de1d48761ade94e00d0fa760c0e0551151d4dd851ba63e3", size = 2239506 }, 375 | { url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382", size = 2435481 }, 376 | ] 377 | 378 | [[package]] 379 | name = "tqdm" 380 | version = "4.67.1" 381 | source = { registry = "https://pypi.org/simple" } 382 | dependencies = [ 383 | { name = "colorama", marker = "sys_platform == 'win32'" }, 384 | ] 385 | sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } 386 | wheels = [ 387 | { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, 388 | ] 389 | 390 | [[package]] 391 | name = "transformers" 392 | version = "4.50.0" 393 | source = { registry = "https://pypi.org/simple" } 394 | dependencies = [ 395 | { name = "filelock" }, 396 | { name = "huggingface-hub" }, 397 | { name = "numpy" }, 398 | { name = "packaging" }, 399 | { name = "pyyaml" }, 400 | { name = "regex" }, 401 | { name = "requests" }, 402 | { name = "safetensors" }, 403 | { name = "tokenizers" }, 404 | { name = "tqdm" }, 405 | ] 406 | sdist = { url = "https://files.pythonhosted.org/packages/fa/71/164c42d5b4fde92d3637113c7c846b147f8b4c1a3ea486d35a19b069c11e/transformers-4.50.0.tar.gz", hash = "sha256:d4b0f587ec88825981103fee0a1e80230d956ecc8a7f3feeaafbe49a233c88b8", size = 8770757 } 407 | wheels = [ 408 | { url = "https://files.pythonhosted.org/packages/75/b9/093543d741ddb7ccaeb655c8800968bd5cb42e26a51560287b00b4aa748b/transformers-4.50.0-py3-none-any.whl", hash = "sha256:d75465d523a28bcfef0028c671f682edee29418ab9a5a15cf8a05171e7c54cb7", size = 10183482 }, 409 | ] 410 | 411 | [[package]] 412 | name = "typing-extensions" 413 | version = "4.12.2" 414 | source = { registry = "https://pypi.org/simple" } 415 | sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } 416 | wheels = [ 417 | { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, 418 | ] 419 | 420 | [[package]] 421 | name = "urllib3" 422 | version = "2.3.0" 423 | source = { registry = "https://pypi.org/simple" } 424 | sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } 425 | wheels = [ 426 | { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, 427 | ] 428 | -------------------------------------------------------------------------------- /workflows/Manual_Translation+Extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "81c9f6a3-c794-482d-8433-63c814a0a1ab", 3 | "revision": 0, 4 | "last_node_id": 27, 5 | "last_link_id": 32, 6 | "nodes": [ 7 | { 8 | "id": 8, 9 | "type": "DanbotGenerationConfig", 10 | "pos": [ 11 | 5325.4375, 12 | 2751.997802734375 13 | ], 14 | "size": [ 15 | 315, 16 | 202 17 | ], 18 | "flags": { 19 | "collapsed": false 20 | }, 21 | "order": 0, 22 | "mode": 0, 23 | "inputs": [], 24 | "outputs": [ 25 | { 26 | "name": "generation_config", 27 | "type": "DANBOT_GENERATION_CONFIG", 28 | "links": [ 29 | 2 30 | ] 31 | } 32 | ], 33 | "properties": { 34 | "Node name for S&R": "DanbotGenerationConfig" 35 | }, 36 | "widgets_values": [ 37 | 256, 38 | "false", 39 | 1, 40 | 1, 41 | 50, 42 | 0, 43 | 1 44 | ] 45 | }, 46 | { 47 | "id": 16, 48 | "type": "DanbotV2408FormatterNode", 49 | "pos": [ 50 | 6908.4208984375, 51 | 3039.24267578125 52 | ], 53 | "size": [ 54 | 355.20001220703125, 55 | 98 56 | ], 57 | "flags": {}, 58 | "order": 14, 59 | "mode": 0, 60 | "inputs": [ 61 | { 62 | "name": "model", 63 | "type": "DANBOT_MODEL", 64 | "link": 18 65 | }, 66 | { 67 | "name": "template_config", 68 | "type": "DANBOT_TEMPLATE_CONFIG", 69 | "link": 29 70 | }, 71 | { 72 | "name": "format_kwargs", 73 | "shape": 7, 74 | "type": "DANBOT_FORMAT_KWARGS", 75 | "link": 27 76 | }, 77 | { 78 | "name": "template_name", 79 | "type": "COMBO", 80 | "widget": { 81 | "name": "template_name" 82 | }, 83 | "link": 30 84 | } 85 | ], 86 | "outputs": [ 87 | { 88 | "name": "tag_template", 89 | "type": "STRING", 90 | "links": [ 91 | 25 92 | ] 93 | } 94 | ], 95 | "properties": { 96 | "Node name for S&R": "DanbotV2408FormatterNode" 97 | }, 98 | "widgets_values": [ 99 | "translation" 100 | ] 101 | }, 102 | { 103 | "id": 3, 104 | "type": "DanbotV2408FormatterNode", 105 | "pos": [ 106 | 5313.4453125, 107 | 3032.242919921875 108 | ], 109 | "size": [ 110 | 355.20001220703125, 111 | 98 112 | ], 113 | "flags": {}, 114 | "order": 10, 115 | "mode": 0, 116 | "inputs": [ 117 | { 118 | "name": "model", 119 | "type": "DANBOT_MODEL", 120 | "link": 3 121 | }, 122 | { 123 | "name": "template_config", 124 | "type": "DANBOT_TEMPLATE_CONFIG", 125 | "link": 31 126 | }, 127 | { 128 | "name": "format_kwargs", 129 | "shape": 7, 130 | "type": "DANBOT_FORMAT_KWARGS", 131 | "link": null 132 | }, 133 | { 134 | "name": "template_name", 135 | "type": "COMBO", 136 | "widget": { 137 | "name": "template_name" 138 | }, 139 | "link": 32 140 | } 141 | ], 142 | "outputs": [ 143 | { 144 | "name": "tag_template", 145 | "type": "STRING", 146 | "links": [ 147 | 7 148 | ] 149 | } 150 | ], 151 | "properties": { 152 | "Node name for S&R": "DanbotV2408FormatterNode" 153 | }, 154 | "widgets_values": [ 155 | "translation" 156 | ] 157 | }, 158 | { 159 | "id": 7, 160 | "type": "DanbotLoadModel", 161 | "pos": [ 162 | 4481.79638671875, 163 | 2852.58056640625 164 | ], 165 | "size": [ 166 | 315, 167 | 58 168 | ], 169 | "flags": {}, 170 | "order": 1, 171 | "mode": 0, 172 | "inputs": [], 173 | "outputs": [ 174 | { 175 | "name": "danbot_model", 176 | "type": "DANBOT_MODEL", 177 | "links": [ 178 | 3, 179 | 17, 180 | 18, 181 | 19, 182 | 22 183 | ] 184 | } 185 | ], 186 | "properties": { 187 | "Node name for S&R": "DanbotLoadModel" 188 | }, 189 | "widgets_values": [ 190 | "DanbotNL 2408 260M" 191 | ], 192 | "color": "#223", 193 | "bgcolor": "#335" 194 | }, 195 | { 196 | "id": 11, 197 | "type": "DanbotGenerationConfig", 198 | "pos": [ 199 | 6879.087890625, 200 | 2742.443603515625 201 | ], 202 | "size": [ 203 | 315, 204 | 202 205 | ], 206 | "flags": { 207 | "collapsed": false 208 | }, 209 | "order": 2, 210 | "mode": 0, 211 | "inputs": [], 212 | "outputs": [ 213 | { 214 | "name": "generation_config", 215 | "type": "DANBOT_GENERATION_CONFIG", 216 | "links": [ 217 | 20 218 | ] 219 | } 220 | ], 221 | "properties": { 222 | "Node name for S&R": "DanbotGenerationConfig" 223 | }, 224 | "widgets_values": [ 225 | 256, 226 | "false", 227 | 1, 228 | 1, 229 | 50, 230 | 0, 231 | 1 232 | ] 233 | }, 234 | { 235 | "id": 18, 236 | "type": "DanbotEtensionExtractorNode", 237 | "pos": [ 238 | 6297.22119140625, 239 | 3038.701416015625 240 | ], 241 | "size": [ 242 | 262, 243 | 58 244 | ], 245 | "flags": {}, 246 | "order": 13, 247 | "mode": 0, 248 | "inputs": [ 249 | { 250 | "name": "danbot_model", 251 | "type": "DANBOT_MODEL", 252 | "link": 22 253 | }, 254 | { 255 | "name": "generated_tags", 256 | "type": "STRING", 257 | "widget": { 258 | "name": "generated_tags" 259 | }, 260 | "link": 23 261 | } 262 | ], 263 | "outputs": [ 264 | { 265 | "name": "extension_kwargs", 266 | "type": "DANBOT_FORMAT_KWARGS", 267 | "links": [ 268 | 24, 269 | 27 270 | ] 271 | } 272 | ], 273 | "properties": { 274 | "Node name for S&R": "DanbotEtensionExtractorNode" 275 | }, 276 | "widgets_values": [ 277 | "" 278 | ] 279 | }, 280 | { 281 | "id": 6, 282 | "type": "DanbotGeneratorNode", 283 | "pos": [ 284 | 5801.0517578125, 285 | 2960.7412109375 286 | ], 287 | "size": [ 288 | 405.5999755859375, 289 | 198 290 | ], 291 | "flags": {}, 292 | "order": 11, 293 | "mode": 0, 294 | "inputs": [ 295 | { 296 | "name": "danbot_model", 297 | "type": "DANBOT_MODEL", 298 | "link": 17 299 | }, 300 | { 301 | "name": "generation_config", 302 | "shape": 7, 303 | "type": "DANBOT_GENERATION_CONFIG", 304 | "link": 2 305 | }, 306 | { 307 | "name": "text_prompt", 308 | "type": "STRING", 309 | "widget": { 310 | "name": "text_prompt" 311 | }, 312 | "link": null 313 | }, 314 | { 315 | "name": "tag_template", 316 | "type": "STRING", 317 | "widget": { 318 | "name": "tag_template" 319 | }, 320 | "link": null 321 | }, 322 | { 323 | "name": "ban_tags", 324 | "shape": 7, 325 | "type": "STRING", 326 | "widget": { 327 | "name": "ban_tags" 328 | }, 329 | "link": null 330 | }, 331 | { 332 | "name": "tag_template", 333 | "type": "STRING", 334 | "widget": { 335 | "name": "tag_template" 336 | }, 337 | "link": 7 338 | }, 339 | { 340 | "name": "text_prompt", 341 | "type": "STRING", 342 | "widget": { 343 | "name": "text_prompt" 344 | }, 345 | "link": null 346 | }, 347 | { 348 | "name": "text_prompt", 349 | "type": "STRING", 350 | "widget": { 351 | "name": "text_prompt" 352 | }, 353 | "link": 13 354 | } 355 | ], 356 | "outputs": [ 357 | { 358 | "name": "generated_tags", 359 | "type": "STRING", 360 | "links": [] 361 | }, 362 | { 363 | "name": "raw_output", 364 | "type": "STRING", 365 | "links": [ 366 | 12, 367 | 23 368 | ] 369 | } 370 | ], 371 | "properties": { 372 | "Node name for S&R": "DanbotGeneratorNode" 373 | }, 374 | "widgets_values": [ 375 | "", 376 | "", 377 | 1368053453, 378 | "randomize", 379 | "", 380 | "" 381 | ], 382 | "color": "#323", 383 | "bgcolor": "#535" 384 | }, 385 | { 386 | "id": 20, 387 | "type": "MarkdownNote", 388 | "pos": [ 389 | 5806.849609375, 390 | 2796.87255859375 391 | ], 392 | "size": [ 393 | 390.5043640136719, 394 | 94.77342224121094 395 | ], 396 | "flags": {}, 397 | "order": 3, 398 | "mode": 0, 399 | "inputs": [], 400 | "outputs": [], 401 | "title": "Generator Tips", 402 | "properties": {}, 403 | "widgets_values": [ 404 | "### ← `do_sample` should be `false` when translating\n### ↓`stop_token` must be set to ``, which means the end of generation of the translated tags." 405 | ], 406 | "color": "#432", 407 | "bgcolor": "#653" 408 | }, 409 | { 410 | "id": 21, 411 | "type": "MarkdownNote", 412 | "pos": [ 413 | 4880.859375, 414 | 3248.585205078125 415 | ], 416 | "size": [ 417 | 422.6544494628906, 418 | 94.77342224121094 419 | ], 420 | "flags": {}, 421 | "order": 4, 422 | "mode": 0, 423 | "inputs": [], 424 | "outputs": [], 425 | "title": "Template Config Tips", 426 | "properties": {}, 427 | "widgets_values": [ 428 | "### `template_name` must be `translation` and `length` should be `very_short` when translating.\n\n" 429 | ], 430 | "color": "#432", 431 | "bgcolor": "#653" 432 | }, 433 | { 434 | "id": 24, 435 | "type": "MarkdownNote", 436 | "pos": [ 437 | 7292.98583984375, 438 | 2786.5849609375 439 | ], 440 | "size": [ 441 | 390.5043640136719, 442 | 94.77342224121094 443 | ], 444 | "flags": {}, 445 | "order": 5, 446 | "mode": 0, 447 | "inputs": [], 448 | "outputs": [], 449 | "title": "Generator Tips", 450 | "properties": {}, 451 | "widgets_values": [ 452 | "### ← `do_sample` should be `true` when extending (it allows randomness)\n### ↓`stop_token` must be set to `` (or ``)" 453 | ], 454 | "color": "#432", 455 | "bgcolor": "#653" 456 | }, 457 | { 458 | "id": 19, 459 | "type": "DanbotUtilsPrintString", 460 | "pos": [ 461 | 7329.0283203125, 462 | 3255.7578125 463 | ], 464 | "size": [ 465 | 346.2698974609375, 466 | 272.42205810546875 467 | ], 468 | "flags": {}, 469 | "order": 16, 470 | "mode": 0, 471 | "inputs": [ 472 | { 473 | "name": "input_string", 474 | "shape": 7, 475 | "type": "STRING", 476 | "widget": { 477 | "name": "input_string" 478 | }, 479 | "link": 26 480 | } 481 | ], 482 | "outputs": [ 483 | { 484 | "name": "STRING", 485 | "type": "STRING", 486 | "links": null 487 | } 488 | ], 489 | "title": "Full generated tags", 490 | "properties": { 491 | "Node name for S&R": "DanbotUtilsPrintString" 492 | }, 493 | "widgets_values": [ 494 | "", 495 | "1girl, solo, looking at viewer, animal ears, closed mouth, upper body, blunt bangs, brown eyes, brown hair, short hair, cat ears, cat girl, animal ear fluff" 496 | ], 497 | "color": "#233", 498 | "bgcolor": "#355" 499 | }, 500 | { 501 | "id": 10, 502 | "type": "DanbotUtilsPrintString", 503 | "pos": [ 504 | 5806.99365234375, 505 | 3252.76416015625 506 | ], 507 | "size": [ 508 | 346.2698974609375, 509 | 272.42205810546875 510 | ], 511 | "flags": {}, 512 | "order": 12, 513 | "mode": 0, 514 | "inputs": [ 515 | { 516 | "name": "input_string", 517 | "shape": 7, 518 | "type": "STRING", 519 | "widget": { 520 | "name": "input_string" 521 | }, 522 | "link": 12 523 | } 524 | ], 525 | "outputs": [ 526 | { 527 | "name": "STRING", 528 | "type": "STRING", 529 | "links": null 530 | } 531 | ], 532 | "title": "Raw output preview", 533 | "properties": { 534 | "Node name for S&R": "DanbotUtilsPrintString" 535 | }, 536 | "widgets_values": [ 537 | "", 538 | "<|bos|>, <|rating:general|>, <|aspect_ratio:tall|>, <|length:very_short|>, , <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, , <|translate:exact|>, <|input_end|>, , , , , , , 1girl, solo, looking at viewer, cat girl, " 539 | ], 540 | "color": "#233", 541 | "bgcolor": "#355" 542 | }, 543 | { 544 | "id": 14, 545 | "type": "DanbotGeneratorNode", 546 | "pos": [ 547 | 7304.490234375, 548 | 2952.307373046875 549 | ], 550 | "size": [ 551 | 405.5999755859375, 552 | 198 553 | ], 554 | "flags": {}, 555 | "order": 15, 556 | "mode": 0, 557 | "inputs": [ 558 | { 559 | "name": "danbot_model", 560 | "type": "DANBOT_MODEL", 561 | "link": 19 562 | }, 563 | { 564 | "name": "generation_config", 565 | "shape": 7, 566 | "type": "DANBOT_GENERATION_CONFIG", 567 | "link": 20 568 | }, 569 | { 570 | "name": "text_prompt", 571 | "type": "STRING", 572 | "widget": { 573 | "name": "text_prompt" 574 | }, 575 | "link": 14 576 | }, 577 | { 578 | "name": "tag_template", 579 | "type": "STRING", 580 | "widget": { 581 | "name": "tag_template" 582 | }, 583 | "link": 25 584 | }, 585 | { 586 | "name": "ban_tags", 587 | "shape": 7, 588 | "type": "STRING", 589 | "widget": { 590 | "name": "ban_tags" 591 | }, 592 | "link": null 593 | } 594 | ], 595 | "outputs": [ 596 | { 597 | "name": "generated_tags", 598 | "type": "STRING", 599 | "links": [ 600 | 26 601 | ] 602 | }, 603 | { 604 | "name": "raw_output", 605 | "type": "STRING", 606 | "links": [ 607 | 28 608 | ] 609 | } 610 | ], 611 | "properties": { 612 | "Node name for S&R": "DanbotGeneratorNode" 613 | }, 614 | "widgets_values": [ 615 | "", 616 | "", 617 | 1363105525, 618 | "randomize", 619 | "", 620 | "" 621 | ], 622 | "color": "#323", 623 | "bgcolor": "#535" 624 | }, 625 | { 626 | "id": 25, 627 | "type": "DanbotUtilsPrintString", 628 | "pos": [ 629 | 7765.72216796875, 630 | 3259.49951171875 631 | ], 632 | "size": [ 633 | 346.2698974609375, 634 | 272.42205810546875 635 | ], 636 | "flags": {}, 637 | "order": 17, 638 | "mode": 0, 639 | "inputs": [ 640 | { 641 | "name": "input_string", 642 | "shape": 7, 643 | "type": "STRING", 644 | "widget": { 645 | "name": "input_string" 646 | }, 647 | "link": 28 648 | } 649 | ], 650 | "outputs": [ 651 | { 652 | "name": "STRING", 653 | "type": "STRING", 654 | "links": null 655 | } 656 | ], 657 | "title": "Raw generated tags", 658 | "properties": { 659 | "Node name for S&R": "DanbotUtilsPrintString" 660 | }, 661 | "widgets_values": [ 662 | "", 663 | "<|bos|>, <|rating:general|>, <|aspect_ratio:tall|>, <|length:long|>, , <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, <|text|>, , <|translate:approx|>, <|input_end|>, , , , , , , , , 1girl, solo, looking at viewer, animal ears, closed mouth, upper body, blunt bangs, brown eyes, brown hair, short hair, cat ears, cat girl, animal ear fluff, , " 664 | ] 665 | }, 666 | { 667 | "id": 9, 668 | "type": "DanbotUtilsTextInput", 669 | "pos": [ 670 | 5135.666015625, 671 | 3626.361328125 672 | ], 673 | "size": [ 674 | 401.47210693359375, 675 | 136.54649353027344 676 | ], 677 | "flags": {}, 678 | "order": 6, 679 | "mode": 0, 680 | "inputs": [], 681 | "outputs": [ 682 | { 683 | "name": "STRING", 684 | "type": "STRING", 685 | "links": [ 686 | 13, 687 | 14 688 | ] 689 | } 690 | ], 691 | "title": "Danbot Text Input (Natural Language supported)", 692 | "properties": { 693 | "Node name for S&R": "DanbotUtilsTextInput" 694 | }, 695 | "widgets_values": [ 696 | "猫耳の少女一人がこっちを見ている。" 697 | ], 698 | "color": "#233", 699 | "bgcolor": "#355" 700 | }, 701 | { 702 | "id": 23, 703 | "type": "MarkdownNote", 704 | "pos": [ 705 | 6542.38720703125, 706 | 3356.907958984375 707 | ], 708 | "size": [ 709 | 354.17071533203125, 710 | 88 711 | ], 712 | "flags": {}, 713 | "order": 7, 714 | "mode": 0, 715 | "inputs": [], 716 | "outputs": [], 717 | "title": "Template Config Tips", 718 | "properties": {}, 719 | "widgets_values": [ 720 | "### `template_name` must be `extension` when extending.\n\n" 721 | ], 722 | "color": "#432", 723 | "bgcolor": "#653" 724 | }, 725 | { 726 | "id": 26, 727 | "type": "DanbotV2408TemplateConfigNode", 728 | "pos": [ 729 | 6565.79541015625, 730 | 3142.29052734375 731 | ], 732 | "size": [ 733 | 285.7489929199219, 734 | 150 735 | ], 736 | "flags": {}, 737 | "order": 8, 738 | "mode": 0, 739 | "inputs": [], 740 | "outputs": [ 741 | { 742 | "name": "template_config", 743 | "type": "DANBOT_TEMPLATE_CONFIG", 744 | "links": [ 745 | 29 746 | ] 747 | }, 748 | { 749 | "name": "template_name", 750 | "type": "COMBO", 751 | "links": [ 752 | 30 753 | ] 754 | } 755 | ], 756 | "properties": { 757 | "Node name for S&R": "DanbotV2408TemplateConfigNode" 758 | }, 759 | "widgets_values": [ 760 | "tall", 761 | "general", 762 | "long", 763 | "extension" 764 | ], 765 | "color": "#432", 766 | "bgcolor": "#653" 767 | }, 768 | { 769 | "id": 27, 770 | "type": "DanbotV2408TemplateConfigNode", 771 | "pos": [ 772 | 4911.5791015625, 773 | 3055.395263671875 774 | ], 775 | "size": [ 776 | 285.7489929199219, 777 | 150 778 | ], 779 | "flags": {}, 780 | "order": 9, 781 | "mode": 0, 782 | "inputs": [], 783 | "outputs": [ 784 | { 785 | "name": "template_config", 786 | "type": "DANBOT_TEMPLATE_CONFIG", 787 | "links": [ 788 | 31 789 | ] 790 | }, 791 | { 792 | "name": "template_name", 793 | "type": "COMBO", 794 | "links": [ 795 | 32 796 | ] 797 | } 798 | ], 799 | "properties": { 800 | "Node name for S&R": "DanbotV2408TemplateConfigNode" 801 | }, 802 | "widgets_values": [ 803 | "tall", 804 | "general", 805 | "very_short", 806 | "translation" 807 | ], 808 | "color": "#432", 809 | "bgcolor": "#653" 810 | } 811 | ], 812 | "links": [ 813 | [ 814 | 2, 815 | 8, 816 | 0, 817 | 6, 818 | 1, 819 | "DANBOT_GENERATION_CONFIG" 820 | ], 821 | [ 822 | 3, 823 | 7, 824 | 0, 825 | 3, 826 | 0, 827 | "DANBOT_MODEL" 828 | ], 829 | [ 830 | 7, 831 | 3, 832 | 0, 833 | 6, 834 | 5, 835 | "STRING" 836 | ], 837 | [ 838 | 12, 839 | 6, 840 | 1, 841 | 10, 842 | 0, 843 | "STRING" 844 | ], 845 | [ 846 | 13, 847 | 9, 848 | 0, 849 | 6, 850 | 7, 851 | "STRING" 852 | ], 853 | [ 854 | 14, 855 | 9, 856 | 0, 857 | 14, 858 | 2, 859 | "STRING" 860 | ], 861 | [ 862 | 17, 863 | 7, 864 | 0, 865 | 6, 866 | 0, 867 | "DANBOT_MODEL" 868 | ], 869 | [ 870 | 18, 871 | 7, 872 | 0, 873 | 16, 874 | 0, 875 | "DANBOT_MODEL" 876 | ], 877 | [ 878 | 19, 879 | 7, 880 | 0, 881 | 14, 882 | 0, 883 | "DANBOT_MODEL" 884 | ], 885 | [ 886 | 20, 887 | 11, 888 | 0, 889 | 14, 890 | 1, 891 | "DANBOT_GENERATION_CONFIG" 892 | ], 893 | [ 894 | 22, 895 | 7, 896 | 0, 897 | 18, 898 | 0, 899 | "DANBOT_MODEL" 900 | ], 901 | [ 902 | 23, 903 | 6, 904 | 1, 905 | 18, 906 | 1, 907 | "STRING" 908 | ], 909 | [ 910 | 25, 911 | 16, 912 | 0, 913 | 14, 914 | 3, 915 | "STRING" 916 | ], 917 | [ 918 | 26, 919 | 14, 920 | 0, 921 | 19, 922 | 0, 923 | "STRING" 924 | ], 925 | [ 926 | 27, 927 | 18, 928 | 0, 929 | 16, 930 | 2, 931 | "DANBOT_FORMAT_KWARGS" 932 | ], 933 | [ 934 | 28, 935 | 14, 936 | 1, 937 | 25, 938 | 0, 939 | "STRING" 940 | ], 941 | [ 942 | 29, 943 | 26, 944 | 0, 945 | 16, 946 | 1, 947 | "DANBOT_TEMPLATE_CONFIG" 948 | ], 949 | [ 950 | 30, 951 | 26, 952 | 1, 953 | 16, 954 | 3, 955 | "COMBO" 956 | ], 957 | [ 958 | 31, 959 | 27, 960 | 0, 961 | 3, 962 | 1, 963 | "DANBOT_TEMPLATE_CONFIG" 964 | ], 965 | [ 966 | 32, 967 | 27, 968 | 1, 969 | 3, 970 | 3, 971 | "COMBO" 972 | ] 973 | ], 974 | "groups": [ 975 | { 976 | "id": 1, 977 | "title": "Translation Part", 978 | "bounding": [ 979 | 4840.720703125, 980 | 2658.9169921875, 981 | 1393.5872802734375, 982 | 892.4586181640625 983 | ], 984 | "color": "#b06634", 985 | "font_size": 22, 986 | "flags": { 987 | "pinned": true 988 | } 989 | }, 990 | { 991 | "id": 2, 992 | "title": "Extension Part", 993 | "bounding": [ 994 | 6281.701171875, 995 | 2657.6103515625, 996 | 1449.415283203125, 997 | 894.8373413085938 998 | ], 999 | "color": "#8A8", 1000 | "font_size": 22, 1001 | "flags": { 1002 | "pinned": true 1003 | } 1004 | } 1005 | ], 1006 | "config": {}, 1007 | "extra": { 1008 | "ds": { 1009 | "scale": 0.6115909044841528, 1010 | "offset": [ 1011 | -4296.553574746873, 1012 | -2391.2972737546693 1013 | ] 1014 | }, 1015 | "linkExtensions": [ 1016 | { 1017 | "id": 13, 1018 | "parentId": 2 1019 | }, 1020 | { 1021 | "id": 14, 1022 | "parentId": 4 1023 | }, 1024 | { 1025 | "id": 17, 1026 | "parentId": 3 1027 | }, 1028 | { 1029 | "id": 18, 1030 | "parentId": 5 1031 | }, 1032 | { 1033 | "id": 19, 1034 | "parentId": 5 1035 | }, 1036 | { 1037 | "id": 22, 1038 | "parentId": 3 1039 | } 1040 | ], 1041 | "reroutes": [ 1042 | { 1043 | "id": 2, 1044 | "pos": [ 1045 | 5686.1005859375, 1046 | 3290.57666015625 1047 | ], 1048 | "linkIds": [ 1049 | 13, 1050 | 14 1051 | ] 1052 | }, 1053 | { 1054 | "id": 3, 1055 | "pos": [ 1056 | 5673.5283203125, 1057 | 2918.150634765625 1058 | ], 1059 | "linkIds": [ 1060 | 17, 1061 | 18, 1062 | 19, 1063 | 22 1064 | ] 1065 | }, 1066 | { 1067 | "id": 4, 1068 | "parentId": 2, 1069 | "pos": [ 1070 | 6244.98291015625, 1071 | 3130.797607421875 1072 | ], 1073 | "linkIds": [ 1074 | 14 1075 | ] 1076 | }, 1077 | { 1078 | "id": 5, 1079 | "parentId": 3, 1080 | "pos": [ 1081 | 6360.89013671875, 1082 | 2977.77587890625 1083 | ], 1084 | "linkIds": [ 1085 | 18, 1086 | 19 1087 | ] 1088 | } 1089 | ] 1090 | }, 1091 | "version": 0.4 1092 | } -------------------------------------------------------------------------------- /workflows/Translation+Extension+Image_Generation.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "97a299e7-57c8-4294-9800-a39a86f7b4b3", 3 | "revision": 0, 4 | "last_node_id": 20, 5 | "last_link_id": 29, 6 | "nodes": [ 7 | { 8 | "id": 15, 9 | "type": "DanbotV2408TemplateConfigNode", 10 | "pos": [ 11 | 1483.2630615234375, 12 | 2522.86181640625 13 | ], 14 | "size": [ 15 | 319.1500244140625, 16 | 170 17 | ], 18 | "flags": {}, 19 | "order": 6, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "format_kwargs", 24 | "shape": 7, 25 | "type": "DANBOT_FORMAT_KWARGS", 26 | "link": null 27 | }, 28 | { 29 | "name": "aspect_ratio", 30 | "type": "COMBO", 31 | "widget": { 32 | "name": "aspect_ratio" 33 | }, 34 | "link": null 35 | }, 36 | { 37 | "name": "aspect_ratio", 38 | "type": "COMBO", 39 | "widget": { 40 | "name": "aspect_ratio" 41 | }, 42 | "link": 25 43 | } 44 | ], 45 | "outputs": [ 46 | { 47 | "name": "template_config", 48 | "type": "DANBOT_TEMPLATE_CONFIG", 49 | "slot_index": 0, 50 | "links": [ 51 | 11, 52 | 17 53 | ] 54 | }, 55 | { 56 | "name": "template_name", 57 | "type": "COMBO", 58 | "slot_index": 1, 59 | "links": [] 60 | } 61 | ], 62 | "title": "Translation config", 63 | "properties": { 64 | "Node name for S&R": "DanbotV2408TemplateConfigNode" 65 | }, 66 | "widgets_values": [ 67 | "tall", 68 | "general", 69 | "very_short", 70 | "translation" 71 | ] 72 | }, 73 | { 74 | "id": 20, 75 | "type": "DanbotV2408AutoAspectRatioTag", 76 | "pos": [ 77 | 1125.9580078125, 78 | 2681.9013671875 79 | ], 80 | "size": [ 81 | 285.6000061035156, 82 | 122 83 | ], 84 | "flags": {}, 85 | "order": 0, 86 | "mode": 0, 87 | "inputs": [], 88 | "outputs": [ 89 | { 90 | "name": "aspect_ratio_tag", 91 | "type": "COMBO", 92 | "links": [ 93 | 25, 94 | 26 95 | ] 96 | }, 97 | { 98 | "name": "width", 99 | "type": "INT", 100 | "links": [ 101 | 27 102 | ] 103 | }, 104 | { 105 | "name": "height", 106 | "type": "INT", 107 | "links": [ 108 | 28 109 | ] 110 | } 111 | ], 112 | "properties": { 113 | "Node name for S&R": "DanbotV2408AutoAspectRatioTag" 114 | }, 115 | "widgets_values": [ 116 | 832, 117 | 1152 118 | ] 119 | }, 120 | { 121 | "id": 1, 122 | "type": "DanbotUtilsConcatString", 123 | "pos": [ 124 | 2737.31396484375, 125 | 2464.869384765625 126 | ], 127 | "size": [ 128 | 300.4800109863281, 129 | 302 130 | ], 131 | "flags": {}, 132 | "order": 11, 133 | "mode": 0, 134 | "inputs": [ 135 | { 136 | "name": "string_1", 137 | "shape": 7, 138 | "type": "STRING", 139 | "widget": { 140 | "name": "string_1" 141 | }, 142 | "link": null 143 | }, 144 | { 145 | "name": "string_2", 146 | "shape": 7, 147 | "type": "STRING", 148 | "widget": { 149 | "name": "string_2" 150 | }, 151 | "link": null 152 | }, 153 | { 154 | "name": "string_3", 155 | "shape": 7, 156 | "type": "STRING", 157 | "widget": { 158 | "name": "string_3" 159 | }, 160 | "link": null 161 | }, 162 | { 163 | "name": "string_4", 164 | "shape": 7, 165 | "type": "STRING", 166 | "widget": { 167 | "name": "string_4" 168 | }, 169 | "link": null 170 | }, 171 | { 172 | "name": "string_5", 173 | "shape": 7, 174 | "type": "STRING", 175 | "widget": { 176 | "name": "string_5" 177 | }, 178 | "link": null 179 | }, 180 | { 181 | "name": "string_6", 182 | "shape": 7, 183 | "type": "STRING", 184 | "widget": { 185 | "name": "string_6" 186 | }, 187 | "link": 16 188 | }, 189 | { 190 | "name": "string_1", 191 | "shape": 7, 192 | "type": "STRING", 193 | "widget": { 194 | "name": "string_1" 195 | }, 196 | "link": 20 197 | } 198 | ], 199 | "outputs": [ 200 | { 201 | "name": "STRING", 202 | "type": "STRING", 203 | "slot_index": 0, 204 | "links": [ 205 | 1, 206 | 6 207 | ] 208 | } 209 | ], 210 | "properties": { 211 | "Node name for S&R": "DanbotUtilsConcatString" 212 | }, 213 | "widgets_values": [ 214 | "", 215 | "", 216 | "", 217 | "", 218 | "", 219 | "", 220 | ", " 221 | ] 222 | }, 223 | { 224 | "id": 16, 225 | "type": "DanbotV2408TemplateConfigNode", 226 | "pos": [ 227 | 1834.2733154296875, 228 | 2528.31640625 229 | ], 230 | "size": [ 231 | 313.6499938964844, 232 | 150 233 | ], 234 | "flags": {}, 235 | "order": 7, 236 | "mode": 0, 237 | "inputs": [ 238 | { 239 | "name": "format_kwargs", 240 | "shape": 7, 241 | "type": "DANBOT_FORMAT_KWARGS", 242 | "link": null 243 | }, 244 | { 245 | "name": "aspect_ratio", 246 | "type": "COMBO", 247 | "widget": { 248 | "name": "aspect_ratio" 249 | }, 250 | "link": 26 251 | } 252 | ], 253 | "outputs": [ 254 | { 255 | "name": "template_config", 256 | "type": "DANBOT_TEMPLATE_CONFIG", 257 | "slot_index": 0, 258 | "links": [ 259 | 12, 260 | 18 261 | ] 262 | }, 263 | { 264 | "name": "template_name", 265 | "type": "COMBO", 266 | "slot_index": 1, 267 | "links": [] 268 | } 269 | ], 270 | "title": "Extension config", 271 | "properties": { 272 | "Node name for S&R": "DanbotV2408TemplateConfigNode" 273 | }, 274 | "widgets_values": [ 275 | "tall", 276 | "general", 277 | "long", 278 | "extension" 279 | ] 280 | }, 281 | { 282 | "id": 13, 283 | "type": "CLIPTextEncode", 284 | "pos": [ 285 | 3857.769775390625, 286 | 3069.722412109375 287 | ], 288 | "size": [ 289 | 347.3777160644531, 290 | 113.62898254394531 291 | ], 292 | "flags": {}, 293 | "order": 9, 294 | "mode": 0, 295 | "inputs": [ 296 | { 297 | "name": "clip", 298 | "type": "CLIP", 299 | "link": 24 300 | } 301 | ], 302 | "outputs": [ 303 | { 304 | "name": "CONDITIONING", 305 | "type": "CONDITIONING", 306 | "slot_index": 0, 307 | "links": [ 308 | 23 309 | ] 310 | } 311 | ], 312 | "title": "Negative Prompt", 313 | "properties": { 314 | "Node name for S&R": "CLIPTextEncode" 315 | }, 316 | "widgets_values": [ 317 | "lowres, bad anatomy, bad hands, text, error, missing finger, extra digits, fewer digits, cropped, worst quality, low quality, low score, bad score, average score, signature, watermark, username, blurry, " 318 | ], 319 | "color": "#322", 320 | "bgcolor": "#533" 321 | }, 322 | { 323 | "id": 3, 324 | "type": "CLIPTextEncode", 325 | "pos": [ 326 | 3857.2587890625, 327 | 2932.237060546875 328 | ], 329 | "size": [ 330 | 343.831787109375, 331 | 78.6050033569336 332 | ], 333 | "flags": {}, 334 | "order": 12, 335 | "mode": 0, 336 | "inputs": [ 337 | { 338 | "name": "clip", 339 | "type": "CLIP", 340 | "link": 10 341 | }, 342 | { 343 | "name": "text", 344 | "type": "STRING", 345 | "widget": { 346 | "name": "text" 347 | }, 348 | "link": 1 349 | } 350 | ], 351 | "outputs": [ 352 | { 353 | "name": "CONDITIONING", 354 | "type": "CONDITIONING", 355 | "slot_index": 0, 356 | "links": [ 357 | 3 358 | ] 359 | } 360 | ], 361 | "title": "Positive Prompt", 362 | "properties": { 363 | "Node name for S&R": "CLIPTextEncode" 364 | }, 365 | "widgets_values": [ 366 | "" 367 | ], 368 | "color": "#232", 369 | "bgcolor": "#353" 370 | }, 371 | { 372 | "id": 7, 373 | "type": "PreviewImage", 374 | "pos": [ 375 | 4653.41943359375, 376 | 2939.456787109375 377 | ], 378 | "size": [ 379 | 387, 380 | 530 381 | ], 382 | "flags": {}, 383 | "order": 16, 384 | "mode": 0, 385 | "inputs": [ 386 | { 387 | "name": "images", 388 | "type": "IMAGE", 389 | "link": 5 390 | } 391 | ], 392 | "outputs": [], 393 | "title": "Translation + Extension", 394 | "properties": { 395 | "Node name for S&R": "PreviewImage" 396 | }, 397 | "widgets_values": [], 398 | "color": "#233", 399 | "bgcolor": "#355" 400 | }, 401 | { 402 | "id": 4, 403 | "type": "VAEDecode", 404 | "pos": [ 405 | 4653.40576171875, 406 | 2824.387451171875 407 | ], 408 | "size": [ 409 | 210, 410 | 46 411 | ], 412 | "flags": {}, 413 | "order": 15, 414 | "mode": 0, 415 | "inputs": [ 416 | { 417 | "name": "samples", 418 | "type": "LATENT", 419 | "link": 2 420 | }, 421 | { 422 | "name": "vae", 423 | "type": "VAE", 424 | "link": 29 425 | } 426 | ], 427 | "outputs": [ 428 | { 429 | "name": "IMAGE", 430 | "type": "IMAGE", 431 | "slot_index": 0, 432 | "links": [ 433 | 5 434 | ] 435 | } 436 | ], 437 | "properties": { 438 | "Node name for S&R": "VAEDecode" 439 | }, 440 | "widgets_values": [] 441 | }, 442 | { 443 | "id": 8, 444 | "type": "DanbotUtilsPrintString", 445 | "pos": [ 446 | 3068.317138671875, 447 | 2453.749755859375 448 | ], 449 | "size": [ 450 | 329.52001953125, 451 | 229.1075897216797 452 | ], 453 | "flags": {}, 454 | "order": 13, 455 | "mode": 0, 456 | "inputs": [ 457 | { 458 | "name": "input_string", 459 | "shape": 7, 460 | "type": "STRING", 461 | "widget": { 462 | "name": "input_string" 463 | }, 464 | "link": 6 465 | } 466 | ], 467 | "outputs": [ 468 | { 469 | "name": "STRING", 470 | "type": "STRING", 471 | "links": null 472 | } 473 | ], 474 | "title": "Generated tags with quality tags", 475 | "properties": { 476 | "Node name for S&R": "DanbotUtilsPrintString" 477 | }, 478 | "widgets_values": [ 479 | "", 480 | "1girl, solo, blue background, halftone background, looking at viewer, animal ears, school uniform, yellow eyes, black hair, long hair, sitting, crossed legs, cat ears, border, halftone, white border, couch, shirt, skirt, closed mouth, very long hair, short sleeves, white shirt, black skirt, pleated skirt, serafuku, black sailor collar, socks, white socks, outside border, sailor collar, masterpiece, best quality, high score, great score, latest" 481 | ], 482 | "color": "#233", 483 | "bgcolor": "#355" 484 | }, 485 | { 486 | "id": 6, 487 | "type": "DanbotGenerationConfig", 488 | "pos": [ 489 | 1784.31298828125, 490 | 2746.008544921875 491 | ], 492 | "size": [ 493 | 315, 494 | 202 495 | ], 496 | "flags": {}, 497 | "order": 1, 498 | "mode": 0, 499 | "inputs": [], 500 | "outputs": [ 501 | { 502 | "name": "generation_config", 503 | "type": "DANBOT_GENERATION_CONFIG", 504 | "slot_index": 0, 505 | "links": [ 506 | 13, 507 | 21 508 | ] 509 | } 510 | ], 511 | "properties": { 512 | "Node name for S&R": "DanbotGenerationConfig" 513 | }, 514 | "widgets_values": [ 515 | 256, 516 | "true", 517 | 1, 518 | 1, 519 | 50, 520 | 0.05, 521 | 1 522 | ] 523 | }, 524 | { 525 | "id": 18, 526 | "type": "DanbotUtilsTextInput", 527 | "pos": [ 528 | 1762.7659912109375, 529 | 3009.739990234375 530 | ], 531 | "size": [ 532 | 336.8819885253906, 533 | 182.83450317382812 534 | ], 535 | "flags": {}, 536 | "order": 2, 537 | "mode": 0, 538 | "inputs": [], 539 | "outputs": [ 540 | { 541 | "name": "STRING", 542 | "type": "STRING", 543 | "slot_index": 0, 544 | "links": [ 545 | 22 546 | ] 547 | } 548 | ], 549 | "properties": { 550 | "Node name for S&R": "DanbotUtilsTextInput" 551 | }, 552 | "widgets_values": [ 553 | "猫耳で黒髪ロング、制服を着ており、目は黄色の少女。背景はハーフトーンのついた青で、白枠が付いている。ソファーに座って足を組みながらこっちを見ている。" 554 | ], 555 | "color": "#233", 556 | "bgcolor": "#355" 557 | }, 558 | { 559 | "id": 17, 560 | "type": "DanbotUtilsTextInput", 561 | "pos": [ 562 | 2332.1572265625, 563 | 2800.824462890625 564 | ], 565 | "size": [ 566 | 268.7149963378906, 567 | 130.4250030517578 568 | ], 569 | "flags": {}, 570 | "order": 3, 571 | "mode": 0, 572 | "inputs": [], 573 | "outputs": [ 574 | { 575 | "name": "STRING", 576 | "type": "STRING", 577 | "slot_index": 0, 578 | "links": [ 579 | 16 580 | ] 581 | } 582 | ], 583 | "title": "Quality tags", 584 | "properties": { 585 | "Node name for S&R": "DanbotUtilsTextInput" 586 | }, 587 | "widgets_values": [ 588 | "masterpiece, best quality, high score, great score, latest" 589 | ] 590 | }, 591 | { 592 | "id": 2, 593 | "type": "EmptyLatentImage", 594 | "pos": [ 595 | 3852.526123046875, 596 | 2668.554443359375 597 | ], 598 | "size": [ 599 | 315, 600 | 126 601 | ], 602 | "flags": {}, 603 | "order": 8, 604 | "mode": 0, 605 | "inputs": [ 606 | { 607 | "name": "width", 608 | "type": "INT", 609 | "widget": { 610 | "name": "width" 611 | }, 612 | "link": 27 613 | }, 614 | { 615 | "name": "height", 616 | "type": "INT", 617 | "widget": { 618 | "name": "height" 619 | }, 620 | "link": null 621 | }, 622 | { 623 | "name": "height", 624 | "type": "INT", 625 | "widget": { 626 | "name": "height" 627 | }, 628 | "link": 28 629 | } 630 | ], 631 | "outputs": [ 632 | { 633 | "name": "LATENT", 634 | "type": "LATENT", 635 | "slot_index": 0, 636 | "links": [ 637 | 4 638 | ] 639 | } 640 | ], 641 | "properties": { 642 | "Node name for S&R": "EmptyLatentImage" 643 | }, 644 | "widgets_values": [ 645 | 832, 646 | 1152, 647 | 1 648 | ] 649 | }, 650 | { 651 | "id": 9, 652 | "type": "DanbotLoadModel", 653 | "pos": [ 654 | 1130.7950439453125, 655 | 2390.42626953125 656 | ], 657 | "size": [ 658 | 315, 659 | 58 660 | ], 661 | "flags": {}, 662 | "order": 4, 663 | "mode": 0, 664 | "inputs": [], 665 | "outputs": [ 666 | { 667 | "name": "danbot_model", 668 | "type": "DANBOT_MODEL", 669 | "slot_index": 0, 670 | "links": [ 671 | 7, 672 | 19 673 | ] 674 | } 675 | ], 676 | "properties": { 677 | "Node name for S&R": "DanbotLoadModel" 678 | }, 679 | "widgets_values": [ 680 | "DanbotNL 2408 260M" 681 | ], 682 | "color": "#432", 683 | "bgcolor": "#653" 684 | }, 685 | { 686 | "id": 12, 687 | "type": "CheckpointLoaderSimple", 688 | "pos": [ 689 | 3489.293212890625, 690 | 2819.879150390625 691 | ], 692 | "size": [ 693 | 315, 694 | 98 695 | ], 696 | "flags": {}, 697 | "order": 5, 698 | "mode": 0, 699 | "inputs": [], 700 | "outputs": [ 701 | { 702 | "name": "MODEL", 703 | "type": "MODEL", 704 | "slot_index": 0, 705 | "links": [ 706 | 9 707 | ] 708 | }, 709 | { 710 | "name": "CLIP", 711 | "type": "CLIP", 712 | "slot_index": 1, 713 | "links": [ 714 | 10, 715 | 24 716 | ] 717 | }, 718 | { 719 | "name": "VAE", 720 | "type": "VAE", 721 | "slot_index": 2, 722 | "links": [ 723 | 29 724 | ] 725 | } 726 | ], 727 | "properties": { 728 | "Node name for S&R": "CheckpointLoaderSimple" 729 | }, 730 | "widgets_values": [ 731 | "animagine-xl-4.0-opt.safetensors" 732 | ], 733 | "color": "#432", 734 | "bgcolor": "#653" 735 | }, 736 | { 737 | "id": 19, 738 | "type": "DanbotV2408PipelineNode", 739 | "pos": [ 740 | 2325.0859375, 741 | 2462.9833984375 742 | ], 743 | "size": [ 744 | 362.79998779296875, 745 | 190 746 | ], 747 | "flags": {}, 748 | "order": 10, 749 | "mode": 0, 750 | "inputs": [ 751 | { 752 | "name": "danbot_model", 753 | "type": "DANBOT_MODEL", 754 | "link": 19 755 | }, 756 | { 757 | "name": "translation_template_config", 758 | "shape": 7, 759 | "type": "DANBOT_TEMPLATE_CONFIG", 760 | "link": 17 761 | }, 762 | { 763 | "name": "extension_template_config", 764 | "shape": 7, 765 | "type": "DANBOT_TEMPLATE_CONFIG", 766 | "link": 18 767 | }, 768 | { 769 | "name": "generation_config", 770 | "shape": 7, 771 | "type": "DANBOT_GENERATION_CONFIG", 772 | "link": 21 773 | }, 774 | { 775 | "name": "text_prompt", 776 | "type": "STRING", 777 | "widget": { 778 | "name": "text_prompt" 779 | }, 780 | "link": 22 781 | }, 782 | { 783 | "name": "ban_tags", 784 | "shape": 7, 785 | "type": "STRING", 786 | "widget": { 787 | "name": "ban_tags" 788 | }, 789 | "link": null 790 | } 791 | ], 792 | "outputs": [ 793 | { 794 | "name": "generated_tags", 795 | "type": "STRING", 796 | "links": [ 797 | 20 798 | ] 799 | }, 800 | { 801 | "name": "translated_tags", 802 | "type": "STRING", 803 | "links": null 804 | }, 805 | { 806 | "name": "extended_tags", 807 | "type": "STRING", 808 | "links": null 809 | }, 810 | { 811 | "name": "raw_output", 812 | "type": "STRING", 813 | "links": null 814 | } 815 | ], 816 | "properties": { 817 | "Node name for S&R": "DanbotV2408PipelineNode" 818 | }, 819 | "widgets_values": [ 820 | "", 821 | 347414205, 822 | "fixed", 823 | "" 824 | ], 825 | "color": "#323", 826 | "bgcolor": "#535" 827 | }, 828 | { 829 | "id": 5, 830 | "type": "KSampler", 831 | "pos": [ 832 | 4296.9150390625, 833 | 2833.7607421875 834 | ], 835 | "size": [ 836 | 315, 837 | 262 838 | ], 839 | "flags": {}, 840 | "order": 14, 841 | "mode": 0, 842 | "inputs": [ 843 | { 844 | "name": "model", 845 | "type": "MODEL", 846 | "link": 9 847 | }, 848 | { 849 | "name": "positive", 850 | "type": "CONDITIONING", 851 | "link": 3 852 | }, 853 | { 854 | "name": "negative", 855 | "type": "CONDITIONING", 856 | "link": 23 857 | }, 858 | { 859 | "name": "latent_image", 860 | "type": "LATENT", 861 | "link": 4 862 | } 863 | ], 864 | "outputs": [ 865 | { 866 | "name": "LATENT", 867 | "type": "LATENT", 868 | "slot_index": 0, 869 | "links": [ 870 | 2 871 | ] 872 | } 873 | ], 874 | "properties": { 875 | "Node name for S&R": "KSampler" 876 | }, 877 | "widgets_values": [ 878 | 944162813372176, 879 | "fixed", 880 | 25, 881 | 5, 882 | "euler_ancestral", 883 | "normal", 884 | 1 885 | ], 886 | "color": "#323", 887 | "bgcolor": "#535" 888 | } 889 | ], 890 | "links": [ 891 | [ 892 | 1, 893 | 1, 894 | 0, 895 | 3, 896 | 1, 897 | "STRING" 898 | ], 899 | [ 900 | 2, 901 | 5, 902 | 0, 903 | 4, 904 | 0, 905 | "LATENT" 906 | ], 907 | [ 908 | 3, 909 | 3, 910 | 0, 911 | 5, 912 | 1, 913 | "CONDITIONING" 914 | ], 915 | [ 916 | 4, 917 | 2, 918 | 0, 919 | 5, 920 | 3, 921 | "LATENT" 922 | ], 923 | [ 924 | 5, 925 | 4, 926 | 0, 927 | 7, 928 | 0, 929 | "IMAGE" 930 | ], 931 | [ 932 | 6, 933 | 1, 934 | 0, 935 | 8, 936 | 0, 937 | "STRING" 938 | ], 939 | [ 940 | 9, 941 | 12, 942 | 0, 943 | 5, 944 | 0, 945 | "MODEL" 946 | ], 947 | [ 948 | 10, 949 | 12, 950 | 1, 951 | 3, 952 | 0, 953 | "CLIP" 954 | ], 955 | [ 956 | 16, 957 | 17, 958 | 0, 959 | 1, 960 | 5, 961 | "STRING" 962 | ], 963 | [ 964 | 17, 965 | 15, 966 | 0, 967 | 19, 968 | 1, 969 | "DANBOT_TEMPLATE_CONFIG" 970 | ], 971 | [ 972 | 18, 973 | 16, 974 | 0, 975 | 19, 976 | 2, 977 | "DANBOT_TEMPLATE_CONFIG" 978 | ], 979 | [ 980 | 19, 981 | 9, 982 | 0, 983 | 19, 984 | 0, 985 | "DANBOT_MODEL" 986 | ], 987 | [ 988 | 20, 989 | 19, 990 | 0, 991 | 1, 992 | 6, 993 | "STRING" 994 | ], 995 | [ 996 | 21, 997 | 6, 998 | 0, 999 | 19, 1000 | 3, 1001 | "DANBOT_GENERATION_CONFIG" 1002 | ], 1003 | [ 1004 | 22, 1005 | 18, 1006 | 0, 1007 | 19, 1008 | 4, 1009 | "STRING" 1010 | ], 1011 | [ 1012 | 23, 1013 | 13, 1014 | 0, 1015 | 5, 1016 | 2, 1017 | "CONDITIONING" 1018 | ], 1019 | [ 1020 | 24, 1021 | 12, 1022 | 1, 1023 | 13, 1024 | 0, 1025 | "CLIP" 1026 | ], 1027 | [ 1028 | 25, 1029 | 20, 1030 | 0, 1031 | 15, 1032 | 2, 1033 | "COMBO" 1034 | ], 1035 | [ 1036 | 26, 1037 | 20, 1038 | 0, 1039 | 16, 1040 | 1, 1041 | "COMBO" 1042 | ], 1043 | [ 1044 | 27, 1045 | 20, 1046 | 1, 1047 | 2, 1048 | 0, 1049 | "INT" 1050 | ], 1051 | [ 1052 | 28, 1053 | 20, 1054 | 2, 1055 | 2, 1056 | 2, 1057 | "INT" 1058 | ], 1059 | [ 1060 | 29, 1061 | 12, 1062 | 2, 1063 | 4, 1064 | 1, 1065 | "VAE" 1066 | ] 1067 | ], 1068 | "groups": [ 1069 | { 1070 | "id": 1, 1071 | "title": "Image Generation", 1072 | "bounding": [ 1073 | 3476.108642578125, 1074 | 2569.760498046875, 1075 | 1604.12548828125, 1076 | 944.6903686523438 1077 | ], 1078 | "font_size": 22, 1079 | "flags": { 1080 | "pinned": true 1081 | } 1082 | }, 1083 | { 1084 | "id": 2, 1085 | "title": "Prompt Generation", 1086 | "bounding": [ 1087 | 1104.904541015625, 1088 | 2292.62646484375, 1089 | 2319.90576171875, 1090 | 946.2933349609375 1091 | ], 1092 | "color": "#3f789e", 1093 | "font_size": 22, 1094 | "flags": { 1095 | "pinned": true 1096 | } 1097 | } 1098 | ], 1099 | "config": {}, 1100 | "extra": { 1101 | "ds": { 1102 | "scale": 0.8264462809917359, 1103 | "offset": [ 1104 | -1294.4210954660834, 1105 | -2457.1033020025375 1106 | ] 1107 | } 1108 | }, 1109 | "version": 0.4 1110 | } -------------------------------------------------------------------------------- /workflows/Translation+Extension.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "97a299e7-57c8-4294-9800-a39a86f7b4b3", 3 | "revision": 0, 4 | "last_node_id": 20, 5 | "last_link_id": 29, 6 | "nodes": [ 7 | { 8 | "id": 15, 9 | "type": "DanbotV2408TemplateConfigNode", 10 | "pos": [ 11 | 1483.2630615234375, 12 | 2522.86181640625 13 | ], 14 | "size": [ 15 | 319.1500244140625, 16 | 170 17 | ], 18 | "flags": {}, 19 | "order": 5, 20 | "mode": 0, 21 | "inputs": [ 22 | { 23 | "name": "format_kwargs", 24 | "shape": 7, 25 | "type": "DANBOT_FORMAT_KWARGS", 26 | "link": null 27 | }, 28 | { 29 | "name": "aspect_ratio", 30 | "type": "COMBO", 31 | "widget": { 32 | "name": "aspect_ratio" 33 | }, 34 | "link": null 35 | }, 36 | { 37 | "name": "aspect_ratio", 38 | "type": "COMBO", 39 | "widget": { 40 | "name": "aspect_ratio" 41 | }, 42 | "link": 25 43 | } 44 | ], 45 | "outputs": [ 46 | { 47 | "name": "template_config", 48 | "type": "DANBOT_TEMPLATE_CONFIG", 49 | "slot_index": 0, 50 | "links": [ 51 | 11, 52 | 17 53 | ] 54 | }, 55 | { 56 | "name": "template_name", 57 | "type": "COMBO", 58 | "slot_index": 1, 59 | "links": [] 60 | } 61 | ], 62 | "title": "Translation config", 63 | "properties": { 64 | "Node name for S&R": "DanbotV2408TemplateConfigNode" 65 | }, 66 | "widgets_values": [ 67 | "tall", 68 | "general", 69 | "very_short", 70 | "translation" 71 | ] 72 | }, 73 | { 74 | "id": 20, 75 | "type": "DanbotV2408AutoAspectRatioTag", 76 | "pos": [ 77 | 1125.9580078125, 78 | 2681.9013671875 79 | ], 80 | "size": [ 81 | 285.6000061035156, 82 | 122 83 | ], 84 | "flags": {}, 85 | "order": 0, 86 | "mode": 0, 87 | "inputs": [], 88 | "outputs": [ 89 | { 90 | "name": "aspect_ratio_tag", 91 | "type": "COMBO", 92 | "links": [ 93 | 25, 94 | 26 95 | ] 96 | }, 97 | { 98 | "name": "width", 99 | "type": "INT", 100 | "links": [] 101 | }, 102 | { 103 | "name": "height", 104 | "type": "INT", 105 | "links": [] 106 | } 107 | ], 108 | "properties": { 109 | "Node name for S&R": "DanbotV2408AutoAspectRatioTag" 110 | }, 111 | "widgets_values": [ 112 | 832, 113 | 1152 114 | ] 115 | }, 116 | { 117 | "id": 1, 118 | "type": "DanbotUtilsConcatString", 119 | "pos": [ 120 | 2737.31396484375, 121 | 2464.869384765625 122 | ], 123 | "size": [ 124 | 300.4800109863281, 125 | 302 126 | ], 127 | "flags": {}, 128 | "order": 8, 129 | "mode": 0, 130 | "inputs": [ 131 | { 132 | "name": "string_1", 133 | "shape": 7, 134 | "type": "STRING", 135 | "widget": { 136 | "name": "string_1" 137 | }, 138 | "link": null 139 | }, 140 | { 141 | "name": "string_2", 142 | "shape": 7, 143 | "type": "STRING", 144 | "widget": { 145 | "name": "string_2" 146 | }, 147 | "link": null 148 | }, 149 | { 150 | "name": "string_3", 151 | "shape": 7, 152 | "type": "STRING", 153 | "widget": { 154 | "name": "string_3" 155 | }, 156 | "link": null 157 | }, 158 | { 159 | "name": "string_4", 160 | "shape": 7, 161 | "type": "STRING", 162 | "widget": { 163 | "name": "string_4" 164 | }, 165 | "link": null 166 | }, 167 | { 168 | "name": "string_5", 169 | "shape": 7, 170 | "type": "STRING", 171 | "widget": { 172 | "name": "string_5" 173 | }, 174 | "link": null 175 | }, 176 | { 177 | "name": "string_6", 178 | "shape": 7, 179 | "type": "STRING", 180 | "widget": { 181 | "name": "string_6" 182 | }, 183 | "link": 16 184 | }, 185 | { 186 | "name": "string_1", 187 | "shape": 7, 188 | "type": "STRING", 189 | "widget": { 190 | "name": "string_1" 191 | }, 192 | "link": 20 193 | } 194 | ], 195 | "outputs": [ 196 | { 197 | "name": "STRING", 198 | "type": "STRING", 199 | "slot_index": 0, 200 | "links": [ 201 | 6 202 | ] 203 | } 204 | ], 205 | "properties": { 206 | "Node name for S&R": "DanbotUtilsConcatString" 207 | }, 208 | "widgets_values": [ 209 | "", 210 | "", 211 | "", 212 | "", 213 | "", 214 | "", 215 | ", " 216 | ] 217 | }, 218 | { 219 | "id": 16, 220 | "type": "DanbotV2408TemplateConfigNode", 221 | "pos": [ 222 | 1834.2733154296875, 223 | 2528.31640625 224 | ], 225 | "size": [ 226 | 313.6499938964844, 227 | 150 228 | ], 229 | "flags": {}, 230 | "order": 6, 231 | "mode": 0, 232 | "inputs": [ 233 | { 234 | "name": "format_kwargs", 235 | "shape": 7, 236 | "type": "DANBOT_FORMAT_KWARGS", 237 | "link": null 238 | }, 239 | { 240 | "name": "aspect_ratio", 241 | "type": "COMBO", 242 | "widget": { 243 | "name": "aspect_ratio" 244 | }, 245 | "link": 26 246 | } 247 | ], 248 | "outputs": [ 249 | { 250 | "name": "template_config", 251 | "type": "DANBOT_TEMPLATE_CONFIG", 252 | "slot_index": 0, 253 | "links": [ 254 | 12, 255 | 18 256 | ] 257 | }, 258 | { 259 | "name": "template_name", 260 | "type": "COMBO", 261 | "slot_index": 1, 262 | "links": [] 263 | } 264 | ], 265 | "title": "Extension config", 266 | "properties": { 267 | "Node name for S&R": "DanbotV2408TemplateConfigNode" 268 | }, 269 | "widgets_values": [ 270 | "tall", 271 | "general", 272 | "long", 273 | "extension" 274 | ] 275 | }, 276 | { 277 | "id": 8, 278 | "type": "DanbotUtilsPrintString", 279 | "pos": [ 280 | 3068.317138671875, 281 | 2453.749755859375 282 | ], 283 | "size": [ 284 | 329.52001953125, 285 | 229.1075897216797 286 | ], 287 | "flags": {}, 288 | "order": 9, 289 | "mode": 0, 290 | "inputs": [ 291 | { 292 | "name": "input_string", 293 | "shape": 7, 294 | "type": "STRING", 295 | "widget": { 296 | "name": "input_string" 297 | }, 298 | "link": 6 299 | } 300 | ], 301 | "outputs": [ 302 | { 303 | "name": "STRING", 304 | "type": "STRING", 305 | "links": null 306 | } 307 | ], 308 | "title": "Generated tags with quality tags", 309 | "properties": { 310 | "Node name for S&R": "DanbotUtilsPrintString" 311 | }, 312 | "widgets_values": [ 313 | "", 314 | "1girl, solo, blue background, halftone background, looking at viewer, animal ears, school uniform, yellow eyes, black hair, long hair, sitting, crossed legs, cat ears, border, halftone, white border, couch, shirt, skirt, closed mouth, very long hair, short sleeves, white shirt, black skirt, pleated skirt, serafuku, black sailor collar, socks, white socks, outside border, sailor collar, masterpiece, best quality, high score, great score, latest" 315 | ], 316 | "color": "#233", 317 | "bgcolor": "#355" 318 | }, 319 | { 320 | "id": 6, 321 | "type": "DanbotGenerationConfig", 322 | "pos": [ 323 | 1784.31298828125, 324 | 2746.008544921875 325 | ], 326 | "size": [ 327 | 315, 328 | 202 329 | ], 330 | "flags": {}, 331 | "order": 1, 332 | "mode": 0, 333 | "inputs": [], 334 | "outputs": [ 335 | { 336 | "name": "generation_config", 337 | "type": "DANBOT_GENERATION_CONFIG", 338 | "slot_index": 0, 339 | "links": [ 340 | 13, 341 | 21 342 | ] 343 | } 344 | ], 345 | "properties": { 346 | "Node name for S&R": "DanbotGenerationConfig" 347 | }, 348 | "widgets_values": [ 349 | 256, 350 | "true", 351 | 1, 352 | 1, 353 | 50, 354 | 0.05, 355 | 1 356 | ] 357 | }, 358 | { 359 | "id": 18, 360 | "type": "DanbotUtilsTextInput", 361 | "pos": [ 362 | 1762.7659912109375, 363 | 3009.739990234375 364 | ], 365 | "size": [ 366 | 336.8819885253906, 367 | 182.83450317382812 368 | ], 369 | "flags": {}, 370 | "order": 2, 371 | "mode": 0, 372 | "inputs": [], 373 | "outputs": [ 374 | { 375 | "name": "STRING", 376 | "type": "STRING", 377 | "slot_index": 0, 378 | "links": [ 379 | 22 380 | ] 381 | } 382 | ], 383 | "properties": { 384 | "Node name for S&R": "DanbotUtilsTextInput" 385 | }, 386 | "widgets_values": [ 387 | "猫耳で黒髪ロング、制服を着ており、目は黄色の少女。背景はハーフトーンのついた青で、白枠が付いている。ソファーに座って足を組みながらこっちを見ている。" 388 | ], 389 | "color": "#233", 390 | "bgcolor": "#355" 391 | }, 392 | { 393 | "id": 17, 394 | "type": "DanbotUtilsTextInput", 395 | "pos": [ 396 | 2332.1572265625, 397 | 2800.824462890625 398 | ], 399 | "size": [ 400 | 268.7149963378906, 401 | 130.4250030517578 402 | ], 403 | "flags": {}, 404 | "order": 3, 405 | "mode": 0, 406 | "inputs": [], 407 | "outputs": [ 408 | { 409 | "name": "STRING", 410 | "type": "STRING", 411 | "slot_index": 0, 412 | "links": [ 413 | 16 414 | ] 415 | } 416 | ], 417 | "title": "Quality tags", 418 | "properties": { 419 | "Node name for S&R": "DanbotUtilsTextInput" 420 | }, 421 | "widgets_values": [ 422 | "masterpiece, best quality, high score, great score, latest" 423 | ] 424 | }, 425 | { 426 | "id": 9, 427 | "type": "DanbotLoadModel", 428 | "pos": [ 429 | 1130.7950439453125, 430 | 2390.42626953125 431 | ], 432 | "size": [ 433 | 315, 434 | 58 435 | ], 436 | "flags": {}, 437 | "order": 4, 438 | "mode": 0, 439 | "inputs": [], 440 | "outputs": [ 441 | { 442 | "name": "danbot_model", 443 | "type": "DANBOT_MODEL", 444 | "slot_index": 0, 445 | "links": [ 446 | 7, 447 | 19 448 | ] 449 | } 450 | ], 451 | "properties": { 452 | "Node name for S&R": "DanbotLoadModel" 453 | }, 454 | "widgets_values": [ 455 | "DanbotNL 2408 260M" 456 | ], 457 | "color": "#432", 458 | "bgcolor": "#653" 459 | }, 460 | { 461 | "id": 19, 462 | "type": "DanbotV2408PipelineNode", 463 | "pos": [ 464 | 2325.0859375, 465 | 2462.9833984375 466 | ], 467 | "size": [ 468 | 362.79998779296875, 469 | 190 470 | ], 471 | "flags": {}, 472 | "order": 7, 473 | "mode": 0, 474 | "inputs": [ 475 | { 476 | "name": "danbot_model", 477 | "type": "DANBOT_MODEL", 478 | "link": 19 479 | }, 480 | { 481 | "name": "translation_template_config", 482 | "shape": 7, 483 | "type": "DANBOT_TEMPLATE_CONFIG", 484 | "link": 17 485 | }, 486 | { 487 | "name": "extension_template_config", 488 | "shape": 7, 489 | "type": "DANBOT_TEMPLATE_CONFIG", 490 | "link": 18 491 | }, 492 | { 493 | "name": "generation_config", 494 | "shape": 7, 495 | "type": "DANBOT_GENERATION_CONFIG", 496 | "link": 21 497 | }, 498 | { 499 | "name": "text_prompt", 500 | "type": "STRING", 501 | "widget": { 502 | "name": "text_prompt" 503 | }, 504 | "link": 22 505 | }, 506 | { 507 | "name": "ban_tags", 508 | "shape": 7, 509 | "type": "STRING", 510 | "widget": { 511 | "name": "ban_tags" 512 | }, 513 | "link": null 514 | } 515 | ], 516 | "outputs": [ 517 | { 518 | "name": "generated_tags", 519 | "type": "STRING", 520 | "links": [ 521 | 20 522 | ] 523 | }, 524 | { 525 | "name": "translated_tags", 526 | "type": "STRING", 527 | "links": null 528 | }, 529 | { 530 | "name": "extended_tags", 531 | "type": "STRING", 532 | "links": null 533 | }, 534 | { 535 | "name": "raw_output", 536 | "type": "STRING", 537 | "links": null 538 | } 539 | ], 540 | "properties": { 541 | "Node name for S&R": "DanbotV2408PipelineNode" 542 | }, 543 | "widgets_values": [ 544 | "", 545 | 347414205, 546 | "fixed", 547 | "" 548 | ], 549 | "color": "#323", 550 | "bgcolor": "#535" 551 | } 552 | ], 553 | "links": [ 554 | [ 555 | 6, 556 | 1, 557 | 0, 558 | 8, 559 | 0, 560 | "STRING" 561 | ], 562 | [ 563 | 16, 564 | 17, 565 | 0, 566 | 1, 567 | 5, 568 | "STRING" 569 | ], 570 | [ 571 | 17, 572 | 15, 573 | 0, 574 | 19, 575 | 1, 576 | "DANBOT_TEMPLATE_CONFIG" 577 | ], 578 | [ 579 | 18, 580 | 16, 581 | 0, 582 | 19, 583 | 2, 584 | "DANBOT_TEMPLATE_CONFIG" 585 | ], 586 | [ 587 | 19, 588 | 9, 589 | 0, 590 | 19, 591 | 0, 592 | "DANBOT_MODEL" 593 | ], 594 | [ 595 | 20, 596 | 19, 597 | 0, 598 | 1, 599 | 6, 600 | "STRING" 601 | ], 602 | [ 603 | 21, 604 | 6, 605 | 0, 606 | 19, 607 | 3, 608 | "DANBOT_GENERATION_CONFIG" 609 | ], 610 | [ 611 | 22, 612 | 18, 613 | 0, 614 | 19, 615 | 4, 616 | "STRING" 617 | ], 618 | [ 619 | 25, 620 | 20, 621 | 0, 622 | 15, 623 | 2, 624 | "COMBO" 625 | ], 626 | [ 627 | 26, 628 | 20, 629 | 0, 630 | 16, 631 | 1, 632 | "COMBO" 633 | ] 634 | ], 635 | "groups": [ 636 | { 637 | "id": 2, 638 | "title": "Prompt Generation", 639 | "bounding": [ 640 | 1104.904541015625, 641 | 2292.62646484375, 642 | 2319.90576171875, 643 | 946.2933349609375 644 | ], 645 | "color": "#3f789e", 646 | "font_size": 22, 647 | "flags": { 648 | "pinned": true 649 | } 650 | } 651 | ], 652 | "config": {}, 653 | "extra": { 654 | "ds": { 655 | "scale": 0.8264462809917354, 656 | "offset": [ 657 | -1486.5471188289828, 658 | -2258.818673081036 659 | ] 660 | } 661 | }, 662 | "version": 0.4 663 | } --------------------------------------------------------------------------------