├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── MoA ├── README.md ├── moa.py └── template.env ├── README.md ├── codestral-mamba ├── README.md ├── codestral.py ├── poetry.lock ├── pyproject.toml └── template.env ├── fine-tuning-flux ├── Flux_LoRA_Fine_tuning.ipynb └── README.md ├── fine-tuning-llama3.1 ├── CodingMindset_Fine_Tuning_con_Unsloth.ipynb ├── README.md └── codingmindset_fine_tuning_con_unsloth.py ├── llama-agents-intro ├── README.md ├── llama_agents_ms.py ├── poetry.lock └── pyproject.toml ├── poetry.lock └── pyproject.toml /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 110 | .pdm.toml 111 | .pdm-python 112 | .pdm-build/ 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | #.idea/ 163 | 164 | # Mac OS X 165 | .DS_Store 166 | 167 | # Jupyter Notebook 168 | notebooks/ 169 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Código de Conducta para Contribuyentes 2 | 3 | ## Nuestro Compromiso 4 | 5 | Nosotros, como miembros, colaboradores y administradores nos comprometemos a hacer de la participación en nuestro proyecto y en nuestra comunidad una experiencia libre de acoso para todos, independientemente de la edad, el tamaño corporal, la discapacidad visible o invisible, la etnia, las características sexuales, la identidad y expresión de género, el nivel de experiencia, la educación, el estatus socioeconómico, la nacionalidad, la apariencia personal, la raza, la religión o la identidad y orientación sexual. 6 | 7 | ## Nuestros Estándares 8 | 9 | Ejemplos de comportamiento que contribuyen a crear un ambiente positivo incluyen: 10 | 11 | - Uso de un lenguaje amable e inclusivo. 12 | - Respeto a diferentes puntos de vista y experiencias. 13 | - Aceptación de críticas constructivas. 14 | - Enfoque en lo que es mejor para la comunidad. 15 | - Muestra de empatía hacia otros miembros de la comunidad. 16 | 17 | Ejemplos de comportamiento inaceptable incluyen: 18 | 19 | - Uso de lenguaje o imágenes sexualizadas y atenciones sexuales no deseadas. 20 | - Comentarios insultantes o despectivos (*trolling*) y ataques personales o políticos. 21 | - Acoso público o privado. 22 | - Publicación de información privada de terceros sin su consentimiento explícito. 23 | - Otras conductas que podrían considerarse inapropiadas en un entorno profesional. 24 | 25 | ## Nuestras Responsabilidades 26 | 27 | Los administradores del proyecto son responsables de aclarar los estándares de comportamiento aceptable y se espera que tomen acciones correctivas apropiadas y justas en respuesta a cualquier instancia de comportamiento inaceptable. 28 | 29 | Los administradores del proyecto tienen el derecho y la responsabilidad de eliminar, editar o rechazar comentarios, *commits*, código, ediciones de páginas de wiki, *issues* y otras contribuciones que no estén alineadas con este Código de Conducta, y de prohibir temporal o permanentemente a cualquier colaborador cuyo comportamiento sea inapropiado, amenazante, ofensivo o perjudicial. 30 | 31 | ## Alcance 32 | 33 | Este Código de Conducta se aplica tanto dentro de los espacios del proyecto como en los espacios públicos cuando un individuo representa al proyecto o su comunidad. Ejemplos de representación del proyecto o comunidad incluyen el uso de una dirección de correo electrónico oficial del proyecto, la publicación a través de una cuenta oficial en redes sociales o al actuar como un representante designado en un evento en línea o fuera de línea. La representación del proyecto puede ser aclarada más específicamente por los administradores del proyecto. 34 | 35 | ## Aplicación 36 | 37 | Las instancias de comportamiento abusivo, acosador o inaceptable pueden ser reportadas contactando al equipo del proyecto en [elvin@codingmindset.io]. Todas las quejas serán revisadas e investigadas y resultarán en una respuesta necesaria y apropiada a las circunstancias. El equipo del proyecto está obligado a mantener la confidencialidad respecto al reportero de un incidente. Los detalles específicos sobre las políticas de aplicación pueden ser publicadas por separado. 38 | 39 | Los administradores del proyecto que no sigan o apliquen el Código de Conducta de buena fe pueden enfrentar repercusiones temporales o permanentes según lo determinen otros miembros de la administración del proyecto. 40 | 41 | ## Atribución 42 | 43 | Este Código de Conducta es una adaptación del [Contributor Covenant](https://www.contributor-covenant.org), versión 2.0, disponible en https://www.contributor-covenant.org/version/2/0/code_of_conduct.html 44 | 45 | Para respuestas a preguntas frecuentes sobre este código de conducta, consulta las FAQ en https://www.contributor-covenant.org/faq 46 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Guía para Contribuir 2 | 3 | ¡Gracias por tu interés en contribuir al repositorio de CodingMindset! Aquí te explicamos cómo puedes colaborar de manera efectiva. 4 | 5 | ## Cómo Empezar 6 | 7 | 1. **Fork el Repositorio:** 8 | Haz un fork de este repositorio para crear una copia en tu cuenta de GitHub. 9 | 10 | 2. **Clona tu Fork:** 11 | Clona tu fork a tu máquina local. 12 | ```sh 13 | git clone https://github.com/tu-usuario/CodingMindset-YouTube.git 14 | ``` 15 | 16 | 3. **Configura el Repositorio Remoto:** 17 | Añade el repositorio original como un remoto llamado `upstream`. 18 | ```sh 19 | cd CodingMindset-YouTube 20 | git remote add upstream https://github.com/CodingMindset/CodingMindset-YouTube.git 21 | ``` 22 | 23 | ## Haciendo Contribuciones 24 | 25 | 1. **Sincroniza tu Fork:** 26 | Asegúrate de que tu fork esté actualizado con la rama `main` del repositorio original. 27 | ```sh 28 | git fetch upstream 29 | git checkout main 30 | git merge upstream/main 31 | ``` 32 | 33 | 2. **Crea una Rama para tu Cambio:** 34 | Crea una rama nueva para trabajar en tu contribución. 35 | ```sh 36 | git checkout -b nombre-de-tu-rama 37 | ``` 38 | 39 | 3. **Realiza tus Cambios:** 40 | Haz las modificaciones necesarias en tu rama. 41 | 42 | 4. **Añade y Commitea tus Cambios:** 43 | Añade tus cambios al índice y crea un commit descriptivo. 44 | ```sh 45 | git add . 46 | git commit -m "Descripción detallada de tus cambios" 47 | ``` 48 | 49 | 5. **Sube tus Cambios a GitHub:** 50 | Sube tu rama a tu fork en GitHub. 51 | ```sh 52 | git push origin nombre-de-tu-rama 53 | ``` 54 | 55 | 6. **Crea un Pull Request:** 56 | Desde tu repositorio fork en GitHub, abre un pull request hacia el repositorio original en la rama `main`. 57 | 58 | ## Recomendaciones para los Pull Requests 59 | 60 | - Asegúrate de que tu código sigue las normas de estilo del proyecto. 61 | - Añade pruebas si estás agregando nuevas características. 62 | - Actualiza la documentación según sea necesario. 63 | - Revisa tus cambios para evitar errores. 64 | 65 | ## Reportar Errores 66 | 67 | Si encuentras un error, por favor abre un issue en GitHub e incluye la siguiente información: 68 | 69 | - Descripción del error. 70 | - Pasos para reproducirlo. 71 | - Entorno en el que ocurre (sistema operativo, versiones de software, etc.). 72 | 73 | ## Solicitudes de Nuevas Características 74 | 75 | Si tienes ideas para nuevas características, nos encantaría escucharlas. Por favor, abre un issue en GitHub describiendo la característica y cómo beneficiaría al proyecto. 76 | 77 | ## Código de Conducta 78 | 79 | Para garantizar una comunidad acogedora y respetuosa, todos los contribuyentes deben seguir nuestro [Código de Conducta](CODE_OF_CONDUCT.md). 80 | 81 | ## Gracias 82 | 83 | ¡Gracias por tu interés en contribuir! Tu ayuda es muy valiosa para nosotros y para toda la comunidad de CodingMindset. 84 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 CodingMindset 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 | -------------------------------------------------------------------------------- /MoA/README.md: -------------------------------------------------------------------------------- 1 | # Mixture of Agents (MoA) 2 | 3 | Este repositorio contiene una implementación demostrativa del concepto Mixture of Agents (MoA), utilizando múltiples modelos de lenguaje de gran escala (LLMs) a través de la API de Together para mejorar la calidad de las respuestas en tareas de procesamiento de lenguaje natural. 4 | 5 | ## Descripción 6 | 7 | Esta aplicación demuestra cómo la metodología MoA puede mejorar significativamente la calidad de las respuestas generadas por LLMs. Utiliza una arquitectura en capas con múltiples agentes LLM, donde cada agente refina y mejora las respuestas generadas por los agentes en la capa anterior. 8 | 9 | ## Requisitos 10 | 11 | - Python 3.10 o superior 12 | - Poetry para la gestión de dependencias 13 | 14 | ## Instalación 15 | 16 | 1. **Clona el repositorio:** 17 | 18 | ```bash 19 | gh repo clone codingmindset/CodingMindset-YouTube 20 | cd MoA 21 | ``` 22 | 23 | 2. **Instala las dependencias:** 24 | 25 | ```bash 26 | poetry install 27 | ``` 28 | 29 | 3. **Configura la variable de entorno:** 30 | 31 | - Renombra el archivo `template.env` a `.env`: 32 | ```bash 33 | cp template.env .env 34 | ``` 35 | 36 | - Abre `.env` y añade tu API key de Together: 37 | ```env 38 | TOGETHER_API_KEY=your_api_key_here 39 | ``` 40 | 41 | Puedes obtener una API key registrándote en [Together](https://www.together.ai/). 42 | 43 | ## Uso 44 | 45 | El script principal admite dos modos de ejecución: `two_layer` y `multi_layer`. Puedes ejecutar la demostración de MoA con los siguientes comandos: 46 | 47 | ```bash 48 | # Modo de dos capas (por defecto) 49 | poetry run python moa_demo.py --mode two_layer --prompt "Tu pregunta aquí" 50 | 51 | # Modo de múltiples capas 52 | poetry run python moa_demo.py --mode multi_layer --layers 3 --prompt "Tu pregunta aquí" 53 | ``` 54 | 55 | ### Argumentos 56 | 57 | - `--mode`: Elige el modo de ejecución (`two_layer` o `multi_layer`). Por defecto es `two_layer`. 58 | - `--prompt`: La pregunta o instrucción que quieres que los modelos procesen. 59 | - `--layers`: Número de capas para el modo `multi_layer`. Por defecto es 3. 60 | 61 | ## Funcionalidades 62 | 63 | - **Múltiples Agentes LLM:** Utiliza varios modelos de lenguaje disponibles a través de la API de Together como agentes en diferentes capas. 64 | - **Refinamiento Iterativo:** Cada capa de agentes refina y mejora las respuestas generadas por la capa anterior. 65 | - **Agregación Final:** Un modelo agregador sintetiza la mejor respuesta basándose en las salidas de todos los agentes anteriores. 66 | - **Modos de Ejecución:** Soporta un modo de dos capas y un modo de múltiples capas configurable. 67 | - **Manejo de Errores:** Implementa reintentos en caso de errores de límite de tasa (rate limit). 68 | - **Logging Personalizado:** Utiliza un sistema de logging con formato colorido para mejor legibilidad. 69 | 70 | ### Modelos Utilizados 71 | 72 | - **Modelos de Propuesta:** 73 | - Qwen/Qwen2-72B-Instruct 74 | - google/gemma-2-27b-it 75 | - zero-one-ai/Yi-34B-Chat 76 | - deepseek-ai/deepseek-llm-67b-chat 77 | 78 | - **Modelo Agregador:** 79 | - meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo 80 | 81 | ## Tutorial 82 | 83 | Puedes ver el tutorial completo y el análisis de Mixture of Agents aquí 👇🏽👇🏽 84 | 85 | [![Watch this video on YouTube](https://img.youtube.com/vi/jqHUdrxqlPQ/0.jpg)](https://www.youtube.com/watch?v=jqHUdrxqlPQ) 86 | 87 | 88 | ## Obtención de la API Key de Together 89 | 90 | Para utilizar este demo, necesitarás una API key de Together. Sigue estos pasos para obtenerla: 91 | 92 | 1. Visita la página de registro de Together: [https://www.together.ai/sign-up](https://www.together.ai/sign-up) 93 | 2. Crea una cuenta o inicia sesión si ya tienes una. 94 | 3. Una vez en tu dashboard, busca la sección para generar una nueva API key. 95 | 4. Copia la API key generada y pégala en tu archivo `.env` como se indica en la sección de instalación. 96 | 97 | Recuerda mantener tu API key segura y no compartirla públicamente. 98 | 99 | [El resto del contenido se mantiene igual] 100 | 101 | ## Contribuir 102 | 103 | Las contribuciones son bienvenidas. Por favor, abre un issue o pull request para mejoras o correcciones. 104 | 105 | 106 | ## Licencia 107 | 108 | Este proyecto está bajo la licencia [MIT](LICENSE). 109 | 110 | --- 111 | 112 | ## Template `.env` 113 | 114 | Asegúrate de crear un archivo `.env` en la raíz del proyecto con el siguiente contenido: 115 | 116 | ```env 117 | TOGETHER_API_KEY=your_api_key_here 118 | ``` 119 | 120 | --- 121 | 122 | ¡Disfruta explorando Mixture of Agents! Si tienes alguna pregunta o sugerencia, no dudes en abrir un issue. -------------------------------------------------------------------------------- /MoA/moa.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import os 3 | import logging 4 | import argparse 5 | from dotenv import load_dotenv 6 | from together import AsyncTogether, Together, error 7 | 8 | # Configuración de registro (logging) 9 | class CustomFormatter(logging.Formatter): 10 | """ 11 | Esta clase formatea los mensajes de registro para mostrarlos en la consola con colores y un formato personalizado. 12 | Los colores hacen que sea más fácil distinguir los diferentes niveles de registro (depuración, información, advertencia, error, crítico). 13 | """ 14 | 15 | # Códigos de colores ANSI para resaltar los diferentes niveles de registro 16 | blue = "\033[94m" # Azul para DEBUG 17 | green = "\033[92m" # Verde para INFO 18 | yellow = "\033[93m" # Amarillo para WARNING 19 | red = "\033[91m" # Rojo para ERROR 20 | bold_red = "\033[1;91m" # Rojo negrita para CRITICAL 21 | reset = "\033[0m" # Código para restablecer el color 22 | 23 | # Formato base para los mensajes de registro 24 | format = "%(asctime)s - %(levelname)s - %(message)s" 25 | 26 | # Diccionario que asigna cada nivel de registro a su formato con color correspondiente 27 | FORMATS = { 28 | logging.DEBUG: blue + format + reset, 29 | logging.INFO: green + format + reset, 30 | logging.WARNING: yellow + format + reset, 31 | logging.ERROR: red + format + reset, 32 | logging.CRITICAL: bold_red + format + reset 33 | } 34 | 35 | def format(self, record): 36 | """ 37 | Formatea un registro de registro (log record) utilizando el formato correspondiente a su nivel. 38 | """ 39 | log_fmt = self.FORMATS.get(record.levelno) 40 | formatter = logging.Formatter(log_fmt, datefmt='%H:%M:%S') 41 | return formatter.format(record) 42 | 43 | 44 | # Configuración inicial del registro 45 | logger = logging.getLogger(__name__) 46 | logger.setLevel(logging.DEBUG) 47 | 48 | # Elimina cualquier handler de registro existente 49 | logger.handlers = [] 50 | 51 | # Crea un manejador para mostrar los registros en la consola 52 | ch = logging.StreamHandler() 53 | ch.setLevel(logging.DEBUG) 54 | 55 | # Establece el formateador personalizado en el manejador de consola 56 | ch.setFormatter(CustomFormatter()) 57 | 58 | # Añade el manejador de consola al registrador 59 | logger.addHandler(ch) 60 | 61 | # Carga variables de entorno desde el archivo .env 62 | _ = load_dotenv() 63 | 64 | # Constantes del sistema 65 | API_KEY = os.environ.get("TOGETHER_API_KEY") # Obtiene la clave API desde las variables de entorno 66 | TEMPERATURE = 0.7 # Controla la aleatoriedad de las respuestas de los modelos (0 = determinista, 1 = muy aleatorio) 67 | MAX_TOKENS = 512 # Número máximo de tokens (palabras o subpalabras) que un modelo puede generar en una respuesta 68 | RETRY_DELAYS = [1, 2, 4] # Tiempos de espera (en segundos) en caso de errores de límite de tasa (rate limit) 69 | 70 | # Inicializa los clientes de la API Together 71 | client = Together(api_key=API_KEY) # Cliente para interacciones síncronas 72 | async_client = AsyncTogether(api_key=API_KEY) # Cliente para interacciones asíncronas 73 | 74 | # Listas de modelos 75 | PROPOSAL_MODELS = [ # Modelos que generan propuestas de respuesta 76 | "Qwen/Qwen2-72B-Instruct", 77 | "google/gemma-2-27b-it", 78 | "zero-one-ai/Yi-34B-Chat", 79 | "deepseek-ai/deepseek-llm-67b-chat" 80 | ] 81 | 82 | AGGREGATOR_MODEL = "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo" 83 | AGGREGATOR_SYSTEM_PROMPT = """\ 84 | You have been provided with a set of responses from various open-source models to the latest user query. \ 85 | Your task is to synthesize these responses into a single, high-quality response. \ 86 | It is crucial to critically evaluate the information provided in these responses, recognizing that some of it may be biased or incorrect. \ 87 | Your response should not simply replicate the given answers but should offer a refined, accurate, and comprehensive reply to the instruction. \ 88 | Ensure your response is well-structured, coherent, and adheres to the highest standards of accuracy and reliability. 89 | 90 | Responses from models:""" # Instrucción para el modelo agregador (le dice qué hacer con las respuestas de los modelos de propuesta) 91 | 92 | async def run_llm(model, user_prompt): 93 | """Ejecuta una llamada a un modelo de lenguaje grande (LLM) con reintentos en caso de errores de límite de tasa.""" 94 | for sleep_time in RETRY_DELAYS: 95 | try: 96 | logger.info(f"Calling model {model} with prompt: {user_prompt}") 97 | response = await async_client.chat.completions.create( 98 | model=model, 99 | messages=[{"role": "user", "content": user_prompt}], 100 | temperature=TEMPERATURE, 101 | max_tokens=MAX_TOKENS, 102 | ) 103 | logger.debug(f"> Received response from model [{model}]: {response.choices[0].message.content}") 104 | return response.choices[0].message.content 105 | except error.RateLimitError as e: 106 | logger.warning(f"Rate limit exceeded for model {model}: {e}") 107 | await asyncio.sleep(sleep_time) 108 | except Exception as e: 109 | logger.error(f"Error running model {model}: {e}") 110 | return None 111 | return None 112 | 113 | def __collect_responses(system_prompt, results): 114 | """Construye una instrucción para el modelo agregador que incluye las respuestas previas para sintetizar.""" 115 | logger.info("Collecting responses from models") 116 | return ( 117 | system_prompt 118 | + "\n" 119 | + "\n".join([f"{i+1}. {element}" for i, element in enumerate(results)]) 120 | ) 121 | 122 | async def __gather_responses(models, user_prompt, layer=1): 123 | """Recopila las respuestas de todos los modelos de propuesta de forma asíncrona.""" 124 | logger.debug(f"Running layer {layer}") 125 | logger.info("Gathering responses from proposal models") 126 | results = await asyncio.gather(*[run_llm(model, user_prompt) for model in models]) # Ejecuta las llamadas a los modelos asincrónicamente 127 | results = [result for result in results if result] # Filtra las respuestas que no son None (en caso de errores) 128 | logger.info(f"Collected {len(results)} responses from proposal models") 129 | return results 130 | 131 | def __stream_final_response(finalStream): 132 | """Imprime la respuesta final del modelo agregador a medida que se recibe (en tiempo real).""" 133 | logger.info("Streaming final response from aggregator model") 134 | for chunk in finalStream: # Itera sobre los fragmentos de la respuesta a medida que se reciben 135 | print(chunk.choices[0].delta.content or "", end="", flush=True) # Imprime el contenido del fragmento (si hay alguno) 136 | 137 | async def __run_aggregator_model(user_prompt, concatenated_results, layer=2): 138 | """Ejecuta el modelo agregador con la instrucción y las respuestas concatenadas.""" 139 | logger.debug(f"Running layer {layer} (aggregator model)") 140 | # logger.info("Running aggregator model") 141 | finalStream = client.chat.completions.create( 142 | model=AGGREGATOR_MODEL, 143 | messages=[ 144 | {"role": "system", "content": AGGREGATOR_SYSTEM_PROMPT + "\n" + concatenated_results}, 145 | {"role": "user", "content": user_prompt}, 146 | ], 147 | stream=True, # Habilita la transmisión en tiempo real de la respuesta 148 | ) 149 | __stream_final_response(finalStream) 150 | 151 | async def two_layer_moa(user_prompt): 152 | """Ejecuta el proceso MOA de dos capas.""" 153 | results = await __gather_responses(PROPOSAL_MODELS, user_prompt) 154 | concatenated_results = "\n".join([f"{i+1}. {result}" for i, result in enumerate(results)]) # Concatena las respuestas en un formato legible 155 | await __run_aggregator_model(user_prompt, concatenated_results) 156 | 157 | async def multi_layer_moa(user_prompt, layers): 158 | """Ejecuta el proceso MOA de múltiples capas.""" 159 | results = await __gather_responses(PROPOSAL_MODELS, user_prompt) 160 | 161 | for layer in range(1, layers - 1): # Ejecuta las capas intermedias 162 | logger.debug(f"Running layer {layer + 1} of {layers}") 163 | results = await __gather_responses(PROPOSAL_MODELS, user_prompt, layer=layer+1) 164 | 165 | concatenated_results = __collect_responses(AGGREGATOR_SYSTEM_PROMPT, results) 166 | await __run_aggregator_model(user_prompt, concatenated_results, layer=layers) 167 | 168 | def main(): 169 | parser = argparse.ArgumentParser(description="Run the MOA process.") 170 | parser.add_argument("--mode", type=str, choices=["two_layer", "multi_layer"], default="two_layer", 171 | help="Choose the mode to run: 'two_layer' or 'multi_layer'.") 172 | parser.add_argument("--prompt", type=str, default="What is the meaning of life?", 173 | help="The user prompt to provide to the models.") 174 | parser.add_argument("--layers", type=int, default=3, help="Number of layers for multi-layer MOA (default is 3).") 175 | 176 | args = parser.parse_args() 177 | 178 | user_prompt = args.prompt 179 | if args.mode == "two_layer": 180 | logger.info("Running two-layer MOA") 181 | asyncio.run(two_layer_moa(user_prompt)) 182 | elif args.mode == "multi_layer": 183 | logger.info("Running multi-layer MOA") 184 | asyncio.run(multi_layer_moa(user_prompt, args.layers)) 185 | 186 | if __name__ == "__main__": 187 | main() -------------------------------------------------------------------------------- /MoA/template.env: -------------------------------------------------------------------------------- 1 | TOGETHER_API_KEY= -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Bienvenido al Repositorio de CodingMindset en GitHub 3 | 4 | Este repositorio contiene todo el código y los recursos de los tutoriales de ingeniería de IA presentados en nuestro canal de YouTube [CodingMindset](https://www.youtube.com/channel/UC1YEuQpT5QHRxHY8_ArquiQ). Nuestro objetivo es proporcionarte guías prácticas y fáciles de seguir sobre una variedad de tecnologías y conceptos de IA. 5 | 6 | ## Explora Más 7 | 8 | - **Sitio Web:** Para más contenido y tutoriales exclusivos, visita nuestro sitio web en [CodingMindset.io](https://codingmindset.io). ¡No olvides suscribirte a nuestra lista de correo para recibir las últimas actualizaciones y contenido especial directamente en tu bandeja de entrada! 9 | 10 | - **Únete a Nuestra Comunidad Gratuita:** Conéctate con otros entusiastas de la IA y resuelve tus dudas uniéndote a nuestro [Grupo de Telegram](https://t.me/coding_mindset). 11 | 12 | ## Cómo Utilizar Este Repositorio 13 | 14 | Cada carpeta en este repositorio corresponde a un tutorial específico de nuestro canal de YouTube. Dentro de cada carpeta, encontrarás todos los archivos de código necesarios, datasets y un breve README explicando el propósito del proyecto y cómo configurarlo en tu máquina. 15 | 16 | ## Mantente Conectado 17 | 18 | - **Suscríbete a nuestro Canal de YouTube:** Mantente al día con los últimos tutoriales suscribiéndote a [CodingMindset](https://www.youtube.com/channel/UC1YEuQpT5QHRxHY8_ArquiQ). 19 | 20 | - **Síguenos en [X/Instagram/Otras Redes Sociales]:** Sigue nuestros canales en redes sociales para actualizaciones en tiempo real y contenido más atractivo. 21 | 22 | ## Contribuir 23 | 24 | ¿Te gustaría contribuir a la comunidad de CodingMindset? Aceptamos pull requests, reportes de errores y otras contribuciones. Para más información, consulta nuestra guía de [CONTRIBUTING](CONTRIBUTING.md). 25 | 26 | ## Licencia 27 | 28 | Todos los proyectos y tutoriales en este repositorio son de código abierto bajo la [Licencia MIT](LICENSE). 29 | 30 | Gracias por visitar nuestro repositorio en GitHub. ¡Disfruta aprendiendo y creando increíbles proyectos de IA! 31 | 32 | --- 33 | 34 | Espero que este README sea útil para ti y para los seguidores de tu canal. ¡Mucho éxito con tus tutoriales! 35 | -------------------------------------------------------------------------------- /codestral-mamba/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Mistral Coding Assistant 3 | 4 | Este repositorio contiene un asistente de codificación utilizando el modelo Codestral Mamba de Mistral, accesible a través de una interfaz de Gradio. 5 | 6 | ## Descripción 7 | 8 | El Mistral Coding Assistant permite obtener ayuda y consejos de programación del modelo Codestral Mamba. Puedes hacer preguntas sobre programación o enviar fragmentos de código y recibir asistencia. 9 | 10 | ## Requisitos 11 | 12 | - Python 3.10 o superior 13 | - Poetry para la gestión de dependencias 14 | 15 | ## Instalación 16 | 17 | 1. **Instala las dependencias:** 18 | 19 | ```bash 20 | poetry install 21 | ``` 22 | 23 | 2. **Configura las variables de entorno:** 24 | 25 | - Renombra el archivo `template.env` a `.env`: 26 | ```bash 27 | cp template.env .env 28 | ``` 29 | 30 | - Abre `.env` y añade tu API key de Mistral: 31 | ```env 32 | MISTRAL_API_KEY=your_api_key_here 33 | ``` 34 | 35 | ## Uso 36 | 37 | Para ejecutar la aplicación: 38 | 39 | ```bash 40 | poetry run python codestral.py 41 | ``` 42 | 43 | ## Funcionalidades 44 | 45 | - **Interfaz de Usuario:** Utiliza Gradio para interactuar con el modelo Codestral Mamba. 46 | - **Asistente de Codificación:** Pregunta sobre problemas de programación y recibe respuestas generadas por el modelo. 47 | 48 | ## Tutorial 49 | 50 | Puedes ver el tutorial completo y el análisis de Codestral aquí 👉🏼 [🤯 REVOLUCIÓN en la Programación! Conoce Codestral Mamba 🔥🐍 el Nuevo modelo Open Source](https://youtu.be/e9-6NUOiY5E). 51 | 52 | ## Contribuir 53 | 54 | Las contribuciones son bienvenidas. Por favor, abre un issue o pull request para mejoras o correcciones. 55 | 56 | ## Licencia 57 | 58 | Este proyecto está bajo la licencia [MIT](LICENSE). 59 | 60 | --- 61 | 62 | ## Template `.env` 63 | 64 | Asegúrate de crear un archivo `.env` en la raíz del proyecto con el siguiente contenido: 65 | 66 | ```env 67 | MISTRAL_API_KEY=your_api_key_here 68 | ``` 69 | 70 | --- 71 | 72 | ¡Disfruta usando el Mistral Coding Assistant! Si tienes alguna pregunta o sugerencia, no dudes en abrir un issue. 73 | 74 | -------------------------------------------------------------------------------- /codestral-mamba/codestral.py: -------------------------------------------------------------------------------- 1 | import os 2 | import gradio as gr 3 | from mistralai.client import MistralClient 4 | from mistralai.models.chat_completion import ChatMessage 5 | from dotenv import load_dotenv 6 | import logging 7 | 8 | # Load environment variables from a .env file 9 | load_dotenv() 10 | 11 | # Configure logging 12 | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') 13 | 14 | def get_api_key(): 15 | """ 16 | Retrieves the Mistral API key from environment variables. 17 | 18 | Returns: 19 | str: The API key. 20 | """ 21 | api_key = os.getenv("MISTRAL_API_KEY") 22 | if not api_key: 23 | logging.error("MISTRAL_API_KEY environment variable not found.") 24 | raise ValueError("API key not found. Please set the MISTRAL_API_KEY environment variable.") 25 | return api_key 26 | 27 | def create_mistral_client(api_key): 28 | """ 29 | Creates a MistralClient instance. 30 | 31 | Args: 32 | api_key (str): The API key for authentication. 33 | 34 | Returns: 35 | MistralClient: The MistralClient instance. 36 | """ 37 | try: 38 | return MistralClient(api_key=api_key) 39 | except Exception as e: 40 | logging.error(f"Error creating MistralClient: {e}") 41 | raise 42 | 43 | def get_chat_response(client, user_input, model="codestral-mamba-latest"): 44 | """ 45 | Gets the chat response from the Mistral API. 46 | 47 | Args: 48 | client (MistralClient): The MistralClient instance. 49 | user_input (str): The input message from the user. 50 | model (str): The model name. 51 | 52 | Returns: 53 | str: The response message from the Mistral API. 54 | """ 55 | try: 56 | messages = [ChatMessage(role="user", content=user_input)] 57 | chat_response = client.chat(model=model, messages=messages) 58 | return chat_response.choices[0].message.content 59 | except Exception as e: 60 | logging.error(f"Error interacting with the Mistral API: {e}") 61 | return "An error occurred while interacting with the Mistral API. Please try again later." 62 | 63 | def chat_with_mistral(user_input): 64 | """ 65 | Function to interact with the Mistral API. 66 | 67 | Args: 68 | user_input (str): The input message from the user. 69 | 70 | Returns: 71 | str: The response message from the Mistral API. 72 | """ 73 | try: 74 | api_key = get_api_key() 75 | client = create_mistral_client(api_key) 76 | return get_chat_response(client, user_input) 77 | except ValueError as e: 78 | return str(e) 79 | except Exception as e: 80 | logging.error(f"Unexpected error: {e}") 81 | return "An unexpected error occurred. Please try again later." 82 | 83 | def create_gradio_interface(): 84 | """ 85 | Creates and launches the Gradio interface. 86 | """ 87 | ui = gr.Interface( 88 | fn=chat_with_mistral, 89 | inputs=gr.components.Textbox(label="Enter Your Message"), 90 | outputs=gr.components.Markdown(label="Chatbot Response"), 91 | title="Mistral Coding Assistant", 92 | description="Get coding help and advice from the Mistral API. Enter your programming questions or code snippets and receive assistance.", 93 | examples=[ 94 | ["How do I reverse a string in Python?"], 95 | ["Can you explain the difference between a list and a tuple in Python?"] 96 | ], 97 | allow_flagging="never" 98 | ) 99 | ui.launch() 100 | 101 | if __name__ == "__main__": 102 | create_gradio_interface() -------------------------------------------------------------------------------- /codestral-mamba/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "codestral-mamba" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Elvin Gomez "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.10" 10 | python-dotenv = "^1.0.1" 11 | mistralai = "^0.4.2" 12 | gradio = "^4.38.1" 13 | 14 | 15 | [build-system] 16 | requires = ["poetry-core"] 17 | build-backend = "poetry.core.masonry.api" 18 | -------------------------------------------------------------------------------- /codestral-mamba/template.env: -------------------------------------------------------------------------------- 1 | MISTRAL_API_KEY= -------------------------------------------------------------------------------- /fine-tuning-flux/Flux_LoRA_Fine_tuning.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [] 7 | }, 8 | "kernelspec": { 9 | "name": "python3", 10 | "display_name": "Python 3" 11 | }, 12 | "language_info": { 13 | "name": "python" 14 | } 15 | }, 16 | "cells": [ 17 | { 18 | "cell_type": "markdown", 19 | "source": [ 20 | "# Flux.1\n", 21 | "\n", 22 | "> Sígueme en RRSS para apoyar este contenido ❤️:
\n", 23 | "x -> [@codingmindsetio](https://x.com/codingmindsetio)
\n", 24 | "YT 🎥 -> [CodingMindset](https://www.youtube.com/@CodingMindsetIO?sub_confirmation=1)
\n", 25 | "IG 📸 -> [@codingmindset](https://www.instagram.com/codingmindset?igsh=ZGx5aGd4MXBwYmx5&utm_source=qr)" 26 | ], 27 | "metadata": { 28 | "id": "XKdAR4-7L2tr" 29 | } 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "source": [ 34 | "\n", 35 | "## Características clave de los modelos Flux:\n", 36 | "\n" 37 | ], 38 | "metadata": { 39 | "id": "vQRrlhgqL_VJ" 40 | } 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "source": [ 45 | "* **Calidad de imagen de vanguardia:** Flux produce imágenes de alta calidad, rivalizando e incluso superando a otros modelos de IA de generación de imágenes de código cerrado.\n", 46 | "* **Excelente seguimiento de instrucciones:** Flux destaca por su capacidad de seguir las indicaciones del usuario con precisión, lo que se traduce en imágenes que reflejan fielmente la visión del usuario.\n", 47 | "* **Variedad de modelos:** Black Forest Labs ofrece tres modelos principales de Flux:\n", 48 | " * **Flux.1 [pro]**: El modelo base, disponible a través de su API, representa la máxima calidad de imagen y seguimiento de instrucciones.\n", 49 | " * **Flux.1 [dev]**: Un modelo de código abierto, destilado por guía, que ofrece una calidad similar a la versión Pro, pero con mayor eficiencia. Ideal para investigación y desarrollo no comercial.\n", 50 | " * **Flux.1 [schnell]**: También de código abierto, este modelo está optimizado para la velocidad, lo que lo hace perfecto para uso personal y desarrollo local.\n", 51 | "\n", 52 | "* **Capacidades de código abierto:** Los modelos [dev] y [schnell] son de código abierto, lo que fomenta la investigación, la experimentación y el desarrollo de nuevas aplicaciones creativas.\n", 53 | "* **Flexibilidad de licencias:** \n", 54 | " * **Flux.1 [pro]**: Disponible como servicio comercial a través de su API.\n", 55 | " * **Flux.1 [dev]**: Licencia no comercial, ideal para investigación y desarrollo.\n", 56 | " * **Flux.1 [schnell]**: Licencia Apache 2.0, lo que permite un uso más amplio, incluso comercial.\n", 57 | "\n", 58 | "### En resumen:\n", 59 | "\n", 60 | "Flux de Black Forest Labs ofrece una gama de modelos de generación de imágenes de IA de alta calidad, con opciones tanto de código abierto como comerciales, que se adaptan a diversas necesidades y casos de uso. Ya sea para crear arte impresionante, impulsar la investigación o desarrollar aplicaciones innovadoras, Flux se posiciona como una herramienta poderosa y versátil en el panorama de la IA generativa." 61 | ], 62 | "metadata": { 63 | "id": "Z-jvB1WfObOO" 64 | } 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "source": [ 69 | "# Replicate" 70 | ], 71 | "metadata": { 72 | "id": "RhtJyLIOSKTC" 73 | } 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "source": [ 78 | "Replicate.com es una plataforma en la nube que permite a los desarrolladores ejecutar fácilmente modelos de aprendizaje automático (machine learning) a través de una API simple. Ofrece una amplia variedad de modelos pre-entrenados para tareas como generación de imágenes, edición de imágenes, procesamiento de lenguaje natural y más, facilitando la integración de la IA en aplicaciones sin necesidad de una infraestructura compleja." 79 | ], 80 | "metadata": { 81 | "id": "XXajGntbSOpf" 82 | } 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "source": [ 87 | "## Método 1 - UI\n", 88 | "\n" 89 | ], 90 | "metadata": { 91 | "id": "PmwLIAgGSUs7" 92 | } 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "source": [ 97 | "[Replicate Fux-dev LoRA Trainer](https://replicate.com/ostris/flux-dev-lora-trainer/train)" 98 | ], 99 | "metadata": { 100 | "id": "ixLs1-pYSaso" 101 | } 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "source": [ 106 | "## Método 2 - Replicate API\n", 107 | "\n" 108 | ], 109 | "metadata": { 110 | "id": "y_Dzf9OzVFsO" 111 | } 112 | }, 113 | { 114 | "cell_type": "code", 115 | "source": [ 116 | "!pip install -qqq replicate" 117 | ], 118 | "metadata": { 119 | "colab": { 120 | "base_uri": "https://localhost:8080/" 121 | }, 122 | "id": "914EJN0PWfLZ", 123 | "outputId": "615c0bfa-278c-42dd-d269-483314274e37" 124 | }, 125 | "execution_count": null, 126 | "outputs": [ 127 | { 128 | "output_type": "stream", 129 | "name": "stdout", 130 | "text": [ 131 | "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/44.6 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.6/44.6 kB\u001b[0m \u001b[31m2.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", 132 | "\u001b[?25h\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/76.4 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m76.4/76.4 kB\u001b[0m \u001b[31m3.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", 133 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.9/77.9 kB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", 134 | "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", 135 | "\u001b[?25h" 136 | ] 137 | } 138 | ] 139 | }, 140 | { 141 | "cell_type": "markdown", 142 | "source": [], 143 | "metadata": { 144 | "id": "mIeLpelfXoKy" 145 | } 146 | }, 147 | { 148 | "cell_type": "code", 149 | "source": [ 150 | "import os\n", 151 | "from getpass import getpass\n", 152 | "\n", 153 | "# Verificar si la variable de entorno ya existe\n", 154 | "if 'REPLICATE_API_TOKEN' in os.environ:\n", 155 | " replicate_api_token = os.environ['REPLICATE_API_TOKEN']\n", 156 | " print(\"La variable de entorno REPLICATE_API_TOKEN ya está configurada.\")\n", 157 | "else:\n", 158 | " # Pedir al usuario que introduzca el token\n", 159 | " replicate_api_token = getpass(\"Por favor, introduce tu REPLICATE_API_TOKEN: \")\n", 160 | "\n", 161 | " # Establecer la variable de entorno (sólo para esta sesión)\n", 162 | " os.environ['REPLICATE_API_TOKEN'] = replicate_api_token\n", 163 | " print(\"La variable de entorno REPLICATE_API_TOKEN ha sido configurada.\")" 164 | ], 165 | "metadata": { 166 | "id": "naOB3yVbL-OK", 167 | "colab": { 168 | "base_uri": "https://localhost:8080/" 169 | }, 170 | "outputId": "0288df75-e0ee-4d87-cd1c-a27c7f16ed40" 171 | }, 172 | "execution_count": null, 173 | "outputs": [ 174 | { 175 | "output_type": "stream", 176 | "name": "stdout", 177 | "text": [ 178 | "Por favor, introduce tu REPLICATE_API_TOKEN: ··········\n", 179 | "La variable de entorno REPLICATE_API_TOKEN ha sido configurada.\n" 180 | ] 181 | } 182 | ] 183 | }, 184 | { 185 | "cell_type": "markdown", 186 | "source": [ 187 | "### Configuramos las carcterísticas de nuestro futuro modelo" 188 | ], 189 | "metadata": { 190 | "id": "cmp9mhdhXw22" 191 | } 192 | }, 193 | { 194 | "cell_type": "code", 195 | "source": [ 196 | "import replicate\n", 197 | "\n", 198 | "model = replicate.models.create(\n", 199 | " owner=\"3lv27\",\n", 200 | " name=\"flux-your-model-name\",\n", 201 | " visibility=\"public\", # o \"private\" si lo prefieres\n", 202 | " hardware=\"gpu-t4\", # Todos los modelos FLux son ruteados a una H100\n", 203 | " description=\"A fine-tuned FLUX.1 model\"\n", 204 | ")\n", 205 | "\n", 206 | "print(f\"Model created: {model.name}\")\n", 207 | "print(f\"Model URL: https://replicate.com/{model.owner}/{model.name}\")" 208 | ], 209 | "metadata": { 210 | "id": "GVEKbXXeWVq4" 211 | }, 212 | "execution_count": null, 213 | "outputs": [] 214 | }, 215 | { 216 | "cell_type": "markdown", 217 | "source": [ 218 | "### Creamos el entrenamiento y configuramos el destino" 219 | ], 220 | "metadata": { 221 | "id": "amu_2zMCYGlX" 222 | } 223 | }, 224 | { 225 | "cell_type": "markdown", 226 | "source": [ 227 | "#### Parámetros dentro de `input`\n", 228 | "\n", 229 | "* `input_images`: Ruta al archivo ZIP con tus imágenes de entrenamiento. ¡Verifica que la ruta sea correcta y el ZIP esté bien organizado!\n", 230 | "* `steps`: Cantidad de pasos de entrenamiento. Más pasos = modelo más preciso, pero entrenamiento más largo.\n", 231 | "* `lora_rank`: Controla la complejidad del modelo LoRA. Mayor valor = modelo más expresivo, pero posible sobreajuste.\n", 232 | "* `optimizer`: Algoritmo para ajustar los pesos del modelo. \"adamw8bit\" es una opción popular y eficiente.\n", 233 | "* `resolution`: Resoluciones de imagen para el entrenamiento (separadas por comas).\n", 234 | "* `autocaption`: Si es `True`, el modelo intenta generar descripciones para tus imágenes automáticamente. Útil si no tienes descripciones previas.\n", 235 | "* `learning_rate`: Magnitud de los ajustes en los pesos del modelo. Mayor valor = entrenamiento más rápido, pero posible dificultad para converger.\n", 236 | "* `trigger_word`: Palabra o frase que activará tu modelo LoRA para generar imágenes. ¡Elige algo único que no esté en las descripciones de tus imágenes!\n", 237 | "* `hf_token`, `hf_repo_id`: (Opcionales) Para guardar tu modelo en Hugging Face. Necesitas tu token de acceso y el ID del repositorio.\n" 238 | ], 239 | "metadata": { 240 | "id": "DPS5ntWo0Bun" 241 | } 242 | }, 243 | { 244 | "cell_type": "code", 245 | "source": [ 246 | "# El destino es el modelo que hemos creado en el paso anterior\n", 247 | "training = replicate.trainings.create(\n", 248 | " version=\"ostris/flux-dev-lora-trainer:4ffd32160efd92e956d39c5338a9b8fbafca58e03f791f6d8011f3e20e8ea6fa\",\n", 249 | " input={\n", 250 | " \"input_images\": open(\"/path/to/your/local/training-images.zip\", \"rb\"), # Ruta hacia tus archivo ZIP\n", 251 | " \"steps\": 1000,\n", 252 | " \"lora_rank\": 16,\n", 253 | " \"optimizer\": \"adamw8bit\",\n", 254 | " \"resolution\": \"512,768,1024\",\n", 255 | " \"autocaption\": True,\n", 256 | " \"learning_rate\": 0.0004,\n", 257 | " \"trigger_word\": \"TOK\", # IMPORTANTE! Cambia este valor a tu preferencia\n", 258 | " \"hf_token\": \"YOUR_HUGGING_FACE_TOKEN\", # optional\n", 259 | " \"hf_repo_id\": \"YOUR_HUGGING_FACE_REPO_ID\", # optional\n", 260 | " },\n", 261 | " destination=f\"{model.owner}/{model.name}\"\n", 262 | ")\n", 263 | "\n", 264 | "print(f\"Training started: {training.status}\")\n", 265 | "print(f\"Training URL: https://replicate.com/p/{training.id}\")" 266 | ], 267 | "metadata": { 268 | "id": "8I4O3j0RXOfD" 269 | }, 270 | "execution_count": null, 271 | "outputs": [] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "source": [ 276 | "### Uso de nuestro modelo" 277 | ], 278 | "metadata": { 279 | "id": "Mky1xdhYYj7l" 280 | } 281 | }, 282 | { 283 | "cell_type": "code", 284 | "source": [ 285 | "import replicate\n", 286 | "\n", 287 | "input = {\n", 288 | " \"prompt\": \"A photorealistic image of EGM, an adult man with short dark hair and blue eyes, wearing a Deadpool costume body suit but with NO mask or head covering of any kind. His entire face is fully visible and unobstructed, showing a confident smile. The costume is the distinctive red and black Deadpool suit covering his body, arms, and legs, but stops at the neck, leaving his head and face completely exposed. He is standing triumphantly with arms raised atop Mount Everest, with the distinctive snowy peak and surrounding Himalayan mountains visible in the background. The scene is bathed in the warm, golden light of dawn, with a dramatic sky showing the sun just beginning to rise over the horizon.\"\n", 289 | "}\n", 290 | "\n", 291 | "output = replicate.run(\n", 292 | " \"3lv27/elvin-flux:8262810cc5573521eb4bfad06ab374dabeb42f30bd778dcaac3ab75642178095\",\n", 293 | " input=input\n", 294 | ")\n", 295 | "print(output)\n" 296 | ], 297 | "metadata": { 298 | "id": "BXmOLoHNajCS" 299 | }, 300 | "execution_count": null, 301 | "outputs": [] 302 | }, 303 | { 304 | "cell_type": "code", 305 | "source": [ 306 | "import replicate\n", 307 | "\n", 308 | "output = replicate.run(\n", 309 | " \"yourusername/flux-your-model-name:version_id\",\n", 310 | " input={\n", 311 | " \"prompt\": \"A portrait photo of a space station, bad 70s food\",\n", 312 | " \"num_inference_steps\": 28,\n", 313 | " \"guidance_scale\": 7.5,\n", 314 | " \"model\": \"dev\",\n", 315 | " }\n", 316 | ")\n", 317 | "\n", 318 | "print(f\"Generated image URL: {output}\")" 319 | ], 320 | "metadata": { 321 | "id": "rBGxBOnCYmtD" 322 | }, 323 | "execution_count": null, 324 | "outputs": [] 325 | }, 326 | { 327 | "cell_type": "markdown", 328 | "source": [ 329 | "## Método 3 - Ostris AI Toolkit\n" 330 | ], 331 | "metadata": { 332 | "id": "x4AE2RI0ayCZ" 333 | } 334 | }, 335 | { 336 | "cell_type": "markdown", 337 | "source": [ 338 | "[AI Toolkit Github](https://github.com/ostris/ai-toolkit)" 339 | ], 340 | "metadata": { 341 | "id": "wYpGoQsDcfob" 342 | } 343 | }, 344 | { 345 | "cell_type": "markdown", 346 | "source": [ 347 | "> Sígueme en RRSS para apoyar este contenido ❤️:
\n", 348 | "x -> [@codingmindsetio](https://x.com/codingmindsetio)
\n", 349 | "YT 🎥 -> [CodingMindset](https://www.youtube.com/@CodingMindsetIO?sub_confirmation=1)
\n", 350 | "IG 📸 -> [@codingmindset](https://www.instagram.com/codingmindset?igsh=ZGx5aGd4MXBwYmx5&utm_source=qr)" 351 | ], 352 | "metadata": { 353 | "id": "ESsb_HL9czQq" 354 | } 355 | }, 356 | { 357 | "cell_type": "code", 358 | "source": [], 359 | "metadata": { 360 | "id": "5rOqUKl_a4AS" 361 | }, 362 | "execution_count": null, 363 | "outputs": [] 364 | } 365 | ] 366 | } -------------------------------------------------------------------------------- /fine-tuning-flux/README.md: -------------------------------------------------------------------------------- 1 | # Fine-Tuning (LoRA) Flux.1 con Replicate 2 | 3 | Este repositorio contiene el código y los recursos necesarios para realizar fine-tuning del modelo Flux utilizando LoRA (Low-Rank Adaptation). El objetivo es personalizar el modelo para generar imágenes específicas, como autorretratos o estilos artísticos únicos. 4 | 5 | ## Características 6 | 7 | Implementación de fine-tuning de Flux con LoRA
8 | 9 | Tres métodos de entrenamiento: 10 | 11 | 🐣 Enfoque sin código para principiantes
12 | 🛠️ Uso de la API de Replicate para una implementación eficiente
13 | 🧪 Método manual con notebooks para máximo control 14 | 15 | 16 | Preparación de datos y optimización de resultados
17 | Ejemplos y casos de uso 18 | 19 | ## Tutorial en Video 20 | 21 | Puedes ver el tutorial completo y la explicación detallada del proceso de fine-tuning aquí 👇🏽👇🏽: 22 | 23 | [![Watch this video on YouTube](https://img.youtube.com/vi/XZ0RRu8Np54/0.jpg)](https://www.youtube.com/watch?v=XZ0RRu8Np54) 24 | 25 | ## Link para el bono de 10$ en replicate 26 | 27 | [Haz click aquí](https://replicate.com/invites/7e32f2ad-a14b-4eaf-9fc5-4f5c67b38ef1) 28 | 29 | 30 | ## Contribuciones 31 | 32 | Las contribuciones son bienvenidas. Por favor, abre un issue o un pull request para sugerencias de mejoras o correcciones. 33 | 34 | ## Licencia 35 | 36 | Este proyecto está bajo la licencia [insertar tipo de licencia]. 37 | 38 | --- 39 | 40 | ## Redes Sociales 41 | 42 | Sígueme en mis redes sociales para más contenido sobre IA y programación: 43 | 44 | - Twitter: [@codingmindsetio](https://twitter.com/codingmindsetio) 45 | - YouTube: [CodingMindset](https://www.youtube.com/@CodingMindsetIO?sub_confirmation=1) 46 | - Instagram: [@codingmindset](https://www.instagram.com/codingmindset) 47 | 48 | ¡No olvides dejar tu like y comentario en el video si te ha sido útil! Tu apoyo me ayuda a seguir creando contenido educativo de calidad. 49 | -------------------------------------------------------------------------------- /fine-tuning-llama3.1/README.md: -------------------------------------------------------------------------------- 1 | # Fine-Tuning Llama 3.1 8B LoRA con Unsloth 2 | 3 | Este repositorio contiene el código y las instrucciones para realizar fine-tuning del modelo Llama 3.1 8B utilizando LoRA (Low-Rank Adaptation) y la biblioteca Unsloth. Este tutorial está basado en un video de YouTube que muestra paso a paso cómo implementar estas técnicas avanzadas de ajuste de modelos de lenguaje. 4 | 5 | ## Descripción 6 | 7 | Este proyecto demuestra cómo utilizar técnicas de fine-tuning eficientes en términos de recursos para mejorar el rendimiento de modelos de lenguaje de gran escala. Utilizamos LoRA para adaptar el modelo Llama 3.1 8B de manera eficiente, y aprovechamos las optimizaciones proporcionadas por Unsloth para acelerar el proceso de entrenamiento. 8 | 9 | ## Tutorial en Video 10 | 11 | Puedes ver el tutorial completo y la explicación detallada del proceso de fine-tuning aquí 👇🏽👇🏽: 12 | 13 | [![Watch this video on YouTube](https://img.youtube.com/vi/--l1HXN6gXc/0.jpg)](https://www.youtube.com/watch?v=--l1HXN6gXc) 14 | 15 | ## Requisitos 16 | 17 | - Python 3.8 o superior 18 | - CUDA compatible GPU (recomendado) 19 | - Dependencias listadas en el notebook 20 | 21 | ## Instalación 22 | 23 | 1. **Clonar el repositorio:** 24 | ```bash 25 | gh repo clone codingmindset/CodingMindset-YouTube 26 | cd fine-tuning-llama3.1 27 | ``` 28 | 29 | 2. **Instalar dependencias:** 30 | Instala las dependencias siguiendo las instrucciones del notebook 31 | 32 | 33 | ## Uso 34 | 35 | El notebook principal `CodingMindset_Fine_Tuning_con_Unsloth.ipynb` contiene todo el código necesario para realizar el fine-tuning. Sigue estos pasos: 36 | 37 | 1. Abre el notebook en Google Colab o en tu entorno local con Jupyter. 38 | 2. Ejecuta las celdas en orden, siguiendo las instrucciones y comentarios proporcionados. 39 | 3. Ajusta los hiperparámetros según tus necesidades específicas. 40 | 41 | ## Características Principales 42 | 43 | - Fine-tuning de Llama 3.1 8B usando QLoRA 44 | - Utilización de Unsloth para optimización de rendimiento 45 | - Soporte para diferentes configuraciones de cuantización 46 | - Guardado y carga de modelos en formatos eficientes (LoRA, merged_16bit, merged_4bit) 47 | - Conversión a formato GGUF para compatibilidad con diversos motores de inferencia 48 | 49 | ## Contribuciones 50 | 51 | Las contribuciones son bienvenidas. Por favor, abre un issue o un pull request para sugerencias de mejoras o correcciones. 52 | 53 | ## Licencia 54 | 55 | Este proyecto está bajo la licencia [insertar tipo de licencia]. 56 | 57 | --- 58 | 59 | ## Redes Sociales 60 | 61 | Sígueme en mis redes sociales para más contenido sobre IA y programación: 62 | 63 | - Twitter: [@codingmindsetio](https://twitter.com/codingmindsetio) 64 | - YouTube: [CodingMindset](https://www.youtube.com/@CodingMindsetIO?sub_confirmation=1) 65 | - Instagram: [@codingmindset](https://www.instagram.com/codingmindset) 66 | 67 | ¡No olvides dejar tu like y comentario en el video si te ha sido útil! Tu apoyo me ayuda a seguir creando contenido educativo de calidad. -------------------------------------------------------------------------------- /fine-tuning-llama3.1/codingmindset_fine_tuning_con_unsloth.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """CodingMindset Fine-Tuning con Unsloth.ipynb 3 | 4 | Automatically generated by Colab. 5 | 6 | Original file is located at 7 | https://colab.research.google.com/drive/16HZWEUpYBgAVebzPG88J2jY4ey3Iflgq 8 | 9 | # Fine-tuning Llama 3.1 8B LoRA con Unsloth 10 | 11 | > Sígueme en RRSS para apoyar este contenido ❤️:
12 | x -> [@codingmindsetio](https://x.com/codingmindsetio)
13 | YT 🎥 -> [CodingMindset](https://www.youtube.com/@CodingMindsetIO?sub_confirmation=1)
14 | IG 📸 -> [@codingmindset](https://www.instagram.com/codingmindset?igsh=ZGx5aGd4MXBwYmx5&utm_source=qr) 15 | 16 | ## Instalación e importación de dependencias 17 | 18 | Para instalar Unsloth en tu propio PC, sigue las instrucciones de instalación de la página de Github [aquí](https://github.com/unslothai/unsloth?tab=readme-ov-file#-installation-instructions). 19 | """ 20 | 21 | # Commented out IPython magic to ensure Python compatibility. 22 | # %%capture 23 | # # Instala Unsloth, Xformers (Flash Attention) y todos los demás paquetes. 24 | # !pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" 25 | # 26 | # # Tenemos que comprobar qué versión de Torch para Xformers (2.3 -> 0.0.27) 27 | # from torch import __version__; from packaging.version import Version as V 28 | # xformers = "xformers==0.0.27" if V(__version__) < V("2.4.0") else "xformers" 29 | # !pip install --no-deps {xformers} trl peft accelerate bitsandbytes triton 30 | 31 | 32 | """Importamos todas las dependecias a utilizar""" 33 | 34 | import torch 35 | from trl import SFTTrainer 36 | from datasets import load_dataset 37 | from transformers import TrainingArguments, TextStreamer 38 | from unsloth.chat_templates import get_chat_template 39 | from unsloth import FastLanguageModel, is_bfloat16_supported 40 | 41 | """## Descarga del modelo 42 | 43 | ### Parámetros 44 | 45 | `max_seq_length`: Al preparar el modelo para su uso, es necesario establecer un límite máximo para la longitud de las secuencias, lo que afecta su capacidad de procesar información contextual. Aunque la versión 3.1 de Llama puede manejar contextos de hasta 128 mil tokens, en este caso optaremos por una configuración más modesta de 2,048 tokens. Esta elección se debe a que utilizar la capacidad máxima requiere considerablemente más recursos computacionales y de VRAM. 46 |
47 |
48 | `dtype`: se refiere al tipo de datos que se utilizará para representar los números en el modelo. Es importante porque afecta la precisión de los cálculos, el uso de memoria y la velocidad de procesamiento. 49 | 50 | * **None**: Detección automática 51 | * **torch.float32**: Precisión estándar, compatible con la mayoría de GPUs 52 | * **torch.float16**: Para GPUs Tesla T4, V100 53 | * **torch.bfloat16**: Para GPUs Ampere y más recientes 54 | 55 | `load_in_4bit`: Activa la cuantización de 4 bits para ahorrar memoria. Es opcional (puede ser False) 56 |
57 |
58 | `model_name`: En este caso escogemos la versión pre-cuantizada de Llama de 4-bit, debido a que es mucho más ligera (5.4 GB) comprado con la versión original con precisión de 16-bit (16 GB) 59 | """ 60 | 61 | max_seq_length = 2048 62 | dtype = None 63 | load_in_4bit = True 64 | 65 | model, tokenizer = FastLanguageModel.from_pretrained( 66 | model_name="unsloth/Meta-Llama-3.1-8B-bnb-4bit", 67 | max_seq_length=max_seq_length, 68 | load_in_4bit=True, 69 | dtype=None, 70 | ) 71 | 72 | """## Preparación LoRA - PEFT (Parameter Efficient Fine Tuning) 73 | 74 | LoRA tiene tres parámetros fundamentales: 75 | 76 | 1. `r` (Rango): Este valor determina el tamaño de las matrices de LoRA. Normalmente, se empieza con un rango de 8, pero puede llegar hasta 256. Un rango mayor permite almacenar más información, pero también aumenta el coste computacional y de memoria. En este caso, hemos optado por un valor de 16. 77 | 78 | 2. `lora_alpha` (α): Es un factor de escala para las actualizaciones. Alfa influye directamente en cuánto contribuyen los adaptadores (controla la magnitud de la contribución de los adaptadores LoRA a la red principal) y suele establecerse como 1 o 2 veces el valor del rango. En este caso, hemos optado por un valor de 16 (1 * r). 79 | 80 | 3. `target_modules`: LoRA se puede aplicar a varios componentes del modelo, como los mecanismos de atención (matrices Q, K, V), proyecciones de salida, bloques feed-forward y capas lineales de salida. Aunque inicialmente se centra en los mecanismos de atención, expandir LoRA a otros componentes ha demostrado ser beneficioso. Sin embargo, adaptar más módulos implica un aumento en el número de parámetros entrenables y en las necesidades de memoria. En este caso, hemos decidido aplicar LoRA a todos los módulos lineales para maximizar la calidad. 81 | 82 | Otros parámetros: 83 | 84 | `lora_dropout`: Técnica de regularización que desactiva aleatoriamente un porcentaje de conexiones en las matrices de adaptación durante el entrenamiento. Su objetivo principal es prevenir el sobreajuste. Ralentiza ligeramente el entrenamiento por lo que en este caso optamos por no usarlo. 85 | 86 | `use_rslora` (Estabilizador de rango): Introduce una modificación en el factor de escala de los adaptadores LoRA. En lugar de usar una proporción de 1/r, emplea 1/√r. Este sutil pero importante cambio tiene dos efectos principales: 87 | 88 | 1. Estabiliza el proceso de aprendizaje, siendo especialmente beneficioso cuando se utilizan rangos de adaptador más altos. 89 | 90 | 2. Permite mejorar el rendimiento del fine-tuning a medida que se incrementa el rango del adaptador. 91 | 92 | En esencia, rsLoRA busca optimizar el equilibrio entre la capacidad de adaptación y la estabilidad del entrenamiento, especialmente al trabajar con configuraciones de LoRA más complejas. 93 | 94 | `use_gradient_checkpointing`: Unsloth se encarga de gestionar el checkpointing del gradiente. Esta técnica consiste en almacenar temporalmente en el disco duro las capas de embedding de entrada y salida, en lugar de mantenerlas constantemente en la memoria de la tarjeta gráfica. El objetivo principal de esta estrategia es optimizar el uso de la VRAM, liberando espacio para otros procesos del modelo durante el entrenamiento. 95 | """ 96 | 97 | model = FastLanguageModel.get_peft_model( 98 | model, 99 | r=16, 100 | lora_alpha=16, 101 | lora_dropout=0, 102 | target_modules=["q_proj", "k_proj", "v_proj", "up_proj", "down_proj", "o_proj", "gate_proj"], 103 | use_rslora=True, 104 | use_gradient_checkpointing="unsloth" 105 | ) 106 | 107 | """## Preparación del Dataset y el Tokenizador 108 | 109 | Preparamos el tokenizador 110 | """ 111 | 112 | tokenizer = get_chat_template( 113 | tokenizer, 114 | mapping={"role": "from", "content": "value", "user": "human", "assistant": "gpt"}, 115 | chat_template="chatml", 116 | ) 117 | 118 | """En este caso vamos a usar el dataset `"mlabonne/FineTome-100k"`. Usa el formato ShareGPT (dataset), ideal para conversaciones multi-turno. Este formato se procesa para extraer pares de instrucción-respuesta. Luego, los datos se reformatean según una plantilla de chat, como ChatML, que estructura la conversación. ChatML usa tokens especiales para marcar el inicio y fin de cada mensaje.""" 119 | 120 | def apply_template(examples): 121 | messages = examples["conversations"] 122 | text = [tokenizer.apply_chat_template(message, tokenize=False, add_generation_prompt=False) for message in messages] 123 | return {"text": text} 124 | 125 | dataset = load_dataset("mlabonne/FineTome-100k", split="train") 126 | dataset = dataset.map(apply_template, batched=True) 127 | 128 | """## Entrenamiento 129 | 130 | Los hiperparámetros clave en el entrenamiento de modelos incluyen: 131 | 132 | 1. **`packing` (Empaquetado)**: Técnica para combinar múltiples muestras pequeñas en un lote, mejorando la eficiencia del procesamiento. 133 | 134 | 2. **`learning_rate` (Tasa de aprendizaje)**: Controla la intensidad de las actualizaciones de los parámetros. Debe equilibrarse para evitar un aprendizaje lento o inestable. Usaremos 0.0003 (3e-4) 135 | 136 | 3. **`lr_scheduler_type` (Planificador de tasa de aprendizaje)**: Ajusta la tasa durante el entrenamiento, generalmente comenzando alta y disminuyendo gradualmente. En este caso nos decantamos por la opcion lineal, una de las opciones más comunes. 137 | 138 | 4. **`per_device_train_batch_size` (Tamaño del lote)**: Determina cuántas muestras se procesan antes de actualizar los pesos. Lotes más grandes pueden mejorar la estabilidad y velocidad, pero requieren más memoria. El tamaño del lote será 8. 139 | 140 | 5. **`gradient_accumulation_steps` (Acumulador de gradientes)**: Es una técnica que permite simular un tamaño de lote más grande sin aumentar el uso de memoria. Funciona acumulando gradientes durante varias pasadas hacia adelante y hacia atrás antes de realizar una actualización de los pesos del modelo. Para esta ocasión, con 2 será suficiente. 141 | 142 | 6. **`num_train_epochs` (Número de épocas)**: Cantidad de veces que el modelo recorre todo el conjunto de datos. Más épocas pueden mejorar el rendimiento, pero también pueden causar sobreajuste. Para ejemplificar usaré 1 step, una vuelta completa a todo el set de entramiento. 143 | 144 | 7. **`optim` (Optimizador)**: Algoritmo para ajustar los parámetros del modelo. Se recomienda AdamW de 8 bits por su eficiencia en uso de memoria. 145 | 146 | 8. **`weight_decay` (Decaimiento de pesos)**: Técnica de regularización que penaliza pesos grandes para prevenir el sobreajuste. 147 | 148 | 9. **`warmup_steps`** (Pasos de calentamiento): Periodo inicial donde la tasa de aprendizaje aumenta gradualmente, ayudando a estabilizar el entrenamiento. 149 | 150 | 151 | Cada uno de estos hiperparámetros juega un papel crucial en el rendimiento y la eficiencia del entrenamiento, y su ajuste adecuado es fundamental para obtener los mejores resultados. 152 | 153 | Otros parámetros: 154 | - `fp16`: Habilita el entrenamiento en precisión mixta de 16 bits (si bfloat16 no es compatible). 155 | 156 | - `bf16`: Habilita el entrenamiento en bfloat16 (si es compatible). 157 | 158 | - `seed`: Semilla para la generación de números aleatorios (puede ser cualquier número). 159 | """ 160 | 161 | trainer=SFTTrainer( 162 | model=model, 163 | tokenizer=tokenizer, 164 | train_dataset=dataset, 165 | dataset_text_field="text", 166 | max_seq_length=max_seq_length, 167 | dataset_num_proc=2, 168 | packing=True, 169 | args=TrainingArguments( 170 | learning_rate=3e-4, 171 | lr_scheduler_type="linear", 172 | per_device_train_batch_size=8, 173 | gradient_accumulation_steps=2, 174 | num_train_epochs=1, 175 | fp16=not is_bfloat16_supported(), 176 | bf16=is_bfloat16_supported(), 177 | logging_steps=1, 178 | optim="adamw_8bit", 179 | weight_decay=0.01, 180 | warmup_steps=10, 181 | output_dir="output", 182 | seed=0, 183 | ), 184 | ) 185 | 186 | """Ejecutamos el entranamiento""" 187 | 188 | trainer_stats = trainer.train() 189 | 190 | """## Inferencia 191 | 192 | `FastLanguageModel.for_inference()` nos proporciona de manera nativa una inferencia el doble de rápida 193 | """ 194 | 195 | model = FastLanguageModel.for_inference(model) 196 | 197 | """Finalmente. realizamos la inferencia:""" 198 | 199 | messages = [ 200 | {"from": "human", "value": "Which number is larger: 9.9 or 9.11"}, 201 | ] 202 | 203 | inputs = tokenizer.apply_chat_template( 204 | messages, 205 | tokenize=True, 206 | add_generation_prompt=True, 207 | return_tensors="pt", 208 | ).to("cuda") 209 | 210 | text_streamer = TextStreamer(tokenizer) 211 | 212 | outputs = model.generate(input_ids=inputs, streamer=text_streamer, max_new_tokens=128, use_cache=True) 213 | 214 | """## Guardado del modelo 215 | 216 | Ahora es el momento de guardar nuestro modelo entrenado. Es importante recordar que, debido a la naturaleza de LoRA y QLoRA, lo que realmente hemos entrenado no es el modelo completo, sino un conjunto de adaptadores. 217 | 218 | Unsloth nos ofrece tres métodos para guardar nuestro trabajo: 219 | 220 | 1. `lora`: Este método guarda únicamente los adaptadores, sin el modelo base. 221 | 222 | 2. `merged_16bit`: Combina los adaptadores con el modelo base y los guarda en precisión de 16 bits. 223 | 224 | 3. `merged_4bit`: Similar al anterior, pero guarda el modelo combinado en precisión de 4 bits, lo que resulta en un archivo más compacto. 225 | 226 | La elección del método dependerá de nuestras necesidades específicas de almacenamiento y uso futuro del modelo. En nuestro caso escogemos la opción de 16bit para mayor precisión. 227 | """ 228 | 229 | # Guarda el modelo en local 230 | model.save_pretrained_merged("lora_model", tokenizer, save_method="merged_16bit") 231 | 232 | """Guardamos el modelo en nuestro repositorio de HuggingFace""" 233 | 234 | model.push_to_hub_merged("3lv27/CodingMindsetTunnedLlama-3.1-8B", tokenizer, save_method="merged_16bit", token="") 235 | 236 | """Unsloth ofrece una funcionalidad adicional muy útil: la conversión directa de tu modelo al formato GGUF. Este formato de cuantización, diseñado originalmente para llama.cpp, es ampliamente compatible con diversos motores de inferencia, como LM Studio, Ollama, etc. 237 | 238 | Una de las ventajas del formato GGUF es que permite especificar diferentes niveles de precisión. Aprovecharemos esta característica para generar múltiples versiones cuantizadas del modelo. Concretamente, crearemos versiones en las siguientes precisiones: `q2_k`, `q3_k_m`, `q4_k_m`, `q5_k_m`, `q6_k` y `q8_0`. 239 | 240 | Todas estas versiones cuantizadas se subirán a Hugging Face. El repositorio contendrá todos nuestros archivos GGUF generados. 241 | 242 | Esta approach nos permite ofrecer una gama de opciones que equilibran el tamaño del modelo y su precisión, adaptándose así a diferentes necesidades de implementación. 243 | """ 244 | 245 | model.push_to_hub_gguf( 246 | "3lv27/CodingMindsetTunnedLlama-3.1-8B-GGUF", # Cambia hf por tu nombre de usuario / nombre del repo 247 | tokenizer, 248 | quantization_method = ["q2_k", "q3_k_m", "q4_k_m", "q5_k_m", "q6_k", "q8_0"], 249 | token = "", # Obtén tu token de hf en https://huggingface.co/settings/tokens 250 | ) 251 | 252 | """## Nota importante 253 | 254 | Si has llegado hasta aquí, espero que este tutorial detallado te haya sido de gran ayuda. Si ha sido así, te agradecería mucho que me ayudases apoyando el contenido para poder seguir creando estos tutoriales tan detallados, ya que llevan muchas horas de trabajo. 255 | 256 | Apoya el contenido dejándo tu like y un comentario 🙏🙏❤️ 257 | 258 | Y no olvides seguirme en mis redes! 259 | 260 | x -> [@codingmindsetio](https://x.com/codingmindsetio)
261 | YT 🎥 -> [CodingMindset](https://www.youtube.com/@CodingMindsetIO?sub_confirmation=1)
262 | IG 📸 -> [@codingmindset](https://www.instagram.com/codingmindset?igsh=ZGx5aGd4MXBwYmx5&utm_source=qr) 263 | 264 | Muchas gracias de corazón! ❤️ 265 | """ 266 | 267 | from functools import partial 268 | 269 | quant_methods = ["q2_k", "q3_k_m", "q4_k_m", "q5_k_m", "q6_k", "q8_0"] 270 | 271 | def push_to_hub_gguf_with_quant(model, tokenizer, hub_path, quant): 272 | model.push_to_hub_gguf(hub_path, tokenizer, quant, token="") 273 | 274 | push_model = partial(push_to_hub_gguf_with_quant, model, tokenizer, "3lv27/CodingMindsetTunnedLlama-3.1-8B-GGUF") 275 | 276 | list(map(push_model, quant_methods)) -------------------------------------------------------------------------------- /llama-agents-intro/README.md: -------------------------------------------------------------------------------- 1 | # LLama-Agents 2 | 3 | Este repositorio contiene un sistema multi-agente utilizando agentes configurados con el nuevo framework de Llama-Index especial para la creación de agentes y por otro lado OpenAI como porveedor del servicio de LLMs, accesible a través de una interfaz de red. 4 | 5 | ## Descripción 6 | 7 | Esta una aplicación diseñada para proporcionar información sobre el clima y titulares de noticias a través de un sistema multi-agente. Utiliza la API de OpenWeatherMap para obtener datos meteorológicos y se integra con el modelo de lenguaje de OpenAI para generar y gestionar las respuestas. El sistema de noticias NO está implementado. 8 | 9 | ## Requisitos 10 | 11 | - Python 3.10 o superior 12 | - Poetry para la gestión de dependencias 13 | 14 | ## Instalación 15 | 16 | 1. **Instala las dependencias:** 17 | 18 | ```bash 19 | poetry install 20 | ``` 21 | 22 | 2. **Configura las variables de entorno:** 23 | 24 | - Renombra el archivo `template.env` a `.env`: 25 | ```bash 26 | cp template.env .env 27 | ``` 28 | 29 | - Abre `.env` y añade tu API key de OpenWeatherMap y OpenAI: 30 | ```env 31 | OPENWEATHERMAP_API_KEY=your_api_key_here 32 | OPENAI_API_KEY=your_api_key_here 33 | ``` 34 | 35 | Puedes obtener una clave API gratuita registrándote en [OpenWeatherMap](https://home.openweathermap.org/users/sign_up). 36 | 37 | ## Uso 38 | 39 | Para ejecutar la aplicación: 40 | 41 | ```bash 42 | poetry run python llama_agents_ms.py 43 | ``` 44 | 45 | Para lanzar la GUI: 46 | 47 | ```bash 48 | llama-agents monitor --control-plane-url http://127.0.0.1:8000 49 | ``` 50 | 51 | ## Funcionalidades 52 | 53 | - **Servicio Meteorológico:** Proporciona información actualizada del clima para cualquier ciudad utilizando la API de OpenWeatherMap. 54 | - **Titulares de Noticias:** Genera titulares de noticias actuales utilizando el modelo de lenguaje de OpenAI. 55 | - **Interacción Humana:** Configura un servicio que puede recibir y manejar consultas generales. 56 | 57 | ## Tutorial 58 | 59 | Puedes ver el tutorial completo y el análisis de LLama-agents aquí 👉🏼 [Tutorial de LLama-agents](https://youtu.be/tk6bJaj3qV4). 60 | 61 | ## Contribuir 62 | 63 | Las contribuciones son bienvenidas. Por favor, abre un issue o pull request para mejoras o correcciones. 64 | 65 | ## Licencia 66 | 67 | Este proyecto está bajo la licencia [MIT](LICENSE). 68 | 69 | --- 70 | 71 | ## Template `.env` 72 | 73 | Asegúrate de crear un archivo `.env` en la raíz del proyecto con el siguiente contenido: 74 | 75 | ```env 76 | OPENWEATHERMAP_API_KEY=your_api_key_here 77 | OPENAI_API_KEY=your_api_key_here 78 | ``` 79 | 80 | --- 81 | 82 | ¡Disfruta usando LLama-agents! Si tienes alguna pregunta o sugerencia, no dudes en abrir un issue. 83 | -------------------------------------------------------------------------------- /llama-agents-intro/llama_agents_ms.py: -------------------------------------------------------------------------------- 1 | import os 2 | from geopy.geocoders import Nominatim 3 | from dotenv import load_dotenv 4 | import requests 5 | from llama_agents import ( 6 | AgentService, 7 | HumanService, 8 | AgentOrchestrator, 9 | CallableMessageConsumer, 10 | ControlPlaneServer, 11 | ServerLauncher, 12 | SimpleMessageQueue, 13 | QueueMessage, 14 | ) 15 | 16 | from llama_index.core.agent import FunctionCallingAgentWorker 17 | from llama_index.core.tools import FunctionTool 18 | from llama_index.llms.openai import OpenAI 19 | 20 | # Load environment variables from .env file 21 | load_dotenv() 22 | API_KEY = os.getenv('OPENWEATHERMAP_API_KEY') 23 | 24 | def get_coordinates(city: str) -> tuple: 25 | """Fetches coordinates (latitude, longitude) for a given city using geopy and Nominatim.""" 26 | geolocator = Nominatim(user_agent="weather_app") 27 | location = geolocator.geocode(city) 28 | if location: 29 | return location.latitude, location.longitude 30 | else: 31 | raise ValueError(f"Could not fetch coordinates for {city}.") 32 | 33 | def get_weather_info(city: str) -> str: 34 | """Fetches weather information for a given city from OpenWeatherMap API.""" 35 | try: 36 | lat, lon = get_coordinates(city) 37 | url = f'http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API_KEY}&units=metric' 38 | response = requests.get(url) 39 | if response.status_code == 200: 40 | data = response.json() 41 | weather_description = data['weather'][0]['description'] 42 | temperature = data['main']['temp'] 43 | return f"The current weather in {city} is {weather_description} with a temperature of {temperature}°C." 44 | else: 45 | return f"Could not fetch weather information for {city}." 46 | except ValueError as e: 47 | return str(e) 48 | 49 | def get_news_headlines() -> str: 50 | """Returns the latest news headlines.""" 51 | return "Today's headlines: Market hits record high, new tech innovations emerge, and global peace talks continue." 52 | 53 | # Create tools from the functions 54 | weather_tool = FunctionTool.from_defaults(fn=get_weather_info) 55 | news_tool = FunctionTool.from_defaults(fn=get_news_headlines) 56 | 57 | # Create workers and agents 58 | worker1 = FunctionCallingAgentWorker.from_tools([weather_tool], llm=OpenAI()) 59 | worker2 = FunctionCallingAgentWorker.from_tools([news_tool], llm=OpenAI()) 60 | agent1 = worker1.as_agent() 61 | agent2 = worker2.as_agent() 62 | 63 | # Create our multi-agent framework components 64 | message_queue = SimpleMessageQueue() 65 | queue_client = message_queue.client 66 | 67 | control_plane = ControlPlaneServer( 68 | message_queue=queue_client, 69 | orchestrator=AgentOrchestrator(llm=OpenAI()), 70 | ) 71 | agent_server_1 = AgentService( 72 | agent=agent1, 73 | message_queue=queue_client, 74 | description="Provides weather information of any city.", 75 | service_name="weather_info_agent", 76 | host="127.0.0.1", 77 | port=8002, 78 | ) 79 | agent_server_2 = AgentService( 80 | agent=agent2, 81 | message_queue=queue_client, 82 | description="Provides news headlines.", 83 | service_name="news_info_agent", 84 | host="127.0.0.1", 85 | port=8003, 86 | ) 87 | human_service = HumanService( 88 | message_queue=queue_client, 89 | description="Answers general queries.", 90 | host="127.0.0.1", 91 | port=8004, 92 | ) 93 | 94 | # Additional human consumer 95 | def handle_result(message: QueueMessage) -> None: 96 | print("Got result:", message.data) 97 | 98 | human_consumer = CallableMessageConsumer(handler=handle_result, message_type="human") 99 | 100 | # Launch the servers 101 | launcher = ServerLauncher( 102 | [agent_server_1, agent_server_2, human_service], 103 | control_plane, 104 | message_queue, 105 | additional_consumers=[human_consumer], 106 | ) 107 | 108 | launcher.launch_servers() 109 | -------------------------------------------------------------------------------- /llama-agents-intro/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "llama-agents-intro" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Elvin Gomez "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.10" 10 | llama-agents = "^0.0.11" 11 | llama-index-agent-openai = "^0.2.8" 12 | llama-index-embeddings-openai = "^0.1.10" 13 | llama-index-program-openai = "^0.1.6" 14 | python-dotenv = "^1.0.1" 15 | geopy = "^2.4.1" 16 | 17 | 18 | [build-system] 19 | requires = ["poetry-core"] 20 | build-backend = "poetry.core.masonry.api" 21 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "aiohappyeyeballs" 5 | version = "2.3.4" 6 | description = "Happy Eyeballs for asyncio" 7 | optional = false 8 | python-versions = "<4.0,>=3.8" 9 | files = [ 10 | {file = "aiohappyeyeballs-2.3.4-py3-none-any.whl", hash = "sha256:40a16ceffcf1fc9e142fd488123b2e218abc4188cf12ac20c67200e1579baa42"}, 11 | {file = "aiohappyeyeballs-2.3.4.tar.gz", hash = "sha256:7e1ae8399c320a8adec76f6c919ed5ceae6edd4c3672f4d9eae2b27e37c80ff6"}, 12 | ] 13 | 14 | [[package]] 15 | name = "aiohttp" 16 | version = "3.10.0" 17 | description = "Async http client/server framework (asyncio)" 18 | optional = false 19 | python-versions = ">=3.8" 20 | files = [ 21 | {file = "aiohttp-3.10.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:68ab608118e212f56feef44d4785aa90b713042da301f26338f36497b481cd79"}, 22 | {file = "aiohttp-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:64a117c16273ca9f18670f33fc7fd9604b9f46ddb453ce948262889a6be72868"}, 23 | {file = "aiohttp-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54076a25f32305e585a3abae1f0ad10646bec539e0e5ebcc62b54ee4982ec29f"}, 24 | {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71c76685773444d90ae83874433505ed800e1706c391fdf9e57cc7857611e2f4"}, 25 | {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bdda86ab376f9b3095a1079a16fbe44acb9ddde349634f1c9909d13631ff3bcf"}, 26 | {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d6dcd1d21da5ae1416f69aa03e883a51e84b6c803b8618cbab341ac89a85b9e"}, 27 | {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ef0135d7ab7fb0284342fbbf8e8ddf73b7fee8ecc55f5c3a3d0a6b765e6d8b"}, 28 | {file = "aiohttp-3.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccab9381f38c669bb9254d848f3b41a3284193b3e274a34687822f98412097e9"}, 29 | {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:947da3aee057010bc750b7b4bb65cbd01b0bdb7c4e1cf278489a1d4a1e9596b3"}, 30 | {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5268b35fee7eb754fb5b3d0f16a84a2e9ed21306f5377f3818596214ad2d7714"}, 31 | {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff25d988fd6ce433b5c393094a5ca50df568bdccf90a8b340900e24e0d5fb45c"}, 32 | {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:594b4b4f1dfe8378b4a0342576dc87a930c960641159f5ae83843834016dbd59"}, 33 | {file = "aiohttp-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c8820dad615cd2f296ed3fdea8402b12663ac9e5ea2aafc90ef5141eb10b50b8"}, 34 | {file = "aiohttp-3.10.0-cp310-cp310-win32.whl", hash = "sha256:ab1d870403817c9a0486ca56ccbc0ebaf85d992277d48777faa5a95e40e5bcca"}, 35 | {file = "aiohttp-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:563705a94ea3af43467167f3a21c665f3b847b2a0ae5544fa9e18df686a660da"}, 36 | {file = "aiohttp-3.10.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13679e11937d3f37600860de1f848e2e062e2b396d3aa79b38c89f9c8ab7e791"}, 37 | {file = "aiohttp-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c66a1aadafbc0bd7d648cb7fcb3860ec9beb1b436ce3357036a4d9284fcef9a"}, 38 | {file = "aiohttp-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7e3545b06aae925f90f06402e05cfb9c62c6409ce57041932163b09c48daad6"}, 39 | {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:effafe5144aa32f0388e8f99b1b2692cf094ea2f6b7ceca384b54338b77b1f50"}, 40 | {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a04f2c8d41821a2507b49b2694c40495a295b013afb0cc7355b337980b47c546"}, 41 | {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6dbfac556219d884d50edc6e1952a93545c2786193f00f5521ec0d9d464040ab"}, 42 | {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a65472256c5232681968deeea3cd5453aa091c44e8db09f22f1a1491d422c2d9"}, 43 | {file = "aiohttp-3.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941366a554e566efdd3f042e17a9e461a36202469e5fd2aee66fe3efe6412aef"}, 44 | {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:927b4aca6340301e7d8bb05278d0b6585b8633ea852b7022d604a5df920486bf"}, 45 | {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:34adb8412e736a5d0df6d1fccdf71599dfb07a63add241a94a189b6364e997f1"}, 46 | {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:43c60d9b332a01ee985f080f639f3e56abcfb95ec1320013c94083c3b6a2e143"}, 47 | {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3f49edf7c5cd2987634116e1b6a0ee2438fca17f7c4ee480ff41decb76cf6158"}, 48 | {file = "aiohttp-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9784246431eaf9d651b3cc06f9c64f9a9f57299f4971c5ea778fa0b81074ef13"}, 49 | {file = "aiohttp-3.10.0-cp311-cp311-win32.whl", hash = "sha256:bec91402df78b897a47b66b9c071f48051cea68d853d8bc1d4404896c6de41ae"}, 50 | {file = "aiohttp-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:25a9924343bf91b0c5082cae32cfc5a1f8787ac0433966319ec07b0ed4570722"}, 51 | {file = "aiohttp-3.10.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:21dab4a704c68dc7bc2a1219a4027158e8968e2079f1444eda2ba88bc9f2895f"}, 52 | {file = "aiohttp-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:872c0dcaccebd5733d535868fe2356aa6939f5827dcea7a8b9355bb2eff6f56e"}, 53 | {file = "aiohttp-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f381424dbce313bb5a666a215e7a9dcebbc533e9a2c467a1f0c95279d24d1fa7"}, 54 | {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ca48e9f092a417c6669ee8d3a19d40b3c66dde1a2ae0d57e66c34812819b671"}, 55 | {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbe2f6d0466f5c59c7258e0745c20d74806a1385fbb7963e5bbe2309a11cc69b"}, 56 | {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03799a95402a7ed62671c4465e1eae51d749d5439dbc49edb6eee52ea165c50b"}, 57 | {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5549c71c35b5f057a4eebcc538c41299826f7813f28880722b60e41c861a57ec"}, 58 | {file = "aiohttp-3.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6fa7a42b78d8698491dc4ad388169de54cca551aa9900f750547372de396277"}, 59 | {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:77bbf0a2f6fefac6c0db1792c234f577d80299a33ce7125467439097cf869198"}, 60 | {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:34eaf5cfcc979846d73571b1a4be22cad5e029d55cdbe77cdc7545caa4dcb925"}, 61 | {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4f1de31a585344a106db43a9c3af2e15bb82e053618ff759f1fdd31d82da38eb"}, 62 | {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3a1ea61d96146e9b9e5597069466e2e4d9e01e09381c5dd51659f890d5e29e7"}, 63 | {file = "aiohttp-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:73c01201219eb039a828bb58dcc13112eec2fed6eea718356316cd552df26e04"}, 64 | {file = "aiohttp-3.10.0-cp312-cp312-win32.whl", hash = "sha256:33e915971eee6d2056d15470a1214e4e0f72b6aad10225548a7ab4c4f54e2db7"}, 65 | {file = "aiohttp-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2dc75da06c35a7b47a88ceadbf993a53d77d66423c2a78de8c6f9fb41ec35687"}, 66 | {file = "aiohttp-3.10.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f1bc4d68b83966012813598fe39b35b4e6019b69d29385cf7ec1cb08e1ff829b"}, 67 | {file = "aiohttp-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9b8b31c057a0b7bb822a159c490af05cb11b8069097f3236746a78315998afa"}, 68 | {file = "aiohttp-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10f0d7894ddc6ff8f369e3fdc082ef1f940dc1f5b9003cd40945d24845477220"}, 69 | {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72de8ffba4a27e3c6e83e58a379fc4fe5548f69f9b541fde895afb9be8c31658"}, 70 | {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd36d0f0afc2bd84f007cedd2d9a449c3cf04af471853a25eb71f28bc2e1a119"}, 71 | {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f64d503c661864866c09806ac360b95457f872d639ca61719115a9f389b2ec90"}, 72 | {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31616121369bc823791056c632f544c6c8f8d1ceecffd8bf3f72ef621eaabf49"}, 73 | {file = "aiohttp-3.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f76c12abb88b7ee64b3f9ae72f0644af49ff139067b5add142836dab405d60d4"}, 74 | {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6c99eef30a7e98144bcf44d615bc0f445b3a3730495fcc16124cb61117e1f81e"}, 75 | {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:39e7ec718e7a1971a5d98357e3e8c0529477d45c711d32cd91999dc8d8404e1e"}, 76 | {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1cef548ee4e84264b78879de0c754bbe223193c6313beb242ce862f82eab184"}, 77 | {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f98f036eab11d2f90cdd01b9d1410de9d7eb520d070debeb2edadf158b758431"}, 78 | {file = "aiohttp-3.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc4376ff537f7d2c1e98f97f6d548e99e5d96078b0333c1d3177c11467b972de"}, 79 | {file = "aiohttp-3.10.0-cp38-cp38-win32.whl", hash = "sha256:ebedc51ee6d39f9ea5e26e255fd56a7f4e79a56e77d960f9bae75ef4f95ed57f"}, 80 | {file = "aiohttp-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:aad87626f31a85fd4af02ba7fd6cc424b39d4bff5c8677e612882649da572e47"}, 81 | {file = "aiohttp-3.10.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1dc95c5e2a5e60095f1bb51822e3b504e6a7430c9b44bff2120c29bb876c5202"}, 82 | {file = "aiohttp-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c83977f7b6f4f4a96fab500f5a76d355f19f42675224a3002d375b3fb309174"}, 83 | {file = "aiohttp-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8cedc48d36652dd3ac40e5c7c139d528202393e341a5e3475acedb5e8d5c4c75"}, 84 | {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b099fbb823efed3c1d736f343ac60d66531b13680ee9b2669e368280f41c2b8"}, 85 | {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d583755ddb9c97a2da1322f17fc7d26792f4e035f472d675e2761c766f94c2ff"}, 86 | {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a03a4407bdb9ae815f0d5a19df482b17df530cf7bf9c78771aa1c713c37ff1f"}, 87 | {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb6e65f6ea7caa0188e36bebe9e72b259d3d525634758c91209afb5a6cbcba7"}, 88 | {file = "aiohttp-3.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6612c6ed3147a4a2d6463454b94b877566b38215665be4c729cd8b7bdce15b4"}, 89 | {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b0c0148d2a69b82ffe650c2ce235b431d49a90bde7dd2629bcb40314957acf6"}, 90 | {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0d85a173b4dbbaaad1900e197181ea0fafa617ca6656663f629a8a372fdc7d06"}, 91 | {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:12c43dace645023583f3dd2337dfc3aa92c99fb943b64dcf2bc15c7aa0fb4a95"}, 92 | {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:33acb0d9bf12cdc80ceec6f5fda83ea7990ce0321c54234d629529ca2c54e33d"}, 93 | {file = "aiohttp-3.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:91e0b76502205484a4d1d6f25f461fa60fe81a7987b90e57f7b941b0753c3ec8"}, 94 | {file = "aiohttp-3.10.0-cp39-cp39-win32.whl", hash = "sha256:1ebd8ed91428ffbe8b33a5bd6f50174e11882d5b8e2fe28670406ab5ee045ede"}, 95 | {file = "aiohttp-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:0433795c4a8bafc03deb3e662192250ba5db347c41231b0273380d2f53c9ea0b"}, 96 | {file = "aiohttp-3.10.0.tar.gz", hash = "sha256:e8dd7da2609303e3574c95b0ec9f1fd49647ef29b94701a2862cceae76382e1d"}, 97 | ] 98 | 99 | [package.dependencies] 100 | aiohappyeyeballs = ">=2.3.0" 101 | aiosignal = ">=1.1.2" 102 | async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} 103 | attrs = ">=17.3.0" 104 | frozenlist = ">=1.1.1" 105 | multidict = ">=4.5,<7.0" 106 | yarl = ">=1.0,<2.0" 107 | 108 | [package.extras] 109 | speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] 110 | 111 | [[package]] 112 | name = "aiosignal" 113 | version = "1.3.1" 114 | description = "aiosignal: a list of registered asynchronous callbacks" 115 | optional = false 116 | python-versions = ">=3.7" 117 | files = [ 118 | {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, 119 | {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, 120 | ] 121 | 122 | [package.dependencies] 123 | frozenlist = ">=1.1.0" 124 | 125 | [[package]] 126 | name = "annotated-types" 127 | version = "0.7.0" 128 | description = "Reusable constraint types to use with typing.Annotated" 129 | optional = false 130 | python-versions = ">=3.8" 131 | files = [ 132 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 133 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 134 | ] 135 | 136 | [[package]] 137 | name = "async-timeout" 138 | version = "4.0.3" 139 | description = "Timeout context manager for asyncio programs" 140 | optional = false 141 | python-versions = ">=3.7" 142 | files = [ 143 | {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, 144 | {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, 145 | ] 146 | 147 | [[package]] 148 | name = "attrs" 149 | version = "23.2.0" 150 | description = "Classes Without Boilerplate" 151 | optional = false 152 | python-versions = ">=3.7" 153 | files = [ 154 | {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, 155 | {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, 156 | ] 157 | 158 | [package.extras] 159 | cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] 160 | dev = ["attrs[tests]", "pre-commit"] 161 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] 162 | tests = ["attrs[tests-no-zope]", "zope-interface"] 163 | tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] 164 | tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] 165 | 166 | [[package]] 167 | name = "certifi" 168 | version = "2024.7.4" 169 | description = "Python package for providing Mozilla's CA Bundle." 170 | optional = false 171 | python-versions = ">=3.6" 172 | files = [ 173 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, 174 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, 175 | ] 176 | 177 | [[package]] 178 | name = "charset-normalizer" 179 | version = "3.3.2" 180 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 181 | optional = false 182 | python-versions = ">=3.7.0" 183 | files = [ 184 | {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, 185 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, 186 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, 187 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, 188 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, 189 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, 190 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, 191 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, 192 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, 193 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, 194 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, 195 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, 196 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, 197 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, 198 | {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, 199 | {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, 200 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, 201 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, 202 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, 203 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, 204 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, 205 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, 206 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, 207 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, 208 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, 209 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, 210 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, 211 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, 212 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, 213 | {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, 214 | {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, 215 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, 216 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, 217 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, 218 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, 219 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, 220 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, 221 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, 222 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, 223 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, 224 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, 225 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, 226 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, 227 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, 228 | {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, 229 | {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, 230 | {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, 231 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, 232 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, 233 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, 234 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, 235 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, 236 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, 237 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, 238 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, 239 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, 240 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, 241 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, 242 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, 243 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, 244 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, 245 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, 246 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, 247 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, 248 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, 249 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, 250 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, 251 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, 252 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, 253 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, 254 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, 255 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, 256 | {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, 257 | {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, 258 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, 259 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, 260 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, 261 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, 262 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, 263 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, 264 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, 265 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, 266 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, 267 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, 268 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, 269 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, 270 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, 271 | {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, 272 | {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, 273 | {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, 274 | ] 275 | 276 | [[package]] 277 | name = "click" 278 | version = "8.1.7" 279 | description = "Composable command line interface toolkit" 280 | optional = false 281 | python-versions = ">=3.7" 282 | files = [ 283 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 284 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 285 | ] 286 | 287 | [package.dependencies] 288 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 289 | 290 | [[package]] 291 | name = "colorama" 292 | version = "0.4.6" 293 | description = "Cross-platform colored terminal text." 294 | optional = false 295 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 296 | files = [ 297 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 298 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 299 | ] 300 | 301 | [[package]] 302 | name = "eval-type-backport" 303 | version = "0.2.0" 304 | description = "Like `typing._eval_type`, but lets older Python versions use newer typing features." 305 | optional = false 306 | python-versions = ">=3.8" 307 | files = [ 308 | {file = "eval_type_backport-0.2.0-py3-none-any.whl", hash = "sha256:ac2f73d30d40c5a30a80b8739a789d6bb5e49fdffa66d7912667e2015d9c9933"}, 309 | {file = "eval_type_backport-0.2.0.tar.gz", hash = "sha256:68796cfbc7371ebf923f03bdf7bef415f3ec098aeced24e054b253a0e78f7b37"}, 310 | ] 311 | 312 | [package.extras] 313 | tests = ["pytest"] 314 | 315 | [[package]] 316 | name = "filelock" 317 | version = "3.15.4" 318 | description = "A platform independent file lock." 319 | optional = false 320 | python-versions = ">=3.8" 321 | files = [ 322 | {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, 323 | {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, 324 | ] 325 | 326 | [package.extras] 327 | docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] 328 | testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] 329 | typing = ["typing-extensions (>=4.8)"] 330 | 331 | [[package]] 332 | name = "frozenlist" 333 | version = "1.4.1" 334 | description = "A list-like structure which implements collections.abc.MutableSequence" 335 | optional = false 336 | python-versions = ">=3.8" 337 | files = [ 338 | {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, 339 | {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, 340 | {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, 341 | {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, 342 | {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, 343 | {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, 344 | {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, 345 | {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, 346 | {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, 347 | {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, 348 | {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, 349 | {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, 350 | {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, 351 | {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, 352 | {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, 353 | {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, 354 | {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, 355 | {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, 356 | {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, 357 | {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, 358 | {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, 359 | {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, 360 | {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, 361 | {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, 362 | {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, 363 | {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, 364 | {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, 365 | {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, 366 | {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, 367 | {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, 368 | {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, 369 | {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, 370 | {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, 371 | {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, 372 | {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, 373 | {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, 374 | {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, 375 | {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, 376 | {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, 377 | {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, 378 | {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, 379 | {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, 380 | {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, 381 | {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, 382 | {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, 383 | {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, 384 | {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, 385 | {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, 386 | {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, 387 | {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, 388 | {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, 389 | {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, 390 | {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, 391 | {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, 392 | {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, 393 | {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, 394 | {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, 395 | {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, 396 | {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, 397 | {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, 398 | {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, 399 | {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, 400 | {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, 401 | {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, 402 | {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, 403 | {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, 404 | {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, 405 | {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, 406 | {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, 407 | {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, 408 | {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, 409 | {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, 410 | {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, 411 | {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, 412 | {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, 413 | {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, 414 | {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, 415 | ] 416 | 417 | [[package]] 418 | name = "idna" 419 | version = "3.7" 420 | description = "Internationalized Domain Names in Applications (IDNA)" 421 | optional = false 422 | python-versions = ">=3.5" 423 | files = [ 424 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, 425 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, 426 | ] 427 | 428 | [[package]] 429 | name = "markdown-it-py" 430 | version = "3.0.0" 431 | description = "Python port of markdown-it. Markdown parsing, done right!" 432 | optional = false 433 | python-versions = ">=3.8" 434 | files = [ 435 | {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, 436 | {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, 437 | ] 438 | 439 | [package.dependencies] 440 | mdurl = ">=0.1,<1.0" 441 | 442 | [package.extras] 443 | benchmarking = ["psutil", "pytest", "pytest-benchmark"] 444 | code-style = ["pre-commit (>=3.0,<4.0)"] 445 | compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] 446 | linkify = ["linkify-it-py (>=1,<3)"] 447 | plugins = ["mdit-py-plugins"] 448 | profiling = ["gprof2dot"] 449 | rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] 450 | testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] 451 | 452 | [[package]] 453 | name = "mdurl" 454 | version = "0.1.2" 455 | description = "Markdown URL utilities" 456 | optional = false 457 | python-versions = ">=3.7" 458 | files = [ 459 | {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, 460 | {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, 461 | ] 462 | 463 | [[package]] 464 | name = "multidict" 465 | version = "6.0.5" 466 | description = "multidict implementation" 467 | optional = false 468 | python-versions = ">=3.7" 469 | files = [ 470 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, 471 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, 472 | {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, 473 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, 474 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, 475 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, 476 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, 477 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, 478 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, 479 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, 480 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, 481 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, 482 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, 483 | {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, 484 | {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, 485 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, 486 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, 487 | {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, 488 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, 489 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, 490 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, 491 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, 492 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, 493 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, 494 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, 495 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, 496 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, 497 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, 498 | {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, 499 | {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, 500 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, 501 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, 502 | {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, 503 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, 504 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, 505 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, 506 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, 507 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, 508 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, 509 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, 510 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, 511 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, 512 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, 513 | {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, 514 | {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, 515 | {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, 516 | {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, 517 | {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, 518 | {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, 519 | {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, 520 | {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, 521 | {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, 522 | {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, 523 | {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, 524 | {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, 525 | {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, 526 | {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, 527 | {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, 528 | {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, 529 | {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, 530 | {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, 531 | {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, 532 | {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, 533 | {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, 534 | {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, 535 | {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, 536 | {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, 537 | {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, 538 | {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, 539 | {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, 540 | {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, 541 | {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, 542 | {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, 543 | {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, 544 | {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, 545 | {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, 546 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, 547 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, 548 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, 549 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, 550 | {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, 551 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, 552 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, 553 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, 554 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, 555 | {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, 556 | {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, 557 | {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, 558 | {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, 559 | {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, 560 | ] 561 | 562 | [[package]] 563 | name = "numpy" 564 | version = "2.0.1" 565 | description = "Fundamental package for array computing in Python" 566 | optional = false 567 | python-versions = ">=3.9" 568 | files = [ 569 | {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, 570 | {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, 571 | {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, 572 | {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, 573 | {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, 574 | {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, 575 | {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, 576 | {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, 577 | {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, 578 | {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, 579 | {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, 580 | {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, 581 | {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, 582 | {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, 583 | {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, 584 | {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, 585 | {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, 586 | {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, 587 | {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, 588 | {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, 589 | {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, 590 | {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, 591 | {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, 592 | {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, 593 | {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, 594 | {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, 595 | {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, 596 | {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, 597 | {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, 598 | {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, 599 | {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, 600 | {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, 601 | {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, 602 | {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, 603 | {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, 604 | {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, 605 | {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, 606 | {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, 607 | {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, 608 | {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, 609 | {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, 610 | {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, 611 | {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, 612 | {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, 613 | {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, 614 | ] 615 | 616 | [[package]] 617 | name = "pillow" 618 | version = "10.4.0" 619 | description = "Python Imaging Library (Fork)" 620 | optional = false 621 | python-versions = ">=3.8" 622 | files = [ 623 | {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, 624 | {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, 625 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, 626 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, 627 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, 628 | {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, 629 | {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, 630 | {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, 631 | {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, 632 | {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, 633 | {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, 634 | {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, 635 | {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, 636 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, 637 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, 638 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, 639 | {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, 640 | {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, 641 | {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, 642 | {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, 643 | {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, 644 | {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, 645 | {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, 646 | {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, 647 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, 648 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, 649 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, 650 | {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, 651 | {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, 652 | {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, 653 | {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, 654 | {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, 655 | {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, 656 | {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, 657 | {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, 658 | {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, 659 | {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, 660 | {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, 661 | {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, 662 | {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, 663 | {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, 664 | {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, 665 | {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, 666 | {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, 667 | {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, 668 | {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, 669 | {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, 670 | {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, 671 | {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, 672 | {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, 673 | {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, 674 | {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, 675 | {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, 676 | {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, 677 | {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, 678 | {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, 679 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, 680 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, 681 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, 682 | {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, 683 | {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, 684 | {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, 685 | {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, 686 | {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, 687 | {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, 688 | {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, 689 | {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, 690 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, 691 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, 692 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, 693 | {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, 694 | {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, 695 | {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, 696 | {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, 697 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, 698 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, 699 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, 700 | {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, 701 | {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, 702 | {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, 703 | ] 704 | 705 | [package.extras] 706 | docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] 707 | fpx = ["olefile"] 708 | mic = ["olefile"] 709 | tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] 710 | typing = ["typing-extensions"] 711 | xmp = ["defusedxml"] 712 | 713 | [[package]] 714 | name = "pyarrow" 715 | version = "17.0.0" 716 | description = "Python library for Apache Arrow" 717 | optional = false 718 | python-versions = ">=3.8" 719 | files = [ 720 | {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, 721 | {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, 722 | {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"}, 723 | {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"}, 724 | {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"}, 725 | {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"}, 726 | {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"}, 727 | {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, 728 | {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, 729 | {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, 730 | {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, 731 | {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, 732 | {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, 733 | {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, 734 | {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, 735 | {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, 736 | {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, 737 | {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, 738 | {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, 739 | {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, 740 | {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, 741 | {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, 742 | {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, 743 | {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, 744 | {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, 745 | {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, 746 | {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, 747 | {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, 748 | {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, 749 | {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, 750 | {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, 751 | {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, 752 | {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, 753 | {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, 754 | {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, 755 | {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, 756 | ] 757 | 758 | [package.dependencies] 759 | numpy = ">=1.16.6" 760 | 761 | [package.extras] 762 | test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] 763 | 764 | [[package]] 765 | name = "pydantic" 766 | version = "2.8.2" 767 | description = "Data validation using Python type hints" 768 | optional = false 769 | python-versions = ">=3.8" 770 | files = [ 771 | {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, 772 | {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, 773 | ] 774 | 775 | [package.dependencies] 776 | annotated-types = ">=0.4.0" 777 | pydantic-core = "2.20.1" 778 | typing-extensions = [ 779 | {version = ">=4.6.1", markers = "python_version < \"3.13\""}, 780 | {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, 781 | ] 782 | 783 | [package.extras] 784 | email = ["email-validator (>=2.0.0)"] 785 | 786 | [[package]] 787 | name = "pydantic-core" 788 | version = "2.20.1" 789 | description = "Core functionality for Pydantic validation and serialization" 790 | optional = false 791 | python-versions = ">=3.8" 792 | files = [ 793 | {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, 794 | {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, 795 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, 796 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, 797 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, 798 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, 799 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, 800 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, 801 | {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, 802 | {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, 803 | {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, 804 | {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, 805 | {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, 806 | {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, 807 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, 808 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, 809 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, 810 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, 811 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, 812 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, 813 | {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, 814 | {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, 815 | {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, 816 | {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, 817 | {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, 818 | {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, 819 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, 820 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, 821 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, 822 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, 823 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, 824 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, 825 | {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, 826 | {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, 827 | {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, 828 | {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, 829 | {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, 830 | {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, 831 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, 832 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, 833 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, 834 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, 835 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, 836 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, 837 | {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, 838 | {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, 839 | {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, 840 | {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, 841 | {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, 842 | {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, 843 | {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, 844 | {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, 845 | {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, 846 | {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, 847 | {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, 848 | {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, 849 | {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, 850 | {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, 851 | {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, 852 | {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, 853 | {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, 854 | {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, 855 | {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, 856 | {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, 857 | {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, 858 | {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, 859 | {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, 860 | {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, 861 | {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, 862 | {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, 863 | {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, 864 | {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, 865 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, 866 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, 867 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, 868 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, 869 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, 870 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, 871 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, 872 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, 873 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, 874 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, 875 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, 876 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, 877 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, 878 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, 879 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, 880 | {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, 881 | {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, 882 | ] 883 | 884 | [package.dependencies] 885 | typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" 886 | 887 | [[package]] 888 | name = "pygments" 889 | version = "2.18.0" 890 | description = "Pygments is a syntax highlighting package written in Python." 891 | optional = false 892 | python-versions = ">=3.8" 893 | files = [ 894 | {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, 895 | {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, 896 | ] 897 | 898 | [package.extras] 899 | windows-terminal = ["colorama (>=0.4.6)"] 900 | 901 | [[package]] 902 | name = "python-dotenv" 903 | version = "1.0.1" 904 | description = "Read key-value pairs from a .env file and set them as environment variables" 905 | optional = false 906 | python-versions = ">=3.8" 907 | files = [ 908 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, 909 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, 910 | ] 911 | 912 | [package.extras] 913 | cli = ["click (>=5.0)"] 914 | 915 | [[package]] 916 | name = "requests" 917 | version = "2.32.3" 918 | description = "Python HTTP for Humans." 919 | optional = false 920 | python-versions = ">=3.8" 921 | files = [ 922 | {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, 923 | {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, 924 | ] 925 | 926 | [package.dependencies] 927 | certifi = ">=2017.4.17" 928 | charset-normalizer = ">=2,<4" 929 | idna = ">=2.5,<4" 930 | urllib3 = ">=1.21.1,<3" 931 | 932 | [package.extras] 933 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 934 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 935 | 936 | [[package]] 937 | name = "rich" 938 | version = "13.7.1" 939 | description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" 940 | optional = false 941 | python-versions = ">=3.7.0" 942 | files = [ 943 | {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, 944 | {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, 945 | ] 946 | 947 | [package.dependencies] 948 | markdown-it-py = ">=2.2.0" 949 | pygments = ">=2.13.0,<3.0.0" 950 | 951 | [package.extras] 952 | jupyter = ["ipywidgets (>=7.5.1,<9)"] 953 | 954 | [[package]] 955 | name = "shellingham" 956 | version = "1.5.4" 957 | description = "Tool to Detect Surrounding Shell" 958 | optional = false 959 | python-versions = ">=3.7" 960 | files = [ 961 | {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, 962 | {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, 963 | ] 964 | 965 | [[package]] 966 | name = "tabulate" 967 | version = "0.9.0" 968 | description = "Pretty-print tabular data" 969 | optional = false 970 | python-versions = ">=3.7" 971 | files = [ 972 | {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, 973 | {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, 974 | ] 975 | 976 | [package.extras] 977 | widechars = ["wcwidth"] 978 | 979 | [[package]] 980 | name = "together" 981 | version = "1.2.5" 982 | description = "Python client for Together's Cloud Platform!" 983 | optional = false 984 | python-versions = "<4.0,>=3.8" 985 | files = [ 986 | {file = "together-1.2.5-py3-none-any.whl", hash = "sha256:1f865323781cd8bf057a71f3de853288188a01cadc36faf57b0d8769768c6168"}, 987 | {file = "together-1.2.5.tar.gz", hash = "sha256:36b39ee62dd75dc335dee51778e0a642247028e0f0f9a1d004a8b42f18f72ad7"}, 988 | ] 989 | 990 | [package.dependencies] 991 | aiohttp = ">=3.9.3,<4.0.0" 992 | click = ">=8.1.7,<9.0.0" 993 | eval-type-backport = ">=0.1.3,<0.3.0" 994 | filelock = ">=3.13.1,<4.0.0" 995 | numpy = [ 996 | {version = ">=1.23.5", markers = "python_version < \"3.12\""}, 997 | {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, 998 | ] 999 | pillow = ">=10.3.0,<11.0.0" 1000 | pyarrow = ">=10.0.1" 1001 | pydantic = ">=2.6.3,<3.0.0" 1002 | requests = ">=2.31.0,<3.0.0" 1003 | tabulate = ">=0.9.0,<0.10.0" 1004 | tqdm = ">=4.66.2,<5.0.0" 1005 | typer = ">=0.9,<0.13" 1006 | 1007 | [[package]] 1008 | name = "tqdm" 1009 | version = "4.66.4" 1010 | description = "Fast, Extensible Progress Meter" 1011 | optional = false 1012 | python-versions = ">=3.7" 1013 | files = [ 1014 | {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, 1015 | {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, 1016 | ] 1017 | 1018 | [package.dependencies] 1019 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 1020 | 1021 | [package.extras] 1022 | dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] 1023 | notebook = ["ipywidgets (>=6)"] 1024 | slack = ["slack-sdk"] 1025 | telegram = ["requests"] 1026 | 1027 | [[package]] 1028 | name = "typer" 1029 | version = "0.12.3" 1030 | description = "Typer, build great CLIs. Easy to code. Based on Python type hints." 1031 | optional = false 1032 | python-versions = ">=3.7" 1033 | files = [ 1034 | {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, 1035 | {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, 1036 | ] 1037 | 1038 | [package.dependencies] 1039 | click = ">=8.0.0" 1040 | rich = ">=10.11.0" 1041 | shellingham = ">=1.3.0" 1042 | typing-extensions = ">=3.7.4.3" 1043 | 1044 | [[package]] 1045 | name = "typing-extensions" 1046 | version = "4.12.2" 1047 | description = "Backported and Experimental Type Hints for Python 3.8+" 1048 | optional = false 1049 | python-versions = ">=3.8" 1050 | files = [ 1051 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 1052 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "urllib3" 1057 | version = "2.2.2" 1058 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1059 | optional = false 1060 | python-versions = ">=3.8" 1061 | files = [ 1062 | {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, 1063 | {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, 1064 | ] 1065 | 1066 | [package.extras] 1067 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 1068 | h2 = ["h2 (>=4,<5)"] 1069 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 1070 | zstd = ["zstandard (>=0.18.0)"] 1071 | 1072 | [[package]] 1073 | name = "yarl" 1074 | version = "1.9.4" 1075 | description = "Yet another URL library" 1076 | optional = false 1077 | python-versions = ">=3.7" 1078 | files = [ 1079 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, 1080 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, 1081 | {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, 1082 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, 1083 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, 1084 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, 1085 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, 1086 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, 1087 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, 1088 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, 1089 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, 1090 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, 1091 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, 1092 | {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, 1093 | {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, 1094 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, 1095 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, 1096 | {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, 1097 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, 1098 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, 1099 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, 1100 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, 1101 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, 1102 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, 1103 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, 1104 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, 1105 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, 1106 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, 1107 | {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, 1108 | {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, 1109 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, 1110 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, 1111 | {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, 1112 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, 1113 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, 1114 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, 1115 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, 1116 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, 1117 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, 1118 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, 1119 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, 1120 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, 1121 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, 1122 | {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, 1123 | {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, 1124 | {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, 1125 | {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, 1126 | {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, 1127 | {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, 1128 | {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, 1129 | {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, 1130 | {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, 1131 | {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, 1132 | {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, 1133 | {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, 1134 | {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, 1135 | {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, 1136 | {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, 1137 | {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, 1138 | {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, 1139 | {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, 1140 | {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, 1141 | {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, 1142 | {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, 1143 | {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, 1144 | {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, 1145 | {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, 1146 | {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, 1147 | {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, 1148 | {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, 1149 | {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, 1150 | {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, 1151 | {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, 1152 | {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, 1153 | {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, 1154 | {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, 1155 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, 1156 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, 1157 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, 1158 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, 1159 | {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, 1160 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, 1161 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, 1162 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, 1163 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, 1164 | {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, 1165 | {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, 1166 | {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, 1167 | {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, 1168 | {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, 1169 | ] 1170 | 1171 | [package.dependencies] 1172 | idna = ">=2.0" 1173 | multidict = ">=4.0" 1174 | 1175 | [metadata] 1176 | lock-version = "2.0" 1177 | python-versions = "^3.10" 1178 | content-hash = "a01bea6f8fa840b5558e4540c21d708eb1bc203f53c74c4a9c3bc5f7e7086c6d" 1179 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "codingmindset-youtube-moa" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Elvin Gomez "] 6 | license = "MIT" 7 | readme = "README.md" 8 | 9 | [tool.poetry.dependencies] 10 | python = "^3.10" 11 | together = "^1.2.5" 12 | python-dotenv = "^1.0.1" 13 | 14 | 15 | [build-system] 16 | requires = ["poetry-core"] 17 | build-backend = "poetry.core.masonry.api" 18 | --------------------------------------------------------------------------------