├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── lora-inspector.py ├── poetry.lock ├── pyproject.toml ├── ruff.toml └── update_metadata.py /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: rockerBOO # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .env 3 | .venv 4 | 5 | meta 6 | 7 | # using prettier for formatting the markdown 8 | .prettierrc 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) rockerBOO (Dave Lage) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LoRA inspector 2 | 3 | 4 | 5 | - [LoRA inspector](#lora-inspector) 6 | - [Install](#install) 7 | - [Usage](#usage) 8 | - [Inspect](#inspect) 9 | - [Save meta](#save-meta) 10 | - [Average weights](#average-weights) 11 | - [Tag frequency](#tag-frequency) 12 | - [Dataset](#dataset) 13 | - [Definition](#definition) 14 | - [Update metadata](#update-metadata) 15 | - [Usage](#usage) 16 | - [Changelog](#changelog) 17 | - [Development](#development) 18 | - [Future](#future) 19 | - [Reference](#reference) 20 | 21 | 22 | ![lora-inspector](https://user-images.githubusercontent.com/15027/230981999-1af9ec4e-4c05-40bc-a10a-b825c73b1013.png) 23 | 24 | Inspect LoRA files for meta info and quantitative analysis of the 25 | LoRA weights. 26 | 27 | - view training parameters 28 | - extract metadata to be stored (we can store it in JSON currently) 29 | - only `safetensors` are supported (want to support all LoRA files) 30 | - only metadata from kohya-ss LoRA (want to parse all metadata in LoRA files) 31 | 32 | --- 33 | 34 | _NOTE_ this is a work in progress and not meant for production use. _NOTE_ 35 | 36 | Consider using the new web interface [LoRA Inspector](https://lora-inspector.rocker.boo) for a GUI representation. 37 | 38 | --- 39 | 40 | ## Install 41 | 42 | Clone this repo or download the python script file. 43 | 44 | Requires dependencies: 45 | 46 | ``` 47 | torch 48 | safetensors 49 | tqdm 50 | ``` 51 | 52 | Can install them one of the following: 53 | 54 | - Add this script to your training directory and use the virtual environment 55 | (`venv`). **RECOMMENDED** 56 | - Make/use with a venv/conda 57 | - `pip install safetensors tqdm` (See 58 | [Get started](https://pytorch.org/get-started/locally/) for instructions on 59 | how to install PyTorch) 60 | 61 | ## Usage 62 | 63 | ### Inspect 64 | 65 | ```bash 66 | $ python lora-inspector.py --help 67 | usage: lora-inspector.py [-h] [-s] [-w] [-t] [-d] lora_file_or_dir 68 | 69 | positional arguments: 70 | lora_file_or_dir Directory containing the lora files 71 | 72 | options: 73 | -h, --help show this help message and exit 74 | -s, --save_meta Should we save the metadata to a file? 75 | -w, --weights Show the average magnitude and strength of the weights 76 | -t, --tags Show the most common tags in the training set 77 | -d, --dataset Show the dataset metadata including directory names and number of images 78 | ``` 79 | 80 | You can add a directory or file: 81 | 82 | ```bash 83 | $ python lora-inspector.py /mnt/900/training/sets/landscape-2023-11-06-200718-e4d7120b -w 84 | /mnt/900/training/sets/landscape-2023-11-06-200718-e4d7120b/landscape-2023-11-06-200718-e4d7120b-000015.safetensors 85 | Date: 2023-11-06T20:16:34 Title: landscape 86 | License: CreativeML Open RAIL-M Author: rockerBOO 87 | Description: High quality landscape photos 88 | Resolution: 512x512 Architecture: stable-diffusion-v1/lora 89 | Network Dim/Rank: 16.0 Alpha: 8.0 Dropout: 0.3 dtype: torch.float32 90 | Module: networks.lora : {'block_dims': '4,4,4,4,4,4,4,4,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', 'block_alphas': '16,16,16,16,16,16,16,16,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32', 'block_dropout': '0.01, 0.010620912260804992, 0.01248099020159499, 0.015572268683063176, 0.01988151037617019, 0.02539026244641935, 0.032074935571726845, 0.03990690495552037, 0.04885263290251277, 0.058873812432261884, 0.0699275313155418, 0.08196645583109653, 0.09493903345590124, 0.10878971362098, 0.12345918558747097, 0.13888463242431537, 0.155, 0.17173627983648962, 0.18902180461412393, 0.20678255506208312, 0.22494247692026895, 0.2434238066153228, 0.26214740425618505, 0.2810330925232585', 'dropout': 0.3} 91 | Learning Rate (LR): 2e-06 UNet LR: 1.0 TE LR: 1.0 92 | Optimizer: prodigyopt.prodigy.Prodigy(weight_decay=0.1,betas=(0.9, 0.9999),d_coef=1.5,use_bias_correction=True) 93 | Scheduler: cosine Warmup steps: 0 94 | Epoch: 15 Batches per epoch: 57 Gradient accumulation steps: 24 95 | Train images: 57 Regularization images: 0 96 | Noise offset: 0.05 Adaptive noise scale: 0.01 IP noise gamma: 0.1 Multires noise discount: 0.3 97 | Min SNR gamma: 5.0 Zero terminal SNR: True Debiased Estimation: True 98 | UNet weight average magnitude: 0.7865518983141094 99 | UNet weight average strength: 0.00995593195090544 100 | No Text Encoder found in this LoRA 101 | ---------------------- 102 | /mnt/900/training/sets/landscape-2023-11-06-200718-e4d7120b/landscape-2023-11-06-200718-e4d7120b.safetensors 103 | Date: 2023-11-06T20:27:12 Title: landscape 104 | License: CreativeML Open RAIL-M Author: rockerBOO 105 | Description: High quality landscape photos 106 | Resolution: 512x512 Architecture: stable-diffusion-v1/lora 107 | Network Dim/Rank: 16.0 Alpha: 8.0 Dropout: 0.3 dtype: torch.float32 108 | Module: networks.lora : {'block_dims': '4,4,4,4,4,4,4,4,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', 'block_alphas': '16,16,16,16,16,16,16,16,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32', 'block_dropout': '0.01, 0.010620912260804992, 0.01248099020159499, 0.015572268683063176, 0.01988151037617019, 0.02539026244641935, 0.032074935571726845, 0.03990690495552037, 0.04885263290251277, 0.058873812432261884, 0.0699275313155418, 0.08196645583109653, 0.09493903345590124, 0.10878971362098, 0.12345918558747097, 0.13888463242431537, 0.155, 0.17173627983648962, 0.18902180461412393, 0.20678255506208312, 0.22494247692026895, 0.2434238066153228, 0.26214740425618505, 0.2810330925232585', 'dropout': 0.3} 109 | Learning Rate (LR): 2e-06 UNet LR: 1.0 TE LR: 1.0 110 | Optimizer: prodigyopt.prodigy.Prodigy(weight_decay=0.1,betas=(0.9, 0.9999),d_coef=1.5,use_bias_correction=True) 111 | Scheduler: cosine Warmup steps: 0 112 | Epoch: 30 Batches per epoch: 57 Gradient accumulation steps: 24 113 | Train images: 57 Regularization images: 0 114 | Noise offset: 0.05 Adaptive noise scale: 0.01 IP noise gamma: 0.1 Multires noise discount: 0.3 115 | Min SNR gamma: 5.0 Zero terminal SNR: True Debiased Estimation: True 116 | UNet weight average magnitude: 0.8033398082829257 117 | UNet weight average strength: 0.010114916750103732 118 | No Text Encoder found in this LoRA 119 | ---------------------- 120 | ``` 121 | 122 | ```bash 123 | $ python lora-inspector.py /mnt/900/lora/testing/landscape-2023-11-06-200718-e4d7120b.safetensors 124 | /mnt/900/lora/testing/landscape-2023-11-06-200718-e4d7120b.safetensors 125 | Date: 2023-11-06T20:27:12 Title: landscape 126 | License: CreativeML Open RAIL-M Author: rockerBOO 127 | Description: High quality landscape photos 128 | Resolution: 512x512 Architecture: stable-diffusion-v1/lora 129 | Network Dim/Rank: 16.0 Alpha: 8.0 Dropout: 0.3 dtype: torch.float32 130 | Module: networks.lora : {'block_dims': '4,4,4,4,4,4,4,4,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8', 'block_alphas': '16,16,16,16,16,16,16,16,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32', 'block_dropout': '0.01, 0.010620912260804992, 0.01248099020159499, 0.015572268683063176, 0.01988151037617019, 0.02539026244641935, 0.032074935571726845, 0.03990690495552037, 0.04885263290251277, 0.058873812432261884, 0.0699275313155418, 0.08196645583109653, 0.09493903345590124, 0.10878971362098, 0.12345918558747097, 0.13888463242431537, 0.155, 0.17173627983648962, 0.18902180461412393, 0.20678255506208312, 0.22494247692026895, 0.2434238066153228, 0.26214740425618505, 0.2810330925232585', 'dropout': 0.3} 131 | Learning Rate (LR): 2e-06 UNet LR: 1.0 TE LR: 1.0 132 | Optimizer: prodigyopt.prodigy.Prodigy(weight_decay=0.1,betas=(0.9, 0.9999),d_coef=1.5,use_bias_correction=True) 133 | Scheduler: cosine Warmup steps: 0 134 | Epoch: 30 Batches per epoch: 57 Gradient accumulation steps: 24 135 | Train images: 57 Regularization images: 0 136 | Noise offset: 0.05 Adaptive noise scale: 0.01 IP noise gamma: 0.1 Multires noise discount: 0.3 137 | Min SNR gamma: 5.0 Zero terminal SNR: True Debiased Estimation: True 138 | UNet weight average magnitude: 0.8033398082829257 139 | UNet weight average strength: 0.010114916750103732 140 | No Text Encoder found in this LoRA 141 | ---------------------- 142 | ``` 143 | 144 | ### Save meta 145 | 146 | We also have support for saving the meta that is extracted and converted from 147 | strings. We can then save those to a JSON file. These will save the metadata 148 | into `meta/alorafile.safetensors-{session_id}.json` in the current working 149 | directory. 150 | 151 | ```bash 152 | $ python lora-inspector.py ~/loras/alorafile.safetensors --save_meta 153 | ``` 154 | 155 | ```bash 156 | $ python lora-inspector.py /mnt/900/training/cyberpunk-anime-21-min-snr/unet-1.15-te-1.15-noise-0.1-steps--linear-DAdaptation-networks.lora/last.safetensors --save_meta 157 | /mnt/900/training/cyberpunk-anime-21-min-snr/unet-1.15-te-1.15-noise-0.1-steps--linear-DAdaptation-networks.lora/last.safetensors 158 | train images: 1005 regularization images: 32000 159 | learning rate: 1.15 unet: 1.15 text encoder: 1.15 160 | epoch: 1 batches: 2025 161 | optimizer: dadaptation.dadapt_adam.DAdaptAdam lr scheduler: linear 162 | network dim/rank: 8.0 alpha: 4.0 module: networks.lora 163 | ---------------------- 164 | ``` 165 | 166 | ### Average weights 167 | 168 | Find the average magnitude and average strength of your weights. Compare these 169 | with other LoRAs to see how powerful or not so powerful your weights are. _NOTE_ 170 | Weights shown are not conclusive to a good value. They are an initial example. 171 | 172 | ```bash 173 | $ python lora-inspector.py /mnt/900/lora/studioGhibliStyle_offset.safetensors -w 174 | UNet weight average magnitude: 4.299801171795097 175 | UNet weight average strength: 0.01127891692482733 176 | Text Encoder weight average magnitude: 3.128134997225176 177 | Text Encoder weight average strength: 0.00769676965767913 178 | ``` 179 | 180 | ### Tag frequency 181 | 182 | Shows the frequency of a tag (words separated by commas). Trigger words are 183 | generally the most frequent, as they would use that word across the whole 184 | training dataset. 185 | 186 | ``` 187 | $ python lora-inspector.py -t /mnt/900/lora/booscapes.safetensors 188 | ... 189 | -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 190 | Tags 191 | -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 192 | 4k photo” 23 193 | spectacular mountains 17 194 | award winning nature photo 16 195 | ryan dyar 14 196 | image credit nasa nat geo 11 197 | sunset in a valley 11 198 | garden 10 199 | british columbia 10 200 | dramatic autumn landscape 10 201 | autumn mountains 10 202 | an amazing landscape image 10 203 | austria 9 204 | nature scenery 9 205 | pristine water 9 206 | boreal forest 9 207 | scenic view of river 9 208 | alpes 9 209 | mythical floral hills 8 210 | misty environment 8 211 | a photo of a lake on a sunny day 8 212 | majestic beautiful world 8 213 | breathtaking stars 8 214 | lush valley 7 215 | dramatic scenery 7 216 | solar storm 7 217 | siberia 7 218 | cosmic skies 7 219 | dolomites 7 220 | oregon 6 221 | landscape photography 4k 6 222 | very long spires 6 223 | beautiful forests and trees 6 224 | wildscapes 6 225 | mountain behind meadow 6 226 | colorful wildflowers 6 227 | photo of green river 6 228 | beautiful night sky 6 229 | switzerland 6 230 | natural dynamic range color 6 231 | middle earth 6 232 | jessica rossier color scheme 6 233 | arizona 6 234 | enchanting and otherworldly 6 235 | ``` 236 | 237 | ### Dataset 238 | 239 | A pretty basic view of the dataset with the directories and number of images. 240 | 241 | ``` 242 | $ python lora-inspector.py -d /mnt/900/lora/booscapes.safetensors 243 | Dataset dirs: 2 244 | [source] 50 images 245 | [p7] 4 images 246 | ``` 247 | 248 | ### Definition 249 | 250 | - epoch: an epoch is seeing the entire dataset once 251 | - Batches per epoch: how many batches per each epoch (does not include gradient 252 | accumulation steps) 253 | - Gradient accumulation steps: gradient accumulation steps 254 | - Train images: number of training images you have 255 | - Regularization images: number of regularization images 256 | - Scheduler: the learning rate scheduler (cosine, cosine_with_restart, linear, 257 | constant, …) 258 | - Optimizer: the optimizer (Adam, Prodigy, DAdaptation, Lion, …) 259 | - Network dim/rank: the rank of the LoRA network 260 | - Alpha: the alpha to the rank of the LoRA network 261 | - Module: the python module that created the network 262 | - Noise offset: noise offset option 263 | - Adaptive noise scale: adaptive noise scale 264 | - IP noise gamma: Input Perturbation noise gamma 265 | [Input Perturbation Reduces Exposure Bias in Diffusion Models](https://arxiv.org/abs/2301.11706) 266 | 267 | - > …we propose a very simple but effective training regularization, 268 | > consisting in perturbing the ground truth samples to simulate the 269 | > inference time prediction errors. 270 | 271 | - multires noise discount: multires noise discount (See 272 | [Multi-Resolution Noise for Diffusion Model Training](https://wandb.ai/johnowhitaker/multires_noise/reports/Multi-Resolution-Noise-for-Diffusion-Model-Training--VmlldzozNjYyOTU2)) 273 | - multires noise scale: multires noise scale 274 | 275 | - average magnitude: square each weight, add them up, get the square root 276 | - average strength: abs each weight, add them up, get average 277 | - debiased estimation loss: 278 | [Debias the Training of Diffusion Models](https://arxiv.org/abs/2310.08442) 279 | 280 | ## Update metadata 281 | 282 | Simple script to update your metadata values. Helpful for changing 283 | `ss_output_name` for applications that use this value to set a good name for it. 284 | 285 | To see your current metadata values, save the metadata using 286 | `lora-inspector.py --save_meta ...` and inspect the JSON file. 287 | 288 | ``` 289 | $ python update_metadata.py --help 290 | usage: update_metadata.py [-h] [--key KEY] [--value VALUE] safetensors_file 291 | 292 | positional arguments: 293 | safetensors_file 294 | 295 | options: 296 | -h, --help show this help message and exit 297 | --key KEY Key to change in the metadata 298 | --value VALUE Value to set to the metadata 299 | ``` 300 | 301 | ### Usage 302 | 303 | ``` 304 | $ python update_metadata.py /mnt/900/lora/testing/armored-core-2023-08-02-173642-ddb4785e.safetensors --key ss_output_name --value mechBOO_v2 305 | Updated ss_output_name with mechBOO_v2 306 | Saved to /mnt/900/lora/testing/armored-core-2023-08-02-173642-ddb4785e.safetensors 307 | ``` 308 | 309 | ## Changelog 310 | 311 | - 2023-11-11 — Add debiased estimation loss, dtype (precision) 312 | - 2023-10-27 — Add IP noise gamma 313 | - 2023-08-27 — Add max_grad_norm, scale weight norms, gradient accumulation 314 | steps, dropout, and datasets 315 | - 2023-08-08 — Add simple metadata updater script 316 | - 2023-07-31 — Add SDXL support 317 | - 2023-07-17 — Add network dropout, scale weight norms, adaptive noise scale, 318 | and steps 319 | - 2023-07-06 — Add Tag Frequency 320 | - 2023-04-12 — Add gradient norm, gradient checkpoint metadata 321 | - 2023-04-03 — Add clip_skip, segment off LoCon/conv layers in average weights 322 | - 2023-04-03 — Add noise_offset, min_snr_gamma (when added to kohya-ss), and 323 | network_args (for LoCon values) 324 | - 2023-04-02 — Add `--weights` which allows you to see the average magnitude and 325 | strength of your LoRA UNet and Text Encoder weights. 326 | 327 | ## Development 328 | 329 | Formatted using [`black`](https://github.com/psf/black). 330 | 331 | ## Future 332 | 333 | What else do you want to see? Make an issue or a PR. 334 | 335 | Use cases/ideas that this can expand into: 336 | 337 | - Extract metadata from LoRA files to be used elsewhere 338 | - Put the metadata into a database or search engine to find specific trainings 339 | - Find possible issues with the training due to the metadata 340 | - Compare LoRA files together 341 | 342 | ## Reference 343 | 344 | - https://github.com/Zyin055/Inspect-Embedding-Training 345 | - https://github.com/kohya-ss/sd-scripts 346 | -------------------------------------------------------------------------------- /lora-inspector.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import json 3 | import math 4 | import os 5 | from collections import OrderedDict 6 | from datetime import datetime 7 | from pathlib import Path 8 | from typing import Any, Callable, Union 9 | 10 | import torch 11 | from safetensors import safe_open 12 | from torch import Tensor 13 | 14 | 15 | def to_datetime(str: str): 16 | return datetime.fromtimestamp(float(str)) 17 | 18 | 19 | class NameSpace(argparse.ArgumentParser): 20 | lora_file_or_dir: str 21 | save_meta: bool 22 | weights: bool 23 | tags: bool 24 | dataset: bool 25 | 26 | 27 | parsers: dict[str, Callable] = { 28 | "int": int, 29 | "float": float, 30 | "json": json.loads, 31 | "bool": bool, 32 | "dt": to_datetime, 33 | "str": str, 34 | } 35 | 36 | 37 | schema: dict[str, str] = { 38 | "ss_learning_rate": "float", 39 | "ss_max_bucket_reso": "int", 40 | "ss_text_encoder_lr": "float", 41 | "ss_epoch": "int", 42 | "ss_unet_lr": "float", 43 | "ss_seed": "int", 44 | "ss_max_train_steps": "int", 45 | "ss_sd_model_name": "str", 46 | "ss_new_vae_hash": "str", 47 | "ss_resolution": "str", 48 | "ss_full_fp16": "bool", 49 | "ss_vae_hash": "str", 50 | "ss_gradient_checkpoint": "bool", 51 | "ss_output_name": "str", 52 | "ss_bucket_info": "json", 53 | "sshs_model_hash": "str", 54 | "sshs_legacy_hash": "str", 55 | "ss_caption_dropout_rate": "float", 56 | "ss_caption_dropout_every_n_epochs": "int", 57 | "ss_caption_tag_dropout_rate": "float", 58 | "ss_sd_scripts_commit_hash": "str", 59 | "ss_gradient_checkpointing": "bool", 60 | "ss_training_finished_at": "dt", 61 | "ss_vae_name": "str", 62 | "ss_total_batch_size": "int", 63 | "ss_batch_size_per_device": "int", 64 | "ss_color_aug": "bool", 65 | "ss_flip_aug": "bool", 66 | "ss_lr_warmup_steps": "int", 67 | "ss_lr_scheduler": "str", 68 | "ss_lr_scheduler_power": "float", 69 | "ss_num_epochs": "int", 70 | "ss_mixed_precision": "str", 71 | "ss_shuffle_caption": "bool", 72 | "ss_training_started_at": "dt", 73 | "ss_v2": "bool", 74 | "ss_keep_tokens": "bool", 75 | "ss_random_crop": "bool", 76 | "ss_cache_latents": "bool", 77 | "ss_gradient_accumulation_steps": "int", 78 | "ss_clip_skip": "int", 79 | "ss_dataset_dirs": "json", 80 | "ss_training_comment": "str", 81 | "ss_network_module": "str", 82 | "ss_network_args": "json", 83 | "ss_network_alpha": "float", 84 | "ss_network_dim": "float", 85 | "ss_reg_dataset_dirs": "json", 86 | "ss_num_batches_per_epoch": "int", 87 | "ss_num_reg_images": "int", 88 | "ss_max_token_length": "int", 89 | "ss_sd_new_model_hash": "int", 90 | "ss_face_crop_aug_range": "str", 91 | "ss_min_bucket_reso": "int", 92 | "ss_bucket_no_upscale": "bool", 93 | "ss_prior_loss_weight": "float", 94 | "ss_enable_bucket": "bool", 95 | "ss_num_train_images": "int", 96 | "ss_lowram": "bool", 97 | "ss_optimizer": "str", 98 | "ss_tag_frequency": "json", 99 | "ss_session_id": "str", 100 | "ss_max_grad_norm": "float", 101 | "ss_noise_offset": "float", 102 | "ss_multires_noise_discount": "float", 103 | "ss_multires_noise_iterations": "float", 104 | "ss_min_snr_gamma": "float", 105 | "ss_sd_model_hash": "str", 106 | "ss_new_sd_model_hash": "str", 107 | "ss_datasets": "json", 108 | "ss_loss_func": "str", 109 | "ss_network_dropout": "float", 110 | "ss_scale_weight_norms": "float", 111 | "ss_adaptive_noise_scale": "float", 112 | "ss_steps": "int", 113 | "ss_base_model_version": "str", 114 | "ss_zero_terminal_snr": "bool", 115 | "ss_ip_noise_gamma": "float", 116 | "ss_debiased_estimation": "bool", 117 | "ss_masked_loss": "bool", 118 | "dtype": "str", 119 | "modelspec.implementation": "str", 120 | "modelspec.resolution": "str", 121 | "modelspec.sai_model_spec": "str", 122 | "modelspec.date": "str", 123 | "modelspec.title": "str", 124 | "modelspec.author": "str", 125 | "modelspec.license": "str", 126 | "modelspec.description": "str", 127 | "modelspec.tags": "str", 128 | "modelspec.prediction_type": "str", 129 | "modelspec.architecture": "str", 130 | } 131 | 132 | 133 | def parse_item(key: str, value: str) -> int | float | bool | datetime | str | None: 134 | if key not in schema: 135 | print(f"invalid key in schema {key}") 136 | print(value) 137 | return value 138 | 139 | if schema[key] == "int" and value == "None": 140 | return None 141 | 142 | if schema[key] == "float" and value == "None": 143 | return None 144 | 145 | if key == "ss_network_dim" and value == "Dynamic": 146 | return "Dynamic" 147 | 148 | if key == "ss_network_alpha" and value == "Dynamic": 149 | return "Dynamic" 150 | 151 | return parsers[schema[key]](value) 152 | 153 | 154 | def parse(entries: dict[str, str]): 155 | results = {} 156 | for k in entries.keys(): 157 | v = entries[k] 158 | results[k] = parse_item(k, v) 159 | return results 160 | 161 | 162 | def key_start_match(key, match): 163 | return key[0 : len(match)] == match 164 | 165 | 166 | def key_match(key, match): 167 | return match in key 168 | 169 | 170 | def avg_weights(results, name=""): 171 | num_results = len(results) 172 | 173 | avg_mag = 0 174 | avg_str = 0 175 | 176 | if num_results > 0: 177 | sum_mag = 0 # average magnitude 178 | sum_str = 0 # average strength 179 | for k in results.keys(): 180 | sum_mag += get_vector_data_magnitude(results[k]) 181 | sum_str += get_vector_data_strength(results[k]) 182 | 183 | avg_mag = sum_mag / num_results 184 | avg_str = sum_str / num_results 185 | 186 | print(f"{name} weight average magnitude: {avg_mag}") 187 | print(f"{name} weight average strength: {avg_str}") 188 | 189 | return avg_mag, avg_str 190 | 191 | 192 | def find_vectors_weights(vectors): 193 | weight = ".weight" 194 | 195 | unet_attn_weight_results = {} 196 | unet_conv_weight_results = {} 197 | text_encoder1_weight_results = {} 198 | text_encoder2_weight_results = {} 199 | 200 | # print(f"model key count: {len(vectors.keys())}") 201 | # 202 | # print(vectors.keys()) 203 | 204 | for k in vectors.keys(): 205 | unet = "lora_unet" 206 | if key_start_match(k, unet) or key_start_match(k, unet): 207 | if k.endswith(weight): 208 | if key_match(k, "conv"): 209 | unet_conv_weight_results[k] = torch.flatten( 210 | vectors.get_tensor(k) 211 | ).tolist() 212 | else: 213 | test = vectors.get_tensor(k) 214 | unet_attn_weight_results[k] = torch.flatten( 215 | vectors.get_tensor(k) 216 | ).tolist() 217 | 218 | # SD 1.x 2.x text encoder 219 | text_encoder = "lora_te_text_model_encoder_layers_" 220 | if key_start_match(k, text_encoder): 221 | if k.endswith(weight): 222 | text_encoder1_weight_results[k] = torch.flatten( 223 | vectors.get_tensor(k) 224 | ).tolist() 225 | 226 | # SDXL text encoder 1 227 | text_encoder = "lora_te1_text_model_encoder_layers" 228 | if key_start_match(k, text_encoder): 229 | if k.endswith(weight): 230 | text_encoder1_weight_results[k] = torch.flatten( 231 | vectors.get_tensor(k) 232 | ).tolist() 233 | 234 | # SDXL text encoder 2 235 | text_encoder = "lora_te2_text_model_encoder_layers_" 236 | if key_start_match(k, text_encoder): 237 | if k.endswith(weight): 238 | text_encoder2_weight_results[k] = torch.flatten( 239 | vectors.get_tensor(k) 240 | ).tolist() 241 | 242 | avg_weights(unet_attn_weight_results, name="UNet") 243 | avg_weights(unet_conv_weight_results, name="UNet Conv") 244 | avg_weights(text_encoder1_weight_results, name="Text Encoder (1)") 245 | avg_weights(text_encoder2_weight_results, name="Text Encoder (2)") 246 | 247 | if len(unet_attn_weight_results) == 0 and len(unet_conv_weight_results) == 0: 248 | print("No UNet found in this LoRA") 249 | 250 | if ( 251 | len(text_encoder1_weight_results) == 0 252 | and len(text_encoder2_weight_results) == 0 253 | ): 254 | print("No Text Encoder found in this LoRA") 255 | 256 | return { 257 | "unet": unet_attn_weight_results, 258 | "unet_conv": unet_conv_weight_results, 259 | "text_encoder1": text_encoder1_weight_results, 260 | "text_encoder2": text_encoder2_weight_results, 261 | } 262 | 263 | 264 | def get_vector_data_strength(data: dict[int, Tensor]) -> float: 265 | value = 0 266 | for n in data: 267 | value += abs(n) 268 | 269 | # the average value of each vector (ignoring negative values) 270 | return value / len(data) 271 | 272 | 273 | def get_vector_data_magnitude(data: dict[int, Tensor]) -> float: 274 | value = 0 275 | for n in data: 276 | value += pow(n, 2) 277 | return math.sqrt(value) 278 | 279 | 280 | def find_safetensor_files(path: str | Path): 281 | return Path(path).rglob("*.safetensors") 282 | 283 | 284 | def save_metadata(file: Path, metadata): 285 | dir = Path("meta/") 286 | if dir.is_dir() is False: 287 | print(f"creating directory {dir.resolve()}") 288 | os.mkdir(dir) 289 | 290 | output_file = str(dir) + "/" + file.stem + ".json" 291 | with open(Path(output_file), "w+") as f: 292 | json.dump(metadata, f, default=str) 293 | print(f"Saved metadata to {output_file}") 294 | 295 | 296 | def process_safetensor_file(file: Path, args) -> dict[str, Any]: 297 | with safe_open(file, framework="pt", device="cpu") as f: 298 | metadata = f.metadata() 299 | 300 | filename = os.path.basename(file) 301 | print(file) 302 | 303 | parsed = {} 304 | 305 | if metadata is not None: 306 | for key in f.keys(): 307 | if "weight" in key: 308 | metadata["dtype"] = f.get_slice(key).get_dtype() 309 | break 310 | 311 | parsed = parse_metadata(metadata, args) 312 | else: 313 | parsed = {} 314 | 315 | parsed["file"] = file 316 | parsed["filename"] = filename 317 | 318 | if args.weights: 319 | find_vectors_weights(f) 320 | 321 | if args.tags: 322 | tags(parsed) 323 | 324 | print("----------------------") 325 | return parsed 326 | 327 | 328 | def process_datasets(metadata, args): 329 | if "ss_dataset_dirs" not in metadata: 330 | return 331 | 332 | print(f"Dataset dirs: {len(metadata['ss_dataset_dirs'].keys())}") 333 | for k, v in metadata["ss_dataset_dirs"].items(): 334 | print(f"\t[{k}] {v.get('img_count', 0)} images") 335 | 336 | 337 | def process_modelspec(metadata, args): 338 | if "modelspec.title" in metadata and metadata.get("modelspec.title", "") != "": 339 | # item(items, "modelspec.implementation", "implementation"), 340 | # item(items, "modelspec.sai_model_spec", "sai"), 341 | # item(items, "modelspec.prediction_type", "prediction type"), 342 | results = [ 343 | get_item(metadata, "modelspec.date", "Date"), 344 | get_item(metadata, "modelspec.title", "Title"), 345 | ] 346 | 347 | print_list(results) 348 | 349 | results = [ 350 | get_item(metadata, "modelspec.license", "License"), 351 | get_item(metadata, "modelspec.author", "Author"), 352 | ] 353 | 354 | print_list(results) 355 | 356 | results = [ 357 | get_item(metadata, "modelspec.description", "Description"), 358 | ] 359 | 360 | print_list(results) 361 | 362 | results = [ 363 | get_item(metadata, "modelspec.tags", "Tags"), 364 | ] 365 | 366 | results = [ 367 | get_item(metadata, "modelspec.resolution", "Resolution"), 368 | get_item(metadata, "modelspec.architecture", "Architecture"), 369 | ] 370 | print_list(results) 371 | 372 | 373 | def print_list(list): 374 | printable = " ".join(list).strip() 375 | 376 | if len(printable) > 0: 377 | print(printable.strip(" ")) 378 | 379 | 380 | def get_item(items, key, name): 381 | if key in items and items.get(key) is not None and items.get(key) != "None": 382 | return f"{name}: {items.get(key, '')}" 383 | 384 | return "" 385 | 386 | 387 | def parse_metadata(metadata, args): 388 | if "sshs_model_hash" in metadata: 389 | items = parse(metadata) 390 | 391 | # TODO if we are missing this value, they may not be saving the metadata 392 | # to the file or are missing key components. Should evaluate if we need 393 | # to do more in the case that this is missing when we get more examples 394 | if "ss_network_dim" not in items: 395 | for item in items: 396 | print(item) 397 | return items 398 | 399 | # print(json.dumps(items, indent=4, sort_keys=True, default=str)) 400 | 401 | process_modelspec(metadata, args) 402 | 403 | results = [ 404 | get_item(items, "ss_network_dim", "Network Dim/Rank"), 405 | get_item(items, "ss_network_alpha", "Alpha"), 406 | get_item(items, "ss_network_dropout", "Dropout"), 407 | f"dtype: {items['dtype']}", 408 | ] 409 | 410 | print_list(results) 411 | 412 | results = [ 413 | get_item(items, "ss_network_module", "Module"), 414 | get_item(items, "ss_network_args", ""), 415 | ] 416 | 417 | print_list(results) 418 | 419 | results = [ 420 | get_item(items, "ss_learning_rate", "Learning Rate (LR)"), 421 | get_item(items, "ss_unet_lr", "UNet LR"), 422 | get_item(items, "ss_text_encoder_lr", "TE LR"), 423 | ] 424 | 425 | print_list(results) 426 | 427 | results = [ 428 | get_item(items, "ss_optimizer", "Optimizer"), 429 | get_item(items, "ss_optimizer_args", "Optimizer args"), 430 | ] 431 | 432 | print_list(results) 433 | 434 | results = [ 435 | get_item(items, "ss_lr_scheduler", "Scheduler"), 436 | get_item(items, "ss_lr_scheduler_args", "Scheduler args"), 437 | get_item(items, "ss_lr_warmup_steps", "Warmup steps"), 438 | ] 439 | 440 | print_list(results) 441 | 442 | results = [ 443 | get_item(items, "ss_epoch", "Epoch"), 444 | get_item(items, "ss_num_batches_per_epoch", "Batches per epoch"), 445 | get_item( 446 | items, "ss_gradient_accumulation_steps", "Gradient accumulation steps" 447 | ), 448 | ] 449 | 450 | print_list(results) 451 | 452 | results = [ 453 | get_item(items, "ss_num_train_images", "Train images"), 454 | get_item(items, "ss_num_reg_images", "Regularization images"), 455 | ] 456 | 457 | print_list(results) 458 | 459 | if "loss_func" in items: 460 | results = [ 461 | get_item(items, "ss_loss_func", "Loss func"), 462 | ] 463 | 464 | print_list(results) 465 | 466 | results = [ 467 | get_item(items, "ss_noise_offset", "Noise offset"), 468 | get_item(items, "ss_adaptive_noise_scale", "Adaptive noise scale"), 469 | get_item(items, "ss_ip_noise_gamma", "IP noise gamma"), 470 | get_item( 471 | items, "ss_multires_noise_iterations", "Multires noise iterations" 472 | ), 473 | get_item(items, "ss_multires_noise_discount", "Multires noise discount"), 474 | ] 475 | 476 | print_list(results) 477 | 478 | results = [ 479 | get_item(items, "ss_min_snr_gamma", "Min SNR gamma"), 480 | get_item(items, "ss_zero_terminal_snr", "Zero terminal SNR"), 481 | get_item(items, "ss_debiased_estimation", "Debiased Estimation"), 482 | ] 483 | 484 | print_list(results) 485 | 486 | results = [ 487 | get_item(items, "ss_max_grad_norm", "Max grad norm"), 488 | get_item(items, "ss_scale_weight_norms", "Scale weight norms"), 489 | get_item(items, "ss_clip_skip", "Clip skip"), 490 | ] 491 | 492 | if args.dataset is True: 493 | process_datasets(items, args) 494 | 495 | return items 496 | else: 497 | print( 498 | "Please submit the following keys so we can get a parser made for it:", 499 | metadata.keys(), 500 | ) 501 | return {} 502 | 503 | 504 | def print_tags(freq): 505 | """ 506 | freq: Tag frequency 507 | """ 508 | 509 | print("----------------------") 510 | print("Tags") 511 | print("----------------------") 512 | 513 | tags = [] 514 | longest_tag = 0 515 | for k in freq.keys(): 516 | for kitem in freq[k].keys(): 517 | # if int(freq[k][kitem]) > 3: 518 | tags.append((kitem, freq[k][kitem])) 519 | 520 | if len(kitem) > longest_tag: 521 | longest_tag = len(kitem) 522 | 523 | ordered = OrderedDict(reversed(sorted(tags, key=lambda t: t[1]))) 524 | 525 | justify_to = longest_tag + 1 if longest_tag < 60 else 60 526 | 527 | for i, (k, v) in enumerate(ordered.items()): 528 | # we can stop after 20 529 | if i > 20: 530 | remaining = len(ordered.items()) - i 531 | print(f"{remaining} more tags...") 532 | break 533 | 534 | print(k.ljust(justify_to), v) 535 | 536 | 537 | def tags(results: Union[list[dict[str, Any]], dict[str, Any]]): 538 | if type(results) == list: 539 | for result in results: 540 | if "ss_tag_frequency" in result: 541 | print_tags(result["ss_tag_frequency"]) 542 | else: 543 | print("No tags found") 544 | elif type(results) == dict: 545 | if "ss_tag_frequency" in results: 546 | print_tags(results["ss_tag_frequency"]) 547 | else: 548 | print("No tags found") 549 | 550 | 551 | def save_meta(results: Union[list[dict[str, Any]], dict[str, Any]]): 552 | if type(results) == list: 553 | for result in results: 554 | # print("result", json.dumps(result, indent=4, sort_keys=True, default=str)) 555 | if "ss_session_id" in result: 556 | newfile = Path( 557 | "meta/" + f"{str(result['filename'])}-{result['ss_session_id']}" 558 | ) 559 | else: 560 | newfile = Path("meta/" + str(result["filename"])) 561 | save_metadata(newfile, result) 562 | else: 563 | if "ss_session_id" in results: 564 | session_metadata_file = f"{results['filename']}+{results['ss_session_id']}" 565 | newfile = Path("meta") 566 | newfile = newfile / session_metadata_file 567 | else: 568 | newfile = Path("meta/" + str(results["filename"])) 569 | save_metadata(newfile, results) 570 | 571 | 572 | def process(args: type[NameSpace]): 573 | file = Path(args.lora_file_or_dir) 574 | if file.is_dir(): 575 | results = [] 576 | files = sorted(find_safetensor_files(file)) 577 | for path in files: 578 | results.append(process_safetensor_file(path, args)) 579 | 580 | return results 581 | else: 582 | return process_safetensor_file(file, args) 583 | 584 | 585 | if __name__ == "__main__": 586 | parser = argparse.ArgumentParser() 587 | 588 | parser.add_argument( 589 | "lora_file_or_dir", type=str, help="Directory containing the lora files" 590 | ) 591 | 592 | parser.add_argument( 593 | "-s", 594 | "--save_meta", 595 | action="store_true", 596 | help="Should we save the metadata to a file?", 597 | ) 598 | 599 | parser.add_argument( 600 | "-w", 601 | "--weights", 602 | action="store_true", 603 | help="Show the average magnitude and strength of the weights", 604 | ) 605 | 606 | parser.add_argument( 607 | "-t", 608 | "--tags", 609 | action="store_true", 610 | help="Show the most common tags in the training set", 611 | ) 612 | 613 | parser.add_argument( 614 | "-d", 615 | "--dataset", 616 | action="store_true", 617 | help="Show the dataset metadata including directory names and number of images", 618 | ) 619 | 620 | args = parser.parse_args(namespace=NameSpace) 621 | results = process(args) 622 | 623 | if args.save_meta: 624 | save_meta(results) 625 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "appdirs" 5 | version = "1.4.4" 6 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 7 | optional = false 8 | python-versions = "*" 9 | groups = ["main"] 10 | files = [ 11 | {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, 12 | {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, 13 | ] 14 | 15 | [[package]] 16 | name = "certifi" 17 | version = "2024.7.4" 18 | description = "Python package for providing Mozilla's CA Bundle." 19 | optional = false 20 | python-versions = ">=3.6" 21 | groups = ["main"] 22 | files = [ 23 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, 24 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, 25 | ] 26 | 27 | [[package]] 28 | name = "charset-normalizer" 29 | version = "3.2.0" 30 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 31 | optional = false 32 | python-versions = ">=3.7.0" 33 | groups = ["main"] 34 | files = [ 35 | {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, 36 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, 37 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, 38 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, 39 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, 40 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, 41 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, 42 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, 43 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, 44 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, 45 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, 46 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, 47 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, 48 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, 49 | {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, 50 | {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, 51 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, 52 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, 53 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, 54 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, 55 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, 56 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, 57 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, 58 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, 59 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, 60 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, 61 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, 62 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, 63 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, 64 | {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, 65 | {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, 66 | {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, 67 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, 68 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, 69 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, 70 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, 71 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, 72 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, 73 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, 74 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, 75 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, 76 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, 77 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, 78 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, 79 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, 80 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, 81 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, 82 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, 83 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, 84 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, 85 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, 86 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, 87 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, 88 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, 89 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, 90 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, 91 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, 92 | {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, 93 | {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, 94 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, 95 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, 96 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, 97 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, 98 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, 99 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, 100 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, 101 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, 102 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, 103 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, 104 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, 105 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, 106 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, 107 | {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, 108 | {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, 109 | {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, 110 | ] 111 | 112 | [[package]] 113 | name = "click" 114 | version = "8.1.7" 115 | description = "Composable command line interface toolkit" 116 | optional = false 117 | python-versions = ">=3.7" 118 | groups = ["main"] 119 | files = [ 120 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 121 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 122 | ] 123 | 124 | [package.dependencies] 125 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 126 | 127 | [[package]] 128 | name = "colorama" 129 | version = "0.4.6" 130 | description = "Cross-platform colored terminal text." 131 | optional = false 132 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 133 | groups = ["main", "dev"] 134 | files = [ 135 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 136 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 137 | ] 138 | markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} 139 | 140 | [[package]] 141 | name = "docker-pycreds" 142 | version = "0.4.0" 143 | description = "Python bindings for the docker credentials store API" 144 | optional = false 145 | python-versions = "*" 146 | groups = ["main"] 147 | files = [ 148 | {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, 149 | {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, 150 | ] 151 | 152 | [package.dependencies] 153 | six = ">=1.4.0" 154 | 155 | [[package]] 156 | name = "exceptiongroup" 157 | version = "1.1.3" 158 | description = "Backport of PEP 654 (exception groups)" 159 | optional = false 160 | python-versions = ">=3.7" 161 | groups = ["dev"] 162 | markers = "python_version < \"3.11\"" 163 | files = [ 164 | {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, 165 | {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, 166 | ] 167 | 168 | [package.extras] 169 | test = ["pytest (>=6)"] 170 | 171 | [[package]] 172 | name = "gitdb" 173 | version = "4.0.10" 174 | description = "Git Object Database" 175 | optional = false 176 | python-versions = ">=3.7" 177 | groups = ["main"] 178 | files = [ 179 | {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, 180 | {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, 181 | ] 182 | 183 | [package.dependencies] 184 | smmap = ">=3.0.1,<6" 185 | 186 | [[package]] 187 | name = "gitpython" 188 | version = "3.1.41" 189 | description = "GitPython is a Python library used to interact with Git repositories" 190 | optional = false 191 | python-versions = ">=3.7" 192 | groups = ["main"] 193 | files = [ 194 | {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"}, 195 | {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"}, 196 | ] 197 | 198 | [package.dependencies] 199 | gitdb = ">=4.0.1,<5" 200 | 201 | [package.extras] 202 | test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"] 203 | 204 | [[package]] 205 | name = "idna" 206 | version = "3.7" 207 | description = "Internationalized Domain Names in Applications (IDNA)" 208 | optional = false 209 | python-versions = ">=3.5" 210 | groups = ["main"] 211 | files = [ 212 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, 213 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, 214 | ] 215 | 216 | [[package]] 217 | name = "iniconfig" 218 | version = "2.0.0" 219 | description = "brain-dead simple config-ini parsing" 220 | optional = false 221 | python-versions = ">=3.7" 222 | groups = ["dev"] 223 | files = [ 224 | {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, 225 | {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, 226 | ] 227 | 228 | [[package]] 229 | name = "numpy" 230 | version = "1.25.2" 231 | description = "Fundamental package for array computing in Python" 232 | optional = false 233 | python-versions = ">=3.9" 234 | groups = ["main"] 235 | files = [ 236 | {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, 237 | {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, 238 | {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, 239 | {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, 240 | {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, 241 | {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, 242 | {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, 243 | {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, 244 | {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, 245 | {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, 246 | {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, 247 | {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, 248 | {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, 249 | {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, 250 | {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, 251 | {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, 252 | {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, 253 | {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, 254 | {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, 255 | {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, 256 | {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, 257 | {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, 258 | {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, 259 | {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, 260 | {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, 261 | ] 262 | 263 | [[package]] 264 | name = "packaging" 265 | version = "23.1" 266 | description = "Core utilities for Python packages" 267 | optional = false 268 | python-versions = ">=3.7" 269 | groups = ["dev"] 270 | files = [ 271 | {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, 272 | {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, 273 | ] 274 | 275 | [[package]] 276 | name = "pathtools" 277 | version = "0.1.2" 278 | description = "File system general utilities" 279 | optional = false 280 | python-versions = "*" 281 | groups = ["main"] 282 | files = [ 283 | {file = "pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"}, 284 | ] 285 | 286 | [[package]] 287 | name = "pillow" 288 | version = "10.3.0" 289 | description = "Python Imaging Library (Fork)" 290 | optional = false 291 | python-versions = ">=3.8" 292 | groups = ["main"] 293 | files = [ 294 | {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, 295 | {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, 296 | {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, 297 | {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, 298 | {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, 299 | {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, 300 | {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, 301 | {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, 302 | {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, 303 | {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, 304 | {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, 305 | {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, 306 | {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, 307 | {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, 308 | {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, 309 | {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, 310 | {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, 311 | {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, 312 | {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, 313 | {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, 314 | {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, 315 | {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, 316 | {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, 317 | {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, 318 | {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, 319 | {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, 320 | {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, 321 | {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, 322 | {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, 323 | {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, 324 | {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, 325 | {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, 326 | {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, 327 | {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, 328 | {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, 329 | {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, 330 | {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, 331 | {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, 332 | {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, 333 | {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, 334 | {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, 335 | {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, 336 | {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, 337 | {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, 338 | {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, 339 | {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, 340 | {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, 341 | {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, 342 | {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, 343 | {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, 344 | {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, 345 | {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, 346 | {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, 347 | {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, 348 | {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, 349 | {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, 350 | {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, 351 | {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, 352 | {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, 353 | {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, 354 | {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, 355 | {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, 356 | {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, 357 | {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, 358 | {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, 359 | {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, 360 | {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, 361 | {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, 362 | {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, 363 | ] 364 | 365 | [package.extras] 366 | docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] 367 | fpx = ["olefile"] 368 | mic = ["olefile"] 369 | tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] 370 | typing = ["typing-extensions ; python_version < \"3.10\""] 371 | xmp = ["defusedxml"] 372 | 373 | [[package]] 374 | name = "pluggy" 375 | version = "1.3.0" 376 | description = "plugin and hook calling mechanisms for python" 377 | optional = false 378 | python-versions = ">=3.8" 379 | groups = ["dev"] 380 | files = [ 381 | {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, 382 | {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, 383 | ] 384 | 385 | [package.extras] 386 | dev = ["pre-commit", "tox"] 387 | testing = ["pytest", "pytest-benchmark"] 388 | 389 | [[package]] 390 | name = "protobuf" 391 | version = "4.24.2" 392 | description = "" 393 | optional = false 394 | python-versions = ">=3.7" 395 | groups = ["main"] 396 | markers = "sys_platform != \"linux\"" 397 | files = [ 398 | {file = "protobuf-4.24.2-cp310-abi3-win32.whl", hash = "sha256:58e12d2c1aa428ece2281cef09bbaa6938b083bcda606db3da4e02e991a0d924"}, 399 | {file = "protobuf-4.24.2-cp310-abi3-win_amd64.whl", hash = "sha256:77700b55ba41144fc64828e02afb41901b42497b8217b558e4a001f18a85f2e3"}, 400 | {file = "protobuf-4.24.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:237b9a50bd3b7307d0d834c1b0eb1a6cd47d3f4c2da840802cd03ea288ae8880"}, 401 | {file = "protobuf-4.24.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:25ae91d21e3ce8d874211110c2f7edd6384816fb44e06b2867afe35139e1fd1c"}, 402 | {file = "protobuf-4.24.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:c00c3c7eb9ad3833806e21e86dca448f46035242a680f81c3fe068ff65e79c74"}, 403 | {file = "protobuf-4.24.2-cp37-cp37m-win32.whl", hash = "sha256:4e69965e7e54de4db989289a9b971a099e626f6167a9351e9d112221fc691bc1"}, 404 | {file = "protobuf-4.24.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c5cdd486af081bf752225b26809d2d0a85e575b80a84cde5172a05bbb1990099"}, 405 | {file = "protobuf-4.24.2-cp38-cp38-win32.whl", hash = "sha256:6bd26c1fa9038b26c5c044ee77e0ecb18463e957fefbaeb81a3feb419313a54e"}, 406 | {file = "protobuf-4.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb7aa97c252279da65584af0456f802bd4b2de429eb945bbc9b3d61a42a8cd16"}, 407 | {file = "protobuf-4.24.2-cp39-cp39-win32.whl", hash = "sha256:2b23bd6e06445699b12f525f3e92a916f2dcf45ffba441026357dea7fa46f42b"}, 408 | {file = "protobuf-4.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:839952e759fc40b5d46be319a265cf94920174d88de31657d5622b5d8d6be5cd"}, 409 | {file = "protobuf-4.24.2-py3-none-any.whl", hash = "sha256:3b7b170d3491ceed33f723bbf2d5a260f8a4e23843799a3906f16ef736ef251e"}, 410 | {file = "protobuf-4.24.2.tar.gz", hash = "sha256:7fda70797ddec31ddfa3576cbdcc3ddbb6b3078b737a1a87ab9136af0570cd6e"}, 411 | ] 412 | 413 | [[package]] 414 | name = "psutil" 415 | version = "5.9.5" 416 | description = "Cross-platform lib for process and system monitoring in Python." 417 | optional = false 418 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 419 | groups = ["main"] 420 | files = [ 421 | {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, 422 | {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, 423 | {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, 424 | {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, 425 | {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, 426 | {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, 427 | {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, 428 | {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, 429 | {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, 430 | {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, 431 | {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, 432 | {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, 433 | {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, 434 | {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, 435 | ] 436 | 437 | [package.extras] 438 | test = ["enum34 ; python_version <= \"3.4\"", "ipaddress ; python_version < \"3.0\"", "mock ; python_version < \"3.0\"", "pywin32 ; sys_platform == \"win32\"", "wmi ; sys_platform == \"win32\""] 439 | 440 | [[package]] 441 | name = "pytest" 442 | version = "7.4.0" 443 | description = "pytest: simple powerful testing with Python" 444 | optional = false 445 | python-versions = ">=3.7" 446 | groups = ["dev"] 447 | files = [ 448 | {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, 449 | {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, 450 | ] 451 | 452 | [package.dependencies] 453 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 454 | exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} 455 | iniconfig = "*" 456 | packaging = "*" 457 | pluggy = ">=0.12,<2.0" 458 | tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} 459 | 460 | [package.extras] 461 | testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] 462 | 463 | [[package]] 464 | name = "pyyaml" 465 | version = "6.0.1" 466 | description = "YAML parser and emitter for Python" 467 | optional = false 468 | python-versions = ">=3.6" 469 | groups = ["main"] 470 | files = [ 471 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, 472 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, 473 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, 474 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, 475 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, 476 | {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, 477 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, 478 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, 479 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, 480 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, 481 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, 482 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, 483 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, 484 | {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, 485 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, 486 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, 487 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, 488 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, 489 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, 490 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, 491 | {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, 492 | {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, 493 | {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, 494 | {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, 495 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, 496 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, 497 | {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, 498 | {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, 499 | {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, 500 | {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, 501 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, 502 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, 503 | {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, 504 | {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, 505 | {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, 506 | {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, 507 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, 508 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, 509 | {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, 510 | {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, 511 | {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, 512 | {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, 513 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, 514 | {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, 515 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, 516 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, 517 | {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, 518 | {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, 519 | {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, 520 | {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, 521 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, 522 | ] 523 | 524 | [[package]] 525 | name = "requests" 526 | version = "2.32.2" 527 | description = "Python HTTP for Humans." 528 | optional = false 529 | python-versions = ">=3.8" 530 | groups = ["main"] 531 | files = [ 532 | {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, 533 | {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, 534 | ] 535 | 536 | [package.dependencies] 537 | certifi = ">=2017.4.17" 538 | charset-normalizer = ">=2,<4" 539 | idna = ">=2.5,<4" 540 | urllib3 = ">=1.21.1,<3" 541 | 542 | [package.extras] 543 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 544 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 545 | 546 | [[package]] 547 | name = "safetensors" 548 | version = "0.3.3" 549 | description = "Fast and Safe Tensor serialization" 550 | optional = false 551 | python-versions = "*" 552 | groups = ["main"] 553 | files = [ 554 | {file = "safetensors-0.3.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:92e4d0c8b2836120fddd134474c5bda8963f322333941f8b9f643e5b24f041eb"}, 555 | {file = "safetensors-0.3.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3dcadb6153c42addc9c625a622ebde9293fabe1973f9ef31ba10fb42c16e8536"}, 556 | {file = "safetensors-0.3.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:08f26b61e1b0a14dc959aa9d568776bd038805f611caef1de04a80c468d4a7a4"}, 557 | {file = "safetensors-0.3.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:17f41344d9a075f2f21b289a49a62e98baff54b5754240ba896063bce31626bf"}, 558 | {file = "safetensors-0.3.3-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:f1045f798e1a16a6ced98d6a42ec72936d367a2eec81dc5fade6ed54638cd7d2"}, 559 | {file = "safetensors-0.3.3-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:eaf0e4bc91da13f21ac846a39429eb3f3b7ed06295a32321fa3eb1a59b5c70f3"}, 560 | {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25149180d4dc8ca48bac2ac3852a9424b466e36336a39659b35b21b2116f96fc"}, 561 | {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9e943bf78c39de8865398a71818315e7d5d1af93c7b30d4da3fc852e62ad9bc"}, 562 | {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cccfcac04a010354e87c7a2fe16a1ff004fc4f6e7ef8efc966ed30122ce00bc7"}, 563 | {file = "safetensors-0.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a07121f427e646a50d18c1be0fa1a2cbf6398624c31149cd7e6b35486d72189e"}, 564 | {file = "safetensors-0.3.3-cp310-cp310-win32.whl", hash = "sha256:a85e29cbfddfea86453cc0f4889b4bcc6b9c155be9a60e27be479a34e199e7ef"}, 565 | {file = "safetensors-0.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:e13adad4a3e591378f71068d14e92343e626cf698ff805f61cdb946e684a218e"}, 566 | {file = "safetensors-0.3.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:cbc3312f134baf07334dd517341a4b470b2931f090bd9284888acb7dfaf4606f"}, 567 | {file = "safetensors-0.3.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d15030af39d5d30c22bcbc6d180c65405b7ea4c05b7bab14a570eac7d7d43722"}, 568 | {file = "safetensors-0.3.3-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:f84a74cbe9859b28e3d6d7715ac1dd3097bebf8d772694098f6d42435245860c"}, 569 | {file = "safetensors-0.3.3-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:10d637423d98ab2e6a4ad96abf4534eb26fcaf8ca3115623e64c00759374e90d"}, 570 | {file = "safetensors-0.3.3-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:3b46f5de8b44084aff2e480874c550c399c730c84b2e8ad1bddb062c94aa14e9"}, 571 | {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76da691a82dfaf752854fa6d17c8eba0c8466370c5ad8cf1bfdf832d3c7ee17"}, 572 | {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4e342fd54e66aa9512dd13e410f791e47aa4feeb5f4c9a20882c72f3d272f29"}, 573 | {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:178fd30b5dc73bce14a39187d948cedd0e5698e2f055b7ea16b5a96c9b17438e"}, 574 | {file = "safetensors-0.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e8fdf7407dba44587ed5e79d5de3533d242648e1f2041760b21474bd5ea5c8c"}, 575 | {file = "safetensors-0.3.3-cp311-cp311-win32.whl", hash = "sha256:7d3b744cee8d7a46ffa68db1a2ff1a1a432488e3f7a5a97856fe69e22139d50c"}, 576 | {file = "safetensors-0.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f579877d30feec9b6ba409d05fa174633a4fc095675a4a82971d831a8bb60b97"}, 577 | {file = "safetensors-0.3.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:2fff5b19a1b462c17322998b2f4b8bce43c16fe208968174d2f3a1446284ceed"}, 578 | {file = "safetensors-0.3.3-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:41adb1d39e8aad04b16879e3e0cbcb849315999fad73bc992091a01e379cb058"}, 579 | {file = "safetensors-0.3.3-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:0f2b404250b3b877b11d34afcc30d80e7035714a1116a3df56acaca6b6c00096"}, 580 | {file = "safetensors-0.3.3-cp37-cp37m-macosx_13_0_x86_64.whl", hash = "sha256:b43956ef20e9f4f2e648818a9e7b3499edd6b753a0f5526d4f6a6826fbee8446"}, 581 | {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d61a99b34169981f088ccfbb2c91170843efc869a0a0532f422db7211bf4f474"}, 582 | {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0008aab36cd20e9a051a68563c6f80d40f238c2611811d7faa5a18bf3fd3984"}, 583 | {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93d54166072b143084fdcd214a080a088050c1bb1651016b55942701b31334e4"}, 584 | {file = "safetensors-0.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c32ee08f61cea56a5d62bbf94af95df6040c8ab574afffaeb7b44ae5da1e9e3"}, 585 | {file = "safetensors-0.3.3-cp37-cp37m-win32.whl", hash = "sha256:351600f367badd59f7bfe86d317bb768dd8c59c1561c6fac43cafbd9c1af7827"}, 586 | {file = "safetensors-0.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:034717e297849dae1af0a7027a14b8647bd2e272c24106dced64d83e10d468d1"}, 587 | {file = "safetensors-0.3.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8530399666748634bc0b301a6a5523756931b0c2680d188e743d16304afe917a"}, 588 | {file = "safetensors-0.3.3-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:9d741c1f1621e489ba10aa3d135b54202684f6e205df52e219d5eecd673a80c9"}, 589 | {file = "safetensors-0.3.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:0c345fd85b4d2093a5109596ff4cd9dfc2e84992e881b4857fbc4a93a3b89ddb"}, 590 | {file = "safetensors-0.3.3-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:69ccee8d05f55cdf76f7e6c87d2bdfb648c16778ef8acfd2ecc495e273e9233e"}, 591 | {file = "safetensors-0.3.3-cp38-cp38-macosx_13_0_arm64.whl", hash = "sha256:c08a9a4b7a4ca389232fa8d097aebc20bbd4f61e477abc7065b5c18b8202dede"}, 592 | {file = "safetensors-0.3.3-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:a002868d2e3f49bbe81bee2655a411c24fa1f8e68b703dec6629cb989d6ae42e"}, 593 | {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bd2704cb41faa44d3ec23e8b97330346da0395aec87f8eaf9c9e2c086cdbf13"}, 594 | {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b2951bf3f0ad63df5e6a95263652bd6c194a6eb36fd4f2d29421cd63424c883"}, 595 | {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07114cec116253ca2e7230fdea30acf76828f21614afd596d7b5438a2f719bd8"}, 596 | {file = "safetensors-0.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab43aeeb9eadbb6b460df3568a662e6f1911ecc39387f8752afcb6a7d96c087"}, 597 | {file = "safetensors-0.3.3-cp38-cp38-win32.whl", hash = "sha256:f2f59fce31dd3429daca7269a6b06f65e6547a0c248f5116976c3f1e9b73f251"}, 598 | {file = "safetensors-0.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:c31ca0d8610f57799925bf08616856b39518ab772c65093ef1516762e796fde4"}, 599 | {file = "safetensors-0.3.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:59a596b3225c96d59af412385981f17dd95314e3fffdf359c7e3f5bb97730a19"}, 600 | {file = "safetensors-0.3.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:82a16e92210a6221edd75ab17acdd468dd958ef5023d9c6c1289606cc30d1479"}, 601 | {file = "safetensors-0.3.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:98a929e763a581f516373ef31983ed1257d2d0da912a8e05d5cd12e9e441c93a"}, 602 | {file = "safetensors-0.3.3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:12b83f1986cd16ea0454c636c37b11e819d60dd952c26978310a0835133480b7"}, 603 | {file = "safetensors-0.3.3-cp39-cp39-macosx_13_0_arm64.whl", hash = "sha256:f439175c827c2f1bbd54df42789c5204a10983a30bc4242bc7deaf854a24f3f0"}, 604 | {file = "safetensors-0.3.3-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:0085be33b8cbcb13079b3a8e131656e05b0bc5e6970530d4c24150f7afd76d70"}, 605 | {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3ec70c87b1e910769034206ad5efc051069b105aac1687f6edcd02526767f4"}, 606 | {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f490132383e5e490e710608f4acffcb98ed37f91b885c7217d3f9f10aaff9048"}, 607 | {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79d1b6c7ed5596baf79c80fbce5198c3cdcc521ae6a157699f427aba1a90082d"}, 608 | {file = "safetensors-0.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad3cc8006e7a86ee7c88bd2813ec59cd7cc75b03e6fa4af89b9c7b235b438d68"}, 609 | {file = "safetensors-0.3.3-cp39-cp39-win32.whl", hash = "sha256:ab29f54c6b8c301ca05fa014728996bd83aac6e21528f893aaf8945c71f42b6d"}, 610 | {file = "safetensors-0.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:0fa82004eae1a71e2aa29843ef99de9350e459a0fc2f65fc6ee0da9690933d2d"}, 611 | {file = "safetensors-0.3.3.tar.gz", hash = "sha256:edb7072d788c4f929d0f5735d3a2fb51e5a27f833587828583b7f5747af1a2b8"}, 612 | ] 613 | 614 | [package.extras] 615 | all = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] 616 | dev = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "flax (>=0.6.3)", "h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "isort (>=5.5.4)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)", "tensorflow (==2.11.0)", "torch (>=1.10)"] 617 | jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "numpy (>=1.21.6)"] 618 | numpy = ["numpy (>=1.21.6)"] 619 | paddlepaddle = ["numpy (>=1.21.6)", "paddlepaddle (>=2.4.1)"] 620 | pinned-tf = ["tensorflow (==2.11.0)"] 621 | quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] 622 | tensorflow = ["numpy (>=1.21.6)", "tensorflow (>=2.11.0)"] 623 | testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "numpy (>=1.21.6)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "setuptools-rust (>=1.5.2)"] 624 | torch = ["numpy (>=1.21.6)", "torch (>=1.10)"] 625 | 626 | [[package]] 627 | name = "sentry-sdk" 628 | version = "2.8.0" 629 | description = "Python client for Sentry (https://sentry.io)" 630 | optional = false 631 | python-versions = ">=3.6" 632 | groups = ["main"] 633 | files = [ 634 | {file = "sentry_sdk-2.8.0-py2.py3-none-any.whl", hash = "sha256:6051562d2cfa8087bb8b4b8b79dc44690f8a054762a29c07e22588b1f619bfb5"}, 635 | {file = "sentry_sdk-2.8.0.tar.gz", hash = "sha256:aa4314f877d9cd9add5a0c9ba18e3f27f99f7de835ce36bd150e48a41c7c646f"}, 636 | ] 637 | 638 | [package.dependencies] 639 | certifi = "*" 640 | urllib3 = ">=1.26.11" 641 | 642 | [package.extras] 643 | aiohttp = ["aiohttp (>=3.5)"] 644 | anthropic = ["anthropic (>=0.16)"] 645 | arq = ["arq (>=0.23)"] 646 | asyncpg = ["asyncpg (>=0.23)"] 647 | beam = ["apache-beam (>=2.12)"] 648 | bottle = ["bottle (>=0.12.13)"] 649 | celery = ["celery (>=3)"] 650 | celery-redbeat = ["celery-redbeat (>=2)"] 651 | chalice = ["chalice (>=1.16.0)"] 652 | clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] 653 | django = ["django (>=1.8)"] 654 | falcon = ["falcon (>=1.4)"] 655 | fastapi = ["fastapi (>=0.79.0)"] 656 | flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] 657 | grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] 658 | httpx = ["httpx (>=0.16.0)"] 659 | huey = ["huey (>=2)"] 660 | huggingface-hub = ["huggingface-hub (>=0.22)"] 661 | langchain = ["langchain (>=0.0.210)"] 662 | loguru = ["loguru (>=0.5)"] 663 | openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] 664 | opentelemetry = ["opentelemetry-distro (>=0.35b0)"] 665 | opentelemetry-experimental = ["opentelemetry-instrumentation-aio-pika (==0.46b0)", "opentelemetry-instrumentation-aiohttp-client (==0.46b0)", "opentelemetry-instrumentation-aiopg (==0.46b0)", "opentelemetry-instrumentation-asgi (==0.46b0)", "opentelemetry-instrumentation-asyncio (==0.46b0)", "opentelemetry-instrumentation-asyncpg (==0.46b0)", "opentelemetry-instrumentation-aws-lambda (==0.46b0)", "opentelemetry-instrumentation-boto (==0.46b0)", "opentelemetry-instrumentation-boto3sqs (==0.46b0)", "opentelemetry-instrumentation-botocore (==0.46b0)", "opentelemetry-instrumentation-cassandra (==0.46b0)", "opentelemetry-instrumentation-celery (==0.46b0)", "opentelemetry-instrumentation-confluent-kafka (==0.46b0)", "opentelemetry-instrumentation-dbapi (==0.46b0)", "opentelemetry-instrumentation-django (==0.46b0)", "opentelemetry-instrumentation-elasticsearch (==0.46b0)", "opentelemetry-instrumentation-falcon (==0.46b0)", "opentelemetry-instrumentation-fastapi (==0.46b0)", "opentelemetry-instrumentation-flask (==0.46b0)", "opentelemetry-instrumentation-grpc (==0.46b0)", "opentelemetry-instrumentation-httpx (==0.46b0)", "opentelemetry-instrumentation-jinja2 (==0.46b0)", "opentelemetry-instrumentation-kafka-python (==0.46b0)", "opentelemetry-instrumentation-logging (==0.46b0)", "opentelemetry-instrumentation-mysql (==0.46b0)", "opentelemetry-instrumentation-mysqlclient (==0.46b0)", "opentelemetry-instrumentation-pika (==0.46b0)", "opentelemetry-instrumentation-psycopg (==0.46b0)", "opentelemetry-instrumentation-psycopg2 (==0.46b0)", "opentelemetry-instrumentation-pymemcache (==0.46b0)", "opentelemetry-instrumentation-pymongo (==0.46b0)", "opentelemetry-instrumentation-pymysql (==0.46b0)", "opentelemetry-instrumentation-pyramid (==0.46b0)", "opentelemetry-instrumentation-redis (==0.46b0)", "opentelemetry-instrumentation-remoulade (==0.46b0)", "opentelemetry-instrumentation-requests (==0.46b0)", "opentelemetry-instrumentation-sklearn (==0.46b0)", "opentelemetry-instrumentation-sqlalchemy (==0.46b0)", "opentelemetry-instrumentation-sqlite3 (==0.46b0)", "opentelemetry-instrumentation-starlette (==0.46b0)", "opentelemetry-instrumentation-system-metrics (==0.46b0)", "opentelemetry-instrumentation-threading (==0.46b0)", "opentelemetry-instrumentation-tornado (==0.46b0)", "opentelemetry-instrumentation-tortoiseorm (==0.46b0)", "opentelemetry-instrumentation-urllib (==0.46b0)", "opentelemetry-instrumentation-urllib3 (==0.46b0)", "opentelemetry-instrumentation-wsgi (==0.46b0)"] 666 | pure-eval = ["asttokens", "executing", "pure-eval"] 667 | pymongo = ["pymongo (>=3.1)"] 668 | pyspark = ["pyspark (>=2.4.4)"] 669 | quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] 670 | rq = ["rq (>=0.6)"] 671 | sanic = ["sanic (>=0.8)"] 672 | sqlalchemy = ["sqlalchemy (>=1.2)"] 673 | starlette = ["starlette (>=0.19.1)"] 674 | starlite = ["starlite (>=1.48)"] 675 | tornado = ["tornado (>=6)"] 676 | 677 | [[package]] 678 | name = "setproctitle" 679 | version = "1.3.2" 680 | description = "A Python module to customize the process title" 681 | optional = false 682 | python-versions = ">=3.7" 683 | groups = ["main"] 684 | files = [ 685 | {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe"}, 686 | {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18"}, 687 | {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005"}, 688 | {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7"}, 689 | {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d"}, 690 | {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246"}, 691 | {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494"}, 692 | {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806"}, 693 | {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94"}, 694 | {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1"}, 695 | {file = "setproctitle-1.3.2-cp310-cp310-win32.whl", hash = "sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099"}, 696 | {file = "setproctitle-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d"}, 697 | {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa"}, 698 | {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077"}, 699 | {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de"}, 700 | {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e"}, 701 | {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf"}, 702 | {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3"}, 703 | {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4"}, 704 | {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77"}, 705 | {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80"}, 706 | {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7"}, 707 | {file = "setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc"}, 708 | {file = "setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff"}, 709 | {file = "setproctitle-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927"}, 710 | {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02"}, 711 | {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83"}, 712 | {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9"}, 713 | {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10"}, 714 | {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258"}, 715 | {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca"}, 716 | {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c"}, 717 | {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989"}, 718 | {file = "setproctitle-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865"}, 719 | {file = "setproctitle-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f"}, 720 | {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5"}, 721 | {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f"}, 722 | {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963"}, 723 | {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65"}, 724 | {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973"}, 725 | {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31"}, 726 | {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42"}, 727 | {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484"}, 728 | {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827"}, 729 | {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202"}, 730 | {file = "setproctitle-1.3.2-cp38-cp38-win32.whl", hash = "sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1"}, 731 | {file = "setproctitle-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c"}, 732 | {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76"}, 733 | {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4"}, 734 | {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b"}, 735 | {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761"}, 736 | {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f"}, 737 | {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4"}, 738 | {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe"}, 739 | {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8"}, 740 | {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796"}, 741 | {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f"}, 742 | {file = "setproctitle-1.3.2-cp39-cp39-win32.whl", hash = "sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c"}, 743 | {file = "setproctitle-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9"}, 744 | {file = "setproctitle-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575"}, 745 | {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e"}, 746 | {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b"}, 747 | {file = "setproctitle-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084"}, 748 | {file = "setproctitle-1.3.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6"}, 749 | {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb"}, 750 | {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb"}, 751 | {file = "setproctitle-1.3.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98"}, 752 | {file = "setproctitle-1.3.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122"}, 753 | {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172"}, 754 | {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13"}, 755 | {file = "setproctitle-1.3.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665"}, 756 | {file = "setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd"}, 757 | ] 758 | 759 | [package.extras] 760 | test = ["pytest"] 761 | 762 | [[package]] 763 | name = "setuptools" 764 | version = "78.1.1" 765 | description = "Easily download, build, install, upgrade, and uninstall Python packages" 766 | optional = false 767 | python-versions = ">=3.9" 768 | groups = ["main"] 769 | files = [ 770 | {file = "setuptools-78.1.1-py3-none-any.whl", hash = "sha256:c3a9c4211ff4c309edb8b8c4f1cbfa7ae324c4ba9f91ff254e3d305b9fd54561"}, 771 | {file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"}, 772 | ] 773 | 774 | [package.extras] 775 | check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] 776 | core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] 777 | cover = ["pytest-cov"] 778 | doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] 779 | enabler = ["pytest-enabler (>=2.2)"] 780 | test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] 781 | type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] 782 | 783 | [[package]] 784 | name = "six" 785 | version = "1.16.0" 786 | description = "Python 2 and 3 compatibility utilities" 787 | optional = false 788 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 789 | groups = ["main"] 790 | files = [ 791 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 792 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 793 | ] 794 | 795 | [[package]] 796 | name = "smmap" 797 | version = "5.0.0" 798 | description = "A pure Python implementation of a sliding window memory map manager" 799 | optional = false 800 | python-versions = ">=3.6" 801 | groups = ["main"] 802 | files = [ 803 | {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, 804 | {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, 805 | ] 806 | 807 | [[package]] 808 | name = "tomli" 809 | version = "2.0.1" 810 | description = "A lil' TOML parser" 811 | optional = false 812 | python-versions = ">=3.7" 813 | groups = ["dev"] 814 | markers = "python_version < \"3.11\"" 815 | files = [ 816 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 817 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 818 | ] 819 | 820 | [[package]] 821 | name = "urllib3" 822 | version = "2.2.2" 823 | description = "HTTP library with thread-safe connection pooling, file post, and more." 824 | optional = false 825 | python-versions = ">=3.8" 826 | groups = ["main"] 827 | files = [ 828 | {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, 829 | {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, 830 | ] 831 | 832 | [package.extras] 833 | brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] 834 | h2 = ["h2 (>=4,<5)"] 835 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 836 | zstd = ["zstandard (>=0.18.0)"] 837 | 838 | [[package]] 839 | name = "wandb" 840 | version = "0.15.8" 841 | description = "A CLI and library for interacting with the Weights and Biases API." 842 | optional = false 843 | python-versions = ">=3.6" 844 | groups = ["main"] 845 | files = [ 846 | {file = "wandb-0.15.8-py3-none-any.whl", hash = "sha256:0cff71d412a9e6bed0f60cc0dd77d2b9898d3baf0a4aa31c741d3653e84dbd6b"}, 847 | {file = "wandb-0.15.8.tar.gz", hash = "sha256:2c39e129fb8dc69c7ff813aa52c2ce7f98e3a0f25c12dd96b1de7528d9443a84"}, 848 | ] 849 | 850 | [package.dependencies] 851 | appdirs = ">=1.4.3" 852 | Click = ">=7.1,<8.0.0 || >8.0.0" 853 | docker-pycreds = ">=0.4.0" 854 | GitPython = ">=1.0.0,<3.1.29 || >3.1.29" 855 | pathtools = "*" 856 | protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} 857 | psutil = ">=5.0.0" 858 | PyYAML = "*" 859 | requests = ">=2.0.0,<3" 860 | sentry-sdk = ">=1.0.0" 861 | setproctitle = "*" 862 | setuptools = "*" 863 | 864 | [package.extras] 865 | async = ["httpx (>=0.22.0)"] 866 | aws = ["boto3"] 867 | azure = ["azure-identity", "azure-storage-blob"] 868 | gcp = ["google-cloud-storage"] 869 | grpc = ["grpcio (>=1.27.2)"] 870 | kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] 871 | launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "kubernetes", "nbconvert", "nbformat", "optuna", "typing-extensions"] 872 | media = ["bokeh", "moviepy", "numpy", "pillow", "plotly", "rdkit-pypi", "soundfile"] 873 | models = ["cloudpickle"] 874 | perf = ["orjson"] 875 | sweeps = ["sweeps (>=0.2.0)"] 876 | 877 | [metadata] 878 | lock-version = "2.1" 879 | python-versions = "^3.10" 880 | content-hash = "cfc803ec622e58fc464d313ceeafe1bf293f0a59bb19d2f8836675a3b1bc60b8" 881 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "lora-inspector" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["rockerBOO "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.10" 10 | safetensors = "^0.3.3" 11 | wandb = "^0.15.8" 12 | pillow = "^10.3.0" 13 | numpy = "^1.25.2" 14 | 15 | [tool.poetry.group.dev.dependencies] 16 | pytest = "^7.4.0" 17 | 18 | [build-system] 19 | requires = ["poetry-core"] 20 | build-backend = "poetry.core.masonry.api" 21 | -------------------------------------------------------------------------------- /ruff.toml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rockerBOO/lora-inspector/29fac7bfd2122abd2f3f9826e665c0889623979c/ruff.toml -------------------------------------------------------------------------------- /update_metadata.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from safetensors import safe_open 3 | from safetensors.torch import save_file 4 | 5 | 6 | ## Update a metadata key with a value. 7 | 8 | # !!!! 9 | # NOTE 10 | # !!!! 11 | # Overwrites the input file. 12 | 13 | def main(args): 14 | with safe_open(args.safetensors_file, framework="pt", device="cpu") as f: 15 | metadata = f.metadata() 16 | 17 | metadata[args.key] = args.value 18 | print(f"Updated {args.key} with {args.value}") 19 | 20 | tensors = {} 21 | 22 | for key in f.keys(): 23 | tensors[key] = f.get_tensor(key) 24 | 25 | save_file(tensors, args.safetensors_file, metadata) 26 | 27 | print(f"Saved to {args.safetensors_file}") 28 | 29 | 30 | if __name__ == "__main__": 31 | argparser = argparse.ArgumentParser() 32 | 33 | argparser.add_argument("safetensors_file") 34 | argparser.add_argument("--key", help="Key to change in the metadata") 35 | argparser.add_argument("--value", help="Value to set to the metadata") 36 | 37 | args = argparser.parse_args() 38 | 39 | main(args) 40 | --------------------------------------------------------------------------------