├── .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 | }
--------------------------------------------------------------------------------