From 82563691f0312d989a5afa0add39edb653c17f18 Mon Sep 17 00:00:00 2001 From: Dmytro Bobrenko <17252809+dbobrenko@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:29:48 +0200 Subject: [PATCH] v2.7.0 (#350) Changes: - New multi-choice benchmarking task; - Refactor changes (.env config-based, decoupled parts of the code); - Poetry setup; - Only 5 tasks are included: QA, DateQA, Summary, MultiChoice, Organic. --- .env.miner.example | 20 + .env.validator.example | 20 + .github/workflows/python-package.yml | 21 +- .gitignore | 7 +- .pre-commit-config.yaml | 16 + Makefile | 2 +- README.md | 92 +- assets/miner.md | 59 + assets/validator.md | 50 + install.sh | 35 +- neurons/forward.py | 110 + neurons/miners/huggingface/README.md | 47 - neurons/miners/huggingface/miner.py | 36 - neurons/miners/openai/README.md | 79 +- neurons/miners/openai/miner.py | 175 +- .../miners => neurons/miners/openai}/utils.py | 10 +- neurons/miners/test/echo.py | 55 +- neurons/miners/test/mock.py | 56 +- neurons/miners/test/phrase.py | 55 +- neurons/validator.py | 272 +- notebooks/datasets.ipynb | 85 + notebooks/demo.ipynb | 429 + notebooks/testing.ipynb | 912 +++ poetry.lock | 7259 +++++++++++++++++ prompting/__init__.py | 73 +- prompting/agent.py | 145 - prompting/base/dendrite.py | 77 + prompting/base/miner.py | 225 +- prompting/base/neuron.py | 126 +- prompting/base/prompting_miner.py | 204 - prompting/{ => base}/protocol.py | 34 +- prompting/base/validator.py | 261 +- prompting/cleaners/__init__.py | 1 - prompting/cleaners/cleaner.py | 58 - prompting/conversation.py | 63 - prompting/datasets/__init__.py | 0 prompting/datasets/base.py | 61 + prompting/datasets/wiki.py | 320 + prompting/dendrite.py | 73 - prompting/forward.py | 358 - prompting/llms/__init__.py | 10 +- prompting/llms/base_llm.py | 39 +- prompting/llms/hf.py | 248 - prompting/llms/utils.py | 42 +- prompting/llms/vllm_llm.py | 161 +- prompting/miners/__init__.py | 7 - prompting/miners/echo.py | 55 - prompting/miners/hf_miner.py | 219 - prompting/miners/langchain_miner.py | 169 - prompting/miners/mock.py | 56 - prompting/miners/openai_miner.py | 177 - prompting/miners/phrase.py | 68 - .../organic/organic_scoring_prompting.py | 362 +- prompting/organic/organic_task.py | 73 +- prompting/organic/synth_organic_task.py | 15 +- prompting/persona.py | 55 - prompting/rewards/__init__.py | 15 - prompting/rewards/code_diff.py | 56 - prompting/rewards/date.py | 30 +- prompting/rewards/float_diff.py | 14 +- prompting/rewards/multi_choice.py | 49 + prompting/rewards/ordinal.py | 47 - prompting/rewards/pipeline.py | 118 - prompting/rewards/relevance.py | 56 +- prompting/rewards/reward.py | 249 +- prompting/rewards/rouge.py | 36 +- prompting/rewards/streaming.py | 34 +- prompting/settings.py | 166 + prompting/shared/__init__.py | 1 - prompting/shared/context.py | 17 - prompting/task_registry.py | 23 - prompting/tasks/__init__.py | 21 - prompting/tasks/base_task.py | 77 + .../tasks/challenge_templates/__init__.py | 3 - prompting/tasks/challenge_templates/base.py | 17 - prompting/tasks/challenge_templates/math.py | 191 - .../tasks/challenge_templates/sentiment.py | 186 - prompting/tasks/date_qa.py | 81 +- prompting/tasks/debugging.py | 136 - prompting/tasks/generic_instruction.py | 47 - prompting/tasks/math.py | 31 - prompting/tasks/mock.py | 29 - prompting/tasks/multi_choice.py | 158 + prompting/tasks/persona.py | 44 + prompting/tasks/qa.py | 138 +- prompting/tasks/sentiment.py | 36 - prompting/tasks/summarization.py | 85 +- prompting/tasks/task.py | 129 - prompting/tasks/task_registry.py | 70 + prompting/tasks/translate.py | 133 - prompting/tools/__init__.py | 25 - prompting/tools/datasets/__init__.py | 7 - prompting/tools/datasets/base.py | 126 - prompting/tools/datasets/code.py | 686 -- .../tools/datasets/generic_instruction.py | 52 - prompting/tools/datasets/math.py | 101 - prompting/tools/datasets/mock.py | 30 - prompting/tools/datasets/review.py | 38 - prompting/tools/datasets/wiki.py | 353 - prompting/tools/selector.py | 51 - prompting/utils/__init__.py | 4 - .../all_cleaners.py => utils/cleaners.py} | 91 +- prompting/utils/config.py | 526 +- prompting/utils/exceptions.py | 13 +- prompting/utils/logging.py | 189 +- prompting/utils/misc.py | 35 +- prompting/utils/uids.py | 65 +- prompting/validator.py | 82 - pyproject.toml | 161 + run.sh | 252 +- scripts/check_compatibility.sh | 76 - scripts/check_updates.sh | 150 + scripts/client.py | 122 +- scripts/run.py | 105 - setup.py | 100 - tests/fixtures/cleaner.py | 10 +- tests/fixtures/dataset.py | 6 +- tests/fixtures/llm.py | 10 +- tests/fixtures/task.py | 56 - tests/test_agent.py | 36 +- tests/test_benchmark_task.py | 125 + tests/test_cleaner_pipeline.py | 27 +- tests/test_dataset.py | 12 +- tests/test_forward.py | 29 +- tests/test_llm.py | 26 +- tests/test_mock.py | 18 +- tests/test_registry.py | 17 +- tests/test_reward.py | 13 +- tests/test_scoring.py | 45 +- tests/test_streaming.py | 8 +- tests/test_tasks.py | 16 +- tests/test_uids.py | 10 +- 132 files changed, 12436 insertions(+), 7728 deletions(-) create mode 100644 .env.miner.example create mode 100644 .env.validator.example create mode 100644 .pre-commit-config.yaml create mode 100644 assets/miner.md create mode 100644 assets/validator.md create mode 100644 neurons/forward.py delete mode 100644 neurons/miners/huggingface/README.md delete mode 100644 neurons/miners/huggingface/miner.py rename {prompting/miners => neurons/miners/openai}/utils.py (74%) create mode 100644 notebooks/datasets.ipynb create mode 100644 notebooks/demo.ipynb create mode 100644 notebooks/testing.ipynb create mode 100644 poetry.lock delete mode 100644 prompting/agent.py create mode 100644 prompting/base/dendrite.py delete mode 100644 prompting/base/prompting_miner.py rename prompting/{ => base}/protocol.py (81%) delete mode 100644 prompting/cleaners/__init__.py delete mode 100644 prompting/cleaners/cleaner.py delete mode 100644 prompting/conversation.py create mode 100644 prompting/datasets/__init__.py create mode 100644 prompting/datasets/base.py create mode 100644 prompting/datasets/wiki.py delete mode 100644 prompting/dendrite.py delete mode 100644 prompting/forward.py delete mode 100644 prompting/llms/hf.py delete mode 100644 prompting/miners/__init__.py delete mode 100644 prompting/miners/echo.py delete mode 100644 prompting/miners/hf_miner.py delete mode 100644 prompting/miners/langchain_miner.py delete mode 100644 prompting/miners/mock.py delete mode 100644 prompting/miners/openai_miner.py delete mode 100644 prompting/miners/phrase.py delete mode 100644 prompting/persona.py delete mode 100644 prompting/rewards/code_diff.py create mode 100644 prompting/rewards/multi_choice.py delete mode 100644 prompting/rewards/ordinal.py delete mode 100644 prompting/rewards/pipeline.py create mode 100644 prompting/settings.py delete mode 100644 prompting/shared/__init__.py delete mode 100644 prompting/shared/context.py delete mode 100644 prompting/task_registry.py create mode 100644 prompting/tasks/base_task.py delete mode 100644 prompting/tasks/challenge_templates/__init__.py delete mode 100644 prompting/tasks/challenge_templates/base.py delete mode 100644 prompting/tasks/challenge_templates/math.py delete mode 100644 prompting/tasks/challenge_templates/sentiment.py delete mode 100644 prompting/tasks/debugging.py delete mode 100644 prompting/tasks/generic_instruction.py delete mode 100644 prompting/tasks/math.py delete mode 100644 prompting/tasks/mock.py create mode 100644 prompting/tasks/multi_choice.py create mode 100644 prompting/tasks/persona.py delete mode 100644 prompting/tasks/sentiment.py delete mode 100644 prompting/tasks/task.py create mode 100644 prompting/tasks/task_registry.py delete mode 100644 prompting/tasks/translate.py delete mode 100644 prompting/tools/__init__.py delete mode 100644 prompting/tools/datasets/__init__.py delete mode 100644 prompting/tools/datasets/base.py delete mode 100644 prompting/tools/datasets/code.py delete mode 100644 prompting/tools/datasets/generic_instruction.py delete mode 100644 prompting/tools/datasets/math.py delete mode 100644 prompting/tools/datasets/mock.py delete mode 100644 prompting/tools/datasets/review.py delete mode 100644 prompting/tools/datasets/wiki.py delete mode 100644 prompting/tools/selector.py rename prompting/{cleaners/all_cleaners.py => utils/cleaners.py} (60%) delete mode 100644 prompting/validator.py create mode 100644 pyproject.toml delete mode 100755 scripts/check_compatibility.sh create mode 100644 scripts/check_updates.sh delete mode 100644 scripts/run.py delete mode 100644 setup.py delete mode 100644 tests/fixtures/task.py create mode 100644 tests/test_benchmark_task.py diff --git a/.env.miner.example b/.env.miner.example new file mode 100644 index 00000000..074d60d2 --- /dev/null +++ b/.env.miner.example @@ -0,0 +1,20 @@ +# The network UID [1, 61] +NETUID=61 + +# The network name [test, finney, local] +SUBTENSOR_NETWORK = "test" + +# The chain endpoint, only required to be set if you run local. +SUBTENSOR_CHAIN_ENDPOINT = None + +# The name of your wallet. +WALLET_NAME="miner" + +# The name of the hotkey associated with the validator wallet. +HOTKEY="default" + +# Open port which can be used to connect to the network. +AXON_PORT=22116 + +# The OpenAI API key (only needed for the OpenAI test miner). +OPENAI_API_KEY="YOUR_API_HERE" diff --git a/.env.validator.example b/.env.validator.example new file mode 100644 index 00000000..a9248790 --- /dev/null +++ b/.env.validator.example @@ -0,0 +1,20 @@ +# The network UID. If 1 for main, 61 for testnet. +NETUID=61 + +# The network name [test, finney, local]. +SUBTENSOR_NETWORK = "test" + +# The chain endpoint, only required to be set if you run local. +SUBTENSOR_CHAIN_ENDPOINT = None + +# The name of your wallet. +WALLET_NAME="validator" + +# The name of the hotkey associated with the validator wallet. +HOTKEY="default" + +# Open port which can be used to connect to the network. +AXON_PORT=22116 + +# HuggingFace Access Token. +HF_TOKEN="" diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 41e1fbc6..16d25ff1 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -5,10 +5,8 @@ name: Prompting CI/CD on: push: - jobs: build: - runs-on: ubuntu-latest strategy: fail-fast: false @@ -24,19 +22,16 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - python -m pip install flake8 pytest black bash install.sh - - - name: Lint with flake8 - run: | - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Black + poetry install --all-extras + poetry run pip uninstall -y uvloop + - name: Debug Environment run: | - black . + poetry run python -V + poetry run which python + poetry env info + poetry run pip list - name: Test with pytest run: | # run tests in tests/ dir and only fail if there are failures or errors - pytest tests/ --verbose --failed-first --exitfirst --disable-warnings + poetry run pytest tests/ --verbose --failed-first --exitfirst --disable-warnings diff --git a/.gitignore b/.gitignore index e05499bf..49ded233 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ __pycache__/ .DS_Store **/.DS_Store +*.npz +prompting/storage/ # C extensions *.so @@ -124,6 +126,8 @@ celerybeat.pid # Environments .env +.env.miner +.env.validator .venv env/ venv/ @@ -165,8 +169,7 @@ cython_debug/ testing/ data/* plots/* -notebooks/* core app.config.js wandb -.vscode \ No newline at end of file +.vscode diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..8b4428f1 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,16 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace +- repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.5.2 + hooks: + # Run the linter. + - id: ruff + args: [ --fix ] + # Run the formatter. + - id: ruff-format diff --git a/Makefile b/Makefile index 7ab14b95..bd26c1c0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ SHELL:=/bin/bash promote-changes: - ./scripts/promote_changes.sh \ No newline at end of file + ./scripts/promote_changes.sh diff --git a/README.md b/README.md index 72cf9c22..0ce26347 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ # **Bittensor SN1** [![Discord Chat](https://img.shields.io/discord/308323056592486420.svg)](https://discord.gg/bittensor) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) --- @@ -24,98 +24,18 @@ This repository is the **official codebase for Bittensor Subnet 1 (SN1) v1.0.0+, # Introduction -This repo defines an incentive mechanism to create a distributed conversational AI for Subnet 1 (SN1). +This repo defines an incentive mechanism to create a distributed conversational AI for Subnet 1 (SN1). -Validators and miners are based on large language models (LLM). The validation process uses **internet-scale datasets and goal-driven behaviour to drive human-like conversations**. +Validators and miners are based on large language models (LLM). The validation process uses **internet-scale datasets and goal-driven behaviour to drive human-like conversations**. -# Installation -This repository requires python3.9 or higher. To install it, simply clone this repository and run the [install.sh](./install.sh) script. -```bash -git clone https://github.com/opentensor/prompting.git -cd prompting -bash install.sh -``` -If you are running a miner, you will also need to uninstall uvloop. -```bash -pip uninstall uvloop -y -``` - -If you are running a validator, logging in to Hugging Face is required: -```shell -huggingface-cli login -``` -You also need to accept the License Agreement for the LMSYS-Chat-1M dataset: https://huggingface.co/datasets/lmsys/lmsys-chat-1m +# Usage - +
-# Compute Requirements +**[For Validators](./assets/validator.md)** · **[For Miners](./assets/miner.md)** -1. To run a **validator**, you will need at least 62GB of VRAM. -2. To run the default huggingface **miner**, you will need at least 62GB of VRAM. - -**It is important to note that the baseminers are not recommended for main, and exist purely as an example. Running a base miner on main will result in no emissions and a loss in your registration fee.** -If you have any questions please reach out in the SN1 channel in the Bittensor Discord.
- -# How to Run -You can use the following command to run a miner or a validator. - -```bash -python - --netuid 1 - --subtensor.network - --neuron.device cuda - --wallet.name # Must be created using the bittensor-cli - --wallet.hotkey # Must be created using the bittensor-cli - --logging.debug # Run in debug mode, alternatively --logging.trace for trace mode - --axon.port # VERY IMPORTANT: set the port to be one of the open TCP ports on your machine -``` - -where `SCRIPT_PATH` is either: -1. neurons/miners/openai/miner.py -2. neurons/validator.py - -For ease of use, you can run the scripts as well with PM2. Installation of PM2 is: -**On Linux**: -```bash -sudo apt update && sudo apt install jq && sudo apt install npm && sudo npm install pm2 -g && pm2 update -``` - -Example of running an Openai miner on Main: - -```bash -pm2 start neurons/miners/openai/miner.py --interpreter python --name openai_miner -- --netuid 1 --subtensor.network finney --wallet.name my_wallet --wallet.hotkey my_hotkey --neuron.model_id gpt-3.5-turbo-1106 --axon.port 8091 -``` - -## Running with autoupdate - -You can run the validator in auto-update mode by using pm2 along with the `run.sh` bash script. This command will initiate two pm2 processes: one for auto-update monitoring, named **s1_validator_update**, and another for running the validator itself, named **s1_validator_main_process**. -```bash -pm2 start run.sh --name s1_validator_autoupdate -- --wallet.name --wallet.hotkey -``` - -> Note: this is not an end solution, major releases or changes in requirements will still require you to manually restart the processes. Regularly monitor the health of your validator to ensure optimal performance. - -# Testnet -We highly recommend that you run your miners on testnet before deploying on main. This is give you an opportunity to debug your systems, and ensure that you will not lose valuable immunity time. The SN1 testnet is **netuid 61**. - -In order to run on testnet, you will need to go through the same hotkey registration proceure as on main, but using **testtao**. You will need to ask for some in the community discord if you do not have any. - -To run: - -```bash -pm2 start neurons/miners/openai/miner.py --interpreter python3 --name openai_miner -- --netuid 61 --subtensor.network test --wallet.name my_test_wallet --wallet.hotkey my_test_hotkey --neuron.model_id gpt-3.5-turbo-1106 --axon.port 8091 -``` - -# Limitations -> Important: vLLM currently faces a [notable limitation](https://github.com/vllm-project/vllm/issues/3012) in designating a specific GPU for model execution via code. Consequently, to employ a particular CUDA device for your model's operations, it's necessary to manually adjust your environment variable `CUDA_VISIBLE_DEVICES`. For instance, setting `export CUDA_VISIBLE_DEVICES=1,2` will explicitly define the CUDA devices available for use. - -# Resources -The archiecture and methodology of SN1 is complex, and as such we have created a comprehensive resource to outline our design. Furthermore, we have strict requirements for how miners should interact with the network. Below are the currently available resources for additional information: - -1. [SN1 architecture details](docs/SN1_validation.md) -2. [StreamMiner requirements](docs/stream_miner_template.md) diff --git a/assets/miner.md b/assets/miner.md new file mode 100644 index 00000000..87fd0154 --- /dev/null +++ b/assets/miner.md @@ -0,0 +1,59 @@ +# **Miners** + +# ⚠️ **DISCLAIMER** ⚠️ **DO NOT RUN THIS MINER ON MAINNET!** + +> **The openai miner provided in this repo is _not intended_ to be run on mainnet!** +> +> **If you run the base miner on mainnet, you will not earn anything!** +> It is provided as an example to help you build your own custom mining operation! +> +## Compute Requirements + +| Resource | Requirement | +|---------------|-------------------| +| **VRAM** | None | +| **vCPU** | 8 vCPU | +| **RAM** | 8 GB | +| **Storage** | 80 GB | + +## Installation + +Clone this repository and run the [install.sh](./install.sh) script. + +```bash +git clone https://github.com/opentensor/prompting.git +cd prompting +bash install.sh +``` + +## Configuration +⚠️ **Reminder! Do not run this miner on main!** ⚠️ +Before running a miner, you will need to create a .env.miner environment file. It is necessary for you to provide the following + +```text +NETUID= #[1, 61, 102] +SUBTENSOR_NETWORK= #The network name [test, main, local] +SUBTENSOR_CHAIN_ENDPOINT= #The chain endpoint [test if running on test, main if running on main, custom endpoint if running on local] +WALLET_NAME= #Name of your wallet(coldkey) +HOTKEY= #Name of your hotkey associated with above wallet +AXON_PORT= #Number of the open tcp port +OPENAI_API_KEY= #The openai key that you would like to mine with +``` +## Testnet - RECOMMENDED +We highly recommend that you run your miners on testnet before deploying on main. This is give you an opportunity to debug your systems, and ensure that you will not lose valuable immunity time. The SN1 testnet is **netuid 61**. + +In order to run on testnet, you will need to go through the same hotkey registration proceure as on main, but using **testtao**. You will need to ask for some in the community discord if you do not have any. + +Then, simply set test=True in your .env file and execute all other steps as before. + +Then post in the Subnet 1 channel on discord so we can activate a validator for your miner to respond to. + +You can use wandb to see how successful your miner would be on mainnet, an example notebook is pinned in the channel. + +## Running + +After creating the above environment file, run + +```bash +pm2 start "poetry run python neurons/miners/openai/miner.py" +``` diff --git a/assets/validator.md b/assets/validator.md new file mode 100644 index 00000000..bc5e4936 --- /dev/null +++ b/assets/validator.md @@ -0,0 +1,50 @@ +# **VALIDATORS** + +## Compute Requirements + +| Resource | Requirement | +|---------------|-------------------| +| **VRAM** | 62 GB | +| **vCPU** | 24 vCPU | +| **RAM** | 60 GB | +| **Storage** | 150 GB | + +## Installation + +Clone this repository and run the [install.sh](./install.sh) script. + +```bash +git clone https://github.com/opentensor/prompting.git +cd prompting +bash install.sh +``` + +You will also need to log into huggingface and accept the License Agreement for the LMSYS-Chat-1M dataset: https://huggingface.co/datasets/lmsys/lmsys-chat-1m : +```shell +huggingface-cli login +``` + +## Configuration + +Before running a validator, you will need to create a .env.validator environment file. It is necessary for you to provide the following + +```text +NETUID= #[1, 61, 102] +SUBTENSOR_NETWORK= #The network name [test, main, local] +SUBTENSOR_CHAIN_ENDPOINT= #The chain endpoint [test if running on test, main if running on main, custom endpoint if running on local] +WALLET_NAME= #Name of your wallet(coldkey) +HOTKEY= #Name of your hotkey associated with above wallet +AXON_PORT= #Number of the open tcp port +HF_TOKEN= #Access token from Hugging Face where you accepted the License Agreement for lmsys +``` + +## Running + +After creating the above environment file, run + +```bash +bash run.sh +``` +It will spawn 2 pm2 processes, one to run the validator and one to autoupdate. + +> Note: this is not an end solution, major releases or changes in requirements will still require you to manually restart the processes. Regularly monitor the health of your validator to ensure optimal performance. diff --git a/install.sh b/install.sh index 431a3b8d..e6c01cd0 100644 --- a/install.sh +++ b/install.sh @@ -1,19 +1,34 @@ #!/bin/bash -# Uninstalling mathgenerator -pip uninstall mathgenerator -y +# Install poetry +pip install poetry -# Installing package from the current directory -pip install -e . +# Set the destination of the virtual environment to the project directory +poetry config virtualenvs.in-project true -# Uninstall uvloop -pip uninstall uvloop -y +# Install the project dependencies +poetry install + +# uninstall uvloop which breaks the system +poetry run pip uninstall -y uvloop # Updating the package list and installing jq and npm apt update && apt install -y jq npm -# Installing PM2 globally -npm install pm2 -g +# Check if jq is installed and install it if not +if ! command -v jq &> /dev/null +then + apt update && apt install -y jq +fi + +# Check if npm is installed and install it if not +if ! command -v npm &> /dev/null +then + apt update && apt install -y npm +fi -# Updating PM2 -pm2 update +# Check if pm2 is installed and install it if not +if ! command -v pm2 &> /dev/null +then + npm install pm2 -g +fi diff --git a/neurons/forward.py b/neurons/forward.py new file mode 100644 index 00000000..d9481ca2 --- /dev/null +++ b/neurons/forward.py @@ -0,0 +1,110 @@ +import time +import asyncio +import traceback +from typing import List, Dict, Awaitable +from prompting.base.dendrite import SynapseStreamResult +from prompting.base.protocol import StreamPromptingSynapse +from prompting.utils.misc import async_log, serialize_exception_to_string +from transformers import PreTrainedTokenizerFast as Tokenizer +from prompting.tasks.base_task import BaseTask +from prompting.llms.base_llm import BasePipeline +from loguru import logger + + +@async_log +async def execute_dendrite_call(dendrite_call): + responses = await dendrite_call + return responses + + +async def process_stream(uid: int, async_iterator: Awaitable, tokenizer: Tokenizer) -> SynapseStreamResult: + """Process a single response asynchronously.""" + synapse = None # Initialize chunk with a default value + exception = None + accumulated_chunks = [] + accumulated_chunks_timings = [] + accumulated_tokens_per_chunk = [] + start_time = time.time() + + try: + async for chunk in async_iterator: # most important loop, as this is where we acquire the final synapse. + if isinstance(chunk, str): + accumulated_chunks.append(chunk) + accumulated_chunks_timings.append(time.time() - start_time) + + tokens_in_chunk = len(tokenizer.tokenize(chunk)) + accumulated_tokens_per_chunk.append(tokens_in_chunk) + + logger.debug(f"\nchunk for uid {uid}: {chunk}") + + # Assuming last chunk of async_iterator holds the last value yielded as a StreamingSynapse + synapse = chunk + if synapse is None or not isinstance(synapse, StreamPromptingSynapse): + raise ValueError(f"Something went wrong with miner uid {uid}, Synapse is not StreamPromptingSynapse.") + except Exception as e: + exception = e + traceback_details = traceback.format_exc() + logger.error(f"Error in generating reference or handling responses for uid {uid}: {e}\n{traceback_details}") + + failed_synapse = StreamPromptingSynapse(roles=["user"], messages=["failure"], completion="") + + synapse = failed_synapse + finally: + return SynapseStreamResult( + accumulated_chunks=accumulated_chunks, + accumulated_chunks_timings=accumulated_chunks_timings, + tokens_per_chunk=accumulated_tokens_per_chunk, + synapse=synapse, + uid=uid, + exception=exception, + ) + + +@async_log +async def handle_response(stream_results_dict: Dict[int, Awaitable], tokenizer: Tokenizer) -> List[SynapseStreamResult]: + """The handle_response function is responsible for creating asyncio tasks around acquiring streamed miner chunks + and processing them asynchronously. It then pairs the results with their original UIDs and returns a list of StreamResults. + + Args: + responses (Dict[int, Awaitable]): Responses contains awaitables that are used to acquire streamed miner chunks. + + Raises: + ValueError + + Returns: + List[StreamResult]: DataClass containing the synapse, exception, and uid + """ + tasks_with_uid = [ + (uid, stream_results_dict[uid]) for uid, _ in stream_results_dict.items() + ] # Pair UIDs with their tasks + + # Start tasks, preserving order and their associated UIDs + process_stream_tasks = [process_stream(uid, resp, tokenizer) for uid, resp in tasks_with_uid] + processed_stream_results = await asyncio.gather(*process_stream_tasks, return_exceptions=True) + + return processed_stream_results + + +@async_log +async def generate_reference(task: BaseTask, pipeline: BasePipeline) -> str: + loop = asyncio.get_running_loop() + result = await loop.run_in_executor(None, task.generate_reference, pipeline) + return result + + +def log_stream_results(stream_results: List[SynapseStreamResult]): + failed_responses = [response for response in stream_results if response.exception is not None] + empty_responses = [ + response for response in stream_results if response.exception is None and response.synapse.completion == "" + ] + non_empty_responses = [ + response for response in stream_results if response.exception is None and response.synapse.completion != "" + ] + + logger.info(f"Total of non_empty responses: ({len(non_empty_responses)})") + logger.info(f"Total of empty responses: ({len(empty_responses)})") + logger.info(f"Total of failed responses: ({len(failed_responses)}):\n {failed_responses}") + + for failed_response in failed_responses: + formatted_exception = serialize_exception_to_string(failed_response.exception) + logger.error(f"Failed response for uid {failed_response.uid}: {formatted_exception}") diff --git a/neurons/miners/huggingface/README.md b/neurons/miners/huggingface/README.md deleted file mode 100644 index 2bf4602a..00000000 --- a/neurons/miners/huggingface/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Hugging Face Bittensor Miner -This repository contains a Bittensor Miner integrated with 🤗 Hugging Face pipelines. The miner connects to the Bittensor network, registers its wallet, and serves a hugging face model to the network. - -## Prerequisites - -- Python 3.8+ -- OpenAI Python API (https://github.com/openai/openai) - -## Installation -1. Clone the repository -```bash -git clone https://github.com/opentensor/prompting.git -``` -2. Install the required packages for the [repository requirements](../../../requirements.txt) with `pip install -r requirements.txt` - - -For more configuration options related to the wallet, axon, subtensor, logging, and metagraph, please refer to the Bittensor documentation. - -## Example Usage - -Here are some model examples that could be leveraged by the HuggingFace Miner, alongside suggested GPU footprint to run the models comfortably: -| model_id | Default GPU footprint | 8bits quantization GPU footprint | 4bits quantization GPU footprint | -| --- | ---- | ---- | ---- | -| HuggingFaceH4/zephyr-7b-beta | 18 GB | 12 GB | 7 GB | -| teknium/OpenHermes-2.5-Mistral-7B | 30 GB | 10 GB | 7 GB | -| upstage/SOLAR-10.7B-Instruct-v1.0 | 42 GB | 14 GB| 8 GB | -| mistralai/Mixtral-8x7B-Instruct-v0.1 | 92 GB* | 64 GB* | 30 GB* | - -> \* Big models such as mixtral are very costly to run and optimize, so always bear in mind the trade-offs between model speed, model quality and infra cost. - - -To run the Hugging Face Bittensor Miner with default settings, use the following command: -```bash -python3 neurons/miners/huggingface/miner.py \ - --wallet.name <> \ - --wallet.hotkey <> - --neuron.model_id <> -``` - -You can also run automatic quantization by adding the flag `--neuron.load_in_8bit` for 8bits quantization and `--neuron.load_in_4bit` for 4 bits quantization: -```bash -python3 neurons/miners/huggingface/miner.py \ - --wallet.name <> \ - --wallet.hotkey <> - --neuron.model_id <> - --neuron.load_in_8bit True -``` \ No newline at end of file diff --git a/neurons/miners/huggingface/miner.py b/neurons/miners/huggingface/miner.py deleted file mode 100644 index 6c33730d..00000000 --- a/neurons/miners/huggingface/miner.py +++ /dev/null @@ -1,36 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import time -import bittensor as bt -from prompting.miners import HuggingFaceMiner -from deprecated import deprecated - - -@deprecated(version="2.4.1+", reason="Class is deprecated, use openai miner for reference on example miner.") -def main(): - with HuggingFaceMiner() as miner: - while True: - miner.log_status() - time.sleep(5) - - if miner.should_exit: - bt.logging.warning("Ending miner...") - break - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/neurons/miners/openai/README.md b/neurons/miners/openai/README.md index 421bc819..b6096567 100644 --- a/neurons/miners/openai/README.md +++ b/neurons/miners/openai/README.md @@ -1,43 +1,50 @@ # OpenAI Bittensor Miner -This repository contains a Bittensor Miner that uses langchain and OpenAI's model as its synapse. The miner connects to the Bittensor network, registers its wallet, and serves the GPT model to the network. + +This repository contains a Bittensor Miner that uses LangChain and OpenAI's model as its synapse. The miner connects to the Bittensor network, registers its wallet, and serves the GPT model to the network. ## Prerequisites -- Python 3.8+ -- OpenAI Python API (https://github.com/openai/openai) +- OpenAI API Key (if you would like to run the OpenAI demo miner) +- Python and pip installed ## Installation -1. Clone the repository -```bash -git clone https://github.com/opentensor/prompting.git -``` - -2. Install the required packages for the [repository requirements](../../../requirements.txt) with `pip install -r requirements.txt` -3. Install the required packages for the [openai miner](requirements.txt) with `pip install -r requirements.txt` -3. Ensure that you have a `.env` file with your `OPENAI_API` key -```.env -echo OPENAI_API_KEY=YOUR-KEY > .env -``` - -For more configuration options related to the wallet, axon, subtensor, logging, and metagraph, please refer to the Bittensor documentation. - -## Example Usage - -To run the OpenAI Bittensor Miner with default settings, use the following command: - -```bash -python3 neurons/miners/openai/miner.py \ - --wallet.name <> \ - --wallet.hotkey <> -``` - -You can easily change some key parameters at the CLI, e.g.: -```bash -python3 neurons/miners/openai/miner.py \ - --wallet.name <> \ - --wallet.hotkey <> - --neuron.model_id gpt-4-1106-preview # default value is gpt3.5 turbo - --neuron.max_tokens 1024 # default value is 256 - --neuron.temperature 0.9 # default value is 0.7 -``` \ No newline at end of file +1. **Clone the repository**: + + ```bash + git clone https://github.com/opentensor/prompting.git + ``` + +2. **Install all Python packages**: + + ```bash + bash install.sh + ``` + +3. You then need to activate the virtual environment (managed by poetry) by running + ```bash + poetry shell + ``` + +4. **Set up your .env file with your OpenAI API key**: + + ```bash + echo OPENAI_API_KEY=YOUR-KEY > .env + ``` + +5. **Set up your wallet(s)**: + - The `run_miner.sh` and `run_validator.sh` scripts assume your wallets are called `miner` and `validator` with the hotkeys `miner_hotkey` and `validator_hotkey` respectively. You may modify these files to match your wallet names. + - Once your wallets are set up and registered to the testnet (see [Bittensor documentation](https://docs.bittensor.com/) for how to do this), you can execute the validator/miner using the `run_miner.sh` and `run_validator.sh` scripts. + +6. **Query the miner**: + - If you have a miner running, you can use the `client.py` file to query your miner and get responses: + + ```bash + python client.py + ``` + +For more configuration options related to the wallet, axon, subtensor, logging, and metagraph, please refer to the [Bittensor documentation](https://docs.bittensor.com/). + +--- + +Feel free to reach out if you have any questions or need further assistance. You can reach us through the [bittensor discord](https://discord.gg/UqAxyhrf) (subnet 1 channel) or via email (felix.quinque(at)macrocosmos.ai) \ No newline at end of file diff --git a/neurons/miners/openai/miner.py b/neurons/miners/openai/miner.py index e8e5a254..9bc970b7 100644 --- a/neurons/miners/openai/miner.py +++ b/neurons/miners/openai/miner.py @@ -1,30 +1,157 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. +# ruff: noqa: E402 +from prompting import settings + +settings.settings = settings.Settings(mode="miner") +settings = settings.settings import time -import bittensor as bt -from prompting.miners import OpenAIMiner +from functools import partial +from openai import OpenAI +from loguru import logger +from pydantic import model_validator +from prompting.base.miner import BaseStreamMinerNeuron +from prompting.base.protocol import StreamPromptingSynapse +from neurons.miners.openai.utils import OpenAIUtils +from starlette.types import Send +from prompting.utils.logging import ErrorEvent, log_event + +MODEL_ID: str = "gpt-3.5-turbo" +NEURON_MAX_TOKENS: int = 256 +NEURON_TEMPERATURE: float = 0.7 +NEURON_TOP_K: int = 50 +NEURON_TOP_P: float = 0.95 +NEURON_STREAMING_BATCH_SIZE: int = 12 +NEURON_STOP_ON_FORWARD_EXCEPTION: bool = False + +SYSTEM_PROMPT = """You are a helpful agent that does it's best to answer all questions!""" + + +class OpenAIMiner(BaseStreamMinerNeuron, OpenAIUtils): + """Langchain-based miner using OpenAI's API as the LLM. + This miner relies entirely on the models' own representation and world model. + """ + + model: OpenAI | None = None + accumulated_total_tokens: int = 0 + accumulated_prompt_tokens: int = 0 + accumulated_completion_tokens: int = 0 + accumulated_total_cost: float = 0 + should_exit: bool = False + + @model_validator(mode="after") + def init_openai(self) -> "OpenAIMiner": + self.model = OpenAI(api_key=settings.OPENAI_API_KEY) + return self + + def forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: + async def _forward( + self: "OpenAIMiner", + synapse: StreamPromptingSynapse, + timeout_threshold: float, + send: Send, + ): + buffer = [] + accumulated_chunks = [] + accumulated_chunks_timings = [] + messages = [] + temp_completion = "" # for wandb logging + timeout_reached = False + + try: + system_prompt_message = [{"role": "system", "content": SYSTEM_PROMPT}] + synapse_messages = [ + {"role": role, "content": message} for role, message in zip(synapse.roles, synapse.messages) + ] + + messages = system_prompt_message + synapse_messages + + start_time = time.time() + stream_response = self.model.chat.completions.create( + model=MODEL_ID, + messages=messages, + max_tokens=NEURON_MAX_TOKENS, + stream=True, + ) + + for chunk in stream_response: + chunk_content = chunk.choices[0].delta.content + + if chunk_content is None: + logger.info("OpenAI returned chunk content with None") + continue + + accumulated_chunks.append(chunk_content) + accumulated_chunks_timings.append(time.time() - start_time) + + buffer.append(chunk_content) + + if time.time() - start_time > timeout_threshold: + logger.debug("⏰ Timeout reached, stopping streaming") + timeout_reached = True + break + + if len(buffer) == NEURON_STREAMING_BATCH_SIZE: + joined_buffer = "".join(buffer) + temp_completion += joined_buffer + logger.debug(f"Streamed tokens: {joined_buffer}") + + await send( + { + "type": "http.response.body", + "body": joined_buffer.encode("utf-8"), + "more_body": True, + } + ) + buffer = [] + + if not buffer or timeout_reached: + return + + joined_buffer = "".join(buffer) + await send( + { + "type": "http.response.body", + "body": joined_buffer.encode("utf-8"), + "more_body": False, + } + ) + + except Exception as e: + logger.exception(e) + logger.error(f"Error in forward: {e}") + log_event(ErrorEvent(error=str(e))) + if NEURON_STOP_ON_FORWARD_EXCEPTION: + self.should_exit = True + + finally: + synapse_latency = time.time() - start_time + self.log_event( + synapse=synapse, + timing=synapse_latency, + messages=messages, + accumulated_chunks=accumulated_chunks, + accumulated_chunks_timings=accumulated_chunks_timings, + ) + + logger.debug( + f"📧 Message received from {synapse.dendrite.hotkey}, IP: {synapse.dendrite.ip}; \nForwarding synapse: {synapse}" + ) + + timeout_threshold = synapse.timeout + + token_streamer = partial( + _forward, + self, + synapse, + timeout_threshold, + ) + + streaming_response = synapse.create_streaming_response(token_streamer) + return streaming_response + -# This is the main function, which runs the miner. if __name__ == "__main__": with OpenAIMiner() as miner: - while True: + while not miner.should_exit: miner.log_status() time.sleep(5) - - if miner.should_exit: - bt.logging.warning("Ending miner...") - break + logger.warning("Ending miner...") diff --git a/prompting/miners/utils.py b/neurons/miners/openai/utils.py similarity index 74% rename from prompting/miners/utils.py rename to neurons/miners/openai/utils.py index 3c30b62e..d803e10d 100644 --- a/prompting/miners/utils.py +++ b/neurons/miners/openai/utils.py @@ -1,4 +1,4 @@ -import bittensor as bt +from loguru import logger class OpenAIUtils: @@ -6,10 +6,10 @@ def __init__(self) -> None: pass def get_cost_logging(self, cb): - bt.logging.info(f"Total Tokens: {cb.total_tokens}") - bt.logging.info(f"Prompt Tokens: {cb.prompt_tokens}") - bt.logging.info(f"Completion Tokens: {cb.completion_tokens}") - bt.logging.info(f"Total Cost (USD): ${round(cb.total_cost,4)}") + logger.info(f"Total Tokens: {cb.total_tokens}") + logger.info(f"Prompt Tokens: {cb.prompt_tokens}") + logger.info(f"Completion Tokens: {cb.completion_tokens}") + logger.info(f"Total Cost (USD): ${round(cb.total_cost,4)}") self.accumulated_total_tokens += cb.total_tokens self.accumulated_prompt_tokens += cb.prompt_tokens diff --git a/neurons/miners/test/echo.py b/neurons/miners/test/echo.py index 697dd9f5..194c0a78 100644 --- a/neurons/miners/test/echo.py +++ b/neurons/miners/test/echo.py @@ -1,25 +1,42 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. import time -import bittensor as bt -from prompting.miners import EchoMiner +import typing +from functools import partial +from starlette.types import Send + +from prompting.base.protocol import StreamPromptingSynapse + +# import base miner class which takes care of most of the boilerplate +from prompting.base.prompting_miner import BaseStreamPromptingMiner + + +class EchoMiner(BaseStreamPromptingMiner): + """ + This little fella just repeats the last message it received. + """ + + def __init__(self, config=None): + super().__init__(config=config) + + def forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: + async def _forward(message: str, send: Send): + await send( + { + "type": "http.response.body", + "body": message, + "more_body": False, + } + ) + + token_streamer = partial(_forward, synapse.messages[-1]) + return synapse.create_streaming_response(token_streamer) + + async def blacklist(self, synapse: StreamPromptingSynapse) -> typing.Tuple[bool, str]: + return False, "All good here" + + async def priority(self, synapse: StreamPromptingSynapse) -> float: + return 1e6 -# This is the main function, which runs the miner. if __name__ == "__main__": with EchoMiner() as miner: while True: diff --git a/neurons/miners/test/mock.py b/neurons/miners/test/mock.py index 6e2d6716..bcc2e86c 100644 --- a/neurons/miners/test/mock.py +++ b/neurons/miners/test/mock.py @@ -1,22 +1,42 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. import time -import bittensor as bt -from prompting.miners import MockMiner +from prompting.settings import settings +import typing +from functools import partial +from starlette.types import Send + +from prompting.base.protocol import StreamPromptingSynapse + +# import base miner class which takes care of most of the boilerplate +from prompting.base.prompting_miner import BaseStreamPromptingMiner + + +class MockMiner(BaseStreamPromptingMiner): + """ + This little fella responds with a static message. + """ + + def __init__(self, config=None): + super().__init__(config=config) + + def forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: + async def _forward(message: str, send: Send): + await send( + { + "type": "http.response.body", + "body": message, + "more_body": False, + } + ) + + message = f"Hey you reached mock miner {settings.HOTKEY}. Please leave a message after the tone.. Beep!" + token_streamer = partial(_forward, message) + return synapse.create_streaming_response(token_streamer) + + async def blacklist(self, synapse: StreamPromptingSynapse) -> typing.Tuple[bool, str]: + return False, "All good here" + + async def priority(self, synapse: StreamPromptingSynapse) -> float: + return 1e6 # This is the main function, which runs the miner. diff --git a/neurons/miners/test/phrase.py b/neurons/miners/test/phrase.py index a3c92984..9b5a7551 100644 --- a/neurons/miners/test/phrase.py +++ b/neurons/miners/test/phrase.py @@ -1,22 +1,41 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. import time -import bittensor as bt -from prompting.miners import PhraseMiner +import typing +from functools import partial +from starlette.types import Send + +# Bittensor Miner Template: +from prompting.base.protocol import StreamPromptingSynapse + +# import base miner class which takes care of most of the boilerplate +from prompting.base.prompting_miner import BaseStreamPromptingMiner + + +class PhraseMiner(BaseStreamPromptingMiner): + """ + This little fella responds with whatever phrase you give it. + """ + + def __init__(self, config=None): + super().__init__(config=config) + + def forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: + async def _forward(message: str, send: Send): + await send( + { + "type": "http.response.body", + "body": message, + "more_body": False, + } + ) + + token_streamer = partial(_forward, "This is the phrase I'm saying!") + return synapse.create_streaming_response(token_streamer) + + async def blacklist(self, synapse: StreamPromptingSynapse) -> typing.Tuple[bool, str]: + return False, "All good here" + + async def priority(self, synapse: StreamPromptingSynapse) -> float: + return 1e6 # This is the main function, which runs the miner. diff --git a/neurons/validator.py b/neurons/validator.py index 62c01d40..795d7990 100644 --- a/neurons/validator.py +++ b/neurons/validator.py @@ -1,33 +1,263 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. +# ruff: noqa: E402 +import asyncio import time -import bittensor as bt -from prompting.validator import Validator +from typing import Optional + +import numpy as np + +from prompting import settings + +settings.settings = settings.Settings(mode="validator") +settings = settings.settings + +import huggingface_hub +from loguru import logger + +from neurons.forward import handle_response, log_stream_results +from prompting.base.dendrite import DendriteResponseEvent, StreamPromptingSynapse +from prompting.base.validator import BaseValidatorNeuron +from prompting.datasets.base import BaseDataset +from prompting.llms.vllm_llm import vLLMPipeline +from prompting.tasks.base_task import BaseTask +from prompting.tasks.task_registry import TaskRegistry +from prompting.utils.logging import ErrorEvent, ValidatorEvent, log_event +from prompting.utils.uids import get_random_uids + +try: + from organic_scoring.synth_dataset import SynthDatasetConversation + + from prompting.organic.organic_scoring_prompting import OrganicScoringPrompting +except ImportError: + raise ImportError( + "Could not import organic-scoring library. Please install via poetry: `poetry install --extras 'validator'`" + ) + +NEURON_SAMPLE_SIZE = 100 + + +class Validator(BaseValidatorNeuron): + """ + Text prompt validator neuron. + """ + + def __init__(self, config=None): + super(Validator, self).__init__(config=config) + logger.info("load_state()") + self.load_state() + self._lock = asyncio.Lock() + + self.llm_pipeline = vLLMPipeline( + llm_model_id=settings.NEURON_MODEL_ID_VALIDATOR, + llm_max_allowed_memory_in_gb=settings.NEURON_LLM_MAX_ALLOWED_MEMORY_IN_GB, + llm_max_model_len=settings.LLM_MAX_MODEL_LEN, + gpus=settings.NEURON_GPUS, + device=self.device, + mock=settings.MOCK, + ) + + if self.axon is None or settings.ORGANIC_DISABLED: + logger.warning( + "Organic scoring is not enabled. To enable, remove '--neuron.axon_off' and '--neuron.organic_disabled'" + ) + return + + huggingface_hub.login(settings.HF_TOKEN) + dataset = SynthDatasetConversation() + if dataset.exception is not None: + logger.error( + "Organic scoring on synthetic data is disabled. Failed to load HF dataset.\nMake sure to:\n" + "1. Accept License on: https://huggingface.co/datasets/lmsys/lmsys-chat-1m\n" + "2. Create HF Access Token: https://huggingface.co/settings/tokens\n" + "3. Set Access Token 'HF_TOKEN' in .env.validator\n" + ) + dataset = None + + self._organic_scoring = OrganicScoringPrompting( + axon=self.axon, + synth_dataset=dataset, + llm_pipeline=self.llm_pipeline, + tokenizer=self.llm_pipeline.tokenizer, + update_scores_fn=self.update_scores, + get_random_uids_fn=lambda: get_random_uids(self, k=settings.ORGANIC_SAMPLE_SIZE, exclude=[]), + get_step_fn=lambda: self.step, + get_block_fn=lambda: self.block, + ) + if self._organic_scoring is not None: + self.loop.create_task(self._organic_scoring.start_loop()) + + async def run_step( + self, task: BaseTask, dataset: BaseDataset, k: int, timeout: float, exclude: Optional[list] = None + ) -> ValidatorEvent | ErrorEvent | None: + """Executes a single step of the agent, which consists of: + - Getting a list of uids to query + - Querying the network + - Rewarding the network + - Updating the scores + - Logging the event + Args: + agent (HumanAgent): The agent to run the step for. + roles (List[str]): The roles for the synapse. + messages (List[str]): The messages for the synapse. + k (int): The number of uids to query. + timeout (float): The timeout for the queries. + exclude (list, optional): The list of uids to exclude from the query. Defaults to []. + """ + try: + logger.debug("run_step", task.__class__.__name__) + if not (dataset_entry := dataset.random()): + logger.warning(f"Dataset {dataset.__class__.__name__} returned None. Skipping step.") + return None + # Generate the query and reference for the task + query, reference = task.generate_query_reference(self.llm_pipeline, dataset_entry) + # task.generate_reference(self.llm_pipeline) + + # Record event start time. + start_time = time.time() + + # Get the list of uids to query for this step. + uids = get_random_uids(self, k=k, exclude=exclude or []) + + axons = [settings.METAGRAPH.axons[uid] for uid in uids] + + # Directly call dendrite and process responses in parallel + streams_responses = await self.dendrite( + axons=axons, + synapse=StreamPromptingSynapse(roles=["user"], messages=[query]), + timeout=timeout, + deserialize=False, + streaming=True, + ) + + # Prepare the task for handling stream responses + stream_results = await handle_response( + stream_results_dict=dict(zip(uids, streams_responses)), tokenizer=self.llm_pipeline.tokenizer + ) + + log_stream_results(stream_results) + + # Encapsulate the responses in a response event (dataclass) + response_event = DendriteResponseEvent(stream_results=stream_results, uids=uids, timeout=timeout) + + logger.info(f"Created DendriteResponseEvent:\n {response_event}") + + # Reward the responses and get the reward result (dataclass) + # This contains a list of RewardEvents but can be exported as a dict (column-wise) for logging etc + reward_pipeline = TaskRegistry.get_task_reward(task) + reward_events, penalty_events, rewards = reward_pipeline.apply( + response_event=response_event, reference=reference, challenge=query + ) + + logger.info(f"Created RewardResult:\n {rewards}") + + best_response = response_event.completions[np.argmax(rewards)] + + self.update_scores(rewards, uids) + + # Log the step event. + return ValidatorEvent( + best=best_response or "", + block=self.block, + step=self.step, + step_time=time.time() - start_time, + reward_events=reward_events or [], + penalty_events=penalty_events or [], + reference=reference, + challenge=query, + task=task.name, + rewards=rewards, + response_event=response_event, + ) + except Exception as ex: + logger.exception(ex) + return ErrorEvent( + error=str(ex), + ) + + async def forward(self): + """ + Encapsulates a full conversation between the validator and miners. Contains one or more rounds of request-response. + + """ + logger.info("🚀 Starting forward loop...") + forward_start_time = time.time() + + while True: + logger.info(f"📋 Selecting task... from {TaskRegistry.task_configs}") + task_config = TaskRegistry.random() + logger.info(f"📋 Creating {task_config.task.__name__} task... ") + try: + task, dataset = TaskRegistry.create_random_task_with_dataset() + break + except Exception as ex: + logger.exception(ex) + + exclude_uids = [] + + # when run_step is called, the agent updates its progress + async with self._lock: + event = await self.run_step( + task=task, + dataset=dataset, + k=NEURON_SAMPLE_SIZE, + timeout=settings.NEURON_TIMEOUT, + exclude=exclude_uids, + ) + + # Adds forward time to event and logs it to wandb + if not event: + return + + event.forward_time = time.time() - forward_start_time + log_event(event) + + # accepted_answer = event["best"] if random.random() < 0.5 else agent.task.reference + + def __enter__(self): + if settings.NO_BACKGROUND_THREAD: + logger.warning("Running validator in main thread.") + self.run() + else: + self.run_in_background_thread() + + return self + + def __exit__(self, exc_type, exc_value, traceback): + """ + Stops the validator's background operations upon exiting the context. + This method facilitates the use of the validator in a 'with' statement. + + Args: + exc_type: The type of the exception that caused the context to be exited. + None if the context was exited without an exception. + exc_value: The instance of the exception that caused the context to be exited. + None if the context was exited without an exception. + traceback: A traceback object encoding the stack trace. + None if the context was exited without an exception. + """ + if self.is_running: + logger.debug("Stopping validator in background thread.") + self.should_exit = True + self.thread.join(5) + self.is_running = False + logger.debug("Stopped") # The main function parses the configuration and runs the validator. if __name__ == "__main__": with Validator() as v: while True: - bt.logging.info( - f"Validator running:: network: {v.subtensor.network} | block: {v.block} | step: {v.step} | uid: {v.uid} | last updated: {v.block-v.metagraph.last_update[v.uid]} | vtrust: {v.metagraph.validator_trust[v.uid]:.3f} | emission {v.metagraph.emission[v.uid]:.3f}" + logger.info( + f"Validator running:: network: {settings.SUBTENSOR.network} " + f"| block: {v.block} " + f"| step: {v.step} " + f"| uid: {v.uid} " + f"| last updated: {v.block - settings.METAGRAPH.last_update[v.uid]} " + f"| vtrust: {settings.METAGRAPH.validator_trust[v.uid]:.3f} " + f"| emission {settings.METAGRAPH.emission[v.uid]:.3f}" ) time.sleep(5) if v.should_exit: - bt.logging.warning("Ending validator...") + logger.warning("Ending validator...") + logger.warning("Ending validator...") break diff --git a/notebooks/datasets.ipynb b/notebooks/datasets.ipynb new file mode 100644 index 00000000..fb9c5411 --- /dev/null +++ b/notebooks/datasets.ipynb @@ -0,0 +1,85 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:201: UserWarning: Field name \"required_hash_fields\" in \"StreamPromptingSynapse\" shadows an attribute in parent \"StreamingSynapse\"\n", + " warnings.warn(\n", + "/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:201: UserWarning: Field name \"name\" in \"WikiDateDataset\" shadows an attribute in parent \"Dataset\"\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "from prompting.datasets.wiki import WikiDataset, WikiDateDataset" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "title='Ninja Assault' topic='Plot' subtopic='Plot' content='Plot' internal_links=['Gameplay', 'Plot', 'Release', 'Reception'] external_links=['GunCon 2', 'Namco', 'PlayStation 2', 'Sega', 'Arcade game', 'Sega NAOMI', 'Bandai Namco Entertainment', 'Cooperative video game', 'Multiplayer video game', 'Steel Gunner 2'] source='Wikipedia' tags=['2000 video games', 'Arcade video games', 'Cooperative video games', 'Light gun games', 'Multiplayer and single-player video games', 'Namco games', 'Now Production games', 'PlayStation 2 games', 'Rail shooters', 'Video games about ninja', 'Video games developed in Japan', 'Video games featuring female protagonists', 'Video games set in feudal Japan'] extra={'url': 'https://en.wikipedia.org/wiki/Ninja_Assault', 'page_length': 343, 'section_length': 85} stats=None\n" + ] + } + ], + "source": [ + "dataset = WikiDataset()\n", + "random_entry = dataset.random()\n", + "print(random_entry)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "dataset = WikiDateDataset()\n", + "random_entry = dataset.random()\n", + "print(random_entry)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "prompting-fb5sw-i7-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/demo.ipynb b/notebooks/demo.ipynb new file mode 100644 index 00000000..7c777025 --- /dev/null +++ b/notebooks/demo.ipynb @@ -0,0 +1,429 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## LLM Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "2024-08-02 17:52:11,868\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO 08-02 17:52:12 awq_marlin.py:77] The model is convertible to awq_marlin during runtime. Using awq_marlin kernel.\n", + "INFO 08-02 17:52:12 llm_engine.py:176] Initializing an LLM engine (v0.5.3.post1) with config: model='casperhansen/llama-3-8b-instruct-awq', speculative_config=None, tokenizer='casperhansen/llama-3-8b-instruct-awq', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, rope_scaling=None, rope_theta=None, tokenizer_revision=None, trust_remote_code=False, dtype=torch.float16, max_seq_len=8192, download_dir=None, load_format=LoadFormat.AUTO, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=False, quantization=awq_marlin, enforce_eager=True, kv_cache_dtype=auto, quantization_param_path=None, device_config=cuda, decoding_config=DecodingConfig(guided_decoding_backend='outlines'), observability_config=ObservabilityConfig(otlp_traces_endpoint=None), seed=0, served_model_name=casperhansen/llama-3-8b-instruct-awq, use_v2_block_manager=False, enable_prefix_caching=False)\n", + "INFO 08-02 17:52:12 model_runner.py:680] Starting to load model casperhansen/llama-3-8b-instruct-awq...\n", + "INFO 08-02 17:52:13 weight_utils.py:223] Using model weights format ['*.safetensors']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading safetensors checkpoint shards: 0% Completed | 0/2 [00:00<|start_header_id|>presenter<|end_header_id|>\n", + "\n", + "{{ Answer the question you will receive in detail, utilizing the following context.\n", + "\n", + "# Context:\n", + "\n", + "History\n", + "\n", + "# Question:\n", + "\n", + "None\n", + "\n", + " }}<|eot_id|><|start_header_id|>active<|end_header_id|>\n", + "\n", + "{{ Answer the question you will receive in detail, utilizing the following context.\n", + "\n", + "# Context:\n", + "\n", + "History\n", + "\n", + "# Question:\n", + "\n", + "None\n", + "\n", + " }}<|eot_id|><|start_header_id|>active<|end_header_id|>\n", + "\n", + "{{ Answer the question you will receive in detail, utilizing the following context.\n", + "\n", + "# Context:\n", + "\n", + "History\n", + "\n", + "# Question:\n", + "\n", + "None\n", + "\n", + " }}<|eot_id|><|start_header_id|>active<|end_header_id|>\n", + "\n", + "{{ Answer the question you\n" + ] + } + ], + "source": [ + "print(qa_task.reference)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[TaskConfig(), TaskConfig()]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "TaskRegistry.tasks" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "prompting-fb5sw-i7-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/testing.ipynb b/notebooks/testing.ipynb new file mode 100644 index 00000000..dac4d347 --- /dev/null +++ b/notebooks/testing.ipynb @@ -0,0 +1,912 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Failed to detect the name of this notebook, you can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving.\n", + "wandb: Currently logged in as: felix-quinque-macrocosmos (felix-quinque-macrocosmos-ai). Use `wandb login --relogin` to force relogin\n", + "wandb: WARNING If you're specifying your api key in code, ensure this code is not shared publicly.\n", + "wandb: WARNING Consider setting the WANDB_API_KEY environment variable, or running `wandb login` from the command line.\n", + "wandb: Appending key for api.wandb.ai to your netrc file: /root/.netrc\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[34m\u001b[1mwandb\u001b[0m: \u001b[33mWARNING\u001b[0m Calling wandb.login() after wandb.init() has no effect.\n" + ] + }, + { + "data": { + "text/html": [ + "Finishing last run (ID:i9c3xh04) before initializing another..." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run dulcet-water-449 at: https://wandb.ai/macrocosmos/prompting-validators/runs/i9c3xh04
View project at: https://wandb.ai/macrocosmos/prompting-validators
Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20240808_152723-i9c3xh04/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "The new W&B backend becomes opt-out in version 0.18.0; try it out with `wandb.require(\"core\")`! See https://wandb.me/wandb-core for more information." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Successfully finished last run (ID:i9c3xh04). Initializing new run:
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "wandb version 0.17.6 is available! To upgrade, please run:\n", + " $ pip install wandb --upgrade" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.17.5" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /workspace/prompting/notebooks/wandb/run-20240808_152918-pd83p69r" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run super-wildflower-1 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/felix-quinque-macrocosmos-ai/validators" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/felix-quinque-macrocosmos-ai/validators/runs/pd83p69r" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import wandb\n", + "\n", + "wandb.login(relogin=True, key=\"ae29a588c238d0e168d620e0b18a5e29e283935a\")\n", + "wandb.init(\n", + " project=\"validators\",\n", + " entity=\"felix-quinque-macrocosmos-ai\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "wandb: Currently logged in as: felix-quinque-macrocosmos. Use `wandb login --relogin` to force relogin\n", + "wandb: ERROR Error while calling W&B API: permission denied ()\n" + ] + }, + { + "data": { + "text/html": [ + "
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮\n",
+       " in <module>:1                                                                                    \n",
+       "                                                                                                  \n",
+       " 1 WANDB = wandb.init(                                                                          \n",
+       "   2 │   │   project=\"validator\",                                                                 \n",
+       "   3 │   │   entity=\"felix-quinque-macrocosmos\"                                                   \n",
+       "   4 )                                                                                        \n",
+       "                                                                                                  \n",
+       " /root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/s \n",
+       " dk/wandb_init.py:1195 in init                                                                    \n",
+       "                                                                                                  \n",
+       "   1192 │   │                                                                                     \n",
+       "   1193 │   │   # Need to build delay into this sentry capture because our exit hooks             \n",
+       "   1194 │   │   # mess with sentry's ability to send out errors before the program ends.          \n",
+       " 1195 │   │   wandb._sentry.reraise(e)                                                          \n",
+       "   1196 │   │   raise AssertionError()  # unreachable                                             \n",
+       "   1197                                                                                           \n",
+       "                                                                                                  \n",
+       " /root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/a \n",
+       " nalytics/sentry.py:155 in reraise                                                                \n",
+       "                                                                                                  \n",
+       "   152 │   │   self.exception(exc)                                                                \n",
+       "   153 │   │   # this will messily add this \"reraise\" function to the stack trace,                \n",
+       "   154 │   │   # but hopefully it's not too bad                                                   \n",
+       " 155 │   │   raise exc.with_traceback(sys.exc_info()[2])                                        \n",
+       "   156                                                                                        \n",
+       "   157 @_safe_noop                                                                            \n",
+       "   158 def start_session(self) -> None:                                                       \n",
+       "                                                                                                  \n",
+       " /root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/s \n",
+       " dk/wandb_init.py:1181 in init                                                                    \n",
+       "                                                                                                  \n",
+       "   1178 try:                                                                                  \n",
+       "   1179 │   │   wi = _WandbInit()                                                                 \n",
+       "   1180 │   │   wi.setup(kwargs)                                                                  \n",
+       " 1181 │   │   return wi.init()                                                                  \n",
+       "   1182                                                                                       \n",
+       "   1183 except KeyboardInterrupt as e:                                                        \n",
+       "   1184 │   │   if logger is not None:                                                            \n",
+       "                                                                                                  \n",
+       " /root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/s \n",
+       " dk/wandb_init.py:785 in init                                                                     \n",
+       "                                                                                                  \n",
+       "    782 │   │   │   │   # we don't need to do console cleanup at this point                       \n",
+       "    783 │   │   │   │   backend.cleanup()                                                         \n",
+       "    784 │   │   │   │   self.teardown()                                                           \n",
+       "  785 │   │   │   raise error                                                                   \n",
+       "    786 │   │                                                                                     \n",
+       "    787 │   │   assert run_result is not None  # for mypy                                         \n",
+       "    788                                                                                           \n",
+       "╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "CommError: It appears that you do not have permission to access the requested resource. Please reach out to the \n",
+       "project owner to grant you access. If you have the correct permissions, verify that there are no issues with your \n",
+       "networking setup.(Error 403: Forbidden)\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[31m╭─\u001b[0m\u001b[31m──────────────────────────────\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31m───────────────────────────────\u001b[0m\u001b[31m─╮\u001b[0m\n", + "\u001b[31m│\u001b[0m in \u001b[92m\u001b[0m:\u001b[94m1\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m1 WANDB = wandb.init( \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m2 \u001b[0m\u001b[2m│ │ \u001b[0mproject=\u001b[33m\"\u001b[0m\u001b[33mvalidator\u001b[0m\u001b[33m\"\u001b[0m, \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m3 \u001b[0m\u001b[2m│ │ \u001b[0mentity=\u001b[33m\"\u001b[0m\u001b[33mfelix-quinque-macrocosmos\u001b[0m\u001b[33m\"\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m4 \u001b[0m\u001b[2m│ \u001b[0m) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33m/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/s\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33mdk/\u001b[0m\u001b[1;33mwandb_init.py\u001b[0m:\u001b[94m1195\u001b[0m in \u001b[92minit\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1192 \u001b[0m\u001b[2m│ │ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1193 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[2m# Need to build delay into this sentry capture because our exit hooks\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1194 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[2m# mess with sentry's ability to send out errors before the program ends.\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m1195 \u001b[2m│ │ \u001b[0mwandb._sentry.reraise(e) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1196 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[94mraise\u001b[0m \u001b[96mAssertionError\u001b[0m() \u001b[2m# unreachable\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1197 \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33m/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/a\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33mnalytics/\u001b[0m\u001b[1;33msentry.py\u001b[0m:\u001b[94m155\u001b[0m in \u001b[92mreraise\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m152 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[96mself\u001b[0m.exception(exc) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m153 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[2m# this will messily add this \"reraise\" function to the stack trace,\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m154 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[2m# but hopefully it's not too bad\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m155 \u001b[2m│ │ \u001b[0m\u001b[94mraise\u001b[0m exc.with_traceback(sys.exc_info()[\u001b[94m2\u001b[0m]) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m156 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m157 \u001b[0m\u001b[2m│ \u001b[0m\u001b[1;95m@_safe_noop\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m158 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mdef\u001b[0m \u001b[92mstart_session\u001b[0m(\u001b[96mself\u001b[0m) -> \u001b[94mNone\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33m/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/s\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33mdk/\u001b[0m\u001b[1;33mwandb_init.py\u001b[0m:\u001b[94m1181\u001b[0m in \u001b[92minit\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1178 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1179 \u001b[0m\u001b[2m│ │ \u001b[0mwi = _WandbInit() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1180 \u001b[0m\u001b[2m│ │ \u001b[0mwi.setup(kwargs) \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m1181 \u001b[2m│ │ \u001b[0m\u001b[94mreturn\u001b[0m wi.init() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1182 \u001b[0m\u001b[2m│ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1183 \u001b[0m\u001b[2m│ \u001b[0m\u001b[94mexcept\u001b[0m \u001b[96mKeyboardInterrupt\u001b[0m \u001b[94mas\u001b[0m e: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m1184 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[94mif\u001b[0m logger \u001b[95mis\u001b[0m \u001b[95mnot\u001b[0m \u001b[94mNone\u001b[0m: \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33m/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/wandb/s\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2;33mdk/\u001b[0m\u001b[1;33mwandb_init.py\u001b[0m:\u001b[94m785\u001b[0m in \u001b[92minit\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 782 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[2m# we don't need to do console cleanup at this point\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 783 \u001b[0m\u001b[2m│ │ │ │ \u001b[0mbackend.cleanup() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 784 \u001b[0m\u001b[2m│ │ │ │ \u001b[0m\u001b[96mself\u001b[0m.teardown() \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[31m❱ \u001b[0m 785 \u001b[2m│ │ │ \u001b[0m\u001b[94mraise\u001b[0m error \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 786 \u001b[0m\u001b[2m│ │ \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 787 \u001b[0m\u001b[2m│ │ \u001b[0m\u001b[94massert\u001b[0m run_result \u001b[95mis\u001b[0m \u001b[95mnot\u001b[0m \u001b[94mNone\u001b[0m \u001b[2m# for mypy\u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m│\u001b[0m \u001b[2m 788 \u001b[0m \u001b[31m│\u001b[0m\n", + "\u001b[31m╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n", + "\u001b[1;91mCommError: \u001b[0mIt appears that you do not have permission to access the requested resource. Please reach out to the \n", + "project owner to grant you access. If you have the correct permissions, verify that there are no issues with your \n", + "networking \u001b[1;35msetup.\u001b[0m\u001b[1m(\u001b[0mError \u001b[1;36m403\u001b[0m: Forbidden\u001b[1m)\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import wandb\n", + "\n", + "wandb.login(key=\"ae29a588c238d0e168d620e0b18a5e29e283935a\")\n", + "\n", + "WANDB = wandb.init(\n", + " project=\"validator\",\n", + " entity=\"felix-quinque-macrocosmos\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import bittensor as bt\n", + "\n", + "wallet = bt.wallet(name=\"dalkfjsl\", hotkey=None)\n", + "metagraph = bt.metagraph(netuid=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Version:\n", + " \"\"\"Same as packaging.version, but also supports comparison to strings\"\"\"\n", + "\n", + " def __init__(self, version: str = \"1.2.3\"):\n", + " self.version: str = version\n", + "\n", + " def __str__(self):\n", + " return f\"{self.version}\"\n", + "\n", + " def __repr__(self):\n", + " return f\"{self.version}\"\n", + "\n", + " def __eq__(self, other):\n", + " other = other.version if isinstance(other, Version) else other\n", + " return self.version == other\n", + "\n", + " def __le__(self, other):\n", + " other = other.version if isinstance(other, Version) else other\n", + " return True if all([v <= o for v, o in zip(self.version.split(\".\"), other.split(\".\"))]) else False\n", + "\n", + " def __lt__(self, other):\n", + " other = other.version if isinstance(other, Version) else other\n", + " return True if self <= other and self != other else False\n", + "\n", + " def __ge__(self, other):\n", + " other = other.version if isinstance(other, Version) else other\n", + " return True if not (self < other) else False\n", + "\n", + " def __gt__(self, other):\n", + " other = other.version if isinstance(other, Version) else other\n", + " return True if not (self <= other) else False\n", + "\n", + "\n", + "\n", + "Version(\"1.2.3\") < \"1.2.2.4\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1023" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "version_split = \"1.2.3\".split(\".\")\n", + "(1000 * int(version_split[0])) + (10 * int(version_split[1])) + (1 * int(version_split[2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.10034847259521484 seconds have passed\n", + "0.10036730766296387 seconds have passed\n", + "0.10026788711547852 seconds have passed\n", + "0.10023331642150879 seconds have passed\n", + "0.10031914710998535 seconds have passed\n", + "0.10023617744445801 seconds have passed\n", + "0.10024189949035645 seconds have passed\n", + "0.10032510757446289 seconds have passed\n", + "0.10022377967834473 seconds have passed\n", + "0.10019159317016602 seconds have passed\n" + ] + } + ], + "source": [ + "import time\n", + "i = 0\n", + "\n", + "start_time = time.time()\n", + "for _ in range(10):\n", + " time.sleep(0.1)\n", + " print(f\"{-start_time+(start_time := time.time())} seconds have passed\")\n", + " # print(f\"{(start_time := time.time())-start_time} seconds have passed\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'_Foo__bar': 42}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Foo():\n", + " def __init__(self):\n", + " self.__bar = 42\n", + "\n", + "foo = Foo()\n", + "foo.__dict__" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import bittensor as bt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "metagraph = bt.metagraph(netuid=61, network=\"test\", sync=True, lite=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[AxonInfo( /ipv4/129.146.127.82:8091, 5DhKVLE5bsg8BYY7QC94AJzGHC1LJQ9oCW4R33GekuVMqDY1, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/138.84.62.175:8091, 5CdJRFCwnahgTKquJ92HnbCdp2tb73LmPamvMtWfEUH1cdkp, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 681 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9002, 5H9AVNRo135552roWVL5BW8rLcoBi9HrRSQnrgfipE8vXdSH, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9003, 5Gk23dLJVdTpLU1fi1oAnkghc3VJQuPe2dQEJNUR2VqnBLZv, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9004, 5F1dDnWxQGnBCE5VDa7RvnPnKg7SYGdvEoLuf2mjnBu43WDJ, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9005, 5CdT2QvbpsWEiCu7ZkZr7XZG27vkQUg4mqdpTEeHSGXoZD6p, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9006, 5DrEZkh5KrpC7GpyXKy8ZKSj35iKHetniDnYg8Q6NJuTynAE, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9007, 5C83qhujAfEpezM97r6bvLfuPcmByKZ2UVzMcwaYcLrqRRbZ, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9008, 5FF11KxiYAJvrsPvWV2peopyDvZi82pwH7t8SzmZDpGrBcj4, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9009, 5H3rZ1aE31wSHpY9Fauerrn5hB12tSasVi1LE1NCHsEknSqw, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9010, 5GbvMECKS4H5poqzLg4Xagotu3ivbkffihei46JCBuhdqLkh, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/129.146.127.82:9011, 5CkZ9Xrthh6LB9hKtyiAgRDvcajYfDCT8GJFT1vFK7WPb9TD, 5G1XChmwskSD26xgmdPsJxd4t9EP1CCTHA5KvSNN6uJ73N8D, 660 ),\n", + " AxonInfo( /ipv4/141.193.30.26:8091, 5CaT1KRBVXASre9qtjLH4qMSocsKwuicVb13aq5KF2soJuaR, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 711 ),\n", + " AxonInfo( /ipv4/45.135.57.174:9090, 5DsxJkSsAGuunT1cE3eYNVaugH4KMtqW3NjyejwHw8pJxnLm, 5D8E9HqYjNgtn1GtHHegsnv2uXEAuA3hT8bfqCEnthq2K819, 650 ),\n", + " AxonInfo( /ipv4/141.193.30.26:40195, 5F7U991jo6WDLdBZYZVXqFBixzaoxqfU6kVGnaaJd26ip7z5, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 711 ),\n", + " AxonInfo( /ipv4/69.30.85.15:22135, 5EZsXXxC5rYcJboUmYV4GmWGGuycZuRQ2ww2P75VJjzxy6V9, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 701 ),\n", + " AxonInfo( /ipv4/69.30.85.16:9101, 5DhKi78J7Tx6owD2uWfhNKR9RoTHUo5pzzMtjLSrVejacR47, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 680 ),\n", + " AxonInfo( /ipv4/69.30.85.17:9300, 5FPJH4QeYPca4HSbHQS6vN44RiZY9ioXVUWeLXv235BWEvEM, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/38.147.83.12:8091, 5GRBME6fn4UT3pFhHoDdQNF15d4AgWH59TeZJyajdLhg2v7r, 5GgYinWgdY3ygLAZYFj3okWJHo6DiWJ2YDp4DPNRkvLagzAc, 701 ),\n", + " AxonInfo( /ipv4/73.150.32.202:9200, 5E4FwiywDMHyhv3bHGwyRKBHU36AUbXuFikUYgNfmyGAE9rv, 5DAUBoXCqTsA9CHCSeQ1VjRy3Thcba65NtMzY1QNS8gp65b3, 660 ),\n", + " AxonInfo( /ipv4/192.9.139.126:9100, 5EWaLbtsdSRc5pVkbsf8Gf4LA2a1WvshciYpqjcfA5QrdpP9, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/69.30.85.17:9101, 5Ew4u6enCAWe1vnv2eU8oT3QtMPVvfnoqzvQh3GeAaMwsLiG, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/69.30.85.17:9600, 5EyKa2mEqw6xfUtVa9sT8gJp2975Gc5Y4zMFzaFMcoX5uYLo, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/104.171.202.244:8091, 5GvYD2cyb8UKGm41AYuErbya66QsMmHizsB2GexHH6XyeTNq, 5D9kGC6fWERpXnwTB8tqmDgYxQvyf2UXqv13hK3qUZFQvAjh, 650 ),\n", + " AxonInfo( /ipv4/198.16.234.0:9100, 5E7kEjThgDZebbBpRpcJGU8Jdaosc5qy2W4TJu4bGsiLEKmX, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/69.30.85.17:9800, 5EhpAAXZvMP1FyaedwvQ94JvqKLTzvW6U8Ch4R7YvS4X7JJF, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/69.30.85.17:9700, 5FvoGzwJf6YDAwf62Hz6AU1itMXsp6YYd4hpagTdSuDjTwPn, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/69.30.85.17:9900, 5FJ9vwq5zNDSs3MRobZaYHfniVtCwrSRoB23WMB7Sh1fnLSB, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv4/100.38.79.176:8091, 5DfBk4fo4g4KpnurrV8We3nqvobemoR3293jfxpxw6kUppHm, 5GCUPqE6Kd6NYsqTzvPbTbhsBiGsHgt7gbV4FqZwfuVitJ2K, 661 ),\n", + " AxonInfo( /ipv4/3.89.36.67:8091, 5Eq14XJSnooQEwQeBQxETJ3sgJD3KfXBQD7VUhzP3MCmH1x5, 5DFLvMV2gxEB41ZHKdHqGz1xBtaSPFicsPFcxT2L8YyKd4V7, 660 ),\n", + " AxonInfo( /ipv4/204.12.201.58:6485, 5DvuSUDqR1UUsun9ZkQe67SYcqyTy1VxJiiu7v2YFWtKZ7yt, 5CcE5Lm62GG2241MR29EtFKeojfosVVdyQzGQZN3Q9cfVmN1, 660 ),\n", + " AxonInfo( /ipv4/204.12.201.58:6487, 5ExvvGortR82msWECGpC1awYrepJFEHg3NLBTbFywPwc95Vz, 5CcE5Lm62GG2241MR29EtFKeojfosVVdyQzGQZN3Q9cfVmN1, 660 ),\n", + " AxonInfo( /ipv4/3.89.36.67:8092, 5HVxEmN87qFjTFtekWzrTaXx6BYfE49hubcgEqq6U2iZ3Eba, 5DFLvMV2gxEB41ZHKdHqGz1xBtaSPFicsPFcxT2L8YyKd4V7, 660 ),\n", + " AxonInfo( /ipv4/3.89.36.67:8093, 5HaftpEppTVcsLhEQbt4ZYrRYsV7ePQ2jiMgZnFLeVx37UsB, 5DFLvMV2gxEB41ZHKdHqGz1xBtaSPFicsPFcxT2L8YyKd4V7, 660 ),\n", + " AxonInfo( /ipv4/23.16.27.129:3405, 5EncH6qELTNnYJcyDk5wx8SrWoq82YNx1rc7MB3haVAZd9kw, 5DJWRbigpM4qifs2o1pfuuGowvRXDRznVJ2QbScvLzeWjCL6, 701 ),\n", + " AxonInfo( /ipv4/207.216.69.8:8091, 5FHyXWRJ9FnQfChDdQT6B8zbeUoeEUcSAv9udy2AhTuDhXZB, 5G7NGi3eHR1rG7nWTLiGuhHzfB1Rexq7ynpx9Czn5f2LFNWR, 671 ),\n", + " AxonInfo( /ipv4/207.216.69.8:8091, 5FC4zTUMt9f9cyZ3MWrkGiQrhczQXyWaR2drZVje9oXWvW6u, 5G7NGi3eHR1rG7nWTLiGuhHzfB1Rexq7ynpx9Czn5f2LFNWR, 671 ),\n", + " AxonInfo( /ipv4/152.70.121.20:8091, 5EesC6hoQpVvbZmvUTsPaJZLuQS13X3CMJHoD1bp89dBhHFh, 5GgYinWgdY3ygLAZYFj3okWJHo6DiWJ2YDp4DPNRkvLagzAc, 660 ),\n", + " AxonInfo( /ipv4/207.216.69.8:8091, 5Eqy7jXeEzuiMF2Cr5YftJuygnLS3X3LbDMWS8TnNmubhGb9, 5G7NGi3eHR1rG7nWTLiGuhHzfB1Rexq7ynpx9Czn5f2LFNWR, 671 ),\n", + " AxonInfo( /ipv4/199.254.199.179:3333, 5HGweQKxBuGwpGXAZ6YMs7tSVgVZJHqsBimRVfHxsgTyLXz8, 5GRKyc9Xbv3woffLTPs1Zw3J58i3DmBD4sVWs8pG2Jei67ik, 660 ),\n", + " AxonInfo( /ipv4/38.147.83.17:35836, 5GjaXxtpAbQRmuBjQTffGfTrdwt7oKZiXMMdD5XqmW1ARLWC, 5FmrUrpH3BnPYTptw44C2Yro9Tn7fjLsfhYQazMcDDapMkbk, 660 ),\n", + " AxonInfo( /ipv4/38.128.233.241:37323, 5ES4Bzri4yhin3KMt5Go4APT85ByeHbeVCfSCsy597YAKcvX, 5FmrUrpH3BnPYTptw44C2Yro9Tn7fjLsfhYQazMcDDapMkbk, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5Fzu6mRvzwTneDDctkroKaCnrPvkuWJ2gHrVVEt1j8J2exzg, 5FGuZ4F5KCPGGZB5mEssf4KqTXPsJxApuyHTPzDmVSB77DLS, 0 ),\n", + " AxonInfo( /ipv4/38.242.246.240:8091, 5EUCg5tXaAF5owHxuwcrwTskqs5tPBZeHJxgfHzpCp5c7UDP, 5CFJiSf5ru3Bqqi97yQTLkTisHqbGPnXQZdPnajY2uaaMLNh, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5CfGy362JLQDmL9WhXpz9hUoVm4Ue4fuqLLMZBLmbHmq4tkz, 5HKMUq5dCuFbabNczHGH2mJp5e8RTk7Xk1NC4VU3t8d4nj9K, 0 ),\n", + " AxonInfo( /ipv4/37.60.250.179:8091, 5HDkAHMRqBymFSetiZzsDMjvEupEBgHUQyeCZMy83g2Qwhv4, 5CFJiSf5ru3Bqqi97yQTLkTisHqbGPnXQZdPnajY2uaaMLNh, 660 ),\n", + " AxonInfo( /ipv4/152.70.121.20:8092, 5H6ot1rR2FD4ibwZ9b3p9TJE2rDS2EUbjxZ6qexTxtvKKMgP, 5GgYinWgdY3ygLAZYFj3okWJHo6DiWJ2YDp4DPNRkvLagzAc, 660 ),\n", + " AxonInfo( /ipv4/38.242.246.240:8093, 5EPf8pWtS1trvyQ1gxiV4zumy2pNe5NFqY1yJksyhXHDvm14, 5CFJiSf5ru3Bqqi97yQTLkTisHqbGPnXQZdPnajY2uaaMLNh, 660 ),\n", + " AxonInfo( /ipv4/38.242.246.240:8091, 5GKxydvCJTmXzNT9KbxirwV6g7AumpHXBsKdxBnffJAtEjar, 5CFJiSf5ru3Bqqi97yQTLkTisHqbGPnXQZdPnajY2uaaMLNh, 660 ),\n", + " AxonInfo( /ipv4/207.216.69.8:8091, 5DX7foD5jz4DDJBRQHGpNMLr9fA9MCGrEVxZapgYif7in3kt, 5G7NGi3eHR1rG7nWTLiGuhHzfB1Rexq7ynpx9Czn5f2LFNWR, 681 ),\n", + " AxonInfo( /ipv4/132.145.131.52:8091, 5ENgDSsiHvSUwVr62hbSXwSbAPfcqTfpgmYkNHCh6GAzCoJH, 5FmrUrpH3BnPYTptw44C2Yro9Tn7fjLsfhYQazMcDDapMkbk, 660 ),\n", + " AxonInfo( /ipv4/50.20.127.188:8092, 5ECH1YsW4nAFfFULdPqf1VFhptN77c6RG9vMXAFjC1NTdYd3, 5CFJiSf5ru3Bqqi97yQTLkTisHqbGPnXQZdPnajY2uaaMLNh, 671 ),\n", + " AxonInfo( /ipv4/213.181.122.2:49152, 5FuwAkRcyKV2CReeMrMHMvCf84m6A95JAPjB5dCzP2Vs6D7b, 5CFJiSf5ru3Bqqi97yQTLkTisHqbGPnXQZdPnajY2uaaMLNh, 671 ),\n", + " AxonInfo( /ipv4/87.120.210.108:8091, 5CdGcifGP59BQxqJjbDJyG12Mm6MtziCvwEhoA4v4mcSFGru, 5GL89eSKonqMBGTEkHTvPtAkrxRrFvtZhhMNvMCSrMDFEoG1, 660 ),\n", + " AxonInfo( /ipv4/213.173.109.4:18502, 5DFhjb9QBbf4dGm3jq78NoQXHwEGaM1Y4S3i8mKnBfKG4xLF, 5FmrUrpH3BnPYTptw44C2Yro9Tn7fjLsfhYQazMcDDapMkbk, 660 ),\n", + " AxonInfo( /ipv4/213.173.105.6:8091, 5Cd7d6etRL8QXTLq18qQ3rR6TZUepaaBEysyhk3VvmoiZWST, 5H6chWbZDXVEk7CWicizpwJmgmLw9DD1g2PY6GsfoH3d3d4x, 682 ),\n", + " AxonInfo( /ipv4/89.187.159.47:8091, 5EPSefpokRh3VQcx4gC7KQ11qi4xAFoauRtmJNJGRr3e59N9, 5CyHsKuKoHxmevcbtSLMbHBZej7Rhmnm2zXkXYrtYthvCuKx, 660 ),\n", + " AxonInfo( /ipv4/38.147.83.17:35837, 5H3Yq1o2dgZjvY1VammgkYkX8eDNdetvFie9FmPxAayVUuyr, 5FmrUrpH3BnPYTptw44C2Yro9Tn7fjLsfhYQazMcDDapMkbk, 660 ),\n", + " AxonInfo( /ipv4/194.68.245.121:8091, 5C4qKdnGsN3akEewhSnsvJxSWXe1TgXWXBjnr6RaK8giyFJt, 5GgYinWgdY3ygLAZYFj3okWJHo6DiWJ2YDp4DPNRkvLagzAc, 660 ),\n", + " AxonInfo( /ipv4/163.1.176.44:8091, 5HYVhuMGgoYR8BmNkfmAfEwrzLw9XDQJkX8QtHzgpzBKiKke, 5C7Wt4865tDCCuCcMo7t92fHYdxFr445QnMDRPKyQZb2Dhhn, 660 ),\n", + " AxonInfo( /ipv4/216.234.102.170:50061, 5CXLhbxpGHBEWqyYPJfufRwHH3VpAgQ9zfLGqhFXwwPL3vTt, 5GgkypCvWvVDCW6oxhfbbHJmPg9iSrc4DvCj2iHq9JnP6mEj, 660 ),\n", + " AxonInfo( /ipv4/67.164.152.87:25565, 5HQUNW9YcKA6uw65jLALxPpgkRUp1pt1n6KbMPABKSUBrtcS, 5F78AJyYvvRNXtYcKPzqVHMVv8HNszgZJfpUpxs3d3sjBbQk, 660 ),\n", + " AxonInfo( /ipv4/209.44.107.2:8091, 5Fbxmi4xHGy1KLagtDSutNMUNb48hkdbFhByQGSqXJCXcK7G, 5DkNgo1GMce3afPs7G46SYAPpgxWFXTdFcb9kAdMjfVnhoNh, 660 ),\n", + " AxonInfo( /ipv4/68.7.144.5:8091, 5DA57jF7GcYjSwVJ1LQsfXp1y5mGzZqgd7KNzBnSkav3hLaJ, 5GWbAAGmdW3t1bnjMseCNVQ8wBPjXrqGWrD2aXt84s5mS4DD, 660 ),\n", + " AxonInfo( /ipv4/213.173.108.24:13367, 5Fn93jtWKrZ9YvAmMCQxXgXm52g4ZHd1hiJtE2GizG6Rzjmb, 5GQs5tewbpFWjFZ8kCjGaZdQ1miqhaJZTSBAPe7Go8QWF8Cj, 660 ),\n", + " AxonInfo( /ipv4/86.253.200.203:8091, 5HNAiAYCYhJWLjWnKB13zE6sQfm6EfTN419YHa5rGC1sCFSu, 5F7dhKJq4F2ocAY6cq412DgcMyLFdfEuFuub13yy213S9RnH, 681 ),\n", + " AxonInfo( /ipv4/68.7.144.5:8091, 5HigYbd35N6jo6UyLUjb6ipHKyHTVtGryEsqRwZfE4URKmaE, 5GWbAAGmdW3t1bnjMseCNVQ8wBPjXrqGWrD2aXt84s5mS4DD, 660 ),\n", + " AxonInfo( /ipv4/108.185.112.173:8091, 5Co6NvdjJ58fHxNHZuWNxprrUTKVp17nYGQgtn12hn5sgzWh, 5C7ej16kRtaAusA1kkp2oAERATWwA4abMMiVJioyMF2aiZtV, 693 ),\n", + " AxonInfo( /ipv4/172.124.13.160:8091, 5G6Hw8zqxVEkEunKmBB9oCyeMFULXjvpTJXsSGfaxBXpxWTm, 5DFid3wYnxGsqyD7dyjGbaso8thaDCCqngHtXNVkHfmLGzEi, 660 ),\n", + " AxonInfo( /ipv4/44.197.108.215:3334, 5EUr8sokbCqsGYeYFfs3eSzWo9BPB8ZLjSs5EzUqagYpuiNz, 5HSxjHmx8Sgf6f9pgpnsVg9gmnzSKwrWk1EkdKk2WpbjWN1y, 701 ),\n", + " AxonInfo( /ipv4/73.23.250.244:8091, 5FFXLX8i1kLdaxDe7tkLp1U1EE5dCguvrpd9MZc3PW4CBmur, 5CJCectfgDgcDqptE5SnEEqvMXcqeSoi4g1mmPtamsstf3sY, 660 ),\n", + " AxonInfo( /ipv4/207.189.112.60:56393, 5EX8DepPvPzaHJSYB554tgDBi6gW6nid9AdNZdNuuDyQJUNf, 5ECRM7En2fe5LsAv15aTp79A3fx6ZHstLvGPojvMsogQcFF6, 660 ),\n", + " AxonInfo( /ipv4/91.89.252.33:12507, 5DPMP2NzTH6Xa3j79McepL3dTFrAqQP9AqUWfsEWNftZxaLE, 5CD6Bm48ZcRRaxZQPEB9487kL7azoKYomhP44nktLCEiJoAJ, 660 ),\n", + " AxonInfo( /ipv4/103.95.173.76:3333, 5Gbmbi1K9FpGJxMu4VCKrzfNTUTKwojtFA4iXQ16roHw3KKb, 5Gbmbi1K9FpGJxMu4VCKrzfNTUTKwojtFA4iXQ16roHw3KKb, 682 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5Ew1QtWLa5Jp6SJ42asF1GHGxzR72astob3T19NuNnFXZiTQ, 5F9nC1p13hLNgEdFbzbtsFHf7AsTWKYZ5gaJJNWpGbmq4Dn3, 0 ),\n", + " AxonInfo( /ipv4/73.23.250.244:8091, 5GRad67YBXPqrpPXDj6pbumZYNaWf3gZQvaKaY9AZmcLNj9D, 5GxigCMGjSeDuneysarR5E8BANVUp2PbwsiDF8rxowB5C7cS, 660 ),\n", + " AxonInfo( /ipv4/34.204.205.131:3333, 5DnsSkZ8hGb3auYobEfit8uKsvdKpzNoPrSVqvFysp43SscV, 5HSxjHmx8Sgf6f9pgpnsVg9gmnzSKwrWk1EkdKk2WpbjWN1y, 701 ),\n", + " AxonInfo( /ipv4/172.206.235.241:8091, 5DhhpydCNv8trMekFt6s1iUDnT6Sc6NWJDpkjjZ5StjjX377, 5H6j8U2Dqj6fJXZWUsG9G3PsT4ZHeam7WKtERXroR6rWqioQ, 682 ),\n", + " AxonInfo( /ipv4/72.46.84.55:3333, 5GbFm7juX89MG4nVmZJjTJryRAnGa4vLKcbvHv1zvAhrQowE, 5Gbmbi1K9FpGJxMu4VCKrzfNTUTKwojtFA4iXQ16roHw3KKb, 660 ),\n", + " AxonInfo( /ipv4/86.19.143.206:1111, 5EU3zBdqpXzAYaMrGqKqyratDTPZXNnhwJauoWwGGY8JAK8V, 5FZUKxTFSZpGyyz5EXRhm56kJAXJZDiY64Awx3JeiDjnAZ3a, 660 ),\n", + " AxonInfo( /ipv4/98.56.55.150:8091, 5CMEb77GMD1tvw4JMQMWkxcHBLmoVMSJM2VP2TTwdGaPRRCP, 5HNdb4QtKEwQgQzDp9m7hpCFg6amabMF59SrfnkMDCw42QgR, 660 ),\n", + " AxonInfo( /ipv4/174.57.100.54:8091, 5CUzS5o4MKakfSoaJgiyDzUB6Bzp3M1hzQ7BCkEMbNnrsPBn, 5HKMtKiNRsCCTBmb2zDHexSEBa3QfhKcj25PyN46ZyTDA1xH, 660 ),\n", + " AxonInfo( /ipv4/98.56.55.150:8092, 5HBGN3eXfFzekPZr6M6NBW5V3URkixScT5YcTnNfLFqTR9Es, 5FCPbMP9TiEZNKk9oiEoBfDtPuiTyhMrArK2Ef5x9dE5CqBt, 660 ),\n", + " AxonInfo( /ipv4/::2ebc:4960:9c62:0, 5FjEAos2NtEUVhV6jj7fSLj7ij8n9Mxz4zFUi8yu2QS27aL9, 5CUY8XV6uWNdJGhMSqyWk1QmGHvCgh7nPLhF7zmbh83vwLZ6, 693 ),\n", + " AxonInfo( /ipv4/82.64.218.144:15001, 5EFiiNVJMuSBYP7JaQVdcBGa2bdtLbcUSsYjrxtk2rWJh1Wo, 5CoxgQtQ7gjbDNecnTiqu7R2XVGF5AP2pkKKPajhbRZ13rAr, 701 ),\n", + " AxonInfo( /ipv4/38.147.83.15:18276, 5DX8revVsc7W1foqzxuKaRJgc1FjTCGSb6Q2kxKDYzeBxC4f, 5CZafpuvFxb2sXSEjKfrkC9EBNUJqA9jJckhDkUJxbVPS2R6, 660 ),\n", + " AxonInfo( /ipv4/85.221.178.54:8091, 5F1Qro8uzhKjocjnKSSrLZnTaT8G6oxs67ymgjWQu6xbraPR, 5GnVYgF9jvX4DRsnM8M4g7hNpwTCtXRzTPxpPXhVdRES57EP, 660 ),\n", + " AxonInfo( /ipv4/51.255.87.99:10010, 5G1NMxfXwycRVWMYvcDN4bF8ZtxhLNN1zdjcbRwM5fgZuG1U, 5EyXpG2zAGWcDxo3UtrsijjX5XEqdeNXyXPbLUiCFQVT2W8G, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5HByek7JQYeLGW7UrpE3HDquoWydg6RU8WTvjTA2smnnaGNq, 5EyXpG2zAGWcDxo3UtrsijjX5XEqdeNXyXPbLUiCFQVT2W8G, 0 ),\n", + " AxonInfo( /ipv4/51.255.87.99:12300, 5HGPcjq316CmYyskeXgUVKGKLCHE96gLCWoUm1CEQkS19Nwk, 5EyXpG2zAGWcDxo3UtrsijjX5XEqdeNXyXPbLUiCFQVT2W8G, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5D9zxKiKQrJ34gHYiGpWvwatMLbYZLBNNx3Hgq4KwsLV78Yh, 5DF8APbCteN9ay7M1sKGYxM83eKGYPZ6ZqmfhzeP9weeVZmL, 0 ),\n", + " AxonInfo( /ipv4/81.20.127.184:8091, 5En5ttgo6KUWTWMquswbz4wMnh2ySajxrekAbEifqkuta9P5, 5C7YWvoxjkehUikUNWyaQeiDs4gX7umpcYJbtqnXsB6B9Tuj, 691 ),\n", + " AxonInfo( /ipv4/123.235.6.102:8091, 5GYVKBDSVVKhT4Se38f9Se4Yhih6fBN87pYMTf1MZ877Vjtx, 5F9YqCmpUj7uzoKETJaZqmVkiSkqUeCtjqPLWk2aPaTx7imx, 660 ),\n", + " AxonInfo( /ipv4/65.109.73.2:7840, 5Fo2fNkkfCyZ1RSXCf2TyAySvNfKmv5LiwbVDA1KZ88eKFYi, 5CJAoLWjqms2mrXo4o9NbAvk1yprRCCp67dRs5yiM6Wu7YGZ, 660 ),\n", + " AxonInfo( /ipv4/172.32.19.17:8091, 5CeoYQyojmHYpq3PAsZdwZm9QVnepKxa6CBPFWLoY8Pqqf2Z, 5GKVqx46GtJpKcT8C7KNoU4rBUiPpgC7UUqXjpZyTfCa34ko, 660 ),\n", + " AxonInfo( /ipv4/47.254.73.201:8091, 5HEuYzyTKnQAx779W9UYNJpSGpjioEF63oVPZNcixV8HvkZn, 5FmvQSwHGFkwtxkHvW3Wrrj4tzHFCQLBH134J4HHACKApCtY, 660 ),\n", + " AxonInfo( /ipv4/38.80.122.21:8091, 5FnqSkvnQEXCpSv4hyCzY9Y7EgX7CxsGvoJ4daKsVioURtBx, 5HioLZTRG653SCn5vyeyMr2FdkV2SqwN7wHfFAxyz6DaSToS, 660 ),\n", + " AxonInfo( /ipv4/64.247.206.242:8091, 5DPCYJ7S2KMm2jgA9KdEVDCsr2e9GX5bT5fTUsZSusnNFBPo, 5FxWzFxTx52gUYuLYyTVqPsDS43ynLqorgxLMEVkhnAQSfi7, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5DAX4grTJrYAoHLVbqqei7aroVFh85kGmAXUk5oG4ckWP1Q1, 5CMf5ApexWk4g4aUdaRVHPEQ72vWU3FoVp9sSbdFrHzaozgR, 0 ),\n", + " AxonInfo( /ipv4/64.247.206.240:8091, 5HgYCiHWek3w3BvTR1BNDaCH8HrLeo6ESXSw7taZaABANSXY, 5GxGBZU1Tr38RPriarUzg9cQNoysP2GCNKm2iVHYpjcjcCkZ, 660 ),\n", + " AxonInfo( /ipv4/94.101.98.201:8091, 5GzzVDhaN2xheW1RqiJmwdAR9Y7mMy86LrDphLYhRdrWfYq2, 5Ci1pKAGp9HU9DptNoAX3U5WLPGWR7HCXbw8Q4Ww3UAvpaQw, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5CnhvTKUqq5YURg3aH1LVUDy1P618ghoUdYt9h9YmY2fzP6q, 5Ci1pKAGp9HU9DptNoAX3U5WLPGWR7HCXbw8Q4Ww3UAvpaQw, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5GKpBFCV2ZotEv9iYsxi8Go7GyyJXAjLJzxcm5D8F9Gm56F5, 5GVqwN2bWH5ATh5dGAFygEqExsbR2erxNDm7gXDQZBsfTrYm, 0 ),\n", + " AxonInfo( /ipv4/172.28.143.38:8090, 5CHryiARZccauEgFkN8BzvpQ714AkTcC7YwcSTHzaLmURJm8, 5EACyG41bydbBvSW9PfWcE5kbZ5aU8tsDeNS6URpHLWbn282, 660 ),\n", + " AxonInfo( /ipv4/89.187.159.52:8091, 5GZTqNkXwLPXXDs8Z4N7W2qQCK1LVciFySi42XFeuGGKukvS, 5Ef848ReW7EXjReypNkUWdsXdy6AFuAbZjRBJFUZxSaRKsK8, 660 ),\n", + " AxonInfo( /ipv4/24.51.54.193:8091, 5HENGMGYDy2pBoxMEvQrZYiRwhHt6xCKThA8JkUVXyhKGLbv, 5GzqhxHbyfzMgFp5oiaE7jcL5WwLiJswscF9rLdM6dHzx9LG, 660 ),\n", + " AxonInfo( /ipv4/69.129.120.4:8091, 5DwMX98sJAaAdb6Hr18H69kr4Py1EQXUHcqDoKnLfZqM617N, 5Hmwur4mjdJoAK5YbwRqVfwUcUFP5XSGkZzYsdGiU1n6tJk7, 660 ),\n", + " AxonInfo( /ipv4/173.212.228.222:8888, 5CG8XyHCX1BGJ6ye98EXe8H8NYMtMC36eEdUzqYnyXgWkY2g, 5F2AjTM9s9KZHFCuf23nbDpekLWaqcvfVtaqEPgNxdbGLMvU, 660 ),\n", + " AxonInfo( /ipv4/194.68.245.13:22148, 5Fvo8FhKxrSzM8ucfjsorHVChbC1xWoExfi1nFvxXwdCBAbz, 5E57qHzajW7SLgiucve3Ys1rDJBr57isjo5WPwcnSvL1NU3V, 660 ),\n", + " AxonInfo( /ipv4/89.187.159.44:8091, 5G9UnPztwCzmmzZekudZoeR2EGWEzZwmXtvJ2wJDFh5h1Xcq, 5HW54zcLk3UZZRKZemgxqmRAqCWWcKCs6qozwyhXXqzJE9UB, 660 ),\n", + " AxonInfo( /ipv4/94.101.98.201:8091, 5C5kreDQ3BXFiLTZgo5fn8HgpTLcyFenqN5M4q7KBpvJqJB5, 5C8QoxcmYF7DCSVVJoHPch8mQJJroNeV27UvQqey7L2knSCn, 660 ),\n", + " AxonInfo( /ipv4/69.30.85.13:9200, 5GYKzsXGgoHEuhcmuDJFRv9aFMRVDqh7o27WpTnp5fQLn3iH, 5HiyCfKGduJg5GRA9YE9sH6e9pipNScFMAHCGYb97BxciQDs, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5FmyyS5dZnKYYPFweoevVFsFwmKNPcapV5EMerB4ADywK5Qi, 5HjiqPbGxnxPju6dDhVjQzHUvJ6mqQ5urNYZRixmtenoYkPk, 0 ),\n", + " AxonInfo( /ipv4/3.13.114.84:8081, 5GzxfH7Qn4hQVouvNruQvLYs2rdRGj5Yue2TSi7SYqKGpURn, 5FYoLpxYtH7sBaaLfg2c1n2aynKxkvnVbeUGTRKa7DJSV5f6, 660 ),\n", + " AxonInfo( /ipv4/194.68.245.167:22045, 5EnyCra8nCBgePj3mkshyc8cmvxyNoFNjms2GVYNFMvSVbAB, 5CwDgZZXPEJ17YnmZUcJzAin4vdkJUMGujUwXmHBbW7GroKd, 660 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5CXDVFtoiBSeymfNyd6oqSdnFdntoHK86gPPzUVssxarzBLA, 5Df1bEmPUXFkU7vAvE2a9SrQkVqM97DBTAKjmjottGxkDdon, 0 ),\n", + " AxonInfo( /ipv4/194.68.245.167:22047, 5CiKzoPGV9P1APr8rhY8Ajgz1G8LVowzRU19T32NxJS7hDuM, 5D7v9S8LXFPCXg4aVayEch1c1gryLsi49cCzGuPjXJYfmrUR, 660 ),\n", + " AxonInfo( /ipv4/194.68.245.167:22060, 5F7ZF3JKRXiLVgvgjqb3Fd9NeMYSLqtwTkbiynuWHGPjGtn1, 5D7v9S8LXFPCXg4aVayEch1c1gryLsi49cCzGuPjXJYfmrUR, 660 ),\n", + " AxonInfo( /ipv4/194.68.245.33:8091, 5FPQEJczuhJSCui7L1KBQv8DL5Fon77YFBY2RSVwfQpAEBHm, 5Dss6FJKUK9r9kLj59V4Cx1seh9fGmhDqB1zxkF9Doo9YhmN, 701 ),\n", + " AxonInfo( /ipv4/213.181.110.225:30836, 5FbUSyt9pFsnMbWCWJYEPkawEReyYVGYtcnyGxe3PKrPq3YQ, 5EcJZ5bCPYSoqoxGURt714KdjgDgPjerJmRk4YvG32JDb9rK, 660 ),\n", + " AxonInfo( /ipv4/24.199.109.224:8081, 5GsRqw5XVn6Uhb7qgnpfVHjdQ9RPcdbgbaYgGorP17BV55aZ, 5DcfaXuURKpb7aCkMo9TKVt6QfBWSVn9LgpCcgQaoMYTvjSe, 660 ),\n", + " AxonInfo( /ipv4/123.235.6.102:8090, 5GEXtUJZ4YaycdcmTo7WbQj9n1JzZH8T2sriLyppomdGToQy, 5EACyG41bydbBvSW9PfWcE5kbZ5aU8tsDeNS6URpHLWbn282, 660 ),\n", + " AxonInfo( /ipv4/213.173.108.24:13320, 5F4dS8VeQ9GkW8MHVeYtiuGgW6VcEK1zcTYFH8JwBuZPWhzp, 5G21XzBoWSpKsD12Xf6AfiSVVXdubDXWQNHGnv8KtiYsJHaB, 711 ),\n", + " AxonInfo( /ipv4/35.234.169.95:8091, 5HEeUEVZmAuhuk7mQq5ARZh1ih1VG8dszuf1emsRkba4Y5L5, 5Dt4BN58GvDhcHhkZRiunatZZSJMn9BAhWPf1HHYuufpdPQS, 660 ),\n", + " AxonInfo( /ipv4/209.137.198.89:21988, 5CDZVvH5roq7vTjzi3yTCXMvW1gCf9KCmhWBpySaWbmAJRNS, 5Ff9GGnCoK9VPzuwdpFBZyCbxJupMKVNvQMswmccz1AjWUFY, 660 ),\n", + " AxonInfo( /ipv4/54.201.116.148:20001, 5Cf9spRvgae84aHBSjeQrBdDj4Nf3dUpYxbDP1k2gWT3YgFj, 5CRvidbqbQdDmE3Njz1W2n7StsrexD143mvmVX2MfT8pqsUq, 660 ),\n", + " AxonInfo( /ipv4/42.119.86.146:21989, 5F7Jrp5Riag5NFAuYTPSqKFiqfxuc8jR3iFZkmFLSkPfnfyL, 5HBLapysPtrZEDpZX3MrxPEB9WK1bvZRHkXNthJCHUWRHVdB, 660 ),\n", + " AxonInfo( /ipv4/116.233.193.85:5556, 5GZ2LS3sj4P3tuhqtJqf6p6TJsqaFWHwyvwivNYjsEvQsqcW, 5G6R2MFuxmBDGVuX43wmC3e18irgXQK63ABgVh4zVdaHyBYi, 721 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5Ci9sR15pCwG9r6WgXRQKqWrcwz8tDhUZ8wihr2sSG94wakw, 5FFTq2d6obcmV4z2Th27EShZzhhBLnVL2LoGjaFHB2TehYPb, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5E4Z4WX1Z1cCxYAFAQftfG1DUVuBqfCwpNqu2tCXAs37dkRP, 5FFTq2d6obcmV4z2Th27EShZzhhBLnVL2LoGjaFHB2TehYPb, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5DyAMhJE7esgCJFf7DsFNq2bAkWt9545jkL1zVLDkXRqjsiE, 5FFTq2d6obcmV4z2Th27EShZzhhBLnVL2LoGjaFHB2TehYPb, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5GNVaReU3KkTAPWbJL26gkhPQH2hEX8ZfazqTF46JFYSZ9H9, 5FFTq2d6obcmV4z2Th27EShZzhhBLnVL2LoGjaFHB2TehYPb, 0 ),\n", + " AxonInfo( /ipv4/213.173.109.167:21988, 5FCgf2neexWpQsdqCLEhMEAfttuLKc8eWxJ7EHzpwaemciyu, 5FFTq2d6obcmV4z2Th27EShZzhhBLnVL2LoGjaFHB2TehYPb, 701 ),\n", + " AxonInfo( /ipv4/43.205.34.191:21988, 5DDUm8k6EJU4GDqhvV6Mj9tX5KXokgMX6m8ee4rLo9UBRcNA, 5DkLPih4RkRbjKHfu46iHXTPefctwAJGZWvCMKs16BSAB7Rx, 660 ),\n", + " AxonInfo( /ipv4/38.147.83.18:8091, 5E2RfFLFBF1xfEFWHutGRV3qje16Hrnb93s1BDtqSrzu4kQq, 5GnSgowgRMtaGTh2eHH6ByK2quBogY5eFnTEd6vqS3LAU3Wm, 701 ),\n", + " AxonInfo( /ipv4/38.128.232.109:8091, 5CnqNkvNnupo617YB1sZVCoeW49HPyLaZwqMEeyihzXfv5vA, 5F1bmJLGbgP5sboE6UT9K6Y1ibreAchgPbtsuDU1xhfG8qVF, 701 ),\n", + " AxonInfo( /ipv4/59.124.90.236:8094, 5FX9SSfCTA1ficYqGeEhUUR3BWqQ3W18z2QqxPrnCiGcbewF, 5DcSF14b97w7LyMXQ8BGhskw16ehBVrSfL1fujTrKq5oqENJ, 701 ),\n", + " AxonInfo( /ipv4/103.88.232.189:50000, 5Gehhtx6oL7YStkGvV2z8em7bp8eb9Wmv5R4iMTFsBHmbuyt, 5HDo6fkfTHQ3G9YDp7jMJFGK4sdAhmEoBtvvYBz2ayw3C69u, 710 ),\n", + " AxonInfo( /ipv4/187.207.4.96:21988, 5GbM5R3hfuNWsNzVnKVRqUY2QESKJP4YhWTcgFKP8NcFuSJu, 5HpR6L5qtPwdLZgohC2ckc3SeFUuca9pQNC3ika3xTeM39Yy, 701 ),\n", + " AxonInfo( /ipv4/194.68.245.34:22129, 5EZ6wgcCLwVAAgnWic1LHyysZk55sP19tqAkc3uvkLPJhbXX, 5Ecq2idA8d4B4Q2ei6YSgRVSh8nfC8mtDbGip5Eoo51XMYSE, 701 ),\n", + " AxonInfo( /ipv4/86.98.179.34:8091, 5Gir13ngkE1B8D4i4eB7uMHaSmeikoxAvp4RPLQFKFXALtzx, 5EfFdGaa3ytvKdrJxp6PDS5Ux3umXkUVoTppYJ9epT45W95t, 710 ),\n", + " AxonInfo( /ipv4/47.186.58.92:53006, 5Ei5A4uX6LZV5LEKCyySZekFKYNXK2LSWLccHSfMt6Fic5ET, 5F6dk6MiHmfHNVBWwvXLxGcnfQLwnDFnvfWsq4k3ZU6TiJzQ, 701 ),\n", + " AxonInfo( /ipv4/66.114.112.126:58356, 5H15ma42nLpJED1qGWQGM6iMe1BVvaXBUTe4tAasPXLRJKwN, 5GR6uuGmusEog3VBeSqtGPVttgeFVjJ8vAQaVmW4NDGi2YzK, 711 ),\n", + " AxonInfo( /ipv4/79.116.48.205:22427, 5HowRJyWufju4uUe2gc31KRZKrGASbhes3t9iqv4U2cuY3Rq, 5CUtUY8FLLTtqfQd2f2UAPmmHFbngbLQauLveuYXbMnNUaN3, 701 ),\n", + " AxonInfo( /ipv4/66.114.112.70:19005, 5Gjcg8ZsNJ2syHNhSCm2tLy2b8YyVm1pcT7a2ez4sKHjCAmx, 5C7RyuGubCowQvtqhh2o2ZtMS7s53ayfKGYv7yit7zqtroHp, 693 ),\n", + " AxonInfo( /ipv4/218.172.86.190:42097, 5GxMZQZEoQS1CDzgzUgDXycZS9ggmhK8vjf54MuDFLn5qZYW, 5D51fxG2hS3dT9kEXfYqok3LasEAxof5LydeX64QBs8JMD1k, 720 ),\n", + " AxonInfo( /ipv4/66.114.112.70:19011, 5DHXfzJnhMhcprrhAf7XMD5vyhCmxXgP341FuRmdPSTQZ4f4, 5C7RyuGubCowQvtqhh2o2ZtMS7s53ayfKGYv7yit7zqtroHp, 693 ),\n", + " AxonInfo( /ipv4/213.173.107.78:19313, 5FLaJEA2UpCfep8Xfjp9AJfRhdNepdbR2LFusWDYzeCKqCvL, 5FFQ6dZerUnfnDzU2sLJWnSrqm91qLAjXXnjJNbrLhR2xxuv, 701 ),\n", + " AxonInfo( /ipv4/69.30.85.5:22086, 5E7oqwkoicrW1HAtS7wrKRYd6WZtKkN6a35b9n2S2wWD56NH, 5D5PhKUHknrQovkeALyzoYC37QTctbPAGm1T5ASwLvZcfAkJ, 7003001 ),\n", + " AxonInfo( /ipv4/194.68.245.15:22065, 5EvUdsmrHJchET6aGCvsU7fN5WmSHmncFfk57UQJs8CV1frB, 5CkaEjtrk7uwvJrJio7xRcEfLgh6Q5ijxZ1YQ9R9Z2FQ8GCp, 701 ),\n", + " AxonInfo( /ipv4/213.173.107.78:19969, 5EJUEXvb2tcGSAV1B6iCeBvSzyWjhfQ4GyLZckspvBjq7eCK, 5FFQ6dZerUnfnDzU2sLJWnSrqm91qLAjXXnjJNbrLhR2xxuv, 701 ),\n", + " AxonInfo( /ipv4/142.122.4.69:10522, 5Cf31qYbVDkCtzkiHV2tAXzUAYtx7XiDe93NSKJAZxEJXWff, 5HbazsiGTvynFZXBdA4e8nEyNsSMqZ5Km3XqCu9PEeXNaFPe, 701 ),\n", + " AxonInfo( /ipv4/142.122.4.69:10685, 5Ff2kkfFECR3GL8iyRPGxUYuWsFt78TREJNbon9o1U74JmYM, 5HbazsiGTvynFZXBdA4e8nEyNsSMqZ5Km3XqCu9PEeXNaFPe, 701 ),\n", + " AxonInfo( /ipv4/38.104.142.5:32331, 5GTv5uT3MfdSD3hxGWh72Hpggr4dtJQXfXnKnf6HZpkn6UeH, 5H9BE1N1S2yFt5UtC4LPcwDp8kcr4UpsTghxVFVkwGhYnPPi, 701 ),\n", + " AxonInfo( /ipv4/69.30.85.226:21988, 5D2p9SLRcw4fsDZk2UyZFNZSyDGbXhH8w7Ngv94rDvJbzcY1, 5Gmg8DuxsGmX1ZSC9G2Dnn6Wrb4kzniFTM7kkyiBj8wqihiQ, 701 ),\n", + " AxonInfo( /ipv4/64.247.206.230:18237, 5GHDdxsMDJxn1KR3TdD22FgSyjiFy3YLQRA5TVva6LQufxyF, 5EhuidzzdkcGXGdf631JMe447zjCbDazxSjPQj6UGyrjEbJi, 701 ),\n", + " AxonInfo( /ipv4/136.243.130.82:22200, 5ED6jwDECEmNvSp98R2qyEUPHDv9pi14E6n3TS8CicD6YfhL, 5CST3gftj5GzR8DfVS12GsV9kbhmMurp14QPsYdHNabxKwdT, 701 ),\n", + " AxonInfo( /ipv4/46.233.0.83:40154, 5GbUeyjybwrjEAYpC5hQQ2ChxdrEz3pCjWPfQisSCHutWSiX, 5ELooM9gVxVCQQ47gQJaD9zr8mSzva8K6sd1QGHQws4genfa, 701 ),\n", + " AxonInfo( /ipv4/194.68.245.43:8091, 5CqkBGYZCeu2pu4PNFPPCk2d5CTf428fR84uhRc74VwDGRgH, 5CfNvz8opJGDFA1wuJtH6xXmLn8T6xy2DiLbPmgoEzqzBLyp, 701 ),\n", + " AxonInfo( /ipv4/34.125.54.237:21988, 5Gdia9dxqvkDnA6QaPAFAkA3kBBf7jeY41noK5pmGEPSvB6J, 5HBgHgntHFp1PjppkUMke7ZsdavVifRmkscSWbxt4ccYz6Dj, 701 ),\n", + " AxonInfo( /ipv4/119.74.229.65:21988, 5CSxwSMHqqVT3LtEESdtQoHrusjkDYUfEiMD12VRGqTHUNcX, 5E6xfQnokBeAcx6fRrECqE65f7HbqUSy9reV2sn73AwqARgi, 701 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5CwWWkbL9j54gHzxWGJ3ayuBvxpS9qvwfoSpzSEogkPs7Ewp, 5HgmjSgZxSE8fEDwnErgvKHcqbbSN6ffbW8r9KcVsXDNTDSB, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5FgjQfSkHdQEkidyPR54eFw9oLMS5Yw5D7TTtNDzfZcXksUH, 5HgmjSgZxSE8fEDwnErgvKHcqbbSN6ffbW8r9KcVsXDNTDSB, 0 ),\n", + " AxonInfo( /ipv4/38.128.233.87:3000, 5GHAnrHn742HJXnrETVa2ypdvFWotCt1k5udPxVdwiqgs8RR, 5HgmjSgZxSE8fEDwnErgvKHcqbbSN6ffbW8r9KcVsXDNTDSB, 701 ),\n", + " AxonInfo( /ipv4/38.128.233.87:3000, 5HEwWAgKLgdW2a67YDsW3MxFWL6jCSJCPM8u3JGHvxHQC3o3, 5HgmjSgZxSE8fEDwnErgvKHcqbbSN6ffbW8r9KcVsXDNTDSB, 701 ),\n", + " AxonInfo( /ipv4/69.30.85.12:22019, 5Dns6VfaWCwD728qFCCzTGUvL8rC3VBx64YiRCVzuRo3j3Po, 5GERyYXeiH6HuK95Z9mUxT66Fx559ZH1pWnGgn1DDMjf8viH, 711 ),\n", + " AxonInfo( /ipv4/141.193.30.26:42172, 5Fk35HgrTqqUffK7WN8FG4euZ8MpKx35mUYz9kgwj3UDnNHr, 5GKjbgqqjphGBKvXQPKfDAx2psooR2RSs4iSRhNNxsah7pNo, 712 ),\n", + " AxonInfo( /ipv4/141.193.30.26:8091, 5EjqaAQfxp7vo3ss9Gpovp2nnguu1fVmGw5QfW3Ri8TWfCQZ, 5E9dvaTT6GsY5GgL3nV2z8uVbz1KgRajy5Vejk3do83su4Vd, 712 ),\n", + " AxonInfo( /ipv4/149.102.156.137:21988, 5E4Q8T85DAhEkTMFCEGHyomuEurSVjcgh9iSTEvumrtzX1BY, 5C4yZL2gEophPAePcxDwLMqmUq5WeHZonCWNtVgHoynxnbFy, 701 ),\n", + " AxonInfo( /ipv4/64.247.206.145:8091, 5HWGrV1ANR8zMgnrgioxqP2zL5FuhfwtoaKhNaYBf11m71ht, 5E9dvaTT6GsY5GgL3nV2z8uVbz1KgRajy5Vejk3do83su4Vd, 701 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5EHSN855U6WopJrJKrfjgW7BkQDSGpd1tJfecrxsQ337ESRe, 5DnTYiNQrJniH73CBPbf96nYebsHYnqnmk4a7KQ6SuUf9Axo, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5H1MUgHP3DUEM9WJ8TmZe343T6iAaSH948Lh8xzEUwtcmcJ2, 5F1HuwbiXMibFSY9CiBxxYrxDxm2anSsitmhv4vm6rXi4q7U, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5F7AHwD4zp6cJ3xFzVg9ieUHbuDcYXXqp4kzTompd6CAGXXX, 5EefRb2jd95rRVvWpWthu7GjV7ASVoDzHtqntJeAcXmzmtD3, 0 ),\n", + " AxonInfo( /ipv4/141.193.30.26:8091, 5Dr9CDq2DsY19K3z2qb14kVBYZqWtWwgwjryqNnCNj2JLaix, 5E9dvaTT6GsY5GgL3nV2z8uVbz1KgRajy5Vejk3do83su4Vd, 701 ),\n", + " AxonInfo( /ipv4/38.242.206.87:8000, 5EEjvMCY5gRjtKTV4zmMpfQg34csn8APxaqJjPv1hyUPN3ub, 5DFAz5m2VyMicohzzwYW1o9RdNEVdFwyj9LqBAiT4jUkGYX6, 721 ),\n", + " AxonInfo( /ipv4/44.223.6.37:8091, 5Ef1yLFPJUJ4qFkSM8sdfoYmQ56X834bxCpQSMSxYHwdbvjC, 5EA7bfMcN2n5H1Kv6nsLi4NFhWkdNSz5Nd1gVADC8e7v6ygo, 701 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5DnvGaiEcQwEKKvuXfnoqD3HKoberSibHfP7yXPGPzzgtJhs, 5CQHgsPSzpiT1fVzkBLAo2FNxsBqFWhKCx5jbFcy6KLh5Vc3, 0 ),\n", + " AxonInfo( /ipv4/44.204.223.165:10005, 5HGceMnu9R62eqfLWZg6LJnEYvm9qPZE84UZwrsYCvVKfkXT, 5DZPbo8TgwxNKWbDL2q8EUL4Vkv7NW522NG2g2hsDytYuNrK, 711 ),\n", + " AxonInfo( /ipv4/65.109.75.50:3067, 5GvB9HkrqyCzZopdfrwXL5jLFnviT7uSanzHcqZEKhkWgHjy, 5HmkxhP54TPnq4MFY5tDChGaysSedpdwj5qot1WKQ64YRHHH, 701 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5EeottZy88Gn94dnBLyE3Wqw2TVQ5CvQLfDoHysPgUESi1GM, 5CQHgsPSzpiT1fVzkBLAo2FNxsBqFWhKCx5jbFcy6KLh5Vc3, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5FKZwCSijAQGWpFQdp7ASEHCMntbQeJAj7zJDAgsZT4Mk8Gd, 5CQHgsPSzpiT1fVzkBLAo2FNxsBqFWhKCx5jbFcy6KLh5Vc3, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5CnxdYXJ5YdGXmwuJzSvL4Ave1ezBx7WFHZDSHHPzBqoi14Q, 5CQHgsPSzpiT1fVzkBLAo2FNxsBqFWhKCx5jbFcy6KLh5Vc3, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5EHkzeTGpN3MB4PeLkt9WuanEzb2B35VVszj7NtPvfjuZrL8, 5CQHgsPSzpiT1fVzkBLAo2FNxsBqFWhKCx5jbFcy6KLh5Vc3, 0 ),\n", + " AxonInfo( /ipv4/::5e64:1a06:1f9b:0, 5Ci3ptzSwPXFyi8fMTdv2GYyhu2A8De7DjXF2Ed46zeHYcxB, 5HW9tgzMvcrcdFsXoh6nVb7Ztp35GeY3AVm7YH6JuBtxLcCH, 700 ),\n", + " AxonInfo( /ipv4/46.188.73.96:40105, 5GeXcdm4euY1fGbv3ZefCsQGEnoGKSxF3y6guNUvFPLGigPr, 5ELooM9gVxVCQQ47gQJaD9zr8mSzva8K6sd1QGHQws4genfa, 701 ),\n", + " AxonInfo( /ipv4/147.45.246.121:8091, 5GjB8U3Rn9odhqXtikrKHSTNvJxXhGPo1fyguKQjZ3NN99PC, 5FNiu5ucW1afEZnwHgE9FVF7VutKLmnRCFed5pxZ9JC19fAn, 701 ),\n", + " AxonInfo( /ipv4/::a2f4:52b1:1f9e:0, 5CFCawAuMHysd5xQ83nzL83dGiMUMEj4ywiWxeM9Mctcx3zU, 5FUGCWMcVLb9ckgbuqEGLusk7gDejPTbr13fRkwaLNkHWTp7, 701 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5EWcQMLVwKNbwbFVN148BFVrTtcxwTuMx3WMSyjTqAZHxJ98, 5GZZA6CREiBVbUz7njYLPxW8nmdXwsZ43ckXSdfA4vZBL5tL, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5G1Yvofr12qhHkhZ6AJEhgFPt6Q1LuVVuwcTgxGhGSeuguta, 5DvrU8CvFe4vEMEcsmHTv9Y3bNkahwzzNPVsbzwKgeFmnHXk, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5EWYk71Tmc4jpomCvmycMbTS6p3WReLZtdQYQ7KKwkdd4Zbs, 5HNXW3kGwFnkVM9tmo9GdVDv8NgQkq7ea2f5ur3N7vnSSZdz, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5GeUAypCmyQeRdH2Hkg8NVUuymrXFV5T7JW1BeEFVkJfYsEj, 5C4iCxPTGnSqLqyiFFNPCPFumDWNPViiYkdKvHFCRfzxUU6P, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5E9guCMJEWBG86GsAHqpbhEst2d86mNkHQgGiA6tTkPh6MZK, 5EcTyDWkdEvrYrX2p6xMaaCnUfBEP5CTzKupNJp93nizKb9b, 0 ),\n", + " AxonInfo( /ipv4/188.65.8.131:21988, 5CPX9yBWBHc4cJLLpAtMM3LpEvzDHtwWT2fNEFwSyYdD5Yem, 5FsJ2Qi8zMjLqoykziDYcfMqwCbcyf5bFi4dpNTFGFT6Kkj3, 701 ),\n", + " AxonInfo( /ipv4/141.193.30.26:40339, 5HTekq8MU4AbyUs7mkKmzYnn7BSURYqkSe7Dw2dq3kkyRfV7, 5E9dvaTT6GsY5GgL3nV2z8uVbz1KgRajy5Vejk3do83su4Vd, 701 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5DekJvCSPhbQa5uMaE54SdyvmMhdP4dxFQvffv5CDF6FvHm4, 5Ei4jboFsURz3zFprvBBXRVrZtC5RyJQ7XXb7NDvTMMsHxsx, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5E2GjLjiuzUv4btg9MBvZimE2kWMSeLS5aRHZBY7x8GoNSD1, 5ERNjnimWmj4C6cXYtiCmYMEEj1EeoXVq7d4rRXrscQUXAYi, 0 ),\n", + " AxonInfo( /ipv4/3.143.224.115:3333, 5EXDR7VzDPzFCTEareQ1EoKv2Yeu42gUnG2MN33LRt87PtRe, 5D7HPxKh97ZgWxxfPomA3ZrC2kHnkXawmG6tca8Um3RxbopM, 701 ),\n", + " AxonInfo( /ipv4/38.60.163.190:21988, 5E9n5znEjtD577FJNiRbjjJnUMzMR5jUmMKTYiPDKHPR4pBR, 5CJAd5tnCLPUHYP2UKarpmcys27QG2UptH1fZt5bRPcHwPQF, 711 ),\n", + " AxonInfo( /ipv4/213.173.107.84:8099, 5FWigwJoVYtBttiqXKNHyWGTNE9egRZz3qwvcMuK5unMpmcG, 5FRz2kQenJ8mA9r34zfRjcGwJ7Q7J9A8PyAGQeNCoKXLpvJg, 701 ),\n", + " AxonInfo( /ipv4/161.97.156.125:8101, 5C7x9TohSN5jXTd3B2fPqhC9rQruaiNx9eT6UDRKhvpZSXEL, 5EM1NChDWV7UTniMLa7msxbmaY9HocdHVftayFmMtz2TLDjx, 711 ),\n", + " AxonInfo( /ipv4/20.62.195.114:41945, 5DttJxF9gvzRo34fZjmabxTLHWrxNNn7xnd4co3GmbxcqrPM, 5CGNjcqcgkkE5AHZQsdDZmXTqcHEwnvXDVFbSfsRkSh5kfbq, 711 ),\n", + " AxonInfo( /ipv4/38.60.163.87:21988, 5CJAd5tnCLPUHYP2UKarpmcys27QG2UptH1fZt5bRPcHwPQF, 5FRz2kQenJ8mA9r34zfRjcGwJ7Q7J9A8PyAGQeNCoKXLpvJg, 7002000 ),\n", + " AxonInfo( /ipv4/38.60.163.87:21988, 5H9FfNMRZcspL6xm3krZkAxegDmbeMvrtH4Sp7VU3dJ6jdpd, 5HeKWUvndnAxgR2akyonQ4E45FfGBqig8EtmypLzDyLdsZhf, 7002000 ),\n", + " AxonInfo( /ipv4/141.193.30.26:8091, 5CdMYMSddyrB2u3epPaTyqr41nYoxxmgZHgnW1mWkN6NynMb, 5E9dvaTT6GsY5GgL3nV2z8uVbz1KgRajy5Vejk3do83su4Vd, 711 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5FZK9wWyzsrQQrBetVmwW5De2hF113fJUEj1KRMdNWetsM8M, 5DkGsq5wXptsLRKiyaojkXSFwAZR88Kdb7hiJaCnmykhbg7u, 0 ),\n", + " AxonInfo( /ipv4/44.204.223.165:10005, 5F3owHgfBBU8tCqEX5acxrnC69pHo85tiBQev1QNZvrXv1XB, 5F6aEdaZ4nBJ41r9U7qmMPQmcoVnDyAea4h3bVF8ekHRWrPb, 711 ),\n", + " AxonInfo( /ipv4/62.169.159.170:21988, 5Cu1kdxpF24EfoEK81Q15oqDc37gMe5wGnKG2dGjYdZpDJTs, 5Fzuv6wax3mqA5S4gcZefYku1dJtY4NYSXy9dNwPGkcFmq6s, 711 ),\n", + " AxonInfo( /ipv4/65.109.84.205:8091, 5Fnm5rVGyYxeLMcZuNSHCGLk4mCQTTdrRESaZSRtyrFZJ7kb, 5FTRsgTLbXP1TKRoaP4DUw7SRhJH9eaoKk5hkpABLAZM6GmM, 711 ),\n", + " AxonInfo( /ipv4/213.181.110.225:30836, 5DRwwJSS2K3xpFh4GdUSoCjGmUubeSjxvKV7oF9P7Paojb4i, 5GqGy7dc4BABp5HLwJ8UZczZykBvwYyumD6bB4bdfrcdSVGU, 711 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5FEzDqaNtxaLqnyjjHnHomZEfBeMqxLdaY3fDHBmmE3KxjHr, 5DhUbFTvPpXmoZaCdeSQj3h5rhyur5aPWYY2efJb9cFMWZsu, 0 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5DcQrTd45LGT88WR3tBRqgyDxFJ73SQ2ULfUqNcrMNez2Vtx, 5C4tJGiGoF43aDSvvjcvv738QEYMXveKfMya8MU9BSd53eoP, 0 ),\n", + " AxonInfo( /ipv4/195.0.159.206:43400, 5Ct14BX1HsRNh5yMrFqiCTduc4buZEYbZHnDdQpMMb5b2wjs, 5GEeMQsyWN46KeSkYE7YFFZWknZnXh7zrqS3KhuABN8H38YP, 711 ),\n", + " AxonInfo( /ipv4/194.68.245.62:8091, 5EhMpL2evGTBiYD5FYZZBmKCmzjxmwZYRthSAByRftRp3tSe, 5C5jytgSYpafHRpaFqKbhHnnhFMRvXx2HCCD7THwCvDgFNy4, 7003001 ),\n", + " AxonInfo( /ipv4/194.68.245.62:22116, 5He9Gtavge2jrb8FYQoQBg2Tq6qpqCAZtezbrJVjPXvSwZTp, 5Gs1mri7YxqcPxfh8v5M1bzxDoyNvBNs7nZbZ5dvUh4GWqor, 7003001 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT, 5D2d3YMBdLfvdTJwmtEkNLnz3evDqGB97HgB9pGu72HZskx7, 0 ),\n", + " AxonInfo( /ipv4/141.193.30.26:43764, 5E4AbG7x7pd4BZQs2TD9vATF8W7v3ZpjEh5Lm6qrEqfb2ZNp, 5DXeqx6aYP89vENGWwTi5j7FRLTPo6yjevnmEZf52pqnMkrJ, 712 ),\n", + " AxonInfo( /ipv4/141.193.30.26:8091, 5DoXBcLN6PLUdQELzRuQLGkGD8TknLnwWJrUyAj3hJDoBwpb, 5DXeqx6aYP89vENGWwTi5j7FRLTPo6yjevnmEZf52pqnMkrJ, 712 ),\n", + " AxonInfo( /ipv0/0.0.0.0:0, 5HgCfZhcduMK5zotCy2Mk9g3u4VuY5WLCYLBUd1vgpUKxND4, 5H4EDsAVQ4vvGHRbfXP5ASfTbyZXKRyz3f3ft1CVAeCrP1H8, 0 ),\n", + " AxonInfo( /ipv4/69.30.85.48:22193, 5HMnbvQFWpEZcqq58hYJuwfF5GYaMDLuM5yt2iR1UrY5WvSL, 5Fv2jTn2tggoV6ojJJWowN1XQXx5X5TQRC6waaFXpGJbvVWm, 712 ),\n", + " AxonInfo( /ipv4/86.207.31.114:8091, 5GKxz2E5CKodBt9TASp5S6wYGYsyqfTy6RnzwWb5X13RnY7p, 5DLGk9K9vgmRwS1PpGXnxJGZonF1BybfWyGzSTbQZ3BbRPCc, 7003000 ),\n", + " AxonInfo( /ipv4/3.238.219.255:10005, 5GnNrAWHeijkKPzMY9J1dR7sqpWnnjJd7qfJwknjBP2GZquZ, 5F6aEdaZ4nBJ41r9U7qmMPQmcoVnDyAea4h3bVF8ekHRWrPb, 712 ),\n", + " AxonInfo( /ipv4/69.30.85.48:22193, 5HpoMRQ6MyTShcAbh8cxDPjk3pzLyPH4qvFCZ1nkRtT7Xgix, 5Fv2jTn2tggoV6ojJJWowN1XQXx5X5TQRC6waaFXpGJbvVWm, 712 )]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metagraph.axons" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_95078/659430835.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", + " float(x@y), x@y\n" + ] + }, + { + "data": { + "text/plain": [ + "(2.561555106557572, array([[2.56155511]]))" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "\n", + "\n", + "x = np.reshape(np.random.random(size=10), (1,-1))\n", + "y = np.reshape(np.random.random(size=10), (-1,1))\n", + "\n", + "float(x@y), x@y" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "2024-08-05 10:47:00,850\tINFO util.py:154 -- Missing packages: ['ipywidgets']. Run `pip install -U ipywidgets`, then restart the notebook server for rich notebook output.\n", + "/root/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/pydantic/_internal/_fields.py:201: UserWarning: Field name \"name\" in \"WikiDateDataset\" shadows an attribute in parent \"BaseDataset\"\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "# from prompting.tasks.date_qa import DateQuestionAnsweringTask\n", + "from prompting.tasks.base_task import BaseTask\n", + "from prompting.rewards.reward import BaseRewardModel\n", + "from prompting.tasks.summarization import SummarizationTask, SummarizationRewardConfig\n", + "from prompting.tasks.qa import QuestionAnsweringTask, QARewardConfig\n", + "\n", + "from prompting.datasets.wiki import WikiDataset\n", + "from prompting.datasets.base import BaseDataset\n", + "from pydantic import BaseModel, ConfigDict\n", + "import random\n", + "from typing import ClassVar\n", + "import bittensor as bt\n", + "\n", + "\n", + "class TaskConfig(BaseModel):\n", + " task: BaseTask.__class__\n", + " probability: float\n", + " datasets: list[BaseDataset.__class__]\n", + " reward_model: BaseRewardModel.__class__\n", + "\n", + " model_config = ConfigDict(arbitrary_types_allowed=True)\n", + "\n", + "\n", + "class TaskRegistry(BaseModel):\n", + " tasks: ClassVar[list[TaskConfig]] = [\n", + " TaskConfig(task=QuestionAnsweringTask, probability=0.6, datasets=[WikiDataset], reward_model=QARewardConfig),\n", + " TaskConfig(\n", + " task=SummarizationTask, probability=0.4, datasets=[WikiDataset], reward_model=SummarizationRewardConfig\n", + " ),\n", + " # TaskConfig(task=DateQuestionAnsweringTask, probability=0.2, datasets=[WikiDateDataset])\n", + " ]\n", + "\n", + " @classmethod\n", + " def random(self) -> TaskConfig:\n", + " probabilities = [task.probability for task in self.tasks]\n", + " selected_task = random.choices(self.tasks, probabilities)[0]\n", + " return selected_task\n", + "\n", + " @classmethod\n", + " def get_task_datasets(self, task: BaseTask.__class__):\n", + " try:\n", + " return [t.datasets for t in self.tasks if task is t.task][0]\n", + " except Exception:\n", + " bt.logging.error(\"Tried accessing non-registered task\")\n", + " return []\n", + "\n", + " @classmethod\n", + " def get_random_task_dataset(self, task: BaseTask.__class__) -> BaseDataset.__class__:\n", + " return random.choice(self.get_task_datasets(task))\n", + "\n", + " @classmethod\n", + " def get_task_reward(self, task: BaseTask) -> BaseRewardModel:\n", + " try:\n", + " return [t.reward_model for t in self.tasks if task is t.task][0]\n", + " except Exception:\n", + " bt.logging.error(\"Tried accessing non-registered task\")\n", + " return []\n", + "\n", + " @classmethod\n", + " def create_random_task(self, llm_pipeline) -> BaseTask:\n", + " task_config = self.random()\n", + " dataset = self.get_random_task_dataset(task_config.task)\n", + " return task_config.task(\n", + " llm_pipeline=llm_pipeline, context=dataset().next(), reward_config=task_config.reward_model()\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "ename": "ValidationError", + "evalue": "1 validation error for QuestionAnsweringTask\ncontext\n Field required [type=missing, input_value={}, input_type=dict]\n For further information visit https://errors.pydantic.dev/2.8/v/missing", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValidationError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m TaskRegistry()\u001b[38;5;241m.\u001b[39mget_task_reward(\u001b[43mQuestionAnsweringTask\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m~/.cache/pypoetry/virtualenvs/prompting-fb5sw-i7-py3.10/lib/python3.10/site-packages/pydantic/main.py:193\u001b[0m, in \u001b[0;36mBaseModel.__init__\u001b[0;34m(self, **data)\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[38;5;66;03m# `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks\u001b[39;00m\n\u001b[1;32m 192\u001b[0m __tracebackhide__ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m--> 193\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__pydantic_validator__\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate_python\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mself_instance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mValidationError\u001b[0m: 1 validation error for QuestionAnsweringTask\ncontext\n Field required [type=missing, input_value={}, input_type=dict]\n For further information visit https://errors.pydantic.dev/2.8/v/missing" + ] + } + ], + "source": [ + "TaskRegistry().get_task_reward(QuestionAnsweringTask)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "prompting-fb5sw-i7-py3.10", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..153841c0 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,7259 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "accelerate" +version = "0.33.0" +description = "Accelerate" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "accelerate-0.33.0-py3-none-any.whl", hash = "sha256:0a7f33d60ba09afabd028d4f0856dd19c5a734b7a596d637d9dd6e3d0eadbaf3"}, + {file = "accelerate-0.33.0.tar.gz", hash = "sha256:11ba481ed6ea09191775df55ce464aeeba67a024bd0261a44b77b30fb439e26a"}, +] + +[package.dependencies] +huggingface-hub = ">=0.21.0" +numpy = ">=1.17,<2.0.0" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = ">=0.3.1" +torch = ">=1.10.0" + +[package.extras] +deepspeed = ["deepspeed (<=0.14.0)"] +dev = ["bitsandbytes", "black (>=23.1,<24.0)", "datasets", "diffusers", "evaluate", "hf-doc-builder (>=0.3.0)", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "rich", "ruff (>=0.2.1,<0.3.0)", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +quality = ["black (>=23.1,<24.0)", "hf-doc-builder (>=0.3.0)", "ruff (>=0.2.1,<0.3.0)"] +rich = ["rich"] +sagemaker = ["sagemaker"] +test-dev = ["bitsandbytes", "datasets", "diffusers", "evaluate", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] +test-prod = ["parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist"] +test-trackers = ["comet-ml", "dvclive", "tensorboard", "wandb"] +testing = ["bitsandbytes", "datasets", "diffusers", "evaluate", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchpippy (>=0.2.0)", "tqdm", "transformers"] + +[[package]] +name = "aiohttp" +version = "3.9.0b0" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.0b0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:50b550b5e317e40a017bab8b25995676af3aa66dd0ef562cd7dce7f1684cd376"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f902ad26b9814852e0a17d48f98ba4c879d8136c4fa9b235b5c043dde0a0257"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c2140de122ecf3eb7947105ceb91fb6632fb21cc1d17f6ff19c3973d2d12730d"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e014b343225d8d358ee91962b588e863fded12a6e2f9b446bb3be85c678e04ae"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c7016695087e616a2806ccdb1f83609e5fecb3958c270e3e5a42f69d225536f2"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40407d5ec81682225ad5538d9bd68b0f8242caa91e72a6a9a95197fd7d9aebb2"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd54502e6b4144785f2f14a5f1544ced0a77dbecb1fd422f21dfad95dcb7fcb8"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67f911fd2073621eecfe77b17926460e72980b9b996d0ab7dad5e38805ce2988"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:638ba28af2c821b70574664a991dfdfaf1a7a7ae1a8068757f7d59cdf2d8361a"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:76329f7c1f5f3185d91d61d64615d88fa3dfddf389a83f6cd46a205c5b61e01b"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:597b5d44b613dea9c62779592eb0ecae87604628564ecaff8d516457def68184"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:cd5edd7ba2b3f95346e0fc8ba2364bdd93917a1bf8528e7d60ec80cf21dfba7e"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72556e0cce47c6e558454316fc5c6a3fb0980344eee8af7aa52b495d82ef12a5"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-win32.whl", hash = "sha256:01a3b241288c4d8171fe5e2434a799d0b82700d2ed2156b43f1d7f4f521ba382"}, + {file = "aiohttp-3.9.0b0-cp310-cp310-win_amd64.whl", hash = "sha256:17962c404788c348ce5b58efaf4969249183c551890e30bfd9c035188d21e3d1"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:94197a77859ab1039b9ca6c3c393b8e7b5fc34a9abfbcb58daac38ab89684a99"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0c78d2cfe1515cfb31ba67edf0518c6677a963ec2039b652b03a886733e72e65"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28b38a14f564c833e59c99f748b48803e4babeabc6a0307952b01e6c8d642cab"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e596cfc52380f71e197e7cf0e2d3c4714b4bf66d2d562cdbd5442284bac18909"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6190951b7933c834d9346e21c5a81642caa210d291cda4036daf85fc53162d35"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb0cb2cbf95cf4cc40307d0d0187f59c4b86b1d7d1a624922a7d0b046deffba7"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e27c283e21e94fa1582d31b57c514b87ab609882ade413ce43f585d73c8a33fc"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6826c59b4e99673728bcdaecacbd699b7521f17ca165c63a5e26e23d42aeea5"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aa4738f3b1b916b1cc69ed3d1dead9714919dc4d30ae0d5f6d55eadb2c511133"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b2abd7936f687de3a3ab199b145a9de01ed046eb5640cd66f47da07a9050a78"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:652cc00a97bc206c470db06276ce57ff2a53a625795bbce8435ef8b6a4cb0113"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d54529c1d95d5d200ecb7133a343785e5661a804f3dcee090a7bca3b48189d69"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:324fe990c97721ea8eb4d439f12b59d1a93cd7e0dd188c7b145bffdfbd327dc3"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-win32.whl", hash = "sha256:3a2ef8318435f40f5906af36fda20b5432e07e6a7e05de3a4d2934c25320b8ff"}, + {file = "aiohttp-3.9.0b0-cp311-cp311-win_amd64.whl", hash = "sha256:887d8757aafc7f6fbda76faaff21fc2aa31b9dca0911ecd6b60b0fe922a2abfc"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9c430c706589a811b38e33e1492d194cbb0f6f2e027877bf038debced703446f"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b820981f1c5d6da382e4859318ba78c9b5c583f0920e44a18efb3387b18487e"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c64677a2df742bcd89b94c35689306663d8246a8534bea5835afc706416f8dd6"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:903155c179cda589d01936953158685747af43d98cdd3673a671c6e7f5c94178"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77cbb6e4a146449f805fa0e725b0b2a06411d21417d8eca699bbee55204201d0"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc3cc9f5e6e493a2b9c3d241fca870b5a64aa4c247f1192f9e34fae990667df8"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92071206e570b7da6380f8d376820e2a40230638b8fd8b45b28103b346704c5e"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:242e3cb0b2d441a2d20443114eebe3032078d1894ac1d97ab2dd101165ea50e1"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:044c5a8923bd44a4a0769a2886130c19f7f3a4a1a284f0ff68c2a751920ee39f"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b1b0d0f63ff48f80aa89be3ff61bc2b980c5b02895c81dbc1e44ce7b6cb5b7"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:f737a47b5df97b6da457a0b2739d6d819ffadea2f36336988b53dbdb1796ba89"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:e6d79f8b8347afbecd8047a1f6e74c810eb82497256cc906ee384635174dcaea"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2f1b0a821564e315ec5cfa0abaf048355e229995a812380ec7a2200d87a6ed11"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-win32.whl", hash = "sha256:ab2702f281ca504529e82be78dae2b9ca31d51a92ab8b239bd326b74c79d7af4"}, + {file = "aiohttp-3.9.0b0-cp312-cp312-win_amd64.whl", hash = "sha256:b81722b88abd4aab656abfec122646b6171da64340ff92af3bcf1af5f0d1275e"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:49e2ca017f506d1a9c60f44301ceff2eb8bbfe24b9cd9b4c4a363d9e5f68e92b"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06cba5518d8e30b46fcec2a8ed22ec6027fc9864583e0b538da642507f66fe29"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e5201d3f8d0b2748eba5093820861639cac1ea1dfdff537f67152a1c082e1243"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c483d0a666f6cbec2e974f760f93499bbcfcb17a7c4035d4c4c653e6a3b21b1"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04f48476ce3e96843b44084fd15139b195781c10ed6eb5ffb706fb9d2ca95ce4"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09fdad08544a4479e5801c777697c155fa9d966c91b6dcf3e1a0d271ad3999f7"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:127aa57415005eb04fb1a3685c9d7b42aef6718be72b8a62b4b30ee00f7d23f4"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa8f29f0647f10f6bcd9f597f1319d13ce1d6efe2d55169226940093eeadf609"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8dc394dea47594825ac2a662c4fac6a8b294acd937396aaec8e41ed03728898b"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c332b343974c6fbfec53e3ac7afebd6ba6cc1777cda67c28fabb3562411a9b5a"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6dfad718b328de3fa30d663393d51feea625322ec723bdecdec3f5f52ba6347f"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6edaeb63a4657672b04afcc25c253e960125e805f5a8f8cfa7bf682d15115f49"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:20023087bce5f3adde4872042ea1193d31d98b29682c28a6309d72bce0d9725e"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-win32.whl", hash = "sha256:ad07ee4165a82e646310c152a74997c759d5782aef58bab9d77034b4cc87e153"}, + {file = "aiohttp-3.9.0b0-cp38-cp38-win_amd64.whl", hash = "sha256:494062a8447c6665f5237c47ca8bb5659cd3128ad9b4af5543566a11bb88df5c"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aaff57bd1ab9eb1a205f3b7a00e2dc159d1e7e4373870be0d192358a656d9e60"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c212f5066ffe9490856b706a9d9bd457f14716f4db4b1b73939245a1acecc4e"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d80664b3b82fb9ee2c7b13072651cd68d65fbb3a69721040c08969bab4335628"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7cf539fc98297e312308405949ca2f04a347eb021e30d004388cdb5d155a0ec"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6be520717b895508c63df90e48135ba616c702a9229d4be71841dce2ea6a569f"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b25e926cd16b44aeef29fffbb9fc9f577f52a6230e46926e391545b85cd0ce3"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35f6cafe361c0323945c13122c282ea22fb0df96e845f34c4d8abd96e2a81995"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5c9851e3d0396686d96a7e3559bf5912ed79c944ff1a6ae3cf7b1da320c3ad2b"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ab413eddeb1a03ba84d06acf7024a646b049d991ed0616bcc1ee40dc8fffa9e"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:89b271a8658472a9d400836ee8caee743246bae5c06405a63b6ba366f58df727"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dd941d473b86d0d5a413a1832499e5b80f648d66ca0c8246c26a4ccd66bcf7ec"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ce4f000279fb85527c017ef429615f2cb5a0cb614c088610849ddc6c2ac8d91b"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f50a4f6773a9eedefb24b42c611e31dcd13f6139419a8656f7e525cb8a00687e"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-win32.whl", hash = "sha256:b14dcfcc5ad161d007da71e1c1211909d527d9d7c2795ea9e17191ba25e5d89a"}, + {file = "aiohttp-3.9.0b0-cp39-cp39-win_amd64.whl", hash = "sha256:567245a91a57c41899f5d266814c9da8782d3d949dc1e66469429f08713a3ec6"}, + {file = "aiohttp-3.9.0b0.tar.gz", hash = "sha256:cecc64fd7bae6debdf43437e3c83183c40d4f4d86486946f412c113960598eee"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "angle-emb" +version = "0.4.3" +description = "AnglE-optimize Text Embeddings" +optional = false +python-versions = "*" +files = [ + {file = "angle_emb-0.4.3-py3-none-any.whl", hash = "sha256:65101325dae428d0294322283a02dfc8fb645320349091905a95e50fb03b4ad2"}, + {file = "angle_emb-0.4.3.tar.gz", hash = "sha256:4d3d47f978813e16dbdd4d1054df27cb8ffd740e697a6ddc8755af030b2bcf7c"}, +] + +[package.dependencies] +bitsandbytes = "*" +boltons = "*" +datasets = "*" +einops = "*" +peft = "*" +prettytable = "*" +scipy = "*" +transformers = ">=4.32.1" +wandb = "*" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "ansible" +version = "6.7.0" +description = "Radically simple IT automation" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ansible-6.7.0-py3-none-any.whl", hash = "sha256:3cda6e67b1d42516f64ce376bb94c5186ff33d215d155432be5b3c2ec60bf112"}, + {file = "ansible-6.7.0.tar.gz", hash = "sha256:c188f3ac8a8583794aadcff0bea87895ead58c19d6f244cd0c342562706e176c"}, +] + +[package.dependencies] +ansible-core = ">=2.13.7,<2.14.0" + +[[package]] +name = "ansible-core" +version = "2.13.13" +description = "Radically simple IT automation" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ansible-core-2.13.13.tar.gz", hash = "sha256:7ad2d8c0a5fa4a59de1809a5f96d2dbf511189c834116f5c72aec9730b51074b"}, + {file = "ansible_core-2.13.13-py3-none-any.whl", hash = "sha256:f50220254b8e13a79b68e68e759f5bf89f3f3584c907737985a017c699b1c3b6"}, +] + +[package.dependencies] +cryptography = "*" +jinja2 = ">=3.0.0" +packaging = "*" +PyYAML = ">=5.1" +resolvelib = ">=0.5.3,<0.9.0" + +[[package]] +name = "ansible-vault" +version = "2.1.0" +description = "R/W an ansible-vault yaml file" +optional = false +python-versions = "*" +files = [ + {file = "ansible-vault-2.1.0.tar.gz", hash = "sha256:5ce8fdb5470f1449b76bf07ae2abc56480dad48356ae405c85b686efb64dbd5e"}, +] + +[package.dependencies] +ansible = "*" +setuptools = "*" + +[package.extras] +dev = ["black", "flake8", "isort[pyproject]", "pytest"] +release = ["twine"] + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argostranslate" +version = "1.9.6" +description = "Open-source neural machine translation library based on OpenNMT's CTranslate2" +optional = false +python-versions = ">=3.5" +files = [ + {file = "argostranslate-1.9.6-py3-none-any.whl", hash = "sha256:285b194bd64d65617ee2fa8969a40ce790c6b3acf875f94f1d2b0373f3ae691c"}, + {file = "argostranslate-1.9.6.tar.gz", hash = "sha256:dd8cc1327aa67132299f950e160dd20d314b8cf484f540f0d22f1f07c2d8876b"}, +] + +[package.dependencies] +ctranslate2 = ">=4.0,<5" +packaging = "*" +sacremoses = "0.0.53" +sentencepiece = "0.2.0" +stanza = "1.1.1" + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "autoawq" +version = "0.2.0" +description = "AutoAWQ implements the AWQ algorithm for 4-bit quantization with a 2x speedup during inference." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "autoawq-0.2.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:4c9c4db6fbf23cd625a9cb5b5495777555659dc12aa7e0aba733f20c51f10005"}, + {file = "autoawq-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cfefc8e8c4d92b9b78f2f1bff61d6bb413138d2ab221029587251344d65007c"}, + {file = "autoawq-0.2.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:ee68699fec949c4440374b402558400efe83c359e7f85a5a7979608c5eec0da3"}, + {file = "autoawq-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:4d6080539bb386a5754cc76b5081b112a93df1ee38f4c2f82e2773e9f098470b"}, + {file = "autoawq-0.2.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:74d2c49780aaa7c7ba0fa4e1f196ac2dc4bdceba27e780115e7dfb32f1ba3c0a"}, + {file = "autoawq-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:43651382592e348c8f44bdc6796b9fa6fc5bd398f58908410376f0b7aaa2b3b3"}, + {file = "autoawq-0.2.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:a40c12fc4ddeabec6f04a2179e720e79563bfe29646ddf9c130bce0bcb51a760"}, + {file = "autoawq-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3c5dd45bcf23d8a0de2d79a04baf65fb2208249babeb729274c97df6218d48ae"}, +] + +[package.dependencies] +accelerate = "*" +autoawq-kernels = "*" +datasets = "*" +tokenizers = ">=0.12.1" +torch = ">=2.0.1" +transformers = ">=4.35.0" +typing-extensions = ">=4.8.0" +zstandard = "*" + +[package.extras] +dev = ["black", "griffe-typingdoc", "mkdocs-material", "mkdocstrings-python"] +eval = ["evaluate", "lm-eval (>=0.4.0)", "protobuf", "scipy", "tabulate"] + +[[package]] +name = "autoawq-kernels" +version = "0.0.7" +description = "AutoAWQ Kernels implements the AWQ kernels." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "autoawq_kernels-0.0.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:925d9ed6ffa66073b1fed47aa1a5052b413a120af63964d89456fb4410b8a1be"}, + {file = "autoawq_kernels-0.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:75cc8b721f8f49399188c39394da7de464e3939b42064a0ac22f8a6f8a399f25"}, + {file = "autoawq_kernels-0.0.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:0bb2fb6cdc9a990cc05f95068c1979673ebdc7207326eb56fe3c0fa1e78b9057"}, + {file = "autoawq_kernels-0.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:cf1680197c68052dadc205d329e8aa89dffc56f201af890ab8d2904aef95f634"}, + {file = "autoawq_kernels-0.0.7-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:e0344a16a58031ffd287e18c2802f5dd9ba3719b7327b01ce5dc92e160c57f56"}, + {file = "autoawq_kernels-0.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:814e28fa0a76f108c796703ee73a53fb3f974d64610364855ee5925eed87b67b"}, + {file = "autoawq_kernels-0.0.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:7465a0900fb608de99066d662d6f01fab389916517b139e9496c9f09a3c4fdc1"}, + {file = "autoawq_kernels-0.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:b3d834b92b06ba9502998d85502fb077c16ee320743f5877e95775d4e59faa4c"}, +] + +[package.dependencies] +torch = "2.3.1" + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "base58" +version = "2.1.1" +description = "Base58 and Base58Check implementation." +optional = false +python-versions = ">=3.5" +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + +[package.extras] +tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bitsandbytes" +version = "0.43.3" +description = "k-bit optimizers and matrix multiplication routines." +optional = false +python-versions = "*" +files = [ + {file = "bitsandbytes-0.43.3-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:cc99507c352be0715098b2c7577b690dd158972dc4ea10c7495bac104c7c79f0"}, + {file = "bitsandbytes-0.43.3-py3-none-win_amd64.whl", hash = "sha256:257f6552f2144748a84e6c44e1f7a98f3da888f675ed74e18fd7f7eb13c6cafa"}, +] + +[package.dependencies] +numpy = "*" +torch = "*" + +[package.extras] +benchmark = ["matplotlib", "pandas"] +test = ["scipy"] + +[[package]] +name = "bittensor" +version = "7.1.2" +description = "bittensor" +optional = false +python-versions = ">=3.9" +files = [] +develop = false + +[package.dependencies] +aiohttp = "3.9.0b0" +ansible = "6.7.0" +ansible_vault = "2.1.0" +backoff = "*" +black = "23.7.0" +certifi = "2024.2.2" +colorama = "0.4.6" +cryptography = "42.0.5" +ddt = "1.6.0" +eth-utils = "<2.3.0" +fastapi = "0.110.1" +fuzzywuzzy = ">=0.18.0" +msgpack-numpy-opentensor = "0.5.0" +munch = "2.5.0" +nest_asyncio = "*" +netaddr = "*" +numpy = "*" +packaging = "*" +password_strength = "*" +pycryptodome = ">=3.18.0,<4.0.0" +pydantic = ">=2.3,<3" +PyNaCl = ">=1.3.0,<=1.5.0" +pytest = "*" +pytest-asyncio = "*" +python-Levenshtein = "*" +python-statemachine = "2.1.2" +pyyaml = "*" +requests = "*" +retry = "*" +rich = "*" +scalecodec = "1.2.11" +shtab = ">=1.6.5,<1.7.0" +substrate-interface = ">=1.7.9,<1.8.0" +termcolor = "*" +tqdm = "*" +uvicorn = "0.22.0" +wheel = "*" + +[package.extras] +dev = ["aioresponses (==0.7.6)", "coveralls (==3.3.1)", "ddt (==1.6.0)", "factory-boy (==3.3.0)", "flake8 (==7.0.0)", "freezegun (==1.5.0)", "hypothesis (==6.81.1)", "mypy (==1.8.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-mock (==3.12.0)", "pytest-rerunfailures (==10.2)", "pytest-split (==0.8.0)", "pytest-xdist (==3.0.2)", "torch (>=1.13.1)", "types-retry (==0.9.9.4)"] +torch = ["torch (>=1.13.1)"] + +[package.source] +type = "git" +url = "https://github.com/opentensor/bittensor.git" +reference = "release/7.1.2" +resolved_reference = "34f257c457281c307b2be656db782deb9826073c" + +[[package]] +name = "black" +version = "23.7.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, + {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, + {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, + {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, + {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, + {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, + {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "boltons" +version = "24.0.0" +description = "When they're not builtins, they're boltons." +optional = false +python-versions = ">=3.7" +files = [ + {file = "boltons-24.0.0-py3-none-any.whl", hash = "sha256:9618695a6ec4f50412e7072e5d78910a00b4111d0b9b549e4a3d60bc321e7807"}, + {file = "boltons-24.0.0.tar.gz", hash = "sha256:7153feccaea1ff2e1472f68d4b57fadb796a2ee49d29f638f1c9cd8fb5ebd916"}, +] + +[[package]] +name = "bs4" +version = "0.0.2" +description = "Dummy package for Beautiful Soup (beautifulsoup4)" +optional = false +python-versions = "*" +files = [ + {file = "bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"}, + {file = "bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.17.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = true +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "cmake" +version = "3.30.2" +description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" +optional = true +python-versions = ">=3.7" +files = [ + {file = "cmake-3.30.2-py3-none-macosx_11_0_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.whl", hash = "sha256:e706eded76e0e8b09d2cf09cbab0a930f6550084a85950982b7c53f6a79a0451"}, + {file = "cmake-3.30.2-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:48e0998068d785d3b78cc60a7e3d38fd71cfb942ce0a72ee046de38ec2bd6523"}, + {file = "cmake-3.30.2-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:709568c04f60f6dbee846a997a774ae28e12e809b4cbb12b6cd00767c111ede0"}, + {file = "cmake-3.30.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d0b29a92cf31c54ab21040e84a78420abbf59cdd73c30d05e0e70229b2e9348"}, + {file = "cmake-3.30.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6021b64ec6ddf43ff5887e510f897468a281f1822feedf48edf86926288a48a7"}, + {file = "cmake-3.30.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:27f9f8b8a442d489cf4ae5dae1e475430979e9fcfbaef5fd0810aac4206548a9"}, + {file = "cmake-3.30.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe4f48bb96fadef92697ccaeb98b22ff36b3add80e45ce48e0c67462846fd242"}, + {file = "cmake-3.30.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9beca135489d56a89cf54cf3d324bcf8dd6c50cc9bdb76b9a97e8540935797b2"}, + {file = "cmake-3.30.2-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:02657456811a8dd95d07728e0878ee6e09d0466de84319513af99490beefe753"}, + {file = "cmake-3.30.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:ee421b9531279b88e54c4bd3ff41c538d1f563e75b1340a8eb2569c38949d230"}, + {file = "cmake-3.30.2-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:806d3295c75ae4f9bd53100b4cdd17c00b41e1606a6cff6faf1f599fdace7d71"}, + {file = "cmake-3.30.2-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:b58b658f3ea47b1b6deb8fab817bf68a9c7f00fde514ad344b9cef16d684206a"}, + {file = "cmake-3.30.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:fef0b8a18a6376ff430e86bedcccb4018b344295a17584aaebf1b7339c92f505"}, + {file = "cmake-3.30.2-py3-none-win32.whl", hash = "sha256:977acfb5256e29bc9e14004a2350a7f8bb6a2c5d42ad74183fb64275b99af2fa"}, + {file = "cmake-3.30.2-py3-none-win_amd64.whl", hash = "sha256:894214560a6d70af6e88d8506f41f6911c31757a7799eced3322ca1fc4c76e4a"}, + {file = "cmake-3.30.2-py3-none-win_arm64.whl", hash = "sha256:33e6ce72a4865b25f7f61e40e634382a7cfbe494785ce3c0aa94475b5e0f9252"}, + {file = "cmake-3.30.2.tar.gz", hash = "sha256:54dba98c12c6b77bd86b452b71c7f7f3b04027081f3451e18cdf2d926e4695e5"}, +] + +[package.extras] +test = ["coverage (>=4.2)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "cryptography" +version = "42.0.5" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "ctranslate2" +version = "4.3.1" +description = "Fast inference engine for Transformer models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ctranslate2-4.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e962c9dc3ddfacf60f2467bea5f91f75239c3d9c17656e4b0c569d956d662b99"}, + {file = "ctranslate2-4.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:49a0d9136d577b667c1bb450267248d9cf205b5eb28b89b3f70c296ec5285da8"}, + {file = "ctranslate2-4.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:343b24fe3d8a5b6a7c8082332415767bef7ceaf15bb43d0cec7e83665108c51e"}, + {file = "ctranslate2-4.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d95ecb440e4985cad4623a1fe7bb91406bab4aa55b00aa89a0c16eb5939d640"}, + {file = "ctranslate2-4.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:febf7cf0fb641c76035cdece58e97d27f4e8950a5e32fc480f9afa1bcbbb856c"}, + {file = "ctranslate2-4.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a49dc5d339e2f4ed016553db0d0e6cbd369742697c87c6cc0cc15a47c7c72d00"}, + {file = "ctranslate2-4.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:def98f6f8900470b2cec9408e5b0402af75f40f771391ebacd2b60666b8d75b9"}, + {file = "ctranslate2-4.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c02fcd5a7be93bf42a8adf81a9ac4f394e23bd639192907b2e11feae589971"}, + {file = "ctranslate2-4.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a06043910a7dee91ea03634be2cff2e1338a9f87bb51e062c03bae69e2c826b6"}, + {file = "ctranslate2-4.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:6f49834b63848f17dfdc1b2b8c632c31932ad69e130ce0f7b1e2505aa3923e6c"}, + {file = "ctranslate2-4.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fcf649d976070ddd33cdda00a7a60fde6f1fbe27d65d2c6141dd95153f965f01"}, + {file = "ctranslate2-4.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f63f779f1d4518acdc694b1938887d4f28613ac2dfe507ccc2c0d56dd8c95b40"}, + {file = "ctranslate2-4.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68301fbc5fb7daa609eb12ca6c2ed8aa29852c20f962532317762d1889e751d9"}, + {file = "ctranslate2-4.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45c5b352783bd3806f0c9f5dcbfa49d89c0dde71cb7d1b1c527c525e85af3ded"}, + {file = "ctranslate2-4.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08626f115d5a39c56a666680735d6eebfc4d8a215288896d4d8afc14cfcdcffe"}, + {file = "ctranslate2-4.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e40d43c5f7d25f40d31cca0541cf21c2846f89509b99189d340fdee595391196"}, + {file = "ctranslate2-4.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f352bcb802ab9ff1b94a25b4915c4f9f97cdd230993cf45ea290592d8997c2e2"}, + {file = "ctranslate2-4.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c202011fa2ebb8129ba98a65df48df075f0ef53f905f2b13b8cd00f31c7ccff"}, + {file = "ctranslate2-4.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bca2ce519c497bc2f79e567093609d7bdfaff3313220e0d831797288803f3aa"}, + {file = "ctranslate2-4.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ef812a4129e877f64f8ca2438b6247060af0f053a56b438dbfa81dae9ca12675"}, + {file = "ctranslate2-4.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d8679354547260db999c2bcc6f11a31dad828c3d896d6120045bd0333940732f"}, + {file = "ctranslate2-4.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:60bc176dd2e0ee6ddd33682401440f7626d115fed4f1e5e6816d9f7f213d1a62"}, + {file = "ctranslate2-4.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d394367fe472b6540489e3b081fc7e17cea2264075b074fb28eca30ff63463f"}, + {file = "ctranslate2-4.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f1fd426d9019198d0fd8f37a18bf9c486241f711d597686956c58cd7676d564"}, + {file = "ctranslate2-4.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:de05e33790d72492a76101a0357c3d87d97ad53af84417c78f45e85df76d39e8"}, +] + +[package.dependencies] +numpy = "*" +pyyaml = ">=5.3,<7" +setuptools = "*" + +[[package]] +name = "cytoolz" +version = "0.12.3" +description = "Cython implementation of Toolz: High performance functional utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cytoolz-0.12.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bbe58e26c84b163beba0fbeacf6b065feabc8f75c6d3fe305550d33f24a2d346"}, + {file = "cytoolz-0.12.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c51b66ada9bfdb88cf711bf350fcc46f82b83a4683cf2413e633c31a64df6201"}, + {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e70d9c615e5c9dc10d279d1e32e846085fe1fd6f08d623ddd059a92861f4e3dd"}, + {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a83f4532707963ae1a5108e51fdfe1278cc8724e3301fee48b9e73e1316de64f"}, + {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d028044524ee2e815f36210a793c414551b689d4f4eda28f8bbb0883ad78bf5f"}, + {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c2875bcd1397d0627a09a4f9172fa513185ad302c63758efc15b8eb33cc2a98"}, + {file = "cytoolz-0.12.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:131ff4820e5d64a25d7ad3c3556f2d8aa65c66b3f021b03f8a8e98e4180dd808"}, + {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04afa90d9d9d18394c40d9bed48c51433d08b57c042e0e50c8c0f9799735dcbd"}, + {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:dc1ca9c610425f9854323669a671fc163300b873731584e258975adf50931164"}, + {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bfa3f8e01bc423a933f2e1c510cbb0632c6787865b5242857cc955cae220d1bf"}, + {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f702e295dddef5f8af4a456db93f114539b8dc2a7a9bc4de7c7e41d169aa6ec3"}, + {file = "cytoolz-0.12.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0fbad1fb9bb47e827d00e01992a099b0ba79facf5e5aa453be066033232ac4b5"}, + {file = "cytoolz-0.12.3-cp310-cp310-win32.whl", hash = "sha256:8587c3c3dbe78af90c5025288766ac10dc2240c1e76eb0a93a4e244c265ccefd"}, + {file = "cytoolz-0.12.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e45803d9e75ef90a2f859ef8f7f77614730f4a8ce1b9244375734567299d239"}, + {file = "cytoolz-0.12.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ac4f2fb38bbc67ff1875b7d2f0f162a247f43bd28eb7c9d15e6175a982e558d"}, + {file = "cytoolz-0.12.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0cf1e1e96dd86829a0539baf514a9c8473a58fbb415f92401a68e8e52a34ecd5"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08a438701c6141dd34eaf92e9e9a1f66e23a22f7840ef8a371eba274477de85d"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b6f11b0d7ed91be53166aeef2a23a799e636625675bb30818f47f41ad31821"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7fde09384d23048a7b4ac889063761e44b89a0b64015393e2d1d21d5c1f534a"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d3bfe45173cc8e6c76206be3a916d8bfd2214fb2965563e288088012f1dabfc"}, + {file = "cytoolz-0.12.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27513a5d5b6624372d63313574381d3217a66e7a2626b056c695179623a5cb1a"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d294e5e81ff094fe920fd545052ff30838ea49f9e91227a55ecd9f3ca19774a0"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:727b01a2004ddb513496507a695e19b5c0cfebcdfcc68349d3efd92a1c297bf4"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:fe1e1779a39dbe83f13886d2b4b02f8c4b10755e3c8d9a89b630395f49f4f406"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:de74ef266e2679c3bf8b5fc20cee4fc0271ba13ae0d9097b1491c7a9bcadb389"}, + {file = "cytoolz-0.12.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e04d22049233394e0b08193aca9737200b4a2afa28659d957327aa780ddddf2"}, + {file = "cytoolz-0.12.3-cp311-cp311-win32.whl", hash = "sha256:20d36430d8ac809186736fda735ee7d595b6242bdb35f69b598ef809ebfa5605"}, + {file = "cytoolz-0.12.3-cp311-cp311-win_amd64.whl", hash = "sha256:780c06110f383344d537f48d9010d79fa4f75070d214fc47f389357dd4f010b6"}, + {file = "cytoolz-0.12.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:86923d823bd19ce35805953b018d436f6b862edd6a7c8b747a13d52b39ed5716"}, + {file = "cytoolz-0.12.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3e61acfd029bfb81c2c596249b508dfd2b4f72e31b7b53b62e5fb0507dd7293"}, + {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd728f4e6051af6af234651df49319da1d813f47894d4c3c8ab7455e01703a37"}, + {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe8c6267caa7ec67bcc37e360f0d8a26bc3bdce510b15b97f2f2e0143bdd3673"}, + {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99462abd8323c52204a2a0ce62454ce8fa0f4e94b9af397945c12830de73f27e"}, + {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da125221b1fa25c690fcd030a54344cecec80074df018d906fc6a99f46c1e3a6"}, + {file = "cytoolz-0.12.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c18e351956f70db9e2d04ff02f28e9a41839250d3f936a4c8a1eabd1c3094d2"}, + {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:921e6d2440ac758c4945c587b1d1d9b781b72737ac0c0ca5d5e02ca1db8bded2"}, + {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1651a9bd591a8326329ce1d6336f3129161a36d7061a4d5ea9e5377e033364cf"}, + {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8893223b87c2782bd59f9c4bd5c7bf733edd8728b523c93efb91d7468b486528"}, + {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:e4d2961644153c5ae186db964aa9f6109da81b12df0f1d3494b4e5cf2c332ee2"}, + {file = "cytoolz-0.12.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:71b6eb97f6695f7ba8ce69c49b707a351c5f46fd97f5aeb5f6f2fb0d6e72b887"}, + {file = "cytoolz-0.12.3-cp312-cp312-win32.whl", hash = "sha256:cee3de65584e915053412cd178729ff510ad5f8f585c21c5890e91028283518f"}, + {file = "cytoolz-0.12.3-cp312-cp312-win_amd64.whl", hash = "sha256:9eef0d23035fa4dcfa21e570961e86c375153a7ee605cdd11a8b088c24f707f6"}, + {file = "cytoolz-0.12.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9a38332cfad2a91e89405b7c18b3f00e2edc951c225accbc217597d3e4e9fde"}, + {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f501ae1353071fa5d6677437bbeb1aeb5622067dce0977cedc2c5ec5843b202"}, + {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56f899758146a52e2f8cfb3fb6f4ca19c1e5814178c3d584de35f9e4d7166d91"}, + {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:800f0526adf9e53d3c6acda748f4def1f048adaa780752f154da5cf22aa488a2"}, + {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0976a3fcb81d065473173e9005848218ce03ddb2ec7d40dd6a8d2dba7f1c3ae"}, + {file = "cytoolz-0.12.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c835eab01466cb67d0ce6290601ebef2d82d8d0d0a285ed0d6e46989e4a7a71a"}, + {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4fba0616fcd487e34b8beec1ad9911d192c62e758baa12fcb44448b9b6feae22"}, + {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6f6e8207d732651e0204779e1ba5a4925c93081834570411f959b80681f8d333"}, + {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8119bf5961091cfe644784d0bae214e273b3b3a479f93ee3baab97bbd995ccfe"}, + {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7ad1331cb68afeec58469c31d944a2100cee14eac221553f0d5218ace1a0b25d"}, + {file = "cytoolz-0.12.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:92c53d508fb8a4463acc85b322fa24734efdc66933a5c8661bdc862103a3373d"}, + {file = "cytoolz-0.12.3-cp37-cp37m-win32.whl", hash = "sha256:2c6dd75dae3d84fa8988861ab8b1189d2488cb8a9b8653828f9cd6126b5e7abd"}, + {file = "cytoolz-0.12.3-cp37-cp37m-win_amd64.whl", hash = "sha256:caf07a97b5220e6334dd32c8b6d8b2bd255ca694eca5dfe914bb5b880ee66cdb"}, + {file = "cytoolz-0.12.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed0cfb9326747759e2ad81cb6e45f20086a273b67ac3a4c00b19efcbab007c60"}, + {file = "cytoolz-0.12.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:96a5a0292575c3697121f97cc605baf2fd125120c7dcdf39edd1a135798482ca"}, + {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b76f2f50a789c44d6fd7f773ec43d2a8686781cd52236da03f7f7d7998989bee"}, + {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2905fdccacc64b4beba37f95cab9d792289c80f4d70830b70de2fc66c007ec01"}, + {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ebe23028eac51251f22ba01dba6587d30aa9c320372ca0c14eeab67118ec3f"}, + {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96c715404a3825e37fe3966fe84c5f8a1f036e7640b2a02dbed96cac0c933451"}, + {file = "cytoolz-0.12.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bac0adffc1b6b6a4c5f1fd1dd2161afb720bcc771a91016dc6bdba59af0a5d3"}, + {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:37441bf4a2a4e2e0fe9c3b0ea5e72db352f5cca03903977ffc42f6f6c5467be9"}, + {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f04037302049cb30033f7fa4e1d0e44afe35ed6bfcf9b380fc11f2a27d3ed697"}, + {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f37b60e66378e7a116931d7220f5352186abfcc950d64856038aa2c01944929c"}, + {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ec9be3e4b6f86ea8b294d34c990c99d2ba6c526ef1e8f46f1d52c263d4f32cd7"}, + {file = "cytoolz-0.12.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e9199c9e3fbf380a92b8042c677eb9e7ed4bccb126de5e9c0d26f5888d96788"}, + {file = "cytoolz-0.12.3-cp38-cp38-win32.whl", hash = "sha256:18cd61e078bd6bffe088e40f1ed02001387c29174750abce79499d26fa57f5eb"}, + {file = "cytoolz-0.12.3-cp38-cp38-win_amd64.whl", hash = "sha256:765b8381d4003ceb1a07896a854eee2c31ebc950a4ae17d1e7a17c2a8feb2a68"}, + {file = "cytoolz-0.12.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b4a52dd2a36b0a91f7aa50ca6c8509057acc481a24255f6cb07b15d339a34e0f"}, + {file = "cytoolz-0.12.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:581f1ce479769fe7eeb9ae6d87eadb230df8c7c5fff32138162cdd99d7fb8fc3"}, + {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46f505d4c6eb79585c8ad0b9dc140ef30a138c880e4e3b40230d642690e36366"}, + {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59276021619b432a5c21c01cda8320b9cc7dbc40351ffc478b440bfccd5bbdd3"}, + {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e44f4c25e1e7cf6149b499c74945a14649c8866d36371a2c2d2164e4649e7755"}, + {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c64f8e60c1dd69e4d5e615481f2d57937746f4a6be2d0f86e9e7e3b9e2243b5e"}, + {file = "cytoolz-0.12.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33c63186f3bf9d7ef1347bc0537bb9a0b4111a0d7d6e619623cabc18fef0dc3b"}, + {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fdddb9d988405f24035234f1e8d1653ab2e48cc2404226d21b49a129aefd1d25"}, + {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6986632d8a969ea1e720990c818dace1a24c11015fd7c59b9fea0b65ef71f726"}, + {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0ba1cbc4d9cd7571c917f88f4a069568e5121646eb5d82b2393b2cf84712cf2a"}, + {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7d267ffc9a36c0a9a58c7e0adc9fa82620f22e4a72533e15dd1361f57fc9accf"}, + {file = "cytoolz-0.12.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95e878868a172a41fbf6c505a4b967309e6870e22adc7b1c3b19653d062711fa"}, + {file = "cytoolz-0.12.3-cp39-cp39-win32.whl", hash = "sha256:8e21932d6d260996f7109f2a40b2586070cb0a0cf1d65781e156326d5ebcc329"}, + {file = "cytoolz-0.12.3-cp39-cp39-win_amd64.whl", hash = "sha256:0d8edfbc694af6c9bda4db56643fb8ed3d14e47bec358c2f1417de9a12d6d1fb"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:55f9bd1ae6c2a27eda5abe2a0b65a83029d2385c5a1da7b8ef47af5905d7e905"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2d271393c378282727f1231d40391ae93b93ddc0997448acc21dd0cb6a1e56d"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee98968d6a66ee83a8ceabf31182189ab5d8598998c8ce69b6d5843daeb2db60"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01cfb8518828c1189200c02a5010ea404407fb18fd5589e29c126e84bbeadd36"}, + {file = "cytoolz-0.12.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:456395d7aec01db32bf9e6db191d667347c78d8d48e77234521fa1078f60dabb"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cd88028bb897fba99ddd84f253ca6bef73ecb7bdf3f3cf25bc493f8f97d3c7c5"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b19223e7f7bd7a73ec3aa6fdfb73b579ff09c2bc0b7d26857eec2d01a58c76"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a79d72b08048a0980a59457c239555f111ac0c8bdc140c91a025f124104dbb4"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dd70141b32b717696a72b8876e86bc9c6f8eff995c1808e299db3541213ff82"}, + {file = "cytoolz-0.12.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a1445c91009eb775d479e88954c51d0b4cf9a1e8ce3c503c2672d17252882647"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ca6a9a9300d5bda417d9090107c6d2b007683efc59d63cc09aca0e7930a08a85"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be6feb903d2a08a4ba2e70e950e862fd3be9be9a588b7c38cee4728150a52918"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b6f43f086e5a965d33d62a145ae121b4ccb6e0789ac0acc895ce084fec8c65"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:534fa66db8564d9b13872d81d54b6b09ae592c585eb826aac235bd6f1830f8ad"}, + {file = "cytoolz-0.12.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:fea649f979def23150680de1bd1d09682da3b54932800a0f90f29fc2a6c98ba8"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a447247ed312dd64e3a8d9483841ecc5338ee26d6e6fbd29cd373ed030db0240"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba3f843aa89f35467b38c398ae5b980a824fdbdb94065adc6ec7c47a0a22f4c7"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:582c22f97a380211fb36a7b65b1beeb84ea11d82015fa84b054be78580390082"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47feb089506fc66e1593cd9ade3945693a9d089a445fbe9a11385cab200b9f22"}, + {file = "cytoolz-0.12.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ba9002d2f043943744a9dc8e50a47362bcb6e6f360dc0a1abcb19642584d87bb"}, + {file = "cytoolz-0.12.3.tar.gz", hash = "sha256:4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282"}, +] + +[package.dependencies] +toolz = ">=0.8.0" + +[package.extras] +cython = ["cython"] + +[[package]] +name = "datasets" +version = "2.14.6" +description = "HuggingFace community-driven open-source library of datasets" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "datasets-2.14.6-py3-none-any.whl", hash = "sha256:4de857ffce21cfc847236745c69f102e33cd1f0fa8398e7be9964525fd4cd5db"}, + {file = "datasets-2.14.6.tar.gz", hash = "sha256:97ebbace8ec7af11434a87d1215379927f8fee2beab2c4a674003756ecfe920c"}, +] + +[package.dependencies] +aiohttp = "*" +dill = ">=0.3.0,<0.3.8" +fsspec = {version = ">=2023.1.0,<=2023.10.0", extras = ["http"]} +huggingface-hub = ">=0.14.0,<1.0.0" +multiprocess = "*" +numpy = ">=1.17" +packaging = "*" +pandas = "*" +pyarrow = ">=8.0.0" +pyyaml = ">=5.1" +requests = ">=2.19.0" +tqdm = ">=4.62.1" +xxhash = "*" + +[package.extras] +apache-beam = ["apache-beam (>=2.26.0,<2.44.0)"] +audio = ["librosa", "soundfile (>=0.12.1)"] +benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"] +dev = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "black (>=23.1,<24.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "pyyaml (>=5.3.1)", "rarfile (>=4.0)", "ruff (>=0.0.241)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] +docs = ["s3fs", "tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos", "torch", "transformers"] +jax = ["jax (>=0.2.8,!=0.3.2,<=0.3.25)", "jaxlib (>=0.1.65,<=0.3.25)"] +metrics-tests = ["Werkzeug (>=1.0.1)", "accelerate", "bert-score (>=0.3.6)", "jiwer", "langdetect", "mauve-text", "nltk", "requests-file (>=1.5.1)", "rouge-score", "sacrebleu", "sacremoses", "scikit-learn", "scipy", "sentencepiece", "seqeval", "six (>=1.15.0,<1.16.0)", "spacy (>=3.0.0)", "texttable (>=1.6.3)", "tldextract", "tldextract (>=3.1.0)", "toml (>=0.10.1)", "typer (<0.5.0)"] +quality = ["black (>=23.1,<24.0)", "pyyaml (>=5.3.1)", "ruff (>=0.0.241)"] +s3 = ["s3fs"] +tensorflow = ["tensorflow (>=2.2.0,!=2.6.0,!=2.6.1)", "tensorflow-macos"] +tensorflow-gpu = ["tensorflow-gpu (>=2.2.0,!=2.6.0,!=2.6.1)"] +tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0)", "elasticsearch (<8.0.0)", "faiss-cpu (>=1.6.4)", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "sqlalchemy (<2.0.0)", "tensorflow (>=2.3,!=2.6.0,!=2.6.1)", "tensorflow-macos", "tiktoken", "torch", "transformers", "zstandard"] +torch = ["torch"] +vision = ["Pillow (>=6.2.1)"] + +[[package]] +name = "ddt" +version = "1.6.0" +description = "Data-Driven/Decorated Tests" +optional = false +python-versions = "*" +files = [ + {file = "ddt-1.6.0-py2.py3-none-any.whl", hash = "sha256:e3c93b961a108b4f4d5a6c7f2263513d928baf3bb5b32af8e1c804bfb041141d"}, + {file = "ddt-1.6.0.tar.gz", hash = "sha256:f71b348731b8c78c3100bffbd951a769fbd439088d1fdbb3841eee019af80acd"}, +] + +[[package]] +name = "debugpy" +version = "1.8.5" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, + {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, + {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, + {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, + {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, + {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, + {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, + {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, + {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, + {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, + {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, + {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, + {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, + {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, + {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, + {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, + {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, + {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, + {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, + {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, + {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, + {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "dill" +version = "0.3.7" +description = "serialize all of Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "diskcache" +version = "5.6.3" +description = "Disk Cache -- Disk and file backed persistent cache." +optional = true +python-versions = ">=3" +files = [ + {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, + {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, +] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "docker-pycreds" +version = "0.4.0" +description = "Python bindings for the docker credentials store API" +optional = false +python-versions = "*" +files = [ + {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, + {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, +] + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +name = "ecdsa" +version = "0.19.0" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" +files = [ + {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, + {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "einops" +version = "0.8.0" +description = "A new flavour of deep learning operations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "einops-0.8.0-py3-none-any.whl", hash = "sha256:9572fb63046264a862693b0a87088af3bdc8c068fde03de63453cbbde245465f"}, + {file = "einops-0.8.0.tar.gz", hash = "sha256:63486517fed345712a8385c100cb279108d9d47e6ae59099b07657e983deae85"}, +] + +[[package]] +name = "eth-hash" +version = "0.7.0" +description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" +optional = false +python-versions = ">=3.8, <4" +files = [ + {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"}, + {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"}, +] + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +pycryptodome = ["pycryptodome (>=3.6.6,<4)"] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "eth-keys" +version = "0.5.1" +description = "eth-keys: Common API for Ethereum key operations" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "eth_keys-0.5.1-py3-none-any.whl", hash = "sha256:ad13d920a2217a49bed3a1a7f54fb0980f53caf86d3bbab2139fd3330a17b97e"}, + {file = "eth_keys-0.5.1.tar.gz", hash = "sha256:2b587e4bbb9ac2195215a7ab0c0fb16042b17d4ec50240ed670bbb8f53da7a48"}, +] + +[package.dependencies] +eth-typing = ">=3" +eth-utils = ">=2" + +[package.extras] +coincurve = ["coincurve (>=12.0.0)"] +dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "ipython", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["towncrier (>=21,<22)"] +test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)"] + +[[package]] +name = "eth-typing" +version = "5.0.0" +description = "eth-typing: Common type annotations for ethereum python packages" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "eth_typing-5.0.0-py3-none-any.whl", hash = "sha256:c7ebc8595e7b65175bb4b4176c2b548ab21b13329f2058e84d4f8c289ba9f577"}, + {file = "eth_typing-5.0.0.tar.gz", hash = "sha256:87ce7cee75665c09d2dcff8de1b496609d5e32fcd2e2b1d8fc0370c29eedcdc0"}, +] + +[package.dependencies] +typing-extensions = ">=4.5.0" + +[package.extras] +dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "eth-utils" +version = "2.2.2" +description = "eth-utils: Common utility functions for python code that interacts with Ethereum" +optional = false +python-versions = ">=3.7,<4" +files = [ + {file = "eth-utils-2.2.2.tar.gz", hash = "sha256:5ca6265177ce544d9d43cdf2272ae2227e5d6d9529c270bbb707d17339087101"}, + {file = "eth_utils-2.2.2-py3-none-any.whl", hash = "sha256:2580a8065273f62ca1ec4c175228c52e626a5f1007e965d2117e5eca1a93cae8"}, +] + +[package.dependencies] +cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} +eth-hash = ">=0.3.1" +eth-typing = ">=3.0.0" +toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} + +[package.extras] +dev = ["black (>=23)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "flake8 (==3.8.3)", "hypothesis (>=4.43.0)", "ipython", "isort (>=5.11.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "types-setuptools", "wheel"] +docs = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=23)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "types-setuptools"] +test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "types-setuptools"] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastapi" +version = "0.110.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.110.1-py3-none-any.whl", hash = "sha256:5df913203c482f820d31f48e635e022f8cbfe7350e4830ef05a3163925b1addc"}, + {file = "fastapi-0.110.1.tar.gz", hash = "sha256:6feac43ec359dfe4f45b2c18ec8c94edb8dc2dfc461d417d9e626590c071baad"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "filelock" +version = "3.15.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +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)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "flake8" +version = "7.1.1" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.12.0,<2.13.0" +pyflakes = ">=3.2.0,<3.3.0" + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {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"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {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"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {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"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {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"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {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"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2023.10.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"}, + {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"}, +] + +[package.dependencies] +aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} +requests = {version = "*", optional = true, markers = "extra == \"http\""} + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "fuzzywuzzy" +version = "0.18.0" +description = "Fuzzy string matching in python" +optional = false +python-versions = "*" +files = [ + {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, + {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, +] + +[package.extras] +speedup = ["python-levenshtein (>=0.12)"] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.43" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = true +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.24.6" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970"}, + {file = "huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[package]] +name = "identify" +version = "2.6.0" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.8" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "intel-openmp" +version = "2021.4.0" +description = "Intel OpenMP* Runtime Library" +optional = false +python-versions = "*" +files = [ + {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, + {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, +] + +[[package]] +name = "interegular" +version = "0.3.3" +description = "a regex intersection checker" +optional = true +python-versions = ">=3.7" +files = [ + {file = "interegular-0.3.3-py37-none-any.whl", hash = "sha256:b0c07007d48c89d6d19f7204972d369b2a77222722e126b6aa63aa721dc3b19c"}, + {file = "interegular-0.3.3.tar.gz", hash = "sha256:d9b697b21b34884711399ba0f0376914b81899ce670032486d0d048344a76600"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.26.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, + {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jiter" +version = "0.5.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = true +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.2" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "langchain" +version = "0.2.3" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain-0.2.3-py3-none-any.whl", hash = "sha256:5dc33cd9c8008693d328b7cb698df69073acecc89ad9c2a95f243b3314f8d834"}, + {file = "langchain-0.2.3.tar.gz", hash = "sha256:81962cc72cce6515f7bd71e01542727870789bf8b666c6913d85559080c1a201"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} +langchain-core = ">=0.2.0,<0.3.0" +langchain-text-splitters = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.17,<0.2.0" +numpy = ">=1,<2" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[[package]] +name = "langchain-core" +version = "0.2.19" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_core-0.2.19-py3-none-any.whl", hash = "sha256:5b3cd34395be274c89e822c84f0e03c4da14168c177a83921c5b9414ac7a0651"}, + {file = "langchain_core-0.2.19.tar.gz", hash = "sha256:13043a83e5c9ab58b9f5ce2a56896e7e88b752e8891b2958960a98e71801471e"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.75,<0.2.0" +packaging = ">=23.2,<25" +pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" + +[[package]] +name = "langchain-text-splitters" +version = "0.2.2" +description = "LangChain text splitting utilities" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_text_splitters-0.2.2-py3-none-any.whl", hash = "sha256:1c80d4b11b55e2995f02d2a326c0323ee1eeff24507329bb22924e420c782dff"}, + {file = "langchain_text_splitters-0.2.2.tar.gz", hash = "sha256:a1e45de10919fa6fb080ef0525deab56557e9552083600455cb9fa4238076140"}, +] + +[package.dependencies] +langchain-core = ">=0.2.10,<0.3.0" + +[[package]] +name = "langsmith" +version = "0.1.104" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langsmith-0.1.104-py3-none-any.whl", hash = "sha256:049cd312952a0db9f5edeed3b9a8616e66ef86e5490c835c8bb054569203b0d0"}, + {file = "langsmith-0.1.104.tar.gz", hash = "sha256:7892dfe452d143fba573d7eb28dbff3202d2f2daacab8c7276ffe4a850179d4d"}, +] + +[package.dependencies] +httpx = ">=0.23.0,<1" +orjson = ">=3.9.14,<4.0.0" +pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} +requests = ">=2,<3" + +[[package]] +name = "lark" +version = "1.2.2" +description = "a modern parsing library" +optional = true +python-versions = ">=3.8" +files = [ + {file = "lark-1.2.2-py3-none-any.whl", hash = "sha256:c2276486b02f0f1b90be155f2c8ba4a8e194d42775786db622faccd652d8e80c"}, + {file = "lark-1.2.2.tar.gz", hash = "sha256:ca807d0162cd16cef15a8feecb862d7319e7a09bdb13aef927968e45040fed80"}, +] + +[package.extras] +atomic-cache = ["atomicwrites"] +interegular = ["interegular (>=0.3.1,<0.4.0)"] +nearley = ["js2py"] +regex = ["regex"] + +[[package]] +name = "levenshtein" +version = "0.25.1" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Levenshtein-0.25.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eb4d1ec9f2dcbde1757c4b7fb65b8682bc2de45b9552e201988f287548b7abdf"}, + {file = "Levenshtein-0.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4d9fa3affef48a7e727cdbd0d9502cd060da86f34d8b3627edd769d347570e2"}, + {file = "Levenshtein-0.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1b6cd186e58196ff8b402565317e9346b408d0c04fa0ed12ce4868c0fcb6d03"}, + {file = "Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82637ef5428384dd1812849dd7328992819bf0c4a20bff0a3b3ee806821af7ed"}, + {file = "Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e73656da6cc3e32a6e4bcd48562fcb64599ef124997f2c91f5320d7f1532c069"}, + {file = "Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5abff796f92cdfba69b9cbf6527afae918d0e95cbfac000bd84017f74e0bd427"}, + {file = "Levenshtein-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38827d82f2ca9cb755da6f03e686866f2f411280db005f4304272378412b4cba"}, + {file = "Levenshtein-0.25.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b989df1e3231261a87d68dfa001a2070771e178b09650f9cf99a20e3d3abc28"}, + {file = "Levenshtein-0.25.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2011d3b3897d438a2f88ef7aed7747f28739cae8538ec7c18c33dd989930c7a0"}, + {file = "Levenshtein-0.25.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6c375b33ec7acc1c6855e8ee8c7c8ac6262576ffed484ff5c556695527f49686"}, + {file = "Levenshtein-0.25.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ce0cb9dd012ef1bf4d5b9d40603e7709b6581aec5acd32fcea9b371b294ca7aa"}, + {file = "Levenshtein-0.25.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9da9ecb81bae67d784defed7274f894011259b038ec31f2339c4958157970115"}, + {file = "Levenshtein-0.25.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3bd7be5dbe5f4a1b691f381e39512927b39d1e195bd0ad61f9bf217a25bf36c9"}, + {file = "Levenshtein-0.25.1-cp310-cp310-win32.whl", hash = "sha256:f6abb9ced98261de67eb495b95e1d2325fa42b0344ed5763f7c0f36ee2e2bdba"}, + {file = "Levenshtein-0.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:97581af3e0a6d359af85c6cf06e51f77f4d635f7109ff7f8ed7fd634d8d8c923"}, + {file = "Levenshtein-0.25.1-cp310-cp310-win_arm64.whl", hash = "sha256:9ba008f490788c6d8d5a10735fcf83559965be97e4ef0812db388a84b1cc736a"}, + {file = "Levenshtein-0.25.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f57d9cf06dac55c2d2f01f0d06e32acc074ab9a902921dc8fddccfb385053ad5"}, + {file = "Levenshtein-0.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:22b60c6d791f4ca67a3686b557ddb2a48de203dae5214f220f9dddaab17f44bb"}, + {file = "Levenshtein-0.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d0444ee62eccf1e6cedc7c5bc01a9face6ff70cc8afa3f3ca9340e4e16f601a4"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e8758be8221a274c83924bae8dd8f42041792565a3c3bdd3c10e3f9b4a5f94e"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:147221cfb1d03ed81d22fdd2a4c7fc2112062941b689e027a30d2b75bbced4a3"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a454d5bc4f4a289f5471418788517cc122fcc00d5a8aba78c54d7984840655a2"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c25f3778bbac78286bef2df0ca80f50517b42b951af0a5ddaec514412f79fac"}, + {file = "Levenshtein-0.25.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:181486cf465aff934694cc9a19f3898a1d28025a9a5f80fc1608217e7cd1c799"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8db9f672a5d150706648b37b044dba61f36ab7216c6a121cebbb2899d7dfaa3"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f2a69fe5ddea586d439f9a50d0c51952982f6c0db0e3573b167aa17e6d1dfc48"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3b684675a3bd35efa6997856e73f36c8a41ef62519e0267dcbeefd15e26cae71"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:cc707ef7edb71f6bf8339198b929ead87c022c78040e41668a4db68360129cef"}, + {file = "Levenshtein-0.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:41512c436b8c691326e2d07786d906cba0e92b5e3f455bf338befb302a0ca76d"}, + {file = "Levenshtein-0.25.1-cp311-cp311-win32.whl", hash = "sha256:2a3830175c01ade832ba0736091283f14a6506a06ffe8c846f66d9fbca91562f"}, + {file = "Levenshtein-0.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:9e0af4e6e023e0c8f79af1d1ca5f289094eb91201f08ad90f426d71e4ae84052"}, + {file = "Levenshtein-0.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:38e5d9a1d737d7b49fa17d6a4c03a0359288154bf46dc93b29403a9dd0cd1a7d"}, + {file = "Levenshtein-0.25.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4a40fa16ecd0bf9e557db67131aabeea957f82fe3e8df342aa413994c710c34e"}, + {file = "Levenshtein-0.25.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4f7d2045d5927cffa65a0ac671c263edbfb17d880fdce2d358cd0bda9bcf2b6d"}, + {file = "Levenshtein-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f96590539f9815be70e330b4d2efcce0219db31db5a22fffe99565192f5662"}, + {file = "Levenshtein-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d78512dd25b572046ff86d8903bec283c373063349f8243430866b6a9946425"}, + {file = "Levenshtein-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c161f24a1b216e8555c874c7dd70c1a0d98f783f252a16c9face920a8b8a6f3e"}, + {file = "Levenshtein-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06ebbfd010a00490795f478d18d7fa2ffc79c9c03fc03b678081f31764d16bab"}, + {file = "Levenshtein-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa9ec0a4489ebfb25a9ec2cba064ed68d0d2485b8bc8b7203f84a7874755e0f"}, + {file = "Levenshtein-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26408938a6db7b252824a701545d50dc9cdd7a3e4c7ee70834cca17953b76ad8"}, + {file = "Levenshtein-0.25.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:330ec2faff957281f4e6a1a8c88286d1453e1d73ee273ea0f937e0c9281c2156"}, + {file = "Levenshtein-0.25.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9115d1b08626dfdea6f3955cb49ba5a578f7223205f80ead0038d6fc0442ce13"}, + {file = "Levenshtein-0.25.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:bbd602edab758e93a5c67bf0d8322f374a47765f1cdb6babaf593a64dc9633ad"}, + {file = "Levenshtein-0.25.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b930b4df32cd3aabbed0e9f0c4fdd1ea4090a5c022ba9f1ae4ab70ccf1cf897a"}, + {file = "Levenshtein-0.25.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dd66fb51f88a3f73a802e1ff19a14978ddc9fbcb7ce3a667ca34f95ef54e0e44"}, + {file = "Levenshtein-0.25.1-cp312-cp312-win32.whl", hash = "sha256:386de94bd1937a16ae3c8f8b7dd2eff1b733994ecf56ce4d05dfdd0e776d0261"}, + {file = "Levenshtein-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:9ee1902153d47886c9787598a4a5c324ce7fde44d44daa34fcf3652ac0de21bc"}, + {file = "Levenshtein-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:b56a7e7676093c3aee50402226f4079b15bd21b5b8f1820f9d6d63fe99dc4927"}, + {file = "Levenshtein-0.25.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6b5dfdf6a0e2f35fd155d4c26b03398499c24aba7bc5db40245789c46ad35c04"}, + {file = "Levenshtein-0.25.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:355ff797f704459ddd8b95354d699d0d0642348636c92d5e67b49be4b0e6112b"}, + {file = "Levenshtein-0.25.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:933b827a3b721210fff522f3dca9572f9f374a0e88fa3a6c7ee3164406ae7794"}, + {file = "Levenshtein-0.25.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be1da669a240f272d904ab452ad0a1603452e190f4e03e886e6b3a9904152b89"}, + {file = "Levenshtein-0.25.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:265cbd78962503a26f2bea096258a3b70b279bb1a74a525c671d3ee43a190f9c"}, + {file = "Levenshtein-0.25.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63cc4d53a35e673b12b721a58b197b4a65734688fb72aa1987ce63ed612dca96"}, + {file = "Levenshtein-0.25.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75fee0c471b8799c70dad9d0d5b70f1f820249257f9617601c71b6c1b37bee92"}, + {file = "Levenshtein-0.25.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:045d6b0db124fbd37379b2b91f6d0786c2d9220e7a848e2dd31b99509a321240"}, + {file = "Levenshtein-0.25.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:db7a2e9c51ac9cc2fd5679484f1eac6e0ab2085cb181240445f7fbf10df73230"}, + {file = "Levenshtein-0.25.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c379c588aa0d93d4607db7eb225fd683263d49669b1bbe49e28c978aa6a4305d"}, + {file = "Levenshtein-0.25.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:966dd00424df7f69b78da02a29b530fbb6c1728e9002a2925ed7edf26b231924"}, + {file = "Levenshtein-0.25.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:09daa6b068709cc1e68b670a706d928ed8f0b179a26161dd04b3911d9f757525"}, + {file = "Levenshtein-0.25.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d6bed0792635081accf70a7e11cfece986f744fddf46ce26808cd8bfc067e430"}, + {file = "Levenshtein-0.25.1-cp38-cp38-win32.whl", hash = "sha256:28e7b7faf5a745a690d1b1706ab82a76bbe9fa6b729d826f0cfdd24fd7c19740"}, + {file = "Levenshtein-0.25.1-cp38-cp38-win_amd64.whl", hash = "sha256:8ca0cc9b9e07316b5904f158d5cfa340d55b4a3566ac98eaac9f087c6efb9a1a"}, + {file = "Levenshtein-0.25.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:45682cdb3ac4a5465c01b2dce483bdaa1d5dcd1a1359fab37d26165b027d3de2"}, + {file = "Levenshtein-0.25.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f8dc3e63c4cd746ec162a4cd744c6dde857e84aaf8c397daa46359c3d54e6219"}, + {file = "Levenshtein-0.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:01ad1eb09933a499a49923e74e05b1428ca4ef37fed32965fef23f1334a11563"}, + {file = "Levenshtein-0.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbb4e8c4b8b7bbe0e1aa64710b806b6c3f31d93cb14969ae2c0eff0f3a592db8"}, + {file = "Levenshtein-0.25.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48d1fe224b365975002e3e2ea947cbb91d2936a16297859b71c4abe8a39932c"}, + {file = "Levenshtein-0.25.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a164df16d876aab0a400f72aeac870ea97947ea44777c89330e9a16c7dc5cc0e"}, + {file = "Levenshtein-0.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:995d3bcedcf64be6ceca423f6cfe29184a36d7c4cbac199fdc9a0a5ec7196cf5"}, + {file = "Levenshtein-0.25.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdaf62d637bef6711d6f3457e2684faab53b2db2ed53c05bc0dc856464c74742"}, + {file = "Levenshtein-0.25.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:af9de3b5f8f5f3530cfd97daab9ab480d1b121ef34d8c0aa5bab0c645eae219e"}, + {file = "Levenshtein-0.25.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:78fba73c352383b356a30c4674e39f086ffef7122fa625e7550b98be2392d387"}, + {file = "Levenshtein-0.25.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:9e0df0dcea3943321398f72e330c089b5d5447318310db6f17f5421642f3ade6"}, + {file = "Levenshtein-0.25.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:387f768bb201b9bc45f0f49557e2fb9a3774d9d087457bab972162dcd4fd352b"}, + {file = "Levenshtein-0.25.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dcf931b64311039b43495715e9b795fbd97ab44ba3dd6bf24360b15e4e87649"}, + {file = "Levenshtein-0.25.1-cp39-cp39-win32.whl", hash = "sha256:2449f8668c0bd62a2b305a5e797348984c06ac20903b38b3bab74e55671ddd51"}, + {file = "Levenshtein-0.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:28803fd6ec7b58065621f5ec0d24e44e2a7dc4842b64dcab690cb0a7ea545210"}, + {file = "Levenshtein-0.25.1-cp39-cp39-win_arm64.whl", hash = "sha256:0b074d452dff8ee86b5bdb6031aa32bb2ed3c8469a56718af5e010b9bb5124dc"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e9e060ef3925a68aeb12276f0e524fb1264592803d562ec0306c7c3f5c68eae0"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f84b84049318d44722db307c448f9dcb8d27c73525a378e901189a94889ba61"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e23fdf330cb185a0c7913ca5bd73a189dfd1742eae3a82e31ed8688b191800"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06958e4a81ea0f0b2b7768a2ad05bcd50a9ad04c4d521dd37d5730ff12decdc"}, + {file = "Levenshtein-0.25.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2ea7c34ec22b2fce21299b0caa6dde6bdebafcc2970e265853c9cfea8d1186da"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fddc0ccbdd94f57aa32e2eb3ac8310d08df2e175943dc20b3e1fc7a115850af4"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d52249cb3448bfe661d3d7db3a6673e835c7f37b30b0aeac499a1601bae873d"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8dd4c201b15f8c1e612f9074335392c8208ac147acbce09aff04e3974bf9b16"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23a4d95ce9d44161c7aa87ab76ad6056bc1093c461c60c097054a46dc957991f"}, + {file = "Levenshtein-0.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:65eea8a9c33037b23069dca4b3bc310e3c28ca53f60ec0c958d15c0952ba39fa"}, + {file = "Levenshtein-0.25.1.tar.gz", hash = "sha256:2df14471c778c75ffbd59cb64bbecfd4b0ef320ef9f80e4804764be7d5678980"}, +] + +[package.dependencies] +rapidfuzz = ">=3.8.0,<4.0.0" + +[[package]] +name = "llvmlite" +version = "0.43.0" +description = "lightweight wrapper around basic LLVM functionality" +optional = true +python-versions = ">=3.9" +files = [ + {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, + {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d434ec7e2ce3cc8f452d1cd9a28591745de022f931d67be688a737320dfcead"}, + {file = "llvmlite-0.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6912a87782acdff6eb8bf01675ed01d60ca1f2551f8176a300a886f09e836a6a"}, + {file = "llvmlite-0.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:14f0e4bf2fd2d9a75a3534111e8ebeb08eda2f33e9bdd6dfa13282afacdde0ed"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8d0618cb9bfe40ac38a9633f2493d4d4e9fcc2f438d39a4e854f39cc0f5f98"}, + {file = "llvmlite-0.43.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0a9a1a39d4bf3517f2af9d23d479b4175ead205c592ceeb8b89af48a327ea57"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1da416ab53e4f7f3bc8d4eeba36d801cc1894b9fbfbf2022b29b6bad34a7df2"}, + {file = "llvmlite-0.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977525a1e5f4059316b183fb4fd34fa858c9eade31f165427a3977c95e3ee749"}, + {file = "llvmlite-0.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:d5bd550001d26450bd90777736c69d68c487d17bf371438f975229b2b8241a91"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f99b600aa7f65235a5a05d0b9a9f31150c390f31261f2a0ba678e26823ec38f7"}, + {file = "llvmlite-0.43.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:35d80d61d0cda2d767f72de99450766250560399edc309da16937b93d3b676e7"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eccce86bba940bae0d8d48ed925f21dbb813519169246e2ab292b5092aba121f"}, + {file = "llvmlite-0.43.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df6509e1507ca0760787a199d19439cc887bfd82226f5af746d6977bd9f66844"}, + {file = "llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cd2a7376f7b3367019b664c21f0c61766219faa3b03731113ead75107f3b66c"}, + {file = "llvmlite-0.43.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18e9953c748b105668487b7c81a3e97b046d8abf95c4ddc0cd3c94f4e4651ae8"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74937acd22dc11b33946b67dca7680e6d103d6e90eeaaaf932603bec6fe7b03a"}, + {file = "llvmlite-0.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9efc739cc6ed760f795806f67889923f7274276f0eb45092a1473e40d9b867"}, + {file = "llvmlite-0.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:47e147cdda9037f94b399bf03bfd8a6b6b1f2f90be94a454e3386f006455a9b4"}, + {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, +] + +[[package]] +name = "lm-format-enforcer" +version = "0.10.3" +description = "Enforce the output format (JSON Schema, Regex etc) of a language model" +optional = true +python-versions = "<4.0,>=3.8" +files = [ + {file = "lm_format_enforcer-0.10.3-py3-none-any.whl", hash = "sha256:e71177ec42b9319496040c43488a0921798b411c549c568e99e5c0e0f80f2e96"}, + {file = "lm_format_enforcer-0.10.3.tar.gz", hash = "sha256:673ebee1bc9efa43418d178a62be912ffdd7c728665b9a8a01bdf60826b4c563"}, +] + +[package.dependencies] +interegular = ">=0.3.2" +packaging = "*" +pydantic = ">=1.10.8" +pyyaml = "*" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +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)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mathgenerator" +version = "1.5.0" +description = "An open source solution for generating math problems" +optional = false +python-versions = "*" +files = [] +develop = false + +[package.dependencies] +scipy = "*" +sympy = "*" + +[package.source] +type = "git" +url = "https://github.com/synapse-alpha/mathgenerator.git" +reference = "main" +resolved_reference = "fffe03af250932d114040b6529676e8d6210485b" + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mkl" +version = "2021.4.0" +description = "Intel® oneAPI Math Kernel Library" +optional = false +python-versions = "*" +files = [ + {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, + {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, + {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, + {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, +] + +[package.dependencies] +intel-openmp = "==2021.*" +tbb = "==2021.*" + +[[package]] +name = "more-itertools" +version = "10.4.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.8" +files = [ + {file = "more-itertools-10.4.0.tar.gz", hash = "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923"}, + {file = "more_itertools-10.4.0-py3-none-any.whl", hash = "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27"}, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "msgpack" +version = "1.0.8" +description = "MessagePack serializer" +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, + {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, + {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, + {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, + {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, + {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, + {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, + {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, + {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, + {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, + {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, +] + +[[package]] +name = "msgpack-numpy-opentensor" +version = "0.5.0" +description = "Numpy data serialization using msgpack" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-numpy-opentensor-0.5.0.tar.gz", hash = "sha256:213232c20e2efd528ec8a9882b605e8ad87cfc35b57dfcfefe05d33aaaabe574"}, + {file = "msgpack_numpy_opentensor-0.5.0-py2.py3-none-any.whl", hash = "sha256:8a61c597a976425a87094d8e89846aa9528eb1f037e97ff1428fe3cd61a238e7"}, +] + +[package.dependencies] +msgpack = ">=0.5.2" +numpy = ">=1.9.0" + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "multiprocess" +version = "0.70.15" +description = "better multiprocessing and multithreading in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multiprocess-0.70.15-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:aa36c7ed16f508091438687fe9baa393a7a8e206731d321e443745e743a0d4e5"}, + {file = "multiprocess-0.70.15-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:20e024018c46d0d1602024c613007ac948f9754659e3853b0aa705e83f6931d8"}, + {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_i686.whl", hash = "sha256:e576062981c91f0fe8a463c3d52506e598dfc51320a8dd8d78b987dfca91c5db"}, + {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e73f497e6696a0f5433ada2b3d599ae733b87a6e8b008e387c62ac9127add177"}, + {file = "multiprocess-0.70.15-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73db2e7b32dcc7f9b0f075c2ffa45c90b6729d3f1805f27e88534c8d321a1be5"}, + {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_i686.whl", hash = "sha256:4271647bd8a49c28ecd6eb56a7fdbd3c212c45529ad5303b40b3c65fc6928e5f"}, + {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:cf981fb998d6ec3208cb14f0cf2e9e80216e834f5d51fd09ebc937c32b960902"}, + {file = "multiprocess-0.70.15-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:18f9f2c7063346d1617bd1684fdcae8d33380ae96b99427260f562e1a1228b67"}, + {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_i686.whl", hash = "sha256:0eac53214d664c49a34695e5824872db4006b1a465edd7459a251809c3773370"}, + {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1a51dd34096db47fb21fa2b839e615b051d51b97af9a67afbcdaa67186b44883"}, + {file = "multiprocess-0.70.15-py310-none-any.whl", hash = "sha256:7dd58e33235e83cf09d625e55cffd7b0f0eede7ee9223cdd666a87624f60c21a"}, + {file = "multiprocess-0.70.15-py311-none-any.whl", hash = "sha256:134f89053d82c9ed3b73edd3a2531eb791e602d4f4156fc92a79259590bd9670"}, + {file = "multiprocess-0.70.15-py37-none-any.whl", hash = "sha256:f7d4a1629bccb433114c3b4885f69eccc200994323c80f6feee73b0edc9199c5"}, + {file = "multiprocess-0.70.15-py38-none-any.whl", hash = "sha256:bee9afba476c91f9ebee7beeee0601face9eff67d822e893f9a893725fbd6316"}, + {file = "multiprocess-0.70.15-py39-none-any.whl", hash = "sha256:3e0953f5d52b4c76f1c973eaf8214554d146f2be5decb48e928e55c7a2d19338"}, + {file = "multiprocess-0.70.15.tar.gz", hash = "sha256:f20eed3036c0ef477b07a4177cf7c1ba520d9a2677870a4f47fe026f0cd6787e"}, +] + +[package.dependencies] +dill = ">=0.3.7" + +[[package]] +name = "munch" +version = "2.5.0" +description = "A dot-accessible dictionary (a la JavaScript objects)" +optional = false +python-versions = "*" +files = [ + {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, + {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +testing = ["astroid (>=1.5.3,<1.6.0)", "astroid (>=2.0)", "coverage", "pylint (>=1.7.2,<1.8.0)", "pylint (>=2.3.1,<2.4.0)", "pytest"] +yaml = ["PyYAML (>=5.1.0)"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "netaddr" +version = "1.3.0" +description = "A network address manipulation library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"}, + {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, +] + +[package.extras] +nicer-shell = ["ipython"] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "ninja" +version = "1.11.1.1" +description = "Ninja is a small build system with a focus on speed" +optional = true +python-versions = "*" +files = [ + {file = "ninja-1.11.1.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885"}, + {file = "ninja-1.11.1.1-py2.py3-none-win32.whl", hash = "sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a"}, + {file = "ninja-1.11.1.1.tar.gz", hash = "sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c"}, +] + +[package.extras] +test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "pytest (>=4.5.0)", "pytest-cov (>=2.7.1)", "pytest-runner (>=5.1)", "pytest-virtualenv (>=1.7.0)", "virtualenv (>=15.0.3)"] + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +optional = true +python-versions = ">=3.7" +files = [ + {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, + {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "numba" +version = "0.60.0" +description = "compiling Python code using LLVM" +optional = true +python-versions = ">=3.9" +files = [ + {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, + {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1527dc578b95c7c4ff248792ec33d097ba6bef9eda466c948b68dfc995c25781"}, + {file = "numba-0.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe0b28abb8d70f8160798f4de9d486143200f34458d34c4a214114e445d7124e"}, + {file = "numba-0.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:19407ced081d7e2e4b8d8c36aa57b7452e0283871c296e12d798852bc7d7f198"}, + {file = "numba-0.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a17b70fc9e380ee29c42717e8cc0bfaa5556c416d94f9aa96ba13acb41bdece8"}, + {file = "numba-0.60.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fb02b344a2a80efa6f677aa5c40cd5dd452e1b35f8d1c2af0dfd9ada9978e4b"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f4fde652ea604ea3c86508a3fb31556a6157b2c76c8b51b1d45eb40c8598703"}, + {file = "numba-0.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4142d7ac0210cc86432b818338a2bc368dc773a2f5cf1e32ff7c5b378bd63ee8"}, + {file = "numba-0.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cac02c041e9b5bc8cf8f2034ff6f0dbafccd1ae9590dc146b3a02a45e53af4e2"}, + {file = "numba-0.60.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7da4098db31182fc5ffe4bc42c6f24cd7d1cb8a14b59fd755bfee32e34b8404"}, + {file = "numba-0.60.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38d6ea4c1f56417076ecf8fc327c831ae793282e0ff51080c5094cb726507b1c"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62908d29fb6a3229c242e981ca27e32a6e606cc253fc9e8faeb0e48760de241e"}, + {file = "numba-0.60.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0ebaa91538e996f708f1ab30ef4d3ddc344b64b5227b67a57aa74f401bb68b9d"}, + {file = "numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347"}, + {file = "numba-0.60.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:01ef4cd7d83abe087d644eaa3d95831b777aa21d441a23703d649e06b8e06b74"}, + {file = "numba-0.60.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:819a3dfd4630d95fd574036f99e47212a1af41cbcb019bf8afac63ff56834449"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b983bd6ad82fe868493012487f34eae8bf7dd94654951404114f23c3466d34b"}, + {file = "numba-0.60.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c151748cd269ddeab66334bd754817ffc0cabd9433acb0f551697e5151917d25"}, + {file = "numba-0.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:3031547a015710140e8c87226b4cfe927cac199835e5bf7d4fe5cb64e814e3ab"}, + {file = "numba-0.60.0.tar.gz", hash = "sha256:5df6158e5584eece5fc83294b949fd30b9f1125df7708862205217e068aabf16"}, +] + +[package.dependencies] +llvmlite = "==0.43.*" +numpy = ">=1.22,<2.1" + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-ml-py" +version = "12.560.30" +description = "Python Bindings for the NVIDIA Management Library" +optional = true +python-versions = "*" +files = [ + {file = "nvidia-ml-py-12.560.30.tar.gz", hash = "sha256:f0254dc7400647680a072ee02509bfd46102b60bdfeca321576d4d4817e7fe97"}, + {file = "nvidia_ml_py-12.560.30-py3-none-any.whl", hash = "sha256:fea371c94d63e38a611c17bbb85fe400e9c8ddb9e8684a9cd0e47786a4bc3c73"}, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.20.5" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, + {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.6.20" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_aarch64.whl", hash = "sha256:84fb38465a5bc7c70cbc320cfd0963eb302ee25a5e939e9f512bbba55b6072fb"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_x86_64.whl", hash = "sha256:562ab97ea2c23164823b2a89cb328d01d45cb99634b8c65fe7cd60d14562bd79"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-win_amd64.whl", hash = "sha256:ed3c43a17f37b0c922a919203d2d36cbef24d41cc3e6b625182f8b58203644f6"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "openai" +version = "1.42.0" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.42.0-py3-none-any.whl", hash = "sha256:dc91e0307033a4f94931e5d03cc3b29b9717014ad5e73f9f2051b6cb5eda4d80"}, + {file = "openai-1.42.0.tar.gz", hash = "sha256:c9d31853b4e0bc2dc8bd08003b462a006035655a701471695d0bfdc08529cde3"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.11,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "Organic-Scoring" +version = "0.1.0" +description = "Generic Organic Scoring for Bittensor Subnets" +optional = true +python-versions = ">=3.9" +files = [] +develop = false + +[package.dependencies] +bittensor = ">=6.9.3" +datasets = ">=2.14.6" +nltk = "3.8.1" + +[package.source] +type = "git" +url = "https://github.com/macrocosm-os/organic-scoring.git" +reference = "main" +resolved_reference = "366f9081963d48315cca19192b5e4139e2e52469" + +[[package]] +name = "orjson" +version = "3.10.7" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, + {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, + {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, + {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, + {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, + {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, + {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, + {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, + {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, + {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, + {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, + {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, + {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, + {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, + {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, + {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, + {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, + {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, + {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, + {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, + {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, + {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, + {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, + {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, + {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, + {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, + {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, + {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, + {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, + {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, + {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, +] + +[[package]] +name = "outlines" +version = "0.0.46" +description = "Probabilistic Generative Model Programming" +optional = true +python-versions = ">=3.8" +files = [ + {file = "outlines-0.0.46-py3-none-any.whl", hash = "sha256:fea7b2ccd2dd82ddf11849a55ef14c4d7b72f12136a67d1b105b81639c8ca2b0"}, + {file = "outlines-0.0.46.tar.gz", hash = "sha256:cd272418a268e0a25b7189180dfdcf9fe1b99f50ac1dfb9ffd83c896c5b3fa3c"}, +] + +[package.dependencies] +cloudpickle = "*" +datasets = "*" +diskcache = "*" +interegular = "*" +jinja2 = "*" +jsonschema = "*" +lark = "*" +nest-asyncio = "*" +numba = "*" +numpy = "<2.0.0" +pyairports = "*" +pycountry = "*" +pydantic = ">=2.0" +referencing = "*" +requests = "*" +tqdm = "*" +typing-extensions = "*" + +[package.extras] +serve = ["fastapi", "pydantic (>=2.0)", "uvicorn", "vllm (>=0.3.0)"] +test = ["accelerate", "beartype (<0.16.0)", "coverage[toml] (>=5.1)", "diff-cover", "huggingface-hub", "llama-cpp-python", "mlx-lm", "openai (>=1.0.0)", "pre-commit", "pytest", "pytest-benchmark", "pytest-cov", "pytest-mock", "responses", "torch", "transformers", "vllm"] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pandas" +version = "2.2.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8df8612be9cd1c7797c93e1c5df861b2ddda0b48b08f2c3eaa0702cf88fb5f88"}, + {file = "pandas-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0f573ab277252ed9aaf38240f3b54cfc90fff8e5cab70411ee1d03f5d51f3944"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f02a3a6c83df4026e55b63c1f06476c9aa3ed6af3d89b4f04ea656ccdaaaa359"}, + {file = "pandas-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38ce92cb22a4bea4e3929429aa1067a454dcc9c335799af93ba9be21b6beb51"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c2ce852e1cf2509a69e98358e8458775f89599566ac3775e70419b98615f4b06"}, + {file = "pandas-2.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53680dc9b2519cbf609c62db3ed7c0b499077c7fefda564e330286e619ff0dd9"}, + {file = "pandas-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:94e714a1cca63e4f5939cdce5f29ba8d415d85166be3441165edd427dc9f6bc0"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f821213d48f4ab353d20ebc24e4faf94ba40d76680642fb7ce2ea31a3ad94f9b"}, + {file = "pandas-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70e00c2d894cb230e5c15e4b1e1e6b2b478e09cf27cc593a11ef955b9ecc81a"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e97fbb5387c69209f134893abc788a6486dbf2f9e511070ca05eed4b930b1b02"}, + {file = "pandas-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101d0eb9c5361aa0146f500773395a03839a5e6ecde4d4b6ced88b7e5a1a6403"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7d2ed41c319c9fb4fd454fe25372028dfa417aacb9790f68171b2e3f06eae8cd"}, + {file = "pandas-2.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af5d3c00557d657c8773ef9ee702c61dd13b9d7426794c9dfeb1dc4a0bf0ebc7"}, + {file = "pandas-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:06cf591dbaefb6da9de8472535b185cba556d0ce2e6ed28e21d919704fef1a9e"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88ecb5c01bb9ca927ebc4098136038519aa5d66b44671861ffab754cae75102c"}, + {file = "pandas-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04f6ec3baec203c13e3f8b139fb0f9f86cd8c0b94603ae3ae8ce9a422e9f5bee"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a935a90a76c44fe170d01e90a3594beef9e9a6220021acfb26053d01426f7dc2"}, + {file = "pandas-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c391f594aae2fd9f679d419e9a4d5ba4bce5bb13f6a989195656e7dc4b95c8f0"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9d1265545f579edf3f8f0cb6f89f234f5e44ba725a34d86535b1a1d38decbccc"}, + {file = "pandas-2.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11940e9e3056576ac3244baef2fedade891977bcc1cb7e5cc8f8cc7d603edc89"}, + {file = "pandas-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acf681325ee1c7f950d058b05a820441075b0dd9a2adf5c4835b9bc056bf4fb"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9bd8a40f47080825af4317d0340c656744f2bfdb6819f818e6ba3cd24c0e1397"}, + {file = "pandas-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df0c37ebd19e11d089ceba66eba59a168242fc6b7155cba4ffffa6eccdfb8f16"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739cc70eaf17d57608639e74d63387b0d8594ce02f69e7a0b046f117974b3019"}, + {file = "pandas-2.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4aa1d8707812a658debf03824016bf5ea0d516afdea29b7dc14cf687bc4d4ec6"}, + {file = "pandas-2.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:76f27a809cda87e07f192f001d11adc2b930e93a2b0c4a236fde5429527423be"}, + {file = "pandas-2.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:1ba21b1d5c0e43416218db63037dbe1a01fc101dc6e6024bcad08123e48004ab"}, + {file = "pandas-2.2.1.tar.gz", hash = "sha256:0ab90f87093c13f3e8fa45b48ba9f39181046e8f3317d3aadb2fffbb1b978572"}, +] + +[package.dependencies] +numpy = {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "password-strength" +version = "0.0.3.post2" +description = "Password strength and validation" +optional = false +python-versions = "*" +files = [ + {file = "password_strength-0.0.3.post2-py2.py3-none-any.whl", hash = "sha256:6739357c2863d707b7c7f247ff7c6882a70904a18d12c9aaf98f8b95da176fb9"}, + {file = "password_strength-0.0.3.post2.tar.gz", hash = "sha256:bf4df10a58fcd3abfa182367307b4fd7b1cec518121dd83bf80c1c42ba796762"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "peft" +version = "0.12.0" +description = "Parameter-Efficient Fine-Tuning (PEFT)" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "peft-0.12.0-py3-none-any.whl", hash = "sha256:a47915efb08af50e9fda267b7bf1b5b6eff33ccbb08791bdb544dccb8788f674"}, + {file = "peft-0.12.0.tar.gz", hash = "sha256:253205bd478e985ccdc7f04804aab9c95f479130c517bf6e474b8d509db5f4a4"}, +] + +[package.dependencies] +accelerate = ">=0.21.0" +huggingface-hub = ">=0.17.0" +numpy = ">=1.17" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = "*" +torch = ">=1.13.0" +tqdm = "*" +transformers = "*" + +[package.extras] +dev = ["black", "hf-doc-builder", "ruff (>=0.4.8,<0.5.0)"] +docs-specific = ["black", "hf-doc-builder"] +quality = ["black", "hf-doc-builder", "ruff (>=0.4.8,<0.5.0)"] +test = ["black", "datasets", "diffusers (<0.21.0)", "hf-doc-builder", "parameterized", "pytest", "pytest-cov", "pytest-xdist", "ruff (>=0.4.8,<0.5.0)", "scipy"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.4.0" +description = "Python Imaging Library (Fork)" +optional = true +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "3.8.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, + {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prettytable" +version = "3.11.0" +description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "prettytable-3.11.0-py3-none-any.whl", hash = "sha256:aa17083feb6c71da11a68b2c213b04675c4af4ce9c541762632ca3f2cb3546dd"}, + {file = "prettytable-3.11.0.tar.gz", hash = "sha256:7e23ca1e68bbfd06ba8de98bf553bf3493264c96d5e8a615c0471025deeba722"}, +] + +[package.dependencies] +wcwidth = "*" + +[package.extras] +tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] + +[[package]] +name = "prometheus-client" +version = "0.20.0" +description = "Python client for the Prometheus monitoring system." +optional = true +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prometheus-fastapi-instrumentator" +version = "7.0.0" +description = "Instrument your FastAPI with Prometheus metrics." +optional = true +python-versions = ">=3.8.1,<4.0.0" +files = [ + {file = "prometheus_fastapi_instrumentator-7.0.0-py3-none-any.whl", hash = "sha256:96030c43c776ee938a3dae58485ec24caed7e05bfc60fe067161e0d5b5757052"}, + {file = "prometheus_fastapi_instrumentator-7.0.0.tar.gz", hash = "sha256:5ba67c9212719f244ad7942d75ded80693b26331ee5dfc1e7571e4794a9ccbed"}, +] + +[package.dependencies] +prometheus-client = ">=0.8.0,<1.0.0" +starlette = ">=0.30.0,<1.0.0" + +[[package]] +name = "prompt-toolkit" +version = "3.0.47" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "5.27.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, + {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, + {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, + {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, + {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, + {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, + {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, + {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, + {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, +] + +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "py-bip39-bindings" +version = "0.1.11" +description = "Python bindings for tiny-bip39 RUST crate" +optional = false +python-versions = "*" +files = [ + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:324a7363f8b49201ebe1cc72d970017ec5139f8a5ddf605fa2774904eb7f08a1"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:77173b83c7ade4ca3c91fae0da9c9b1bc5f4c6819baa2276feacd5abec6005fa"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e5177fb3d3b9607f5d7d526a89f91b35687fcc34b643fc96cd168a0ae025cb"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ecd1cfb17f0b1bb56f0b1de5c533ff9830a60b5d657846b8cf500ff9fca8b3"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3408dc0809fca5691f9c02c8292d62590d90de4f02a4b2dcab35817fa857a71"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:d6f0eda277c6d0ef28cc83fd3f59a0f745394ea1e2807f2fea49186084b3d47d"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:963357db40dc7a816d55097a85929cae18c6174c5bedf0410f6e72181270b2b1"}, + {file = "py_bip39_bindings-0.1.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:be06dc751be86cbd72cd71e318979d3ab27cee12fd84d1e5e4e84575c5c9355d"}, + {file = "py_bip39_bindings-0.1.11-cp310-none-win32.whl", hash = "sha256:b4e05b06831874fa8715bdb128ea776674ad708858a4b3b1a27e5710859b086d"}, + {file = "py_bip39_bindings-0.1.11-cp310-none-win_amd64.whl", hash = "sha256:e01a03e858a648d294bcf063368bf09027efa282f5192abddaf7af69c5e2a574"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fd5b926686207752d5f2e2ff164a9489b3613239d0967362f10c2fbd64eb018"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba84c38962bffdaea0e499245731d669cc21d1280f81ace8ff60ed3550024570"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9024ec3c4a3db005b355f9a00602cede290dec5e9c7cf7dd06a26f620b0cf99"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:ce028c8aef51dec2a85f298461b2988cca28740bf3cc23472c3469d3f853714e"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51882cd0fa7529173b3543c089c24c775f1876ddf48f10e60f2ed07ad2af5cae"}, + {file = "py_bip39_bindings-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ee776f3b33b2d71fee48679951f117e3d1f052449ec2fcb184f3c64a4c77e4f"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win32.whl", hash = "sha256:d8b722e49562810f94eb61c9efa172f327537c74c37da3e86b161f7f444c51bf"}, + {file = "py_bip39_bindings-0.1.11-cp311-none-win_amd64.whl", hash = "sha256:be934052497f07605768e2c7184e4f4269b3e2e77930131dfc9bdbb791e6fdf4"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:afa9c5762cfaec01141f478a9c3132de01ec3890ff2e5a4013c79d3ba3aff8bb"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a3af7c1f955c6bbd613c6b38d022f7c73896acaf0ecc972ac0dee4b952e14568"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6aed3e86f105a36676e8dd0c8bc3f611a81b7ba4309b22a77fdc0f63b260e094"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d202f051cf063abae3acd0b74454d9d7b1dbeaf466ef7cb47a34ccedac845b62"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae120b5542fecf97aa3fdb6a526bac1004cb641bc9cc0d0030c6735dc2156072"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf896aabb3bec42803015e010c121c8a3210b20184f37aaa6e400ae8e877e60"}, + {file = "py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e4d45324c598197dbddac10a0298197ca2587fa7b09d1450697517988a29d515"}, + {file = "py_bip39_bindings-0.1.11-cp312-none-win32.whl", hash = "sha256:92abce265b0f2d8c5830441aff06b7b4f9426088a3de39624b12f3f9ff9fc2eb"}, + {file = "py_bip39_bindings-0.1.11-cp312-none-win_amd64.whl", hash = "sha256:6794187229eb0b04d0770f0fba936f0c5c598f552848a398ed5af9a61638cacb"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:76fc141ed154ccef9c36d5e2eb615565f2e272a43ed56edbdda538840b597187"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3837f7040e732f7be49da5f595f147de2304e92a67267b12d5aa08a9bb02dd4b"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82de90eabe531095d4e4721ea1546873f0161c101c30b43dcf0a7bbd9cdcce69"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19794bafd088cfb50f99b04f3710c895756fe25ec342eaea0b5c579512493b61"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_28_armv7l.whl", hash = "sha256:8b9aa564a0081c360776b2230472475bd2971ddbe8f99ed7d8676c0ab3b2e0e4"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f55ab4fc519b8a9b80b28e02756788b9da037a2484e42282497eb9a253e5a58"}, + {file = "py_bip39_bindings-0.1.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd1b874bc812866804a40242cdb1303de9caeb0ed261852dfbb5cbce94db31a4"}, + {file = "py_bip39_bindings-0.1.11-cp37-none-win32.whl", hash = "sha256:aa643eae0ebc185e50fcbc088210930f2cb4b30145dfd18a2b031451ce3edb03"}, + {file = "py_bip39_bindings-0.1.11-cp37-none-win_amd64.whl", hash = "sha256:e68673dbe4d2d99f64e493ac1369ac39b0bd9266dddefe476802d853f9637906"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:b1bece61da3c8ed37b86ac19051bab4cb599318066cdcf6ca9d795bdf7553525"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:5cc8a25d058f8f7741af38015b56177a1fbd442d7a2d463860c76fb86ff33211"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ac1d37c0266c40f592a53b282c392f40bc23c117ca092a46e419c9d141a3dc89"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd63afb8451a0ee91658144f1fa9d1b5ed908ca458e713864e775e47bb806414"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa30b9b4b01cc703801924be51e802f7ae778abea433f4e3908fc470e2a517ef"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_28_armv7l.whl", hash = "sha256:f826af5e54e250272af9203ce85bf53064fe514df8222836c3ff43f23ccd55fe"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08ba04fbad6d795c0bc59bbdf05a2bae9de929f34101fa149501e83fc4e52d6f"}, + {file = "py_bip39_bindings-0.1.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1f9ba82d427353bd6e7521b03583e0e72d745e7d6bf0b1505555a1032b6fd656"}, + {file = "py_bip39_bindings-0.1.11-cp38-none-win32.whl", hash = "sha256:86df39df8c573be8ff92e613d833045919e1351446898d683cc9a49ebeb25a87"}, + {file = "py_bip39_bindings-0.1.11-cp38-none-win_amd64.whl", hash = "sha256:e26cde6585ab95042fef48f6740a4f1a7962f2a571e73f1f12bfc4daee786c9a"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:3bb22e4f2430bc28d93599c70a4d6ce9fc3e88db3f20b24ca17902f796be6ae9"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:75de7c7e76581244c3893fb624e44d84dadcceddd73f221ab74a9cb3c04b416b"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1a364081460498caa7d8238c54ae78b009d331afcb4f037d659b02639b969e"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3112f408f2d58be9ea3189903e5f2d944a0d882fa35b91b7bb88a195a16a8c1"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b921f36a4ef7a3bccb2635f2a5f91647a63ebaa1a4962a24fa236e5a32834cf"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_28_armv7l.whl", hash = "sha256:77accd187ef9a87e1d32f279b45a6e23123816b933a7e3d8c4a2fe61f6bd1d2e"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fd74fd810cc1076dd0c2944490d4acb1a109837cc9cfd58b29605ea81b4034f5"}, + {file = "py_bip39_bindings-0.1.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153f310e55795509b8b004590dbc0cff58d65e8f032c1558021fc0898121a465"}, + {file = "py_bip39_bindings-0.1.11-cp39-none-win32.whl", hash = "sha256:b769bcc358c806ca1a5983e57eb94ee33ec3a8ef69fa01aa6b28960fa3e0ab5a"}, + {file = "py_bip39_bindings-0.1.11-cp39-none-win_amd64.whl", hash = "sha256:3d8a802d504c928d97e951489e942f39c9bfeec2a7305a6f0f3d5d38e152db9e"}, + {file = "py_bip39_bindings-0.1.11.tar.gz", hash = "sha256:ebc128ccf3a0750d758557e094802f0975c3760a939f8a8b76392d7dbe6b52a1"}, +] + +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +description = "Get CPU info with pure Python" +optional = true +python-versions = "*" +files = [ + {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, + {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, +] + +[[package]] +name = "py-ed25519-zebra-bindings" +version = "1.0.1" +description = "Python bindings for the ed25519-zebra RUST crate" +optional = false +python-versions = "*" +files = [ + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:a5c83e3a30f2f34556244422962cb9d2214fbf6ebdc82e9afb1e09d1d44ac457"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28b6addbf398b92bd8bf16da188094f3af2344c352d78647d0b2f13d5f7e4bd0"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:908029ef33cad332bdc93bde4bd81bc60c42c171584f5e5dafcb1b18764f8c07"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b804356c81cac5ab29e72fbdff4dc02222f763dfa0f0e221d21d1265a0db5144"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:93a703eb4b754959a375371a3fa35c1a19da98d4a3c4da0db7b7659ba6517d25"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:8c741ea2e0f92df500d9c1cc5b566198c75b6cb7dbf8a122d0bed269e5088e1c"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:903830c6f08b722fba4dae7c23993c998a657729c60bcc3fb27ba70091eaea11"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:529011a6182d73d36974e6e670fc62d11ee33e4a3e3ba9f37924d22e92a54c15"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:04ce9ca5fc634a0ee5ee2d6d91a284d09ee6fe6162288938bfb71c7495033d38"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-none-win32.whl", hash = "sha256:8d4e04a453a5a86efc4c6b5e82b1ed2e9110a41e73292c631728dfcbc620396d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp310-none-win_amd64.whl", hash = "sha256:3042988709fa6b1f5f0f0f928bddbf81ebd3c11b80a43014bfb92e985659a385"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e249b0d57187077859652a1119b315dec49e4d458c9795a7aeb2381799ce34e6"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:50d383684b650d92f93e1482891ce0c1c2011d2ca3b0821b5b049d6bb35dca3e"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d32d2c4d50789e6d3e081ab9a6d4e6f82bcf414e6b1c41a8f64a04065f6db340"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:363599e810ccc1f09092803a14a386ee8bce44d7057a3e36a14b1bf31de7e0b5"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa59836fac97352def00c2c7c6fed33ba351258b24d3f7cbced646271aa94de6"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d16da4fd6da771fd2323a90d779076066a02bb2a2c62b15ecf51ca2706f451b"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2e715341b4927f6735ed7113644c0a5362310df4ddad1f938b5040c85884db15"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-none-win32.whl", hash = "sha256:21498379d5e85d97a9633b7cf6362b4d187c7575ab8633c3ba6c99b1dcb83358"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp311-none-win_amd64.whl", hash = "sha256:58e7d56a6f565fc044d313ec429b782150366a39ada973051dde60f1363abd9b"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e90d55655ba2837cba691cbcf7f14d3146f07716bc5e60a4032d1a933672c261"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c29de01849e581bf0698f98a6131c7c80af6daf1c43f38fc4374fc6ad44d47e"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffcf39d48380454c132a38ff6172045035067848beb8ea619465ab389ff46717"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c2d9aa959c0d84cbf741f1b0605f49468584226401ffc0f60f0ab8752ca3e255"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9549258b35c930a062653a696cdc656699c9aa039df84a63234d94b397610421"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32188a3a5390f1f63bfbd10fd18dbde82802e5db615a94914574c52a450357ee"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-none-win32.whl", hash = "sha256:ca83b898458a701d31749a56c6c441f8f1bdb451f70df00eace68abf34dbb90c"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp312-none-win_amd64.whl", hash = "sha256:68ae9d36ff0062b2cc90f47e19a364590151dac78a0c36a72786078051a3990e"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp36-cp36m-macosx_10_7_x86_64.whl", hash = "sha256:ac9d378114ce16420f66fd990ff09156f1d056b993a6076edeae4f866f5fd67f"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e884b347d4a8d821327bafbdfcc19b2c8997d6a78704db15ef1db33baea4c1"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fcbe7677a8ba0888df9ce882402e13153b23dfdb97c8d0ec4e2ebd41d7c6b69"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp36-none-win32.whl", hash = "sha256:acb25c465eca7deb7b0238fa0e2e69a5944856495a316a12e75f01ca5a4003c3"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp36-none-win_amd64.whl", hash = "sha256:8d520eb4303624ac8a0a3a01f555fe55b1c0614a138da56bd753ece19660e470"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:3a37105f9cf44dd997ad0161a6e08969d96181173f22327329907a4825941c74"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf0ff95e75318b28020ed91beb76a8faecd3beefc092417867b3732dd94e55ca"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57a325635c7bf833d3ed10ac0f29fc6a54e18e7ccf962325b0104445192bce98"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:962553eea9eaf5bec9be9d7a7e0687b1aaa741eb57534a1905cacaf09a8e425d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-manylinux_2_28_armv7l.whl", hash = "sha256:67f743c8775b04ea7591753d7beeecaa5094edc23e4a26ced857dee7ac355d15"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:93eb5662e3af1083d81fd4a5a9cd254ac94f9e282e38f21e030f7d1c12d5dd98"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9cbec53099bbeca1ff7d89cb977c7251b5740ac1019dc42d34752f318212c3e1"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e0a58597049d6478406f4231d9532740b64b0d1558bd37e9735474a9fb559bdd"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-none-win32.whl", hash = "sha256:8a0ccb15371744e5eca7557532132ee7a5dfad41cbfcc3a6bbf4431f4c18cd87"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp37-none-win_amd64.whl", hash = "sha256:f3f209988adf229e98b07629698fc5fb2401b95e1db0b7a063f1945049e857bc"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:831ff6b3ba2f73d46671e0ba7efd26f26827839d652c4eed157c43fc58d44ed7"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d32570528ad5c514bbe92264a1a7ea0242884a63ea560067240b66740e6b3576"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd402a6795442af3a325907b5aab2b9154292eff7469adab3b3676c615704238"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb318f6c2d32292c9252e5626ac80253d1d7dcf93e9c03714c6e3fef8a83077e"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:6b537ae31ea90c670e93c7139e86b8299cbbeab7ceb2cdd67c54e9f0ac0607bf"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-manylinux_2_28_armv7l.whl", hash = "sha256:7aea3a70d07adccb378aa3edfa3aef214e9154c25e9b505b8a22c886f78f8bef"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48c8728ac5d6468b936b1568ccca00a9a025b70b120ca578f5188066e777c63d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3b3b8b8a977cc842bbcd7f5c54f00a9dfb08668a1a0c3e67f811f445822561d8"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ea66861e82597c81ae4d42ccf6f7215b50e5fcebbf9657067011b0e3a93e05aa"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-none-win32.whl", hash = "sha256:0bfe4309f4dbc1257716c3d64336246429284b55c2cc36785638d4abf7f41bfa"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp38-none-win_amd64.whl", hash = "sha256:139e297b51979ac8b7ad736033fa5243169d84c4cc92df9e036be93a363cc2c0"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:a44384ed0ff3cb6430e0a5dec19c3928a5aa1d9c0f9185c03dd09193a37de252"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:14c543aacce2abbbaa73044752fc1174b7faae4a163400da727c6bd7935cef7d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:871aafae7973e5c5895084ab9ebcb547709a24eeb3c757f430ad33a49d47cc3d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027c8a92cea1e95926cad0c78de09d627751fc942fca2e413708e70eba18f41a"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:38adce4f22560a558a589532624b47c958d66bc0cca1921a67b5986c11f96f1d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-manylinux_2_28_armv7l.whl", hash = "sha256:b3de615cdfc544dd3bd6d1ef46e4e315a397cf0df8b764bf898522e61aad3d1a"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d145aff9d5e12e2b99922d7dac3f97071805e46378157ffff6bb6ec51d27d1c"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d4ca9b0cccd3e3e5d5a6c045b8f28c63de8cb7603fc8d0db2855a6fc7b1f19f3"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6268fe204967c626a03cd2f62f343a684361a23e273c4568a16072d676624555"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-none-win32.whl", hash = "sha256:d0fe3d60374e0a295cccf618ca1c3ee8896670b0ebf676026b112fae328dcdb5"}, + {file = "py_ed25519_zebra_bindings-1.0.1-cp39-none-win_amd64.whl", hash = "sha256:6e393d68e3dcae521d5da88c4dbb3ca4f2ba79a274e6f2eecd7a3768c00cab25"}, + {file = "py_ed25519_zebra_bindings-1.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670f01572012aabd02436de78bd880a63691031f7758289a05529368e8af5ac6"}, + {file = "py_ed25519_zebra_bindings-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aae847c456757dc8e5022c0f5af64db07baaf8e0d60e0931912e92c1e9ea532d"}, + {file = "py_ed25519_zebra_bindings-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98450820e82e4fd446e2b9fd7b449e8b4cb645fa4c053d4e0a598a9c43ed8209"}, + {file = "py_ed25519_zebra_bindings-1.0.1.tar.gz", hash = "sha256:0062f189e1c8672ba94676cedb346fae4c33a0cabaf12e75a1aedcf9db47403b"}, +] + +[[package]] +name = "py-sr25519-bindings" +version = "0.2.0" +description = "Python bindings for sr25519 library" +optional = false +python-versions = "*" +files = [ + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:86cc1a571852a4f2ade827ebf211e066b23ab805d3e864cbe213a3d8cd53f7d5"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:453c9088e39dd04b07bf3ada6c473a5349c4dfd965009a35124b2c807117eda8"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f12122a18b688e4a4bf0e74d3969d9e3f6f83d2b01fe88ab5f19c969e95192a2"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2815ecc958f6edbad79fee76899bd33b8950caa7106c1db08c828ec90e16fa7"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfe52e73d7f0237820f7a935397d5004733a1d890464701f2c3c71be6033c442"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:df7e2fad636831919bfa479cd4b6fffdd429cde778da72b1834c1434dadaf982"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4ebeb2aac26a39160f2fad8ffc40ff98da835af57618c0446637bf182b9c927"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:942a6b52e871d6e152dda80a60ed338dccedc69b6375e080e496bf886f2556c0"}, + {file = "py_sr25519_bindings-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b24307c34a06209d0e34ca15ab4c0275617538dfdac1eac8aa25e792fa9f4108"}, + {file = "py_sr25519_bindings-0.2.0-cp310-none-win32.whl", hash = "sha256:2e06a2d1119a2ad063f11448bb27ec4f4ba77416043d98ae28ef30624cf0e12d"}, + {file = "py_sr25519_bindings-0.2.0-cp310-none-win_amd64.whl", hash = "sha256:16b36d9fe8bda873ab8376f3a4d0894b8d4ab2d702665afc3ab3ca69f0dc9495"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:54e8c41081a4c23eca4b19f52de2514c48ddec6f49844dff7ad4cfac0bc11712"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c73bd1a87849db9cd0e664b2d2e14208183dd8d11ac083d70e688fc28283a71"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47d21382ea24f7f25e72cdddaca2f013ce46cc7983bcfebc611c795cea177eff"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1448cf55bbf6f52d2e24766a8a84ba6d77100a991897e8519711ccd7409830"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:392b8b9875c89c9302930ad3d59567b62176f33adeee96a55ff61ba17fb7aac2"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7b56b5cbbfb36b41ddfa462989a03386590ac036f3a755ef64fffeb2fed88654"}, + {file = "py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f06ea3237e06666e3a4ff4719b4fba415472943831b229428753c37d5ecd1b4"}, + {file = "py_sr25519_bindings-0.2.0-cp311-none-win_amd64.whl", hash = "sha256:d62af30b2022f5fa787e46c06823c35a21abe791bf55012f498f9ba8e4baabc8"}, + {file = "py_sr25519_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ceafa0c31b49f2128461eb2c6ea18dc5d0bfae7218a100be7153f271e46bac49"}, + {file = "py_sr25519_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c8dedb8525556591738a64310875df70ea67886e5a40f2799bd96ef8848936cf"}, + {file = "py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ce149796923696f5cfc6263f135674a14fe2d513fd35b2bfa73226b940aff648"}, + {file = "py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20d71ca3ba22f98f4c208d509f735fe4eb5aa9e3547a507733a95828adde6cab"}, + {file = "py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8e20ee0856e8a60682566df955b81e7631670136607da627ab6892df34790d"}, + {file = "py_sr25519_bindings-0.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0efd5487e3f6d6053cfc4a891b10f729d69263897270d0354f409ee2106fc9b7"}, + {file = "py_sr25519_bindings-0.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ae7f2164d510458740145d20912d5d7a5c45e8fcde7cebd4057f60811ecc276f"}, + {file = "py_sr25519_bindings-0.2.0-cp312-none-win32.whl", hash = "sha256:92382456c6f176c07e0d554c71d483853387885ce17714f8a4b50fdcf7552297"}, + {file = "py_sr25519_bindings-0.2.0-cp312-none-win_amd64.whl", hash = "sha256:48ee4e14a77f815f3996beecb7d7abf422b756e9163ee4df739c1aded8a3e8ba"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-macosx_10_7_x86_64.whl", hash = "sha256:c3de899a1e911b8945f09e6389f8d2df68924c12c78e3e66fedb15f1e4ff56ad"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:758761b605f90e4238304df7520155a3358b13cc55ee18c5113632da17343163"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f63580a224607e68b861eb03421465091c3104b6309e5fca7448f5aa6dbda60"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b999075b76cae8e84d5f19f2c8f28d3f24c93ba858ad49e58bcf22afe0406b"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-manylinux_2_28_armv7l.whl", hash = "sha256:5102c94e97d316009ad4482f24d9a933fc0b7eb0bb88e6a784a820cd1bd25827"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b477b18940f472d4e25e141f19503a6e55aadff31b4822228a491c9638096baf"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:7e69bf7bdc9920013c1a2bea25a8b02df9588d9856cb20270f4d8d95b8e83f52"}, + {file = "py_sr25519_bindings-0.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:dc436a34e17037833c3909062722ee3d46e28288972c87f619d163d00054d68e"}, + {file = "py_sr25519_bindings-0.2.0-cp36-none-win32.whl", hash = "sha256:fc27c847dd4df727388aaadc3870aeb472f2d5c35717536d319792fe08f6120a"}, + {file = "py_sr25519_bindings-0.2.0-cp36-none-win_amd64.whl", hash = "sha256:0441381c2a6f532831d560a1f2ae8a917c7190cf27f5428d9b0528fa28a72e2d"}, + {file = "py_sr25519_bindings-0.2.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:e1471134450e6189b7e38d245ab16b06f3de900b6d07aa66b1e6973cdbc00d01"}, + {file = "py_sr25519_bindings-0.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:302bd20e75d900d98e7961934b03958e8acc8784eed594ab48f9bb298396c734"}, + {file = "py_sr25519_bindings-0.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e09ac91f4b2e2b9c50e268f6ee292d9fa447c5b7cc6327cfeae7750d716f49e"}, + {file = "py_sr25519_bindings-0.2.0-cp37-cp37m-manylinux_2_28_armv7l.whl", hash = "sha256:28b904739147c4f797627bd3b44d1e64d061533253abd1882c6d3b8944e7bbd8"}, + {file = "py_sr25519_bindings-0.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0931ac85331aae33bef67460a3cce554ef5c1f7dfec0ebe2f5b9ea57c5bee65c"}, + {file = "py_sr25519_bindings-0.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cd8da64f9e42ff973b394ed9164f1e9a454279a058eed08ac8d006fcbd61093b"}, + {file = "py_sr25519_bindings-0.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:297ad50e3cace5c89dbf5bd916b714aac3ebe6bc76f85382dac228cbeb71449e"}, + {file = "py_sr25519_bindings-0.2.0-cp37-none-win32.whl", hash = "sha256:422d62ca74ebe5065eca88607552b9a5f1dc4abff0c597cc3793dd8adfb8c4ea"}, + {file = "py_sr25519_bindings-0.2.0-cp37-none-win_amd64.whl", hash = "sha256:d1b0ed9a4dded60f671f34fdd81c974dad159e98f43bcab21833f984e05920f9"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:37f11ffee535c624bf5ddc6109c2cdca9a2dbd10f7d310bcd1dd97f6121c532f"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4e1b553a6b1cc1b0aa9da2d7157329713cc7f299acb12a052d326f9b594b145c"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f0b6dcf1328027dba1f9236bd3432cc3cce1de55a12c1a3a4ea7a8dc3ab3e857"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:458c7e6d7447bd267a6f870a8801e995d710952566a0a52634f408bf804cf27a"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d64253d7d08fd6073e7b79bba9cff78687e76698cc210d3c6f236b90766b9421"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-manylinux_2_28_armv7l.whl", hash = "sha256:a9aac20a196416b8daf764704a9cee71ddee16bc705d12b5c6bcb6f51e81ac6e"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e162687189cf765f602178aa195a2be4284107622141ff746e92e14e266cf3b7"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d44ab4d150c9bdd1641ccad49942ecf2d0ef61bd66a7da41094bb4a9cbaca529"}, + {file = "py_sr25519_bindings-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:251ff9cef5dafd96ff241b77ff471912c40249b6df31e71c6c32de6a26a8dbc6"}, + {file = "py_sr25519_bindings-0.2.0-cp38-none-win32.whl", hash = "sha256:ca9794f9d4fc37cdc8cbb6724d5432a064d22c26ecde312928154b6bc691f4d3"}, + {file = "py_sr25519_bindings-0.2.0-cp38-none-win_amd64.whl", hash = "sha256:6406cb0aeb5cbb8cfaa37d59d15d7640c0d812a1cbb55657bee52fd3d9e92aa9"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:b9da73447c8f5b8392a8229c2b65d742709c6aa2d0c6b32e39b635fb245145f1"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:7f00236a802d6d3f3705713d5352ba968c0ce353a20519c445e66ce19869bfdc"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d473199c0dbad846b0723c6663b1b6a04040ccdca700cb1609acac3e621f2087"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44bede0dd42f75cf849d3ccb4e443d6425218035bc00a6330b11dc2cc1146f3b"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-manylinux_2_28_armv7l.whl", hash = "sha256:a8e462d2442726d9db07854dc2eb640b1a8a548948b1ff3aa580771ab739bab8"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:55b1f67fdaeab91481fda54432dffdf87ed516d26461d31e70911c7ea55d6164"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ec11493d59075ba75fe0bc0312d502ffdc45b641a46fb084bf8b04906597688b"}, + {file = "py_sr25519_bindings-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:101ee46368da149ad332aea225d4ff2907dffce574e8f8f7fe56f5c29211f333"}, + {file = "py_sr25519_bindings-0.2.0-cp39-none-win32.whl", hash = "sha256:909f13f63f67f1e5595d4d495cf8a3c95e392626c08f94550cbf8f0e8ea1c743"}, + {file = "py_sr25519_bindings-0.2.0-cp39-none-win_amd64.whl", hash = "sha256:b3f86e4aad6c2b8ff74af76f38fde7fbaf9dd83bc4a7c259709092008c3b8e5d"}, + {file = "py_sr25519_bindings-0.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38db0ee90bd676b9df7ddd03fcb2113b5a5e9d9c984d82426728acc0e9d54277"}, + {file = "py_sr25519_bindings-0.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dfe767069d5c5e8a313e77b6bd681ea4f6b5988b09b6b4c9399e255fe4a7c53"}, + {file = "py_sr25519_bindings-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8951d1a6e310a682a6253d547e44a9e7a606476dbc18dea3f121d98bdb81042"}, + {file = "py_sr25519_bindings-0.2.0.tar.gz", hash = "sha256:0c2fe92b7cdcebf6c5611a90054f8ba6ea90b68b8832896d2dc565537bc40b0c"}, +] + +[[package]] +name = "pyairports" +version = "2.1.1" +description = "Airport and other locations database" +optional = true +python-versions = "*" +files = [ + {file = "pyairports-2.1.1-py3-none-any.whl", hash = "sha256:3dfa0cc3e47696692ade92feccdc6b046968f2a75f5e30f65735d6db7251cb26"}, + {file = "pyairports-2.1.1.tar.gz", hash = "sha256:3d60a727fce4da81b9c6393ea8ae0b33d67b37ece344dffc863f749e3ad62bcd"}, +] + +[[package]] +name = "pyarrow" +version = "17.0.0" +description = "Python library for Apache Arrow" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, + {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"}, + {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, + {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, + {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, + {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, + {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, + {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, +] + +[package.dependencies] +numpy = ">=1.16.6" + +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] + +[[package]] +name = "pycodestyle" +version = "2.12.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, +] + +[[package]] +name = "pycountry" +version = "24.6.1" +description = "ISO country, subdivision, language, currency and script definitions and their translations" +optional = true +python-versions = ">=3.8" +files = [ + {file = "pycountry-24.6.1-py3-none-any.whl", hash = "sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f"}, + {file = "pycountry-24.6.1.tar.gz", hash = "sha256:b61b3faccea67f87d10c1f2b0fc0be714409e8fcdcc1315613174f6466c10221"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pycryptodome" +version = "3.20.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] + +[[package]] +name = "pydantic" +version = "2.8.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.20.1" +typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pytest" +version = "8.3.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.24.0" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_asyncio-0.24.0-py3-none-any.whl", hash = "sha256:a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b"}, + {file = "pytest_asyncio-0.24.0.tar.gz", hash = "sha256:d081d828e576d85f875399194281e92bf8a68d60d72d1a2faf2feddb6c46b276"}, +] + +[package.dependencies] +pytest = ">=8.2,<9" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-levenshtein" +version = "0.25.1" +description = "Python extension for computing string edit distances and similarities." +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-Levenshtein-0.25.1.tar.gz", hash = "sha256:b21e7efe83c8e8dc8260f2143b2393c6c77cb2956f0c53de6c4731c4d8006acc"}, + {file = "python_Levenshtein-0.25.1-py3-none-any.whl", hash = "sha256:654446d1ea4acbcc573d44c43775854834a7547e4cb2f79f638f738134d72037"}, +] + +[package.dependencies] +Levenshtein = "0.25.1" + +[[package]] +name = "python-statemachine" +version = "2.1.2" +description = "Python Finite State Machines made easy." +optional = false +python-versions = ">=3.7,<3.13" +files = [ + {file = "python_statemachine-2.1.2-py3-none-any.whl", hash = "sha256:d7e369d5da5b9007cc7cf5eb7a1b169081e2f4b7d30b6415fc122858fb7696ec"}, + {file = "python_statemachine-2.1.2.tar.gz", hash = "sha256:0b0dd8b28738b53f14391b06d5072cd5e72259da5ae23574d3d4f5e6dd366663"}, +] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "rapidfuzz" +version = "3.9.6" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rapidfuzz-3.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7ed0d0b9c85720f0ae33ac5efc8dc3f60c1489dad5c29d735fbdf2f66f0431f"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f3deff6ab7017ed21b9aec5874a07ad13e6b2a688af055837f88b743c7bfd947"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3f9fc060160507b2704f7d1491bd58453d69689b580cbc85289335b14fe8ca"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e86c2b3827fa6169ad6e7d4b790ce02a20acefb8b78d92fa4249589bbc7a2c"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f982e1aafb4bd8207a5e073b1efef9e68a984e91330e1bbf364f9ed157ed83f0"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9196a51d0ec5eaaaf5bca54a85b7b1e666fc944c332f68e6427503af9fb8c49e"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5a514064e02585b1cc09da2fe406a6dc1a7e5f3e92dd4f27c53e5f1465ec81"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3a4244f65dbc3580b1275480118c3763f9dc29fc3dd96610560cb5e140a4d4a"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f6ebb910a702e41641e1e1dada3843bc11ba9107a33c98daef6945a885a40a07"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:624fbe96115fb39addafa288d583b5493bc76dab1d34d0ebba9987d6871afdf9"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1c59f1c1507b7a557cf3c410c76e91f097460da7d97e51c985343798e9df7a3c"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f6f0256cb27b6a0fb2e1918477d1b56473cd04acfa245376a342e7c15806a396"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-win32.whl", hash = "sha256:24d473d00d23a30a85802b502b417a7f5126019c3beec91a6739fe7b95388b24"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:248f6d2612e661e2b5f9a22bbd5862a1600e720da7bb6ad8a55bb1548cdfa423"}, + {file = "rapidfuzz-3.9.6-cp310-cp310-win_arm64.whl", hash = "sha256:e03fdf0e74f346ed7e798135df5f2a0fb8d6b96582b00ebef202dcf2171e1d1d"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52e4675f642fbc85632f691b67115a243cd4d2a47bdcc4a3d9a79e784518ff97"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1f93a2f13038700bd245b927c46a2017db3dcd4d4ff94687d74b5123689b873b"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b70500bca460264b8141d8040caee22e9cf0418c5388104ff0c73fb69ee28f"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1e037fb89f714a220f68f902fc6300ab7a33349f3ce8ffae668c3b3a40b0b06"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6792f66d59b86ccfad5e247f2912e255c85c575789acdbad8e7f561412ffed8a"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68d9cffe710b67f1969cf996983608cee4490521d96ea91d16bd7ea5dc80ea98"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63daaeeea76da17fa0bbe7fb05cba8ed8064bb1a0edf8360636557f8b6511961"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d214e063bffa13e3b771520b74f674b22d309b5720d4df9918ff3e0c0f037720"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ed443a2062460f44c0346cb9d269b586496b808c2419bbd6057f54061c9b9c75"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5b0c9b227ee0076fb2d58301c505bb837a290ae99ee628beacdb719f0626d749"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:82c9722b7dfaa71e8b61f8c89fed0482567fb69178e139fe4151fc71ed7df782"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c18897c95c0a288347e29537b63608a8f63a5c3cb6da258ac46fcf89155e723e"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-win32.whl", hash = "sha256:3e910cf08944da381159587709daaad9e59d8ff7bca1f788d15928f3c3d49c2a"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:59c4a61fab676d37329fc3a671618a461bfeef53a4d0b8b12e3bc24a14e166f8"}, + {file = "rapidfuzz-3.9.6-cp311-cp311-win_arm64.whl", hash = "sha256:8b4afea244102332973377fddbe54ce844d0916e1c67a5123432291717f32ffa"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:70591b28b218fff351b88cdd7f2359a01a71f9f7f5a2e465ce3715ed4b3c422b"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee2d8355c7343c631a03e57540ea06e8717c19ecf5ff64ea07e0498f7f161457"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:708fb675de0f47b9635d1cc6fbbf80d52cb710d0a1abbfae5c84c46e3abbddc3"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d66c247c2d3bb7a9b60567c395a15a929d0ebcc5f4ceedb55bfa202c38c6e0c"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15146301b32e6e3d2b7e8146db1a26747919d8b13690c7f83a4cb5dc111b3a08"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7a03da59b6c7c97e657dd5cd4bcaab5fe4a2affd8193958d6f4d938bee36679"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d2c2fe19e392dbc22695b6c3b2510527e2b774647e79936bbde49db7742d6f1"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:91aaee4c94cb45930684f583ffc4e7c01a52b46610971cede33586cf8a04a12e"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3f5702828c10768f9281180a7ff8597da1e5002803e1304e9519dd0f06d79a85"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ccd1763b608fb4629a0b08f00b3c099d6395e67c14e619f6341b2c8429c2f310"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc7a0d4b2cb166bc46d02c8c9f7551cde8e2f3c9789df3827309433ee9771163"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7496f53d40560a58964207b52586783633f371683834a8f719d6d965d223a2eb"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-win32.whl", hash = "sha256:5eb1a9272ca71bc72be5415c2fa8448a6302ea4578e181bb7da9db855b367df0"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-win_amd64.whl", hash = "sha256:0d21fc3c0ca507a1180152a6dbd129ebaef48facde3f943db5c1055b6e6be56a"}, + {file = "rapidfuzz-3.9.6-cp312-cp312-win_arm64.whl", hash = "sha256:43bb27a57c29dc5fa754496ba6a1a508480d21ae99ac0d19597646c16407e9f3"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:83a5ac6547a9d6eedaa212975cb8f2ce2aa07e6e30833b40e54a52b9f9999aa4"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:10f06139142ecde67078ebc9a745965446132b998f9feebffd71acdf218acfcc"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74720c3f24597f76c7c3e2c4abdff55f1664f4766ff5b28aeaa689f8ffba5fab"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2bce52b5c150878e558a0418c2b637fb3dbb6eb38e4eb27d24aa839920483e"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1611199f178793ca9a060c99b284e11f6d7d124998191f1cace9a0245334d219"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0308b2ad161daf502908a6e21a57c78ded0258eba9a8f5e2545e2dafca312507"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eda91832201b86e3b70835f91522587725bec329ec68f2f7faf5124091e5ca7"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ece873c093aedd87fc07c2a7e333d52e458dc177016afa1edaf157e82b6914d8"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d97d3c9d209d5c30172baea5966f2129e8a198fec4a1aeb2f92abb6e82a2edb1"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6c4550d0db4931f5ebe9f0678916d1b06f06f5a99ba0b8a48b9457fd8959a7d4"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b6b8dd4af6324fc325d9483bec75ecf9be33e590928c9202d408e4eafff6a0a6"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16122ae448bc89e2bea9d81ce6cb0f751e4e07da39bd1e70b95cae2493857853"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-win32.whl", hash = "sha256:71cc168c305a4445109cd0d4925406f6e66bcb48fde99a1835387c58af4ecfe9"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-win_amd64.whl", hash = "sha256:59ee78f2ecd53fef8454909cda7400fe2cfcd820f62b8a5d4dfe930102268054"}, + {file = "rapidfuzz-3.9.6-cp313-cp313-win_arm64.whl", hash = "sha256:58b4ce83f223605c358ae37e7a2d19a41b96aa65b1fede99cc664c9053af89ac"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9f469dbc9c4aeaac7dd005992af74b7dff94aa56a3ea063ce64e4b3e6736dd2f"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a9ed7ad9adb68d0fe63a156fe752bbf5f1403ed66961551e749641af2874da92"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ffe48ffbeedf78d120ddfb9d583f2ca906712159a4e9c3c743c9f33e7b1775"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8502ccdea9084d54b6f737d96a3b60a84e3afed9d016686dc979b49cdac71613"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a4bec4956e06b170ca896ba055d08d4c457dac745548172443982956a80e118"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c0488b1c273be39e109ff885ccac0448b2fa74dea4c4dc676bcf756c15f16d6"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0542c036cb6acf24edd2c9e0411a67d7ba71e29e4d3001a082466b86fc34ff30"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0a96b52c9f26857bf009e270dcd829381e7a634f7ddd585fa29b87d4c82146d9"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:6edd3cd7c4aa8c68c716d349f531bd5011f2ca49ddade216bb4429460151559f"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:50b2fb55d7ed58c66d49c9f954acd8fc4a3f0e9fd0ff708299bd8abb68238d0e"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:32848dfe54391636b84cda1823fd23e5a6b1dbb8be0e9a1d80e4ee9903820994"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:29146cb7a1bf69c87e928b31bffa54f066cb65639d073b36e1425f98cccdebc6"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-win32.whl", hash = "sha256:aed13e5edacb0ecadcc304cc66e93e7e77ff24f059c9792ee602c0381808e10c"}, + {file = "rapidfuzz-3.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:af440e36b828922256d0b4d79443bf2cbe5515fc4b0e9e96017ec789b36bb9fc"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:efa674b407424553024522159296690d99d6e6b1192cafe99ca84592faff16b4"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0b40ff76ee19b03ebf10a0a87938f86814996a822786c41c3312d251b7927849"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16a6c7997cb5927ced6f617122eb116ba514ec6b6f60f4803e7925ef55158891"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3f42504bdc8d770987fc3d99964766d42b2a03e4d5b0f891decdd256236bae0"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9462aa2be9f60b540c19a083471fdf28e7cf6434f068b631525b5e6251b35e"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1629698e68f47609a73bf9e73a6da3a4cac20bc710529215cbdf111ab603665b"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68bc7621843d8e9a7fd1b1a32729465bf94b47b6fb307d906da168413331f8d6"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c6254c50f15bc2fcc33cb93a95a81b702d9e6590f432a7f7822b8c7aba9ae288"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7e535a114fa575bc143e175e4ca386a467ec8c42909eff500f5f0f13dc84e3e0"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d50acc0e9d67e4ba7a004a14c42d1b1e8b6ca1c515692746f4f8e7948c673167"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:fa742ec60bec53c5a211632cf1d31b9eb5a3c80f1371a46a23ac25a1fa2ab209"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c256fa95d29cbe5aa717db790b231a9a5b49e5983d50dc9df29d364a1db5e35b"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-win32.whl", hash = "sha256:89acbf728b764421036c173a10ada436ecca22999851cdc01d0aa904c70d362d"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:c608fcba8b14d86c04cb56b203fed31a96e8a1ebb4ce99e7b70313c5bf8cf497"}, + {file = "rapidfuzz-3.9.6-cp39-cp39-win_arm64.whl", hash = "sha256:d41c00ded0e22e9dba88ff23ebe0dc9d2a5f21ba2f88e185ea7374461e61daa9"}, + {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a65c2f63218ea2dedd56fc56361035e189ca123bd9c9ce63a9bef6f99540d681"}, + {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:680dc78a5f889d3b89f74824b89fe357f49f88ad10d2c121e9c3ad37bac1e4eb"}, + {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8ca862927a0b05bd825e46ddf82d0724ea44b07d898ef639386530bf9b40f15"}, + {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2116fa1fbff21fa52cd46f3cfcb1e193ba1d65d81f8b6e123193451cd3d6c15e"}, + {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dcb7d9afd740370a897c15da61d3d57a8d54738d7c764a99cedb5f746d6a003"}, + {file = "rapidfuzz-3.9.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1a5bd6401bb489e14cbb5981c378d53ede850b7cc84b2464cad606149cc4e17d"}, + {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:29fda70b9d03e29df6fc45cc27cbcc235534b1b0b2900e0a3ae0b43022aaeef5"}, + {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:88144f5f52ae977df9352029488326afadd7a7f42c6779d486d1f82d43b2b1f2"}, + {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:715aeaabafba2709b9dd91acb2a44bad59d60b4616ef90c08f4d4402a3bbca60"}, + {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af26ebd3714224fbf9bebbc27bdbac14f334c15f5d7043699cd694635050d6ca"}, + {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101bd2df438861a005ed47c032631b7857dfcdb17b82beeeb410307983aac61d"}, + {file = "rapidfuzz-3.9.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2185e8e29809b97ad22a7f99281d1669a89bdf5fa1ef4ef1feca36924e675367"}, + {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9e53c72d08f0e9c6e4a369e52df5971f311305b4487690c62e8dd0846770260c"}, + {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a0cb157162f0cdd62e538c7bd298ff669847fc43a96422811d5ab933f4c16c3a"}, + {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bb5ff2bd48132ed5e7fbb8f619885facb2e023759f2519a448b2c18afe07e5d"}, + {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dc37f601865e8407e3a8037ffbc3afe0b0f837b2146f7632bd29d087385babe"}, + {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a657eee4b94668faf1fa2703bdd803654303f7e468eb9ba10a664d867ed9e779"}, + {file = "rapidfuzz-3.9.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:51be6ab5b1d5bb32abd39718f2a5e3835502e026a8272d139ead295c224a6f5e"}, + {file = "rapidfuzz-3.9.6.tar.gz", hash = "sha256:5cf2a7d621e4515fee84722e93563bf77ff2cbe832a77a48b81f88f9e23b9e8d"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "ray" +version = "2.34.0" +description = "Ray provides a simple, universal API for building distributed applications." +optional = true +python-versions = ">=3.8" +files = [ + {file = "ray-2.34.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:fb994a9f45aacb6edac32d97327f145a99c0db0b576c6c2217902b44e8fd8565"}, + {file = "ray-2.34.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6acb3d712e3f001ed8e3c0e1403f65e550adc8b558098f188d43b427e1f024c8"}, + {file = "ray-2.34.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a2e909445fdddc7e9f318894aa3d9b5a9e79d3b4320e9c84b3703d1df908d359"}, + {file = "ray-2.34.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:76715a92dc10d7f090bdfb490f6e6d497cc8d212da78174d0de516ba7021cee4"}, + {file = "ray-2.34.0-cp310-cp310-win_amd64.whl", hash = "sha256:3ca22ebb25f483bff60f2b64d1b33c4f156754d73c1c183808e0380c515f0ff9"}, + {file = "ray-2.34.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:bb869c717057fa23010ced7be0bdfda3b260583dfd9fe969e7de3ccd3bee1e03"}, + {file = "ray-2.34.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:590d0676bedd72111e7df78bb71eef93826a86de0d4675739471080ffd463d02"}, + {file = "ray-2.34.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:2315ca4eeb2c87264a7be38acf128803dffb2af2476e6322acd3f889129e4575"}, + {file = "ray-2.34.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:b608d6865600cbd3516882a19bb3b713b6f161b150ce1ee31d92084d09408b9a"}, + {file = "ray-2.34.0-cp311-cp311-win_amd64.whl", hash = "sha256:5125d325f6c3605de16182e60ccb4cd6a102a812665c119a71f19d07f20080d8"}, + {file = "ray-2.34.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:d1f8b03f7be489104c32731a3898eae41ffe1fd29c1303bbd77805e1961a1324"}, + {file = "ray-2.34.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a332323d986d3faa9c539c3c979aa936bc252a0da9b20bdb48a6f634a1ff5200"}, + {file = "ray-2.34.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:230eef15981cec90e868eff32ad5756e4fee53c2855c890a2d1243617df73c8e"}, + {file = "ray-2.34.0-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:aeaac5ce06572b15947c995b6d65a6c8706a1b2336eebed5b98e9073fe94abe0"}, + {file = "ray-2.34.0-cp312-cp312-win_amd64.whl", hash = "sha256:9c48fcf7cf7b3d0886f846d45c1f73de91d70486d52d10e0f0ec017660613fec"}, + {file = "ray-2.34.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:93dfab2256e8bab153a10d4af8e82d124afe9a950ac5435c5d33a4637ed0cbb8"}, + {file = "ray-2.34.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:37c4840e3953bff40900a189fcf2a866581fd5c11e72b8c532a593a200450bb4"}, + {file = "ray-2.34.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:42df897f2bf368fa1d74c6672f36a9fae4ebcf7f1495716f9cca445415c51f55"}, + {file = "ray-2.34.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:7c11a58daf074093d5b5a31de62f3dc0e55a7649edcc16a902eed6dc16fc6a4f"}, + {file = "ray-2.34.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cbf7b38b97f80f95ca1c841d783a577f1618c15c6fbf32574dd0efa4e4b12bd"}, +] + +[package.dependencies] +aiosignal = "*" +click = ">=7.0" +filelock = "*" +frozenlist = "*" +jsonschema = "*" +msgpack = ">=1.0.0,<2.0.0" +packaging = "*" +protobuf = ">=3.15.3,<3.19.5 || >3.19.5" +pyyaml = "*" +requests = "*" + +[package.extras] +air = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "fsspec", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "memray", "numpy (>=1.20)", "opencensus", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +all = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "dm-tree", "fastapi", "fsspec", "grpcio (!=1.56.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "gymnasium (==0.28.1)", "lz4", "memray", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "pyyaml", "ray-cpp (==2.34.0)", "requests", "rich", "scikit-image", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +client = ["grpcio (!=1.56.0)"] +cpp = ["ray-cpp (==2.34.0)"] +data = ["fsspec", "numpy (>=1.20)", "pandas (>=1.3)", "pyarrow (>=6.0.1)"] +default = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "memray", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "virtualenv (>=20.0.24,!=20.21.1)"] +observability = ["opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"] +rllib = ["dm-tree", "fsspec", "gymnasium (==0.28.1)", "lz4", "pandas", "pyarrow (>=6.0.1)", "pyyaml", "requests", "rich", "scikit-image", "scipy", "tensorboardX (>=1.9)", "typer"] +serve = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "memray", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +serve-grpc = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "fastapi", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "memray", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2.0.dev0 || >=2.5.dev0,<3)", "requests", "smart-open", "starlette", "uvicorn[standard]", "virtualenv (>=20.0.24,!=20.21.1)", "watchfiles"] +train = ["fsspec", "pandas", "pyarrow (>=6.0.1)", "requests", "tensorboardX (>=1.9)"] +tune = ["fsspec", "pandas", "pyarrow (>=6.0.1)", "requests", "tensorboardX (>=1.9)"] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = true +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2024.7.24" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "resolvelib" +version = "0.8.1" +description = "Resolve abstract dependencies into concrete ones" +optional = false +python-versions = "*" +files = [ + {file = "resolvelib-0.8.1-py2.py3-none-any.whl", hash = "sha256:d9b7907f055c3b3a2cfc56c914ffd940122915826ff5fb5b1de0c99778f4de98"}, + {file = "resolvelib-0.8.1.tar.gz", hash = "sha256:c6ea56732e9fb6fca1b2acc2ccc68a0b6b8c566d8f3e78e0443310ede61dbd37"}, +] + +[package.extras] +examples = ["html5lib", "packaging", "pygraphviz", "requests"] +lint = ["black", "flake8", "isort", "mypy", "types-requests"] +release = ["build", "towncrier", "twine"] +test = ["commentjson", "packaging", "pytest"] + +[[package]] +name = "retry" +version = "0.9.2" +description = "Easy to use retry decorator." +optional = false +python-versions = "*" +files = [ + {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, + {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, +] + +[package.dependencies] +decorator = ">=3.4.2" +py = ">=1.4.26,<2.0.0" + +[[package]] +name = "rich" +version = "13.8.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.8.0-py3-none-any.whl", hash = "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc"}, + {file = "rich-13.8.0.tar.gz", hash = "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rouge" +version = "1.0.1" +description = "Full Python ROUGE Score Implementation (not a wrapper)" +optional = false +python-versions = "*" +files = [ + {file = "rouge-1.0.1-py3-none-any.whl", hash = "sha256:28d118536e8c774dc47d1d15ec266479b4dd0914c4672ce117d4002789bdc644"}, + {file = "rouge-1.0.1.tar.gz", hash = "sha256:12b48346ca47d6bcf3c45061f315452b9ccec0620ee895ec85b7efc3d54aae34"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rpds-py" +version = "0.20.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = true +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, +] + +[[package]] +name = "ruff" +version = "0.5.7" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"}, + {file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"}, + {file = "ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb"}, + {file = "ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5"}, + {file = "ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e"}, + {file = "ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a"}, + {file = "ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3"}, + {file = "ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4"}, + {file = "ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5"}, +] + +[[package]] +name = "sacremoses" +version = "0.0.53" +description = "SacreMoses" +optional = false +python-versions = "*" +files = [ + {file = "sacremoses-0.0.53.tar.gz", hash = "sha256:43715868766c643b35de4b8046cce236bfe59a7fa88b25eaf6ddf02bacf53a7a"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = "*" +six = "*" +tqdm = "*" + +[[package]] +name = "safetensors" +version = "0.4.4" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "safetensors-0.4.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2adb497ada13097f30e386e88c959c0fda855a5f6f98845710f5bb2c57e14f12"}, + {file = "safetensors-0.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7db7fdc2d71fd1444d85ca3f3d682ba2df7d61a637dfc6d80793f439eae264ab"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4f0eed76b430f009fbefca1a0028ddb112891b03cb556d7440d5cd68eb89a9"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57d216fab0b5c432aabf7170883d7c11671622bde8bd1436c46d633163a703f6"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d9b76322e49c056bcc819f8bdca37a2daa5a6d42c07f30927b501088db03309"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32f0d1f6243e90ee43bc6ee3e8c30ac5b09ca63f5dd35dbc985a1fc5208c451a"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d464bdc384874601a177375028012a5f177f1505279f9456fea84bbc575c7f"}, + {file = "safetensors-0.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63144e36209ad8e4e65384dbf2d52dd5b1866986079c00a72335402a38aacdc5"}, + {file = "safetensors-0.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:051d5ecd490af7245258000304b812825974d5e56f14a3ff7e1b8b2ba6dc2ed4"}, + {file = "safetensors-0.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51bc8429d9376224cd3cf7e8ce4f208b4c930cd10e515b6ac6a72cbc3370f0d9"}, + {file = "safetensors-0.4.4-cp310-none-win32.whl", hash = "sha256:fb7b54830cee8cf9923d969e2df87ce20e625b1af2fd194222ab902d3adcc29c"}, + {file = "safetensors-0.4.4-cp310-none-win_amd64.whl", hash = "sha256:4b3e8aa8226d6560de8c2b9d5ff8555ea482599c670610758afdc97f3e021e9c"}, + {file = "safetensors-0.4.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bbaa31f2cb49013818bde319232ccd72da62ee40f7d2aa532083eda5664e85ff"}, + {file = "safetensors-0.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fdcb80f4e9fbb33b58e9bf95e7dbbedff505d1bcd1c05f7c7ce883632710006"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55c14c20be247b8a1aeaf3ab4476265e3ca83096bb8e09bb1a7aa806088def4f"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:949aaa1118660f992dbf0968487b3e3cfdad67f948658ab08c6b5762e90cc8b6"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c11a4ab7debc456326a2bac67f35ee0ac792bcf812c7562a4a28559a5c795e27"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0cea44bba5c5601b297bc8307e4075535b95163402e4906b2e9b82788a2a6df"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9d752c97f6bbe327352f76e5b86442d776abc789249fc5e72eacb49e6916482"}, + {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03f2bb92e61b055ef6cc22883ad1ae898010a95730fa988c60a23800eb742c2c"}, + {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:87bf3f91a9328a941acc44eceffd4e1f5f89b030985b2966637e582157173b98"}, + {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:20d218ec2b6899d29d6895419a58b6e44cc5ff8f0cc29fac8d236a8978ab702e"}, + {file = "safetensors-0.4.4-cp311-none-win32.whl", hash = "sha256:8079486118919f600c603536e2490ca37b3dbd3280e3ad6eaacfe6264605ac8a"}, + {file = "safetensors-0.4.4-cp311-none-win_amd64.whl", hash = "sha256:2f8c2eb0615e2e64ee27d478c7c13f51e5329d7972d9e15528d3e4cfc4a08f0d"}, + {file = "safetensors-0.4.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:baec5675944b4a47749c93c01c73d826ef7d42d36ba8d0dba36336fa80c76426"}, + {file = "safetensors-0.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f15117b96866401825f3e94543145028a2947d19974429246ce59403f49e77c6"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a13a9caea485df164c51be4eb0c87f97f790b7c3213d635eba2314d959fe929"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b54bc4ca5f9b9bba8cd4fb91c24b2446a86b5ae7f8975cf3b7a277353c3127c"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08332c22e03b651c8eb7bf5fc2de90044f3672f43403b3d9ac7e7e0f4f76495e"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb62841e839ee992c37bb75e75891c7f4904e772db3691c59daaca5b4ab960e1"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5b927acc5f2f59547270b0309a46d983edc44be64e1ca27a7fcb0474d6cd67"}, + {file = "safetensors-0.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a69c71b1ae98a8021a09a0b43363b0143b0ce74e7c0e83cacba691b62655fb8"}, + {file = "safetensors-0.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23654ad162c02a5636f0cd520a0310902c4421aab1d91a0b667722a4937cc445"}, + {file = "safetensors-0.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0677c109d949cf53756859160b955b2e75b0eefe952189c184d7be30ecf7e858"}, + {file = "safetensors-0.4.4-cp312-none-win32.whl", hash = "sha256:a51d0ddd4deb8871c6de15a772ef40b3dbd26a3c0451bb9e66bc76fc5a784e5b"}, + {file = "safetensors-0.4.4-cp312-none-win_amd64.whl", hash = "sha256:2d065059e75a798bc1933c293b68d04d79b586bb7f8c921e0ca1e82759d0dbb1"}, + {file = "safetensors-0.4.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9d625692578dd40a112df30c02a1adf068027566abd8e6a74893bb13d441c150"}, + {file = "safetensors-0.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7cabcf39c81e5b988d0adefdaea2eb9b4fd9bd62d5ed6559988c62f36bfa9a89"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8359bef65f49d51476e9811d59c015f0ddae618ee0e44144f5595278c9f8268c"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a32c662e7df9226fd850f054a3ead0e4213a96a70b5ce37b2d26ba27004e013"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c329a4dcc395364a1c0d2d1574d725fe81a840783dda64c31c5a60fc7d41472c"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239ee093b1db877c9f8fe2d71331a97f3b9c7c0d3ab9f09c4851004a11f44b65"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd574145d930cf9405a64f9923600879a5ce51d9f315443a5f706374841327b6"}, + {file = "safetensors-0.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f6784eed29f9e036acb0b7769d9e78a0dc2c72c2d8ba7903005350d817e287a4"}, + {file = "safetensors-0.4.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:65a4a6072436bf0a4825b1c295d248cc17e5f4651e60ee62427a5bcaa8622a7a"}, + {file = "safetensors-0.4.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:df81e3407630de060ae8313da49509c3caa33b1a9415562284eaf3d0c7705f9f"}, + {file = "safetensors-0.4.4-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:e4a0f374200e8443d9746e947ebb346c40f83a3970e75a685ade0adbba5c48d9"}, + {file = "safetensors-0.4.4-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:181fb5f3dee78dae7fd7ec57d02e58f7936498d587c6b7c1c8049ef448c8d285"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb4ac1d8f6b65ec84ddfacd275079e89d9df7c92f95675ba96c4f790a64df6e"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76897944cd9239e8a70955679b531b9a0619f76e25476e57ed373322d9c2075d"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a9e9d1a27e51a0f69e761a3d581c3af46729ec1c988fa1f839e04743026ae35"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:005ef9fc0f47cb9821c40793eb029f712e97278dae84de91cb2b4809b856685d"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26987dac3752688c696c77c3576f951dbbdb8c57f0957a41fb6f933cf84c0b62"}, + {file = "safetensors-0.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c05270b290acd8d249739f40d272a64dd597d5a4b90f27d830e538bc2549303c"}, + {file = "safetensors-0.4.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:068d3a33711fc4d93659c825a04480ff5a3854e1d78632cdc8f37fee917e8a60"}, + {file = "safetensors-0.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:063421ef08ca1021feea8b46951251b90ae91f899234dd78297cbe7c1db73b99"}, + {file = "safetensors-0.4.4-cp37-none-win32.whl", hash = "sha256:d52f5d0615ea83fd853d4e1d8acf93cc2e0223ad4568ba1e1f6ca72e94ea7b9d"}, + {file = "safetensors-0.4.4-cp37-none-win_amd64.whl", hash = "sha256:88a5ac3280232d4ed8e994cbc03b46a1807ce0aa123867b40c4a41f226c61f94"}, + {file = "safetensors-0.4.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3467ab511bfe3360967d7dc53b49f272d59309e57a067dd2405b4d35e7dcf9dc"}, + {file = "safetensors-0.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2ab4c96d922e53670ce25fbb9b63d5ea972e244de4fa1dd97b590d9fd66aacef"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87df18fce4440477c3ef1fd7ae17c704a69a74a77e705a12be135ee0651a0c2d"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e5fe345b2bc7d88587149ac11def1f629d2671c4c34f5df38aed0ba59dc37f8"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f1a3e01dce3cd54060791e7e24588417c98b941baa5974700eeb0b8eb65b0a0"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6bf35e9a8998d8339fd9a05ac4ce465a4d2a2956cc0d837b67c4642ed9e947"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:166c0c52f6488b8538b2a9f3fbc6aad61a7261e170698779b371e81b45f0440d"}, + {file = "safetensors-0.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87e9903b8668a16ef02c08ba4ebc91e57a49c481e9b5866e31d798632805014b"}, + {file = "safetensors-0.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9c421153aa23c323bd8483d4155b4eee82c9a50ac11cccd83539104a8279c64"}, + {file = "safetensors-0.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a4b8617499b2371c7353302c5116a7e0a3a12da66389ce53140e607d3bf7b3d3"}, + {file = "safetensors-0.4.4-cp38-none-win32.whl", hash = "sha256:c6280f5aeafa1731f0a3709463ab33d8e0624321593951aefada5472f0b313fd"}, + {file = "safetensors-0.4.4-cp38-none-win_amd64.whl", hash = "sha256:6ceed6247fc2d33b2a7b7d25d8a0fe645b68798856e0bc7a9800c5fd945eb80f"}, + {file = "safetensors-0.4.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5cf6c6f6193797372adf50c91d0171743d16299491c75acad8650107dffa9269"}, + {file = "safetensors-0.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:419010156b914a3e5da4e4adf992bee050924d0fe423c4b329e523e2c14c3547"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88f6fd5a5c1302ce79993cc5feeadcc795a70f953c762544d01fb02b2db4ea33"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d468cffb82d90789696d5b4d8b6ab8843052cba58a15296691a7a3df55143cd2"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9353c2af2dd467333d4850a16edb66855e795561cd170685178f706c80d2c71e"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83c155b4a33368d9b9c2543e78f2452090fb030c52401ca608ef16fa58c98353"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9850754c434e636ce3dc586f534bb23bcbd78940c304775bee9005bf610e98f1"}, + {file = "safetensors-0.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:275f500b4d26f67b6ec05629a4600645231bd75e4ed42087a7c1801bff04f4b3"}, + {file = "safetensors-0.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5c2308de665b7130cd0e40a2329278226e4cf083f7400c51ca7e19ccfb3886f3"}, + {file = "safetensors-0.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e06a9ebc8656e030ccfe44634f2a541b4b1801cd52e390a53ad8bacbd65f8518"}, + {file = "safetensors-0.4.4-cp39-none-win32.whl", hash = "sha256:ef73df487b7c14b477016947c92708c2d929e1dee2bacdd6fff5a82ed4539537"}, + {file = "safetensors-0.4.4-cp39-none-win_amd64.whl", hash = "sha256:83d054818a8d1198d8bd8bc3ea2aac112a2c19def2bf73758321976788706398"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1d1f34c71371f0e034004a0b583284b45d233dd0b5f64a9125e16b8a01d15067"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a8043a33d58bc9b30dfac90f75712134ca34733ec3d8267b1bd682afe7194f5"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8db8f0c59c84792c12661f8efa85de160f80efe16b87a9d5de91b93f9e0bce3c"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfc1fc38e37630dd12d519bdec9dcd4b345aec9930bb9ce0ed04461f49e58b52"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c9d86d9b13b18aafa88303e2cd21e677f5da2a14c828d2c460fe513af2e9a5"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:43251d7f29a59120a26f5a0d9583b9e112999e500afabcfdcb91606d3c5c89e3"}, + {file = "safetensors-0.4.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2c42e9b277513b81cf507e6121c7b432b3235f980cac04f39f435b7902857f91"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3daacc9a4e3f428a84dd56bf31f20b768eb0b204af891ed68e1f06db9edf546f"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218bbb9b883596715fc9997bb42470bf9f21bb832c3b34c2bf744d6fa8f2bbba"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bd5efc26b39f7fc82d4ab1d86a7f0644c8e34f3699c33f85bfa9a717a030e1b"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56ad9776b65d8743f86698a1973292c966cf3abff627efc44ed60e66cc538ddd"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:30f23e6253c5f43a809dea02dc28a9f5fa747735dc819f10c073fe1b605e97d4"}, + {file = "safetensors-0.4.4-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:5512078d00263de6cb04e9d26c9ae17611098f52357fea856213e38dc462f81f"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b96c3d9266439d17f35fc2173111d93afc1162f168e95aed122c1ca517b1f8f1"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:08d464aa72a9a13826946b4fb9094bb4b16554bbea2e069e20bd903289b6ced9"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:210160816d5a36cf41f48f38473b6f70d7bcb4b0527bedf0889cc0b4c3bb07db"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb276a53717f2bcfb6df0bcf284d8a12069002508d4c1ca715799226024ccd45"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a2c28c6487f17d8db0089e8b2cdc13de859366b94cc6cdc50e1b0a4147b56551"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7915f0c60e4e6e65d90f136d85dd3b429ae9191c36b380e626064694563dbd9f"}, + {file = "safetensors-0.4.4-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:00eea99ae422fbfa0b46065acbc58b46bfafadfcec179d4b4a32d5c45006af6c"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb1ed4fcb0b3c2f3ea2c5767434622fe5d660e5752f21ac2e8d737b1e5e480bb"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:73fc9a0a4343188bdb421783e600bfaf81d0793cd4cce6bafb3c2ed567a74cd5"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c37e6b714200824c73ca6eaf007382de76f39466a46e97558b8dc4cf643cfbf"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f75698c5c5c542417ac4956acfc420f7d4a2396adca63a015fd66641ea751759"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca1a209157f242eb183e209040097118472e169f2e069bfbd40c303e24866543"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:177f2b60a058f92a3cec7a1786c9106c29eca8987ecdfb79ee88126e5f47fa31"}, + {file = "safetensors-0.4.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ee9622e84fe6e4cd4f020e5fda70d6206feff3157731df7151d457fdae18e541"}, + {file = "safetensors-0.4.4.tar.gz", hash = "sha256:5fe3e9b705250d0172ed4e100a811543108653fb2b66b9e702a088ad03772a07"}, +] + +[package.extras] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +mlx = ["mlx (>=0.0.9)"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] + +[[package]] +name = "scalecodec" +version = "1.2.11" +description = "Python SCALE Codec Library" +optional = false +python-versions = "<4,>=3.6" +files = [ + {file = "scalecodec-1.2.11-py3-none-any.whl", hash = "sha256:d15c94965f617caa25096f83a45f5f73031d05e6ee08d6039969f0a64fc35de1"}, + {file = "scalecodec-1.2.11.tar.gz", hash = "sha256:99a2cdbfccdcaf22bd86b86da55a730a2855514ad2309faef4a4a93ac6cbeb8d"}, +] + +[package.dependencies] +base58 = ">=2.0.1" +more-itertools = "*" +requests = ">=2.24.0" + +[package.extras] +test = ["coverage", "pytest"] + +[[package]] +name = "scipy" +version = "1.14.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0"}, + {file = "scipy-1.14.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d"}, + {file = "scipy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69"}, + {file = "scipy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad"}, + {file = "scipy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617"}, + {file = "scipy-1.14.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37"}, + {file = "scipy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2"}, + {file = "scipy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2"}, + {file = "scipy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5"}, + {file = "scipy-1.14.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310"}, + {file = "scipy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066"}, + {file = "scipy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1"}, + {file = "scipy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73"}, + {file = "scipy-1.14.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d"}, + {file = "scipy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e"}, + {file = "scipy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06"}, + {file = "scipy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84"}, + {file = "scipy-1.14.1.tar.gz", hash = "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417"}, +] + +[package.dependencies] +numpy = ">=1.23.5,<2.3" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<=7.3.7)", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "sentencepiece" +version = "0.2.0" +description = "SentencePiece python wrapper" +optional = false +python-versions = "*" +files = [ + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:188779e1298a1c8b8253c7d3ad729cb0a9891e5cef5e5d07ce4592c54869e227"}, + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bed9cf85b296fa2b76fc2547b9cbb691a523864cebaee86304c43a7b4cb1b452"}, + {file = "sentencepiece-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d7b67e724bead13f18db6e1d10b6bbdc454af574d70efbb36f27d90387be1ca3"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fde4b08cfe237be4484c6c7c2e2c75fb862cfeab6bd5449ce4caeafd97b767a"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c378492056202d1c48a4979650981635fd97875a00eabb1f00c6a236b013b5e"}, + {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1380ce6540a368de2ef6d7e6ba14ba8f3258df650d39ba7d833b79ee68a52040"}, + {file = "sentencepiece-0.2.0-cp310-cp310-win32.whl", hash = "sha256:a1151d6a6dd4b43e552394aed0edfe9292820272f0194bd56c7c1660a0c06c3d"}, + {file = "sentencepiece-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:d490142b0521ef22bc1085f061d922a2a6666175bb6b42e588ff95c0db6819b2"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17982700c4f6dbb55fa3594f3d7e5dd1c8659a274af3738e33c987d2a27c9d5c"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c867012c0e8bcd5bdad0f791609101cb5c66acb303ab3270218d6debc68a65e"}, + {file = "sentencepiece-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd6071249c74f779c5b27183295b9202f8dedb68034e716784364443879eaa6"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f90c55a65013cbb8f4d7aab0599bf925cde4adc67ae43a0d323677b5a1c6cb"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b293734059ef656dcd65be62ff771507bea8fed0a711b6733976e1ed3add4553"}, + {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e58b47f933aca74c6a60a79dcb21d5b9e47416256c795c2d58d55cec27f9551d"}, + {file = "sentencepiece-0.2.0-cp311-cp311-win32.whl", hash = "sha256:c581258cf346b327c62c4f1cebd32691826306f6a41d8c4bec43b010dee08e75"}, + {file = "sentencepiece-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0993dbc665f4113017892f1b87c3904a44d0640eda510abcacdfb07f74286d36"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea5f536e32ea8ec96086ee00d7a4a131ce583a1b18d130711707c10e69601cb2"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0cb51f53b6aae3c36bafe41e86167c71af8370a039f542c43b0cce5ef24a68c"}, + {file = "sentencepiece-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3212121805afc58d8b00ab4e7dd1f8f76c203ddb9dc94aa4079618a31cf5da0f"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a3149e3066c2a75e0d68a43eb632d7ae728c7925b517f4c05c40f6f7280ce08"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632f3594d3e7ac8b367bca204cb3fd05a01d5b21455acd097ea4c0e30e2f63d7"}, + {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f295105c6bdbb05bd5e1b0cafbd78ff95036f5d3641e7949455a3f4e5e7c3109"}, + {file = "sentencepiece-0.2.0-cp312-cp312-win32.whl", hash = "sha256:fb89f811e5efd18bab141afc3fea3de141c3f69f3fe9e898f710ae7fe3aab251"}, + {file = "sentencepiece-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a673a72aab81fef5ebe755c6e0cc60087d1f3a4700835d40537183c1703a45f"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4547683f330289ec4f093027bfeb87f9ef023b2eb6f879fdc4a8187c7e0ffb90"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd6175f7eaec7142d2bf6f6597ce7db4c9ac89acf93fcdb17410c3a8b781eeb"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:859ba1acde782609a0910a26a60e16c191a82bf39b5621107552c0cd79fad00f"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcbbef6cc277f8f18f36959e305f10b1c620442d75addc79c21d7073ae581b50"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-win32.whl", hash = "sha256:536b934e244829e3fe6c4f198652cd82da48adb9aa145c9f00889542726dee3d"}, + {file = "sentencepiece-0.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0a91aaa3c769b52440df56fafda683b3aa48e3f2169cf7ee5b8c8454a7f3ae9b"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:787e480ca4c1d08c9985a7eb1eae4345c107729c99e9b5a9a00f2575fc7d4b4b"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4d158189eb2ecffea3a51edf6d25e110b3678ec47f1a40f2d541eafbd8f6250"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e5ca43013e8935f25457a4fca47e315780172c3e821b4b13a890668911c792"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7140d9e5a74a0908493bb4a13f1f16a401297bd755ada4c707e842fbf6f0f5bf"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-win32.whl", hash = "sha256:6cf333625234f247ab357b0bd9836638405ea9082e1543d5b8408f014979dcbf"}, + {file = "sentencepiece-0.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff88712338b01031910e8e61e7239aff3ce8869ee31a47df63cb38aadd591bea"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20813a68d4c221b1849c62c30e1281ea81687894d894b8d4a0f4677d9311e0f5"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:926ef920ae2e8182db31d3f5d081ada57804e3e1d3a8c4ef8b117f9d9fb5a945"}, + {file = "sentencepiece-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89f65f69636b7e9c015b79dff9c9985a9bc7d19ded6f79ef9f1ec920fdd73ecf"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f67eae0dbe6f2d7d6ba50a354623d787c99965f068b81e145d53240198021b0"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98501e075f35dd1a1d5a20f65be26839fcb1938752ec61539af008a5aa6f510b"}, + {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d1d2cc4882e8d6a1adf9d5927d7716f80617fc693385661caff21888972269"}, + {file = "sentencepiece-0.2.0-cp38-cp38-win32.whl", hash = "sha256:b99a308a2e5e569031ab164b74e6fab0b6f37dfb493c32f7816225f4d411a6dd"}, + {file = "sentencepiece-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cdb701eec783d3ec86b7cd4c763adad8eaf6b46db37ee1c36e5e6c44b3fe1b5f"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1e0f9c4d0a6b0af59b613175f019916e28ade076e21242fd5be24340d8a2f64a"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:298f21cc1366eb60311aedba3169d30f885c363ddbf44214b0a587d2908141ad"}, + {file = "sentencepiece-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f1ec95aa1e5dab11f37ac7eff190493fd87770f7a8b81ebc9dd768d1a3c8704"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b06b70af54daa4b4904cbb90b4eb6d35c9f3252fdc86c9c32d5afd4d30118d8"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e37bac44dd6603388cb598c64ff7a76e41ca774646f21c23aadfbf5a2228ab"}, + {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0461324897735512a32d222e3d886e24ad6a499761952b6bda2a9ee6e4313ea5"}, + {file = "sentencepiece-0.2.0-cp39-cp39-win32.whl", hash = "sha256:38aed822fb76435fa1f12185f10465a94ab9e51d5e8a9159e9a540ce926f0ffd"}, + {file = "sentencepiece-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:d8cf876516548b5a1d6ac4745d8b554f5c07891d55da557925e5c13ff0b4e6ad"}, + {file = "sentencepiece-0.2.0.tar.gz", hash = "sha256:a52c19171daaf2e697dc6cbe67684e0fa341b1248966f6aebb541de654d15843"}, +] + +[[package]] +name = "sentry-sdk" +version = "2.13.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.13.0-py2.py3-none-any.whl", hash = "sha256:6beede8fc2ab4043da7f69d95534e320944690680dd9a963178a49de71d726c6"}, + {file = "sentry_sdk-2.13.0.tar.gz", hash = "sha256:8d4a576f7a98eb2fdb40e13106e41f330e5c79d72a68be1316e7852cf4995260"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.26.11" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +anthropic = ["anthropic (>=0.16)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +huggingface-hub = ["huggingface-hub (>=0.22)"] +langchain = ["langchain (>=0.0.210)"] +litestar = ["litestar (>=2.0.0)"] +loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=6)"] + +[[package]] +name = "setproctitle" +version = "1.3.3" +description = "A Python module to customize the process title" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, +] + +[package.extras] +test = ["pytest"] + +[[package]] +name = "setuptools" +version = "73.0.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-73.0.1-py3-none-any.whl", hash = "sha256:b208925fcb9f7af924ed2dc04708ea89791e24bde0d3020b27df0e116088b34e"}, + {file = "setuptools-73.0.1.tar.gz", hash = "sha256:d59a3e788ab7e012ab2c4baed1b376da6366883ee20d7a5fc426816e3d7b1193"}, +] + +[package.extras] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] + +[[package]] +name = "shtab" +version = "1.6.5" +description = "Automagic shell tab completion for Python CLI applications" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, + {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, +] + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.32" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, + {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, + {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "stanza" +version = "1.1.1" +description = "A Python NLP Library for Many Human Languages, by the Stanford NLP Group" +optional = false +python-versions = ">=3.6" +files = [ + {file = "stanza-1.1.1-py3-none-any.whl", hash = "sha256:281e9f47623790e2770cf42f837346724c45a16a767302ec538287c54767eed7"}, + {file = "stanza-1.1.1.tar.gz", hash = "sha256:df8d683e371e06d9a6b9a67be1afa20e0e6328927e7dfd0cc77010eab35bf663"}, +] + +[package.dependencies] +numpy = "*" +protobuf = "*" +requests = "*" +torch = ">=1.3.0" +tqdm = "*" + +[package.extras] +dev = ["check-manifest"] +test = ["coverage"] + +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "substrate-interface" +version = "1.7.10" +description = "Library for interfacing with a Substrate node" +optional = false +python-versions = "<4,>=3.7" +files = [ + {file = "substrate-interface-1.7.10.tar.gz", hash = "sha256:0dec0104abc16d01c3d22700253a84e67430b5e56c46efea71fea47063a8eaa4"}, + {file = "substrate_interface-1.7.10-py3-none-any.whl", hash = "sha256:4873e9f1b75375ed9fcdd12d7bca66c47ab0e9fbd532ec4f9538ceac0f0ab2f5"}, +] + +[package.dependencies] +base58 = ">=1.0.3,<3" +certifi = ">=2019.3.9" +ecdsa = ">=0.17.0,<1" +eth-keys = ">=0.2.1,<1" +eth-utils = ">=1.3.0,<3" +idna = ">=2.1.0,<4" +py-bip39-bindings = ">=0.1.9,<1" +py-ed25519-zebra-bindings = ">=1.0,<2" +py-sr25519-bindings = ">=0.2.0,<1" +pycryptodome = ">=3.11.0,<4" +PyNaCl = ">=1.0.1,<2" +requests = ">=2.21.0,<3" +scalecodec = ">=1.2.10,<1.3" +websocket-client = ">=0.57.0,<2" +xxhash = ">=1.3.0,<4" + +[package.extras] +test = ["coverage", "pytest"] + +[[package]] +name = "sympy" +version = "1.13.2" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, + {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] + +[[package]] +name = "tbb" +version = "2021.13.1" +description = "Intel® oneAPI Threading Building Blocks (oneTBB)" +optional = false +python-versions = "*" +files = [ + {file = "tbb-2021.13.1-py2.py3-none-manylinux1_i686.whl", hash = "sha256:bb5bdea0c0e9e6ad0739e7a8796c2635ce9eccca86dd48c426cd8027ac70fb1d"}, + {file = "tbb-2021.13.1-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:d916359dc685579d09e4b344241550afc1cc034f7f5ec7234c258b6680912d70"}, + {file = "tbb-2021.13.1-py3-none-win32.whl", hash = "sha256:00f5e5a70051650ddd0ab6247c0549521968339ec21002e475cd23b1cbf46d66"}, + {file = "tbb-2021.13.1-py3-none-win_amd64.whl", hash = "sha256:cbf024b2463fdab3ebe3fa6ff453026358e6b903839c80d647e08ad6d0796ee9"}, +] + +[[package]] +name = "tenacity" +version = "8.5.0" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "termcolor" +version = "2.4.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.8" +files = [ + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = true +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tokenizers" +version = "0.19.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "toolz" +version = "0.12.1" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, +] + +[[package]] +name = "torch" +version = "2.3.1" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, + {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, + {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, + {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, + {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, + {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, + {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, + {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, + {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, + {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, + {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, + {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, + {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, + {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, + {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, + {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, + {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, + {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, + {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, + {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + +[[package]] +name = "torchvision" +version = "0.18.1" +description = "image and video datasets and models for torch deep learning" +optional = true +python-versions = ">=3.8" +files = [ + {file = "torchvision-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e694e54b0548dad99c12af6bf0c8e4f3350137d391dcd19af22a1c5f89322b3"}, + {file = "torchvision-0.18.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:0b3bda0aa5b416eeb547143b8eeaf17720bdba9cf516dc991aacb81811aa96a5"}, + {file = "torchvision-0.18.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:573ff523c739405edb085f65cb592f482d28a30e29b0be4c4ba08040b3ae785f"}, + {file = "torchvision-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:ef7bbbc60b38e831a75e547c66ca1784f2ac27100f9e4ddbe9614cef6cbcd942"}, + {file = "torchvision-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80b5d794dd0fdba787adc22f1a367a5ead452327686473cb260dd94364bc56a6"}, + {file = "torchvision-0.18.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:9077cf590cdb3a5e8fdf5cdb71797f8c67713f974cf0228ecb17fcd670ab42f9"}, + {file = "torchvision-0.18.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ceb993a882f1ae7ae373ed39c28d7e3e802205b0e59a7ed84ef4028f0bba8d7f"}, + {file = "torchvision-0.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:52f7436140045dc2239cdc502aa76b2bd8bd676d64244ff154d304aa69852046"}, + {file = "torchvision-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2be6f0bf7c455c89a51a1dbb6f668d36c6edc479f49ac912d745d10df5715657"}, + {file = "torchvision-0.18.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:f118d887bfde3a948a41d56587525401e5cac1b7db2eaca203324d6ed2b1caca"}, + {file = "torchvision-0.18.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:13d24d904f65e62d66a1e0c41faec630bc193867b8a4a01166769e8a8e8df8e9"}, + {file = "torchvision-0.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ed6340b69a63a625e512a66127210d412551d9c5f2ad2978130c6a45bf56cd4a"}, + {file = "torchvision-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b1c3864fa9378c88bce8ad0ef3599f4f25397897ce612e1c245c74b97092f35e"}, + {file = "torchvision-0.18.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:02085a2ffc7461f5c0edb07d6f3455ee1806561f37736b903da820067eea58c7"}, + {file = "torchvision-0.18.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9726c316a2501df8503e5a5dc46a631afd4c515a958972e5b7f7b9c87d2125c0"}, + {file = "torchvision-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:64a2662dbf30db9055d8b201d6e56f312a504e5ccd9d144c57c41622d3c524cb"}, + {file = "torchvision-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:975b8594c0f5288875408acbb74946eea786c5b008d129c0d045d0ead23742bc"}, + {file = "torchvision-0.18.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:da83c8bbd34d8bee48bfa1d1b40e0844bc3cba10ed825a5a8cbe3ce7b62264cd"}, + {file = "torchvision-0.18.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:54bfcd352abb396d5c9c237d200167c178bd136051b138e1e8ef46ce367c2773"}, + {file = "torchvision-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:5c8366a1aeee49e9ea9e64b30d199debdf06b1bd7610a76165eb5d7869c3bde5"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" +torch = "2.3.1" + +[package.extras] +scipy = ["scipy"] + +[[package]] +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "tqdm" +version = "4.66.5" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "transformers" +version = "4.43.3" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "transformers-4.43.3-py3-none-any.whl", hash = "sha256:6552beada5d826c25ff9b79139d237ab9050c6ea96b73d7fd2f8a8ba23ee76a4"}, + {file = "transformers-4.43.3.tar.gz", hash = "sha256:820c5b192bb1bf47250802901a8f0bf581e06b8fded89179d4ef08a1e903ee1c"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.23.2,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.4.1" +tokenizers = ">=0.19,<0.20" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.21.0)"] +agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"] +all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +benchmark = ["optimum-benchmark (>=0.2.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6,<0.15.0)"] +onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.4.4)", "urllib3 (<2.0.0)"] +ray = ["ray[tune] (>=2.7.0)"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +ruff = ["ruff (==0.4.4)"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic", "starlette", "uvicorn"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.4.4)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm (<=0.9.16)"] +tokenizers = ["tokenizers (>=0.19,<0.20)"] +torch = ["accelerate (>=0.21.0)", "torch"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"] +video = ["av (==9.2.0)", "decord (==0.6.0)"] +vision = ["Pillow (>=10.0.1,<=15.0)"] + +[[package]] +name = "triton" +version = "2.3.1" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, + {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, + {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, + {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, + {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, + {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.22.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.20.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = true +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9ebafa0b96c62881d5cafa02d9da2e44c23f9f0cd829f3a32a6aff771449c996"}, + {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35968fc697b0527a06e134999eef859b4034b37aebca537daeb598b9d45a137b"}, + {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b16696f10e59d7580979b420eedf6650010a4a9c3bd8113f24a103dfdb770b10"}, + {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b04d96188d365151d1af41fa2d23257b674e7ead68cfd61c725a422764062ae"}, + {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94707205efbe809dfa3a0d09c08bef1352f5d3d6612a506f10a319933757c006"}, + {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89e8d33bb88d7263f74dc57d69f0063e06b5a5ce50bb9a6b32f5fcbe655f9e73"}, + {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e50289c101495e0d1bb0bfcb4a60adde56e32f4449a67216a1ab2750aa84f037"}, + {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e237f9c1e8a00e7d9ddaa288e535dc337a39bcbf679f290aee9d26df9e72bce9"}, + {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746242cd703dc2b37f9d8b9f173749c15e9a918ddb021575a0205ec29a38d31e"}, + {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82edbfd3df39fb3d108fc079ebc461330f7c2e33dbd002d146bf7c445ba6e756"}, + {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80dc1b139516be2077b3e57ce1cb65bfed09149e1d175e0478e7a987863b68f0"}, + {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f44af67bf39af25db4c1ac27e82e9665717f9c26af2369c404be865c8818dcf"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00"}, + {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0e94b221295b5e69de57a1bd4aeb0b3a29f61be6e1b478bb8a69a73377db7ba"}, + {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fee6044b64c965c425b65a4e17719953b96e065c5b7e09b599ff332bb2744bdf"}, + {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:265a99a2ff41a0fd56c19c3838b29bf54d1d177964c300dad388b27e84fd7847"}, + {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10c2956efcecb981bf9cfb8184d27d5d64b9033f917115a960b83f11bfa0d6b"}, + {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e7d61fe8e8d9335fac1bf8d5d82820b4808dd7a43020c149b63a1ada953d48a6"}, + {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2beee18efd33fa6fdb0976e18475a4042cd31c7433c866e8a09ab604c7c22ff2"}, + {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8c36fdf3e02cec92aed2d44f63565ad1522a499c654f07935c8f9d04db69e95"}, + {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0fac7be202596c7126146660725157d4813aa29a4cc990fe51346f75ff8fde7"}, + {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0fba61846f294bce41eb44d60d58136090ea2b5b99efd21cbdf4e21927c56a"}, + {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95720bae002ac357202e0d866128eb1ac82545bcf0b549b9abe91b5178d9b541"}, + {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36c530d8fa03bfa7085af54a48f2ca16ab74df3ec7108a46ba82fd8b411a2315"}, + {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e97152983442b499d7a71e44f29baa75b3b02e65d9c44ba53b10338e98dedb66"}, + {file = "uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "virtualenv" +version = "20.26.3" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "vllm" +version = "0.5.3.post1" +description = "A high-throughput and memory-efficient inference and serving engine for LLMs" +optional = true +python-versions = ">=3.8" +files = [ + {file = "vllm-0.5.3.post1-cp38-abi3-manylinux1_x86_64.whl", hash = "sha256:bc29055476f527ad11c75d8938a5b40241e6817d546106c4a0234685ebe8b728"}, + {file = "vllm-0.5.3.post1.tar.gz", hash = "sha256:2fd5c0d1b428f332963380b87196b2c331dc92b29dfa3efc32c4022cf0ac0c73"}, +] + +[package.dependencies] +aiohttp = "*" +cmake = ">=3.21" +fastapi = "*" +filelock = ">=3.10.4" +lm-format-enforcer = "0.10.3" +ninja = "*" +numpy = "<2.0.0" +nvidia-ml-py = "*" +openai = "*" +outlines = ">=0.0.43,<0.1" +pillow = "*" +prometheus-client = ">=0.18.0" +prometheus-fastapi-instrumentator = ">=7.0.0" +psutil = "*" +py-cpuinfo = "*" +pydantic = ">=2.0" +pyzmq = "*" +ray = ">=2.9" +requests = "*" +sentencepiece = "*" +tiktoken = ">=0.6.0" +tokenizers = ">=0.19.1" +torch = "2.3.1" +torchvision = "0.18.1" +tqdm = "*" +transformers = ">=4.42.4" +typing-extensions = "*" +uvicorn = {version = "*", extras = ["standard"]} +vllm-flash-attn = "2.5.9.post1" +xformers = "0.0.27" + +[package.extras] +tensorizer = ["tensorizer (>=2.9.0)"] + +[[package]] +name = "vllm-flash-attn" +version = "2.5.9.post1" +description = "Forward-only flash-attn" +optional = true +python-versions = ">=3.8" +files = [ + {file = "vllm_flash_attn-2.5.9.post1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:d2f8227e5232f119f9150143f736d7e336b02723ee85746437c18b5385b170c8"}, + {file = "vllm_flash_attn-2.5.9.post1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e6e1ba5b0d6d9aca9b5aa0a7f3cf902c88fd06eb1a5f0e20d866fd0105244309"}, + {file = "vllm_flash_attn-2.5.9.post1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:71e3e0fe8d90407044737a41a9632e12b4fa2fd9c9ca4b9907b653b0e4eb4462"}, + {file = "vllm_flash_attn-2.5.9.post1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:46314c7ec0c5f917c22f05eb904a7ab78cde3d45d846ee76187a286e4c9e60f9"}, +] + +[package.dependencies] +torch = "2.3.1" + +[[package]] +name = "wandb" +version = "0.17.7" +description = "A CLI and library for interacting with the Weights & Biases API." +optional = false +python-versions = ">=3.7" +files = [ + {file = "wandb-0.17.7-py3-none-any.whl", hash = "sha256:42f37d7d4f1934fc5a33233be1de0f0c8e3bbff04a4403b3ac6030e577cc84e1"}, + {file = "wandb-0.17.7-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:ed3fcf51b533249db306a9dd41893d671eb936f64b8837ffc504dba56609ff47"}, + {file = "wandb-0.17.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f21183b74ed05744b274c7d876d473ae14a985becfbabd005104ce7e78200cf8"}, + {file = "wandb-0.17.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:011cca25b2ca57956d1ff2c84e31c903058cc8f552ecc1d0450ffad34c8a59bd"}, + {file = "wandb-0.17.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df335a67d3fff9299d915c127ad476cdf9e3f2b1d86e025f54ed63c7dab62d72"}, + {file = "wandb-0.17.7-py3-none-win32.whl", hash = "sha256:de7e040fe553e149926437ea2d24a20c6b563092e5a17709c4b99dff8a38470c"}, + {file = "wandb-0.17.7-py3-none-win_amd64.whl", hash = "sha256:c81be25cb1a5322aff95f66a89ca4abcb2a8e98ee09b8938f123a536b967a235"}, + {file = "wandb-0.17.7.tar.gz", hash = "sha256:4623fb7618ff094ebab91101b8b5dcef5b3513d35e867a10f64021ca427bb38d"}, +] + +[package.dependencies] +click = ">=7.1,<8.0.0 || >8.0.0" +docker-pycreds = ">=0.4.0" +gitpython = ">=1.0.0,<3.1.29 || >3.1.29" +platformdirs = "*" +protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<6", markers = "python_version > \"3.9\" or sys_platform != \"linux\""} +psutil = ">=5.0.0" +pyyaml = "*" +requests = ">=2.0.0,<3" +sentry-sdk = ">=1.0.0" +setproctitle = "*" +setuptools = "*" + +[package.extras] +aws = ["boto3"] +azure = ["azure-identity", "azure-storage-blob"] +gcp = ["google-cloud-storage"] +importers = ["filelock", "mlflow", "polars (<=1.2.1)", "rich", "tenacity"] +kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] +launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "jsonschema", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "pyyaml (>=6.0.0)", "tomli", "typing-extensions"] +media = ["bokeh", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit-pypi", "soundfile"] +models = ["cloudpickle"] +perf = ["orjson"] +sweeps = ["sweeps (>=0.2.0)"] +workspaces = ["wandb-workspaces"] + +[[package]] +name = "watchfiles" +version = "0.23.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = true +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.23.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bee8ce357a05c20db04f46c22be2d1a2c6a8ed365b325d08af94358e0688eeb4"}, + {file = "watchfiles-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ccd3011cc7ee2f789af9ebe04745436371d36afe610028921cab9f24bb2987b"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb02d41c33be667e6135e6686f1bb76104c88a312a18faa0ef0262b5bf7f1a0f"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf12ac34c444362f3261fb3ff548f0037ddd4c5bb85f66c4be30d2936beb3c5"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0b2c25040a3c0ce0e66c7779cc045fdfbbb8d59e5aabfe033000b42fe44b53e"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf2be4b9eece4f3da8ba5f244b9e51932ebc441c0867bd6af46a3d97eb068d6"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40cb8fa00028908211eb9f8d47744dca21a4be6766672e1ff3280bee320436f1"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f48c917ffd36ff9a5212614c2d0d585fa8b064ca7e66206fb5c095015bc8207"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9d183e3888ada88185ab17064079c0db8c17e32023f5c278d7bf8014713b1b5b"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9837edf328b2805346f91209b7e660f65fb0e9ca18b7459d075d58db082bf981"}, + {file = "watchfiles-0.23.0-cp310-none-win32.whl", hash = "sha256:296e0b29ab0276ca59d82d2da22cbbdb39a23eed94cca69aed274595fb3dfe42"}, + {file = "watchfiles-0.23.0-cp310-none-win_amd64.whl", hash = "sha256:4ea756e425ab2dfc8ef2a0cb87af8aa7ef7dfc6fc46c6f89bcf382121d4fff75"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:e397b64f7aaf26915bf2ad0f1190f75c855d11eb111cc00f12f97430153c2eab"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4ac73b02ca1824ec0a7351588241fd3953748d3774694aa7ddb5e8e46aef3e3"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130a896d53b48a1cecccfa903f37a1d87dbb74295305f865a3e816452f6e49e4"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c5e7803a65eb2d563c73230e9d693c6539e3c975ccfe62526cadde69f3fda0cf"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1aa4cc85202956d1a65c88d18c7b687b8319dbe6b1aec8969784ef7a10e7d1a"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87f889f6e58849ddb7c5d2cb19e2e074917ed1c6e3ceca50405775166492cca8"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37fd826dac84c6441615aa3f04077adcc5cac7194a021c9f0d69af20fb9fa788"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7db6e36e7a2c15923072e41ea24d9a0cf39658cb0637ecc9307b09d28827e1"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2368c5371c17fdcb5a2ea71c5c9d49f9b128821bfee69503cc38eae00feb3220"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:857af85d445b9ba9178db95658c219dbd77b71b8264e66836a6eba4fbf49c320"}, + {file = "watchfiles-0.23.0-cp311-none-win32.whl", hash = "sha256:1d636c8aeb28cdd04a4aa89030c4b48f8b2954d8483e5f989774fa441c0ed57b"}, + {file = "watchfiles-0.23.0-cp311-none-win_amd64.whl", hash = "sha256:46f1d8069a95885ca529645cdbb05aea5837d799965676e1b2b1f95a4206313e"}, + {file = "watchfiles-0.23.0-cp311-none-win_arm64.whl", hash = "sha256:e495ed2a7943503766c5d1ff05ae9212dc2ce1c0e30a80d4f0d84889298fa304"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1db691bad0243aed27c8354b12d60e8e266b75216ae99d33e927ff5238d270b5"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62d2b18cb1edaba311fbbfe83fb5e53a858ba37cacb01e69bc20553bb70911b8"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e087e8fdf1270d000913c12e6eca44edd02aad3559b3e6b8ef00f0ce76e0636f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd41d5c72417b87c00b1b635738f3c283e737d75c5fa5c3e1c60cd03eac3af77"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e5f3ca0ff47940ce0a389457b35d6df601c317c1e1a9615981c474452f98de1"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6991e3a78f642368b8b1b669327eb6751439f9f7eaaa625fae67dd6070ecfa0b"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f7252f52a09f8fa5435dc82b6af79483118ce6bd51eb74e6269f05ee22a7b9f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e01bcb8d767c58865207a6c2f2792ad763a0fe1119fb0a430f444f5b02a5ea0"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e56fbcdd27fce061854ddec99e015dd779cae186eb36b14471fc9ae713b118c"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bd3e2d64500a6cad28bcd710ee6269fbeb2e5320525acd0cfab5f269ade68581"}, + {file = "watchfiles-0.23.0-cp312-none-win32.whl", hash = "sha256:eb99c954291b2fad0eff98b490aa641e128fbc4a03b11c8a0086de8b7077fb75"}, + {file = "watchfiles-0.23.0-cp312-none-win_amd64.whl", hash = "sha256:dccc858372a56080332ea89b78cfb18efb945da858fabeb67f5a44fa0bcb4ebb"}, + {file = "watchfiles-0.23.0-cp312-none-win_arm64.whl", hash = "sha256:6c21a5467f35c61eafb4e394303720893066897fca937bade5b4f5877d350ff8"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ba31c32f6b4dceeb2be04f717811565159617e28d61a60bb616b6442027fd4b9"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85042ab91814fca99cec4678fc063fb46df4cbb57b4835a1cc2cb7a51e10250e"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24655e8c1c9c114005c3868a3d432c8aa595a786b8493500071e6a52f3d09217"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b1a950ab299a4a78fd6369a97b8763732bfb154fdb433356ec55a5bce9515c1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8d3c5cd327dd6ce0edfc94374fb5883d254fe78a5e9d9dfc237a1897dc73cd1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ff785af8bacdf0be863ec0c428e3288b817e82f3d0c1d652cd9c6d509020dd0"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02b7ba9d4557149410747353e7325010d48edcfe9d609a85cb450f17fd50dc3d"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a1b05c0afb2cd2f48c1ed2ae5487b116e34b93b13074ed3c22ad5c743109f0"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:109a61763e7318d9f821b878589e71229f97366fa6a5c7720687d367f3ab9eef"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9f8e6bb5ac007d4a4027b25f09827ed78cbbd5b9700fd6c54429278dacce05d1"}, + {file = "watchfiles-0.23.0-cp313-none-win32.whl", hash = "sha256:f46c6f0aec8d02a52d97a583782d9af38c19a29900747eb048af358a9c1d8e5b"}, + {file = "watchfiles-0.23.0-cp313-none-win_amd64.whl", hash = "sha256:f449afbb971df5c6faeb0a27bca0427d7b600dd8f4a068492faec18023f0dcff"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:2dddc2487d33e92f8b6222b5fb74ae2cfde5e8e6c44e0248d24ec23befdc5366"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e75695cc952e825fa3e0684a7f4a302f9128721f13eedd8dbd3af2ba450932b8"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2537ef60596511df79b91613a5bb499b63f46f01a11a81b0a2b0dedf645d0a9c"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20b423b58f5fdde704a226b598a2d78165fe29eb5621358fe57ea63f16f165c4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b98732ec893975455708d6fc9a6daab527fc8bbe65be354a3861f8c450a632a4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee1f5fcbf5bc33acc0be9dd31130bcba35d6d2302e4eceafafd7d9018c7755ab"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f195338a5a7b50a058522b39517c50238358d9ad8284fd92943643144c0c03"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524fcb8d59b0dbee2c9b32207084b67b2420f6431ed02c18bd191e6c575f5c48"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0eff099a4df36afaa0eea7a913aa64dcf2cbd4e7a4f319a73012210af4d23810"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a8323daae27ea290ba3350c70c836c0d2b0fb47897fa3b0ca6a5375b952b90d3"}, + {file = "watchfiles-0.23.0-cp38-none-win32.whl", hash = "sha256:aafea64a3ae698695975251f4254df2225e2624185a69534e7fe70581066bc1b"}, + {file = "watchfiles-0.23.0-cp38-none-win_amd64.whl", hash = "sha256:c846884b2e690ba62a51048a097acb6b5cd263d8bd91062cd6137e2880578472"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a753993635eccf1ecb185dedcc69d220dab41804272f45e4aef0a67e790c3eb3"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6bb91fa4d0b392f0f7e27c40981e46dda9eb0fbc84162c7fb478fe115944f491"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1f67312efa3902a8e8496bfa9824d3bec096ff83c4669ea555c6bdd213aa516"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ca6b71dcc50d320c88fb2d88ecd63924934a8abc1673683a242a7ca7d39e781"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aec5c29915caf08771d2507da3ac08e8de24a50f746eb1ed295584ba1820330"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1733b9bc2c8098c6bdb0ff7a3d7cb211753fecb7bd99bdd6df995621ee1a574b"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02ff5d7bd066c6a7673b17c8879cd8ee903078d184802a7ee851449c43521bdd"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18e2de19801b0eaa4c5292a223effb7cfb43904cb742c5317a0ac686ed604765"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8ada449e22198c31fb013ae7e9add887e8d2bd2335401abd3cbc55f8c5083647"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3af1b05361e1cc497bf1be654a664750ae61f5739e4bb094a2be86ec8c6db9b6"}, + {file = "watchfiles-0.23.0-cp39-none-win32.whl", hash = "sha256:486bda18be5d25ab5d932699ceed918f68eb91f45d018b0343e3502e52866e5e"}, + {file = "watchfiles-0.23.0-cp39-none-win_amd64.whl", hash = "sha256:d2d42254b189a346249424fb9bb39182a19289a2409051ee432fb2926bad966a"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9265cf87a5b70147bfb2fec14770ed5b11a5bb83353f0eee1c25a81af5abfe"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f02a259fcbbb5fcfe7a0805b1097ead5ba7a043e318eef1db59f93067f0b49b"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebaebb53b34690da0936c256c1cdb0914f24fb0e03da76d185806df9328abed"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd257f98cff9c6cb39eee1a83c7c3183970d8a8d23e8cf4f47d9a21329285cee"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aba037c1310dd108411d27b3d5815998ef0e83573e47d4219f45753c710f969f"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a96ac14e184aa86dc43b8a22bb53854760a58b2966c2b41580de938e9bf26ed0"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11698bb2ea5e991d10f1f4f83a39a02f91e44e4bd05f01b5c1ec04c9342bf63c"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efadd40fca3a04063d40c4448c9303ce24dd6151dc162cfae4a2a060232ebdcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:556347b0abb4224c5ec688fc58214162e92a500323f50182f994f3ad33385dcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1cf7f486169986c4b9d34087f08ce56a35126600b6fef3028f19ca16d5889071"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f18de0f82c62c4197bea5ecf4389288ac755896aac734bd2cc44004c56e4ac47"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:532e1f2c491274d1333a814e4c5c2e8b92345d41b12dc806cf07aaff786beb66"}, + {file = "watchfiles-0.23.0.tar.gz", hash = "sha256:9338ade39ff24f8086bb005d16c29f8e9f19e55b18dcb04dfa26fcbc09da497b"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "websockets" +version = "13.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = true +python-versions = ">=3.8" +files = [ + {file = "websockets-13.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad4fa707ff9e2ffee019e946257b5300a45137a58f41fbd9a4db8e684ab61528"}, + {file = "websockets-13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6fd757f313c13c34dae9f126d3ba4cf97175859c719e57c6a614b781c86b617e"}, + {file = "websockets-13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cbac2eb7ce0fac755fb983c9247c4a60c4019bcde4c0e4d167aeb17520cc7ef1"}, + {file = "websockets-13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4b83cf7354cbbc058e97b3e545dceb75b8d9cf17fd5a19db419c319ddbaaf7a"}, + {file = "websockets-13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9202c0010c78fad1041e1c5285232b6508d3633f92825687549540a70e9e5901"}, + {file = "websockets-13.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6566e79c8c7cbea75ec450f6e1828945fc5c9a4769ceb1c7b6e22470539712"}, + {file = "websockets-13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e7fcad070dcd9ad37a09d89a4cbc2a5e3e45080b88977c0da87b3090f9f55ead"}, + {file = "websockets-13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a8f7d65358a25172db00c69bcc7df834155ee24229f560d035758fd6613111a"}, + {file = "websockets-13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:63b702fb31e3f058f946ccdfa551f4d57a06f7729c369e8815eb18643099db37"}, + {file = "websockets-13.0-cp310-cp310-win32.whl", hash = "sha256:3a20cf14ba7b482c4a1924b5e061729afb89c890ca9ed44ac4127c6c5986e424"}, + {file = "websockets-13.0-cp310-cp310-win_amd64.whl", hash = "sha256:587245f0704d0bb675f919898d7473e8827a6d578e5a122a21756ca44b811ec8"}, + {file = "websockets-13.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:06df8306c241c235075d2ae77367038e701e53bc8c1bb4f6644f4f53aa6dedd0"}, + {file = "websockets-13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85a1f92a02f0b8c1bf02699731a70a8a74402bb3f82bee36e7768b19a8ed9709"}, + {file = "websockets-13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9ed02c604349068d46d87ef4c2012c112c791f2bec08671903a6bb2bd9c06784"}, + {file = "websockets-13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b89849171b590107f6724a7b0790736daead40926ddf47eadf998b4ff51d6414"}, + {file = "websockets-13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:939a16849d71203628157a5e4a495da63967c744e1e32018e9b9e2689aca64d4"}, + {file = "websockets-13.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad818cdac37c0ad4c58e51cb4964eae4f18b43c4a83cb37170b0d90c31bd80cf"}, + {file = "websockets-13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cbfe82a07596a044de78bb7a62519e71690c5812c26c5f1d4b877e64e4f46309"}, + {file = "websockets-13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e07e76c49f39c5b45cbd7362b94f001ae209a3ea4905ae9a09cfd53b3c76373d"}, + {file = "websockets-13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:372f46a0096cfda23c88f7e42349a33f8375e10912f712e6b496d3a9a557290f"}, + {file = "websockets-13.0-cp311-cp311-win32.whl", hash = "sha256:376a43a4fd96725f13450d3d2e98f4f36c3525c562ab53d9a98dd2950dca9a8a"}, + {file = "websockets-13.0-cp311-cp311-win_amd64.whl", hash = "sha256:2be1382a4daa61e2f3e2be3b3c86932a8db9d1f85297feb6e9df22f391f94452"}, + {file = "websockets-13.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5407c34776b9b77bd89a5f95eb0a34aaf91889e3f911c63f13035220eb50107"}, + {file = "websockets-13.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4782ec789f059f888c1e8fdf94383d0e64b531cffebbf26dd55afd53ab487ca4"}, + {file = "websockets-13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c8feb8e19ef65c9994e652c5b0324abd657bedd0abeb946fb4f5163012c1e730"}, + {file = "websockets-13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f3d2e20c442b58dbac593cb1e02bc02d149a86056cc4126d977ad902472e3b"}, + {file = "websockets-13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e39d393e0ab5b8bd01717cc26f2922026050188947ff54fe6a49dc489f7750b7"}, + {file = "websockets-13.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f661a4205741bdc88ac9c2b2ec003c72cee97e4acd156eb733662ff004ba429"}, + {file = "websockets-13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:384129ad0490e06bab2b98c1da9b488acb35bb11e2464c728376c6f55f0d45f3"}, + {file = "websockets-13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:df5c0eff91f61b8205a6c9f7b255ff390cdb77b61c7b41f79ca10afcbb22b6cb"}, + {file = "websockets-13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02cc9bb1a887dac0e08bf657c5d00aa3fac0d03215d35a599130c2034ae6663a"}, + {file = "websockets-13.0-cp312-cp312-win32.whl", hash = "sha256:d9726d2c9bd6aed8cb994d89b3910ca0079406edce3670886ec828a73e7bdd53"}, + {file = "websockets-13.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0839f35322f7b038d8adcf679e2698c3a483688cc92e3bd15ee4fb06669e9a"}, + {file = "websockets-13.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:da7e501e59857e8e3e9d10586139dc196b80445a591451ca9998aafba1af5278"}, + {file = "websockets-13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a00e1e587c655749afb5b135d8d3edcfe84ec6db864201e40a882e64168610b3"}, + {file = "websockets-13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a7fbf2a8fe7556a8f4e68cb3e736884af7bf93653e79f6219f17ebb75e97d8f0"}, + {file = "websockets-13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ea9c9c7443a97ea4d84d3e4d42d0e8c4235834edae652993abcd2aff94affd7"}, + {file = "websockets-13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35c2221b539b360203f3f9ad168e527bf16d903e385068ae842c186efb13d0ea"}, + {file = "websockets-13.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:358d37c5c431dd050ffb06b4b075505aae3f4f795d7fff9794e5ed96ce99b998"}, + {file = "websockets-13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:038e7a0f1bfafc7bf52915ab3506b7a03d1e06381e9f60440c856e8918138151"}, + {file = "websockets-13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fd038bc9e2c134847f1e0ce3191797fad110756e690c2fdd9702ed34e7a43abb"}, + {file = "websockets-13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93b8c2008f372379fb6e5d2b3f7c9ec32f7b80316543fd3a5ace6610c5cde1b0"}, + {file = "websockets-13.0-cp313-cp313-win32.whl", hash = "sha256:851fd0afb3bc0b73f7c5b5858975d42769a5fdde5314f4ef2c106aec63100687"}, + {file = "websockets-13.0-cp313-cp313-win_amd64.whl", hash = "sha256:7d14901fdcf212804970c30ab9ee8f3f0212e620c7ea93079d6534863444fb4e"}, + {file = "websockets-13.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae7a519a56a714f64c3445cabde9fc2fc927e7eae44f413eae187cddd9e54178"}, + {file = "websockets-13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5575031472ca87302aeb2ce2c2349f4c6ea978c86a9d1289bc5d16058ad4c10a"}, + {file = "websockets-13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9895df6cd0bfe79d09bcd1dbdc03862846f26fbd93797153de954306620c1d00"}, + {file = "websockets-13.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4de299c947a54fca9ce1c5fd4a08eb92ffce91961becb13bd9195f7c6e71b47"}, + {file = "websockets-13.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05c25f7b849702950b6fd0e233989bb73a0d2bc83faa3b7233313ca395205f6d"}, + {file = "websockets-13.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede95125a30602b1691a4b1da88946bf27dae283cf30f22cd2cb8ca4b2e0d119"}, + {file = "websockets-13.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:addf0a16e4983280efed272d8cb3b2e05f0051755372461e7d966b80a6554e16"}, + {file = "websockets-13.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:06b3186e97bf9a33921fa60734d5ed90f2a9b407cce8d23c7333a0984049ef61"}, + {file = "websockets-13.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:eae368cac85adc4c7dc3b0d5f84ffcca609d658db6447387300478e44db70796"}, + {file = "websockets-13.0-cp38-cp38-win32.whl", hash = "sha256:337837ac788d955728b1ab01876d72b73da59819a3388e1c5e8e05c3999f1afa"}, + {file = "websockets-13.0-cp38-cp38-win_amd64.whl", hash = "sha256:f66e00e42f25ca7e91076366303e11c82572ca87cc5aae51e6e9c094f315ab41"}, + {file = "websockets-13.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:94c1c02721139fe9940b38d28fb15b4b782981d800d5f40f9966264fbf23dcc8"}, + {file = "websockets-13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd4ba86513430513e2aa25a441bb538f6f83734dc368a2c5d18afdd39097aa33"}, + {file = "websockets-13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a1ab8f0e0cadc5be5f3f9fa11a663957fecbf483d434762c8dfb8aa44948944a"}, + {file = "websockets-13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3670def5d3dfd5af6f6e2b3b243ea8f1f72d8da1ef927322f0703f85c90d9603"}, + {file = "websockets-13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6058b6be92743358885ad6dcdecb378fde4a4c74d4dd16a089d07580c75a0e80"}, + {file = "websockets-13.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516062a0a8ef5ecbfa4acbaec14b199fc070577834f9fe3d40800a99f92523ca"}, + {file = "websockets-13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da7e918d82e7bdfc6f66d31febe1b2e28a1ca3387315f918de26f5e367f61572"}, + {file = "websockets-13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9cc7f35dcb49a4e32db82a849fcc0714c4d4acc9d2273aded2d61f87d7f660b7"}, + {file = "websockets-13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f5737c53eb2c8ed8f64b50d3dafd3c1dae739f78aa495a288421ac1b3de82717"}, + {file = "websockets-13.0-cp39-cp39-win32.whl", hash = "sha256:265e1f0d3f788ce8ef99dca591a1aec5263b26083ca0934467ad9a1d1181067c"}, + {file = "websockets-13.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d70c89e3d3b347a7c4d3c33f8d323f0584c9ceb69b82c2ef8a174ca84ea3d4a"}, + {file = "websockets-13.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:602cbd010d8c21c8475f1798b705bb18567eb189c533ab5ef568bc3033fdf417"}, + {file = "websockets-13.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:bf8eb5dca4f484a60f5327b044e842e0d7f7cdbf02ea6dc4a4f811259f1f1f0b"}, + {file = "websockets-13.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d795c1802d99a643bf689b277e8604c14b5af1bc0a31dade2cd7a678087212"}, + {file = "websockets-13.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:788bc841d250beccff67a20a5a53a15657a60111ef9c0c0a97fbdd614fae0fe2"}, + {file = "websockets-13.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7334752052532c156d28b8eaf3558137e115c7871ea82adff69b6d94a7bee273"}, + {file = "websockets-13.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7a1963302947332c3039e3f66209ec73b1626f8a0191649e0713c391e9f5b0d"}, + {file = "websockets-13.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e1cf4e1eb84b4fd74a47688e8b0940c89a04ad9f6937afa43d468e71128cd68"}, + {file = "websockets-13.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:c026ee729c4ce55708a14b839ba35086dfae265fc12813b62d34ce33f4980c1c"}, + {file = "websockets-13.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5f9d23fbbf96eefde836d9692670bfc89e2d159f456d499c5efcf6a6281c1af"}, + {file = "websockets-13.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ad684cb7efce227d756bae3e8484f2e56aa128398753b54245efdfbd1108f2c"}, + {file = "websockets-13.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e10b3fbed7be4a59831d3a939900e50fcd34d93716e433d4193a4d0d1d335d"}, + {file = "websockets-13.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d42a818e634f789350cd8fb413a3f5eec1cf0400a53d02062534c41519f5125c"}, + {file = "websockets-13.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5ba5e9b332267d0f2c33ede390061850f1ac3ee6cd1bdcf4c5ea33ead971966"}, + {file = "websockets-13.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9af457ed593e35f467140d8b61d425495b127744a9d65d45a366f8678449a23"}, + {file = "websockets-13.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcea3eb58c09c3a31cc83b45c06d5907f02ddaf10920aaa6443975310f699b95"}, + {file = "websockets-13.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c210d1460dc8d326ffdef9703c2f83269b7539a1690ad11ae04162bc1878d33d"}, + {file = "websockets-13.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b32f38bc81170fd56d0482d505b556e52bf9078b36819a8ba52624bd6667e39e"}, + {file = "websockets-13.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:81a11a1ddd5320429db47c04d35119c3e674d215173d87aaeb06ae80f6e9031f"}, + {file = "websockets-13.0-py3-none-any.whl", hash = "sha256:dbbac01e80aee253d44c4f098ab3cc17c822518519e869b284cfbb8cd16cc9de"}, + {file = "websockets-13.0.tar.gz", hash = "sha256:b7bf950234a482b7461afdb2ec99eee3548ec4d53f418c7990bb79c620476602"}, +] + +[[package]] +name = "wheel" +version = "0.44.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"}, + {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + +[[package]] +name = "wikipedia" +version = "1.4.0" +description = "Wikipedia API for Python" +optional = false +python-versions = "*" +files = [ + {file = "wikipedia-1.4.0.tar.gz", hash = "sha256:db0fad1829fdd441b1852306e9856398204dc0786d2996dd2e0c8bb8e26133b2"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +requests = ">=2.0.0,<3.0.0" + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "xformers" +version = "0.0.27" +description = "XFormers: A collection of composable Transformer building blocks." +optional = true +python-versions = ">=3.7" +files = [ + {file = "xformers-0.0.27-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d0efa09336da8bbff5335ab29c46f7baff03eb1fabd2d6daad4df5fd0f3ba396"}, + {file = "xformers-0.0.27-cp310-cp310-win_amd64.whl", hash = "sha256:bef8100b1c53cdb5f884414b7daea0cec83966d977a70cbb7947786e473a4a1b"}, + {file = "xformers-0.0.27-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:253a647e40d5381dca6f556893d64e642cf839dda8bac46c3bea07292ca3f8fc"}, + {file = "xformers-0.0.27-cp311-cp311-win_amd64.whl", hash = "sha256:93a41717c6edbfda4ca55a583d6d0a3e0726262ffa7f7f26ab439d84a7c482b9"}, + {file = "xformers-0.0.27-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:dc55cc75bebd522ce77672f5e49205d02e4d6f6eff6b3ee6ebc1de42aec66b49"}, + {file = "xformers-0.0.27-cp312-cp312-win_amd64.whl", hash = "sha256:eb2ca11ee4f189f96ac10698e81aeec7dfe157c4180bb6a88e37ad50b14c7d7d"}, + {file = "xformers-0.0.27-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:b92348c98a96b01fa1b385f07914394363cd3c008d93978049da0e2212520daa"}, + {file = "xformers-0.0.27-cp38-cp38-win_amd64.whl", hash = "sha256:d79457fd3d3b655527596e8de16787928b38ef21007bcd9fdb193c348a9516a4"}, + {file = "xformers-0.0.27-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f88ccc7613a72be9cf75e2f7c0cf6bb6ec244bdcce9fe8b3448af48a685c7ab5"}, + {file = "xformers-0.0.27-cp39-cp39-win_amd64.whl", hash = "sha256:67ab5341c7dbfeb96450778a1cd358710c4e71566dd1115246c766d01f2d5417"}, + {file = "xformers-0.0.27.tar.gz", hash = "sha256:7bf9db7330fbe7b9b633d720db6f2284f939ec1564e4916bae57aafdc265d43d"}, +] + +[package.dependencies] +numpy = "*" +torch = "2.3.1" + +[[package]] +name = "xxhash" +version = "3.5.0" +description = "Python binding for xxHash" +optional = false +python-versions = ">=3.7" +files = [ + {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, + {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5d3e570ef46adaf93fc81b44aca6002b5a4d8ca11bd0580c07eac537f36680"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cb29a034301e2982df8b1fe6328a84f4b676106a13e9135a0d7e0c3e9f806da"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d0d307d27099bb0cbeea7260eb39ed4fdb99c5542e21e94bb6fd29e49c57a23"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0342aafd421795d740e514bc9858ebddfc705a75a8c5046ac56d85fe97bf196"}, + {file = "xxhash-3.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dbbd9892c5ebffeca1ed620cf0ade13eb55a0d8c84e0751a6653adc6ac40d0c"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4cc2d67fdb4d057730c75a64c5923abfa17775ae234a71b0200346bfb0a7f482"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ec28adb204b759306a3d64358a5e5c07d7b1dd0ccbce04aa76cb9377b7b70296"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1328f6d8cca2b86acb14104e381225a3d7b42c92c4b86ceae814e5c400dbb415"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8d47ebd9f5d9607fd039c1fbf4994e3b071ea23eff42f4ecef246ab2b7334198"}, + {file = "xxhash-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b96d559e0fcddd3343c510a0fe2b127fbff16bf346dd76280b82292567523442"}, + {file = "xxhash-3.5.0-cp310-cp310-win32.whl", hash = "sha256:61c722ed8d49ac9bc26c7071eeaa1f6ff24053d553146d5df031802deffd03da"}, + {file = "xxhash-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9bed5144c6923cc902cd14bb8963f2d5e034def4486ab0bbe1f58f03f042f9a9"}, + {file = "xxhash-3.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:893074d651cf25c1cc14e3bea4fceefd67f2921b1bb8e40fcfeba56820de80c6"}, + {file = "xxhash-3.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1"}, + {file = "xxhash-3.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a"}, + {file = "xxhash-3.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d"}, + {file = "xxhash-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839"}, + {file = "xxhash-3.5.0-cp311-cp311-win32.whl", hash = "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da"}, + {file = "xxhash-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58"}, + {file = "xxhash-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3"}, + {file = "xxhash-3.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00"}, + {file = "xxhash-3.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6"}, + {file = "xxhash-3.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab"}, + {file = "xxhash-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e"}, + {file = "xxhash-3.5.0-cp312-cp312-win32.whl", hash = "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8"}, + {file = "xxhash-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e"}, + {file = "xxhash-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2"}, + {file = "xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6"}, + {file = "xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb"}, + {file = "xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7"}, + {file = "xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c"}, + {file = "xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637"}, + {file = "xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43"}, + {file = "xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b"}, + {file = "xxhash-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6e5f70f6dca1d3b09bccb7daf4e087075ff776e3da9ac870f86ca316736bb4aa"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e76e83efc7b443052dd1e585a76201e40b3411fe3da7af4fe434ec51b2f163b"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33eac61d0796ca0591f94548dcfe37bb193671e0c9bcf065789b5792f2eda644"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ec70a89be933ea49222fafc3999987d7899fc676f688dd12252509434636622"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86b8e7f703ec6ff4f351cfdb9f428955859537125904aa8c963604f2e9d3e7"}, + {file = "xxhash-3.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0adfbd36003d9f86c8c97110039f7539b379f28656a04097e7434d3eaf9aa131"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:63107013578c8a730419adc05608756c3fa640bdc6abe806c3123a49fb829f43"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:683b94dbd1ca67557850b86423318a2e323511648f9f3f7b1840408a02b9a48c"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5d2a01dcce81789cf4b12d478b5464632204f4c834dc2d064902ee27d2d1f0ee"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:a9d360a792cbcce2fe7b66b8d51274ec297c53cbc423401480e53b26161a290d"}, + {file = "xxhash-3.5.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f0b48edbebea1b7421a9c687c304f7b44d0677c46498a046079d445454504737"}, + {file = "xxhash-3.5.0-cp37-cp37m-win32.whl", hash = "sha256:7ccb800c9418e438b44b060a32adeb8393764da7441eb52aa2aa195448935306"}, + {file = "xxhash-3.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c3bc7bf8cb8806f8d1c9bf149c18708cb1c406520097d6b0a73977460ea03602"}, + {file = "xxhash-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:74752ecaa544657d88b1d1c94ae68031e364a4d47005a90288f3bab3da3c970f"}, + {file = "xxhash-3.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dee1316133c9b463aa81aca676bc506d3f80d8f65aeb0bba2b78d0b30c51d7bd"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:602d339548d35a8579c6b013339fb34aee2df9b4e105f985443d2860e4d7ffaa"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:695735deeddfb35da1677dbc16a083445360e37ff46d8ac5c6fcd64917ff9ade"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1030a39ba01b0c519b1a82f80e8802630d16ab95dc3f2b2386a0b5c8ed5cbb10"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5bc08f33c4966f4eb6590d6ff3ceae76151ad744576b5fc6c4ba8edd459fdec"}, + {file = "xxhash-3.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160e0c19ee500482ddfb5d5570a0415f565d8ae2b3fd69c5dcfce8a58107b1c3"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f1abffa122452481a61c3551ab3c89d72238e279e517705b8b03847b1d93d738"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d5e9db7ef3ecbfc0b4733579cea45713a76852b002cf605420b12ef3ef1ec148"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:23241ff6423378a731d84864bf923a41649dc67b144debd1077f02e6249a0d54"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:82b833d5563fefd6fceafb1aed2f3f3ebe19f84760fdd289f8b926731c2e6e91"}, + {file = "xxhash-3.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a80ad0ffd78bef9509eee27b4a29e56f5414b87fb01a888353e3d5bda7038bd"}, + {file = "xxhash-3.5.0-cp38-cp38-win32.whl", hash = "sha256:50ac2184ffb1b999e11e27c7e3e70cc1139047e7ebc1aa95ed12f4269abe98d4"}, + {file = "xxhash-3.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:392f52ebbb932db566973693de48f15ce787cabd15cf6334e855ed22ea0be5b3"}, + {file = "xxhash-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc8cdd7f33d57f0468b0614ae634cc38ab9202c6957a60e31d285a71ebe0301"}, + {file = "xxhash-3.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0c48b6300cd0b0106bf49169c3e0536408dfbeb1ccb53180068a18b03c662ab"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe1a92cfbaa0a1253e339ccec42dbe6db262615e52df591b68726ab10338003f"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33513d6cc3ed3b559134fb307aae9bdd94d7e7c02907b37896a6c45ff9ce51bd"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eefc37f6138f522e771ac6db71a6d4838ec7933939676f3753eafd7d3f4c40bc"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a606c8070ada8aa2a88e181773fa1ef17ba65ce5dd168b9d08038e2a61b33754"}, + {file = "xxhash-3.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42eca420c8fa072cc1dd62597635d140e78e384a79bb4944f825fbef8bfeeef6"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:604253b2143e13218ff1ef0b59ce67f18b8bd1c4205d2ffda22b09b426386898"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6e93a5ad22f434d7876665444a97e713a8f60b5b1a3521e8df11b98309bff833"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7a46e1d6d2817ba8024de44c4fd79913a90e5f7265434cef97026215b7d30df6"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:30eb2efe6503c379b7ab99c81ba4a779748e3830241f032ab46bd182bf5873af"}, + {file = "xxhash-3.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c8aa771ff2c13dd9cda8166d685d7333d389fae30a4d2bb39d63ab5775de8606"}, + {file = "xxhash-3.5.0-cp39-cp39-win32.whl", hash = "sha256:5ed9ebc46f24cf91034544b26b131241b699edbfc99ec5e7f8f3d02d6eb7fba4"}, + {file = "xxhash-3.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:220f3f896c6b8d0316f63f16c077d52c412619e475f9372333474ee15133a558"}, + {file = "xxhash-3.5.0-cp39-cp39-win_arm64.whl", hash = "sha256:a7b1d8315d9b5e9f89eb2933b73afae6ec9597a258d52190944437158b49d38e"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2014c5b3ff15e64feecb6b713af12093f75b7926049e26a580e94dcad3c73d8c"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fab81ef75003eda96239a23eda4e4543cedc22e34c373edcaf744e721a163986"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2febf914ace002132aa09169cc572e0d8959d0f305f93d5828c4836f9bc5a6"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d3a10609c51da2a1c0ea0293fc3968ca0a18bd73838455b5bca3069d7f8e32b"}, + {file = "xxhash-3.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a74f23335b9689b66eb6dbe2a931a88fcd7a4c2cc4b1cb0edba8ce381c7a1da"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b4154c00eb22e4d543f472cfca430e7962a0f1d0f3778334f2e08a7ba59363c"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d30bbc1644f726b825b3278764240f449d75f1a8bdda892e641d4a688b1494ae"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa0b72f2423e2aa53077e54a61c28e181d23effeaafd73fcb9c494e60930c8e"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13de2b76c1835399b2e419a296d5b38dc4855385d9e96916299170085ef72f57"}, + {file = "xxhash-3.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0691bfcc4f9c656bcb96cc5db94b4d75980b9d5589f2e59de790091028580837"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:297595fe6138d4da2c8ce9e72a04d73e58725bb60f3a19048bc96ab2ff31c692"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc1276d369452040cbb943300dc8abeedab14245ea44056a2943183822513a18"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2061188a1ba352fc699c82bff722f4baacb4b4b8b2f0c745d2001e56d0dfb514"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c384c434021e4f62b8d9ba0bc9467e14d394893077e2c66d826243025e1f81"}, + {file = "xxhash-3.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e6a4dd644d72ab316b580a1c120b375890e4c52ec392d4aef3c63361ec4d77d1"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:531af8845aaadcadf951b7e0c1345c6b9c68a990eeb74ff9acd8501a0ad6a1c9"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce379bcaa9fcc00f19affa7773084dd09f5b59947b3fb47a1ceb0179f91aaa1"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd1b2281d01723f076df3c8188f43f2472248a6b63118b036e641243656b1b0f"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c770750cc80e8694492244bca7251385188bc5597b6a39d98a9f30e8da984e0"}, + {file = "xxhash-3.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b150b8467852e1bd844387459aa6fbe11d7f38b56e901f9f3b3e6aba0d660240"}, + {file = "xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zstandard" +version = "0.23.0" +description = "Zstandard bindings for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, + {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c"}, + {file = "zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813"}, + {file = "zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4"}, + {file = "zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e"}, + {file = "zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473"}, + {file = "zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160"}, + {file = "zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0"}, + {file = "zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094"}, + {file = "zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35"}, + {file = "zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d"}, + {file = "zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b"}, + {file = "zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9"}, + {file = "zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33"}, + {file = "zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd"}, + {file = "zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b"}, + {file = "zstandard-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc"}, + {file = "zstandard-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e"}, + {file = "zstandard-0.23.0-cp38-cp38-win32.whl", hash = "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9"}, + {file = "zstandard-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f"}, + {file = "zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb"}, + {file = "zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5"}, + {file = "zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274"}, + {file = "zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58"}, + {file = "zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09"}, +] + +[package.dependencies] +cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} + +[package.extras] +cffi = ["cffi (>=1.11)"] + +[extras] +validator = ["organic-scoring", "vllm"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10 <3.11" +content-hash = "c07308bc8658fc7d91904b7b31600ad6d7d37ded5c754456575ea2a051580c37" diff --git a/prompting/__init__.py b/prompting/__init__.py index 8b97c218..7e19d020 100644 --- a/prompting/__init__.py +++ b/prompting/__init__.py @@ -1,66 +1,17 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao +from importlib.metadata import version +from loguru import logger -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. +def _version_to_int(version_str: str) -> int: + version_split = version_str.split(".") + major = int(version_split[0]) + minor = int(version_split[1]) + patch = int(version_split[2]) + return (10000 * major) + (100 * minor) + patch -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -# Define the version of the template module. -__version__ = "2.6.2" -version_split = __version__.split(".") -__spec_version__ = ( - (10000 * int(version_split[0])) - + (100 * int(version_split[1])) - + (1 * int(version_split[2])) -) +__version__ = version("prompting") +# Used by W&B logging, which expects an integer version. +__spec_version__ = _version_to_int(__version__) -# Import all submodules. -from . import protocol -from . import base -from . import rewards -from . import tasks -from . import tools -from . import utils - -from . import forward -from . import agent -from . import conversation -from . import dendrite -from . import shared -from . import validator - -from .llms import hf - -from .tasks import TASKS -from .tools import DATASETS -from .task_registry import TASK_REGISTRY - -# Assert that all tasks have a dataset, and all tasks/datasets are in the TASKS and DATASETS dictionaries. -registry_missing_task = set(TASKS.keys()) - set(TASK_REGISTRY.keys()) -registry_extra_task = set(TASK_REGISTRY.keys()) - set(TASKS.keys()) -assert ( - not registry_missing_task -), f"Missing tasks in TASK_REGISTRY: {registry_missing_task}" -assert not registry_extra_task, f"Extra tasks in TASK_REGISTRY: {registry_extra_task}" - -registry_datasets = set( - [dataset for task, datasets in TASK_REGISTRY.items() for dataset in datasets] -) -registry_missing_dataset = registry_datasets - set(DATASETS.keys()) -registry_extra_dataset = set(DATASETS.keys()) - registry_datasets -assert ( - not registry_missing_dataset -), f"Missing datasets in TASK_REGISTRY: {registry_missing_dataset}" -assert ( - not registry_extra_dataset -), f"Extra datasets in TASK_REGISTRY: {registry_extra_dataset}" +logger.info(f"Project version: {__version__}") diff --git a/prompting/agent.py b/prompting/agent.py deleted file mode 100644 index 14386102..00000000 --- a/prompting/agent.py +++ /dev/null @@ -1,145 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import textwrap -import time -import bittensor as bt -from dataclasses import asdict -from typing import Optional - -from prompting.tasks import Task -from prompting.llms import vLLM_LLM -from prompting.cleaners.cleaner import CleanerPipeline -from prompting.persona import Persona, create_persona - -from transformers import Pipeline - - -class HumanAgent(vLLM_LLM): - "Agent that impersonates a human user and makes queries based on its goal." - - @property - def progress(self): - return int(self.task.complete) - - @property - def finished(self): - return self.progress == 1 - - system_prompt_template = textwrap.dedent( - """This is a roleplaying game where you are impersonating {mood} human user with a specific persona. As a human, you are using AI assistant to {desc} related to {topic} ({subtopic}) in a {tone} tone. You don't need to greet the assistant or be polite, unless this is part of your persona. The spelling and grammar of your messages should also reflect your persona. - - Your singular focus is to use the assistant to {goal}: {query} - """ - ) - - def __init__( - self, - task: Task, - llm_pipeline: Pipeline, - system_template: str = None, - persona: Persona = None, - begin_conversation=True, - system_prompt: Optional[str] = None, - ): - self.persona = persona - self.task = task - self.llm_pipeline = llm_pipeline - - if system_template is not None: - self.system_prompt_template = system_template - - self.system_prompt = system_prompt - if self.system_prompt is None: - if self.persona is None: - self.persona = create_persona() - self.system_prompt = self.system_prompt_template.format( - mood=self.persona.mood, - tone=self.persona.tone, - **self.task.__state_dict__(), # Adds desc, subject, topic - ) - - super().__init__( - llm_pipeline=llm_pipeline, - system_prompt=self.system_prompt, - max_new_tokens=256, - ) - - if begin_conversation: - bt.logging.info("🤖 Generating challenge query...") - # initiates the conversation with the miner - self.challenge = self.create_challenge() - - def create_challenge(self) -> str: - """Creates the opening question of the conversation which is based on the task query but dressed in the persona of the user.""" - t0 = time.time() - - cleaner = None - if hasattr(self.task, "cleaning_pipeline"): - cleaner = CleanerPipeline(cleaning_pipeline=self.task.cleaning_pipeline) - if self.task.challenge_type == "inference": - self.challenge = super().query( - message="Ask a question related to your goal", cleaner=cleaner - ) - elif self.task.challenge_type == "paraphrase": - self.challenge = self.task.challenge_template.next(self.task.query) - elif self.task.challenge_type == "query": - self.challenge = self.task.query - else: - bt.logging.error( - f"Task {self.task.name} has challenge type of: {self.task.challenge_type} which is not supported." - ) - self.challenge = self.task.format_challenge(self.challenge) - self.challenge_time = time.time() - t0 - - return self.challenge - - def __state_dict__(self, full=False): - return { - "challenge": self.challenge, - "challenge_time": self.challenge_time, - **self.task.__state_dict__(full=full), - **asdict(self.persona), - "system_prompt": self.system_prompt, - } - - def __str__(self): - return self.system_prompt - - def __repr__(self): - return str(self) - - def continue_conversation(self, miner_response: str): - # Generates response to miner response - self.query(miner_response) - # Updates current prompt with new state of conversation - # self.prompt = self.get_history_prompt() - - def update_progress( - self, top_reward: float, top_response: str, continue_conversation=False - ): - if top_reward > self.task.reward_threshold: - self.task.complete = True - self.messages.append({"content": top_response, "role": "user"}) - - bt.logging.info("Agent finished its goal") - return - - if continue_conversation: - bt.logging.info( - "↪ Agent did not finish its goal, continuing conversation..." - ) - self.continue_conversation(miner_response=top_response) diff --git a/prompting/base/dendrite.py b/prompting/base/dendrite.py new file mode 100644 index 00000000..fa975a98 --- /dev/null +++ b/prompting/base/dendrite.py @@ -0,0 +1,77 @@ +import numpy as np +from prompting.base.protocol import StreamPromptingSynapse +from prompting.utils.misc import serialize_exception_to_string +from pydantic import BaseModel, model_validator, ConfigDict + + +class SynapseStreamResult(BaseModel): + exception: BaseException | None = None + uid: int | None = None + accumulated_chunks: list[str] | None = None + accumulated_chunks_timings: list[float] | None = None + tokens_per_chunk: list[int] | None = None + synapse: StreamPromptingSynapse | None = None + + model_config = ConfigDict(arbitrary_types_allowed=True) + + def model_dump(self): + # without a custom model dump, this leads to serialization errors in DendriteResponseEvent... + # TODO: This isn't great, ideally find a cleaner workaround + return { + "exception": self.exception, + "uid": self.uid, + "accumulated_chunks": self.accumulated_chunks, + "accumulated_chunks_timings": self.accumulated_chunks_timings, + "tokens_per_chunk": self.tokens_per_chunk, + } + + +class DendriteResponseEvent(BaseModel): + uids: np.ndarray + timeout: float + stream_results: list[SynapseStreamResult] + completions: list[str] = [] + status_messages: list[str] = [] + status_codes: list[int] = [] + timings: list[float] = [] + stream_results_uids: list[int] = [] + stream_results_exceptions: list[str] = [] + stream_results_all_chunks: list[list[str]] = [] + stream_results_all_chunks_timings: list[list[float]] = [] + stream_results_all_tokens_per_chunk: list[list[int]] = [] + + model_config = ConfigDict(arbitrary_types_allowed=True) + + @model_validator(mode="after") + def process_stream_results(self) -> "DendriteResponseEvent": + for stream_result in self.stream_results: + # when passing this to a pydantic model, this method can be called multiple times, leading + # to duplicating the arrays. If the arrays are already filled, we can skip this step + if len(self.completions) == len(self.stream_results): + return self + # for some reason the language server needs this line to understand the type of stream_result + stream_result: SynapseStreamResult + + synapse = stream_result.synapse + + self.completions.append(synapse.completion) + self.status_messages.append(synapse.dendrite.status_message) + status_code = synapse.dendrite.status_code + + if len(synapse.completion) == 0 and status_code == 200: + status_code = 204 + + self.status_codes.append(status_code) + process_time = synapse.dendrite.process_time or 0 + if status_code == 200 or status_code == 204: + self.timings.append(process_time) + elif status_code == 408: + self.timings.append(self.timeout) + else: + self.timings.append(0) + + self.stream_results_uids.append(stream_result.uid) + self.stream_results_exceptions.append(serialize_exception_to_string(stream_result.exception)) + self.stream_results_all_chunks.append(stream_result.accumulated_chunks) + self.stream_results_all_chunks_timings.append(stream_result.accumulated_chunks_timings) + self.stream_results_all_tokens_per_chunk.append(stream_result.tokens_per_chunk) diff --git a/prompting/base/miner.py b/prompting/base/miner.py index f0653abe..a938e2c6 100644 --- a/prompting/base/miner.py +++ b/prompting/base/miner.py @@ -1,71 +1,54 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - import time -import argparse -import asyncio import threading import bittensor as bt -from prompting.protocol import StreamPromptingSynapse +from prompting.base.protocol import StreamPromptingSynapse from prompting.base.neuron import BaseNeuron -from prompting.utils.config import add_miner_args from traceback import print_exception +from prompting.settings import settings +from loguru import logger +from pydantic import BaseModel, model_validator, ConfigDict +from typing import Tuple +from prompting.utils.logging import init_wandb, MinerEvent, log_event -class BaseStreamMinerNeuron(BaseNeuron): +class BaseStreamMinerNeuron(BaseModel, BaseNeuron): """ Base class for Bittensor miners. """ - @classmethod - def add_args(cls, parser: argparse.ArgumentParser): - super().add_args(parser) - add_miner_args(cls, parser) - - def __init__(self, config=None): - super().__init__(config=config) - - # Warn if allowing incoming requests from anyone. - if not self.config.blacklist.force_validator_permit: - bt.logging.warning( - "You are allowing non-validators to send requests to your miner. This is a security risk." - ) - if self.config.blacklist.allow_non_registered: - bt.logging.warning( - "You are allowing non-registered entities to send requests to your miner. This is a security risk." - ) - - # The axon handles request processing, allowing validators to send this miner requests. - self.axon = bt.axon(wallet=self.wallet, config=self.config) - - # Attach determiners which functions are called when servicing a request. - bt.logging.info(f"Attaching forward function to miner axon.") + step: int = 0 + # wallet: bt.wallet | None = None + axon: bt.axon | None = None + # subtensor: bt.subtensor | None = None + # metagraph: bt.metagraph | None = None + should_exit: bool = False + is_running: bool = False + thread: threading.Thread = None + uid: int | None = None + + model_config = ConfigDict(arbitrary_types_allowed=True) + + @model_validator(mode="after") + def attach_axon(self) -> "BaseStreamMinerNeuron": + # note that this initialization has to happen in the validator because the objects + # are not picklable and because pydantic deepcopies things it breaks + # settings.WALLET = bt.wallet(name=settings.WALLET_NAME, hotkey=settings.HOTKEY) + self.axon = bt.axon(wallet=settings.WALLET, port=settings.AXON_PORT) + logger.info("Attaching axon") self.axon.attach( forward_fn=self._forward, blacklist_fn=self.blacklist, priority_fn=self.priority, ) - bt.logging.info(f"Axon created: {self.axon}") - - # Instantiate runners - self.should_exit: bool = False - self.is_running: bool = False - self.thread: threading.Thread = None - self.lock = asyncio.Lock() + # settings.SUBTENSOR = bt.subtensor(network=settings.SUBTENSOR) + # settings.METAGRAPH = bt.metagraph(netuid=settings.NETUID, network=settings.SUBTENSOR_NETWORK, sync=True, lite=False) + self.uid = settings.METAGRAPH.hotkeys.index(settings.WALLET.hotkey.ss58_address) + logger.info(f"Axon created: {self.axon}; miner uid: {self.uid}") + self.axon.serve(netuid=settings.NETUID, subtensor=settings.SUBTENSOR) + + if settings.WANDB_ON: + init_wandb(neuron="miner") + return self def run(self): """ @@ -95,23 +78,17 @@ def run(self): # Serve passes the axon information to the network + netuid we are hosting on. # This will auto-update if the axon port of external ip have changed. - bt.logging.info( - f"Serving miner axon {self.axon} on network: {self.config.subtensor.chain_endpoint} with netuid: {self.config.netuid}" - ) - self.axon.serve(netuid=self.config.netuid, subtensor=self.subtensor) + logger.info(f"Serving miner axon {self.axon} with netuid: {settings.NETUID}") # Start starts the miner's axon, making it active on the network. self.axon.start() - bt.logging.info(f"Miner starting at block: {self.block}") + logger.info(f"Miner starting at block: {settings.SUBTENSOR.get_current_block()}") last_update_block = 0 # This loop maintains the miner's operations until intentionally stopped. try: while not self.should_exit: - while ( - self.block - last_update_block - < self.config.neuron.epoch_length - ): + while settings.SUBTENSOR.get_current_block() - last_update_block < settings.NEURON_EPOCH_LENGTH: # Wait before checking again. time.sleep(1) @@ -121,19 +98,19 @@ def run(self): # Sync metagraph and potentially set weights. self.sync() - last_update_block = self.block + last_update_block = settings.SUBTENSOR.get_current_block() self.step += 1 # If someone intentionally stops the miner, it'll safely terminate operations. except KeyboardInterrupt: self.axon.stop() - bt.logging.success("Miner killed by keyboard interrupt.") + logger.success("Miner killed by keyboard interrupt.") exit() # In case of unforeseen errors, the miner will log the error and continue operations. except Exception as err: - bt.logging.error("Error during mining", str(err)) - bt.logging.debug(print_exception(type(err), err, err.__traceback__)) + logger.error("Error during mining", str(err)) + logger.debug(print_exception(type(err), err, err.__traceback__)) self.should_exit = True def run_in_background_thread(self): @@ -142,23 +119,23 @@ def run_in_background_thread(self): This is useful for non-blocking operations. """ if not self.is_running: - bt.logging.debug("Starting miner in background thread.") + logger.debug("Starting miner in background thread.") self.should_exit = False self.thread = threading.Thread(target=self.run, daemon=True) self.thread.start() self.is_running = True - bt.logging.debug("Started") + logger.debug("Started") def stop_run_thread(self): """ Stops the miner's operations that are running in the background thread. """ if self.is_running: - bt.logging.debug("Stopping miner in background thread.") + logger.debug("Stopping miner in background thread.") self.should_exit = True self.thread.join(5) self.is_running = False - bt.logging.debug("Stopped") + logger.debug("Stopped") def __enter__(self): """ @@ -186,10 +163,10 @@ def __exit__(self, exc_type, exc_value, traceback): def resync_metagraph(self): """Resyncs the metagraph and updates the hotkeys and moving averages based on the new metagraph.""" - bt.logging.info("resync_metagraph()") + logger.info("resync_metagraph()") # Sync the metagraph. - self.metagraph.sync(subtensor=self.subtensor) + settings.METAGRAPH.sync(subtensor=settings.SUBTENSOR) def _forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: """ @@ -214,4 +191,110 @@ def _forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: This method is not meant to be called directly but is invoked internally when a request is received, and it subsequently calls the `forward` method of the subclass. """ + self.step += 1 + logger.info("Calling self._forward in BaseStreamMinerNeuron") return self.forward(synapse=synapse) + + async def blacklist(self, synapse: StreamPromptingSynapse) -> Tuple[bool, str]: + # WARNING: The typehint must remain Tuple[bool, str] to avoid runtime errors. YOU + # CANNOT change to tuple[bool, str]!!! + """ + Determines whether an incoming request should be blacklisted and thus ignored. Your implementation should + define the logic for blacklisting requests based on your needs and desired security parameters. + + Blacklist runs before the synapse data has been deserialized (i.e. before synapse.data is available). + The synapse is instead contructed via the headers of the request. It is important to blacklist + requests before they are deserialized to avoid wasting resources on requests that will be ignored. + + Args: + synapse (StreamPromptingSynapse): A synapse object constructed from the headers of the incoming request. + + Returns: + Tuple[bool, str]: A tuple containing a boolean indicating whether the synapse's hotkey is blacklisted, + and a string providing the reason for the decision. + + This function is a security measure to prevent resource wastage on undesired requests. It should be enhanced + to include checks against the metagraph for entity registration, validator status, and sufficient stake + before deserialization of synapse data to minimize processing overhead. + + Example blacklist logic: + - Reject if the hotkey is not a registered entity within the metagraph. + - Consider blacklisting entities that are not validators or have insufficient stake. + + In practice it would be wise to blacklist requests from entities that are not validators, or do not have + enough stake. This can be checked via metagraph.S and metagraph.validator_permit. You can always attain + the uid of the sender via a metagraph.hotkeys.index( synapse.dendrite.hotkey ) call. + + Otherwise, allow the request to be processed further. + """ + if synapse.dendrite.hotkey not in settings.METAGRAPH.hotkeys: + # Ignore requests from unrecognized entities. + logger.trace(f"Blacklisting unrecognized hotkey {synapse.dendrite.hotkey}") + return True, "Unrecognized hotkey" + + logger.trace(f"Not Blacklisting recognized hotkey {synapse.dendrite.hotkey}") + return False, "Hotkey recognized!" + + async def priority(self, synapse: StreamPromptingSynapse) -> float: + """ + The priority function determines the order in which requests are handled. More valuable or higher-priority + requests are processed before others. You should design your own priority mechanism with care. + + This implementation assigns priority to incoming requests based on the calling entity's stake in the metagraph. + + Args: + synapse (StreamPromptingSynapse): The synapse object that contains metadata about the incoming request. + + Returns: + float: A priority score derived from the stake of the calling entity. + + Miners may recieve messages from multiple entities at once. This function determines which request should be + processed first. Higher values indicate that the request should be processed first. Lower values indicate + that the request should be processed later. + + Example priority logic: + - A higher stake results in a higher priority value. + """ + caller_uid = settings.METAGRAPH.hotkeys.index(synapse.dendrite.hotkey) # Get the caller index. + priority = float(settings.METAGRAPH.S[caller_uid]) # Return the stake as the priority. + logger.trace(f"Prioritizing {synapse.dendrite.hotkey} with value: ", priority) + return priority + + def log_event( + self, + synapse: StreamPromptingSynapse, + timing: float, + messages: list[str], + accumulated_chunks: list[str] = [], + accumulated_chunks_timings: list[float] = [], + ): + dendrite_uid = settings.METAGRAPH.hotkeys.index(synapse.dendrite.hotkey) + event = MinerEvent( + epoch_time=timing, + messages=messages, + accumulated_chunks=accumulated_chunks, + accumulated_chunks_timings=accumulated_chunks_timings, + validator_uid=dendrite_uid, + validator_ip=synapse.dendrite.ip, + validator_coldkey=settings.METAGRAPH.coldkeys[dendrite_uid], + validator_hotkey=settings.METAGRAPH.hotkeys[dendrite_uid], + validator_stake=settings.METAGRAPH.S[dendrite_uid].item(), + validator_trust=settings.METAGRAPH.T[dendrite_uid].item(), + validator_incentive=settings.METAGRAPH.I[dendrite_uid].item(), + validator_consensus=settings.METAGRAPH.C[dendrite_uid].item(), + validator_dividends=settings.METAGRAPH.D[dendrite_uid].item(), + miner_stake=settings.METAGRAPH.S[self.uid].item(), + miner_trust=settings.METAGRAPH.T[self.uid].item(), + miner_incentive=settings.METAGRAPH.I[self.uid].item(), + miner_consensus=settings.METAGRAPH.C[self.uid].item(), + miner_dividends=settings.METAGRAPH.D[self.uid].item(), + ) + + logger.info("Logging event to wandb...", event) + log_event(event) + + def log_status(self): + m = settings.METAGRAPH + logger.info( + f"Miner running:: network: {settings.SUBTENSOR.network} | step: {self.step} | uid: {self.uid} | trust: {m.trust[self.uid]:.3f} | emission {m.emission[self.uid]:.3f}" + ) diff --git a/prompting/base/neuron.py b/prompting/base/neuron.py index 69530f02..2c153fa6 100644 --- a/prompting/base/neuron.py +++ b/prompting/base/neuron.py @@ -1,34 +1,14 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import copy import sys -import threading - import bittensor as bt - +from loguru import logger from abc import ABC, abstractmethod -# Sync calls set weights and also resyncs the metagraph. -from prompting.utils.config import check_config, add_args, config +# Sync calls set weights and also resyncs the metagraph.π from prompting.utils.misc import ttl_get_block -from prompting import __spec_version__ as spec_version -from prompting.mock import MockSubtensor, MockMetagraph +# from prompting import __spec_version__ as spec_version + +from prompting.settings import settings class BaseNeuron(ABC): @@ -38,91 +18,49 @@ class BaseNeuron(ABC): In addition to creating a wallet, subtensor, and metagraph, this class also handles the synchronization of the network state via a basic checkpointing mechanism based on epoch length. """ - @classmethod - def check_config(cls, config: "bt.Config"): - check_config(cls, config) - - @classmethod - def add_args(cls, parser): - add_args(cls, parser) - - @classmethod - def _config(cls): - return config(cls) - - subtensor: "bt.subtensor" - wallet: "bt.wallet" - metagraph: "bt.metagraph" - spec_version: int = spec_version + # @classmethod + # def _config(cls): + # return config(cls) @property def block(self): self._block = ttl_get_block(self) - self.latest_block = self._block + self.latest_block = self._block or -1 return self._block def __init__(self, config=None): - base_config = copy.deepcopy(config or BaseNeuron._config()) - self.config = self._config() - self.config.merge(base_config) - self.check_config(self.config) - - # Set up logging with the provided configuration and directory. - bt.logging(config=self.config, logging_dir=self.config.full_path) + # self.config = self._config() # If a gpu is required, set the device to cuda:N (e.g. cuda:0) - self.device = self.config.neuron.device - - # Log the configuration for reference. - bt.logging.info(self.config) - - # Build Bittensor objects - # These are core Bittensor classes to interact with the network. - bt.logging.info("Setting up bittensor objects.") - - # The wallet holds the cryptographic key pairs for the miner. - if self.config.mock: - self.wallet = bt.MockWallet(config=self.config) - self.subtensor = MockSubtensor(self.config.netuid, wallet=self.wallet) - self.metagraph = MockMetagraph(netuid=self.config.netuid, subtensor=self.subtensor) - else: - self.wallet = bt.wallet(config=self.config) - self.subtensor = bt.subtensor(config=self.config) - self.metagraph = self.subtensor.metagraph(self.config.netuid) - - bt.logging.info(f"Wallet: {self.wallet}") - bt.logging.info(f"Subtensor: {self.subtensor}") - bt.logging.info(f"Metagraph: {self.metagraph}") + self.device = settings.NEURON_DEVICE # Check if the miner is registered on the Bittensor network before proceeding further. self.check_registered() # Each miner gets a unique identity (UID) in the network for differentiation. - self.uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) - bt.logging.info( - f"Running neuron on subnet: {self.config.netuid} with uid {self.uid} using network: {self.subtensor.chain_endpoint}" - ) + self.uid = settings.METAGRAPH.hotkeys.index(settings.WALLET.hotkey.ss58_address) + logger.info(f"Running neuron on subnet: {settings.NETUID} with uid {self.uid}") self.step = 0 @abstractmethod - def forward(self, synapse: bt.Synapse) -> bt.Synapse: - ... + def forward(self, synapse: bt.Synapse) -> bt.Synapse: ... @abstractmethod - def run(self): - ... + def run(self): ... def sync(self): """ Wrapper for synchronizing the state of the network for the given miner or validator. """ # Ensure miner or validator hotkey is still registered on the network. + logger.info("Syncing neuron...") self.check_registered() if self.should_sync_metagraph(): self.resync_metagraph() if self.should_set_weights(): + logger.debug("Setting weights...") self.set_weights() # Always save state. @@ -130,12 +68,12 @@ def sync(self): def check_registered(self): # --- Check for registration. - if not self.subtensor.is_hotkey_registered( - netuid=self.config.netuid, - hotkey_ss58=self.wallet.hotkey.ss58_address, + if not settings.SUBTENSOR.is_hotkey_registered( + netuid=settings.NETUID, + hotkey_ss58=settings.WALLET.hotkey.ss58_address, ): - bt.logging.error( - f"Wallet: {self.wallet} is not registered on netuid {self.config.netuid}." + logger.error( + f"Wallet: {settings.WALLET} is not registered on netuid {settings.NETUID}." f" Please register the hotkey using `btcli subnets register` before trying again" ) sys.exit() @@ -145,33 +83,31 @@ def should_sync_metagraph(self): Check if enough epoch blocks have elapsed since the last checkpoint to sync. """ return ( - self.block - self.metagraph.last_update[self.uid] - ) > self.config.neuron.epoch_length + settings.SUBTENSOR.get_current_block() - settings.METAGRAPH.last_update[self.uid] + ) > settings.NEURON_EPOCH_LENGTH def should_set_weights(self) -> bool: # Don't set weights on initialization. if self.step == 0: return False + # Moved to validator.py to make log weights to csv possible. # Check if enough epoch blocks have elapsed since the last epoch. - if self.config.neuron.disable_set_weights: - return False + # if settings.NEURON_DISABLE_SET_WEIGHTS: + # logger.debug(f"Set weights disabled: {settings.NEURON_DISABLE_SET_WEIGHTS}") + # return False # If neuron has validator permit we assume its running the validator code. If it is a dual permit neuron then we check that it also has a set_weights method (only true if it is running validator neuron) - if not self.metagraph.validator_permit[self.uid] or not hasattr( - self, "set_weights" - ): + if not settings.METAGRAPH.validator_permit[self.uid] or not hasattr(self, "set_weights"): return False # Define appropriate logic for when set weights. - return ( - self.block - self.metagraph.last_update[self.uid] - ) > self.config.neuron.epoch_length + return (self.block - settings.METAGRAPH.last_update[self.uid]) > settings.NEURON_EPOCH_LENGTH def save_state(self): pass def load_state(self): - bt.logging.debug( + logger.debug( "load_state() not implemented for this neuron. You can implement this function to load model checkpoints or other useful data." ) diff --git a/prompting/base/prompting_miner.py b/prompting/base/prompting_miner.py deleted file mode 100644 index 1668f96f..00000000 --- a/prompting/base/prompting_miner.py +++ /dev/null @@ -1,204 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import wandb -import typing -import bittensor as bt - -# Bittensor Miner Template: -import prompting -from prompting.protocol import StreamPromptingSynapse -from prompting.base.miner import BaseStreamMinerNeuron -from datetime import datetime -from typing import List, Dict - -class BaseStreamPromptingMiner(BaseStreamMinerNeuron): - """ - Your miner neuron class. You should use this class to define your miner's behavior. - In particular, you should replace the forward function with your own logic. You may also want to override the blacklist and priority functions according to your needs. - - This class inherits from the BaseMinerNeuron class, which in turn inherits from BaseNeuron. - The BaseNeuron class takes care of routine tasks such as setting up wallet, subtensor, metagraph, logging directory, parsing config, etc. - You can override any of the methods in BaseNeuron if you need to customize the behavior. - - This class provides reasonable default behavior for a miner such as blacklisting unrecognized hotkeys, prioritizing requests based on stake, and forwarding requests to the forward function. - """ - - def __init__(self, config=None): - super().__init__(config=config) - self.identity_tags = None - - async def blacklist( - self, synapse: StreamPromptingSynapse - ) -> typing.Tuple[bool, str]: - """ - Determines whether an incoming request should be blacklisted and thus ignored. Your implementation should - define the logic for blacklisting requests based on your needs and desired security parameters. - - Blacklist runs before the synapse data has been deserialized (i.e. before synapse.data is available). - The synapse is instead contructed via the headers of the request. It is important to blacklist - requests before they are deserialized to avoid wasting resources on requests that will be ignored. - - Args: - synapse (StreamPromptingSynapse): A synapse object constructed from the headers of the incoming request. - - Returns: - Tuple[bool, str]: A tuple containing a boolean indicating whether the synapse's hotkey is blacklisted, - and a string providing the reason for the decision. - - This function is a security measure to prevent resource wastage on undesired requests. It should be enhanced - to include checks against the metagraph for entity registration, validator status, and sufficient stake - before deserialization of synapse data to minimize processing overhead. - - Example blacklist logic: - - Reject if the hotkey is not a registered entity within the metagraph. - - Consider blacklisting entities that are not validators or have insufficient stake. - - In practice it would be wise to blacklist requests from entities that are not validators, or do not have - enough stake. This can be checked via metagraph.S and metagraph.validator_permit. You can always attain - the uid of the sender via a metagraph.hotkeys.index( synapse.dendrite.hotkey ) call. - - Otherwise, allow the request to be processed further. - """ - if synapse.dendrite.hotkey not in self.metagraph.hotkeys: - # Ignore requests from unrecognized entities. - bt.logging.trace( - f"Blacklisting unrecognized hotkey {synapse.dendrite.hotkey}" - ) - return True, "Unrecognized hotkey" - - bt.logging.trace( - f"Not Blacklisting recognized hotkey {synapse.dendrite.hotkey}" - ) - return False, "Hotkey recognized!" - - async def priority(self, synapse: StreamPromptingSynapse) -> float: - """ - The priority function determines the order in which requests are handled. More valuable or higher-priority - requests are processed before others. You should design your own priority mechanism with care. - - This implementation assigns priority to incoming requests based on the calling entity's stake in the metagraph. - - Args: - synapse (StreamPromptingSynapse): The synapse object that contains metadata about the incoming request. - - Returns: - float: A priority score derived from the stake of the calling entity. - - Miners may recieve messages from multiple entities at once. This function determines which request should be - processed first. Higher values indicate that the request should be processed first. Lower values indicate - that the request should be processed later. - - Example priority logic: - - A higher stake results in a higher priority value. - """ - caller_uid = self.metagraph.hotkeys.index( - synapse.dendrite.hotkey - ) # Get the caller index. - priority = float( - self.metagraph.S[caller_uid] - ) # Return the stake as the priority. - bt.logging.trace( - f"Prioritizing {synapse.dendrite.hotkey} with value: ", priority - ) - return priority - - def init_wandb(self): - bt.logging.info("Initializing wandb...") - - uid = f"uid_{self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address)}" - net_uid = f"netuid_{self.config.netuid}" - tags = [ - self.wallet.hotkey.ss58_address, - net_uid, - f"uid_{uid}", - prompting.__version__, - str(prompting.__spec_version__), - ] - - run_name = None - if self.identity_tags: - # Add identity tags to run tags - tags += self.identity_tags - - # Create run name from identity tags - run_name_tags = [str(tag) for tag in self.identity_tags] - - # Add uid, netuid and timestamp to run name - run_name_tags += [ - uid, - net_uid, - datetime.now().strftime("%Y_%m_%d_%H_%M_%S"), - ] - - # Compose run name - run_name = "_".join(run_name_tags) - - # inits wandb in case it hasn't been inited yet - self.wandb_run = wandb.init( - name=run_name, - project=self.config.wandb.project_name, - entity=self.config.wandb.entity, - config=self.config, - mode="online" if self.config.wandb.on else "offline", - tags=tags, - ) - - def log_event( - self, - synapse: StreamPromptingSynapse, - timing: float, - messages, - accumulated_chunks: List[str] = [], - accumulated_chunks_timings: List[float] = [], - extra_info: dict = {}, - ): - if not getattr(self, "wandb_run", None): - self.init_wandb() - - dendrite_uid = self.metagraph.hotkeys.index(synapse.dendrite.hotkey) - step_log = { - "epoch_time": timing, - # TODO: add block to logs in the future in a way that doesn't impact performance - # "block": self.block, - "messages": messages, - "accumulated_chunks": accumulated_chunks, - "accumulated_chunks_timings": accumulated_chunks_timings, - "validator_uid": dendrite_uid, - "validator_ip": synapse.dendrite.ip, - "validator_coldkey": self.metagraph.coldkeys[dendrite_uid], - "validator_hotkey": self.metagraph.hotkeys[dendrite_uid], - "validator_stake": self.metagraph.S[dendrite_uid].item(), - "validator_trust": self.metagraph.T[dendrite_uid].item(), - "validator_incentive": self.metagraph.I[dendrite_uid].item(), - "validator_consensus": self.metagraph.C[dendrite_uid].item(), - "validator_dividends": self.metagraph.D[dendrite_uid].item(), - "miner_stake": self.metagraph.S[self.uid].item(), - "miner_trust": self.metagraph.T[self.uid].item(), - "miner_incentive": self.metagraph.I[self.uid].item(), - "miner_consensus": self.metagraph.C[self.uid].item(), - "miner_dividends": self.metagraph.D[self.uid].item(), - **extra_info, - } - - bt.logging.info("Logging event to wandb...", step_log) - wandb.log(step_log) - - def log_status(self): - m = self.metagraph - bt.logging.info( - f"Miner running:: network: {self.subtensor.network} | step: {self.step} | uid: {self.uid} | trust: {m.trust[self.uid]:.3f} | emission {m.emission[self.uid]:.3f}" - ) diff --git a/prompting/protocol.py b/prompting/base/protocol.py similarity index 81% rename from prompting/protocol.py rename to prompting/base/protocol.py index 5b8ad01c..ffaf44a7 100644 --- a/prompting/protocol.py +++ b/prompting/base/protocol.py @@ -1,20 +1,3 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - import pydantic import bittensor as bt from typing import List, AsyncIterator @@ -84,9 +67,9 @@ class StreamPromptingSynapse(bt.StreamingSynapse): description="Completion status of the current PromptingSynapse object. This attribute is mutable and can be updated.", ) - async def process_streaming_response( - self, response: StreamingResponse - ) -> AsyncIterator[str]: + # streaming_response: Awaitable | None = None + + async def process_streaming_response(self, response: StreamingResponse) -> AsyncIterator[str]: """ `process_streaming_response` is an asynchronous method designed to process the incoming streaming response from the Bittensor network. It's the heart of the StreamPromptingSynapse class, ensuring that streaming tokens, which represent @@ -141,17 +124,10 @@ def extract_response_json(self, response: StreamingResponse) -> dict: - Roles and Messages pertaining to the current StreamPromptingSynapse instance. - The accumulated completion. """ - headers = { - k.decode("utf-8"): v.decode("utf-8") - for k, v in response.__dict__["_raw_headers"] - } + headers = {k.decode("utf-8"): v.decode("utf-8") for k, v in response.__dict__["_raw_headers"]} def extract_info(prefix): - return { - key.split("_")[-1]: value - for key, value in headers.items() - if key.startswith(prefix) - } + return {key.split("_")[-1]: value for key, value in headers.items() if key.startswith(prefix)} return { "name": headers.get("name", ""), diff --git a/prompting/base/validator.py b/prompting/base/validator.py index fea496ab..6856cd07 100644 --- a/prompting/base/validator.py +++ b/prompting/base/validator.py @@ -1,37 +1,21 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import argparse +import os import asyncio import copy import sys import threading +import pandas as pd from traceback import print_exception -from typing import Optional import bittensor as bt +import numpy as np import torch -from organic_scoring.synth_dataset import SynthDatasetConversation +from loguru import logger +from prompting import __spec_version__ from prompting.base.neuron import BaseNeuron -from prompting.mock import MockDendrite -from prompting.organic.organic_scoring_prompting import OrganicScoringPrompting -from prompting.utils.config import add_validator_args +from prompting.settings import settings from prompting.utils.exceptions import MaxRetryError +from prompting.utils.logging import init_wandb class BaseValidatorNeuron(BaseNeuron): @@ -39,38 +23,33 @@ class BaseValidatorNeuron(BaseNeuron): Base class for Bittensor validators. Your validator should inherit from this class. """ - @classmethod - def add_args(cls, parser: argparse.ArgumentParser): - super().add_args(parser) - add_validator_args(cls, parser) - def __init__(self, config=None): super().__init__(config=config) + if settings.WANDB_ON: + init_wandb(neuron="validator") + self.axon: bt.axon | None = None + self.latest_block = -1 # Save a copy of the hotkeys to local memory. - self.hotkeys = copy.deepcopy(self.metagraph.hotkeys) + self.hotkeys = copy.deepcopy(settings.METAGRAPH.hotkeys) # Dendrite lets us send messages to other nodes (axons) in the network. - if self.config.mock: - self.dendrite = MockDendrite(wallet=self.wallet) - else: - self.dendrite = bt.dendrite(wallet=self.wallet) - bt.logging.info(f"Dendrite: {self.dendrite}") + self.dendrite = bt.dendrite(wallet=settings.WALLET) + logger.info(f"Dendrite: {self.dendrite}") # Set up initial scoring weights for validation - bt.logging.info("Building validation weights.") - self.scores = torch.zeros( - self.metagraph.n, dtype=torch.float32, device=self.device - ) + logger.info("Building validation weights.") + self.scores = np.zeros(settings.METAGRAPH.n, dtype=np.float32) # Init sync with the network. Updates the metagraph. self.sync() - self.axon: Optional[bt.axon] = None - if not self.config.neuron.axon_off: - self.axon = bt.axon(wallet=self.wallet, config=self.config) + # Serve axon to enable external connections. + self.axon = bt.axon(wallet=settings.WALLET, port=settings.AXON_PORT) + if self.axon is not None: + self._serve_axon() else: - bt.logging.warning("axon off, not serving ip to chain.") + logger.warning("axon off, not serving ip to chain.") # Create asyncio event loop to manage async tasks. self.loop = asyncio.get_event_loop() @@ -79,41 +58,12 @@ def __init__(self, config=None): self.should_exit: bool = False self.is_running: bool = False self.thread: threading.Thread = None - self.lock = asyncio.Lock() - - self._organic_scoring: Optional[OrganicScoringPrompting] = None - if self.axon is not None and not self.config.neuron.organic_disabled: - dataset = SynthDatasetConversation() - if dataset.exception is not None: - bt.logging.error( - f"Organic scoring on synthetic data is disabled. Failed to load dataset: {dataset.exception}" - ) - dataset = None - self._organic_scoring = OrganicScoringPrompting( - axon=self.axon, - synth_dataset=dataset, - trigger_frequency=self.config.neuron.organic_trigger_frequency, - trigger_frequency_min=self.config.neuron.organic_trigger_frequency_min, - trigger=self.config.neuron.organic_trigger, - trigger_scaling_factor=self.config.neuron.organic_scaling_factor, - validator=self, - ) - else: - bt.logging.warning( - "Organic scoring is not enabled. To enable, remove '--neuron.axon_off' and '--neuron.organic_disabled'" - ) - - if self.axon is not None: - self._serve_axon() - - if self._organic_scoring is not None: - self.loop.create_task(self._organic_scoring.start_loop()) def _serve_axon(self): """Serve axon to enable external connections""" - validator_uid = self.metagraph.hotkeys.index(self.wallet.hotkey.ss58_address) - bt.logging.info(f"Serving validator IP of UID {validator_uid} to chain...") - self.axon.serve(netuid=self.config.netuid, subtensor=self.subtensor).start() + validator_uid = settings.METAGRAPH.hotkeys.index(settings.WALLET.hotkey.ss58_address) + self.axon.serve(netuid=settings.NETUID, subtensor=settings.SUBTENSOR).start() + logger.info(f"Serving validator UID {validator_uid} on {self.axon.ip}:{self.axon.port} to chain") def run(self): """ @@ -137,39 +87,35 @@ def run(self): # Check that validator is registered on the network. self.sync() - if not self.config.neuron.axon_off: - bt.logging.info( - f"Running validator {self.axon} on network: {self.config.subtensor.chain_endpoint} with netuid: {self.config.netuid}" - ) + if not settings.NEURON_AXON_OFF: + logger.info(f"Running validator {self.axon} with netuid: {settings.NETUID}") else: - bt.logging.info( - f"Running validator on network: {self.config.subtensor.chain_endpoint} with netuid: {self.config.netuid}" - ) + logger.info(f"Running validator with netuid: {settings.NETUID}") - bt.logging.info(f"Validator starting at block: {self.latest_block}") + logger.info(f"Validator starting at block: {self.latest_block}") # This loop maintains the validator's operations until intentionally stopped. try: while True: - bt.logging.info(f"step({self.step}) block({self.latest_block})") + logger.info(f"step({self.step}) block({self.latest_block})") - forward_timeout = self.config.neuron.forward_max_time + forward_timeout = settings.NEURON_FORWARD_MAX_TIME try: task = self.loop.create_task(self.forward()) - self.loop.run_until_complete( - asyncio.wait_for(task, timeout=forward_timeout) - ) + self.loop.run_until_complete(asyncio.wait_for(task, timeout=forward_timeout)) except torch.cuda.OutOfMemoryError as e: - bt.logging.error(f"Out of memory error: {e}") + logger.error(f"Out of memory error: {e}") continue except MaxRetryError as e: - bt.logging.error(f"MaxRetryError: {e}") + logger.error(f"MaxRetryError: {e}") continue except asyncio.TimeoutError as e: - bt.logging.error( + logger.error( f"Forward timeout: Task execution exceeded {forward_timeout} seconds and was cancelled.: {e}" ) continue + except Exception as e: + logger.exception(e) # Check if we should exit. if self.should_exit: @@ -183,13 +129,13 @@ def run(self): # If someone intentionally stops the validator, it'll safely terminate operations. except KeyboardInterrupt: self.axon.stop() - bt.logging.success("Validator killed by keyboard interrupt.") + logger.success("Validator killed by keyboard interrupt.") sys.exit() # In case of unforeseen errors, the validator will log the error and quit except Exception as err: - bt.logging.error("Error during validation", str(err)) - bt.logging.debug(print_exception(type(err), err, err.__traceback__)) + logger.error("Error during validation", str(err)) + logger.debug(print_exception(type(err), err, err.__traceback__)) self.should_exit = True def run_in_background_thread(self): @@ -198,23 +144,23 @@ def run_in_background_thread(self): This method facilitates the use of the validator in a 'with' statement. """ if not self.is_running: - bt.logging.debug("Starting validator in background thread.") + logger.debug("Starting validator in background thread.") self.should_exit = False self.thread = threading.Thread(target=self.run, daemon=True) self.thread.start() self.is_running = True - bt.logging.debug("Started") + logger.debug("Started") def stop_run_thread(self): """ Stops the validator's operations that are running in the background thread. """ if self.is_running: - bt.logging.debug("Stopping validator in background thread.") + logger.debug("Stopping validator in background thread.") self.should_exit = True self.thread.join(5) self.is_running = False - bt.logging.debug("Stopped") + logger.debug("Stopped") def __enter__(self): self.run_in_background_thread() @@ -234,11 +180,11 @@ def __exit__(self, exc_type, exc_value, traceback): None if the context was exited without an exception. """ if self.is_running: - bt.logging.debug("Stopping validator in background thread.") + logger.debug("Stopping validator in background thread.") self.should_exit = True self.thread.join(5) self.is_running = False - bt.logging.debug("Stopped") + logger.debug("Stopped") def set_weights(self): """ @@ -246,30 +192,30 @@ def set_weights(self): """ # Check if self.scores contains any NaN values and log a warning if it does. - if torch.isnan(self.scores).any(): - bt.logging.warning( + if any(np.isnan(self.scores).flatten()): + logger.warning( "Scores contain NaN values. This may be due to a lack of responses from miners, or a bug in your reward functions." ) # Calculate the average reward for each uid across non-zero values. # Replace any NaN values with 0. - raw_weights = torch.nn.functional.normalize(self.scores, p=1, dim=0) + raw_weights = self.scores / np.linalg.norm(self.scores, ord=1, axis=0, keepdims=True) - bt.logging.debug("raw_weights", raw_weights) - bt.logging.debug("raw_weight_uids", self.metagraph.uids) + logger.debug("raw_weights", raw_weights) + logger.debug("raw_weight_uids", settings.METAGRAPH.uids) # Process the raw weights to final_weights via subtensor limitations. ( processed_weight_uids, processed_weights, ) = bt.utils.weight_utils.process_weights_for_netuid( - uids=self.metagraph.uids, - weights=raw_weights.to("cpu").numpy(), - netuid=self.config.netuid, - subtensor=self.subtensor, - metagraph=self.metagraph, + uids=settings.METAGRAPH.uids, + weights=raw_weights, + netuid=settings.NETUID, + subtensor=settings.SUBTENSOR, + metagraph=settings.METAGRAPH, ) - bt.logging.debug("processed_weights", processed_weights) - bt.logging.debug("processed_weight_uids", processed_weight_uids) + logger.debug("processed_weights", processed_weights) + logger.debug("processed_weight_uids", processed_weight_uids) # Convert to uint16 weights and uids. ( @@ -278,102 +224,111 @@ def set_weights(self): ) = bt.utils.weight_utils.convert_weights_and_uids_for_emit( uids=processed_weight_uids, weights=processed_weights ) - bt.logging.debug("uint_weights", uint_weights) - bt.logging.debug("uint_uids", uint_uids) + logger.debug("uint_weights", uint_weights) + logger.debug("uint_uids", uint_uids) + + # Create a dataframe from weights and uids and save it as a csv file, with the current step as the filename. + if settings.LOG_WEIGHTS: + weights_df = pd.DataFrame({ + "step": self.step, + "uids": uint_uids, + "weights": uint_weights, + "block": self.block, + }) + step_filename = "weights.csv" + file_exists = os.path.isfile(step_filename) + # Append to the file if it exists, otherwise write a new file. + weights_df.to_csv(step_filename, mode="a", index=False, header=not file_exists) + + if settings.NEURON_DISABLE_SET_WEIGHTS: + logger.debug(f"Set weights disabled: {settings.NEURON_DISABLE_SET_WEIGHTS}") + return # Set the weights on chain via our subtensor connection. - result = self.subtensor.set_weights( - wallet=self.wallet, - netuid=self.config.netuid, + result = settings.SUBTENSOR.set_weights( + wallet=settings.WALLET, + netuid=settings.NETUID, uids=uint_uids, weights=uint_weights, wait_for_finalization=False, wait_for_inclusion=False, - version_key=self.spec_version, + version_key=__spec_version__, ) + if result is True: - bt.logging.info("set_weights on chain successfully!") + logger.info("set_weights on chain successfully!") else: - bt.logging.error("set_weights failed") + logger.error("set_weights failed") def resync_metagraph(self): """Resyncs the metagraph and updates the hotkeys and moving averages based on the new metagraph.""" - bt.logging.info("resync_metagraph()") + logger.info("resync_metagraph()") # Copies state of metagraph before syncing. - previous_metagraph = copy.deepcopy(self.metagraph) + previous_metagraph = copy.deepcopy(settings.METAGRAPH) # Sync the metagraph. - self.metagraph.sync(subtensor=self.subtensor) + settings.METAGRAPH.sync(subtensor=settings.SUBTENSOR) # Check if the metagraph axon info has changed. - if previous_metagraph.axons == self.metagraph.axons: + if previous_metagraph.axons == settings.METAGRAPH.axons: return - bt.logging.info( - "Metagraph updated, re-syncing hotkeys, dendrite pool and moving averages" - ) + logger.info("Metagraph updated, re-syncing hotkeys, dendrite pool and moving averages") + logger.info("Metagraph updated, re-syncing hotkeys, dendrite pool and moving averages") # Zero out all hotkeys that have been replaced. for uid, hotkey in enumerate(self.hotkeys): - if hotkey != self.metagraph.hotkeys[uid]: + if hotkey != settings.METAGRAPH.hotkeys[uid]: self.scores[uid] = 0 # hotkey has been replaced # Check to see if the metagraph has changed size. # If so, we need to add new hotkeys and moving averages. - if len(self.hotkeys) < len(self.metagraph.hotkeys): + if len(self.hotkeys) < len(settings.METAGRAPH.hotkeys): # Update the size of the moving average scores. - new_moving_average = torch.zeros((self.metagraph.n)).to(self.device) + new_moving_average = np.zeros((settings.METAGRAPH.n)) min_len = min(len(self.hotkeys), len(self.scores)) new_moving_average[:min_len] = self.scores[:min_len] self.scores = new_moving_average # Update the hotkeys. - self.hotkeys = copy.deepcopy(self.metagraph.hotkeys) + self.hotkeys = copy.deepcopy(settings.METAGRAPH.hotkeys) - def update_scores(self, rewards: torch.FloatTensor, uids: list[int]): + def update_scores(self, rewards: np.ndarray, uids: list[int]): """Performs exponential moving average on the scores based on the rewards received from the miners.""" # Check if rewards contains NaN values. - if torch.isnan(rewards).any(): - bt.logging.warning(f"NaN values detected in rewards: {rewards}") + if any(np.isnan(rewards).flatten()): + # if + logger.warning(f"NaN values detected in rewards: {rewards}") # Replace any NaN values in rewards with 0. - rewards = torch.nan_to_num(rewards, 0) + rewards = np.nan_to_num(rewards) # Compute forward pass rewards, assumes uids are mutually exclusive. # shape: [ metagraph.n ] - step_rewards = self.scores.scatter( - 0, torch.tensor(uids).to(self.device), rewards.to(self.device) - ).to(self.device) - - bt.logging.debug(f"Scattered rewards: {rewards}") + step_rewards = np.copy(self.scores) + step_rewards[uids] = rewards + logger.debug(f"Scattered rewards: {rewards}") # Update scores with rewards produced by this step. # shape: [ metagraph.n ] - alpha = self.config.neuron.moving_average_alpha + alpha = settings.NEURON_MOVING_AVERAGE_ALPHA self.scores = alpha * step_rewards + (1 - alpha) * self.scores - self.scores = (self.scores - self.config.neuron.decay_alpha).clamp(min=0) - bt.logging.debug(f"Updated moving avg scores: {self.scores}") + self.scores = np.clip(self.scores - settings.NEURON_DECAY_ALPHA, 0, 1) + logger.debug(f"Updated moving avg scores: {self.scores}") def save_state(self): """Saves the state of the validator to a file.""" - bt.logging.info("Saving validator state.") + logger.info("Saving validator state.") # Save the state of the validator to file. - torch.save( - { - "step": self.step, - "scores": self.scores, - "hotkeys": self.hotkeys, - }, - self.config.neuron.full_path + "/state.pt", - ) + np.savez(settings.SAVE_PATH + "/state.npz", step=self.step, scores=self.scores, hotkeys=self.hotkeys) def load_state(self): """Loads the state of the validator from a file.""" - bt.logging.info("Loading validator state.") + logger.info("Loading validator state.") # Load the state of the validator from file. - state = torch.load(self.config.neuron.full_path + "/state.pt") + state = np.load(settings.SAVE_PATH + "/state.npz") self.step = state["step"] self.scores = state["scores"] self.hotkeys = state["hotkeys"] diff --git a/prompting/cleaners/__init__.py b/prompting/cleaners/__init__.py deleted file mode 100644 index 2161d768..00000000 --- a/prompting/cleaners/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .cleaner import CleanerPipeline diff --git a/prompting/cleaners/cleaner.py b/prompting/cleaners/cleaner.py deleted file mode 100644 index e612cf09..00000000 --- a/prompting/cleaners/cleaner.py +++ /dev/null @@ -1,58 +0,0 @@ -from typing import List, Dict - -import bittensor as bt - -from prompting.cleaners.all_cleaners import RemoveQuotes, RemoveRoles, PruneEnding, PrunePostQuestionText, RemoveTags, FirstQuestion - -SUPPORTED_CLEANERS = { - "remove_quotes": RemoveQuotes, - "remove_roles": RemoveRoles, - "prune_ending": PruneEnding, - "remove_post_question_text": PrunePostQuestionText, - "first_question": FirstQuestion, - "remove_tags": RemoveTags, -} - - -class CleanerPipeline: - def __init__(self, cleaning_pipeline: List[Dict]) -> None: - """CleanerPipeline is a pipeline that can be applied to any string to - clean it of unwanted characters, punctuation, etc. - - cleaning_pipeline (List[Dict]): List of Dicts that define the cleaning pipeline. - Dictionaries MUST have the keyword "name" to be valid. - Example: [{"name": "remove_quotes", "kwargs": {}}, {"name": "prune_ending", "kwargs": {}}] - - """ - self.cleaning_pipeline = cleaning_pipeline - - def apply(self, generation: str) -> str: - """Apply cleaning steps to generation listed in cleaning_pipeline. - - Args: - generation (str): string generated from LLM or otherwise. - Returns: - str: Clean generated string. - """ - try: - for cleaner in self.cleaning_pipeline: - if "name" not in cleaner or cleaner["name"] not in SUPPORTED_CLEANERS: - raise ValueError( - f"Cleaning pipeline step {cleaner} must have a name, or must be in SUPPORTED_CLEANERS." - ) - - func = SUPPORTED_CLEANERS[cleaner["name"]] - - kwargs = cleaner.get("kwargs", {}) - func = func(**kwargs) # instantiate the cleaner with the kwargs - - # apply all the filters for the specific task. - generation = func.apply(generation=generation) - - return generation - - except Exception as E: - bt.logging.error( - f"Failed to apply cleaning pipeline {cleaner['name']}. {E}," - ) - return generation diff --git a/prompting/conversation.py b/prompting/conversation.py deleted file mode 100644 index 84a3bc35..00000000 --- a/prompting/conversation.py +++ /dev/null @@ -1,63 +0,0 @@ -import random -from transformers import Pipeline -from prompting.tasks import Task, TASKS, TranslationPipeline, TranslationTask, SummarizationTask -from prompting.tools import Selector, DATASETS -from prompting.task_registry import TASK_REGISTRY - - -def create_task( - llm_pipeline: Pipeline, - translation_pipeline: TranslationPipeline, - task_name: str, - create_reference: bool = True, - selector: Selector = random.choice, -) -> Task: - """Create a task from the given task name and LLM pipeline. - - Args: - llm_pipeline (Pipeline): Pipeline to use for text generation - task_name (str): Name of the task to create - create_reference (bool, optional): Generate text for task reference answer upon creation. Defaults to True. - selector (Selector, optional): Selector function to choose a dataset. Defaults to random.choice. - - Raises: - ValueError: If task_name is not a valid alias for a task, or if the task is not a subclass of Task - ValueError: If no datasets are available for the given task - ValueError: If the dataset for the given task is not found - - Returns: - Task: Task instance - """ - - task = TASKS.get(task_name, None) - if task is None or not issubclass(task, Task): - raise ValueError(f"Task {task_name} not found") - - dataset_choices = TASK_REGISTRY.get(task_name, None) - if len(dataset_choices) == 0: - raise ValueError(f"No datasets available for task {task_name}") - - dataset_name = selector(dataset_choices) - dataset = DATASETS.get(dataset_name, None) - if dataset is None: - raise ValueError(f"Dataset {dataset_name} not found") - else: - dataset = dataset() - - if task_name == TranslationTask.name: - return task( - translation_pipeline=translation_pipeline, - context=dataset.next() - ) - elif task_name == SummarizationTask.name: - return task( - llm_pipeline=llm_pipeline, - context=dataset.next(selector = "all"), - create_reference=create_reference, - ) - - return task( - llm_pipeline=llm_pipeline, - context=dataset.next(), - create_reference=create_reference, - ) \ No newline at end of file diff --git a/prompting/datasets/__init__.py b/prompting/datasets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/prompting/datasets/base.py b/prompting/datasets/base.py new file mode 100644 index 00000000..07f66eb8 --- /dev/null +++ b/prompting/datasets/base.py @@ -0,0 +1,61 @@ +import time +from abc import ABC, abstractmethod +from typing import Dict, Literal +from pydantic import BaseModel +from typing import ClassVar + + +class Context(BaseModel): + # TODO: Pydantic model + title: str + topic: str + subtopic: str + content: str + internal_links: list[str] + external_links: list[str] + source: str + tags: list[str] | None = None + extra: dict | None = None # additional non-essential information + stats: dict | None = None # retrieval stats such as fetch time, number of tries, etc. + + +class BaseDataset(ABC, BaseModel): + """Base class for datasets.""" + + name: ClassVar[str] = "base" + max_tries: int = 10 + + @abstractmethod + def search(self, name) -> Context: ... + + @abstractmethod + def random(self, name) -> Context: ... + + @abstractmethod + def get(self, name) -> Context: ... + + def next(self, method: Literal["random", "search", "get"] = "random", **kwargs) -> Dict: + tries = 1 + t0 = time.time() + + context: Context # for some reason the ls doesn't understand it's of type Context without this + while True: + # TODO: Multithread the get method so that we don't have to suffer nonexistent pages + if method == "random": + context = self.random(**kwargs) + elif method == "search": + context = self.search(**kwargs) + elif method == "get": + context = self.get(**kwargs) + + if context: + break + + context.source = self.__class__.__name__ + context.stats = { + "fetch_time": time.time() - t0, + "num_tries": tries, + "fetch_method": method, + "next_kwargs": kwargs, + } + return context diff --git a/prompting/datasets/wiki.py b/prompting/datasets/wiki.py new file mode 100644 index 00000000..5e030770 --- /dev/null +++ b/prompting/datasets/wiki.py @@ -0,0 +1,320 @@ +import re +import sys +import random +import requests +from bs4 import BeautifulSoup +from loguru import logger +import wikipedia +from queue import Queue, Full, Empty +from functools import lru_cache +from prompting.datasets.base import BaseDataset +from prompting.datasets.base import Context +from typing import ClassVar +from typing import Optional +from pydantic import model_validator, ConfigDict + +# Create a queue called CACHED_ARTICLES to store wikipedia articles that have been fetched +CACHED_ARTICLES: Queue[Context] = Queue(maxsize=300) + + +# speed up page loading +@lru_cache(maxsize=1000) +def _get_page( + title: str, pageid: str | None = None, auto_suggest: bool = False, redirect: bool = True, seed: int | None = None +) -> wikipedia.WikipediaPage: + """Cached Wikipedia page loading.""" + try: + page = wikipedia.page(title=title, pageid=pageid, auto_suggest=auto_suggest, redirect=redirect) + return page + + except wikipedia.DisambiguationError as e: + logger.debug(f"{e.__class__.__name__} loading page {title!r}: {e}") + # exc info contains a tuple of (requested_title: str, possible_matches: list[str]) + pages = sys.exc_info()[1].args[1] + if not isinstance(pages, list): + return None + title = random.Random(seed).choice(pages) + return _get_page(title, auto_suggest=auto_suggest, redirect=redirect) + + except wikipedia.PageError as e: + logger.warning(f"{e.__class__.__name__} loading page {title!r}: {e}") + if not auto_suggest: + return _get_page(title, auto_suggest=True, redirect=redirect) + return None + + +def _get_random_titles(pages: int = 10) -> list: + """Cached wikipedia random page. Approximately deterministic random titles. This is useful for testing. + NOTE: the actually cached result will change each session, but the result will be the same within a session. + """ + return wikipedia.random(pages=pages) + + +@lru_cache(maxsize=1000) +def _wikipedia_search(name: str, results: wikipedia.WikipediaPage) -> list: + """Cached Wikipedia search.""" + return wikipedia.search(name, results=results) + + +def get_article_sections(title: str) -> dict[str, str]: + # Fetch the HTML content of the Wikipedia article + url = f"https://en.wikipedia.org/wiki/{title}" + response = requests.get(url) + html_content = response.text + + # Parse the HTML using BeautifulSoup + soup = BeautifulSoup(html_content, "html.parser") + + sections = {} + for section in soup.find_all("h2"): + if (p_tag := section.find_next("p")) is not None: + sections[section.text] = p_tag.text + + return sections + + +def process_page( + page: wikipedia.WikipediaPage, exclude_sections: list | None = None, valid_section: callable = None +) -> dict: + """Process a Wikipedia page and return a dictionary of sections with their content. + + Args: + page: wikipedia.WikipediaPage + valid_header: callable to determine if a section header is valid + valid_content: callable to determine if a section content is valid + Returns: + dict: dictionary of sections and their content. Note that keys are tuples (header, section_title) + """ + title = page.title + + sections = get_article_sections(title) + + # Filter out the section keys that are in the exclude list + if exclude_sections: + sections = {k: v for k, v in sections.items() if k not in exclude_sections} + + valid_sections = [ + (key, value) for key, value in sections.items() if not valid_section or valid_section(sections[key]) + ] + + if valid_sections: + return random.choice(valid_sections), sections.keys() + else: + return None, sections.keys() + + +def most_relevant_links( + page: wikipedia.WikipediaPage, num_links: int = 10, num_summary_words: int = 50, return_scores: bool = False +) -> list: + """Return the most relevant links to a Wikipedia page based on the intersection over union (IOU) of the link and the page summary.""" + link_scores = {} + summary_words = set(page.summary.split()[:num_summary_words]) + for link in page.links: + link_words = set(link.split()) + iou = len(summary_words.intersection(link_words)) / len(summary_words.union(link_words)) + link_scores[link] = iou / len(link.split()) + + sorted_links = sorted(link_scores.items(), key=lambda x: x[1], reverse=True) + if return_scores: + return sorted_links[:num_links] + + return [link for link, _ in sorted_links[:num_links]] + + +def filter_categories(categories: list[str], exclude: list[str] = [], include: list[str] = []): + """Filter categories based on a list of categories to exclude and/or include.""" + if exclude: + categories = [cat for cat in categories if not re.search("|".join(exclude), cat, re.IGNORECASE)] + if include: + categories = [cat for cat in categories if re.search("|".join(include), cat, re.IGNORECASE)] + return categories + + +class WikiDataset(BaseDataset): + """Wikipedia dataset. Uses the wikipedia python api to fetch articles and sections.""" + + EXCLUDE_HEADERS = ("See also", "References", "Further reading", "External links") + EXCLUDE_CATEGORIES = ("articles", "wiki", "pages", "cs1") + name: ClassVar[str] = "wikipedia" + EXCLUDE_HEADERS: tuple = ("See also", "References", "Further reading", "External links") + EXCLUDE_CATEGORIES: tuple = ("articles", "wikipedia", "pages", "cs1") + min_length_words: int = 20 + max_links: int = 10 + + def get( + self, + name: str, + exclude: list = None, + **kwargs, + ) -> Context: + """Get a specified Wikipedia page and extract a section based on the selector. + + Args: + name (_type_): _description_ + pageid (_type_, optional): _description_. Defaults to None. + auto_suggest (bool, optional): _description_. Defaults to True. + redirect (bool, optional): _description_. Defaults to True. + selector (Selector, optional): _description_. Defaults to None. + include (list, optional): _description_. Defaults to None. + exclude (list, optional): _description_. Defaults to None. + + Returns: + dict: _description_ + """ + + page = _get_page(title=name, **kwargs) + if page is None: + return None + # Only return a sections with a minimum number of words + exclude = (exclude or []) + list(self.EXCLUDE_HEADERS) + selected_section, _ = process_page( + page, + exclude_sections=exclude, + valid_section=lambda x: len(x.split()) >= self.min_length_words, + ) + if not selected_section: + return None + header, section_title = selected_section + + section_length = len(selected_section[1].split()) + + context = Context( + title=name, + topic=header or section_title, + subtopic=section_title, + content=section_title, + internal_links=list(filter(lambda x: x not in exclude, page.sections)), + external_links=most_relevant_links(page, num_links=self.max_links), + tags=filter_categories(page.categories, exclude=self.EXCLUDE_CATEGORIES), + source="Wikipedia", + extra={ + "url": page.url, + "page_length": len(page.content.split()), + "section_length": section_length, + }, + ) + try: + CACHED_ARTICLES.put(context, block=False) + except Full: + logger.debug("Cache is full. Skipping article until cache is emptied.") + return context + + def search(self, name, results=3) -> Context: + titles = _wikipedia_search(name, results=results) + title = random.choice(titles) + return self.get(title) + + def random(self, pages=10) -> dict: + titles = _get_random_titles(pages=pages) + for title in titles[:self.max_tries]: + if context := self.get(title): + return context + return None + +class DateContext(Context): + date: str = None + + @classmethod + def from_context(cls, context: Context, date: str) -> "DateContext": + return cls( + **context.model_dump(), + date=date, + ) + + +class WikiDateDataset(BaseDataset): + name: ClassVar[str] = "wikipedia_date" + INCLUDE_HEADERS: tuple = ("Events", "Births", "Deaths") + MONTHS: tuple = ( + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ) + EXCLUDE_CATEGORIES: tuple = ("articles", "wikipedia", "pages", "cs1") + seed: int | None = None + rng: Optional[random.Random] = None + model_config = ConfigDict(arbitrary_types_allowed=True) + + @model_validator(mode="after") + def create_rng(self) -> "WikiDateDataset": + self.rng = random.Random(self.seed) + return self + + def _extract_dates_and_sentences(self, text: str) -> tuple[str, str]: + # Regular expression to find dates in various formats + date_pattern = r"\b\d{1,2}[-/]\d{1,2}[-/]\d{2,4}\b|\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?(?:,)?\s+\d{4}\b|\b\d{1,2}\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember))\s+\d{4}\b|\b\d{4}\b" + + # Compile the regex pattern + date_regex = re.compile(date_pattern) + + # Split text into sentences + sentences = re.split(r"(?").strip()) + + # If no dates are found, search for dates in the form of "Month DD" + secondary_date_pattern = r"\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?\b" + secondary_date_regex = re.compile(secondary_date_pattern) + + for sentence in sentences: + # Find all dates in the sentence + dates = secondary_date_regex.findall(sentence) + # If dates are found, add them to the result dictionary with the corresponding sentence + if dates: + for date in dates: + # Return the first date found + return (str(date), sentence.replace(str(date), "").strip()) + + return None + + def _random_date(self) -> DateContext: + for _ in range(self.max_tries): + try: + context = CACHED_ARTICLES.get(block=False) + if not context: + continue + + date_sentence = self._extract_dates_and_sentences(context.content) + + if date_sentence and all(date_sentence): + content, date = date_sentence + date_context = DateContext.from_context(context, date=date) + date_context.content = content + return date_context + + except Empty: + logger.debug("Cache is empty. Skipping date until cache is filled.") + return None + + except Exception as e: + logger.exception(f"Error fetching date: {e}") + continue + + def get( + self, + ) -> dict: + # TODO: Implement deterministic get method + raise NotImplementedError(f"Search is not implemented for {self.__class__.__name__}") + + def search(self, name: str, results: int = 5) -> dict: + raise NotImplementedError(f"Search is not implemented for {self.__class__.__name__}") + + def random(self) -> DateContext: + return self._random_date() diff --git a/prompting/dendrite.py b/prompting/dendrite.py deleted file mode 100644 index 7b9981a9..00000000 --- a/prompting/dendrite.py +++ /dev/null @@ -1,73 +0,0 @@ -import torch -from typing import List -from dataclasses import dataclass -from prompting.protocol import StreamPromptingSynapse -from prompting.utils.misc import serialize_exception_to_string - - -@dataclass -class SynapseStreamResult: - exception: BaseException = None - uid: int = None - accumulated_chunks: List[str] = None - accumulated_chunks_timings: List[float] = None - tokens_per_chunk: List[int] = None - synapse: StreamPromptingSynapse = None - - -class DendriteResponseEvent: - def __init__( - self, stream_results: SynapseStreamResult, uids: torch.LongTensor, timeout: float - ): - self.uids = uids - self.completions = [] - self.status_messages = [] - self.status_codes = [] - self.timings = [] - self.stream_results_uids = [] - self.stream_results_exceptions = [] - self.stream_results_all_chunks = [] - self.stream_results_all_chunks_timings = [] - self.stream_results_all_tokens_per_chunk = [] - - for stream_result in stream_results: - synapse = stream_result.synapse - - self.completions.append(synapse.completion) - self.status_messages.append(synapse.dendrite.status_message) - status_code = synapse.dendrite.status_code - - if len(synapse.completion) == 0 and status_code == 200: - status_code = 204 - - self.status_codes.append(status_code) - process_time = synapse.dendrite.process_time or 0 - if status_code == 200 or status_code == 204: - self.timings.append(process_time) - elif status_code == 408: - self.timings.append(timeout) - else: - self.timings.append(0) - - self.stream_results_uids.append(stream_result.uid) - self.stream_results_exceptions.append(serialize_exception_to_string(stream_result.exception)) - self.stream_results_all_chunks.append(stream_result.accumulated_chunks) - self.stream_results_all_chunks_timings.append(stream_result.accumulated_chunks_timings) - self.stream_results_all_tokens_per_chunk.append(stream_result.tokens_per_chunk) - - def __state_dict__(self): - return { - "uids": self.uids.tolist(), - "completions": self.completions, - "timings": self.timings, - "status_messages": self.status_messages, - "status_codes": self.status_codes, - "stream_results_uids": self.stream_results_uids, - "stream_results_exceptions": self.stream_results_exceptions, - "stream_results_all_chunks": self.stream_results_all_chunks, - "stream_results_all_chunks_timings": self.stream_results_all_chunks_timings, - "stream_results_all_tokens_per_chunk": self.stream_results_all_tokens_per_chunk, - } - - def __repr__(self): - return f"DendriteResponseEvent(uids={self.uids}, completions={self.completions}, timings={self.timings}, status_messages={self.status_messages}, status_codes={self.status_codes})" diff --git a/prompting/forward.py b/prompting/forward.py deleted file mode 100644 index 5a5de049..00000000 --- a/prompting/forward.py +++ /dev/null @@ -1,358 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import sys -import time -import random -import asyncio -import traceback -import numpy as np -import bittensor as bt -from typing import List, Dict, Awaitable - -from prompting.agent import HumanAgent -from prompting.dendrite import DendriteResponseEvent, SynapseStreamResult -from prompting.conversation import create_task -from prompting.protocol import StreamPromptingSynapse -from prompting.rewards import RewardResult -from prompting.tasks import QuestionAnsweringTask -from prompting.utils.uids import get_random_uids -from prompting.utils.exceptions import BittensorError -from prompting.utils.logging import log_event -from prompting.utils.misc import async_log, serialize_exception_to_string -from transformers import PreTrainedTokenizerFast as Tokenizer - -SINGLE_TURN_TASKS = ('sentiment', 'translation') - - -@async_log -async def execute_dendrite_call(dendrite_call): - responses = await dendrite_call - return responses - - -async def process_stream(uid: int, async_iterator: Awaitable, tokenizer: Tokenizer) -> SynapseStreamResult: - """Process a single response asynchronously.""" - synapse = None # Initialize chunk with a default value - exception = None - accumulated_chunks = [] - accumulated_chunks_timings = [] - accumulated_tokens_per_chunk = [] - start_time = time.time() - - try: - chunk = None - async for chunk in async_iterator: # most important loop, as this is where we acquire the final synapse. - if isinstance(chunk, str): - accumulated_chunks.append(chunk) - accumulated_chunks_timings.append(time.time() - start_time) - - tokens_in_chunk = len(tokenizer.tokenize(chunk)) - accumulated_tokens_per_chunk.append(tokens_in_chunk) - - bt.logging.debug(f"\nchunk for uid {uid}: {chunk}") - - # Assuming last chunk of async_iterator holds the last value yielded as a StreamingSynapse - synapse = chunk - if synapse is None or not isinstance(synapse, StreamPromptingSynapse): - raise ValueError( - f"Something went wrong with miner uid {uid}, Synapse is not StreamPromptingSynapse." - ) - except Exception as e: - exception = e - traceback_details = traceback.format_exc() - bt.logging.error( - f"Error in generating reference or handling responses for uid {uid}: {e}\n{traceback_details}" - ) - - failed_synapse = StreamPromptingSynapse( - roles=["user"], messages=["failure"], completion="" - ) - - synapse = failed_synapse - finally: - return SynapseStreamResult( - accumulated_chunks=accumulated_chunks, - accumulated_chunks_timings=accumulated_chunks_timings, - tokens_per_chunk=accumulated_tokens_per_chunk, - synapse=synapse, - uid=uid, - exception=exception - ) - - -@async_log -async def handle_response(stream_results_dict: Dict[int, Awaitable], tokenizer: Tokenizer) -> List[SynapseStreamResult]: - """The handle_response function is responsible for creating asyncio tasks around acquiring streamed miner chunks - and processing them asynchronously. It then pairs the results with their original UIDs and returns a list of StreamResults. - - Args: - responses (Dict[int, Awaitable]): Responses contains awaitables that are used to acquire streamed miner chunks. - - Raises: - ValueError - - Returns: - List[StreamResult]: DataClass containing the synapse, exception, and uid - """ - tasks_with_uid = [ - (uid, stream_results_dict[uid]) for uid, _ in stream_results_dict.items() - ] # Pair UIDs with their tasks - - # Start tasks, preserving order and their associated UIDs - process_stream_tasks = [process_stream(uid, resp, tokenizer) for uid, resp in tasks_with_uid] - processed_stream_results = await asyncio.gather(*process_stream_tasks, return_exceptions=True) - - return processed_stream_results - - -@async_log -async def generate_reference(agent: HumanAgent): - loop = asyncio.get_running_loop() - result = await loop.run_in_executor( - None, agent.task.generate_reference, agent.llm_pipeline - ) - return result - - -def log_stream_results(stream_results: List[SynapseStreamResult]): - failed_responses = [ - response for response in stream_results if response.exception is not None - ] - empty_responses = [ - response - for response in stream_results - if response.exception is None and response.synapse.completion == "" - ] - non_empty_responses = [ - response - for response in stream_results - if response.exception is None and response.synapse.completion != "" - ] - - bt.logging.info(f"Total of non_empty responses: ({len(non_empty_responses)})") - bt.logging.info(f"Total of empty responses: ({len(empty_responses)})") - bt.logging.info( - f"Total of failed responses: ({len(failed_responses)}):\n {failed_responses}" - ) - - for failed_response in failed_responses: - formatted_exception = serialize_exception_to_string(failed_response.exception) - bt.logging.error( - f"Failed response for uid {failed_response.uid}: {formatted_exception}" - ) - - -async def run_step( - self, agent: HumanAgent, roles: List[str], messages: List[str], k: int, timeout: float, exclude: list = None -): - """Executes a single step of the agent, which consists of: - - Getting a list of uids to query - - Querying the network - - Rewarding the network - - Updating the scores - - Logging the event - - Args: - agent (HumanAgent): The agent to run the step for. - roles (List[str]): The roles for the synapse. - messages (List[str]): The messages for the synapse. - k (int): The number of uids to query. - timeout (float): The timeout for the queries. - exclude (list, optional): The list of uids to exclude from the query. Defaults to []. - """ - bt.logging.debug("run_step", agent.task.name) - - # Record event start time. - start_time = time.time() - # Get the list of uids to query for this step. - uids = get_random_uids(self, k=k, exclude=exclude or []).to(self.device) - uids_cpu = uids.cpu().tolist() - - axons = [self.metagraph.axons[uid] for uid in uids] - - # Directly call dendrite and process responses in parallel - streams_responses = await self.dendrite( - axons=axons, - synapse=StreamPromptingSynapse(roles=roles, messages=messages), - timeout=timeout, - deserialize=False, - streaming=True, - ) - - # Prepare the task for handling stream responses - stream_results_dict = dict(zip(uids_cpu, streams_responses)) - tokenizer = self.llm_pipeline.tokenizer - handle_stream_responses_task = asyncio.create_task(handle_response(stream_results_dict, tokenizer)) - - if not agent.task.static_reference: - async with self.lock: - reference_generation_task = generate_reference(agent) - _, stream_results = await asyncio.gather( - reference_generation_task, handle_stream_responses_task - ) - else: - stream_results = await handle_stream_responses_task - - log_stream_results(stream_results) - - # Encapsulate the responses in a response event (dataclass) - response_event = DendriteResponseEvent( - stream_results=stream_results, uids=uids, timeout=timeout - ) - - bt.logging.info(f"Created DendriteResponseEvent:\n {response_event}") - # Reward the responses and get the reward result (dataclass) - # This contains a list of RewardEvents but can be exported as a dict (column-wise) for logging etc - reward_result = RewardResult( - self.reward_pipeline, - agent=agent, - response_event=response_event, - device=self.device, - ) - bt.logging.info(f"Created RewardResult:\n {reward_result}") - - best_response = response_event.completions[reward_result.rewards.argmax()] - - # The original idea was that the agent is 'satisfied' when it gets a good enough response (e.g. reward critera is met, such as ROUGE>threshold) - agent.update_progress( - top_reward=reward_result.rewards.max(), - top_response=best_response, - ) - - self.update_scores(reward_result.rewards, uids) - - # Log the step event. - event = { - "best": best_response, - "block": self.latest_block, - "step": self.step, - "step_time": time.time() - start_time, - **agent.__state_dict__(full=self.config.neuron.log_full), - **reward_result.__state_dict__(full=self.config.neuron.log_full), - **response_event.__state_dict__(), - } - - return event - - -async def forward(self): - """ - Encapsulates a full conversation between the validator and miners. Contains one or more rounds of request-response. - - """ - bt.logging.info("🚀 Starting forward loop...") - forward_start_time = time.time() - - while True: - bt.logging.info( - f"📋 Selecting task... from {self.config.neuron.tasks} with distribution {self.config.neuron.task_p}" - ) - # Create a specific task - task_name = np.random.choice( - self.config.neuron.tasks, p=self.config.neuron.task_p - ) - bt.logging.info(f"📋 Creating {task_name} task... ") - try: - task = create_task( - llm_pipeline=self.llm_pipeline, - translation_pipeline=self.translation_pipeline, - task_name=task_name, - create_reference=False, - ) - break - except Exception as e: - bt.logging.error( - f"Failed to create {task_name} task. {sys.exc_info()}. Skipping to next task." - ) - continue - - # Create random agent with task, topic, profile... - bt.logging.info(f"🤖 Creating agent for {task_name} task... ") - agent = HumanAgent( - task=task, llm_pipeline=self.llm_pipeline, begin_conversation=True - ) - - turn = 0 - exclude_uids = [] - roles = ["user"] - messages = [agent.challenge] - while True: - # Note: The try catch is a safe clause to ensure that the forward loop continues even if an error occurs in run_step. - # To be reconsidered in the next version. - try: - # when run_step is called, the agent updates its progress - event = await run_step( - self, - agent, - roles=roles, - messages=messages, - k=self.config.neuron.sample_size, - timeout=self.config.neuron.timeout, - exclude=exclude_uids, - ) - - # Adds forward time to event and logs it to wandb - event["forward_time"] = time.time() - forward_start_time - event["turn"] = turn - log_event(self, event) - task.complete = True - - accepted_answer = event["best"] if random.random() < 0.5 else agent.task.reference - roles.append("assistant") - messages.append(accepted_answer) - - # 50% chance of single turn conversation, 25% of two turns. - if random.random() < 0.5 or turn >= 1: - break - - if task.name in SINGLE_TURN_TASKS: - break - - history = '\n'.join([f"{role}: {message}" for role, message in zip(roles, messages)]) - - # Use PREVIOUS task context - agent.task = QuestionAnsweringTask(self.llm_pipeline, context=task.context, create_reference=False, history=history) - - # overwrite the challenge with the followup query, which *should* continue the persona - agent.challenge = agent.task.query - - roles.append("user") - messages.append(agent.challenge) - turn += 1 - except BittensorError as e: - bittensor_error = serialize_exception_to_string(e) - bt.logging.error( - f"An error was raised from the Bittensor package. Ending validator. \n {bittensor_error}" - ) - sys.exit(1) - except BaseException as e: - unexpected_errors = serialize_exception_to_string(e) - bt.logging.error( - f"Error in run_step: Skipping to next round.\n" - f"Task: {task_name}\nMessages: {messages}\nRoles: {roles}\nTurn: {turn}.\n" - f"{unexpected_errors}\n" - ) - - event = {"unexpected_errors": unexpected_errors} - - log_event(self, event) - - await asyncio.sleep(1) - continue - del agent - del task diff --git a/prompting/llms/__init__.py b/prompting/llms/__init__.py index 40d9aee1..b9b8d4ce 100644 --- a/prompting/llms/__init__.py +++ b/prompting/llms/__init__.py @@ -1,8 +1,2 @@ -from .base_llm import BasePipeline, BaseLLM -from .hf import ( - load_hf_pipeline, - HuggingFacePipeline, - HuggingFaceLLM, - CustomTextIteratorStreamer, -) -from .vllm_llm import vLLM_LLM, vLLMPipeline, load_vllm_pipeline +# from .base_llm import BasePipeline as BasePipeline, BaseLLM as BaseLLM +# from .vllm_llm import vLLM_LLM as vLLM_LLM, vLLMPipeline as vLLMPipeline, load_vllm_pipeline as load_vllm_pipeline diff --git a/prompting/llms/base_llm.py b/prompting/llms/base_llm.py index e5df5d31..7cdda6be 100644 --- a/prompting/llms/base_llm.py +++ b/prompting/llms/base_llm.py @@ -1,16 +1,23 @@ -import bittensor as bt from abc import ABC, abstractmethod -from prompting.cleaners.cleaner import CleanerPipeline -from typing import Any, Dict, List +from prompting.utils.cleaners import CleanerPipeline +from typing import Any +from loguru import logger +from pydantic import BaseModel -class BasePipeline(ABC): +class BasePipeline(ABC, BaseModel): @abstractmethod - def __call__(self, composed_prompt: str, **kwargs: dict) -> Any: - ... + def __call__(self, composed_prompt: str, **kwargs: dict) -> Any: ... class BaseLLM(ABC): + llm_pipeline: BasePipeline + model_kwargs: dict + system_prompt: str | None = None + messages: list[dict] = [] + times: list[int] = [] + tokenizer: Any = None + def __init__( self, llm_pipeline: BasePipeline, @@ -24,25 +31,25 @@ def __init__( self.times = [] self.tokenizer = None + @abstractmethod def query( self, message: str, role: str = "user", - disregard_system_prompt: bool = False, cleaner: CleanerPipeline = None, - ) -> str: - ... + ) -> str: ... - def forward(self, messages: List[Dict[str, str]]): - ... + def forward(self, messages: list[dict[str, str]]) -> str: + return self._forward(messages) + + @abstractmethod + def _forward(self, messages: list[dict[str, str]]) -> str: ... def clean_response(self, cleaner: CleanerPipeline, response: str) -> str: + clean_response = response if cleaner is not None: clean_response = cleaner.apply(generation=response) if clean_response != response: - bt.logging.debug( - f"Response cleaned, chars removed: {len(response) - len(clean_response)}..." - ) + logger.debug(f"Response cleaned, chars removed: {len(response) - len(clean_response)}...") - return clean_response - return response + return clean_response diff --git a/prompting/llms/hf.py b/prompting/llms/hf.py deleted file mode 100644 index d2a09540..00000000 --- a/prompting/llms/hf.py +++ /dev/null @@ -1,248 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import time -from typing import List, Dict -import bittensor as bt - -from transformers import BitsAndBytesConfig, pipeline, AutoTokenizer, TextIteratorStreamer -from prompting.mock import MockPipeline -from prompting.cleaners.cleaner import CleanerPipeline -from transformers import pipeline, TextIteratorStreamer, AutoTokenizer -from prompting.llms import BasePipeline, BaseLLM - - -class CustomTextIteratorStreamer(TextIteratorStreamer): - """ - TextIteratorStreamer stores print-ready text in a queue, to be used by a downstream application as an iterator. - The queue is thread-safe and can be used to stream data from the model to the application. - - TextIteratorStreamer has internal methods to raise a StopIteration if a stop signal is received - (stop signal is when the value returned from the Queue is None), but this is not flexible enough. - Therefore, we add methods to check and clean the queue manually. - """ - - def has_data(self): - """Check if the queue has data.""" - return not self.text_queue.empty() - - def clear_queue(self): - """Clear the queue.""" - with self.text_queue.mutex: # ensures that the queue is cleared safely in a multi-threaded environment - self.text_queue.queue.clear() - - -def load_hf_pipeline( - model_id: str, - device=None, - torch_dtype=None, - mock=False, - model_kwargs: dict = None, - return_streamer: bool = False, -): - """Loads the HuggingFace pipeline for the LLM, or a mock pipeline if mock=True""" - - if mock or model_id == "mock": - return MockPipeline(model_id) - - if not device.startswith("cuda"): - bt.logging.warning("Only crazy people run this on CPU. It is not recommended.") - - try: - tokenizer = AutoTokenizer.from_pretrained( - model_id - ) # model_id is usually the name of the tokenizer. - except Exception as e: - bt.logging.error(f"Failed to load tokenizer from model_id: {model_id}.") - raise e - - streamer = CustomTextIteratorStreamer(tokenizer=tokenizer) - - # model_kwargs torch type definition conflicts with pipeline torch_dtype, so we need to differentiate them - if model_kwargs is None: - llm_pipeline = pipeline( - "text-generation", - model=model_id, - tokenizer=tokenizer, - device=device, - torch_dtype=torch_dtype, - streamer=streamer, - ) - else: - kwargs = model_kwargs.copy() - kwargs["bnb_4bit_compute_dtype"] = kwargs.pop("torch_dtype") - quant_config = BitsAndBytesConfig(**kwargs) - llm_pipeline = pipeline( - "text-generation", - model=model_id, - tokenizer=tokenizer, - device_map=device, - quant_config=quant_config, - streamer=streamer, - ) - - if return_streamer: - return llm_pipeline, streamer - return llm_pipeline - - -class HuggingFacePipeline(BasePipeline): - def __init__( - self, - model_id, - device=None, - torch_dtype=None, - mock=False, - model_kwargs: dict = None, - return_streamer: bool = False, - gpus: int = 1, - llm_max_allowed_memory_in_gb: int = 0 - ): - super().__init__() - self.model = model_id - self.device = device - self.torch_dtype = torch_dtype - self.mock = mock - - package = load_hf_pipeline( - model_id=model_id, - device=device, - torch_dtype=torch_dtype, - mock=mock, - model_kwargs=model_kwargs, - return_streamer=return_streamer, - ) - - if return_streamer: - self.pipeline, self.streamer = package - else: - self.pipeline = package - - self.tokenizer = self.pipeline.tokenizer - - def __call__(self, composed_prompt: str, **kwargs: dict) -> str: - if self.mock: - return self.pipeline(composed_prompt, **kwargs) - - # Extract the generated text from the pipeline output - outputs = self.pipeline(composed_prompt, **kwargs) - return outputs[0]["generated_text"] - - -class HuggingFaceLLM(BaseLLM): - def __init__( - self, - llm_pipeline: BasePipeline, - system_prompt, - max_new_tokens=256, - do_sample=True, - temperature=0.7, - top_k=50, - top_p=0.95, - ): - # Sets specific kwargs for hf pipeline - model_kwargs = dict( - do_sample=do_sample, - temperature=temperature, - top_k=top_k, - top_p=top_p, - max_new_tokens=max_new_tokens, - ) - - super().__init__(llm_pipeline, system_prompt, model_kwargs) - - self.messages = [{"content": self.system_prompt, "role": "system"}] - self.times = [0] - - def query( - self, - message: str, - role: str = "user", - disregard_system_prompt: bool = False, - cleaner: CleanerPipeline = None, - ): - messages = self.messages + [{"content": message, "role": role}] - - if disregard_system_prompt: - messages = messages[1:] - - tbeg = time.time() - response = self.forward(messages=messages) - response = self.clean_response(cleaner, response) - - self.messages = messages + [{"content": response, "role": "assistant"}] - self.times = self.times + [0, time.time() - tbeg] - - return response - - def stream( - self, - message: str, - role: str = "user", - ): - messages = self.messages + [{"content": message, "role": role}] - prompt = self._make_prompt(messages) - - bt.logging.debug("Starting LLM streaming process...") - streamer = CustomTextIteratorStreamer(tokenizer=self.llm_pipeline.tokenizer) - _ = self.llm_pipeline(prompt, streamer=streamer, **self.model_kwargs) - - return streamer - - def __call__(self, messages: List[Dict[str, str]]): - return self.forward(messages=messages) - - def _make_prompt(self, messages: List[Dict[str, str]]): - # The tokenizer.tokenizer is used for a integration with vllm and the mock pipeline, for real hf application, use: - # return self.llm_pipeline.tokenizer.apply_chat_template( - # messages, tokenize=False, add_generation_prompt=True - # ) - return self.llm_pipeline.tokenizer.tokenizer.apply_chat_template( - messages, tokenize=False, add_generation_prompt=True - ) - - def forward(self, messages: List[Dict[str, str]]): - composed_prompt = self._make_prompt(messages) - # System prompt is composed in the prompt - response = self.llm_pipeline( - composed_prompt=composed_prompt, **self.model_kwargs - ) - - response = response.replace(composed_prompt, "").strip() - - bt.logging.info( - f"{self.__class__.__name__} generated the following output:\n{response}" - ) - return response - - -if __name__ == "__main__": - # Test the HuggingFacePipeline and HuggingFaceLLM - model_id = "HuggingFaceH4/zephyr-7b-beta" - device = "cuda" - torch_dtype = "float16" - mock = True - - llm_pipeline = HuggingFacePipeline( - model_id=model_id, device=device, torch_dtype=torch_dtype, mock=mock - ) - - llm = HuggingFaceLLM(llm_pipeline, "You are a helpful AI assistant") - - message = "What is the capital of Texas?" - response = llm.query(message) - print(response) diff --git a/prompting/llms/utils.py b/prompting/llms/utils.py index 8de32ba8..a1040666 100644 --- a/prompting/llms/utils.py +++ b/prompting/llms/utils.py @@ -1,12 +1,13 @@ import re import torch -import bittensor as bt +from loguru import logger def contains_gpu_index_in_device(device: str) -> bool: pattern = r"^cuda:\d+$" return bool(re.match(pattern, device)) + def calculate_single_gpu_requirements(device: str, max_allowed_memory_allocation_in_bytes: int): if contains_gpu_index_in_device(device): device_with_gpu_index = device @@ -14,38 +15,39 @@ def calculate_single_gpu_requirements(device: str, max_allowed_memory_allocation device_with_gpu_index = torch.cuda.current_device() torch.cuda.synchronize() - global_free, total_gpu_memory = torch.cuda.mem_get_info( - device=device_with_gpu_index - ) + global_free, total_gpu_memory = torch.cuda.mem_get_info(device=device_with_gpu_index) - bt.logging.info(f"Available free memory: {round(global_free / 10e8, 2)} GB") - bt.logging.info(f"Total gpu memory {round(total_gpu_memory / 10e8, 2)} GB") + logger.info(f"Available free memory: {round(global_free / 10e8, 2)} GB") + logger.info(f"Total gpu memory {round(total_gpu_memory / 10e8, 2)} GB") if global_free < max_allowed_memory_allocation_in_bytes: - raise torch.cuda.CudaError( + ex = Exception( f"Not enough memory to allocate for the model. Please ensure you have at least {max_allowed_memory_allocation_in_bytes / 10e8} GB of free GPU memory." ) + logger.error(ex) + raise ex gpu_utilization = round(max_allowed_memory_allocation_in_bytes / global_free, 2) - bt.logging.info( + logger.info( f'{gpu_utilization * 100}% of the GPU memory will be utilized for loading the model to device "{device}".' ) - return gpu_utilization + return gpu_utilization + -def calculate_multiple_gpu_requirements(device: str, gpus: int, max_allowed_memory_allocation_in_bytes: int): +def calculate_multiple_gpu_requirements(device: str, gpus: int, max_allowed_memory_allocation_in_bytes: int): torch.cuda.synchronize() total_free_memory = 0 total_gpu_memory = 0 - + for i in range(gpus): gpu_device = f"cuda:{i}" global_free, total_memory = torch.cuda.mem_get_info(device=gpu_device) total_free_memory += global_free total_gpu_memory += total_memory - bt.logging.info(f"Total available free memory across all visible {gpus} GPUs: {round(total_free_memory / 10e8, 2)} GB") - bt.logging.info(f"Total GPU memory across all visible GPUs: {gpus} {round(total_gpu_memory / 10e8, 2)} GB") + logger.info(f"Total available free memory across all visible {gpus} GPUs: {round(total_free_memory / 10e8, 2)} GB") + logger.info(f"Total GPU memory across all visible GPUs: {gpus} {round(total_gpu_memory / 10e8, 2)} GB") if total_free_memory < max_allowed_memory_allocation_in_bytes: raise torch.cuda.CudaError( @@ -53,7 +55,7 @@ def calculate_multiple_gpu_requirements(device: str, gpus: int, max_allowed_memo ) gpu_utilization = round(max_allowed_memory_allocation_in_bytes / total_free_memory, 2) - bt.logging.info( + logger.info( f"{gpu_utilization * 100}% of the total GPU memory across all GPUs will be utilized for loading the model." ) @@ -61,7 +63,9 @@ def calculate_multiple_gpu_requirements(device: str, gpus: int, max_allowed_memo def calculate_gpu_requirements( - device: str, gpus: int, max_allowed_memory_allocation_in_bytes: float, + device: str, + gpus: int, + max_allowed_memory_allocation_in_bytes: float, ) -> float: """Calculates the memory utilization requirements for the model to be loaded on the device. Args: @@ -69,6 +73,8 @@ def calculate_gpu_requirements( max_allowed_memory_allocation_in_bytes (int, optional): The maximum allowed memory allocation in bytes. Defaults to 20e9 (20GB). """ if gpus == 1: - return calculate_single_gpu_requirements(device, max_allowed_memory_allocation_in_bytes) - else: - return calculate_multiple_gpu_requirements(device, gpus, max_allowed_memory_allocation_in_bytes=max_allowed_memory_allocation_in_bytes) + return calculate_single_gpu_requirements(device, max_allowed_memory_allocation_in_bytes) + else: + return calculate_multiple_gpu_requirements( + device, gpus, max_allowed_memory_allocation_in_bytes=max_allowed_memory_allocation_in_bytes + ) diff --git a/prompting/llms/vllm_llm.py b/prompting/llms/vllm_llm.py index 995a60de..e96eb5e8 100644 --- a/prompting/llms/vllm_llm.py +++ b/prompting/llms/vllm_llm.py @@ -1,44 +1,54 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import threading import time -import bittensor as bt -from typing import List, Dict, Optional, Any -from vllm import LLM, SamplingParams -from prompting.cleaners.cleaner import CleanerPipeline -from prompting.llms import BasePipeline, BaseLLM -from prompting.mock import MockPipeline +from typing import Optional, Any +from prompting.utils.cleaners import CleanerPipeline +from prompting.llms.base_llm import BasePipeline, BaseLLM from prompting.llms.utils import calculate_gpu_requirements +from vllm import LLM +from transformers import PreTrainedTokenizerFast +from pydantic import model_validator, ConfigDict +from loguru import logger + +try: + from vllm import SamplingParams +except ImportError: + raise ImportError( + "Could not import vllm library. Please install via poetry: " 'poetry install --extras "validator" ' + ) -def load_vllm_pipeline(model_id: str, device: str, gpus: int, max_allowed_memory_in_gb: int, mock=False): +def load_vllm_pipeline( + model_id: str, + device: str, + gpus: int, + max_allowed_memory_in_gb: int, + max_model_len: int, + mock: bool = False, + quantization: bool = True, +): """Loads the VLLM pipeline for the LLM, or a mock pipeline if mock=True""" - if mock or model_id == "mock": - return MockPipeline(model_id) + + try: + from vllm import LLM + except ImportError: + raise ImportError( + "Could not import vllm library. Please install via poetry: " 'poetry install --extras "validator" ' + ) # Calculates the gpu memory utilization required to run the model. max_allowed_memory_allocation_in_bytes = max_allowed_memory_in_gb * 1e9 - gpu_mem_utilization = calculate_gpu_requirements( - device, gpus, max_allowed_memory_allocation_in_bytes - ) + gpu_mem_utilization = calculate_gpu_requirements(device, gpus, max_allowed_memory_allocation_in_bytes) try: # Attempt to initialize the LLM - llm = LLM(model=model_id, gpu_memory_utilization = gpu_mem_utilization, quantization="AWQ", tensor_parallel_size=gpus) + logger.info(f"Loading VLLM pipeline with model_id {model_id}: Max. VRAM: {gpu_mem_utilization}; GPUs: {gpus}") + llm = LLM( + model=model_id, + gpu_memory_utilization=gpu_mem_utilization, + max_model_len=max_model_len, + quantization="AWQ" if quantization else None, + tensor_parallel_size=gpus, + enforce_eager=True, + ) # This solution implemented by @bkb2135 sets the eos_token_id directly for efficiency in vLLM usage. # This approach avoids the overhead of loading a tokenizer each time the custom eos token is needed. # Using the Hugging Face pipeline, the eos token specific to llama models was fetched and saved (128009). @@ -46,31 +56,37 @@ def load_vllm_pipeline(model_id: str, device: str, gpus: int, max_allowed_memory llm.llm_engine.tokenizer.eos_token_id = 128009 return llm except Exception as e: - bt.logging.error( - f"Error loading the VLLM pipeline within {max_allowed_memory_in_gb}GB: {e}" - ) + logger.error(f"Error loading the VLLM pipeline within {max_allowed_memory_in_gb}GB: {e}") raise e - class vLLMPipeline(BasePipeline): - _LOCK = threading.Lock() - - def __init__( - self, - model_id: str, - llm_max_allowed_memory_in_gb: int, - device: str = None, - gpus: int = 1, - mock: bool = False - ): - super().__init__() - self.llm = load_vllm_pipeline(model_id, device, gpus, llm_max_allowed_memory_in_gb, mock) - self.mock = mock - self.gpus = gpus - self.tokenizer = self.llm.llm_engine.tokenizer.tokenizer + llm_model_id: str + llm_max_allowed_memory_in_gb: int + llm_max_model_len: int + mock: bool = False + gpus: int = 1 + device: str = None + quantization: bool = True + + llm: Optional[LLM] = None + tokenizer: Optional[PreTrainedTokenizerFast] = None + model_config = ConfigDict(arbitrary_types_allowed=True) + + @model_validator(mode="after") + def load_llm_and_tokenizer(self) -> "vLLMPipeline": + self.llm = load_vllm_pipeline( + model_id=self.llm_model_id, + device=self.device, + gpus=self.gpus, + max_allowed_memory_in_gb=self.llm_max_allowed_memory_in_gb, + max_model_len=self.llm_max_model_len, + mock=self.mock, + quantization=self.quantization, + ) + self.tokenizer = self.llm.llm_engine.get_tokenizer() - def __call__(self, composed_prompt: str, **model_kwargs: Dict) -> str: + def __call__(self, composed_prompt: str, **model_kwargs: dict) -> str: if self.mock: return self.llm(composed_prompt, **model_kwargs) @@ -79,11 +95,9 @@ def __call__(self, composed_prompt: str, **model_kwargs: Dict) -> str: top_p = model_kwargs.get("top_p", 0.95) max_tokens = model_kwargs.get("max_tokens", 256) - sampling_params = SamplingParams( - temperature=temperature, top_p=top_p, max_tokens=max_tokens - ) - with self._LOCK: - output = self.llm.generate(composed_prompt, sampling_params, use_tqdm=True) + sampling_params = SamplingParams(temperature=temperature, top_p=top_p, max_tokens=max_tokens) + + output = self.llm.generate(composed_prompt, sampling_params, use_tqdm=True) response = output[0].outputs[0].text return response @@ -105,8 +119,9 @@ def __init__( super().__init__(llm_pipeline, system_prompt, model_kwargs) # Keep track of generation data using messages and times - self.messages = [{"content": self.system_prompt, "role": "system"}] - self.times: List[float] = [0] + self.system_prompt = system_prompt + self.messages = [{"content": self.system_prompt, "role": "system"}] if self.system_prompt else [] + self.times: list[float] = [0] self._role_template = { "system": "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n{{{{ {} }}}}<|eot_id|>", "user": "<|start_header_id|>user<|end_header_id|>\n{{{{ {} }}}}<|eot_id|>", @@ -121,7 +136,7 @@ def query_conversation( cleaner: Optional[CleanerPipeline] = None, ): """Query LLM with the given lists of conversation history and roles - + Args: messages (list[str]): List of messages in the conversation. roles (list[str]): List of roles for each message. @@ -142,14 +157,13 @@ def query( self, message: str, role: str = "user", - disregard_system_prompt: bool = False, - cleaner: CleanerPipeline = None, + cleaner: CleanerPipeline = CleanerPipeline(), ): # Adds the message to the list of messages for tracking purposes, even though it's not used downstream messages = self.messages + [{"content": message, "role": role}] t0 = time.time() - response = self.forward(messages=messages) + response = self._forward(messages=messages) response = self.clean_response(cleaner, response) self.messages = messages @@ -158,8 +172,8 @@ def query( return response - def _make_prompt(self, messages: List[Dict[str, str]]) -> str: - composed_prompt: List[str] = [] + def _make_prompt(self, messages: list[dict[str, str]]) -> str: + composed_prompt: list[str] = [] for message in messages: role = message["role"] @@ -172,28 +186,11 @@ def _make_prompt(self, messages: List[Dict[str, str]]) -> str: composed_prompt.append(self._role_template["end"]) return "".join(composed_prompt) - def forward(self, messages: List[Dict[str, str]]): + def _forward(self, messages: list[dict[str, str]]): # make composed prompt from messages composed_prompt = self._make_prompt(messages) response = self.llm_pipeline(composed_prompt, **self.model_kwargs) - bt.logging.info( - f"{self.__class__.__name__} generated the following output:\n{response}" - ) + logger.info(f"{self.__class__.__name__} generated the following output:\n{response}") return response - - -if __name__ == "__main__": - # Example usage - llm_pipeline = vLLMPipeline( - model_id="casperhansen/llama-3-70b-instruct-awq", - device="cuda", - llm_max_allowed_memory_in_gb=80, - gpus=1, - ) - llm = vLLM_LLM(llm_pipeline, system_prompt="You are a helpful AI assistant") - - message = "What is the capital of Texas?" - response = llm.query(message) - print(response) diff --git a/prompting/miners/__init__.py b/prompting/miners/__init__.py deleted file mode 100644 index f53f9bb4..00000000 --- a/prompting/miners/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Test miners -from .echo import EchoMiner -from .mock import MockMiner -from .phrase import PhraseMiner - -# Real miners -from .openai_miner import OpenAIMiner \ No newline at end of file diff --git a/prompting/miners/echo.py b/prompting/miners/echo.py deleted file mode 100644 index b27c8205..00000000 --- a/prompting/miners/echo.py +++ /dev/null @@ -1,55 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import typing -from functools import partial -from starlette.types import Send - -# Bittensor Miner Template: -from prompting.protocol import StreamPromptingSynapse - -# import base miner class which takes care of most of the boilerplate -from prompting.base.prompting_miner import BaseStreamPromptingMiner - - -class EchoMiner(BaseStreamPromptingMiner): - """ - This little fella just repeats the last message it received. - """ - - def __init__(self, config=None): - super().__init__(config=config) - - def forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: - async def _forward(message: str, send: Send): - await send( - { - "type": "http.response.body", - "body": message, - "more_body": False, - } - ) - - token_streamer = partial(_forward, synapse.messages[-1]) - return synapse.create_streaming_response(token_streamer) - - async def blacklist( - self, synapse: StreamPromptingSynapse - ) -> typing.Tuple[bool, str]: - return False, "All good here" - - async def priority(self, synapse: StreamPromptingSynapse) -> float: - return 1e6 diff --git a/prompting/miners/hf_miner.py b/prompting/miners/hf_miner.py deleted file mode 100644 index 659035fd..00000000 --- a/prompting/miners/hf_miner.py +++ /dev/null @@ -1,219 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import time -import torch -import argparse -import bittensor as bt -from functools import partial -from starlette.types import Send -from typing import Awaitable - -# Bittensor Miner Template: -from prompting.protocol import StreamPromptingSynapse -from prompting.llms import HuggingFaceLLM, HuggingFacePipeline, load_hf_pipeline - -# import base miner class which takes care of most of the boilerplate -from prompting.base.prompting_miner import BaseStreamPromptingMiner -from deprecated import deprecated - -@deprecated(version="2.4.1+", reason="Class is deprecated, use openai miner for reference on example miner.") -class HuggingFaceMiner(BaseStreamPromptingMiner): - """ - Base miner which runs zephyr (https://huggingface.co/HuggingFaceH4/zephyr-7b-beta) - This requires a GPU with at least 20GB of memory. - To run this miner from the project root directory: - - python neurons/miners/huggingface/miner.py --wallet.name --wallet.hotkey --neuron.model_id --subtensor.network --netuid --axon.port --axon.external_port --logging.debug True --neuron.model_id HuggingFaceH4/zephyr-7b-beta --neuron.system_prompt "Hello, I am a chatbot. I am here to help you with your questions." --neuron.max_tokens 64 --neuron.do_sample True --neuron.temperature 0.9 --neuron.top_k 50 --neuron.top_p 0.95 --wandb.on True --wandb.entity sn1 --wandb.project_name miners_experiments - """ - - @classmethod - def add_args(cls, parser: argparse.ArgumentParser): - """ - Adds arguments to the command line parser. - """ - super().add_args(parser) - - def __init__(self, config=None): - super().__init__(config=config) - - model_kwargs = None - if self.config.neuron.load_in_8bit: - bt.logging.info("Loading 8 bit quantized model...") - model_kwargs = dict( - torch_dtype=torch.float16, - load_in_8bit=True, - ) - - if self.config.neuron.load_in_4bit: - bt.logging.info("Loading 4 bit quantized model...") - model_kwargs = dict( - torch_dtype=torch.float32, - load_in_4bit=True, - ) - - if self.config.wandb.on: - self.identity_tags = ("hf_miner",) - - if self.config.neuron.load_in_8bit: - self.identity_tags += ("8bit_quantization",) - elif self.config.neuron.load_in_4bit: - self.identity_tags += ("4bit_quantization",) - - # Forces model loading behaviour over mock flag - mock = ( - False if self.config.neuron.should_force_model_loading else self.config.mock - ) - - self.llm_pipeline = HuggingFacePipeline( - model_id=self.config.neuron.model_id, - torch_dtype=torch.bfloat16, - device=self.device, - mock=mock, - model_kwargs=model_kwargs, - ) - - self.model_id = self.config.neuron.model_id - self.system_prompt = self.config.neuron.system_prompt - - def forward(self, synapse: StreamPromptingSynapse) -> Awaitable: - async def _forward( - self, - prompt: str, - init_time: float, - timeout_threshold: float, - send: Send, - ): - """ - Args: - prompt (str): The received message (challenge) in the synapse. For logging. - thread (Thread): A background thread that is reponsible for running the model. - init_time (float): Initial time of the forward call. For timeout calculation. - timeout_threshold (float): The amount of time that the forward call is allowed to run. If timeout is reached, streaming stops and - validators recieve a partial response. - streamer (CustomTextIteratorStreamer): Iterator that holds tokens within a background Queue to be returned when sampled. - send (Send): bittensor aiohttp send function to send the response back to the validator. - """ - - buffer = [] - temp_completion = "" # for wandb logging - timeout_reached = False - system_message = "" - bt.logging.debug(f"📧 Message received, forwarding synapse: {synapse}") - - try: - streamer = HuggingFaceLLM( - llm_pipeline=self.llm_pipeline, - system_prompt=self.system_prompt, - max_new_tokens=self.config.neuron.max_tokens, - do_sample=self.config.neuron.do_sample, - temperature=self.config.neuron.temperature, - top_k=self.config.neuron.top_k, - top_p=self.config.neuron.top_p, - ).stream(message=prompt) - - bt.logging.debug("Starting streaming loop...") - synapse_message = synapse.messages[-1] - for token in streamer: - system_message += token - - buffer.append(token) - system_message += "".join(buffer) - - if synapse_message in system_message: - # Cleans system message and challenge from model response - bt.logging.warning( - f"Discarding initial system_prompt / user prompt inputs from generation..." - ) - buffer = [] - system_message = "" - continue - - if time.time() - init_time > timeout_threshold: - bt.logging.debug(f"⏰ Timeout reached, stopping streaming") - timeout_reached = True - break - - if len(buffer) == self.config.neuron.streaming_batch_size: - joined_buffer = "".join(buffer) - temp_completion += joined_buffer - # bt.logging.debug(f"Streamed tokens: {joined_buffer}") - - await send( - { - "type": "http.response.body", - "body": joined_buffer.encode("utf-8"), - "more_body": True, - } - ) - buffer = [] - - if ( - buffer and not timeout_reached - ): # Don't send the last buffer of data if timeout. - joined_buffer = "".join(buffer) - temp_completion += joined_buffer - # bt.logging.debug(f"Streamed tokens: {joined_buffer}") - - await send( - { - "type": "http.response.body", - "body": joined_buffer.encode("utf-8"), - "more_body": False, - } - ) - - except Exception as e: - bt.logging.error(f"Error in forward: {e}") - if self.config.neuron.stop_on_forward_exception: - self.should_exit = True - - finally: - # _ = task.result() # wait for thread to finish - bt.logging.debug("Finishing streaming loop...") - bt.logging.debug("-" * 50) - bt.logging.debug(f"---->>> Received message:") - bt.logging.debug(synapse.messages[0]) - bt.logging.debug("-" * 50) - bt.logging.debug(f"<<<----- Returned message:") - bt.logging.debug(temp_completion) - bt.logging.debug("-" * 50) - - synapse_latency = time.time() - init_time - - if self.config.wandb.on: - self.log_event( - timing=synapse_latency, - prompt=prompt, - completion=temp_completion, - system_prompt=self.system_prompt, - ) - - # bt.logging.debug(f"📧 Message received, forwarding synapse: {synapse}") - prompt = synapse.messages[-1] - - init_time = time.time() - timeout_threshold = synapse.timeout - - token_streamer = partial( - _forward, - self, - prompt, - init_time, - timeout_threshold, - ) - - return synapse.create_streaming_response(token_streamer) diff --git a/prompting/miners/langchain_miner.py b/prompting/miners/langchain_miner.py deleted file mode 100644 index b77d1433..00000000 --- a/prompting/miners/langchain_miner.py +++ /dev/null @@ -1,169 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import time -import os -import bittensor as bt -import argparse -from starlette.types import Send -from functools import partial -from typing import Dict, Awaitable - -# Bittensor Miner Template: -from prompting.base.prompting_miner import BaseStreamPromptingMiner -from prompting.protocol import StreamPromptingSynapse - -# import base miner class which takes care of most of the boilerplate - -from prompting.miners.utils import OpenAIUtils - -from langchain.prompts import ChatPromptTemplate -from langchain_core.output_parsers import StrOutputParser -from langchain.chat_models import ChatOpenAI -from dotenv import load_dotenv, find_dotenv -from langchain_core.runnables.base import RunnableSequence -from deprecated import deprecated - -@deprecated(version="2.4.1+", reason="Class is deprecated, use openai miner for reference on example miner.") -class LangchainMiner(BaseStreamPromptingMiner, OpenAIUtils): - """Langchain-based miner which uses OpenAI's API as the LLM. - This miner does not use any tools or external APIs when processing requests - it relies entirely on the models' own representation and world model. In some cases, this can produce lower quality results. - You should also install the dependencies for this miner, which can be found in the requirements.txt file in this directory. - """ - - @classmethod - def add_args(cls, parser: argparse.ArgumentParser): - """ - Adds OpenAI-specific arguments to the command line parser. - """ - super().add_args(parser) - - def __init__(self, config=None): - super().__init__(config=config) - - bt.logging.info(f"Initializing with model {self.config.neuron.model_id}...") - - if self.config.wandb.on: - self.identity_tags = ("openai_miner",) + (self.config.neuron.model_id,) - - _ = load_dotenv(find_dotenv()) - api_key = os.environ.get("OPENAI_API_KEY") - - # Set openai key and other args - self.model = ChatOpenAI( - api_key=api_key, - model_name=self.config.neuron.model_id, - max_tokens=self.config.neuron.max_tokens, - temperature=self.config.neuron.temperature, - ) - - self.system_prompt = self.config.neuron.system_prompt - self.accumulated_total_tokens = 0 - self.accumulated_prompt_tokens = 0 - self.accumulated_completion_tokens = 0 - self.accumulated_total_cost = 0 - - def forward(self, synapse: StreamPromptingSynapse) -> Awaitable: - async def _forward( - self, - message: str, - init_time: float, - timeout_threshold: float, - chain: RunnableSequence, - chain_formatter: Dict[str, str], - send: Send, - ): - buffer = [] - temp_completion = "" # for wandb logging - timeout_reached = False - - try: - # Langchain built in streaming. 'astream' also available for async - for token in chain.stream(chain_formatter): - buffer.append(token) - - if time.time() - init_time > timeout_threshold: - bt.logging.debug(f"⏰ Timeout reached, stopping streaming") - timeout_reached = True - break - - if len(buffer) == self.config.neuron.streaming_batch_size: - joined_buffer = "".join(buffer) - temp_completion += joined_buffer - bt.logging.debug(f"Streamed tokens: {joined_buffer}") - - await send( - { - "type": "http.response.body", - "body": joined_buffer.encode("utf-8"), - "more_body": True, - } - ) - buffer = [] - - if ( - buffer and not timeout_reached - ): # Don't send the last buffer of data if timeout. - joined_buffer = "".join(buffer) - await send( - { - "type": "http.response.body", - "body": joined_buffer.encode("utf-8"), - "more_body": False, - } - ) - - except Exception as e: - bt.logging.error(f"Error in forward: {e}") - if self.config.neuron.stop_on_forward_exception: - self.should_exit = True - - finally: - synapse_latency = time.time() - init_time - if self.config.wandb.on: - self.log_event( - timing=synapse_latency, - prompt=message, - completion=temp_completion, - system_prompt=self.system_prompt, - ) - - bt.logging.debug(f"📧 Message received, forwarding synapse: {synapse}") - - prompt = ChatPromptTemplate.from_messages( - [("system", self.system_prompt), ("user", "{input}")] - ) - chain = prompt | self.model | StrOutputParser() - - role = synapse.roles[-1] - message = synapse.messages[-1] - - chain_formatter = {"role": role, "input": message} - - init_time = time.time() - timeout_threshold = synapse.timeout - - token_streamer = partial( - _forward, - self, - message, - init_time, - timeout_threshold, - chain, - chain_formatter, - ) - return synapse.create_streaming_response(token_streamer) diff --git a/prompting/miners/mock.py b/prompting/miners/mock.py deleted file mode 100644 index 6839245c..00000000 --- a/prompting/miners/mock.py +++ /dev/null @@ -1,56 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import typing -from functools import partial -from starlette.types import Send - -# Bittensor Miner Template: -from prompting.protocol import StreamPromptingSynapse - -# import base miner class which takes care of most of the boilerplate -from prompting.base.prompting_miner import BaseStreamPromptingMiner - - -class MockMiner(BaseStreamPromptingMiner): - """ - This little fella responds with a static message. - """ - - def __init__(self, config=None): - super().__init__(config=config) - - def forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: - async def _forward(message: str, send: Send): - await send( - { - "type": "http.response.body", - "body": message, - "more_body": False, - } - ) - - message = f"Hey you reached mock miner {self.config.wallet.hotkey!r}. Please leave a message after the tone.. Beep!" - token_streamer = partial(_forward, message) - return synapse.create_streaming_response(token_streamer) - - async def blacklist( - self, synapse: StreamPromptingSynapse - ) -> typing.Tuple[bool, str]: - return False, "All good here" - - async def priority(self, synapse: StreamPromptingSynapse) -> float: - return 1e6 diff --git a/prompting/miners/openai_miner.py b/prompting/miners/openai_miner.py deleted file mode 100644 index 9afe0ea2..00000000 --- a/prompting/miners/openai_miner.py +++ /dev/null @@ -1,177 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import time -import os -import bittensor as bt -import argparse -from starlette.types import Send -from functools import partial -from typing import Dict, Awaitable - -# Bittensor Miner Template: -from prompting.base.prompting_miner import BaseStreamPromptingMiner -from prompting.protocol import StreamPromptingSynapse - -# import base miner class which takes care of most of the boilerplate - -from prompting.miners.utils import OpenAIUtils -from dotenv import load_dotenv, find_dotenv -from openai import OpenAI -from typing import List, Dict -from traceback import print_exception - -# Define the type for a list of dictionaries - - -class OpenAIMiner(BaseStreamPromptingMiner, OpenAIUtils): - """Langchain-based miner which uses OpenAI's API as the LLM. - This miner does not use any tools or external APIs when processing requests - it relies entirely on the models' own representation and world model. In some cases, this can produce lower quality results. - You should also install the dependencies for this miner, which can be found in the requirements.txt file in this directory. - """ - - @classmethod - def add_args(cls, parser: argparse.ArgumentParser): - """ - Adds OpenAI-specific arguments to the command line parser. - """ - super().add_args(parser) - - def __init__(self, config=None): - super().__init__(config=config) - - bt.logging.info(f"Initializing with model {self.config.neuron.model_id}...") - - if self.config.wandb.on: - self.identity_tags = ("openai_miner",) + (self.config.neuron.model_id,) - - _ = load_dotenv(find_dotenv()) - api_key = os.environ.get("OPENAI_API_KEY") - - # Set openai key and other args - self.model = OpenAI(api_key=api_key) - - self.system_prompt = self.config.neuron.system_prompt - self.accumulated_total_tokens = 0 - self.accumulated_prompt_tokens = 0 - self.accumulated_completion_tokens = 0 - self.accumulated_total_cost = 0 - - def forward(self, synapse: StreamPromptingSynapse) -> Awaitable: - async def _forward( - self, - synapse: StreamPromptingSynapse, - init_time: float, - timeout_threshold: float, - send: Send, - ): - buffer = [] - accumulated_chunks = [] - accumulated_chunks_timings = [] - messages = [] - temp_completion = "" # for wandb logging - timeout_reached = False - - - try: - system_prompt_message = [{ 'role': 'system', 'content': self.system_prompt }] - synapse_messages = [{'role': role, 'content': message} for role, message in zip(synapse.roles, synapse.messages)] - - messages = system_prompt_message + synapse_messages - - start_time = time.time() - stream_response = self.model.chat.completions.create( - model=self.config.neuron.model_id, - messages=messages, - temperature=self.config.neuron.temperature, - max_tokens=self.config.neuron.max_tokens, - stream=True - ) - - for chunk in stream_response: - chunk_content = chunk.choices[0].delta.content - - if chunk_content is None: - bt.logging.info("OpenAI returned chunk content with None") - continue - - accumulated_chunks.append(chunk_content) - accumulated_chunks_timings.append(time.time() - start_time) - - buffer.append(chunk_content) - - if time.time() - init_time > timeout_threshold: - bt.logging.debug(f"⏰ Timeout reached, stopping streaming") - timeout_reached = True - break - - if len(buffer) == self.config.neuron.streaming_batch_size: - joined_buffer = "".join(buffer) - temp_completion += joined_buffer - bt.logging.debug(f"Streamed tokens: {joined_buffer}") - - await send( - { - "type": "http.response.body", - "body": joined_buffer.encode("utf-8"), - "more_body": True, - } - ) - buffer = [] - - if ( - buffer and not timeout_reached - ): # Don't send the last buffer of data if timeout. - joined_buffer = "".join(buffer) - await send( - { - "type": "http.response.body", - "body": joined_buffer.encode("utf-8"), - "more_body": False, - } - ) - - except Exception as e: - bt.logging.error(f"Error in forward: {e}") - bt.logging.error(print_exception(type(e), e, e.__traceback__)) - if self.config.neuron.stop_on_forward_exception: - self.should_exit = True - - finally: - synapse_latency = time.time() - init_time - if self.config.wandb.on: - self.log_event( - synapse=synapse, - timing=synapse_latency, - messages=messages, - accumulated_chunks=accumulated_chunks, - accumulated_chunks_timings = accumulated_chunks_timings, - ) - - bt.logging.debug(f"📧 Message received from {synapse.dendrite.hotkey}, IP: {synapse.dendrite.ip}; \nForwarding synapse: {synapse}") - - init_time = time.time() - timeout_threshold = synapse.timeout - - token_streamer = partial( - _forward, - self, - synapse, - init_time, - timeout_threshold, - ) - return synapse.create_streaming_response(token_streamer) diff --git a/prompting/miners/phrase.py b/prompting/miners/phrase.py deleted file mode 100644 index 5062fa64..00000000 --- a/prompting/miners/phrase.py +++ /dev/null @@ -1,68 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. -import typing -import argparse -import bittensor as bt -from functools import partial -from starlette.types import Send - -# Bittensor Miner Template: -from prompting.protocol import StreamPromptingSynapse - -# import base miner class which takes care of most of the boilerplate -from prompting.base.prompting_miner import BaseStreamPromptingMiner - - -class PhraseMiner(BaseStreamPromptingMiner): - """ - This little fella responds with whatever phrase you give it. - """ - - @classmethod - def add_args(cls, parser: argparse.ArgumentParser): - super().add_args(parser) - - parser.add_argument( - "--neuron.phrase", - type=str, - help="The phrase to use when running a phrase (test) miner.", - default="Can you please repeat that?", - ) - - def __init__(self, config=None): - super().__init__(config=config) - - def forward(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: - async def _forward(message: str, send: Send): - await send( - { - "type": "http.response.body", - "body": message, - "more_body": False, - } - ) - - token_streamer = partial(_forward, self.config.neuron.phrase) - return synapse.create_streaming_response(token_streamer) - - async def blacklist( - self, synapse: StreamPromptingSynapse - ) -> typing.Tuple[bool, str]: - return False, "All good here" - - async def priority(self, synapse: StreamPromptingSynapse) -> float: - return 1e6 diff --git a/prompting/organic/organic_scoring_prompting.py b/prompting/organic/organic_scoring_prompting.py index 034cd044..6a8f0855 100644 --- a/prompting/organic/organic_scoring_prompting.py +++ b/prompting/organic/organic_scoring_prompting.py @@ -1,78 +1,94 @@ import asyncio import json import time +from dataclasses import dataclass from functools import partial -from typing import Any, AsyncGenerator, Literal, Sequence, Tuple, Union +from typing import Any, AsyncGenerator, Callable, Optional, Sequence, Tuple, Union import bittensor as bt -import torch import numpy as np +from bittensor.dendrite import dendrite +from loguru import logger from organic_scoring import OrganicScoringBase +from organic_scoring.organic_queue import OrganicQueueBase from organic_scoring.synth_dataset import SynthDatasetBase from starlette.types import Send +from transformers import PreTrainedTokenizerFast from typing_extensions import override -from bittensor.dendrite import dendrite -from prompting.agent import HumanAgent -from prompting.base.neuron import BaseNeuron -from prompting.cleaners.cleaner import CleanerPipeline -from prompting.dendrite import DendriteResponseEvent, SynapseStreamResult -from prompting.forward import handle_response -from prompting.llms.vllm_llm import vLLM_LLM -from prompting.organic.organic_task import OrganicTask -from prompting.organic.synth_organic_task import SynthOrganicTask -from prompting.protocol import StreamPromptingSynapse -from prompting.rewards.pipeline import RewardPipeline -from prompting.rewards.reward import RewardResult -from prompting.tasks.task import make_system_prompt -from prompting.utils.logging import log_event -from prompting.utils.uids import get_random_uids, get_uids +from neurons.forward import handle_response +from prompting.base.dendrite import DendriteResponseEvent, SynapseStreamResult +from prompting.base.protocol import StreamPromptingSynapse +from prompting.llms.vllm_llm import vLLMPipeline +from prompting.organic.organic_task import OrganicRewardConfig, OrganicTask +from prompting.rewards.reward import WeightedRewardEvent +from prompting.settings import settings +from prompting.utils.logging import log_event, ValidatorOrganicEvent + +# TODO: Implement Sample dataclass for SynthDatasets, Queues, and OrganicScoringBase methods. +# Fields: "messages", "roles", "uids", "is_organic", "completions". +SAMPLE_TYPE = dict[str, Union[list[str], bool, list[int], dict[int, dict[str, Any]]]] +ORGANIC_TASK = "organic" +ORGANIC_SYNTH_TASK = "organic_synth" + + +@dataclass +class RewardResult: + rewards: list[float] + uids: list[int] + is_organic: bool + reward_events: list[WeightedRewardEvent] + penalty_events: list[WeightedRewardEvent] + response_event: DendriteResponseEvent class OrganicScoringPrompting(OrganicScoringBase): - def __init__( - self, + def __init__(self, axon: bt.axon, - synth_dataset: Union[SynthDatasetBase, Sequence[SynthDatasetBase]], - trigger_frequency: Union[float, int], - trigger: Literal["seconds", "steps"], - validator: BaseNeuron, - trigger_frequency_min: Union[float, int] = 5, - trigger_scaling_factor: Union[float, int] = 5, + synth_dataset: Optional[Union[SynthDatasetBase, Sequence[SynthDatasetBase]]], + llm_pipeline: vLLMPipeline, + tokenizer: PreTrainedTokenizerFast, + update_scores_fn: Callable[[np.ndarray, list[int]], None], + get_random_uids_fn: Callable[[], np.ndarray], + get_step_fn: Callable[[], int], + get_block_fn: Callable[[], int], + organic_queue: Optional[OrganicQueueBase] = None, ): - """Organic Scoring implementation. - - Organic scoring runs in a separate `asyncio` task and is triggered by a timer or a step counter. - - Process Workflow: - 1. Trigger Check: Upon triggering the rewarding process, the system checks if the organic queue is empty. - If the queue is empty, synthetic datasets are used to bootstrap the organic scoring mechanism. - Otherwise, samples from the organic queue are utilized. - 2. Data Processing: The sampled data is concurrently passed to the `_query_miners` and `_generate_reference` - methods. - 3. Reward Generation: After receiving responses from miners and any reference data, the information - is processed by the `_generate_rewards` method. - 4. Weight Setting: The generated rewards are then applied through the `_set_weights` method. - 5. Logging: Finally, the results can be logged using the `_log_results` method, along with all relevant data - provided as arguments, and default time elapsed on each step of rewarding process. - """ super().__init__( axon=axon, synth_dataset=synth_dataset, - trigger_frequency=trigger_frequency, - trigger=trigger, - trigger_frequency_min=trigger_frequency_min, - trigger_scaling_factor=trigger_scaling_factor, + trigger_frequency=settings.ORGANIC_TRIGGER_FREQUENCY, + trigger=settings.ORGANIC_TRIGGER, + trigger_frequency_min=settings.ORGANIC_TRIGGER_FREQUENCY_MIN, + trigger_scaling_factor=settings.ORGANIC_SCALING_FACTOR, + organic_queue=organic_queue, ) - self._val = validator - # Organic scoring reward pipeline. - self._reward_pipeline = RewardPipeline( - selected_tasks=[OrganicTask.name, SynthOrganicTask.name], - device=self._val.device, - available_tasks={ - OrganicTask.name: OrganicTask, - SynthOrganicTask.name: SynthOrganicTask, - }, + self._llm_pipeline = llm_pipeline + self._tokenizer = tokenizer + self._update_scores_fn = update_scores_fn + self._get_random_uids_fn = get_random_uids_fn + self._get_step_fn = get_step_fn + self._get_block_fn = get_block_fn + + async def _generate_rewards( + self, sample: SAMPLE_TYPE, responses: dict[str, SynapseStreamResult], reference: str + ) -> RewardResult: + stream_results = list(responses.values()) + uids = np.asarray(list(responses.keys())) + timeout = settings.ORGANIC_TIMEOUT + response_event = DendriteResponseEvent(stream_results=stream_results, uids=uids, timeout=timeout) + reward_events, penalty_events, rewards = OrganicRewardConfig.apply( + response_event=response_event, + reference=reference, + challenge=sample["messages"][-1] + ) + return RewardResult( + rewards=rewards, + uids=list(responses.keys()), + is_organic=sample.get("is_organic", False), + reward_events=reward_events, + penalty_events=penalty_events, + response_event=response_event, ) @override @@ -85,25 +101,20 @@ async def _blacklist_fn(self, synapse: StreamPromptingSynapse) -> Tuple[bool, st """Blacklist function for the axon.""" # ! DO NOT CHANGE `Tuple` return type to `tuple`, it will break the code (bittensor internal signature checks). # We expect the API to be run with one specific hotkey (e.g. OTF). - return synapse.dendrite.hotkey != self._val.config.neuron.organic_whitelist_hotkey, "" + return synapse.dendrite.hotkey != settings.ORGANIC_WHITELIST_HOTKEY, "" @override async def _on_organic_entry(self, synapse: StreamPromptingSynapse) -> StreamPromptingSynapse: """Organic query handle.""" - bt.logging.info(f"[Organic] Received from {synapse.dendrite.hotkey}, IP: {synapse.dendrite.ip}") + logger.info(f"[Organic] Received from {synapse.dendrite.hotkey}, IP: {synapse.dendrite.ip}") - uids = get_uids( - self._val, - sampling_mode=self._val.config.neuron.organic_sampling_mode, - k=self._val.config.neuron.organic_sample_size, - exclude=[], - ) - uids_list = uids.cpu().tolist() + # TODO: Query one of the top N incentive miners, keep the rest random. + uids = list(self._get_random_uids_fn()) completions: dict[int, dict] = {} token_streamer = partial( self._stream_miner_response, synapse, - uids_list, + uids, completions, ) @@ -112,13 +123,14 @@ async def _on_organic_entry(self, synapse: StreamPromptingSynapse) -> StreamProm { "roles": synapse.roles, "messages": synapse.messages, - "organic": True, + "is_organic": True, "synapse": synapse, "streaming_response": streaming_response, - "uids": uids_list, + "uids": uids, "completions": completions, } ) + logger.debug(f"Message: {synapse.messages}; Completions: {completions}") return streaming_response async def _stream_miner_response( @@ -129,18 +141,18 @@ async def _stream_miner_response( send: Send, ): """Stream back miner's responses.""" - bt.logging.info(f"[Organic] Querying miner UIDs: {uids}") + logger.info(f"[Organic] Querying miner UIDs: {uids}") try: - async with dendrite(wallet=self._val.wallet) as dend: + async with dendrite(wallet=settings.WALLET) as dend: responses = await dend( - axons=[self._val.metagraph.axons[uid] for uid in uids], + axons=[settings.METAGRAPH.axons[uid] for uid in uids], synapse=synapse, - timeout=self._val.config.neuron.organic_timeout, + timeout=settings.ORGANIC_TIMEOUT, deserialize=False, streaming=True, ) except Exception as e: - bt.logging.error(f"[Organic] Error querying dendrite: {e}") + logger.error(f"[Organic] Error querying dendrite: {e}") return async def stream_miner_chunks(uid: int, chunks: AsyncGenerator): @@ -155,7 +167,7 @@ async def stream_miner_chunks(uid: int, chunks: AsyncGenerator): if isinstance(chunk, str): accumulated_chunks.append(chunk) accumulated_chunks_timings.append(time.perf_counter() - timer_start) - json_chunk = json.dumps({"uid": uid, "chunk": chunk}) + json_chunk = json.dumps({"uid": int(uid), "chunk": chunk}) await send( { "type": "http.response.body", @@ -165,8 +177,8 @@ async def stream_miner_chunks(uid: int, chunks: AsyncGenerator): ) elif isinstance(chunk, StreamPromptingSynapse): synapse = chunk - except Exception as e: - bt.logging.error(f"[Organic] Error while streaming chunks: {e}") + except Exception: + logger.exception("[Organic] Error while streaming chunks") break # TODO: Do we need to identify the end of each miner's response? # json_chunk = json.dumps({"uid": uid, "chunk": b"", "completed": True}) @@ -177,15 +189,15 @@ async def stream_miner_chunks(uid: int, chunks: AsyncGenerator): completions[uid]["accumulated_tokens_per_chunk"] = accumulated_tokens_per_chunk completions[uid]["completed"] = True completions[uid]["synapse"] = synapse - # bt.logging.debug(f"[Organic] Streaming {uid}: {''.join(accumulated_chunks)}") + # logger.debug(f"[Organic] Streaming {uid}: {''.join(accumulated_chunks)}") - bt.logging.info(f"[Organic] Awaiting miner streams UIDs: {uids}") + logger.info(f"[Organic] Awaiting miner streams UIDs: {uids}") await asyncio.gather( *[stream_miner_chunks(uid, chunks) for uid, chunks in zip(uids, responses)], return_exceptions=True, ) - async def _reuse_organic_response(self, sample: dict[str, Any]) -> dict[int, SynapseStreamResult]: + async def _reuse_organic_response(self, sample: SAMPLE_TYPE) -> dict[int, SynapseStreamResult]: """Return a dictionary where the keys are miner UIDs and the values are their corresponding streaming responses. This method reuses miner responses for organic data. It waits for each miner to complete within the @@ -195,23 +207,17 @@ async def _reuse_organic_response(self, sample: dict[str, Any]) -> dict[int, Syn Args: sample: Dict where the keys are miner UIDs and the values are the input streaming synapses. """ - if not sample.get("organic", False): - return None - - uids_cpu = sample["uids"] + uids = sample["uids"] responses: dict[int, SynapseStreamResult] = {} - bt.logging.info(f"[Organic] Reusing miner responses for organic data, UIDs: {uids_cpu}") + logger.info(f"[Organic] Reusing miner responses for organic data, UIDs: {uids}") - async def _check_completion(sample: dict[str, Any], uid: int): + async def _check_completion(sample: SAMPLE_TYPE, uid: int): while not sample["completions"][uid]["completed"]: - await asyncio.sleep(0.1) + await asyncio.sleep(0.01) async def _wait_for_completion(uid: int): try: - await asyncio.wait_for( - _check_completion(sample, uid), - self._val.config.neuron.organic_timeout, - ) + await asyncio.wait_for(_check_completion(sample, uid), settings.ORGANIC_TIMEOUT) response = SynapseStreamResult( accumulated_chunks=sample["completions"][uid]["accumulated_chunks"], accumulated_chunks_timings=sample["completions"][uid]["accumulated_chunks_timings"], @@ -231,122 +237,108 @@ async def _wait_for_completion(uid: int): ) responses[uid] = response - await asyncio.gather(*[_wait_for_completion(uid) for uid in uids_cpu]) + await asyncio.gather(*[_wait_for_completion(uid) for uid in uids]) return responses @override - async def _query_miners(self, sample: dict[str, Any]) -> dict[str, SynapseStreamResult]: + async def _query_miners(self, sample: SAMPLE_TYPE) -> dict[int, SynapseStreamResult]: """Query miners with the given synthetic or organic sample.""" - if sample.get("organic", False) and not self._val.config.neuron.organic_reuse_response_disabled: + if sample.get("is_organic", False) and not settings.ORGANIC_REUSE_RESPONSE_DISABLED: responses = await self._reuse_organic_response(sample) return responses # Get the list of uids to query. - uids = get_random_uids(self._val, k=self._val.config.neuron.organic_sample_size, exclude=None).to( - self._val.device - ) - uids_cpu = uids.cpu().tolist() - bt.logging.info(f"[Organic] Querying miners with synthetic data, UIDs: {uids_cpu}") - streams_responses = await self._val.dendrite.forward( - axons=[self._val.metagraph.axons[uid] for uid in uids_cpu], - synapse=StreamPromptingSynapse(roles=sample["roles"], messages=sample["messages"]), - timeout=self._val.config.neuron.organic_timeout, - deserialize=False, - streaming=True, - ) - stream_results_dict = dict(zip(uids_cpu, streams_responses)) - responses = await handle_response(stream_results_dict, self._val.llm_pipeline.tokenizer) - return dict(zip(uids_cpu, responses)) + uids = self._get_random_uids_fn() + logger.info(f"[Organic] Querying miners with synthetic data, UIDs: {uids}") - @override - async def _generate_rewards( - self, - sample: dict[str, Any], - responses: dict[str, Any], - reference: dict[str, Any], - ) -> dict[str, Any]: - """Generate rewards for the given sample, responses, and reference.""" - assert reference is not None - if sample.get("organic", False): - task = OrganicTask(context=sample, reference=reference) - else: - task = SynthOrganicTask(context=sample, reference=reference) - stream_results = list(responses.values()) - uids_list = list(responses.keys()) - uids = torch.tensor(uids_list) - timeout = self._val.config.neuron.organic_timeout - response_event = DendriteResponseEvent(stream_results=stream_results, uids=uids, timeout=timeout) - - bt.logging.debug(f"[Organic] Miner stream results: {stream_results}") - - # Dummy HumanAgent used to reuse existing reward pipeline. - agent = HumanAgent( - task=task, - llm_pipeline=self._val.llm_pipeline, - begin_conversation=True, - system_prompt=make_system_prompt(), - ) - reward_result = RewardResult( - self._reward_pipeline, - agent=agent, - response_event=response_event, - device=self._val.device, - ) - bt.logging.info(f"[Organic] RewardResult: {reward_result}") - return {"reward": reward_result, "uids": uids_list, "agent": agent, "organic": sample.get("organic", False)} + async with dendrite(wallet=settings.WALLET) as dend: + streams_responses = await dend( + axons=[settings.METAGRAPH.axons[uid] for uid in uids], + synapse=StreamPromptingSynapse(roles=sample["roles"], messages=sample["messages"]), + timeout=settings.ORGANIC_TIMEOUT, + deserialize=False, + streaming=True, + ) + stream_results_dict = dict(zip(uids, streams_responses)) + responses = await handle_response(stream_results_dict, tokenizer=self._tokenizer) + return dict(zip(uids, responses)) @override - async def _set_weights(self, reward: dict[str, Any]): + async def _set_weights(self, reward_result: RewardResult): """Set weights based on the given reward.""" - uids = reward["uids"] - reward_result = reward["reward"] - if not reward.get("organic", False): - reward_result.rewards *= self._val.config.neuron.organic_synth_reward_scale - - uids_to_reward = dict(zip(uids, reward_result.rewards)) - bt.logging.info(f"[Organic] Rewards for miner's UIDs: {uids_to_reward}") - bt.logging.info(f"[Organic] Weight setting disabled: {self._val.config.neuron.organic_disable_set_weights}") - if not self._val.config.neuron.organic_disable_set_weights: - self._val.update_scores(reward_result.rewards, uids) - # Sync is not needed as it's done in the benchmarks loop. - # self._val.sync() + if not reward_result.is_organic: + reward_result.rewards *= settings.ORGANIC_SYNTH_REWARD_SCALE + + self._update_scores_fn(reward_result.rewards, reward_result.uids) @override + async def _generate_reference(self, sample: SAMPLE_TYPE) -> str: + """Generate reference for the given organic or synthetic sample.""" + reference = await OrganicTask.generate_reference(sample["messages"], sample["roles"], self._llm_pipeline) + return reference + async def _log_results( self, logs: dict[str, Any], - reference: str, - responses: dict[int, SynapseStreamResult], - rewards: dict[str, Any], + reference: Any, + responses: dict[str, Any], + rewards: RewardResult, sample: dict[str, Any], *args, **kwargs, - ): - logs["block"] = self._val.block - logs["step"] = self._val.step - # Length of messages is incremented by 2 every step: query and response. - logs["turn"] = len(sample["messages"]) // 2 - logs["uids"] = rewards["uids"] - completions_len: list[int] = [len(response.synapse.completion) for response in responses.values()] - logs["organic_response_mean_chars"] = np.mean(completions_len) - logs["organic_response_std_chars"] = np.std(completions_len) - logs["organic_reference_chars"] = len(reference) - logs.update(rewards["reward"].__state_dict__(full=self._val.config.neuron.log_full)) - log_event(self._val, logs) + ) -> dict[str, Any]: + """Log the results of the organic scoring iteration. - return logs + Args: + logs: The logs to record. Default values in the dict: + - "organic_time_sample": Time taken in seconds to sample the organic queue or synthetic dataset; + - "organic_time_responses": Time taken in seconds to query the miners and generate reference; + - "organic_time_rewards": Time taken in seconds to generate rewards; + - "organic_time_weights": Time taken in seconds to set the weights; + - "organic_time_total": Total time taken in seconds for the iteration; + - "organic_queue_len": Current length of the organic queue; + - "is_organic_sample": If the sample is from the organic queue. + reference: The reference data. + responses: The responses from the miners. + rewards: The generated rewards. + sample: The sample used. - @override - async def _generate_reference(self, sample: dict[str, Any]) -> str: - """Generate reference for the given organic or synthetic sample.""" - async with self._val.lock: - reference = vLLM_LLM( - self._val.llm_pipeline, - system_prompt=make_system_prompt(), - max_new_tokens=self._val.config.neuron.organic_reference_max_tokens, - ).query_conversation( - messages=sample["messages"], - roles=sample["roles"], - cleaner=CleanerPipeline(cleaning_pipeline=[]), - ) - return reference + Returns: + dict[str, Any]: The logs recorded. + """ + # Create W&B logs for organic event. + challenge = sample["messages"][-1] + task_name = ORGANIC_SYNTH_TASK + + if sample.get("is_organic", False): + # Clean all conversations for user organic prompts. + rewards.response_event.stream_results = [None for _ in rewards.response_event.stream_results] + chunks = rewards.response_event.stream_results_all_chunks + rewards.response_event.stream_results_all_chunks = [None for _ in chunks] + reference = "" + challenge = "" + task_name = ORGANIC_TASK + + event = ValidatorOrganicEvent( + best="", + block=self._get_block_fn(), + step=self._get_step_fn(), + step_time=logs.get("organic_time_total"), + reward_events=rewards.reward_events, + penalty_events=rewards.penalty_events, + reference=reference, + challenge=challenge, + task=task_name, + rewards=rewards.rewards, + response_event=rewards.response_event, + + organic_turn=len(sample["messages"]) // 2, + organic_time_sample=logs.get("organic_time_sample"), + organic_time_responses=logs.get("organic_time_responses"), + organic_time_rewards=logs.get("organic_time_rewards"), + organic_time_weights=logs.get("organic_time_weights"), + organic_queue_size=self._organic_queue.size, + ) + + log_event(event) + return logs diff --git a/prompting/organic/organic_task.py b/prompting/organic/organic_task.py index e8faee47..03257b0e 100644 --- a/prompting/organic/organic_task.py +++ b/prompting/organic/organic_task.py @@ -1,44 +1,39 @@ -from dataclasses import dataclass - -from prompting.tasks import Task - - -@dataclass -class OrganicTask(Task): - """Task with defined reward and penalty mechanisms for organic prompts.""" - - name = "organic" - # Use challenge as a query. - challenge_type = "query" - - reward_definition = [ - dict(name="relevance", weight=0.8), - dict(name="rouge", ngram="rouge-1", metric="f", weight=0.2), +from prompting.tasks.base_task import BaseTask +from prompting.rewards.reward import BaseRewardConfig, WeightedRewardModel +from prompting.rewards.rouge import RougeRewardModel +from prompting.rewards.relevance import RelevanceRewardModel +from prompting.utils.cleaners import CleanerPipeline +from prompting.llms.vllm_llm import vLLM_LLM +from prompting.llms.base_llm import BasePipeline +from prompting.settings import settings +from prompting.tasks.base_task import CHATTENSOR_SYSTEM_PROMPT +from typing import ClassVar, Any + + +class OrganicRewardConfig(BaseRewardConfig): + reward_definitions: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=0.5, reward_model=RougeRewardModel()), + WeightedRewardModel(weight=0.5, reward_model=RelevanceRewardModel()), ] - - penalty_definition = [ - dict(name="relevance", weight=0.5), + penalty_definition: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=0.5, reward_model=RougeRewardModel()) ] - cleaning_pipeline = [] - - def __init__(self, context: dict, reference: str): - self.context = context - self.messages = context["messages"] - self.roles = context["roles"] - self.query = context["messages"][-1] - self.topic = "Organic" - self.reference = reference - self.subtopic = "" - self.tags = [""] - def __str__(self): - return f"{self.__class__.__name__}(name={self.name!r}, query={self.query!r}, reference={self.reference!r})" - - def __repr__(self): - return str(self) +class OrganicTask(BaseTask): + """Task with defined reward and penalty mechanisms for organic prompts.""" - def __state_dict__(self, full=False): - # Disable any logs for organic queries. - state = {} - return state + cleaning_pipeline: ClassVar[CleanerPipeline] = CleanerPipeline() + + @classmethod + async def generate_reference(cls, messages: list[str], roles: list[str], pipeline: BasePipeline) -> str: + """Generate reference for the given organic or synthetic sample.""" + reference = vLLM_LLM( + llm_pipeline=pipeline, + system_prompt=CHATTENSOR_SYSTEM_PROMPT(), + max_new_tokens=settings.ORGANIC_REFERENCE_MAX_TOKENS, + ).query_conversation( + messages=messages, + roles=roles, + ) + return cls.cleaning_pipeline.apply(reference) diff --git a/prompting/organic/synth_organic_task.py b/prompting/organic/synth_organic_task.py index a3085802..85104442 100644 --- a/prompting/organic/synth_organic_task.py +++ b/prompting/organic/synth_organic_task.py @@ -1,6 +1,9 @@ from dataclasses import dataclass from prompting.organic.organic_task import OrganicTask +from prompting.rewards.rouge import RougeRewardModel +from prompting.rewards.relevance import RelevanceRewardModel +from prompting.rewards.reward import WeightedRewardModel @dataclass @@ -8,14 +11,12 @@ class SynthOrganicTask(OrganicTask): """Task with defined reward and penalty mechanisms for synthetic organic prompts.""" name = "synthetic-organic" - - reward_definition = [ - dict(name="relevance", weight=0.8), - dict(name="rouge", ngram="rouge-1", metric="f", weight=0.2), + reward_definitions: list[WeightedRewardModel] = [ + WeightedRewardModel(weight=0.5, reward_model=RougeRewardModel()), + WeightedRewardModel(weight=0.5, reward_model=RelevanceRewardModel()), ] - - penalty_definition = [ - dict(name="relevance", weight=0.5), + penalty_definition: list[WeightedRewardModel] = [ + WeightedRewardModel(weight=0.5, reward_model=RelevanceRewardModel()) ] cleaning_pipeline = [] diff --git a/prompting/persona.py b/prompting/persona.py deleted file mode 100644 index 2c624fed..00000000 --- a/prompting/persona.py +++ /dev/null @@ -1,55 +0,0 @@ -import random -from dataclasses import dataclass - - -@dataclass -class Persona: - profile: str - mood: str - tone: str - - -def create_persona() -> Persona: - """Defines the persona of the user. This is used to create the system prompt. It dictates the style of the agent's questions and communication.""" - profiles = [ - "student", - "teacher", - "parent", - "hacker", - "programmer", - "scientist", - ] - # profiles = ["16 year old highschool student", ... - - # TODO: more terse, less verbose - mood = [ - "an interested", - "a concerned", - "an impatient", - "a tired", - "a confused", - "an annoyed", - "a curious", - "an upbeat", - "a lazy", - ] - tone = [ - "formal", - "informal", - "indifferent", - "casual", - "rushed", - "polite", - "impolite", - "friendly", - "unfriendly", - "positive", - "negative", - ] - # TODO: we can lower case the human messages, add common grammar and spelling mistakes... - - return Persona( - profile=random.choice(profiles), - mood=random.choice(mood), - tone=random.choice(tone), - ) diff --git a/prompting/rewards/__init__.py b/prompting/rewards/__init__.py index a44b50bf..e69de29b 100644 --- a/prompting/rewards/__init__.py +++ b/prompting/rewards/__init__.py @@ -1,15 +0,0 @@ -from .reward import ( - BaseRewardModel, - RewardResult, - RewardEvent, - BatchRewardOutput, - RewardModelTypeEnum, -) -from .code_diff import DiffRewardModel -from .relevance import RelevanceRewardModel -from .rouge import RougeRewardModel -from .float_diff import FloatDiffModel -from .date import DateRewardModel -from .ordinal import OrdinalRewardModel -from .streaming import StreamingRewardModel -from .pipeline import RewardPipeline, REWARD_MODELS diff --git a/prompting/rewards/code_diff.py b/prompting/rewards/code_diff.py deleted file mode 100644 index df9e55cf..00000000 --- a/prompting/rewards/code_diff.py +++ /dev/null @@ -1,56 +0,0 @@ -import difflib -import torch -from typing import List -from prompting.rewards import ( - BaseRewardModel, - BatchRewardOutput, - RewardModelTypeEnum, -) -from prompting.dendrite import DendriteResponseEvent -import time - - -class DiffRewardModel(BaseRewardModel): - @property - def name(self) -> str: - return "diff" - - def __init__(self, lines=False, threshold=None, **kwargs): - super().__init__() - self.lines = lines - self.threshold = threshold - - def unified_diff(self, reference, completion): - return len( - difflib.unified_diff(reference.splitlines(), completion.splitlines()) - ) - - def seq_match(self, reference, completion): - return difflib.SequenceMatcher(None, reference, completion).ratio() - - def reward(self, reference: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: - """Get the score between two strings. - lines: If True, return a unified diff. If False, return a ratio. - """ - rewards = [] - timings = [] - completions: List[str] = response_event.completions - - if self.lines: - for completion in completions: - t0 = time.time() - rewards.append(self.unified_diff(reference, completion)) - timings.append(time.time() - t0) - else: - for completion in completions: - t0 = time.time() - rewards.append(self.seq_match(reference, completion)) - timings.append(time.time() - t0) - - output = BatchRewardOutput( - rewards=torch.FloatTensor(rewards), - timings=torch.FloatTensor(timings), - extra_info={"threshold": self.threshold, "lines": self.lines}, - ) - - return output diff --git a/prompting/rewards/date.py b/prompting/rewards/date.py index d2df2842..04881e6b 100644 --- a/prompting/rewards/date.py +++ b/prompting/rewards/date.py @@ -1,12 +1,10 @@ import time -import torch import re import pandas as pd import numpy as np from typing import List -from prompting.rewards import BaseRewardModel, BatchRewardOutput, RewardModelTypeEnum -from prompting.dendrite import DendriteResponseEvent -import bittensor as bt +from prompting.rewards.reward import BaseRewardModel, BatchRewardOutput +from prompting.base.dendrite import DendriteResponseEvent class DateRewardModel(BaseRewardModel): @@ -26,10 +24,13 @@ def date_diff(self, ref_date: tuple, comp_date: tuple) -> int: return DATE_NOT_FOUND_CODE # Check if ref date is just a year if ref_date.isdigit(): - # Extract the last 3-4 digits from the completion date using a regex pattern that would detect 3 or 4 digit years - comp_year = re.findall(r'\b\d{3,4}\b', comp_date) + # Extract the last 3-4 digits from the completion date using a regex pattern that would detect 3 or 4 digit years + comp_year = re.findall(r"\b\d{3,4}\b", comp_date) + # Extract the last 3-4 digits from the completion date using a regex pattern that would detect 3 or 4 digit years + comp_year = re.findall(r"\b\d{3,4}\b", comp_date) if comp_year: - return abs(int(ref_date) - int(comp_year[0]))*365 + return abs(int(ref_date) - int(comp_year[0])) * 365 + return abs(int(ref_date) - int(comp_year[0])) * 365 else: return DATE_NOT_FOUND_CODE # If the reference date is not only a year, take the difference between the two dates @@ -37,7 +38,7 @@ def date_diff(self, ref_date: tuple, comp_date: tuple) -> int: ref_date = pd.to_datetime(ref_date) comp_date = pd.to_datetime(comp_date) return abs((ref_date - comp_date).days) - except: + except Exception as _: if ref_date == comp_date: return 0 else: @@ -45,13 +46,15 @@ def date_diff(self, ref_date: tuple, comp_date: tuple) -> int: def parse_dates_from_text(self, text: str) -> tuple: # Regular expression to find dates in various formats - date_pattern = r'\b\d{1,2}[-/]\d{1,2}[-/]\d{2,4}\b|\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?(?:,)?\s+\d{4}\b|\b\d{1,2}\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember))\s+\d{4}\b|\b\d{4}\b' + date_pattern = r"\b\d{1,2}[-/]\d{1,2}[-/]\d{2,4}\b|\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?(?:,)?\s+\d{4}\b|\b\d{1,2}\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember))\s+\d{4}\b|\b\d{4}\b" + date_pattern = r"\b\d{1,2}[-/]\d{1,2}[-/]\d{2,4}\b|\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?(?:,)?\s+\d{4}\b|\b\d{1,2}\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember))\s+\d{4}\b|\b\d{4}\b" # Compile the regex pattern date_regex = re.compile(date_pattern) # Split text into sentences - sentences = re.split(r'(? Batch rewards.append(reward) output = BatchRewardOutput( - rewards=torch.FloatTensor(rewards), - timings=torch.FloatTensor(timings), - extra_info={ - "type": "date", - }, + rewards=np.array(rewards), + timings=np.array(timings), ) return output diff --git a/prompting/rewards/float_diff.py b/prompting/rewards/float_diff.py index 387c2a8a..df8bab61 100644 --- a/prompting/rewards/float_diff.py +++ b/prompting/rewards/float_diff.py @@ -1,9 +1,10 @@ import time -import torch +import numpy as np from typing import List from sympy.parsing.sympy_parser import parse_expr -from prompting.rewards import BaseRewardModel, BatchRewardOutput, RewardModelTypeEnum -from prompting.dendrite import DendriteResponseEvent +from prompting.rewards.reward import BaseRewardModel, BatchRewardOutput +from prompting.base.dendrite import DendriteResponseEvent + class FloatDiffModel(BaseRewardModel): @property @@ -65,10 +66,7 @@ def reward(self, reference: str, response_event: DendriteResponseEvent) -> Batch rewards.append(reward) output = BatchRewardOutput( - rewards=torch.FloatTensor(rewards), - timings=torch.FloatTensor(timings), - extra_info={ - "type": "math", - }, + rewards=np.array(rewards), + timings=np.array(timings), ) return output diff --git a/prompting/rewards/multi_choice.py b/prompting/rewards/multi_choice.py new file mode 100644 index 00000000..44b1a13d --- /dev/null +++ b/prompting/rewards/multi_choice.py @@ -0,0 +1,49 @@ +import re +import time + +import numpy as np + +from prompting.base.dendrite import DendriteResponseEvent +from prompting.rewards.reward import BaseRewardModel, BatchRewardOutput + + +class MultiChoiceRewardModel(BaseRewardModel): + choices: tuple[str, str, str, str] = ("A", "B", "C", "D") + + @property + def name(self) -> str: + return "multiple_choice" + + def reward(self, reference: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: + """Compute difference scores given a completion and reference pair.""" + rewards = [] + timings = [] + classes = self.choices + completions: list[str] = response_event.completions + + for completion in completions: + t0 = time.perf_counter() + # Step through the words in the completion and check if the reference is in the completion. + # Remove any punctuation too. + matches = [ + word + for word in re.sub(r"\W", " ", completion).split() + if word in classes + ] + + # Take the last match as the answer + if matches: + reward = matches[-1] == reference + else: + reward = 0 + timings.append(time.perf_counter() - t0) + rewards.append(reward) + + output = BatchRewardOutput( + rewards=np.asarray(rewards), + timings=np.asarray(timings), + # extra_info={ + # "type": self.name, + # }, + ) + return output diff --git a/prompting/rewards/ordinal.py b/prompting/rewards/ordinal.py deleted file mode 100644 index bf2801a7..00000000 --- a/prompting/rewards/ordinal.py +++ /dev/null @@ -1,47 +0,0 @@ -import time -import torch -from typing import List -from prompting.rewards import BaseRewardModel, BatchRewardOutput -from prompting.dendrite import DendriteResponseEvent - -class OrdinalRewardModel(BaseRewardModel): - @property - def name(self) -> str: - return "ordinal" - - def __init__(self, **kwargs): - super().__init__() - #TODO: Expand to allow for more than 3 classes (Must also adjust dataset/review.py) - self.sentiments = [ - "positive", - "neutral", - "negative", - ] - - def reward(self, reference: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: - """Compute difference scores given a completion and reference pair.""" - rewards = [] - timings = [] - classes = self.sentiments - completions: List[str] = response_event.completions - - for completion in completions: - t0 = time.time() - completion = completion.lower() - # Check if exactly one answer can be found in the completion - if sum(option in completion for option in classes) == 1: - answer = [option for option in classes if option in completion][0] - reward = 1-abs(classes.index(reference) - classes.index(answer))/(len(classes)-1) - else: - reward = 0 - timings.append(time.time() - t0) - rewards.append(reward) - - output = BatchRewardOutput( - rewards=torch.FloatTensor(rewards), - timings=torch.FloatTensor(timings), - extra_info={ - "type": "ordinal", - }, - ) - return output diff --git a/prompting/rewards/pipeline.py b/prompting/rewards/pipeline.py deleted file mode 100644 index 27419e5e..00000000 --- a/prompting/rewards/pipeline.py +++ /dev/null @@ -1,118 +0,0 @@ -from typing import Type, Optional -from prompting.tasks import TASKS -from prompting.rewards import ( - BaseRewardModel, - RougeRewardModel, - DiffRewardModel, - RelevanceRewardModel, - FloatDiffModel, - DateRewardModel, - OrdinalRewardModel, - StreamingRewardModel -) -from prompting.tasks.task import Task - -REWARD_MODELS = { - "rouge": RougeRewardModel, - "relevance": RelevanceRewardModel, - "diff": DiffRewardModel, - "float_diff": FloatDiffModel, - "date": DateRewardModel, - "ordinal": OrdinalRewardModel, - "streaming": StreamingRewardModel, -} - - -class RewardPipeline: - def __init__(self, selected_tasks: list[str], device, available_tasks: Optional[dict[str, Type[Task]]] = None): - self.available_tasks = available_tasks - if self.available_tasks is None: - self.available_tasks = TASKS - self.selected_tasks = selected_tasks - self.device = device - self.validate_tasks() - self.load_reward_pipeline() - - def __getitem__(self, __key: str) -> BaseRewardModel: - return self.reward_models.get(__key) - - def get(self, __key: str) -> BaseRewardModel: - return self.reward_models.get(__key) - - def __repr__(self): - return f"RewardPipeline({self.reward_models})" - - def validate_tasks(self): - for task in self.selected_tasks: - if task not in self.available_tasks: - raise ValueError( - f"Task {task} not supported. Please choose from {self.available_tasks.keys()}" - ) - # Check that the reward_definition and penalty_definition are lists of dictionaries whose weights sum to one - self._check_weights(task, "reward_definition", expected_weight=1) - self._check_weights(task, "penalty_definition", expected_weight=None) - - def _check_weights(self, task, definition, expected_weight): - total_weight = 0 - - model_infos = getattr(self.available_tasks[task], definition) - - for model_info in model_infos: - if not isinstance(model_info, dict): - raise ValueError( - f"{definition} model {model_info} is not a dictionary." - ) - if "weight" not in model_info: - raise ValueError( - f"{definition} model {model_info} does not have a weight." - ) - - weight = model_info["weight"] - if not isinstance(weight, (float, int)): - raise ValueError( - f"{definition} model {model_info} weight is not a float." - ) - if not 0 <= weight <= 1: - raise ValueError( - f"{definition} model {model_info} weight is not between 0 and 1." - ) - - total_weight += weight - - if ( - model_infos - and expected_weight is not None - and total_weight != expected_weight - ): - raise ValueError( - f"{definition} model {model_infos} weights do not sum to {expected_weight} (sum={total_weight})" - ) - - def load_reward_pipeline(self): - """Dynamically loads the reward models required by the selected tasks so that we only use the necessary resources.""" - active_reward_models = [] - - for task in self.selected_tasks: - active_reward_models += self.available_tasks[task].reward_definition - active_reward_models += self.available_tasks[task].penalty_definition - active_reward_models += self.available_tasks[task].global_penalty_definition - - # Instantiate only the required reward models - reward_models = {} - for model in active_reward_models: - name = model.get("name") - if not name: - raise ValueError(f"Reward model {model} does not have a name. ") - if name not in REWARD_MODELS: - raise ValueError( - f"Reward model {name} not supported. Please choose from {REWARD_MODELS.keys()}" - ) - elif name in reward_models: # Prevents duplicate reward models - continue - - cls = REWARD_MODELS[name] - - params = {k: v for k, v in model.items() if k not in ["name", "weight"]} - reward_models[name] = cls(device=self.device, **params) - - self.reward_models = reward_models diff --git a/prompting/rewards/relevance.py b/prompting/rewards/relevance.py index e063a582..b4632a5a 100644 --- a/prompting/rewards/relevance.py +++ b/prompting/rewards/relevance.py @@ -1,65 +1,61 @@ import time -import torch +import numpy as np from typing import List from angle_emb import AnglE -from torch.nn.functional import cosine_similarity -from prompting.rewards import ( +from prompting.rewards.reward import ( BaseRewardModel, BatchRewardOutput, ) -from prompting.dendrite import DendriteResponseEvent +from prompting.base.dendrite import DendriteResponseEvent +from pydantic import model_validator, ConfigDict +from scipy import spatial +from prompting.settings import settings +MODEL = AnglE.from_pretrained("WhereIsAI/UAE-Large-V1", pooling_strategy="cls", device=settings.NEURON_DEVICE) +if settings.NEURON_DEVICE.startswith("cuda"): + # This line is necessary to pass the model to the device defined at its initialization + MODEL = MODEL.cuda() class RelevanceRewardModel(BaseRewardModel): - @property - def name(self) -> str: - return "relevance" + threshold: float | None = None + model_config = ConfigDict(arbitrary_types_allowed=True) + model: AnglE | None = None - def __init__(self, threshold=None, device=None, pooling_strategy="cls"): - super().__init__() - self.threshold = threshold - self.model = AnglE.from_pretrained( - "WhereIsAI/UAE-Large-V1", pooling_strategy=pooling_strategy, device=device - ) - if device.startswith("cuda"): - # This line is necessary to pass the model to the device defined at its initialization - self.model = self.model.cuda() + @model_validator(mode="after") + def init_model(self) -> "RelevanceRewardModel": + self.model = MODEL + return self def reward(self, reference: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: """Calculates the cosine similarity between sentence embeddings of the reference and completions. We subtract a baseline score which is what an empty string would get (a failed completion). This is usually around 0.35 We also clip the rewards between 0 and 1. The maximum effective score is around 0.65 """ - reference_embedding = self.model.encode(reference, to_numpy=False) + reference_embedding = self.model.encode(reference, to_numpy=True) rewards = [] timings = [] completions: List[str] = response_event.completions # baseline is the cosine similarity between the reference and an empty string - baseline = cosine_similarity( - reference_embedding.reshape(1, -1), - self.model.encode("", to_numpy=False).reshape(1, -1), + baseline = 1 - float( + spatial.distance.cosine(reference_embedding.flatten(), self.model.encode("", to_numpy=True).flatten()) ) for comp in completions: t0 = time.time() - emb = self.model.encode(comp, to_numpy=False) + emb = self.model.encode(comp, to_numpy=True) # Calculate cosine similarity between reference and completion embeddings, and subtract baseline - score = ( - cosine_similarity( - reference_embedding.reshape(1, -1), emb.reshape(1, -1) - ) - - baseline - ) + score = spatial.distance.cosine(reference_embedding.flatten(), emb.flatten()) - baseline + score = 1 - float(spatial.distance.cosine(reference_embedding.flatten(), emb.flatten() - baseline)) rewards.append(score) timings.append(time.time() - t0) output = BatchRewardOutput( - rewards=torch.FloatTensor(rewards).clip(min=0, max=1), - timings=torch.FloatTensor(timings), - extra_info={"threshold": self.threshold}, + rewards=np.clip(np.array(rewards), 0, 1), + timings=np.array(timings), + threshold=self.threshold, ) return output diff --git a/prompting/rewards/reward.py b/prompting/rewards/reward.py index d51ce4c7..dec683c4 100644 --- a/prompting/rewards/reward.py +++ b/prompting/rewards/reward.py @@ -1,177 +1,148 @@ -import torch +import numpy as np import time -import bittensor as bt -from typing import List +from typing import Literal, ClassVar from abc import ABC, abstractmethod -from dataclasses import dataclass -from enum import Enum -from prompting.dendrite import DendriteResponseEvent +from prompting.base.dendrite import DendriteResponseEvent +from pydantic import BaseModel, ConfigDict -class RewardModelTypeEnum(Enum): - WEIGHTED_REWARD = "reward" - FILTER_REWARD = "filter" - PENALTY = "penalty" +RewardTypeLiteral = Literal["reward", "penalty"] -@dataclass -class RewardEvent: +class RewardEvent(BaseModel): """Contains rewards for all the responses in a batch""" - model_name: str - rewards: torch.FloatTensor - rewards_normalized: torch.FloatTensor - timings: torch.FloatTensor - model_type: RewardModelTypeEnum + reward_model_name: str + rewards: np.ndarray + rewards_normalized: np.ndarray + timings: np.ndarray + reward_model_type: RewardTypeLiteral batch_time: float - extra_info: dict + threshold: float | None = None + model_config = ConfigDict(arbitrary_types_allowed=True) # implement custom asdict to return a dict with the same keys as the dataclass using the model name def asdict(self) -> dict: return { - f"{self.model_name}_raw_{self.model_type.value}": self.tensor_to_rounded_list(self.rewards), - f"{self.model_name}_{self.model_type.value}": self.tensor_to_rounded_list(self.rewards_normalized, 4), - f"{self.model_name}_{self.model_type.value}_timings": self.tensor_to_rounded_list(self.timings), - f"{self.model_name}_{self.model_type.value}_batch_time": self.batch_time, - f"{self.model_name}_{self.model_type.value}_extra_info": self.extra_info, + f"{self.reward_model_name}_raw_{self.model_type.value}": self.tensor_to_rounded_list(self.rewards), + f"{self.reward_model_name}_{self.model_type.value}": self.tensor_to_rounded_list(self.rewards_normalized, 4), + f"{self.reward_model_name}_{self.model_type.value}_timings": self.tensor_to_rounded_list(self.timings), + f"{self.reward_model_name}_{self.model_type.value}_batch_time": self.batch_time, + f"{self.reward_model_name}_{self.model_type.value}_threshold": self.threshold, } - + def tensor_to_rounded_list(self, tensor, decimals=6): # Convert the tensor elements to floats and round them to 6 decimal places return [round(float(element), decimals) for element in tensor] -class RewardResult: - def __init__(self, reward_pipeline, agent, response_event, device): - """Passes the responses through the reward models and calculates the total reward - - Args: - reward_pipeline (RewardPipeline): List of all loaded/ative reward models - task (Task): Task instance which contains reward_definition (list of reward model requirements) and a reference answer (str) - response_event (DendriteResponseEvent): Network responses to the prompt - device (str): Device to run the reward models on - """ - - self.reward_pipeline = reward_pipeline - self.response_event = response_event - self.device = device - self.task_rewards = agent.task.reward_definition - self.task_penalties = agent.task.penalty_definition + agent.task.global_penalty_definition - self.reward_events = self.reward_responses( - reference=agent.task.reference, - models=self.task_rewards, - reward_type=RewardModelTypeEnum.WEIGHTED_REWARD, - ) - self.penalty_events = self.reward_responses( - reference=agent.challenge, - models=self.task_penalties, - reward_type=RewardModelTypeEnum.PENALTY, - ) - self.rewards = self.total_reward() - - def __state_dict__(self, full=False): - state = {"rewards": self.rewards.tolist()} - for event in self.reward_events + self.penalty_events: - state.update(event.asdict()) - return state - - def reward_responses( - self, reference: str, models: List[dict], reward_type: RewardModelTypeEnum - ) -> List[RewardEvent]: - """Calculates the rewards for the responses given the task and returns a RewardEvent for each reward model - reward_events: List[RewardEvent] = [ - RewardEvent(model_name='rouge', rewards=torch.zeros(50), timings=torch.zeros(50), ...), - RewardEvent(model_name='relevance', rewards=torch.zeros(50), timings=torch.zeros(50), ...), - ] - """ - reward_events = [] +class BatchRewardOutput(BaseModel): + rewards: np.ndarray + timings: np.ndarray + threshold: float | None = None + model_config = ConfigDict(arbitrary_types_allowed=True) - for reward_info in models: - # Select the reward model from preloaded reward model pipeline - reward_model = self.reward_pipeline.get(reward_info["name"]) - if not reward_model: - raise ValueError( - f"Reward model {reward_info['name']} not supported. Please choose from {self.reward_pipeline.keys()}" - ) - # Compute the rewards for the responses given the prompt - reward_event = reward_model.apply( - reference, self.response_event, reward_type=reward_type - ) - reward_events.append(reward_event) + @property + def rewards_normalized(self) -> np.ndarray: + if self.rewards.shape != self.timings.shape: + raise ValueError(f"rewards.shape {self.rewards.shape} != timings.shape {self.timings.shape}") + return (self.rewards - self.rewards.min()) / (self.rewards.max() - self.rewards.min() + 1e-6) - return reward_events - def total_reward(self) -> torch.FloatTensor: - """Combines the rewards from all the reward models into a single reward tensor""" +class BaseRewardModel(ABC, BaseModel): + @abstractmethod + def reward(self, reference: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: + pass - # TODO: How would using the Agent as a reward model fit into this flow? - # Compute the rewards for the responses given the prompt - rewards = torch.zeros_like( - self.response_event.uids, dtype=torch.float32, device=self.device + def apply( + self, + response_event: DendriteResponseEvent, + reference: str | None = None, + challenge: str | None = None, + reward_type: Literal["reward", "penalty"] = "reward", + ) -> RewardEvent: + t0 = time.time() + comparator = reference if reward_type == "reward" else challenge + batch_rewards_output: BatchRewardOutput = self.reward(comparator, response_event) + batch_rewards_time = time.time() - t0 + + return RewardEvent( + reward_model_name=self.__class__.__name__, + rewards=batch_rewards_output.rewards, + rewards_normalized=batch_rewards_output.rewards_normalized, + reward_model_type=reward_type, + batch_time=batch_rewards_time, + threshold=batch_rewards_output.threshold, + timings=batch_rewards_output.timings, ) - for event in self.reward_events: - for reward_info in filter( - lambda x: x["name"] == event.model_name, self.task_rewards - ): - rewards += reward_info["weight"] * event.rewards.to(self.device) - for event in self.penalty_events: - for reward_info in filter( - lambda x: x["name"] == event.model_name, self.task_penalties - ): - rewards *= 1 - reward_info["weight"] * event.rewards.to(self.device) +class WeightedRewardModel(BaseModel): + weight: float + reward_model: BaseRewardModel - return rewards - def __str__(self): - return f"{self.__class__.__name__}(rewards={self.rewards!r}, reward_events={self.reward_events!r}, penalty_events={self.penalty_events!r})" +class WeightedRewardEvent(BaseModel): + weight: float + reward_event: RewardEvent -@dataclass -class BatchRewardOutput: - rewards: torch.FloatTensor - timings: torch.FloatTensor - extra_info: dict +class BaseRewardConfig(ABC, BaseModel): + """This class takes in a dictionary of rewards and penalties that should be applied. On apply(), + it then applies all the reward models based on query & reference and returns the reward. - def __post_init__(self): - if self.rewards.shape != self.timings.shape: - raise ValueError( - f"rewards.shape {self.rewards.shape} != timings.shape {self.timings.shape}" - ) + both reward_definition and penalty_definition must be a list of tuples of type: - self.rewards_normalized = (self.rewards - self.rewards.min()) / ( - self.rewards.max() - self.rewards.min() + 1e-6 - ) + weighting: RewardModel, e.g. + [ (0.2, RougeRewardModel), (0.8, CosineDistanceRewardModel) ] -class BaseRewardModel(ABC): - @property - @abstractmethod - def name(self) -> str: - ... + Note that for all the rewards, the percentages must sum up to 1 (100%). For penalties, + this is not the case, e.g. you may want to only apply a single penalty very lightly + and weight it with <1. + """ - @abstractmethod - def __init__(self, **kwargs): - pass + reward_definitions: ClassVar[list[WeightedRewardModel]] + penalty_definitions: ClassVar[list[WeightedRewardModel]] = [] - @abstractmethod - def reward(self, reference: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: - pass + @classmethod + def sum_rewards(cls, reward_events: list[WeightedRewardEvent]) -> np.ndarray: + if not reward_events: + return 0 + return np.sum([r.reward_event.rewards * r.weight for r in reward_events], axis=0) - def apply(self, reference: str, response_event: DendriteResponseEvent, reward_type: RewardModelTypeEnum) -> RewardEvent: - t0 = time.time() - batch_rewards_output = self.reward(reference, response_event) - batch_rewards_time = time.time() - t0 + @classmethod + def final_rewards( + cls, reward_events: list[WeightedRewardEvent], penalty_events: list[WeightedRewardEvent] + ) -> list[float]: + total_rewards = cls.sum_rewards(reward_events) - cls.sum_rewards(penalty_events) + return np.clip(total_rewards, 0, 1) - return RewardEvent( - model_name=self.name, - rewards=batch_rewards_output.rewards, - rewards_normalized=batch_rewards_output.rewards_normalized, - model_type=reward_type, - batch_time=batch_rewards_time, - extra_info=batch_rewards_output.extra_info, - timings=batch_rewards_output.timings, - ) + @classmethod + def apply( + cls, response_event: DendriteResponseEvent, reference: str, challenge: str | None = None + ) -> tuple[list[WeightedRewardEvent], list[WeightedRewardEvent], list[float]]: + reward_events = [] + for weighted_reward in cls.reward_definitions: + reward_events.append( + WeightedRewardEvent( + weight=weighted_reward.weight, + reward_event=weighted_reward.reward_model.apply( + reference=reference, response_event=response_event, challenge=challenge, reward_type="reward" + ), + ) + ) - def __repr__(self): - return f"{self.__class__.__name__}(name={self.name})" + if cls.penalty_definitions and not challenge: + raise Exception("You must be providing the challenge to apply penalties") + + penalty_events = [] + for weighted_reward in cls.penalty_definitions: + penalty_events.append( + WeightedRewardEvent( + weight=weighted_reward.weight, + reward_event=weighted_reward.reward_model.apply( + reference=challenge, response_event=response_event, reward_type="penalty" + ), + ) + ) + return reward_events, penalty_events, cls.final_rewards(reward_events, penalty_events) diff --git a/prompting/rewards/rouge.py b/prompting/rewards/rouge.py index cd56bec0..49f090f1 100644 --- a/prompting/rewards/rouge.py +++ b/prompting/rewards/rouge.py @@ -1,32 +1,27 @@ import time -import torch +import numpy as np from typing import List from rouge import Rouge -from prompting.rewards import ( +from prompting.rewards.reward import ( BaseRewardModel, BatchRewardOutput, ) -from prompting.dendrite import DendriteResponseEvent +from prompting.base.dendrite import DendriteResponseEvent +from pydantic import ConfigDict class RougeRewardModel(BaseRewardModel): - @property - def name(self) -> str: - return "rouge" - - def __init__(self, ngram="rouge-l", metric="f", avg=False, device=None, **kwargs): - super().__init__() - self.ngram = ngram - self.metric = metric - self.avg = avg - self.rouge = Rouge(**kwargs) + ngram: str = "rouge-l" # TODO: Make proper literal + metric: str = "f" # TODO: Make proper literal + avg: bool = False + rouge: Rouge = Rouge() + name: str = "rouge" + model_config = ConfigDict(arbitrary_types_allowed=True) def rouge_score(self, reference, completion): if not completion or not reference: return 0.0 - return self.rouge.get_scores(reference, completion, avg=self.avg)[0][ - self.ngram - ][self.metric] + return self.rouge.get_scores(reference, completion, avg=self.avg)[0][self.ngram][self.metric] def reward(self, reference: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: """Compute ROUGE scores given a completion and reference pair.""" @@ -40,13 +35,8 @@ def reward(self, reference: str, response_event: DendriteResponseEvent) -> Batch timings.append(time.time() - t0) output = BatchRewardOutput( - rewards=torch.FloatTensor(rewards), - timings=torch.FloatTensor(timings), - extra_info={ - "ngram": self.ngram, - "metric": self.metric, - "avg": self.avg, - }, + rewards=np.array(rewards), + timings=np.array(timings), ) return output diff --git a/prompting/rewards/streaming.py b/prompting/rewards/streaming.py index f6443915..2a2272c7 100644 --- a/prompting/rewards/streaming.py +++ b/prompting/rewards/streaming.py @@ -1,48 +1,48 @@ import time -import torch -from prompting.dendrite import DendriteResponseEvent -from prompting.rewards import ( +import numpy as np +from prompting.base.dendrite import DendriteResponseEvent +from prompting.rewards.reward import ( BaseRewardModel, BatchRewardOutput, ) + class StreamingRewardModel(BaseRewardModel): + max_tokens_per_chunk: int + @property def name(self) -> str: return "streaming" - def __init__(self, max_tokens_per_chunk:int, **kwargs): + def __init__(self, max_tokens_per_chunk: int, **kwargs): super().__init__() self.max_tokens_per_chunk = max_tokens_per_chunk - def reward(self, _: str, response_event: DendriteResponseEvent) -> BatchRewardOutput: - """Compute difference scores given a completion and reference pair.""" + """Compute difference scores given a completion and reference pair.""" + """Compute difference scores given a completion and reference pair.""" rewards = [] timings = [] penalty_per_exceeding_chunk = 0.25 - + # Iterate through each chunk of response tokens - for response_tokens_per_chunks in response_event.stream_results_all_tokens_per_chunk: + for response_tokens_per_chunks in response_event.stream_results_all_tokens_per_chunk: start_time = time.time() - + # Calculate the accumulated penalty for the current chunk accumulated_penalty = sum( - penalty_per_exceeding_chunk if tokens_per_chunk > self.max_tokens_per_chunk else 0 + penalty_per_exceeding_chunk if tokens_per_chunk > self.max_tokens_per_chunk else 0 for tokens_per_chunk in response_tokens_per_chunks ) - + # Record the timing for this computation timings.append(time.time() - start_time) - + # Calculate the reward and ensure it does not go above 1 rewards.append(min(accumulated_penalty, 1)) - + # Create the output object with rewards, timings, and extra information output = BatchRewardOutput( - rewards=torch.FloatTensor(rewards), - timings=torch.FloatTensor(timings), - extra_info={"type": "streaming"} + rewards=np.array(rewards), timings=np.array(timings), extra_info={"type": "streaming"} ) return output - diff --git a/prompting/settings.py b/prompting/settings.py new file mode 100644 index 00000000..a845e2f3 --- /dev/null +++ b/prompting/settings.py @@ -0,0 +1,166 @@ +import os +import torch +import dotenv +from loguru import logger +import bittensor as bt +from pydantic import BaseModel, model_validator, ConfigDict +from typing import Literal, Optional +from prompting.utils.config import config + +# TODO: Remove in future as we deprecate config +bt_config = config() +logger.info(f"Config: {bt_config}") + + +class Settings(BaseModel): + mode: Literal["miner", "validator"] + MOCK: bool = False + NO_BACKGROUND_THREAD: bool = True + + # WANDB + WANDB_ON: bool = True + WANDB_ENTITY: Optional[str] = None + WANDB_PROJECT_NAME: Optional[str] = None + WANDB_RUN_STEP_LENGTH: int = 100 + WANDB_API_KEY: Optional[str] = None + WANDB_OFFLINE: bool = False + WANDB_NOTES: str = "" + SAVE_PATH: str | None = None + + # NEURON + NEURON_EPOCH_LENGTH: int = 1 + NEURON_DEVICE: str = "cuda" if torch.cuda.is_available() else "cpu" + NEURON_GPUS: int = 1 + + # LOGGING + LOGGING_DONT_SAVE_EVENTS: bool = False + LOG_WEIGHTS: bool = False + + # NEURON PARAMETERS + NEURON_TIMEOUT: int = 15 + NEURON_DISABLE_SET_WEIGHTS: bool = False + NEURON_MOVING_AVERAGE_ALPHA: float = 0.1 + NEURON_DECAY_ALPHA: float = 0.001 + NEURON_AXON_OFF: bool = False + NEURON_VPERMIT_TAO_LIMIT: int = 4096 + NEURON_QUERY_UNIQUE_COLDKEYS: bool = False + NEURON_QUERY_UNIQUE_IPS: bool = False + NEURON_FORWARD_MAX_TIME: int = 120 + NEURON_MAX_TOKENS: int = 256 + + # ORGANIC + ORGANIC_TIMEOUT: int = 15 + ORGANIC_SAMPLE_SIZE: int = 5 + ORGANIC_REUSE_RESPONSE_DISABLED: bool = False + ORGANIC_REFERENCE_MAX_TOKENS: int = 1024 + ORGANIC_SYNTH_REWARD_SCALE: float = 1.0 + ORGANIC_SET_WEIGHTS_ENABLED: bool = True + ORGANIC_DISABLED: bool = False + ORGANIC_TRIGGER_FREQUENCY: int = 120 + ORGANIC_TRIGGER_FREQUENCY_MIN: int = 5 + ORGANIC_TRIGGER: str = "seconds" + ORGANIC_SCALING_FACTOR: int = 1 + HF_TOKEN: Optional[str] = None + + # ADDITIONAL FIELDS FROM model_validator + NETUID: int + TEST: bool + OPENAI_API_KEY: Optional[str] = None + WALLET_NAME: Optional[str] = None + HOTKEY: Optional[str] = None + AXON_PORT: int + ORGANIC_WHITELIST_HOTKEY: Optional[str] = None + TEST_MINER_IDS: Optional[list[int]] = None + SUBTENSOR_NETWORK: Optional[str] = None + WALLET: bt.wallet + SUBTENSOR: bt.subtensor + METAGRAPH: bt.metagraph + NEURON_LLM_MAX_ALLOWED_MEMORY_IN_GB: int + LLM_MAX_MODEL_LEN: int + NEURON_MODEL_ID_VALIDATOR: str + + model_config = ConfigDict(frozen=True, arbitrary_types_allowed=True) # freeze all variables + + @model_validator(mode="before") + def load_env(values): + mode = values.get("mode") + if mode == "miner": + values["WANDB_ON"] = False + if not dotenv.load_dotenv(dotenv.find_dotenv(filename=".env.miner")): + logger.warning( + "No .env.miner file found. The use of args when running a miner will be deprecated in the near future." + ) + else: + if not dotenv.load_dotenv(dotenv.find_dotenv(filename=".env.validator")): + logger.warning( + "No .env.validator file found. The use of args when running a validator will be deprecated in the near future." + ) + + bt_config = config() # Re-fetch config as it might depend on .env values + + values["WANDB_ENTITY"] = os.environ.get("WANDB_ENTITY", "macrocosmos") + values["WANDB_PROJECT_NAME"] = os.environ.get("WANDB_PROJECT_NAME", "prompting-validators") + values["WANDB_API_KEY"] = os.environ.get("WANDB_API_KEY") + + values["NETUID"] = bt_config.netuid or int(os.environ.get("NETUID")) + values["TEST"] = values["NETUID"] != 1 + values["OPENAI_API_KEY"] = os.environ.get("OPENAI_API_KEY") + values["WALLET_NAME"] = bt_config.wallet.name or os.environ.get("WALLET_NAME") + values["HOTKEY"] = bt_config.wallet.hotkey or os.environ.get("HOTKEY") + values["NEURON_DISABLE_SET_WEIGHTS"] = os.environ.get("NEURON_DISABLE_SET_WEIGHTS", False) + + values["AXON_PORT"] = bt_config.axon.port or int(os.environ.get("AXON_PORT")) + values["HF_TOKEN"] = os.environ.get("HF_TOKEN") + values["ORGANIC_WHITELIST_HOTKEY"] = os.environ.get( + "ORGANIC_WHITELIST_HOTKEY", + # OTF hotkey. + "5F4tQyWrhfGVcNhoqeiNsR6KjD4wMZ2kfhLj4oHYuyHbZAc3", + ) + values["ORGANIC_TIMEOUT"] = os.environ.get("ORGANIC_TIMEOUT", 15) + values["ORGANIC_SAMPLE_SIZE"] = os.environ.get("ORGANIC_SAMPLE_SIZE", 5) + values["ORGANIC_REUSE_RESPONSE_DISABLED"] = os.environ.get("ORGANIC_REUSE_RESPONSE_DISABLED", False) + values["ORGANIC_REFERENCE_MAX_TOKENS"] = os.environ.get("ORGANIC_REFERENCE_MAX_TOKENS", 1024) + # TODO: Set to 0.1 when task-isolated rewards are implemented. + values["ORGANIC_SYNTH_REWARD_SCALE"] = os.environ.get("ORGANIC_SYNTH_REWARD_SCALE", 1.0) + values["ORGANIC_SET_WEIGHTS_ENABLED"] = os.environ.get("ORGANIC_SET_WEIGHTS_ENABLED", True) + values["ORGANIC_DISABLED"] = os.environ.get("ORGANIC_DISABLED", False) + values["ORGANIC_TRIGGER_FREQUENCY"] = os.environ.get("ORGANIC_TRIGGER_FREQUENCY", 120) + values["ORGANIC_TRIGGER_FREQUENCY_MIN"] = os.environ.get("ORGANIC_TRIGGER_FREQUENCY_MIN", 5) + values["ORGANIC_TRIGGER"] = os.environ.get("ORGANIC_TRIGGER", "seconds") + values["ORGANIC_SCALING_FACTOR"] = os.environ.get("ORGANIC_SCALING_FACTOR", 1) + + values["LOG_WEIGHTS"] = os.environ.get("LOG_WEIGHTS", False) + if values["TEST"] and os.environ.get("TEST_MINER_IDS"): + values["TEST_MINER_IDS"] = [int(miner_id) for miner_id in os.environ.get("TEST_MINER_IDS").split(",")] + values["NEURON_MODEL_ID_VALIDATOR"] = os.environ.get("LLM_MODEL", "hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4") + values["LLM_MAX_MODEL_LEN"] = int(os.environ.get("LLM_MAX_MODEL_LEN", 4096)) + values["NEURON_LLM_MAX_ALLOWED_MEMORY_IN_GB"] = os.environ.get("MAX_ALLOWED_VRAM_GB", 62) + values["NEURON_GPUS"] = os.environ.get("NEURON_GPUS", 1) + + if os.environ.get("SUBTENSOR_NETWORK") == "local": + values["SUBTENSOR_NETWORK"] = bt_config.subtensor.chain_endpoint or os.environ.get( + "SUBTENSOR_CHAIN_ENDPOINT" + ) + else: + values["SUBTENSOR_NETWORK"] = bt_config.subtensor.network or os.environ.get("SUBTENSOR_NETWORK") + + logger.info( + f"Instantiating bittensor objects with NETUID: {values['NETUID']}, WALLET_NAME: {values['WALLET_NAME']}, HOTKEY: {values['HOTKEY']}" + ) + values["WALLET"] = bt.wallet(name=values["WALLET_NAME"], hotkey=values["HOTKEY"]) + values["SUBTENSOR"] = bt.subtensor(network=values["SUBTENSOR_NETWORK"]) + values["METAGRAPH"] = bt.metagraph( + netuid=values["NETUID"], network=values["SUBTENSOR_NETWORK"], sync=True, lite=True + ) + + logger.info( + f"Bittensor objects instantiated... WALLET: {values['WALLET']}, SUBTENSOR: {values['SUBTENSOR']}, METAGRAPH: {values['METAGRAPH']}" + ) + values["SAVE_PATH"] = os.environ.get("SAVE_PATH") or "./storage" + if not os.path.exists(values["SAVE_PATH"]): + os.makedirs(values["SAVE_PATH"]) + + return values + + +settings: Settings diff --git a/prompting/shared/__init__.py b/prompting/shared/__init__.py deleted file mode 100644 index 79503d91..00000000 --- a/prompting/shared/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .context import Context \ No newline at end of file diff --git a/prompting/shared/context.py b/prompting/shared/context.py deleted file mode 100644 index a9918c72..00000000 --- a/prompting/shared/context.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import List -from dataclasses import dataclass - - -@dataclass -class Context: - # TODO: Pydantic model - title: str - topic: str - subtopic: str - content: str - internal_links: List[str] - external_links: List[str] - source: str - tags: List[str] = None - extra: dict = None # additional non-essential information - stats: dict = None # retrieval stats such as fetch time, number of tries, etc. diff --git a/prompting/task_registry.py b/prompting/task_registry.py deleted file mode 100644 index f111a29d..00000000 --- a/prompting/task_registry.py +++ /dev/null @@ -1,23 +0,0 @@ -from .tasks import Task, MockTask, SummarizationTask, QuestionAnsweringTask, DebuggingTask, MathTask, DateQuestionAnsweringTask, GenericInstructionTask, SentimentAnalysisTask, TranslationTask -from .tools import MockDataset, WikiDataset, HFCodingDataset, StackOverflowDataset, MathDataset, WikiDateDataset, GenericInstructionDataset, ReviewDataset - -# TODO: Expand this to include extra information beyond just the task and dataset names -summarization_task, summarization_dataset = SummarizationTask.name, [WikiDataset.name] -qa_task, qa_dataset = QuestionAnsweringTask.name, [WikiDataset.name] -#debugging_task, debugging_dataset = DebuggingTask.name, [HFCodingDataset.name] -math_task, math_dataset = MathTask.name, [MathDataset.name] -date_qa_task, date_qa_dataset = DateQuestionAnsweringTask.name, [WikiDateDataset.name] -generic_instruction_task, generic_instruction_dataset = GenericInstructionTask.name, [GenericInstructionDataset.name] -translation_task, translation_dataset = TranslationTask.name, [WikiDataset.name] -sentiment_analysis_task, sentiment_analysis_dataset = SentimentAnalysisTask.name, [ReviewDataset.name] - -TASK_REGISTRY = { - summarization_task: summarization_dataset, - qa_task: qa_dataset, - #debugging_task: debugging_dataset, - math_task: math_dataset, - date_qa_task: date_qa_dataset, - generic_instruction_task: generic_instruction_dataset, - translation_task: translation_dataset, - sentiment_analysis_task: sentiment_analysis_dataset, -} \ No newline at end of file diff --git a/prompting/tasks/__init__.py b/prompting/tasks/__init__.py index 6794c97c..e69de29b 100644 --- a/prompting/tasks/__init__.py +++ b/prompting/tasks/__init__.py @@ -1,21 +0,0 @@ -from .task import Task -from .debugging import DebuggingTask -from .summarization import SummarizationTask -from .qa import QuestionAnsweringTask -from .date_qa import DateQuestionAnsweringTask -from .generic_instruction import GenericInstructionTask -from .math import MathTask -from .translate import TranslationTask, TranslationPipeline -from .mock import MockTask -from .sentiment import SentimentAnalysisTask - -TASKS = { - QuestionAnsweringTask.name: QuestionAnsweringTask, - DateQuestionAnsweringTask.name: DateQuestionAnsweringTask, - SummarizationTask.name: SummarizationTask, - #DebuggingTask.name: DebuggingTask, - GenericInstructionTask.name: GenericInstructionTask, - MathTask.name: MathTask, - TranslationTask.name: TranslationTask, - SentimentAnalysisTask.name: SentimentAnalysisTask, -} diff --git a/prompting/tasks/base_task.py b/prompting/tasks/base_task.py new file mode 100644 index 00000000..ed0d1865 --- /dev/null +++ b/prompting/tasks/base_task.py @@ -0,0 +1,77 @@ +import time +from loguru import logger +from abc import ABC +from pydantic import BaseModel +from prompting.llms.base_llm import BasePipeline +from prompting.llms.vllm_llm import vLLM_LLM +from prompting.utils.cleaners import CleanerPipeline +from typing import ClassVar +from prompting.datasets.base import Context +from abc import abstractmethod +from prompting.settings import settings + + +def CHATTENSOR_SYSTEM_PROMPT(): + return f""" + The assistant is Chattensor, created by Macrocosmos. The current date is {time.strftime("%B %d, %Y")}. + Chattensor is a distributed intelligence, powered by Bittensor. It is a hivemind composed of 1000 highly + skilled and specialized LLMs working together to provide the best possible answers to human queries. Within Chattenor, + each LLM has access to the internet, APIs and tools to ensure that responses are current and factually accurate. + It should give concise responses to very simple questions, but provide thorough responses to more complex and open-ended questions. + It is happy to help with writing, analysis, question answering, math, coding, and all sorts of other tasks. + It uses markdown for coding. Where applicable, Chattensor will include references to credible sources to support its answers. + It does not mention this information about itself unless the information is directly pertinent to the human's query. + """ + + +class BaseTask(ABC, BaseModel): + context: dict + augment: bool = False + + query: str | None = None + + query_system_prompt: ClassVar[str | None] = None + reference_system_prompt: ClassVar[str | None] = None + augmentation_system_prompt: ClassVar[str | None] = None + + cleaner: ClassVar[CleanerPipeline] = CleanerPipeline() + + @abstractmethod + def generate_query_reference(llm_pipeline: BasePipeline, context: Context, **kwargs) -> [str, str]: + raise NotImplementedError("Method generate_query_reference must be implemented") + + @classmethod + def generate_reference(cls, llm_pipeline: BasePipeline, messages: list[str]) -> str: + """Generates a reference answer to be used for scoring miner completions""" + logger.info("🤖 Generating reference...") + reference = vLLM_LLM(llm_pipeline, system_prompt=cls.reference_system_prompt or "").query( + cleaner=cls.cleaner, message=messages + ) + return reference + + @classmethod + def generate_query( + cls, + message: str, + llm_pipeline: BasePipeline, + ) -> str: + """Generates a query to be used for generating the challenge""" + logger.info("🤖 Generating query...") + query = vLLM_LLM(llm_pipeline, system_prompt=cls.query_system_prompt or "").query(message=message) + return cls.augment_query(query, llm_pipeline) + + @classmethod + def augment_query( + cls, + query: str, + llm_pipeline: BasePipeline, + ) -> str: + """Creates the opening question of the conversation which is based on the task query but dressed in the persona of the user.""" + if not cls.augmentation_system_prompt: + return query + challenge = vLLM_LLM( + llm_pipeline=llm_pipeline, + max_new_tokens=settings.NEURON_MAX_TOKENS, + system_prompt=cls.augmentation_system_prompt, + ).query(message=query) + return challenge diff --git a/prompting/tasks/challenge_templates/__init__.py b/prompting/tasks/challenge_templates/__init__.py deleted file mode 100644 index d92a2749..00000000 --- a/prompting/tasks/challenge_templates/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .base import ChallengeTemplate -from .math import MathChallengeTemplate -from .sentiment import SentimentChallengeTemplate diff --git a/prompting/tasks/challenge_templates/base.py b/prompting/tasks/challenge_templates/base.py deleted file mode 100644 index dff133a1..00000000 --- a/prompting/tasks/challenge_templates/base.py +++ /dev/null @@ -1,17 +0,0 @@ -import random -from abc import ABC -from typing import List - - -class ChallengeTemplate(ABC): - templates: List[str] = ["This is a template with {query}! "] - fields: dict = {"query": ["This is a placeholder for the query"]} - - def next(self, query: str): - self.fields["query"] = [query] - return self.get_template().format( - **{field: random.choice(entries) for field, entries in self.fields.items()} - ).split("")[0] - - def get_template(self): - return random.choice(self.templates) diff --git a/prompting/tasks/challenge_templates/math.py b/prompting/tasks/challenge_templates/math.py deleted file mode 100644 index 8902568f..00000000 --- a/prompting/tasks/challenge_templates/math.py +++ /dev/null @@ -1,191 +0,0 @@ -import random -from .base import ChallengeTemplate - - -class MathChallengeTemplate(ChallengeTemplate): - def __init__(self): - super().__init__() - self.templates = [ - "{greeting}{greeting_punctuation}{query}{whitespace}{request}", - "{query}{greeting}{greeting_punctuation}{request}{whitespace}", - "{greeting}{greeting_punctuation}{query}{request}{whitespace}", - "{query}{whitespace}{request}{greeting}{greeting_punctuation}", - ] - self.fields = { - "greeting": [ - "Hello", - "Hi", - "Hey", - "Yo", - "What's up", - "Howdy", - "Hola", - "Bonjour", - "G'day", - "Good morning", - "Good afternoon", - "Good evening", - "Greetings", - "Sup", - "Hi there", - "Hey there", - "Morning", - "Afternoon", - "Evening", - "Salutations", - "Hey, what's going on", - "Howdy", - "Sup", - "Sup yo", - "Yo", - "Yo yo", - "Greetings", - "Greetings to you", - "Hello", - "Hello friend", - "Hello to you", - "Hey", - "Hey there", - "", - ], - "greeting_punctuation": [ - "!", - "! ", - "! ", - "!\n", - ",", - ", ", - ", ", - ",\n", - ".", - ". ", - ". ", - ".\n", - "", - " ", - " ", - "\n", - "...", - "... ", - "... ", - "...\n", - "", - ], - "request": [ - "Can you assist me, please?", - "Could you lend me a hand?", - "Would you mind helping me out?", - "I could use some assistance.", - "Do you have a moment to help me?", - "I'm in need of some help.", - "Could you give me a hand with this?", - "Would you be willing to help me?", - "Can you offer me some guidance?", - "I'm struggling a bit, could you help?", - "I could really use your expertise.", - "Would you mind showing me how to do this?", - "Can you lend me your expertise for a moment?", - "I'm having trouble, could you assist?", - "Would you be able to lend me a hand?", - "Can you offer me some assistance?", - "I'm stuck, could you help me out?", - "Could you assist me with this problem?", - "Would you be so kind as to help me?", - "Can you offer me some help, please?", - "Solve", - "Could you spare a moment to help me?", - "Would you mind giving me some assistance?", - "Can you help me understand this better?", - "I need your help with something.", - "Could you offer me some support, please?", - "Would you be willing to give me a hand?", - "Can you show me how to do this?", - "I'm having difficulty, could you help me?", - "Could you assist me with this issue?", - "Would you mind helping me with this task?", - "Can you provide some help, please?", - "I'm in a bit of a bind, could you help?", - "Could you lend me a hand with this problem?", - "Would you be able to offer me some guidance?", - "Can you help me out with this, please?", - "I'm having trouble understanding, could you help?", - "Could you offer me some assistance, please?", - "Would you mind assisting me with this?", - "Can you give me some advice?", - "I could use your help with this.", - "Could you spare some time to help me?", - "Would you be willing to lend me a hand?", - "Can you help me solve this problem?", - "I'm struggling to figure this out, could you help?", - "Could you provide me with some assistance?", - "Would you mind showing me what to do?", - "Can you assist me in resolving this issue?", - "I could really use your help.", - "Could you help me out with this task?", - "Would you be so kind as to give me a hand?", - "Can you help me with this problem, please?", - "I'm stuck on this, could you assist?", - "Could you lend me a hand with this, please?", - "Would you be able to provide me with some guidance?", - "Can you offer me some assistance with this?", - "I'm having difficulty understanding, could you help me?", - "Could you assist me with this problem, please?", - "Would you mind giving me a hand with this?", - "Can you show me how to do this, please?", - "I'm struggling with this, could you help me out?", - "Could you offer me some help with this?", - "Would you be willing to help me with this, please?", - "Can you provide me with some support, please?", - "I'm in a bit of a bind, could you assist me?", - "Could you lend me your expertise?", - "Would you be able to spare a moment to help me?", - "Can you help me out with this problem, please?", - "I'm having trouble with this, could you help me out?", - "Could you assist me with this task, please?", - "Would you mind offering me some assistance?", - "Can you assist me with this issue, please?", - "I could use some assistance with this, could you help?", - "Could you give me a hand with this issue, please?", - "Would you be so kind as to lend me a hand?", - "Can you provide me with some assistance on this?", - "I'm having difficulty with this task, could you help?", - "Could you offer me some help on this, please?", - "Would you mind helping me with this problem?", - "Can you lend me a hand with this, please?", - "I'm stuck on this problem, could you help?", - "Could you show me how to do this, please?", - "Would you be willing to assist me with this?", - "Can you help me with this task, please?", - "I'm struggling with this problem, could you assist?", - "Could you give me some guidance on this, please?", - "Would you mind giving me some help with this?", - "Can you help me with this issue, please?", - "I could use your help with this problem.", - "Could you spare some time to help me out?", - "Would you be able to lend me your expertise?", - "Can you offer me some assistance with this problem?", - "I'm in need of some help with this, could you assist?", - "Could you assist me with this problem, please?", - "Can you help me out with this issue, please?", - "I'm having trouble with this task, could you help?", - "Could you lend me a hand with this problem, please?", - "Would you be willing to give me some assistance?", - "Can you provide me with some help, please?", - "I'm stuck on this issue, could you help me?", - "Could you show me what to do, please?", - "Would you mind helping me with this task, please?", - "Can you lend me your expertise for a moment, please?", - "I'm struggling with this issue, could you assist me?", - "Could you give me a hand with this problem, please?", - "Would you be so kind as to offer me some assistance?", - "Can you help me understand this, please?", - "I could use your help figuring this out.", - ], - "whitespace": [ - "", - " ", - " ", - "\n", - "\n\n", - ] - } diff --git a/prompting/tasks/challenge_templates/sentiment.py b/prompting/tasks/challenge_templates/sentiment.py deleted file mode 100644 index e715a8d3..00000000 --- a/prompting/tasks/challenge_templates/sentiment.py +++ /dev/null @@ -1,186 +0,0 @@ -import random -from .base import ChallengeTemplate - - -class SentimentChallengeTemplate(ChallengeTemplate): - def __init__(self): - super().__init__() - self.templates = [ - "{greeting}{greeting_punctuation}{request}{whitespace}{query}", - "{request}{whitespace}{query}{greeting}{greeting_punctuation}", - ] - self.fields = { - "greeting": [ - "Hello", - "Hi", - "Hey", - "Yo", - "What's up", - "Howdy", - "Hola", - "Bonjour", - "G'day", - "Good morning", - "Good afternoon", - "Good evening", - "Greetings", - "Sup", - "Hi there", - "Hey there", - "Morning", - "Afternoon", - "Evening", - "Salutations", - "Hey, what's going on", - "Howdy", - "Sup", - "Sup yo", - "Yo", - "Yo yo", - "Greetings", - "Greetings to you", - "Hello", - "Hello friend", - "Hello to you", - "Hey", - "Hey there", - "", - ], - "greeting_punctuation": [ - "!", - "! ", - "! ", - "!\n", - ",", - ", ", - ", ", - ",\n", - ".", - ". ", - ". ", - ".\n", - "", - " ", - " ", - "\n", - "...", - "... ", - "... ", - "...\n", - "", - ], - "request": [ - "Please analyze the sentiment of this review.", - "I'd like to know the sentiment of this text.", - "Can you determine the sentiment of this review?", - "Analyze the sentiment of this review, please.", - "Evaluate the sentiment of this text.", - "What's the sentiment of this review?", - "I'm curious about the sentiment of this text.", - "Please provide the sentiment analysis for this review.", - "Could you analyze the sentiment of this text?", - "Assess the sentiment of this review.", - "I'd like the sentiment of this text analyzed.", - "Can you determine the sentiment of this text?", - "Analyze this review's sentiment, please.", - "What's the sentiment of this text?", - "I'm interested in the sentiment analysis of this review.", - "Please evaluate the sentiment of this text.", - "Could you provide the sentiment analysis for this review?", - "Determine the sentiment of this text.", - "I'd appreciate it if you could analyze the sentiment of this review.", - "Can you analyze the sentiment of this text?", - "Please assess the sentiment of this review.", - "What's the sentiment of this review, please?", - "I'm curious about the sentiment of this review.", - "Could you analyze the sentiment of this review, please?", - "Provide the sentiment analysis for this text.", - "Evaluate this review's sentiment.", - "What's the sentiment of this review?", - "Can you analyze the sentiment of this review?", - "Please assess the sentiment of this text.", - "Could you provide the sentiment analysis of this review?", - "Analyze this text's sentiment, please.", - "I'd like to know the sentiment of this review.", - "Determine the sentiment of this review, please.", - "Analyze the sentiment of this text, please.", - "Can you evaluate the sentiment of this review?", - "What's the sentiment of this text, please?", - "I'm interested in the sentiment analysis of this text.", - "Please analyze the sentiment of this review text.", - "Assess this text's sentiment, please.", - "Provide the sentiment analysis for this text.", - "Evaluate this text's sentiment, please.", - "What's the sentiment of this text?", - "Can you determine the sentiment of this text, please?", - "I'd like to know the sentiment of this review text.", - "Determine the sentiment of this text, please.", - "Analyze this review text's sentiment.", - "Please assess the sentiment of this text, please.", - "I'm curious about the sentiment of this text.", - "Could you analyze the sentiment of this review text, please?", - "Provide the sentiment analysis of this text.", - "Evaluate the sentiment of this review text, please.", - "What's the sentiment of this review text, please?", - "Can you evaluate the sentiment of this review text?", - "I'm interested in the sentiment analysis of this review text.", - "Please analyze the sentiment of this review text.", - "Assess this review text's sentiment, please.", - "Determine the sentiment of this review text.", - "Analyze the sentiment of this review text, please.", - "What's the sentiment of this review text?", - "Can you determine the sentiment of this review text, please?", - "I'd like to know the sentiment of this text, please.", - "Determine the sentiment of this text, please.", - "Analyze this text's sentiment.", - "Please assess the sentiment of this text, please.", - "I'm curious about the sentiment of this text.", - "Could you analyze the sentiment of this text, please?", - "Provide the sentiment analysis of this text.", - "Evaluate the sentiment of this text, please.", - "What's the sentiment of this text, please?", - "Can you evaluate the sentiment of this text?", - "I'm interested in the sentiment analysis of this text.", - "Please analyze the sentiment of this text.", - "Assess this text's sentiment, please.", - "Determine the sentiment of this text.", - "Analyze the sentiment of this text, please.", - "What's the sentiment of this text?", - "Can you determine the sentiment of this text, please?", - "I'd like to know the sentiment of this text, please.", - "Determine the sentiment of this text, please.", - "Analyze this text's sentiment.", - "Please assess the sentiment of this text, please.", - "I'm curious about the sentiment of this text.", - "Could you analyze the sentiment of this text, please?", - "Provide the sentiment analysis of this text.", - "Evaluate the sentiment of this text, please.", - "What's the sentiment of this text, please?", - "Can you evaluate the sentiment of this text?", - "I'm interested in the sentiment analysis of this text.", - "Please analyze the sentiment of this text.", - "Assess this text's sentiment, please.", - "Determine the sentiment of this text.", - "Analyze the sentiment of this text, please.", - "What's the sentiment of this text?", - "Can you determine the sentiment of this text, please?", - "I'd like to know the sentiment of this text, please.", - "Determine the sentiment of this text, please.", - "Analyze this text's sentiment.", - "Please assess the sentiment of this text, please.", - "I'm curious about the sentiment of this text.", - "Could you analyze the sentiment of this text, please?", - "Provide the sentiment analysis of this text.", - "Evaluate the sentiment of this text, please.", - "What's the sentiment of this text, please?", - "Can you evaluate the sentiment of this text?", - "I'm interested in the sentiment analysis of this text.", - ], - "whitespace": [ - "", - " ", - " ", - "\n", - "\n\n", - ] - } diff --git a/prompting/tasks/date_qa.py b/prompting/tasks/date_qa.py index e4a25336..e189e489 100644 --- a/prompting/tasks/date_qa.py +++ b/prompting/tasks/date_qa.py @@ -1,49 +1,54 @@ -from dataclasses import dataclass -from prompting.tasks import Task -from prompting.cleaners.cleaner import CleanerPipeline +from typing import ClassVar + +from prompting.rewards.rouge import RougeRewardModel +from prompting.rewards.date import DateRewardModel +from prompting.tasks.base_task import BaseTask +from prompting.llms.base_llm import BasePipeline +from prompting.utils.cleaners import RemoveTags, FirstQuestion, CleanerPipeline +from prompting.datasets.wiki import DateContext +from prompting.rewards.reward import BaseRewardConfig, WeightedRewardModel +from typing import ClassVar + +from prompting.rewards.rouge import RougeRewardModel +from prompting.rewards.date import DateRewardModel +from prompting.tasks.base_task import BaseTask +from prompting.llms.base_llm import BasePipeline +from prompting.utils.cleaners import RemoveTags, FirstQuestion, CleanerPipeline +from prompting.datasets.wiki import DateContext +from prompting.rewards.reward import BaseRewardConfig, WeightedRewardModel QUERY_SYSTEM_PROMPT = """You are a question creation expert. When asked to create a question, you use the context to make a specific question that would have the answer . Your question should contain the topic.""" QUERY_PROMPT_TEMPLATE = """\ Create a question about {topic} that would have as the answer using the following context: -topic: {topic} -context: {context} +context: {content} """ REFERENCE_PROMPT_TEMPLATE = """\ Your answer must include the following date: {date}. -Answer the following question using the provided context. +Answer the following question using the provided context. Question: {query} -Context: {context} +Context: {content} """ -@dataclass -class DateQuestionAnsweringTask(Task): - name = "date_qa" - challenge_type = 'query' - clean_reference = False - desc = "get help answering a specific date-based question" - goal = "to get the answer to the following date-based question" - reward_definition = [ - dict(name="date", weight=0.7), - dict(name="rouge", weight=0.3), - ] - penalty_definition = [] - cleaning_pipeline = [ - #dict(name="remove_quotes"), - #dict(name="remove_roles"), - dict(name="remove_tags"), - dict(name="first_question"), + +class DateQARewardConfig(BaseRewardConfig): + reward_definitions: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=0.7, reward_model=DateRewardModel()), + WeightedRewardModel(weight=0.3, reward_model=RougeRewardModel()), ] - static_reference = False - - def __init__(self, llm_pipeline, context, create_reference =True): - self.context = context - self.query_system_prompt = QUERY_SYSTEM_PROMPT - self.query_prompt = QUERY_PROMPT_TEMPLATE.format(topic = context.title, context=context.content) - self.query = self.generate_query(llm_pipeline) - date = self.context.extra.get('date', None) - self.reference_prompt = REFERENCE_PROMPT_TEMPLATE.format(date = date, query = self.query, context = context.content) - if create_reference: - self.reference = self.generate_reference(llm_pipeline) - self.topic = context.title - self.subtopic = date - self.tags = context.tags + + +class DateQuestionAnsweringTask(BaseTask): + name: ClassVar[str] = "date_qa" + cleaner: ClassVar[CleanerPipeline] = CleanerPipeline(cleaning_pipeline=[RemoveTags(), FirstQuestion()]) + query_system_prompt: ClassVar[str] = QUERY_SYSTEM_PROMPT + augmentation_system_prompt: ClassVar[str] = "" + + @classmethod + def generate_query_reference(cls, llm_pipeline: BasePipeline, context: DateContext): + query_prompt = QUERY_PROMPT_TEMPLATE.format(content=context.date, topic=context.title) #TODO Sort out context dictionary + query = cls.generate_query(llm_pipeline=llm_pipeline, message=query_prompt) + + reference_prompt = REFERENCE_PROMPT_TEMPLATE.format(date=context.content, query=query, content=context.subtopic) + reference = cls.generate_reference(llm_pipeline=llm_pipeline, messages=[reference_prompt]) + + return query, reference diff --git a/prompting/tasks/debugging.py b/prompting/tasks/debugging.py deleted file mode 100644 index 1e20e9ec..00000000 --- a/prompting/tasks/debugging.py +++ /dev/null @@ -1,136 +0,0 @@ -import random -import bittensor as bt -from dataclasses import dataclass -from prompting.tasks import Task -import difflib - - -def corrupt( - code, - n_remove=0, - n_swap=0, - seed=None, - sep=" ", - min_length=1, - max_length=10, - remove_comment_lines=False, -): - """ - Corrupt a piece of code by removing and/or swapping chunks of it. - TODO: Ignore comments and strings(?) when corrupting the code. - - Args: - code (str): The code to corrupt. - n_remove (int): The number of chunks to remove. - n_swap (int): The number of chunks to swap. - seed (int): The random seed to use. - sep (str): The separator to use when splitting the code into chunks. Recommended values are '', ' ', '\n'. - min_length (int): The minimum length of a chunk. - max_length (int): The maximum length of a chunk. - """ - - # set seed for reproducibility - random.seed(seed) - - assert n_remove + n_swap > 0, "Must specify at least one corruption type." - - def remove(code, n, sep=" ", min_length=1, max_length=10): - """Remove n random chunks from the code. Chunks can be characters, words, or lines.""" - - chunks = code.split(sep) if sep else list(code) - - # select n random chunks to remove - indices = random.sample( - [ - i - for i, chunk in enumerate(chunks) - if min_length <= len(chunk) <= max_length - ], - n, - ) - bt.logging.info( - f"Removing the following {len(indices)} chunks: {[chunks[i] for i in indices]} at indices {indices}" - ) - - return sep.join([chunk for i, chunk in enumerate(chunks) if i not in indices]) - - def swap(code, sep=" ", min_length=1, max_length=10): - """Swap two random chunks in the code. Chunks can be characters, words, or lines.""" - chunks = code.split(sep) if sep else list(code) - - # select 2 random chunks to swap - indices = random.sample( - [ - i - for i, chunk in enumerate(chunks) - if min_length <= len(chunk) <= max_length - ], - 2, - ) - - bt.logging.info( - f"Swapping chunk {chunks[indices[0]]!r} at index {indices[0]} with chunk {chunks[indices[1]]!r} at index {indices[1]}" - ) - - chunks[indices[0]], chunks[indices[1]] = ( - chunks[indices[1]], - chunks[indices[0]], - ) - - return sep.join(chunks) - - # Do this at your peril. It doesn't catch multiline comments or strings. - if remove_comment_lines: - code = "\n".join( - [ - line - for line in code.splitlines() - if not line.strip() or line.strip().startswith("#", "//") - ] - ) - - # spread n corruptions across the code - for i in range(n_remove): - code = remove(code, n=1, sep=sep, min_length=min_length, max_length=max_length) - for i in range(n_swap): - code = swap(code, sep=sep, min_length=min_length, max_length=max_length) - - return code - - -def diff(query, reference): - """Get the diff between two strings.""" - return "\n".join(difflib.unified_diff(query.splitlines(), reference.splitlines())) - - -@dataclass -class DebuggingTask(Task): - name = "debugging" - desc = "get help with debugging" - goal = "ask for help fixing broken code." - - reward_definition = [dict(name="diff", weight=1.0)] - - penalty_definition = [] - - static_reference = True - static_query = True - - def __init__(self, llm_pipeline, context, create_reference=True): - self.context = context - - # No LLM involved in generating the query, we just apply some language-independent corruption to the code - self.query = corrupt( - context.content, - n_remove=random.randint(1, 3), - n_swap=random.randint(0, 2), - sep=random.choices(["", " ", "\n"], weights=[0.3, 0.6, 0.1], k=1)[0], - ) - self.reference = context.content - self.delimiter = "```" - self.topic = context.title - self.subtopic = context.subtopic - self.tags = context.tags - - def format_challenge(self, challenge): - return f"{challenge}\n{self.delimiter}\n{self.query}\n{self.delimiter}" diff --git a/prompting/tasks/generic_instruction.py b/prompting/tasks/generic_instruction.py deleted file mode 100644 index 9f5de0f9..00000000 --- a/prompting/tasks/generic_instruction.py +++ /dev/null @@ -1,47 +0,0 @@ -from prompting.tasks import Task - -QUERY_PROMPT_TEMPLATE = """\ -You are a question-generating expert, focusing on delivering comprehensive and accurate questions with depth and clarity. Your response contains only the question, nothing more, nothing less. You will adhere to a word limit of 100 words. -{context} -""" - -REFERENCE_PROMPT_TEMPLATE = """\ -Answer the following question. - -# Question: -{query}""" - - -class GenericInstructionTask(Task): - name = "generic" - desc = "get help on answering a general instruction" - goal = "to get the answer to the following instruction" - challenge_type = 'query' - - reward_definition = [ - dict(name="rouge", ngram="rouge-1", metric="f", weight=0.25), - dict(name="relevance", weight=0.75), - ] - penalty_definition = [ - dict(name="rouge", ngram="rouge-1", metric="f", weight=0.5), - ] - - cleaning_pipeline = [ - dict(name="remove_quotes"), - dict(name="prune_ending"), - dict(name="remove_roles"), - ] - - def __init__(self, llm_pipeline, context, create_reference=True): - self.context = context - - self.query_prompt = QUERY_PROMPT_TEMPLATE.format(context=context.content) - self.query = self.generate_query(llm_pipeline) - - self.reference_prompt = REFERENCE_PROMPT_TEMPLATE.format(query = self.query) - if create_reference: - self.reference = self.generate_reference(llm_pipeline) - - self.topic = context.title - self.subtopic = context.topic - self.tags = context.tags diff --git a/prompting/tasks/math.py b/prompting/tasks/math.py deleted file mode 100644 index c1abf208..00000000 --- a/prompting/tasks/math.py +++ /dev/null @@ -1,31 +0,0 @@ -import sys -import bittensor as bt -from dataclasses import dataclass -from prompting.tasks import Task -from .challenge_templates import MathChallengeTemplate - - -@dataclass -class MathTask(Task): - name = "math" - desc = "get help solving a math problem" - goal = "to get the answer to the following math question" - - reward_definition = [ - dict(name="float_diff", weight=1.0), - ] - penalty_definition = [] - - static_reference = True - static_query = True - challenge_type = 'paraphrase' - challenge_template = MathChallengeTemplate() - - def __init__(self, llm_pipeline, context, create_reference=True): - self.context = context - - self.query = context.content - self.reference = context.extra["solution"] - self.topic = context.title - self.subtopic = context.topic - self.tags = context.tags diff --git a/prompting/tasks/mock.py b/prompting/tasks/mock.py deleted file mode 100644 index 668827fb..00000000 --- a/prompting/tasks/mock.py +++ /dev/null @@ -1,29 +0,0 @@ -from dataclasses import dataclass -from prompting.tasks import Task - -@dataclass -class MockTask(Task): - name = "mock" - desc = "get help solving a math problem" - goal = "to get the answer to the following math question" - - reward_definition = [ - dict(name="float_diff", weight=1.0), - ] - penalty_definition = [] - - static_reference = True - static_query = True - - def __init__(self, llm_pipeline, context, create_reference=True): - self.context = context - - self.query = ( - "How can I solve the following problem, " - + context.content - + "?" - ) - self.reference = "This is the reference answer" - self.topic = context.title - self.subtopic = context.topic - self.tags = context.tags \ No newline at end of file diff --git a/prompting/tasks/multi_choice.py b/prompting/tasks/multi_choice.py new file mode 100644 index 00000000..c850f711 --- /dev/null +++ b/prompting/tasks/multi_choice.py @@ -0,0 +1,158 @@ +import json +from typing import ClassVar, Optional + +import numpy as np + +from prompting.datasets.base import Context +from prompting.llms.base_llm import BasePipeline +from prompting.rewards.multi_choice import MultiChoiceRewardModel +from prompting.rewards.reward import BaseRewardConfig, WeightedRewardModel +from prompting.tasks.base_task import BaseTask +from prompting.utils.exceptions import TaskCreationError + +# TODO: Introduce criteria for the query and reference answer (length, layout, etc.) and make these arguments. + +MINER_EXAMPLE_1_SHOT = """\ +[Example 1] +What is the capital of Texas? +A. Paris +B. London +C. Austin +D. Houston +Answer: C +""" + +# Used to instruct the LLM to provide a query when given a context. +QUERY_SYSTEM_PROMPT = """\ +You are a multiple choice quiz-generating expert. +Based on the input context, you must generate the question, exactly 4 possible answers (A, B, C, D), and the correct answer letter. + +[Example 1] +{ + "question": "What is the capital of Texas?", + "A": "Paris", + "B": "London", + "C": "Austin", + "D": "Houston", + "answer": "C" +} + +[Example 2] +{ + "question": "Which of the following best describes the primary driving force behind protein folding?", + "A": "Covalent bond formation between amino acids", + "B": "Hydrophobic interactions between nonpolar side chains", + "C": "Hydrogen bonds between the protein backbone and side chains", + "D": "Ionic interactions between charged side chains", + "answer": "B" +} +""" + +# Used to obtain the query (which is a question about the context). +# TODO: modulate difficulty "ask an {expert} question". +QUERY_PROMPT_TEMPLATE = """\ +Create a multiple choice quiz based on the following context source from {source} about {title}: + +[Input Context] +{context} +""" + + +class MultiChoiceRewardConfig(BaseRewardConfig): + reward_definitions: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=1.0, reward_model=MultiChoiceRewardModel()), + ] + + +class MultiChoiceTask(BaseTask): + # TODO: Remove context, legacy code. + context: Optional[dict] = None + name: ClassVar[str] = "multi_choice" + query_system_prompt: ClassVar[str] = QUERY_SYSTEM_PROMPT + augmentation_system_prompt: ClassVar[str] = "" + + # Specific pattern (semi-flexible) which detects multiple choices. + choices_pattern: ClassVar[str] = r"\n\s*(\*?\s*\W?[A-D]\W?)\s*(.*)" + + @classmethod + def generate_query_reference(cls, llm_pipeline: BasePipeline, context: Context) -> tuple[str, str]: + query_prompt = QUERY_PROMPT_TEMPLATE.format(source=context.source, title=context.title, context=context.content) + query_with_choices = cls.generate_query(llm_pipeline=llm_pipeline, message=query_prompt) + query, reference = cls.extract_query_and_reference(query_with_choices) + return query, reference + + @classmethod + def extract_query_and_reference(cls, query_with_choices: str) -> tuple[str, str]: + """ + Detects JSON within a string, parses it into a dictionary, + and validates that the dictionary contains the required fields: + "question", "answer", "A", "B", "C", and "D". + + Args: + json_string (str): The string containing the JSON data, possibly with extra text. + + Returns: + dict: The parsed and validated dictionary. + + Raises: + ValueError: If JSON extraction or parsing fails, or required fields are missing. + """ + # Regular expression pattern to match JSON object in the string. + def extract_json_from_string(string: str): + start = string.find("{") + end = string.rfind("}") + 1 + if start != -1 and end != -1: + json_string = string[start:end] + try: + return json.loads(json_string) + except json.JSONDecodeError: + pass + return None + + quiz_data = extract_json_from_string(query_with_choices) + if not quiz_data: + raise TaskCreationError(f"No JSON object could be found in the provided string: {query_with_choices}.") + + required_fields = ["question", "answer", "A", "B", "C", "D"] + + # Check for missing fields. + for field in required_fields: + if field not in quiz_data: + raise TaskCreationError(f"Missing required field: '{field}'") + + # Answer must be exactly one of the choices. + if quiz_data["answer"] not in ("A", "B", "C", "D"): + raise TaskCreationError(f"Invalid answer: '{quiz_data['answer']}'") + + quiz, reference = cls.shuffle_and_format(quiz_data) + return quiz, reference + + @classmethod + def shuffle_and_format(cls, quiz_data: dict[str, str]) -> tuple[str, str]: + """Shuffles the choices and formats them into a string with the question. + + Args: + quiz_data (dict): The dictionary containing the quiz data. + + Returns: + str: The formatted string with the question and shuffled choices. + """ + # Extract choices and the correct answer. + choices = ["A", "B", "C", "D"] + choice_texts = [quiz_data[choice] for choice in choices] + correct_answer = quiz_data["answer"] + + # Shuffle the choices. + shuffled_choices = list(zip(choices, np.random.permutation(choice_texts))) + + # Determine the new correct answer after shuffling. + new_reference = [choice for choice, text in shuffled_choices if text == quiz_data[correct_answer]][0] + + # Format the shuffled question and choices. + prompt: list[str] = [] + prompt.append(f"{MINER_EXAMPLE_1_SHOT}\n") + prompt.append(f"[Input Question]\n{quiz_data['question']}\n\n") + prompt.append("\n".join([f"{choice}. {text}" for choice, text in shuffled_choices])) + prompt.append("\nAnswer: ") + + return "".join(prompt), new_reference \ No newline at end of file diff --git a/prompting/tasks/persona.py b/prompting/tasks/persona.py new file mode 100644 index 00000000..b1e474f6 --- /dev/null +++ b/prompting/tasks/persona.py @@ -0,0 +1,44 @@ +import random +from pydantic import BaseModel + +PROFILES = [ + "student", + "teacher", + "parent", + "hacker", + "programmer", + "scientist", +] +# profiles = ["16 year old highschool student", ... + +# TODO: more terse, less verbose +MOOD = [ + "an interested", + "a concerned", + "an impatient", + "a tired", + "a confused", + "an annoyed", + "a curious", + "an upbeat", + "a lazy", +] +TONE = [ + "formal", + "informal", + "indifferent", + "casual", + "rushed", + "polite", + "impolite", + "friendly", + "unfriendly", + "positive", + "negative", +] + + +class Persona(BaseModel): + mood: str = random.choice(MOOD) + tone: str = random.choice(TONE) + profile: str = random.choice(PROFILES) diff --git a/prompting/tasks/qa.py b/prompting/tasks/qa.py index e9564ec2..269c65ac 100644 --- a/prompting/tasks/qa.py +++ b/prompting/tasks/qa.py @@ -1,6 +1,25 @@ -import bittensor as bt -from dataclasses import dataclass -from prompting.tasks import Task +from prompting.rewards.rouge import RougeRewardModel +from prompting.rewards.relevance import RelevanceRewardModel +from prompting.tasks.base_task import BaseTask +from prompting.rewards.reward import WeightedRewardModel + +# from prompting.rewards.reward import BaseRewardModel +from prompting.utils.cleaners import RemoveRoles, RemoveQuotes, PruneEnding, RemovePostQuestionText +from prompting.utils.cleaners import CleanerPipeline +from prompting.datasets.base import Context +from prompting.rewards.reward import BaseRewardConfig +from typing import ClassVar +from prompting.rewards.rouge import RougeRewardModel +from prompting.rewards.relevance import RelevanceRewardModel +from prompting.tasks.base_task import BaseTask +from prompting.rewards.reward import WeightedRewardModel + +# from prompting.rewards.reward import BaseRewardModel +from prompting.utils.cleaners import RemoveRoles, RemoveQuotes, PruneEnding, RemovePostQuestionText +from prompting.utils.cleaners import CleanerPipeline +from prompting.datasets.base import Context +from prompting.rewards.reward import BaseRewardConfig +from typing import ClassVar # TODO: introduce criteria for the query and reference answer (length, layout, etc.) and make these arguments @@ -11,30 +30,24 @@ You will adhere to a word limit of 50 words for each question. """ +REFERENCE_SYSTEM_PROMPT = """\ +You are an expert question-answering LLM. You will receive context and a question, and you will generate a detailed and accurate answer to the question. Your answer should be based on the context provided. +""" + +REFERENCE_SYSTEM_PROMPT = """\ +You are an expert question-answering LLM. You will receive context and a question, and you will generate a detailed and accurate answer to the question. Your answer should be based on the context provided. +""" + # Used to obtain the query (which is a question about the context) QUERY_PROMPT_TEMPLATE = """\ Ask a specific question about the following context: #Context: {context} -""" - -# Used to obtain the query (which is a followup question about the context) -# TODO: we may not need the entire conversation history - we can sample a subset of it (first k messages, last k messages, etc.) -FOLLOWUP_PROMPT_TEMPLATE = """ -Compose a single, specific question to continue the dialogue below. Adopt the persona of the original user, reflecting their communication style and objectives. The question should be rooted in the previous exchanges and should not be answerable with a simple yes or no. -Ensure the question requires detailed knowledge of the conversation history for a correct response, focusing on requests for clarification or additional details (e.g., 'What specific steps did you take?', 'Are you sure?', 'How do you know that is true', or 'How did that situation resolve?'). Use indirect pronouns or descriptions to refer to subjects instead of their names. Avoid answering the question yourself and do not introduce new information not already discussed. - -When asking a followup question, you should use pronouns or descriptions to refer to subjects instead of their names. You absolutely must not repeat the subject of the question in the followup question. For example, if the question is "What is the capital of France?", the followup question should not be "What is the population of France?". Instead, it should be "How many people live there?" or "What is its population?". -# Context: -{context} - -# Conversation History: -{history} +You must ask a question that can be answered by the context. """ - # Used to obtain reference answer REFERENCE_PROMPT_TEMPLATE = """\ Answer the question you will receive in detail, utilizing the following context. @@ -46,67 +59,36 @@ {question} """ -# TODO: We also need a special followup reference prompt (or just merge both) -# TODO: We should create followups using the specified llama3 chat template rather than feeding the message history through textually -FOLLOWUP_REFERENCE_PROMPT_TEMPLATE = """\ -You are a helpful assistant. Answer the question below in detail, prioritizing the use of the provided conversation history. The context is available for additional information if needed, but it may not always be relevant. - -# Conversation History: -{history} - -# Context (optional): -{context} - -# Question: -{question} - -Ensure your answer references relevant parts of the conversation history. Use the context only if it provides additional necessary information. -""" - -@dataclass -class QuestionAnsweringTask(Task): - name = "qa" - desc = "get help on answering a question" - goal = "to get the answer to the following question" - - reward_definition = [ - dict(name="rouge", ngram="rouge-1", metric="f", weight=0.5), - dict(name="relevance", weight=0.5), +class QARewardConfig(BaseRewardConfig): + reward_definitions: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=0.5, reward_model=RougeRewardModel()), + WeightedRewardModel(weight=0.5, reward_model=RelevanceRewardModel()), ] - penalty_definition = [ - dict(name="rouge", ngram="rouge-1", metric="f", weight=0.5), + penalty_definition: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=0.5, reward_model=RougeRewardModel()) ] - cleaning_pipeline = [ - dict(name="remove_quotes"), - dict(name="prune_ending"), - dict(name="remove_roles"), - dict(name="remove_post_question_text"), - ] - def __init__(self, llm_pipeline, context, create_reference=True, history=None): - self.context = context - - self.query_system_prompt = QUERY_SYSTEM_PROMPT - if history: - self.query_prompt = FOLLOWUP_PROMPT_TEMPLATE.format(context=context.content, history=history) - bt.logging.warning(f'Using history!!\n{history=}\n\n{context=}\n\n{self.query_prompt=}') - else: - self.query_prompt = QUERY_PROMPT_TEMPLATE.format(context=context.content) - - self.query = self.generate_query(llm_pipeline) - - if history: - self.reference_prompt = FOLLOWUP_REFERENCE_PROMPT_TEMPLATE.format( - context=context.content, question=self.query, history=history - ) - else: - self.reference_prompt = REFERENCE_PROMPT_TEMPLATE.format( - context=context.content, question=self.query - ) - if create_reference: - self.reference = self.generate_reference(llm_pipeline) - - self.topic = context.title - self.subtopic = context.topic - self.tags = context.tags +class QuestionAnsweringTask(BaseTask): + """QuestionAnsweringTasks must be initialised with an LLM pipeline to generate query and reference plus + context from a dataset to base the query on""" + name: ClassVar[str] = "qa" + cleaning_pipeline: ClassVar[CleanerPipeline] = CleanerPipeline( + cleaning_pipeline=[ + RemoveQuotes(), + PruneEnding(), + RemoveRoles(), + RemovePostQuestionText(), + ] + ) + query_system_prompt: ClassVar[str] = QUERY_SYSTEM_PROMPT + reference_system_prompt: ClassVar[str] = REFERENCE_SYSTEM_PROMPT + augmentation_system_prompt: ClassVar[str] = "" + + @classmethod + def generate_query_reference(cls, llm_pipeline, context: Context): + query_prompt = QUERY_PROMPT_TEMPLATE.format(context=context.content) + query = cls.generate_query(llm_pipeline=llm_pipeline, message=query_prompt) + reference_prompt = REFERENCE_PROMPT_TEMPLATE.format(context=context.content, question=query) + reference = cls.generate_reference(llm_pipeline=llm_pipeline, messages=[reference_prompt]) + return query, reference diff --git a/prompting/tasks/sentiment.py b/prompting/tasks/sentiment.py deleted file mode 100644 index ef11df4a..00000000 --- a/prompting/tasks/sentiment.py +++ /dev/null @@ -1,36 +0,0 @@ -from prompting.tasks import Task -from .challenge_templates import SentimentChallengeTemplate - -QUERY_PROMPT_TEMPLATE = """\ -You are a review-generating expert, focusing on making highly reaslistic revies. Your response contains only the review, nothing more, nothing less. You will adhere to a word limit of 250 words. Ask a specific question about the following context: -{context} -""" - - -class SentimentAnalysisTask(Task): - name = "sentiment" - desc = "get help analyzing the sentiment of a review" - goal = "to get the sentiment to the following review" - challenge_type = 'paraphrase' - challenge_template = SentimentChallengeTemplate() - - reward_definition = [ - dict(name="ordinal", weight=1.0), - ] - penalty_definition = [] - cleaning_pipeline = [] - - static_reference = True - - def __init__(self, llm_pipeline, context, create_reference=True): - self.context = context - self.query_prompt = QUERY_PROMPT_TEMPLATE.format(context=context.content) - self.query = self.generate_query(llm_pipeline) - self.reference = context.subtopic - - self.topic = context.title - self.subtopic = context.topic - self.tags = context.tags - - def format_challenge(self, challenge) -> str: - return challenge.format(context = self.query) \ No newline at end of file diff --git a/prompting/tasks/summarization.py b/prompting/tasks/summarization.py index 5046cab3..018a7854 100644 --- a/prompting/tasks/summarization.py +++ b/prompting/tasks/summarization.py @@ -1,12 +1,27 @@ -from dataclasses import dataclass -from prompting.tasks import Task - - - # TODO: introduce criteria for the query and reference answer (length, layout, etc.) and make these arguments # TODO: Also add a query system prompt and a query prompt template # TODO: Add the option to generate the summary query from the context. e.g. "the childhood of Abraham Lincoln" which is more specific than summarizing the entire article (Abraham Lincoln) +from prompting.tasks.base_task import BaseTask +from prompting.rewards.rouge import RougeRewardModel +from prompting.rewards.relevance import RelevanceRewardModel +from prompting.rewards.reward import WeightedRewardModel +from prompting.rewards.reward import BaseRewardConfig +from prompting.utils.cleaners import RemoveRoles, RemoveQuotes, PruneEnding +from prompting.datasets.base import Context +from prompting.utils.cleaners import CleanerPipeline +from typing import ClassVar + +QUERY_SYSTEM_PROMPT = """\ +You are a request-generating expert. When asked to generate a request, you ask for a detailed summary of a topic. Your request should be specificly about the topic. +""" + +REFERENCE_SYSTEM_PROMPT = """\ +You are an expert question-answering LLM. You will receive context and a question, and you will generate a detailed and accurate answer to the question. Your answer should be based on the context provided. +""" + +QUERY_PROMPT_TEMPLATE = """\ +Request an exhaustive summary about the topic: {title}""" # Used to obtain reference answer REFERENCE_PROMPT_TEMPLATE = """\ @@ -16,41 +31,33 @@ {context} """ - -@dataclass -class SummarizationTask(Task): - name = "summarization" - desc = "get help with summarization" - goal = "summarize the following topic" - - reward_definition = [ - dict(name="rouge", ngram="rouge-l", metric="f", weight=0.5), - dict(name="relevance", weight=0.5), +class SummarizationRewardConfig(BaseRewardConfig): + reward_definitions: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=0.5, reward_model=RougeRewardModel()), + WeightedRewardModel(weight=0.5, reward_model=RelevanceRewardModel()), ] - penalty_definition = [dict(name="rouge", ngram="rouge-1", metric="f", weight=0.5)] - - # This is where you define cleaning procedures for the generation. - # Can be used when wanting to clean the challenge. - cleaning_pipeline = [ - dict(name="remove_quotes"), - dict(name="prune_ending"), - dict(name="remove_roles"), + penalty_definition: ClassVar[list[WeightedRewardModel]] = [ + WeightedRewardModel(weight=0.5, reward_model=RougeRewardModel()) ] - static_query = True - - def __init__(self, llm_pipeline, context, create_reference=True): - self.context = context - - # Query is just the article title and section name - self.query = context.title - - self.reference_prompt = REFERENCE_PROMPT_TEMPLATE.format( - context=context.content - ) - if create_reference: - self.reference = self.generate_reference(llm_pipeline) - self.topic = context.title - self.subtopic = context.topic - self.tags = context.tags +class SummarizationTask(BaseTask): + name: ClassVar[str] = "summarization" + cleaning_pipeline: ClassVar[CleanerPipeline] = CleanerPipeline( + cleaning_pipeline=[ + RemoveQuotes(), + PruneEnding(), + RemoveRoles(), + ] + ) + query_system_prompt: ClassVar[str] = QUERY_SYSTEM_PROMPT + reference_system_prompt: ClassVar[str] = REFERENCE_SYSTEM_PROMPT + augmentation_system_prompt: ClassVar[str] = "" + + @classmethod + def generate_query_reference(cls, llm_pipeline, context: Context): + query_prompt = QUERY_PROMPT_TEMPLATE.format(title=context.title) + query = cls.generate_query(llm_pipeline=llm_pipeline, message=query_prompt) + reference_prompt = REFERENCE_PROMPT_TEMPLATE.format(context=context.content, question=query) + reference = cls.generate_reference(llm_pipeline=llm_pipeline, messages=[reference_prompt]) + return query, reference diff --git a/prompting/tasks/task.py b/prompting/tasks/task.py deleted file mode 100644 index e5890062..00000000 --- a/prompting/tasks/task.py +++ /dev/null @@ -1,129 +0,0 @@ -import time -import bittensor as bt -from abc import ABC -from dataclasses import dataclass, asdict -from enum import Enum -from typing import List, Union, Dict -from prompting.llms import HuggingFaceLLM, vLLM_LLM, BasePipeline -from prompting.cleaners.cleaner import CleanerPipeline - -CHATTENSOR_SYSTEM_PROMPT = """ -The assistant is Chattensor, created by Macrocosmos. The current date is {date}. -Chattensor is a distributed intelligence, powered by Bittensor. It is a hivemind composed of 1000 highly skilled and specialized LLMs working together to provide the best possible answers to human queries. Within Chattenor, each LLM has access to the internet, APIs and tools to ensure that responses are current and factually accurate. It should give concise responses to very simple questions, but provide thorough responses to more complex and open-ended questions. -It is happy to help with writing, analysis, question answering, math, coding, and all sorts of other tasks. It uses markdown for coding. Where applicable, Chattensor will include references to credible sources to support its answers. -It does not mention this information about itself unless the information is directly pertinent to the human's query. -""" - - -def make_system_prompt(): - return CHATTENSOR_SYSTEM_PROMPT.format(date=time.strftime("%B %d, %Y")) -class TaskEvaluationType(Enum): - REWARD_STACK = "reward" - FILTER_STACK = "filter" - PENALTY_STACK = "penalty" - SIMILARITY_STACK = "similarity" - RELEVANCE_STACK = "relevance" - - -@dataclass -class Task(ABC): - # topics: dict - name: str - desc: str - goal: str - query: str - topic: str - subtopic: str - tags: List[str] - context: dict - reward_definition: List[dict] - penalty_definition: List[dict] = None - reward_threshold: float = 0.0 - reference: Union[str, List[str]] = "" - criteria: str = ("",) - delimiter: str = "" - complete: bool = False - static_reference: bool = False - static_query: bool = False - reference_prompt = "" - query_system_prompt = "" - query_prompt = "" - cleaner = None - clean_reference = True - challenge_type = 'inference' - - global_penalty_definition = [ - dict(name="streaming", max_tokens_per_chunk=200, weight=0.2) - ] - - def __str__(self): - return f"{self.__class__.__name__}(name={self.name!r}, desc={self.desc!r}, goal={self.goal!r}, query={self.query!r}, reference={self.reference!r}, topic={self.topic!r}, subtopic={self.subtopic!r}, tags={self.tags!r})" - - def __repr__(self): - return str(self) - - def __state_dict__(self, full=False): - state = { - "task": self.name, - "desc": self.desc, - "goal": self.goal, - "query": self.query, # For now we just use the raw query but should add delimiters again - "query_time": getattr(self, "query_time", 0), - "reference": self.reference, - "reference_time": getattr(self, "reference_time", 0), - "topic": self.topic, - "subtopic": self.subtopic, - "context_time": self.context.stats.get("fetch_time", 0.0), - } - if full: - state.update(asdict(self.context)) - - return state - - def generate( - self, system: str, prompt: str, pipeline: BasePipeline, clean=True - ) -> str: - """Uses the llm to generate a response to a prompt""" - - cleaner = ( - CleanerPipeline(cleaning_pipeline=self.cleaning_pipeline) if clean else None - ) - return vLLM_LLM(pipeline, system_prompt=system).query( - message=prompt, cleaner=cleaner - ) - - def generate_reference(self, pipeline: BasePipeline, clean=True) -> str: - """Generates a reference answer to be used for scoring miner completions""" - t0 = time.time() - if not self.static_reference: - if not self.clean_reference: - clean = False - bt.logging.info("🤖 Generating reference...") - self.reference = self.generate( - system=make_system_prompt(), - prompt=self.reference_prompt, - pipeline=pipeline, - clean=clean, - ) - - self.reference_time = time.time() - t0 - return self.reference - - def generate_query(self, pipeline: BasePipeline, clean=True) -> str: - """Generates a query to be used for generating the challenge""" - t0 = time.time() - if not self.static_query: - bt.logging.info("🤖 Generating query...") - self.query = self.generate( - system=self.query_system_prompt, #Could possibly add the chattensor system prompt to query but I don't think it adds anything - prompt=self.query_prompt, - pipeline=pipeline, - clean=clean, - ) - - self.query_time = time.time() - t0 - return self.query - - def format_challenge(self, challenge) -> str: - """Formats the challenge to be used for the conversation""" - return challenge diff --git a/prompting/tasks/task_registry.py b/prompting/tasks/task_registry.py new file mode 100644 index 00000000..e8d019ff --- /dev/null +++ b/prompting/tasks/task_registry.py @@ -0,0 +1,70 @@ +from prompting.tasks.base_task import BaseTask +from prompting.rewards.reward import BaseRewardConfig +from prompting.tasks.date_qa import DateQuestionAnsweringTask, DateQARewardConfig +from prompting.tasks.multi_choice import MultiChoiceRewardConfig, MultiChoiceTask +from prompting.tasks.qa import QuestionAnsweringTask, QARewardConfig +from prompting.tasks.summarization import SummarizationTask, SummarizationRewardConfig + +from prompting.datasets.wiki import WikiDataset, WikiDateDataset +from prompting.datasets.base import BaseDataset +from pydantic import BaseModel, ConfigDict +import random +from typing import ClassVar +from loguru import logger + + +class TaskConfig(BaseModel): + task: BaseTask.__class__ + probability: float + datasets: list[BaseDataset.__class__] + reward_model: BaseRewardConfig.__class__ + + model_config = ConfigDict(arbitrary_types_allowed=True) + + +class TaskRegistry(BaseModel): + task_configs: ClassVar[list[TaskConfig]] = [ + TaskConfig(task=QuestionAnsweringTask, probability=0.55, datasets=[WikiDataset], reward_model=QARewardConfig), + TaskConfig( + task=SummarizationTask, probability=0.2, datasets=[WikiDataset], reward_model=SummarizationRewardConfig + ), + TaskConfig( + task=DateQuestionAnsweringTask, probability=0.2, datasets=[WikiDateDataset], reward_model=DateQARewardConfig + ), + TaskConfig( + task=MultiChoiceTask, probability=0.05, datasets=[WikiDataset], reward_model=MultiChoiceRewardConfig + ), + ] + + @classmethod + def random(cls) -> TaskConfig: + probabilities = [task.probability for task in cls.task_configs] + selected_task = random.choices(cls.task_configs, probabilities)[0] + return selected_task + + @classmethod + def get_task_datasets(cls, task: BaseTask.__class__) -> BaseDataset.__class__: + try: + return [t.datasets for t in cls.task_configs if task is t.task][0] + except Exception: + logger.error("Tried accessing non-registered task") + return [] + + @classmethod + def get_random_task_dataset(cls, task: BaseTask.__class__) -> BaseDataset.__class__: + return random.choice(cls.get_task_datasets(task)) + + @classmethod + def get_task_reward(cls, task: BaseTask | BaseTask.__class__) -> BaseRewardConfig.__class__: + task_class = task.__class__ if isinstance(task, BaseTask) else task + try: + return [t.reward_model for t in cls.task_configs if task_class is t.task][0] + except Exception: + logger.error("Tried accessing non-registered task") + return [] + + @classmethod + def create_random_task_with_dataset(cls) -> tuple[BaseTask.__class__, BaseDataset]: + task_config = cls.random() + dataset = cls.get_random_task_dataset(task_config.task) + return task_config.task, dataset() diff --git a/prompting/tasks/translate.py b/prompting/tasks/translate.py deleted file mode 100644 index 17c79c4f..00000000 --- a/prompting/tasks/translate.py +++ /dev/null @@ -1,133 +0,0 @@ -import tqdm -import bittensor as bt -import argostranslate.package -import argostranslate.translate -import random -from typing import List, Tuple -from prompting.tasks import Task -from dataclasses import dataclass -from argostranslate.package import AvailablePackage -from prompting.shared import Context - -SUPPORTED_LANGUAGES = [ - "en", "es", "fr", "pt", "uk" -] - -class TranslationPipeline: - def __init__(self): - self.supported_language_pairs = self.load_translation_packages() - - def load_translation_packages(self) -> List[AvailablePackage]: - # Update package index and get available and installed packages - argostranslate.package.update_package_index() - available_packages = argostranslate.package.get_available_packages() - installed_packages = argostranslate.package.get_installed_packages() - - # Helper function to check if a package is installed - def is_package_installed(from_code, to_code, packages): - return any(pkg for pkg in packages if pkg.from_code == from_code and pkg.to_code == to_code) - - # Filter available packages for supported language pairs - supported_language_pairs = [ - pkg for pkg in available_packages - if pkg.from_code in SUPPORTED_LANGUAGES and pkg.to_code in SUPPORTED_LANGUAGES - ] - - bt.logging.info(f"Supported language pairs: {supported_language_pairs}") - - # Check for installed packages - pbar = tqdm.tqdm(supported_language_pairs, desc="Checking installed packages") - for package in pbar: - if not is_package_installed(package.from_code, package.to_code, installed_packages): - bt.logging.info(f"Installing package from {package.from_code} to {package.to_code}") - package_path = str(package.download()) - argostranslate.package.install_from_path(package_path) - bt.logging.success(f'Package successfully installed at {package_path}') - else: - bt.logging.info(f"Package from {package.from_code} to {package.to_code} is already installed, skipping...") - - return supported_language_pairs - - def random_translation(self, content:str) -> str: - # TODO: NOT RANDOM - from_code = self.SUPPORTED_LANGUAGES[0] - to_code = self.SUPPORTED_LANGUAGES[1] - return argostranslate.translate.translate(content, from_code, to_code) - - def translate(self, content: str, from_code: str, to_code: str): - self.reference = argostranslate.translate.translate(content, from_code, to_code) - - def translate_to_random_language(self, content: str, from_code:str='en') -> Tuple[AvailablePackage, str]: - english_supported_languages = list(filter(lambda x: x.from_code == from_code, self.supported_language_pairs)) - available_translations = list(map(lambda x: x, english_supported_languages)) - - random_translation_obj = random.choice(available_translations) - translation_code = random_translation_obj.to_code - - translated_content = argostranslate.translate.translate(content, from_code, to_code=translation_code) - - return random_translation_obj, translated_content - - -@dataclass -class TranslationTask(Task): - challenge_type = 'query' - static_reference = True - static_query = True - name = "translation" - desc = "get translation help" - goal = "to get the translation for the given piece of text" - - templates = [ - "Could you assist me with translating the following text into {another_language}? \n{text}", - "I need some help translating this text into {another_language}. Can you do it? \n{text}", - "Is it possible for you to translate this text for me into {another_language}? Here it is: \n{text}", - "Would you mind helping me convert this text into {another_language}? \n{text}", - "Could you please convert this into {another_language} for me? \n{text}", - "I was wondering if you could help translate this into {another_language}? \n{text}", - "Can you provide a translation for this text into {another_language}? \n{text}", - "Hey, can you turn this text into {another_language} for me? \n{text}", - "Could I get some assistance in translating this into {another_language}? \n{text}", - "Are you able to help me render this text in {another_language}? \n{text}", - "I'd appreciate your help translating this text into {another_language}. Here's the text: \n{text}", - "Please could you translate the following text into {another_language}? \n{text}", - "Might you help me by translating this text to {another_language}? \n{text}", - "I'm looking for help to translate this text into {another_language}. Any chance you can assist? \n{text}", - "How about translating this text into {another_language} for me? \n{text}", - "Would it be possible for you to help translate this text into {another_language}? \n{text}", - "I need your expertise to translate this text into {another_language}, can you help? \n{text}", - "Can you work your magic and translate this text into {another_language}? \n{text}", - "I require assistance translating the following into {another_language}. Can you help? \n{text}", - "Hey, could you take a moment to translate this text into {another_language} for me? \n{text}", - ] - - # TODO: TEST BLEU SCORE - reward_definition = [ - dict(name="rouge", ngram="rouge-1", metric="f", weight=1), - ] - penalty_definition = [ - dict(name="rouge", ngram="rouge-1", metric="f", weight=1), - ] - - cleaning_pipeline = [] - - def __init__(self, translation_pipeline: TranslationPipeline, context: Context): - # Set task internal variables - self.context = context - self.topic = context.title - self.subtopic = context.topic - self.tags = context.tags - - # Translates english text to a random language - content_translation_obj, translated_content = translation_pipeline.translate_to_random_language(context.content) - - # Translates the translation to another random language - reference_translation_obj, reference_translation_content = translation_pipeline.translate_to_random_language(content=translated_content, from_code=content_translation_obj.to_code) - self.reference = reference_translation_content - - # Composes the query - # TODO: Implement template translation - template = random.choice(self.templates) - self.query = template.format(another_language=reference_translation_obj.to_name, text=translated_content) - - \ No newline at end of file diff --git a/prompting/tools/__init__.py b/prompting/tools/__init__.py deleted file mode 100644 index 82e3713d..00000000 --- a/prompting/tools/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from .datasets import ( - Dataset, - MockDataset, - HFCodingDataset, - WikiDataset, - StackOverflowDataset, - WikiDateDataset, - MathDataset, - GenericInstructionDataset, - ReviewDataset, -) -from .selector import Selector - -DATASETS = { - #HFCodingDataset.name: HFCodingDataset, - WikiDataset.name: WikiDataset, - #StackOverflowDataset.name: StackOverflowDataset, - MathDataset.name: MathDataset, - WikiDateDataset.name: WikiDateDataset, - GenericInstructionDataset.name: GenericInstructionDataset, - ReviewDataset.name: ReviewDataset -} - - - \ No newline at end of file diff --git a/prompting/tools/datasets/__init__.py b/prompting/tools/datasets/__init__.py deleted file mode 100644 index 3bdda191..00000000 --- a/prompting/tools/datasets/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from .base import Dataset -from .code import HFCodingDataset, StackOverflowDataset -from .math import MathDataset -from .mock import MockDataset -from .wiki import WikiDataset, WikiDateDataset -from .generic_instruction import GenericInstructionDataset -from .review import ReviewDataset \ No newline at end of file diff --git a/prompting/tools/datasets/base.py b/prompting/tools/datasets/base.py deleted file mode 100644 index a3f8d42a..00000000 --- a/prompting/tools/datasets/base.py +++ /dev/null @@ -1,126 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import time -import random -import functools -from abc import ABC, abstractmethod -from typing import Dict -import bittensor as bt - -from ..selector import Selector -from prompting.shared.context import Context -from prompting.utils.exceptions import MaxRetryError - - -class Dataset(ABC): - """Base class for datasets.""" - - max_tries: int = 10 - - @abstractmethod - def search(self, name): - ... - - @abstractmethod - def random(self, name): - ... - - @abstractmethod - def get(self, name): - ... - - def next( - self, method: str = "random", selector: Selector = Selector(), **kwargs - ) -> Dict: - tries = 1 - t0 = time.time() - - while True: - # TODO: Multithread the get method so that we don't have to suffer nonexistent pages - info = {} - if method == "random": - info = self.random(selector=selector, **kwargs) - elif method == "search": - info = self.search(selector=selector, **kwargs) - elif method == "get": - info = self.get(selector=selector, **kwargs) - else: - raise ValueError(f"Unknown dataset get method {method!r}") - - if info: - break - - bt.logging.debug( - f"Could not find any samples which meet {self.__class__.__name__} requirements after {tries} tries. Retrying... ({self.max_tries - tries} tries remaining.)" - ) - - tries += 1 - if tries >= self.max_tries: - raise MaxRetryError( - f"Could not find any samples which meet {self.__class__.__name__} requirements after {info} tries." - ) - - info["source"] = self.__class__.__name__ - info["stats"] = { - "fetch_time": time.time() - t0, - "num_tries": tries, - "fetch_method": method, - "next_kwargs": kwargs, - } - return Context(**info) - - -class TemplateDataset(Dataset): - """Base class for datasets based on a template.""" - - @property - def size(self): - return functools.reduce( - lambda x, y: x * y, [len(v) for v in self.params.values()], 1 - ) - - def __repr__(self): - return f"{self.__class__.__name__} with template: {self.query_template!r} and {self.size} possible phrases" - - def get(self, params: dict): - content = self.query_template.format(**params) - keys, values = list(zip(*params.items())) - - return { - "title": params.get( - "title", keys[0] - ), # Use the first key as the title if no field called title is present - "topic": params.get("topic", keys[min(1, len(keys) - 1)]), # Same for topic - "subtopic": params.get( - "subtopic", keys[min(2, len(keys) - 2)] - ), # Same for subtopic - "content": content, # content - "internal_links": values, # internal links - "external_links": values, # external links - "tags": values, # tags - "extra": {}, - } - - def random(self, selector: Selector = None): - selected = {k: selector(v) for k, v in self.params.items()} - return self.get(selected) - - def search(self, params: dict, selector: Selector = None): - selected = {k: params.get(k, selector(v)) for k, v in self.params.items()} - return self.get(selected) \ No newline at end of file diff --git a/prompting/tools/datasets/code.py b/prompting/tools/datasets/code.py deleted file mode 100644 index bdc2948b..00000000 --- a/prompting/tools/datasets/code.py +++ /dev/null @@ -1,686 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import re -import time -import random -import requests -import itertools - -import bittensor as bt -from bs4 import BeautifulSoup - -from .base import Dataset -from ..selector import Selector -from datasets import load_dataset - -LANGUAGES = { - "C++": { - "keywords": [ - "auto", - "break", - "case", - "char", - "const", - "continue", - "default", - "do", - "double", - "else", - "enum", - "extern", - "float", - "for", - "goto", - "if", - "int", - "long", - "register", - "return", - "short", - "signed", - "sizeof", - "static", - "struct", - "switch", - "typedef", - "union", - "unsigned", - "void", - "volatile", - "while", - ], - "libraries": [ - "iostream", - "fstream", - "string", - "vector", - "map", - "set", - "algorithm", - "cmath", - "cstdio", - "cstdlib", - "ctime", - "cstring", - "cassert", - "cctype", - "cerrno", - "cfloat", - "ciso646", - "climits", - "clocale", - "cmath", - "csetjmp", - "csignal", - "cstdarg", - "cstddef", - "cstdio", - "cstdlib", - "cstring", - "ctime", - "cwchar", - "cwctype", - "complex", - "deque", - "exception", - "fstream", - "functional", - "iomanip", - "ios", - "iosfwd", - "iostream", - "istream", - "iterator", - "limits", - "list", - "locale", - "map", - "memory", - "new", - "numeric", - "ostream", - "queue", - "set", - "sstream", - "stack", - "stdexcept", - "streambuf", - "string", - "typeinfo", - "utility", - "valarray", - "vector", - ], - "comments": ["//", "/*", "*/"], - }, - "Dockerfile": { - "keywords": [ - "from", - "maintainer", - "run", - "cmd", - "expose", - "env", - "add", - "copy", - "entrypoint", - "volume", - "user", - "workdir", - "onbuild", - ], - "libraries": [], - "comments": ["#"], - }, - "HTML": { - "keywords": [ - "div", - "span", - "input", - "ul", - "body", - "tag", - "html", - "head", - "title", - "meta", - "link", - "script", - "style", - "a", - "img", - "table", - "label", - ], - "libraries": [], - "comments": [""], - }, - "Java": { - "keywords": [ - "abstract", - "assert", - "boolean", - "break", - "byte", - "case", - "catch", - "char", - "class", - "continue", - "default", - "do", - "double", - "else", - "enum", - "extends", - "final", - "finally", - "float", - "for", - "if", - "implements", - "import", - "instanceof", - "int", - "interface", - "long", - "native", - "new", - "package", - "private", - "protected", - "public", - "return", - "short", - "static", - "strictfp", - "super", - "switch", - "synchronized", - "this", - "throw", - "throws", - "transient", - "try", - "void", - "volatile", - "while", - ], - "libraries": [ - "java.awt", - "java.awt.event", - "java.io", - "java.lang", - "java.math", - "java.net", - "java.text", - "java.util", - "javax.swing", - ], - "comments": ["//", "/*", "*/", "*"], - }, - "JavaScript": { - "keywords": [ - "abstract", - "arguments", - "boolean", - "break", - "byte", - "case", - "catch", - "char", - "class", - "const", - "continue", - "debugger", - "default", - "delete", - "do", - "double", - "else", - "enum", - "eval", - "export", - "extends", - "false", - "final", - "finally", - "float", - "for", - "function", - "goto", - "if", - "implements", - "import", - "in", - "instanceof", - "int", - "interface", - "let", - "long", - "native", - "module.exports" "new", - "null", - "package", - "private", - "protected", - "public", - "return", - "short", - "static", - "super", - "switch", - "synchronized", - "this", - "throw", - "throws", - "transient", - "true", - "try", - "typeof", - "var", - "void", - "volatile", - "while", - "with", - "yield", - ], - "libraries": [ - "react", - "express", - "mongoose", - "axios", - "redux", - "react-redux", - "react-router-dom", - "react-dom", - "react-scripts", - "material-ui", - ], - "comments": ["//", "/*", "*/"], - }, - "Python": { - "keywords": [ - "False", - "None", - "True", - "and", - "as", - "assert", - "break", - "class", - "continue", - "def", - "del", - "elif", - "else", - "except", - "finally", - "for", - "from", - "global", - "if", - "import", - "in", - "is", - "lambda", - "nonlocal", - "not", - "or", - "pass", - "raise", - "return", - "try", - "while", - "with", - "yield", - ], - "libraries": [ - "numpy", - "pandas", - "matplotlib", - "seaborn", - "scipy", - "sklearn", - "tensorflow", - "keras", - "pytorch", - "django", - "flask", - "requests", - "bs4", - "selenium", - "pyautogui", - "pyperclip", - "pyinputplus", - "pillow", - ], - "comments": ["#"], - }, - "SQL": { - "keywords": [ - "add", - "all", - "alter", - "and", - "any", - "as", - "asc", - "backup", - "between", - "case", - "check", - "column", - "constraint", - "create", - "database", - "default", - "delete", - "desc", - "distinct", - "drop", - "exec", - "exists", - "foreign", - "from", - "full", - "group", - "having", - "in", - "index", - "inner", - "insert", - "into", - "is", - "join", - "key", - "left", - "like", - "limit", - "not", - "null", - "on", - "or", - "order", - "outer", - "primary", - "procedure", - "right", - "rownum", - "select", - "set", - "table", - "top", - "truncate", - "union", - "unique", - "update", - "values", - "view", - "where", - ], - "comments": ["--", "/*", "*/"], - }, - "Shell": { - "keywords": [ - "alias", - "bg", - "bind", - "break", - "builtin", - "caller", - "cd", - "command", - "compgen", - "complete", - "continue", - "declare", - "dirs", - "disown", - "echo", - "enable", - "eval", - "exec", - "exit", - "export", - "false", - "fc", - "fg", - "getopts", - "hash", - "help", - "history", - "jobs", - "kill", - "let", - "local", - "logout", - "popd", - "printf", - "pushd", - "pwd", - "read", - "readonly", - "return", - "set", - "shift", - "shopt", - "source", - "suspend", - "test", - "times", - "trap", - "true", - "type", - "typeset", - "ulimit", - "umask", - "unalias", - "unset", - "wait", - ], - "comments": ["#"], - }, -} - - -def filter_comments(code, language): - # TODO: multiline comments - # filter out comments - - # for start_tag, end_tag in languages[language]['multiline-comments']: - # code = re.sub(rf'{start_tag}.*?{end_tag}', '', code, flags=re.DOTALL) - - lines = [] - for line in code.splitlines(): - # TODO: use regex - if any( - line.strip().startswith(symbol) - for symbol in LANGUAGES[language]["comments"] - ): - continue - - lines.append(line.lower()) - - return "\n".join(lines) - - -# TODO: why not define the chain_in, chain_out logic in the class itself? -class HFCodingDataset(Dataset): - name = "hf_coding" - def __init__( - self, - dataset_id="codeparrot/github-code", - seed=None, - languages=None, - buffer_size=10000, - ): - if seed is None: - seed = random.randint(0, 1000) - self.seed = seed - - if languages is None: - languages = list(LANGUAGES.keys()) - self.languages = languages - - self.dataset_id = dataset_id - self.dataset = iter( - load_dataset( - dataset_id, - split="train", - streaming=True, - languages=self.languages, - ).shuffle(seed=seed, buffer_size=buffer_size) - ) - - def get(self, min_lines=5, max_lines=100, selector: Selector = None): - info = next(self.dataset) - - if not (min_lines <= len(info["code"].splitlines()) <= max_lines): - return None - - present_keywords, present_libraries = self.get_special_contents( - info["code"], info["language"] - ) - keywords = list(present_keywords) + list(present_libraries) - code_words = [ - "code", - "programming", - "coding", - "code reference", - "programming technique", - ] - external_links = [] - for bigram in itertools.combinations(keywords, 2): - words = list(bigram) + [selector(code_words) + info["language"]] - # shuffle the words e.g. ['react', 'promise', 'code reference'] -> 'code reference promise react' - external_links.append(" ".join(random.sample(words, len(words)))) - - return { - "title": info["repo_name"], # name of the repo - "topic": info["language"], # language of the code - "subtopic": info["path"], - "content": info["code"], - "internal_links": [info["repo_name"], info["path"], info["language"]], - "external_links": external_links, - "source": "GitHub", - "tags": [info["language"], info["repo_name"], info["path"]], - "extra": {"size": info["size"], "license": info["license"]}, - } - - def search( - self, query, min_lines=5, max_lines=100, selector: Selector = None, **kwargs - ): - # TODO: Would be great to be able to get other files from the same repo - raise NotImplementedError( - f"Search is not implemented for {self.__class__.__name__}" - ) - - def random(self, min_lines=5, max_lines=100, selector: Selector = None, **kwargs): - return self.get(min_lines, max_lines, selector) - - def extract_keywords(self, code, language, field): - matches = set() - - # check which keywords and libraries are present in the code - for keyword in LANGUAGES[language].get(field, []): - if re.search(r"\b" + keyword + r"\b", code): - matches.add(keyword) - - return matches - - def get_special_contents(self, code, language, remove_comments=True): - if remove_comments: - code = filter_comments(code, language) - - present_libraries = self.extract_keywords(code, language, "libraries") - present_keywords = self.extract_keywords(code, language, "keywords") - - return present_keywords, present_libraries - - -class StackOverflowDataset: - name = "stack_overflow" - def __init__(self): - # Stack Overflow API endpoint for a random article - self.url = "https://api.stackexchange.com/2.3/questions" - self.questions = [] - - def get_stack_questions(self, min_upvotes=10): - params = { - "order": "desc", - "sort": "votes", # Sorting by votes means that it's likely that the same questions will be fetched again - "site": "stackoverflow", - "pagesize": 100, # Fetch 100 questions per API call - "page": random.randint(1, 5), - } - - # Fetch questions - response = requests.get(self.url, params=params) - response.raise_for_status() - - # Parse response - questions = response.json()["items"] - - # Filter questions by minimum upvotes - filtered_questions = [q for q in questions if q["score"] >= min_upvotes] - # Shuffle the questions - random.shuffle(filtered_questions) - - # Add the questions to the list of questions - self.questions.extend(filtered_questions) - return - - def get_stack_question(self) -> dict: - # If the list of questions is empty, fetch more questions - if not self.questions: - self.get_stack_questions() - question = self.questions.pop() - # Fetch the highest voted answer for the selected question - answer = self.get_stack_answer(question) - return {"question": question["title"], "answer": answer} - - def get_stack_answer(self, question): - question_id = question["question_id"] - url_answers = ( - f"https://api.stackexchange.com/2.3/questions/{question_id}/answers" - ) - params_answers = { - "order": "desc", - "sort": "votes", - "site": "stackoverflow", - "filter": "withbody", #'!9_bDDxJY5' - } - response_answers = requests.get(url_answers, params=params_answers) - response_answers.raise_for_status() - answers = response_answers.json()["items"] - if not answers: - bt.logging.warning("No answers found for the question!") - - highest_voted_answer = answers[0] # The first answer is the highest voted - soup = BeautifulSoup(highest_voted_answer["body"], "html.parser") - full_content = soup.get_text(separator="\n") - return full_content - - def next(self): - bt.logging.debug("Retrieving data from prompting.dataset...") - t0 = time.time() - info = self.get_stack_question() - info["fetch_time"] = time.time() - t0 - return info diff --git a/prompting/tools/datasets/generic_instruction.py b/prompting/tools/datasets/generic_instruction.py deleted file mode 100644 index b4d1e1d2..00000000 --- a/prompting/tools/datasets/generic_instruction.py +++ /dev/null @@ -1,52 +0,0 @@ -from .base import TemplateDataset - - -class GenericInstructionDataset(TemplateDataset): - "Generic question dataset, which creates LLM prompts for asking questions." - name = "generic_instruction" - query_template = ( - "Ask a {style} question about a {theme} {subtopic} related to {topic}" - ) - params = dict( - style=[ - "casual", - "basic", - "silly", - "random", - "thoughtful", - "detailed", - "deep", - "fun", - ], - theme=[ - "surprising", - "controvesial", - "historic", - "modern", - "famous", - "imfamous", - "popular", - "unpopular", - ], - subtopic=[ - "person", - "figure", - "opinion", - "event", - "leader", - "spokesperson", - "expert", - "topic", - ], - topic=[ - "science", - "politics", - "parenting", - "travel", - "cuisine", - "sports", - "pop culture", - "tech", - "history", - ], - ) \ No newline at end of file diff --git a/prompting/tools/datasets/math.py b/prompting/tools/datasets/math.py deleted file mode 100644 index b0dfc7ef..00000000 --- a/prompting/tools/datasets/math.py +++ /dev/null @@ -1,101 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import time -import random -import itertools -import mathgenerator -import bittensor as bt -from sympy.parsing.latex import parse_latex -from typing import Dict, Union, List, Tuple - - -from .base import Dataset -from ..selector import Selector - - -class MathDataset(Dataset): - name = 'math' - topics_list = mathgenerator.getGenList() - - def __init__(self, seed=None): - self.seed = seed - self.rng = random.Random(seed) - - def get( - self, - name: str, - selector: Selector = None, - include: List = None, - exclude: List = None, - **kwargs, - ) -> Dict: - """Get a math problem. - - Args: - name (str): Name of math problem to generate. - selector (Selector, optional): Selector instance to choose a specific problem. Defaults to None. - include (List, optional): _description_. Defaults to None. - exclude (List, optional): _description_. Defaults to None. - - Returns: - Dict: _description_ - """ - bt.logging.info(f"Getting math problem {name!r}") - max_tries = 10 - for _ in range(max_tries): - info = mathgenerator.generate_context(name, **kwargs) - if info["reward_type"] != "float" or info["topic"] == "computer_science": - pass - else: - math_words = [ - "math", - "mathematics", - "mathematical", - "math problem", - "math technique", - ] - external_links = [] - # construct external links from randomly shuffled trigrams containing 2 words from the problem and 1 random math word - # binary_to_decimal -> ['binary to', 'to decimal'] - for bigram in itertools.combinations(info["forward_words"], 2): - words = list(bigram) + [random.choice(math_words)] - # shuffle the words e.g. ['binary', 'decimal', 'math problem'] -> 'decimal binary math problem' - external_links.append(" ".join(random.sample(words, len(words)))) - - return { - "title": info["topic"], # title of math problem - "topic": info["topic"], # title of problem topic - "subtopic": info["subtopic"], # title of problem subtopic - "content": info["problem"], # problem statement - "internal_links": [info["topic"], info["subtopic"]], # internal links - "external_links": external_links, - "tags": info["forward_words"], - "extra": {"reward_type": info["reward_type"], "solution": info["solution"]}, - } - - def search( - self, name, selector: Selector, include: List = None, exclude: List = None - ) -> Dict: - raise NotImplementedError( - f"Search is not implemented for {self.__class__.__name__}" - ) - - def random(self, selector: Selector, **kwargs): - """Create a random math problem.""" - return self.get(name=None, selector=selector, **kwargs) diff --git a/prompting/tools/datasets/mock.py b/prompting/tools/datasets/mock.py deleted file mode 100644 index 54008269..00000000 --- a/prompting/tools/datasets/mock.py +++ /dev/null @@ -1,30 +0,0 @@ -from .base import Dataset - -# from ..selector import Selector - - -class MockDataset(Dataset): - name = "mock" - def get(self, name, exclude=None, selector=None): - return { - "title": name, - "topic": "Physics", - "subtopic": "Quantum_mechanics", - "content": f"{name} is a fraud. All of physics is a lie, the universe is a hologram, buy gold, bye!", - "internal_links": [ - "Quantum_mechanics", - "General_relativity", - "Special_relativity", - "String_theory", - ], - "external_links": ["Einstein", "Bohr", "Feynman", "Hawking"], - "tags": ["fraud", "hologram", "gold"], - "source": "Mockpedia", - "extra": {"solution": "religion"}, - } - - def search(self, name, exclude=None, selector=None): - return self.get(name) - - def random(self, name="Physics", exclude=None, selector=None): - return self.get(name) diff --git a/prompting/tools/datasets/review.py b/prompting/tools/datasets/review.py deleted file mode 100644 index cfadbcf8..00000000 --- a/prompting/tools/datasets/review.py +++ /dev/null @@ -1,38 +0,0 @@ -import random -import functools - -import bittensor as bt -from typing import Dict, Union, List, Tuple -from .base import TemplateDataset - - -class ReviewDataset(TemplateDataset): - "Review dataset, which creates LLM prompts for writing reviews." - name = 'review' - SENTIMENTS = ["positive", "neutral", "negative"] - # TODO: Expand the params to create a larger dataset, while maintaining the same quality. - query_template = "Create a {topic} review of a {title}. The review must be of {subtopic} sentiment." - params = dict( - topic=[ - "short", - "long", - "medium length", - "twitter", - "amazon", - "terribly written", - "hilarious", - ], - title=[ - "movie", - "book", - "restaurant", - "hotel", - "product", - "service", - "car", - "company", - "live event", - ], - subtopic=SENTIMENTS, - ) - \ No newline at end of file diff --git a/prompting/tools/datasets/wiki.py b/prompting/tools/datasets/wiki.py deleted file mode 100644 index 8d1d9099..00000000 --- a/prompting/tools/datasets/wiki.py +++ /dev/null @@ -1,353 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import re -import sys -import random -import datetime -import requests -from bs4 import BeautifulSoup -import bittensor as bt -import wikipedia as wiki -from typing import Dict, Optional, List, Tuple -from queue import Queue, Full, Empty -from functools import lru_cache -from .base import Dataset -from ..selector import Selector - - -# Create a queue called CACHED_ARTICLES to store wikipedia articles that have been fetched -CACHED_ARTICLES = Queue(maxsize=300) - - -# speed up page loading -@lru_cache(maxsize=1000) -def _get_page( - title, pageid=None, auto_suggest=False, redirect=True, seed=None -) -> wiki.WikipediaPage: - """Cached Wikipedia page loading.""" - try: - page = wiki.page( - title=title, pageid=pageid, auto_suggest=auto_suggest, redirect=redirect - ) - return page - - except wiki.DisambiguationError as e: - bt.logging.debug(f"{e.__class__.__name__} loading page {title!r}: {e}") - # exc info contains a tuple of (requested_title: str, possible_matches: List[str]) - pages = sys.exc_info()[1].args[1] - if not type(pages) == list: - return None - title = random.Random(seed).choice(pages) - return _get_page(title, auto_suggest=auto_suggest, redirect=redirect) - - except wiki.PageError as e: - bt.logging.warning(f"{e.__class__.__name__} loading page {title!r}: {e}") - if not auto_suggest: - return _get_page(title, auto_suggest=True, redirect=redirect) - return None - - -@lru_cache(maxsize=1000) -def _get_random_titles(pages=10, seed=42) -> List: - """Cached wikipedia random page. Approximately deterministic random titles. This is useful for testing. - NOTE: the actually cached result will change each session, but the result will be the same within a session. - """ - return wiki.random(pages=pages) - - -@lru_cache(maxsize=1000) -def _wiki_search(name: str, results: wiki.WikipediaPage) -> List: - """Cached Wikipedia search.""" - return wiki.search(name, results=results) - -def get_article_sections(title: str) -> Dict: - # Fetch the HTML content of the Wikipedia article - url = f"https://en.wikipedia.org/wiki/{title}" - response = requests.get(url) - html_content = response.text - - # Parse the HTML using BeautifulSoup - soup = BeautifulSoup(html_content, 'html.parser') - - sections = {} - for section in soup.find_all("h2"): - if (p_tag := section.find_next("p")) is not None: - sections[section.text] = p_tag.text - - return sections - -def process_page( - page, exclude_sections: Optional[list] = None, valid_section: callable = None, selector: Selector = None -) -> Dict: - """Process a Wikipedia page and return a dictionary of sections with their content. - - Args: - page: wikipedia.WikipediaPage - valid_header: callable to determine if a section header is valid - valid_content: callable to determine if a section content is valid - Returns: - dict: dictionary of sections and their content. Note that keys are tuples (header, section_title) - """ - title = page.title - - sections = get_article_sections(title) - - # Filter out the section keys that are in the exclude list - if exclude_sections: - sections = {k: v for k, v in sections.items() if k not in exclude_sections} - - if selector == "all": - content = "\n\n".join(sections.values()) - if not valid_section or valid_section(content): - return ("Full Page", content), sections.keys() - return None, sections.keys() - valid_sections = [(key, value) for key, value in sections.items() if not valid_section or valid_section(sections[key])] - - if valid_sections: - return selector(valid_sections), sections.keys() - else: - return None, sections.keys() - - -def most_relevant_links(page: wiki.WikipediaPage, num_links=10, num_summary_words=50, return_scores=False) -> List: - """Return the most relevant links to a Wikipedia page based on the intersection over union (IOU) of the link and the page summary.""" - link_scores = {} - summary_words = set(page.summary.split()[:num_summary_words]) - for link in page.links: - link_words = set(link.split()) - iou = len(summary_words.intersection(link_words)) / len( - summary_words.union(link_words) - ) - link_scores[link] = iou / len(link.split()) - - sorted_links = sorted(link_scores.items(), key=lambda x: x[1], reverse=True) - if return_scores: - return sorted_links[:num_links] - - return [link for link, _ in sorted_links[:num_links]] - - -def filter_categories(categories, exclude=None, include=None): - """Filter categories based on a list of categories to exclude and/or include.""" - if exclude: - categories = [ - cat - for cat in categories - if not re.search("|".join(exclude), cat, re.IGNORECASE) - ] - if include: - categories = [ - cat - for cat in categories - if re.search("|".join(include), cat, re.IGNORECASE) - ] - return categories - - -class WikiDataset(Dataset): - """Wikipedia dataset. Uses the wikipedia python api to fetch articles and sections.""" - name = "wiki" - EXCLUDE_HEADERS = ("See also", "References", "Further reading", "External links") - EXCLUDE_CATEGORIES = ("articles", "wiki", "pages", "cs1") - - def __init__( - self, - min_length_words: int = 20, - max_links: int = 10, - ): - """ - Args: - min_length_words (int, optional): Minimum section length. Defaults to 50. - max_links (int, optional): _description_. Defaults to 10. - """ - self.min_length_words = min_length_words - self.max_links = max_links - - def get( - self, - name: str, - selector: Selector = None, - exclude: List = None, - **kwargs, - ) -> Dict: - """Get a specified Wikipedia page and extract a section based on the selector. - - Args: - name (_type_): _description_ - pageid (_type_, optional): _description_. Defaults to None. - auto_suggest (bool, optional): _description_. Defaults to True. - redirect (bool, optional): _description_. Defaults to True. - selector (Selector, optional): _description_. Defaults to None. - include (List, optional): _description_. Defaults to None. - exclude (List, optional): _description_. Defaults to None. - - Returns: - Dict: _description_ - """ - - page = _get_page(title=name, **kwargs) - if page is None: - return None - # Only return a sections with a minimum number of words - exclude = (exclude or []) + list(self.EXCLUDE_HEADERS) - selected_section, all_sections= process_page( - page, - exclude_sections=exclude, - valid_section=lambda x: len(x.split()) >= self.min_length_words, - selector=selector, - ) # Returns a tuple of (section_name, content) - if not selected_section: - return None - - section_length = len(selected_section[1].split()) - context = { - "title": name, # title of wiki article - "topic": selected_section[0], - "subtopic": selected_section[0], - "content": selected_section[1], - "internal_links": list(filter(lambda x: x not in exclude, all_sections)), - "external_links": most_relevant_links(page, num_links=self.max_links), - "tags": filter_categories(page.categories, exclude=self.EXCLUDE_CATEGORIES), - "source": "Wikipedia", - "extra": { - "url": page.url, - "page_length": len(page.content.split()), - "section_length": section_length, - }, - } - try: - CACHED_ARTICLES.put(context, block=False) - except Full: - bt.logging.debug("Cache is full. Skipping article until cache is emptied.") - return context - - def search(self, name, results=3, selector: Selector = None) -> Dict: - titles = _wiki_search(name, results=results) - title = selector(titles) - return self.get(title, selector=selector) - - def random(self, pages=10, seed=None, selector: Selector = None, **kwargs) -> Dict: - titles = ( - wiki.random(pages=pages) - if seed is None - else _get_random_titles(pages=pages, seed=seed) - ) - title = random.choice(titles) - return self.get(title, selector=selector) - - -class WikiDateDataset(Dataset): - name = "wiki_date" - INCLUDE_HEADERS = ("Events", "Births", "Deaths") - MONTHS = ( - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ) - EXCLUDE_CATEGORIES = ("articles", "wiki", "pages", "cs1") - - def __init__(self, max_tries: int = 10, seed=None): - self.max_tries = max_tries - self.seed = seed - self.rng = random.Random(seed) - - def extract_dates_and_sentences(self, text: str) -> Tuple[str, str]: - # Regular expression to find dates in various formats - date_pattern = r'\b\d{1,2}[-/]\d{1,2}[-/]\d{2,4}\b|\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?(?:,)?\s+\d{4}\b|\b\d{1,2}\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember))\s+\d{4}\b|\b\d{4}\b' - - # Compile the regex pattern - date_regex = re.compile(date_pattern) - - # Split text into sentences - sentences = re.split(r'(?').strip()) - - # If no dates are found, search for dates in the form of "Month DD" - secondary_date_pattern = r'\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?\b' - secondary_date_regex = re.compile(secondary_date_pattern) - - for sentence in sentences: - # Find all dates in the sentence - dates = secondary_date_regex.findall(sentence) - # If dates are found, add them to the result dictionary with the corresponding sentence - if dates: - for date in dates: - # Return the first date found - return (str(date), sentence.replace(str(date), "").strip()) - - return None - - def _random_date(self) -> str: - for _ in range(self.max_tries): - try: - context = CACHED_ARTICLES.get(block=False) - date_sentence = self.extract_dates_and_sentences(context['content']) - context['content'] = date_sentence[1] - context['extra']['date'] = date_sentence[0] - if not context['content']: - continue - elif not context['extra']['date']: - continue - else: - return context - - except Empty: - bt.logging.debug("Cache is empty. Skipping date until cache is filled.") - return None - - except Exception as e: - bt.logging.error(f"Error fetching date: {e}") - continue - - def get( - self, - name, - pageid=None, - auto_suggest=False, - redirect=False, - selector: Selector = None, - ) -> Dict: - #TODO: Implement deterministic get method - return self.random() - - def search(self, name, results=5, selector: Selector = None) -> Dict: - raise NotImplementedError( - f"Search is not implemented for {self.__class__.__name__}" - ) - - def random(self, selector: Selector = None, **kwargs) -> Dict: - return self._random_date() diff --git a/prompting/tools/selector.py b/prompting/tools/selector.py deleted file mode 100644 index e94f7151..00000000 --- a/prompting/tools/selector.py +++ /dev/null @@ -1,51 +0,0 @@ -import random - - -class Selector: - def __init__(self, seed=None): - self.seed = seed - self.rng = random.Random(seed) - - def __call__(self, items, weights=None): - return self.rng.choices(items, weights=weights)[0] - - -class PageRankSelector(Selector): - """Preferentially chooses the items at the top of the list, under the assumption that they are more important.""" - - def __init__(self, seed=None, alpha=0.85): - super().__init__(seed) - self.alpha = alpha - - def __call__(self, items): - weights = [self.alpha**i for i in range(len(items))] - return self.rng.choices(items, weights=weights)[0] - - -class SimilaritySelector(Selector): - """Chooses the item most similar to the query.""" - - def __init__(self, seed=None, similarity_fn=None): - super().__init__(seed) - self.similarity_fn = similarity_fn - - def __call__(self, query, items): - return max(items, key=lambda item: self.similarity_fn(query, item)) - - -class TopSelector(Selector): - """Chooses the top item.""" - - def __init__(self, seed=None): - super().__init__(seed) - - def __call__(self, items): - return items[0] - - -if __name__ == "__main__": - selector = Selector(seed=42) - items = range(10) - item = selector(items) - - assert item in items, "Selector should return one of the items" diff --git a/prompting/utils/__init__.py b/prompting/utils/__init__.py index 359321ed..e69de29b 100644 --- a/prompting/utils/__init__.py +++ b/prompting/utils/__init__.py @@ -1,4 +0,0 @@ -from . import config -from . import misc -from . import uids -from . import logging diff --git a/prompting/cleaners/all_cleaners.py b/prompting/utils/cleaners.py similarity index 60% rename from prompting/cleaners/all_cleaners.py rename to prompting/utils/cleaners.py index d48119bf..892de48f 100644 --- a/prompting/cleaners/all_cleaners.py +++ b/prompting/utils/cleaners.py @@ -1,56 +1,57 @@ from abc import ABC, abstractmethod from typing import Union -import bittensor as bt import re -from typing import Union +from pydantic import BaseModel +from loguru import logger -class BaseCleaner(ABC): +class BaseCleaner(ABC, BaseModel): @abstractmethod - def __init__(self, **kwargs): + def apply(self, generation: str) -> str: pass - @abstractmethod + +class CleanerPipeline(BaseModel): + cleaning_pipeline: list[BaseCleaner] = [] + def apply(self, generation: str) -> str: - pass + """Apply cleaning steps to generation listed in cleaning_pipeline. + + Args: + generation (str): string generated from LLM or otherwise. + Returns: + str: Clean generated string. + """ + try: + for cleaner in self.cleaning_pipeline: + generation = cleaner.apply(generation) + return generation + except Exception as e: + logger.error(f"Failed to apply cleaning pipeline {cleaner['name']}. {e},") + return generation class RemoveQuotes(BaseCleaner): - def __init__(self, **kwargs) -> None: - pass - def apply(self, generation: str) -> str: - bt.logging.debug("Pruning unfinished sentence.") + logger.debug("Pruning unfinished sentence.") return generation.strip("\"'") class PruneEnding(BaseCleaner): - def __init__(self, **kwargs): - pass - def apply(self, generation: str) -> str: punctuation_chars = [".", "?", "!"] if not any(char in generation for char in punctuation_chars): return generation - if ( - not generation.endswith(".") - and not generation.endswith("?") - and not generation.endswith("!") - ): + if not generation.endswith(".") and not generation.endswith("?") and not generation.endswith("!"): index = max(generation.rfind(char) for char in punctuation_chars) - return generation[ - : index + 1 - ] # Go to the index of where the punctuation is, and include it (+1) + return generation[: index + 1] # Go to the index of where the punctuation is, and include it (+1) else: return generation class RemoveRoles(BaseCleaner): - def __init__(self, **kwargs): - pass - def capitalize_sentences(self, input_string): """capitalize the first character after .!?""" sentences = re.split(r"(?<=[.!?])\s+", input_string) @@ -61,7 +62,7 @@ def capitalize_sentences(self, input_string): return result_string def apply(self, generation: str) -> str: - generation = re.sub(r'\n*\w+\s*:','',generation) + generation = re.sub(r"\n*\w+\s*:", "", generation) roles = [ "User: ", "System: ", @@ -83,47 +84,49 @@ def apply(self, generation: str) -> str: input_string=generation ) # LLMs are good at being formal. Do the same if we remove a prefix. -class PrunePostQuestionText(BaseCleaner): - def __init__(self, **kwargs): - pass - def apply(self, generation: str, min_pos: Union[int,float] = 5, max_pos: Union[int,float]= 0.5, max_questions: int = None) -> str: - +class RemovePostQuestionText(BaseCleaner): + def apply( + self, + generation: str, + min_pos: Union[int, float] = 5, + max_pos: Union[int, float] = 0.5, + max_questions: int | None = None, + ) -> str: if min_pos < 1: min_pos = int(min_pos * len(generation)) if max_pos < 1: max_pos = int(max_pos * len(generation)) - + # question mark occurs in first half of the query if not min_pos <= generation.rfind("?") <= max_pos: return generation elif max_questions is not None: - generation = '?'.join(generation.split("?",max_questions)[:-1]) + '?' + generation = "?".join(generation.split("?", max_questions)[:-1]) + "?" else: # drop everything after the last question mark. Alternatively, we can just extract the first question. - generation = generation.rsplit("?",1) + '?' + generation = generation.rsplit("?", 1) + "?" - return generation + return generation -class RemoveTags(BaseCleaner): - def __init__(self, **kwargs): - pass +class RemoveTags(BaseCleaner): def apply(self, generation: str) -> str: tags = [ - "",] + "", + ] for tag in tags: if tag in generation: generation = generation.replace(tag, "") return generation -class FirstQuestion(BaseCleaner): - def __init__(self, **kwargs): - pass +class FirstQuestion(BaseCleaner): def apply(self, generation: str) -> str: if "?" in generation: - if ':' in generation: - generation = generation.split(':')[1] + if ":" in generation: + generation = generation.split(":")[1] + if ":" in generation: + generation = generation.split(":")[1] generation = generation.split("?")[0] + "?" - return generation \ No newline at end of file + return generation diff --git a/prompting/utils/config.py b/prompting/utils/config.py index 4e5991f9..34e0fed3 100644 --- a/prompting/utils/config.py +++ b/prompting/utils/config.py @@ -1,524 +1,38 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import os -import torch import argparse import bittensor as bt -import logging -from prompting.tasks import TASKS - -from bittensor.btlogging.defines import BITTENSOR_LOGGER_NAME - -logger = logging.getLogger(BITTENSOR_LOGGER_NAME) - - -def check_config(cls, config: "bt.Config"): - r"""Checks/validates the config namespace object.""" - bt.logging.check_config(config) - - full_path = os.path.expanduser( - "{}/{}/{}/netuid{}/{}".format( - config.logging.logging_dir, # TODO: change from ~/.bittensor/miners to ~/.bittensor/neurons - config.wallet.name, - config.wallet.hotkey, - config.netuid, - config.neuron.name, - ) - ) - bt.logging.info(f"Logging path: {full_path}") - config.neuron.full_path = os.path.expanduser(full_path) - if not os.path.exists(config.neuron.full_path): - os.makedirs(config.neuron.full_path, exist_ok=True) - - if not config.neuron.dont_save_events: - # Add custom event logger for the events. - event_handler = logging.FileHandler( - os.path.join(config.neuron.full_path, "events.log") - ) - event_handler.setLevel(38) # Custom level - formatter = logging.Formatter("{asctime} | {levelname} | {message}", style="{") - event_handler.setFormatter(formatter) - logger.addHandler(event_handler) - logging.addLevelName(38, "EVENTS") +from loguru import logger -def add_args(cls, parser): +def add_args(parser): """ Adds relevant arguments to the parser for operation. """ # Netuid Arg: The netuid of the subnet to connect to. - parser.add_argument("--netuid", type=int, help="Subnet netuid", default=1) - - parser.add_argument( - "--neuron.device", - type=str, - help="Device to run on.", - default="cuda" if torch.cuda.is_available() else "cpu", - ) - - parser.add_argument( - "--neuron.gpus", - type=int, - help="The number of visible GPUs to be considered in the llm initialization. This parameter currently reflects on the property `tensor_parallel_size` of vllm", - default=1, - ) - - parser.add_argument( - "--neuron.llm_max_allowed_memory_in_gb", - type=int, - help="The max gpu memory utilization set for initializing the model. This parameter currently reflects on the property `gpu_memory_utilization` of vllm", - default=62, - ) - - parser.add_argument( - "--neuron.epoch_length", - type=int, - help="The default epoch length (how often we set weights, measured in 12 second blocks).", - default=100, - ) - - parser.add_argument( - "--mock", - action="store_true", - help="Mock neuron and all network components.", - default=False, - ) - - parser.add_argument( - "--neuron.events_retention_size", - type=str, - help="Events retention size.", - default="2 GB", - ) - - parser.add_argument( - "--neuron.dont_save_events", - action="store_true", - help="If set, we dont save events to a log file.", - default=False, - ) - - parser.add_argument( - "--neuron.log_full", - action="store_true", - help="If set, logs more information.", - default=False, - ) - - parser.add_argument( - "--no_background_thread", - action="store_true", - help="If set, we dont run the neuron in a background thread.", - default=True, - ) - - parser.add_argument( - "--wandb.off", action="store_true", help="Turn off wandb.", default=False - ) - - parser.add_argument( - "--wandb.offline", - action="store_true", - help="Runs wandb in offline mode.", - default=False, - ) - - parser.add_argument( - "--wandb.notes", - type=str, - help="Notes to add to the wandb run.", - default="", - ) - - -def add_miner_args(cls, parser): - """Add miner specific arguments to the parser.""" - - parser.add_argument( - "--neuron.name", - type=str, - help="Trials for this neuron go in neuron.root / (wallet_cold - wallet_hot) / neuron.name. ", - default="miner", - ) - - parser.add_argument( - "--neuron.model_id", - type=str, - help="The model to use for the validator.", - default="gpt-3.5-turbo-1106", - ) - - parser.add_argument( - "--neuron.load_in_8bit", - type=str, - default=False, - help="Load quantized model in 8 bits. Note that this parameter only applies to hugging face miners.", - ) - - parser.add_argument( - "--neuron.load_in_4bit", - type=str, - default=False, - help="Load quantized model in 4 bits. Note that this parameter only applies to hugging face miners.", - ) - - parser.add_argument( - "--blacklist.force_validator_permit", - action="store_true", - help="If set, we will force incoming requests to have a permit.", - default=False, - ) - - parser.add_argument( - "--blacklist.allow_non_registered", - action="store_true", - help="If set, miners will accept queries from non registered entities. (Dangerous!)", - default=False, - ) - - parser.add_argument( - "--neuron.system_prompt", - type=str, - help="The system prompt to use for the miner.", - default="You are a friendly chatbot who always responds concisely and helpfully. You are honest about things you don't know.", - ) - - parser.add_argument( - "--neuron.max_tokens", - type=int, - default=256, - help="The maximum number of tokens to generate in the completion.", - ) - - parser.add_argument( - "--neuron.temperature", - type=float, - default=0.7, - help="Sampling temperature to use, between 0 and 2.", - ) - - parser.add_argument( - "--neuron.top_k", - type=float, - default=50, - help="Nucleus sampling parameter, top_p probability mass.", - ) - - parser.add_argument( - "--neuron.top_p", - type=float, - default=0.95, - help="Nucleus sampling parameter, top_p probability mass.", - ) - - parser.add_argument( - "--neuron.stop_on_forward_exception", - type=bool, - default=False, - help="Set miner to stop on forward exception.", - ) - - parser.add_argument( - "--neuron.should_force_model_loading", - type=bool, - default=False, - help="Force model loading independent of mock flag.", - ) - - parser.add_argument( - "--wandb.on", - type=bool, - default=False, - help="Enable wandb logging.", - ) - - parser.add_argument( - "--wandb.entity", - type=str, - default="opentensor-dev", - help="Wandb entity to log to.", - ) - - parser.add_argument( - "--wandb.project_name", - type=str, - default="alpha-miners", - help="Wandb project to log to.", - ) - - parser.add_argument( - "--neuron.streaming_batch_size", - type=int, - default=12, - help="Batch size in tokens for streaming forward calls.", - ) - - -def add_validator_args(cls, parser): - """Add validator specific arguments to the parser.""" - - parser.add_argument( - "--neuron.name", - type=str, - help="Trials for this neuron go in neuron.root / (wallet_cold - wallet_hot) / neuron.name. ", - default="validator", - ) - - parser.add_argument( - "--neuron.model_id", - type=str, - help="The model to use for the validator.", - default="casperhansen/llama-3-70b-instruct-awq", - ) - - parser.add_argument( - "--neuron.tasks", - type=str, - nargs="+", - help="The tasks to use for the validator.", - default=list(TASKS.keys()), - ) - import argparse - - def parse_probabilities(prob_list): - try: - # Convert each item in the list to a float - return [float(p) for p in prob_list] - except ValueError: - raise argparse.ArgumentTypeError("All probabilities must be floats.") - - parser.add_argument( - "--neuron.task_p", - type=parse_probabilities, # Use the custom parsing function - nargs="+", # Allow multiple values - help="The probability of sampling each task.", - default=[1.0 / len(TASKS)] * len(TASKS), - ) - - parser.add_argument( - "--neuron.timeout", - type=float, - help="The timeout for each forward call in seconds.", - default=15, - ) - - parser.add_argument( - "--neuron.max_tokens", - type=int, - help="The maximum number of tokens in generated responses.", - default=256, - ) - - parser.add_argument( - "--neuron.num_concurrent_forwards", - type=int, - help="The number of concurrent forwards running at any time.", - default=1, - ) - - parser.add_argument( - "--neuron.sample_size", - type=int, - help="The number of miners to query in a single step.", - default=100, - ) - - parser.add_argument( - "--neuron.disable_set_weights", - action="store_true", - help="Disables setting weights.", - default=False, - ) - - parser.add_argument( - "--neuron.moving_average_alpha", - type=float, - help="Moving average alpha parameter, how much to add of the new observation.", - default=0.1, - ) - - parser.add_argument( - "--neuron.decay_alpha", - type=float, - help="Constant decay rate for the moving average score.", - default=0.001, - ) - - parser.add_argument( - "--neuron.axon_off", - "--axon_off", - action="store_true", - # Note: the validator needs to serve an Axon with their IP or they may - # be blacklisted by the firewall of serving peers on the network. - help="Set this flag to not attempt to serve an Axon.", - default=False, - ) - - parser.add_argument( - "--neuron.vpermit_tao_limit", - type=int, - help="The maximum number of TAO allowed to query a validator with a vpermit.", - default=4096, - ) - - parser.add_argument( - "--wandb.project_name", - type=str, - help="The name of the project where you are sending the new run.", - default="prompting-validators", - ) - - parser.add_argument( - "--wandb.entity", - type=str, - help="The name of the project where you are sending the new run.", - default="macrocosmos", - ) - - parser.add_argument( - "--neuron.query_unique_coldkeys", - action="store_true", - help="Only query a single hotkey per coldkey.", - default=False, - ) - - parser.add_argument( - "--neuron.query_unique_ips", - action="store_true", - help="Only query a single hotkey per ip.", - default=False, - ) - - parser.add_argument( - "--neuron.forward_max_time", - type=int, - help="Max time to wait for a forward call to complete in seconds.", - default=120, - ) - - parser.add_argument( - "--neuron.organic_sample_size", - type=int, - help="The number of miners to organic query in a single step.", - default=5, - ) - - parser.add_argument( - "--neuron.organic_sampling_mode", - type=str, - help="The mode for sampling miners using organic queries. Options include 'random' for random selection, " - "'top_incentive' for selecting based on highest incentives.", - default="random", - ) - - parser.add_argument( - "--neuron.organic_disabled", - action="store_true", - help="Disables organic scoring.", - default=False, - ) - - parser.add_argument( - "--neuron.organic_disable_set_weights", - action="store_true", - help="Disables organic scoring weight setting.", - default=False, - ) - - parser.add_argument( - "--neuron.organic_synth_reward_scale", - type=float, - help="Scale factor for synthetic organic rewards.", - default=0.1, - ) - - parser.add_argument( - "--neuron.organic_reuse_response_disabled", - action="store_true", - help="If set, miner responses will be re-generated during reward generation. " - "The default behavior is to reuse responses.", - default=False, - ) - - parser.add_argument( - "--neuron.organic_timeout", - type=int, - help="Organic query timeout for each call in seconds.", - default=30, - ) - - parser.add_argument( - "--neuron.organic_reference_max_tokens", - type=int, - help="Organic reference max tokens.", - default=1024, - ) - - parser.add_argument( - "--neuron.organic_trigger_frequency", - type=float, - help="Organic query sampling frequency (seconds or steps value).", - default=120.0, - ) - - parser.add_argument( - "--neuron.organic_trigger_frequency_min", - type=float, - help="Minimum organic query sampling frequency (seconds or steps value).", - default=5.0, - ) - - parser.add_argument( - "--neuron.organic_scaling_factor", - type=float, - help=( - "The scaling factor to adjust the trigger frequency based on the size of the organic queue. " - "A higher value means the trigger frequency adjusts more slowly to the increase of organic queue size." - ), - default=1.0, - ) - - parser.add_argument( - "--neuron.organic_trigger", - type=str, - help="Organic query validation trigger mode (seconds or steps).", - default="seconds", - ) - - parser.add_argument( - "--neuron.organic_whitelist_hotkey", - type=str, - help="Allow request from specific hotkey. Defaults to OTF hotkey.", - # OTF hotkey. - default="5F4tQyWrhfGVcNhoqeiNsR6KjD4wMZ2kfhLj4oHYuyHbZAc3", - ) - + # parser.add_argument("--netuid", type=int, help="Subnet netuid", default=1) + parser.add_argument("--netuid", type=int, help="Subnet netuid") + parser.add_argument("--wallet.name", type=str, help="Wallet name") + parser.add_argument("--wallet.hotkey", type=str, help="Hotkey name") + parser.add_argument("--subtensor.network", type=str, help="Subtensor network") + parser.add_argument("--axon.port", type=int, help="The open port to run on") -def config(cls): +def config() -> bt.config: """ Returns the configuration object specific to this miner or validator after adding relevant arguments. """ parser = argparse.ArgumentParser() + # TODO: Make project IPython Notebook compatible. + # if "ipykernel" in sys.modules: + # # Detect if running inside IPython Notebook and filter out the Jupyter-specific arguments. + # args, unknown = parser.parse_known_args() + # else: + # # Normal argument parsing for other environments. + # add_args(parser=parser) + # args = parser.parse_args() + add_args(parser=parser) + args = parser.parse_args() + logger.info(f"RUNNING WITH ARGS: {' '.join(f'{k}={v}' for k, v in vars(args).items())}") bt.wallet.add_args(parser) bt.subtensor.add_args(parser) - bt.logging.add_args(parser) bt.axon.add_args(parser) - cls.add_args(parser) return bt.config(parser) diff --git a/prompting/utils/exceptions.py b/prompting/utils/exceptions.py index b119d069..c4f7f1d4 100644 --- a/prompting/utils/exceptions.py +++ b/prompting/utils/exceptions.py @@ -5,9 +5,18 @@ def __init__(self, message="Maximum number of retries exceeded"): self.message = message super().__init__(self.message) + class BittensorError(Exception): """Exception raised when an error is raised from the bittensor package""" - def __init__(self, message = "An error from the Bittensor package occured"): - self.message = message + def __init__(self, message="An error from the Bittensor package occured"): + self.message = message + super().__init__(self.message) + + +class TaskCreationError(Exception): + """Exception raised when the task creation fails.""" + + def __init__(self, message="Task creation failed"): + self.message = message super().__init__(self.message) diff --git a/prompting/utils/logging.py b/prompting/utils/logging.py index 50474b63..9ba133c0 100644 --- a/prompting/utils/logging.py +++ b/prompting/utils/logging.py @@ -1,16 +1,21 @@ import json import os -import copy -import wandb -import bittensor as bt from dataclasses import asdict, dataclass from datetime import datetime -from typing import List -import logging +from typing import Any, Literal, Optional + +import wandb +from loguru import logger +from pydantic import BaseModel, ConfigDict +from wandb.wandb_run import Run + import prompting -from bittensor.btlogging.defines import BITTENSOR_LOGGER_NAME +from prompting.base.dendrite import DendriteResponseEvent +from prompting.rewards.reward import WeightedRewardEvent +from prompting.settings import settings +from prompting.tasks.task_registry import TaskRegistry -logger = logging.getLogger(BITTENSOR_LOGGER_NAME) +WANDB: Run @dataclass @@ -19,18 +24,17 @@ class Log: challenge: str challenge_prompt: str reference: str - miners_ids: List[str] - responses: List[str] - miners_time: List[float] + miners_ids: list[str] + responses: list[str] + miners_time: list[float] challenge_time: float reference_time: float - rewards: List[float] + rewards: list[float] task: dict - # extra_info: dict -def export_logs(logs: List[Log]): - bt.logging.info("📝 Exporting logs...") +def export_logs(logs: list[Log]): + logger.info("📝 Exporting logs...") # Create logs folder if it doesn't exist if not os.path.exists("logs"): @@ -53,66 +57,139 @@ def export_logs(logs: List[Log]): return log_file -def should_reinit_wandb(self): +def should_reinit_wandb(step: int): # Check if wandb run needs to be rolled over. - return ( - not self.config.wandb.off - and self.step - and self.step % self.config.wandb.run_step_length == 0 - ) + return settings.WANDB_ON and step and step % settings.WANDB_RUN_STEP_LENGTH == 0 -def init_wandb(self, reinit=False): +def init_wandb(reinit=False, neuron: Literal["validator", "miner"] = "validator", custom_tags: list = []): """Starts a new wandb run.""" + global WANDB tags = [ - self.wallet.hotkey.ss58_address, - prompting.__version__, - str(prompting.__spec_version__), - f"netuid_{self.metagraph.netuid}", + f"Wallet: {settings.WALLET.hotkey.ss58_address}", + f"Version: {prompting.__version__}", + # str(prompting.__spec_version__), + f"Netuid: {settings.NETUID}", ] - if self.config.mock: - tags.append("mock") - for task in self.active_tasks: - tags.append(task) - if self.config.neuron.disable_set_weights: + if settings.MOCK: + tags.append("Mock") + for task_config in TaskRegistry.task_configs: + tags.append(task_config.task.__name__) + if settings.NEURON_DISABLE_SET_WEIGHTS: tags.append("disable_set_weights") - - wandb_config = { - key: copy.deepcopy(self.config.get(key, None)) - for key in ("neuron", "reward", "netuid", "wandb") - } - wandb_config["neuron"].pop("full_path", None) - - self.wandb = wandb.init( - anonymous="allow", + tags += [ + f"Neuron UID: {settings.METAGRAPH.hotkeys.index(settings.WALLET.hotkey.ss58_address)}", + f"Time: {datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}", + ] + + tags += custom_tags + + # wandb_config = {key: copy.deepcopy(self.config.get(key, None)) for key in ("neuron", "reward", "netuid", "wandb")} + # wandb_config["neuron"].pop("full_path", None) + wandb.login(anonymous="allow", key=settings.WANDB_API_KEY, verify=True) + logger.info( + f"Logging in to wandb on entity: {settings.WANDB_ENTITY} and project: {settings.WANDB_PROJECT_NAME}" + ) + WANDB = wandb.init( reinit=reinit, - project=self.config.wandb.project_name, - entity=self.config.wandb.entity, - config=wandb_config, - mode="offline" if self.config.wandb.offline else "online", - dir=self.config.neuron.full_path, + project=settings.WANDB_PROJECT_NAME, + entity=settings.WANDB_ENTITY, + mode="offline" if settings.WANDB_OFFLINE else "online", + dir=settings.SAVE_PATH, tags=tags, - notes=self.config.wandb.notes, + notes=settings.WANDB_NOTES, ) - bt.logging.success(f"Started a new wandb run {self.wandb.name} ") + logger.success(f"Started a new wandb run {WANDB.name} ") def reinit_wandb(self): """Reinitializes wandb, rolling over the run.""" - self.wandb.finish() + WANDB.finish() init_wandb(self, reinit=True) -def log_event(self, event): - if not self.config.neuron.dont_save_events: - logger.log(38, event) +class BaseEvent(BaseModel): + forward_time: float | None = None + - if self.config.wandb.off: - return +class ErrorEvent(BaseEvent): + error: str - if not getattr(self, "wandb", None): - init_wandb(self) - # Log the event to wandb. - self.wandb.log(event) +class ValidatorEvent(BaseEvent): + best: str + block: int + step: int + step_time: float + reward_events: list[WeightedRewardEvent] + penalty_events: list[WeightedRewardEvent] + response_event: DendriteResponseEvent + reference: str + challenge: str + task: str + rewards: list[float] + model_config = ConfigDict(arbitrary_types_allowed=True) + + +class ValidatorOrganicEvent(ValidatorEvent): + organic_turn: Optional[int] + organic_time_sample: Optional[float] + organic_time_responses: Optional[float] + organic_time_rewards: Optional[float] + organic_time_weights: Optional[float] + organic_queue_size: Optional[int] + + +class MinerEvent(BaseEvent): + epoch_time: float + messages: int + accumulated_chunks: int + accumulated_chunks_timings: float + validator_uid: int + validator_ip: str + validator_coldkey: str + validator_hotkey: str + validator_stake: float + validator_trust: float + validator_incentive: float + validator_consensus: float + validator_dividends: float + model_config = ConfigDict(arbitrary_types_allowed=True) + + +def log_event(event: BaseEvent): + if not settings.LOGGING_DONT_SAVE_EVENTS: + logger.info(f"{event}") + + if settings.WANDB_ON: + unpacked_event = unpack_events(event) + unpacked_event = convert_arrays_to_lists(unpacked_event) + wandb.log(unpacked_event) + + +def unpack_events(event: BaseEvent) -> dict[str, Any]: + """reward_events and penalty_events are unpacked into a list of dictionaries.""" + event_dict = event.model_dump() + for key in list(event_dict.keys()): + if key.endswith("_events"): + event_dict.update(extract_reward_event(event_dict.pop(key))) + if key == "response_event": + nested_dict = event_dict.pop(key) + if isinstance(nested_dict, dict): + event_dict.update(nested_dict) + return event_dict + + +def extract_reward_event(reward_event: list[dict[str, Any]]) -> dict[str, Any]: + flattened_reward_dict = {} + for element in reward_event: + name = element["reward_event"].pop("reward_model_name") + element["reward_event"]["weight"] = element.pop("weight") + reward_event = element.pop("reward_event") + new_reward_event = {f"{name}_{key}": value for key, value in reward_event.items()} + flattened_reward_dict.update(new_reward_event) + return flattened_reward_dict + +def convert_arrays_to_lists(data: dict) -> dict: + return {key: value.tolist() if hasattr(value, "tolist") else value for key, value in data.items()} diff --git a/prompting/utils/misc.py b/prompting/utils/misc.py index 98040614..0c167b78 100644 --- a/prompting/utils/misc.py +++ b/prompting/utils/misc.py @@ -1,29 +1,12 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - import time import asyncio import traceback -import bittensor as bt from math import floor from typing import Callable, Any from functools import lru_cache, update_wrapper from prompting.utils.exceptions import BittensorError +from loguru import logger +from prompting.settings import settings # LRU Cache with TTL @@ -112,7 +95,7 @@ def ttl_get_block(self) -> int: Note: self here is the miner or validator instance """ try: - return self.subtensor.get_current_block() + return settings.SUBTENSOR.get_current_block() except Exception as e: raise BittensorError(f"Bittensor error: {str(e)}") from e @@ -122,28 +105,26 @@ async def wrapper(*args, **kwargs): start_time = time.time() task_id = id(asyncio.current_task()) func_name = func.__name__ - bt.logging.debug(f"Starting {func_name} on task {task_id} at {start_time}") + logger.debug(f"Starting {func_name} on task {task_id} at {start_time}") # Execute the wrapped function result = await func(*args, **kwargs) end_time = time.time() execution_time = end_time - start_time - bt.logging.debug( - f"Completed {func_name} on task {task_id} in {execution_time} seconds" - ) + logger.debug(f"Completed {func_name} on task {task_id} in {execution_time} seconds") return result return wrapper -def serialize_exception_to_string(e): +def serialize_exception_to_string(e): if isinstance(e, BaseException): # Format the traceback - tb_str = ''.join(traceback.format_exception(type(e), e, e.__traceback__)) + tb_str = "".join(traceback.format_exception(type(e), e, e.__traceback__)) # Combine type, message, and traceback into one string serialized_str = f"Exception Type: {type(e).__name__}, Message: {str(e)}, Traceback: {tb_str}" return serialized_str - else: + else: return e diff --git a/prompting/utils/uids.py b/prompting/utils/uids.py index 2286fb1e..09634407 100644 --- a/prompting/utils/uids.py +++ b/prompting/utils/uids.py @@ -1,9 +1,10 @@ -import torch +import numpy as np import random import bittensor as bt -from typing import List, Union - +from typing import List from prompting.base.neuron import BaseNeuron +from prompting.settings import settings +from loguru import logger def check_uid_availability( @@ -25,14 +26,13 @@ def check_uid_availability( """ # Filter non serving axons. if not metagraph.axons[uid].is_serving: - bt.logging.debug(f"uid: {uid} is not serving") + logger.debug(f"uid: {uid} is not serving") return False # Filter validator permit > 1024 stake. if metagraph.validator_permit[uid] and metagraph.S[uid] > vpermit_tao_limit: - bt.logging.debug( - f"uid: {uid} has vpermit and stake ({metagraph.S[uid]}) > {vpermit_tao_limit}" - ) + logger.debug(f"uid: {uid} has vpermit and stake ({metagraph.S[uid]}) > {vpermit_tao_limit}") + logger.debug(f"uid: {uid} has vpermit and stake ({metagraph.S[uid]}) > {vpermit_tao_limit}") return False if coldkeys and metagraph.axons[uid].coldkey in coldkeys: @@ -45,7 +45,7 @@ def check_uid_availability( return True -def get_random_uids(self: BaseNeuron, k: int, exclude: List[int] = None) -> torch.LongTensor: +def get_random_uids(self: BaseNeuron, k: int, exclude: list[int] = None) -> np.ndarray: """Returns k available random uids from the metagraph. Args: k (int): Number of uids to return. @@ -55,55 +55,62 @@ def get_random_uids(self: BaseNeuron, k: int, exclude: List[int] = None) -> torc Notes: If `k` is larger than the number of available `uids`, set `k` to the number of available `uids`. """ + if settings.TEST and settings.TEST_MINER_IDS: + return np.array(random.sample(settings.TEST_MINER_IDS, min(len(settings.TEST_MINER_IDS), k))) candidate_uids = [] coldkeys = set() ips = set() - for uid in range(self.metagraph.n.item()): + for uid in range(settings.METAGRAPH.n.item()): if uid == self.uid: continue uid_is_available = check_uid_availability( - self.metagraph, + settings.METAGRAPH, uid, - self.config.neuron.vpermit_tao_limit, + settings.NEURON_VPERMIT_TAO_LIMIT, coldkeys, ips, ) if not uid_is_available: continue - if self.config.neuron.query_unique_coldkeys: - coldkeys.add(self.metagraph.axons[uid].coldkey) + if settings.NEURON_QUERY_UNIQUE_COLDKEYS: + coldkeys.add(settings.METAGRAPH.axons[uid].coldkey) - if self.config.neuron.query_unique_ips: - ips.add(self.metagraph.axons[uid].ip) + if settings.NEURON_QUERY_UNIQUE_IPS: + ips.add(settings.METAGRAPH.axons[uid].ip) if exclude is None or uid not in exclude: candidate_uids.append(uid) # Check if candidate_uids contain enough for querying, if not grab all avaliable uids if 0 < len(candidate_uids) < k: - bt.logging.warning( + logger.warning( f"Requested {k} uids but only {len(candidate_uids)} were available. To disable this warning reduce the sample size (--neuron.sample_size)" ) - return torch.tensor(candidate_uids) + return np.array(candidate_uids) elif len(candidate_uids) >= k: - return torch.tensor(random.sample(candidate_uids, k)) + return np.array(random.sample(candidate_uids, k)) else: raise ValueError(f"No eligible uids were found. Cannot return {k} uids") -def get_top_incentive_uids(self, k: int, vpermit_tao_limit: int) -> torch.LongTensor: - metagraph = self.metagraph - miners_uids = list(map(int, filter(lambda uid: check_uid_availability(metagraph, uid, vpermit_tao_limit), - metagraph.uids))) - +def get_top_incentive_uids(self, k: int, vpermit_tao_limit: int) -> np.ndarray: + metagraph = settings.METAGRAPH + miners_uids = list( + map(int, filter(lambda uid: check_uid_availability(metagraph, uid, vpermit_tao_limit), metagraph.uids)) + ) + + miners_uids = list( + map(int, filter(lambda uid: check_uid_availability(metagraph, uid, vpermit_tao_limit), metagraph.uids)) + ) + # Builds a dictionary of uids and their corresponding incentives. all_miners_incentives = { "miners_uids": miners_uids, - "incentives": list(map(lambda uid: metagraph.I[uid], miners_uids)) + "incentives": list(map(lambda uid: metagraph.I[uid], miners_uids)), } - + # Zip the uids and their corresponding incentives into a list of tuples. uid_incentive_pairs = list(zip(all_miners_incentives["miners_uids"], all_miners_incentives["incentives"])) @@ -112,13 +119,13 @@ def get_top_incentive_uids(self, k: int, vpermit_tao_limit: int) -> torch.LongTe # Extract the top uids. top_k_uids = [uid for uid, incentive in uid_incentive_pairs_sorted[:k]] - - return torch.tensor(top_k_uids) + + return np.array(top_k_uids) -def get_uids(self: BaseNeuron, sampling_mode: str, k: int, exclude: List[int] = []) -> torch.LongTensor: +def get_uids(self: BaseNeuron, sampling_mode: str, k: int, exclude: List[int] = []) -> np.ndarray: if sampling_mode == "random": return get_random_uids(self, k=k, exclude=exclude or []) if sampling_mode == "top_incentive": - vpermit_tao_limit = self.config.neuron.vpermit_tao_limit + vpermit_tao_limit = settings.NEURON_VPERMIT_TAO_LIMIT return get_top_incentive_uids(self, k=k, vpermit_tao_limit=vpermit_tao_limit) diff --git a/prompting/validator.py b/prompting/validator.py deleted file mode 100644 index 2891120d..00000000 --- a/prompting/validator.py +++ /dev/null @@ -1,82 +0,0 @@ -import bittensor as bt - -from prompting.base.validator import BaseValidatorNeuron -from prompting.forward import forward -from prompting.llms import vLLMPipeline -from prompting.rewards import RewardPipeline -from prompting.tasks.translate import TranslationPipeline - - -class Validator(BaseValidatorNeuron): - """ - Text prompt validator neuron. - """ - - def __init__(self, config=None): - super(Validator, self).__init__(config=config) - - bt.logging.info("load_state()") - self.load_state() - - self.llm_pipeline = vLLMPipeline( - model_id=self.config.neuron.model_id, - gpus=self.config.neuron.gpus, - llm_max_allowed_memory_in_gb=self.config.neuron.llm_max_allowed_memory_in_gb, - device=self.device, - mock=self.config.mock, - ) - self.translation_pipeline = TranslationPipeline() - - if abs(1-sum(self.config.neuron.task_p)) > 0.001: - raise ValueError("Task probabilities do not sum to 1.") - - # Filter out tasks with 0 probability - self.active_tasks = [ - task - for task, p in zip(self.config.neuron.tasks, self.config.neuron.task_p) - if p > 0 - ] - # Load the reward pipeline - self.reward_pipeline = RewardPipeline( - selected_tasks=self.active_tasks, device=self.device - ) - - async def forward(self): - """ - Validator forward pass. Consists of: - - Generating the query - - Querying the miners - - Getting the responses - - Rewarding the miners - - Updating the scores - """ - return await forward(self) - - def __enter__(self): - if self.config.no_background_thread: - bt.logging.warning("Running validator in main thread.") - self.run() - else: - self.run_in_background_thread() - - return self - - def __exit__(self, exc_type, exc_value, traceback): - """ - Stops the validator's background operations upon exiting the context. - This method facilitates the use of the validator in a 'with' statement. - - Args: - exc_type: The type of the exception that caused the context to be exited. - None if the context was exited without an exception. - exc_value: The instance of the exception that caused the context to be exited. - None if the context was exited without an exception. - traceback: A traceback object encoding the stack trace. - None if the context was exited without an exception. - """ - if self.is_running: - bt.logging.debug("Stopping validator in background thread.") - self.should_exit = True - self.thread.join(5) - self.is_running = False - bt.logging.debug("Stopped") diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..efeaa241 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,161 @@ +[tool.poetry] +name = "prompting" +version = "2.7.0" +description = "Subnetwork 1 runs on Bittensor and is maintained by Macrocosmos. It's an effort to create decentralised AI" +authors = ["Kalei Brady, Dmytro Bobrenko, Felix Quinque, Steffen Cruz"] +readme = "README.md" + +[tool.poetry.group.dev.dependencies] +ipykernel = "^6.29.5" + +[tool.black] +line-length = 120 +target-version = ['py310'] +include = '\.pyi?$' +exclude = ''' +/( + \.git +| \.hg +| \.mypy_cache +| \.tox +| \.venv +| _build +| buck-out +| build +)/ +''' + +[tool.flake8] +max-line-length = 120 +extend-ignore = ["D203", "E203", "E251", "E266", "E302", "E305", "E401", "E402", "E501", "F401", "F403", "W503"] +exclude = [".git", "__pycache__", "dist"] +max-complexity = 10 + +[tool.isort] +atomic = true +profile = "black" +line_length = 120 +skip_gitignore = true + +[tool.ruff] +# Exclude a variety of commonly ignored directories. +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".git-rewrite", + ".hg", + ".ipynb_checkpoints", + ".mypy_cache", + ".nox", + ".pants.d", + ".pyenv", + ".pytest_cache", + ".pytype", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + ".vscode", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "site-packages", + "venv", +] + +# Same as Black. +line-length = 120 +indent-width = 4 +target-version = "py310" + +[tool.ruff.lint] +# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. +# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or +# McCabe complexity (`C901`) by default. +select = ["E4", "E7", "E9", "F"] +ignore = [] + +# Allow fix for all enabled rules (when `--fix`) is provided. +fixable = ["ALL"] +unfixable = [] + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[tool.ruff.format] +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" + +# Enable auto-formatting of code examples in docstrings. Markdown, +# reStructuredText code/literal blocks and doctests are all supported. +# +# This is currently disabled by default, but it is planned for this +# to be opt-out in the future. +docstring-code-format = false + +# Set the line length limit used when formatting code snippets in +# docstrings. +# +# This only has an effect when the `docstring-code-format` setting is +# enabled. +docstring-code-line-length = "dynamic" + +[tool.poetry.dependencies] +python = ">=3.10 <3.11" +transformers = "4.43.3" +mathgenerator = {git = "https://github.com/synapse-alpha/mathgenerator.git", rev = "main"} +sympy = "^1.13.0" +tqdm = "^4.66.4" +requests = "^2.32.3" +numpy = "1.26.4" +# bittensor = "^7.3.0" +bittensor = { git = "https://github.com/opentensor/bittensor.git", branch = "release/7.1.2" } +pydantic = "^2.8.2" +rouge = "^1.0.1" +torch = "2.3.1" +wandb = "^0.17.4" +starlette = "^0.37.2" +openai = "^1.35.13" +bs4 = "^0.0.2" +wikipedia = "1.4.0" +deprecated = "^1.2.14" +pandas = "2.2.1" +datasets = "2.14.6" +langchain = "0.2.3" +argostranslate = "^1.9.6" +langchain-core = "0.2.19" +python-dotenv = "^1.0.1" +pre-commit = "^3.7.1" +ruff = "^0.5.2" +flake8 = "^7.1.0" +black = "23.7.0" +pytest = "^8.3.1" +angle-emb = "0.4.3" + +# optional dependencies for some services to run +vllm = { version = "0.5.3.post1", optional = true } + +organic-scoring = {git = "https://github.com/macrocosm-os/organic-scoring.git", rev = "main", optional = true} +autoawq = "0.2" +loguru = "^0.7.2" + +[tool.poetry.extras] +validator = ["vllm", "organic-scoring"] + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/run.sh b/run.sh index edc6a899..473211bf 100755 --- a/run.sh +++ b/run.sh @@ -3,7 +3,8 @@ # Initialize variables script="neurons/validator.py" autoRunLoc=$(readlink -f "$0") -proc_name="s1_validator_main_process" +proc_name="s1_validator_main_process" +update_proc_name="check_updates" args=() version_location="./prompting/__init__.py" version="__version__" @@ -13,138 +14,15 @@ old_args=$@ # Check if pm2 is installed if ! command -v pm2 &> /dev/null then - echo "pm2 could not be found. To install see: https://pm2.keymetrics.io/docs/usage/quick-start/" + echo "pm2 could not be found. Please run the install.sh script first." exit 1 fi -# Checks if $1 is smaller than $2 -# If $1 is smaller than or equal to $2, then true. -# else false. -version_less_than_or_equal() { - [ "$1" = "`echo -e "$1\n$2" | sort -V | head -n1`" ] -} +# Install poetry extras for the validator +poetry install --extras "validator" -# Checks if $1 is smaller than $2 -# If $1 is smaller than $2, then true. -# else false. -version_less_than() { - [ "$1" = "$2" ] && return 1 || version_less_than_or_equal $1 $2 -} - -# Returns the difference between -# two versions as a numerical value. -get_version_difference() { - local tag1="$1" - local tag2="$2" - - # Extract the version numbers from the tags - local version1=$(echo "$tag1" | sed 's/v//') - local version2=$(echo "$tag2" | sed 's/v//') - - # Split the version numbers into an array - IFS='.' read -ra version1_arr <<< "$version1" - IFS='.' read -ra version2_arr <<< "$version2" - - # Calculate the numerical difference - local diff=0 - for i in "${!version1_arr[@]}"; do - local num1=${version1_arr[$i]} - local num2=${version2_arr[$i]} - - # Compare the numbers and update the difference - if (( num1 > num2 )); then - diff=$((diff + num1 - num2)) - elif (( num1 < num2 )); then - diff=$((diff + num2 - num1)) - fi - done - - strip_quotes $diff -} - -read_version_value() { - # Read each line in the file - while IFS= read -r line; do - # Check if the line contains the variable name - if [[ "$line" == *"$version"* ]]; then - # Extract the value of the variable - local value=$(echo "$line" | awk -F '=' '{print $2}' | tr -d ' ') - strip_quotes $value - return 0 - fi - done < "$version_location" - - echo "" -} - -check_package_installed() { - local package_name="$1" - os_name=$(uname -s) - - if [[ "$os_name" == "Linux" ]]; then - # Use dpkg-query to check if the package is installed - if dpkg-query -W -f='${Status}' "$package_name" 2>/dev/null | grep -q "installed"; then - return 1 - else - return 0 - fi - elif [[ "$os_name" == "Darwin" ]]; then - if brew list --formula | grep -q "^$package_name$"; then - return 1 - else - return 0 - fi - else - echo "Unknown operating system" - return 0 - fi -} - -check_variable_value_on_github() { - local repo="$1" - local file_path="$2" - local variable_name="$3" - - local url="https://github.com/gitapi/repos/$repo/contents/$file_path" - local response=$(curl -s "$url") - - # Check if the response contains an error message - if [[ $response =~ "message" ]]; then - echo "Error: Failed to retrieve file contents from GitHub." - return 1 - fi - - # Extract the content from the response - local content=$(echo "$response" | tr -d '\n' | jq -r '.content') - - if [[ "$content" == "null" ]]; then - echo "File '$file_path' not found in the repository." - return 1 - fi - - # Decode the Base64-encoded content - local decoded_content=$(echo "$content" | base64 --decode) - - # Extract the variable value from the content - local variable_value=$(echo "$decoded_content" | grep "$variable_name" | awk -F '=' '{print $2}' | tr -d ' ') - - if [[ -z "$variable_value" ]]; then - echo "Variable '$variable_name' not found in the file '$file_path'." - return 1 - fi - - strip_quotes $variable_value -} - -strip_quotes() { - local input="$1" - - # Remove leading and trailing quotes using parameter expansion - local stripped="${input#\"}" - stripped="${stripped%\"}" - - echo "$stripped" -} +# Uninstall uvloop +poetry run pip uninstall -y uvloop # Loop through all command line arguments while [[ $# -gt 0 ]]; do @@ -175,25 +53,18 @@ while [[ $# -gt 0 ]]; do fi done -# Check if script argument was provided -if [[ -z "$script" ]]; then - echo "The --script argument is required." - exit 1 -fi - -branch=$(git branch --show-current) # get current branch. -echo watching branch: $branch -echo pm2 process name: $proc_name - -# Get the current version locally. -current_version=$(read_version_value) - # Check if script is already running with pm2 if pm2 status | grep -q $proc_name; then - echo "The script is already running with pm2. Stopping and restarting..." + echo "The main is already running with pm2. Stopping and restarting..." pm2 delete $proc_name fi +# Check if the update check is already running with pm2 +if pm2 status | grep -q $update_proc_name; then + echo "The update check is already running with pm2. Stopping and restarting..." + pm2 delete $update_proc_name +fi + # Run the Python script with the arguments using pm2 echo "Running $script with the following pm2 config:" @@ -205,85 +76,28 @@ joined_args=${joined_args%,} # Create the pm2 config file echo "module.exports = { - apps : [{ - name : '$proc_name', - script : '$script', - interpreter: 'python3', - min_uptime: '5m', - max_restarts: '5', - args: [$joined_args] - }] -}" > app.config.js + + apps: [ + { + name: '$proc_name', + script: 'poetry', + interpreter: 'python3', + min_uptime: '5m', + max_restarts: '5', + args: ['run', 'python', '$script', $joined_args] + }, + { + name: 'check_updates', + script: './scripts/check_updates.sh', + interpreter: '/bin/bash', + min_uptime: '5m', + max_restarts: '5' + } + ] +};" > app.config.js # Print configuration to be used cat app.config.js pm2 start app.config.js -# Check if packages are installed. -check_package_installed "jq" -if [ "$?" -eq 1 ]; then - while true; do - - # First ensure that this is a git installation - if [ -d "./.git" ]; then - - # check value on github remotely - latest_version=$(check_variable_value_on_github "macrocosm-os/prompting" "prompting/__init__.py" "__version__ ") - - # If the file has been updated - if version_less_than $current_version $latest_version; then - echo "latest version $latest_version" - echo "current version $current_version" - diff=$(get_version_difference $latest_version $current_version) - if [ "$diff" -eq 1 ]; then - echo "current validator version:" "$current_version" - echo "latest validator version:" "$latest_version" - - # Pull latest changes - # Failed git pull will return a non-zero output - if git pull origin $branch; then - # latest_version is newer than current_version, should download and reinstall. - echo "New version published. Updating the local copy." - - # Install latest changes just in case. - pip install -e . - - # # Run the Python script with the arguments using pm2 - # TODO (shib): Remove this pm2 del in the next spec version update. - pm2 del auto_run_validator - echo "Restarting PM2 process" - pm2 restart $proc_name - - # Update current version: - current_version=$(read_version_value) - echo "" - - # Restart autorun script - echo "Restarting script..." - ./$(basename $0) $old_args && exit - else - echo "**Will not update**" - echo "It appears you have made changes on your local copy. Please stash your changes using git stash." - fi - else - # current version is newer than the latest on git. This is likely a local copy, so do nothing. - echo "**Will not update**" - echo "The local version is $diff versions behind. Please manually update to the latest version and re-run this script." - fi - else - echo "**Skipping update **" - echo "$current_version is the same as or more than $latest_version. You are likely running locally." - fi - else - echo "The installation does not appear to be done through Git. Please install from source at https://github.com/macrocosm-os/validators and rerun this script." - fi - - # Wait about 30 minutes - # This should be plenty of time for validators to catch up - # and should prevent any rate limitations by GitHub. - sleep 1800 - done -else - echo "Missing package 'jq'. Please install it for your system first." -fi diff --git a/scripts/check_compatibility.sh b/scripts/check_compatibility.sh deleted file mode 100755 index b0bd6b43..00000000 --- a/scripts/check_compatibility.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -if [ -z "$1" ]; then - echo "Please provide a Python version as an argument." - exit 1 -fi - -python_version="$1" -all_passed=true - -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -check_compatibility() { - all_supported=0 - - while read -r requirement; do - # Skip lines starting with git+ - if [[ "$requirement" == git+* ]]; then - continue - fi - - package_name=$(echo "$requirement" | awk -F'[!=<>]' '{print $1}' | awk -F'[' '{print $1}') # Strip off brackets - echo -n "Checking $package_name... " - - url="https://pypi.org/pypi/$package_name/json" - response=$(curl -s $url) - status_code=$(curl -s -o /dev/null -w "%{http_code}" $url) - - if [ "$status_code" != "200" ]; then - echo -e "${RED}Information not available for $package_name. Failure.${NC}" - all_supported=1 - continue - fi - - classifiers=$(echo "$response" | jq -r '.info.classifiers[]') - requires_python=$(echo "$response" | jq -r '.info.requires_python') - - base_version="Programming Language :: Python :: ${python_version%%.*}" - specific_version="Programming Language :: Python :: $python_version" - - if echo "$classifiers" | grep -q "$specific_version" || echo "$classifiers" | grep -q "$base_version"; then - echo -e "${GREEN}Supported${NC}" - elif [ "$requires_python" != "null" ]; then - if echo "$requires_python" | grep -Eq "==$python_version|>=$python_version|<=$python_version"; then - echo -e "${GREEN}Supported${NC}" - else - echo -e "${RED}Not compatible with Python $python_version due to constraint $requires_python.${NC}" - all_supported=1 - fi - else - echo -e "${YELLOW}Warning: Specific version not listed, assuming compatibility${NC}" - fi - done < requirements.txt - - return $all_supported -} - -echo "Checking compatibility for Python $python_version..." -check_compatibility -if [ $? -eq 0 ]; then - echo -e "${GREEN}All requirements are compatible with Python $python_version.${NC}" -else - echo -e "${RED}All requirements are NOT compatible with Python $python_version.${NC}" - all_passed=false -fi - -echo "" -if $all_passed; then - echo -e "${GREEN}All tests passed.${NC}" -else - echo -e "${RED}All tests did not pass.${NC}" - exit 1 -fi diff --git a/scripts/check_updates.sh b/scripts/check_updates.sh new file mode 100644 index 00000000..45558fe1 --- /dev/null +++ b/scripts/check_updates.sh @@ -0,0 +1,150 @@ +#!/bin/bash + +# Initialize variables +version_location="./prompting/__init__.py" +version="__version__" +proc_name="s1_validator_main_process" +old_args=$@ +branch=$(git branch --show-current) # get current branch. + +# Function definitions +version_less_than_or_equal() { + [ "$1" = "$(echo -e "$1\n$2" | sort -V | head -n1)" ] +} + +version_less_than() { + [ "$1" = "$2" ] && return 1 || version_less_than_or_equal $1 $2 +} + +get_version_difference() { + local tag1="$1" + local tag2="$2" + local version1=$(echo "$tag1" | sed 's/v//') + local version2=$(echo "$tag2" | sed 's/v//') + IFS='.' read -ra version1_arr <<< "$version1" + IFS='.' read -ra version2_arr <<< "$version2" + local diff=0 + for i in "${!version1_arr[@]}"; do + local num1=${version1_arr[$i]} + local num2=${version2_arr[$i]} + if (( num1 > num2 )); then + diff=$((diff + num1 - num2)) + elif (( num1 < num2 )); then + diff=$((diff + num2 - num1)) + fi + done + strip_quotes $diff +} + +read_version_value() { + while IFS= read -r line; do + if [[ "$line" == *"$version"* ]]; then + local value=$(echo "$line" | awk -F '=' '{print $2}' | tr -d ' ') + strip_quotes $value + return 0 + fi + done < "$version_location" + echo "" +} + +check_package_installed() { + local package_name="$1" + local os_name=$(uname -s) + if [[ "$os_name" == "Linux" ]]; then + if dpkg-query -W -f='${Status}' "$package_name" 2>/dev/null | grep -q "installed"; then + return 1 + else + return 0 + fi + elif [[ "$os_name" == "Darwin" ]]; then + if brew list --formula | grep -q "^$package_name$"; then + return 1 + else + return 0 + fi + else + echo "Unknown operating system" + return 0 + fi +} + +check_variable_value_on_github() { + local repo="$1" + local file_path="$2" + local variable_name="$3" + local url="https://github.com/gitapi/repos/$repo/contents/$file_path" + local response=$(curl -s "$url") + if [[ $response =~ "message" ]]; then + echo "Error: Failed to retrieve file contents from GitHub." + return 1 + fi + local content=$(echo "$response" | tr -d '\n' | jq -r '.content') + if [[ "$content" == "null" ]]; then + echo "File '$file_path' not found in the repository." + return 1 + fi + local decoded_content=$(echo "$content" | base64 --decode) + local variable_value=$(echo "$decoded_content" | grep "$variable_name" | awk -F '=' '{print $2}' | tr -d ' ') + if [[ -z "$variable_value" ]]; then + echo "Variable '$variable_name' not found in the file '$file_path'." + return 1 + fi + strip_quotes $variable_value +} + +strip_quotes() { + local input="$1" + local stripped="${input#\"}" + stripped="${stripped%\"}" + echo "$stripped" +} + +update_script() { + if git pull origin $branch; then + echo "New version published. Updating the local copy." + poetry install + pm2 del auto_run_validator + echo "Restarting PM2 process" + pm2 restart $proc_name + current_version=$(read_version_value) + echo "Restarting script..." + ./$(basename $0) $old_args && exit + else + echo "**Will not update**" + echo "It appears you have made changes on your local copy. Please stash your changes using git stash." + fi +} + +check_for_update() { + if [ -d "./.git" ]; then + latest_version=$(check_variable_value_on_github "macrocosm-os/prompting" "prompting/__init__.py" "__version__ ") + current_version=$(read_version_value) + if version_less_than $current_version $latest_version; then + echo "latest version $latest_version" + echo "current version $current_version" + echo "current validator version: $current_version" + echo "latest validator version: $latest_version" + update_script + else + echo "**Skipping update **" + echo "$current_version is the same as or more than $latest_version. You are likely running locally." + fi + else + echo "The installation does not appear to be done through Git. Please install from source at https://github.com/macrocosm-os/prompting and rerun this script." + fi +} + +main() { + check_package_installed "jq" + if [ "$?" -eq 1 ]; then + while true; do + check_for_update + sleep 1800 + done + else + echo "Missing package 'jq'. Please install it for your system first." + fi +} + +# Run the main function +main \ No newline at end of file diff --git a/scripts/client.py b/scripts/client.py index d67a63ff..49445570 100644 --- a/scripts/client.py +++ b/scripts/client.py @@ -3,9 +3,11 @@ import bittensor as bt import time +from loguru import logger from typing import List, Awaitable -from prompting.protocol import StreamPromptingSynapse +from prompting.base.protocol import StreamPromptingSynapse +from prompting.settings import settings """ This has assumed you have: @@ -19,109 +21,64 @@ - Iterate over the async generator to extract the yielded tokens on the server side """ +assert settings.TEST_MINER_IDS, "Please provide the miner ids to query in the .env file as variable TEST_MINER_IDS" -async def handle_response( - uids: List[int], responses: List[Awaitable] -) -> tuple[str, str]: + +async def handle_response(responses: list[Awaitable]) -> List[str]: synapses = [] - for uid_num, resp in enumerate(responses): - ii = 0 + for uid, response in zip(settings.TEST_MINER_IDS, responses): chunk_times = [] start_time = time.time() - chunk_start_time = time.time() - async for chunk in resp: - chunk_time = round(time.time() - chunk_start_time, 3) - bt.logging.info( - f"UID: {uids[uid_num]}. chunk {ii}({chunk_time}s) for resp: {chunk} " - ) - ii += 1 - - chunk_times.append(chunk_time) - chunk_start_time = time.time() - - bt.logging.success( - f"UID {uids[uid_num]} took {(time.time() - start_time):.3f} seconds\n" - ) + i = 0 + async for chunk in response: + chunk_times.append(-start_time + (start_time := time.time())) + logger.info(f"UID: {uid}. chunk {(i := i + 1)} ({chunk_times[-1]:.3f}s) for resp: {chunk}") - synapse = ( - chunk # last object yielded is the synapse itself with completion filled - ) - synapses.append(synapse) + logger.success(f"UID {uid} took {sum(chunk_times):.3f} seconds\n") + if not isinstance(chunk, bt.Synapse): + raise Exception(f"Last object yielded is not a synapse; the miners response did not finish: {chunk}") + synapses.append(chunk) # last object yielded is the synapse itself with completion filled return synapses async def query_stream_miner( - args, synapse_protocol, wallet_name, hotkey, network, netuid, message=None + synapse_protocol: bt.Synapse, + message: str | None = None, ): if message is None: message = "Give me some information about the night sky." - syn = synapse_protocol( + synapse = synapse_protocol( roles=["user"], messages=[message], ) + dendrite = bt.dendrite(wallet=settings.WALLET) + + logger.info(f"Synapse: {synapse}") + + try: + axons = [settings.METAGRAPH.axons[uid] for uid in settings.TEST_MINER_IDS] + responses = await dendrite( # responses is an async generator that yields the response tokens + axons, + synapse, + deserialize=False, + timeout=settings.NEURON_TIMEOUT, + streaming=True, + ) - # create a wallet instance with provided wallet name and hotkey - wallet = bt.wallet(name=wallet_name, hotkey=hotkey) - - # instantiate the metagraph with provided network and netuid - metagraph = bt.metagraph(netuid=netuid, network=network, sync=True, lite=False) - - # Create a Dendrite instance to handle client-side communication. - dendrite = bt.dendrite(wallet=wallet) - - bt.logging.info(f"Synapse: {syn}") - - async def main(): - try: - uids = args.uids - axons = [metagraph.axons[uid] for uid in uids] - responses = await dendrite( # responses is an async generator that yields the response tokens - axons, - syn, - deserialize=False, - timeout=10, - streaming=True, - ) - - return await handle_response(uids, responses) - - except Exception as e: - bt.logging.error(f"Exception during query to uids: {uids}: {e}") - return None + return await handle_response(responses) - await main() + except Exception as e: + logger.exception(e) + logger.error(f"Exception during query to uids: {settings.TEST_MINER_IDS}: {e}") + return None if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Query a Bittensor synapse with given parameters." - ) - - parser.add_argument( - "--uids", - nargs="+", - required=True, - help="UIDs to query.", - default=[1, 2], - type=int, - ) - parser.add_argument("--netuid", type=int, default=102, help="Network Unique ID") - parser.add_argument( - "--wallet_name", type=str, default="default", help="Name of the wallet" - ) - parser.add_argument( - "--hotkey", type=str, default="default", help="Hotkey for the wallet" - ) - parser.add_argument( - "--network", - type=str, - default="test", - help='Network type, e.g., "test" or "mainnet"', - ) + parser = argparse.ArgumentParser(description="Query a Bittensor synapse with given parameters.") parser.add_argument( "--message", @@ -136,12 +93,7 @@ async def main(): # Running the async function with provided arguments asyncio.run( query_stream_miner( - args, synapse_protocol=StreamPromptingSynapse, - wallet_name=args.wallet_name, - hotkey=args.hotkey, - network=args.network, - netuid=args.netuid, message=args.message, ) ) diff --git a/scripts/run.py b/scripts/run.py deleted file mode 100644 index e0a0ea66..00000000 --- a/scripts/run.py +++ /dev/null @@ -1,105 +0,0 @@ -import subprocess - -coldkey = "sn1-test" -netuid = 61 -network = "test" - -miners = [ - # Mock (static) - { - "hotkey": "m1", - "port": 9001, - "file": "neurons/miners/test/mock.py", - "type": "mock", - }, - { - "hotkey": "m2", - "port": 9002, - "file": "neurons/miners/test/mock.py", - "type": "mock", - }, - # Echo - { - "hotkey": "m3", - "port": 9003, - "file": "neurons/miners/test/echo.py", - "type": "echo", - }, - { - "hotkey": "m4", - "port": 9004, - "file": "neurons/miners/test/echo.py", - "type": "echo", - }, - { - "hotkey": "m5", - "port": 9005, - "file": "neurons/miners/test/echo.py", - "type": "echo", - }, - # Phrase - { - "hotkey": "m6", - "port": 9006, - "file": "neurons/miners/test/phrase.py", - "type": "phrase", - "config": '--neuron.phrase "That is an excellent question"', - }, - { - "hotkey": "m7", - "port": 9007, - "file": "neurons/miners/test/phrase.py", - "type": "phrase", - "config": '--neuron.phrase "Could you repeat that?"', - }, - { - "hotkey": "m8", - "port": 9008, - "file": "neurons/miners/test/phrase.py", - "type": "phrase", - "config": '--neuron.phrase "And so it goes..."', - }, - { - "hotkey": "m9", - "port": 9009, - "file": "neurons/miners/test/phrase.py", - "type": "phrase", - "config": '--neuron.phrase "You and me baby ain\'t nothing but mammals"', - }, - { - "hotkey": "m10", - "port": 9010, - "file": "neurons/miners/test/phrase.py", - "type": "phrase", - "config": "--neuron.phrase \"I'm sorry Dave, I'm afraid I can't do that\"", - }, -] - -validators = [ - { - "hotkey": "v1", - "port": 9000, - "file": "neurons/validator.py", - "type": "real", - "config": "--neuron.log_full --neuron.sample_size 5 --neuron.device cuda", - }, - { - "hotkey": "v2", - "port": 9011, - "file": "neurons/validator.py", - "type": "mock", - "config": "--neuron.log_full --neuron.sample_size 5 --neuron.model_id mock", - }, -] - -neurons = miners + validators - -for neuron in neurons: - # Construct the PM2 start command - command = ( - f"pm2 start {neuron['file']} --interpreter python3 --name {neuron['hotkey']}:{neuron['type']} --" - + f" --wallet.name {coldkey} --wallet.hotkey {neuron['hotkey']} --subtensor.network {network} --netuid {netuid}" - + f" --axon.port {neuron['port']} --logging.debug {neuron.get('config')}" - ) - print(command) - subprocess.run(command, shell=True) diff --git a/setup.py b/setup.py deleted file mode 100644 index 4a80a081..00000000 --- a/setup.py +++ /dev/null @@ -1,100 +0,0 @@ -# The MIT License (MIT) -# Copyright © 2024 Yuma Rao -# Copyright © 2023 Opentensor Foundation - -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the “Software”), to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of -# the Software. - -# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -# THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -import re -import os -import codecs -import pathlib -from os import path -from io import open -from setuptools import setup, find_packages -from pkg_resources import parse_requirements - - -def read_requirements(path): - with open(path, "r") as f: - requirements = f.read().splitlines() - processed_requirements = [] - for req in requirements: - # For git or other VCS links - if req.startswith("git+") or "@" in req: - # check if "egg=" is present in the requirement string - if "egg=" in req: - pkg_name = re.search(r"egg=([a-zA-Z0-9_-]+)", req.strip()) - if pkg_name: - pkg_name = pkg_name.group(1) - processed_requirements.append(pkg_name + " @ " + req.strip()) - else: # handle git links without "egg=" - # extracting package name from URL assuming it is the last part of the URL before any @ symbol - pkg_name = re.search(r"/([a-zA-Z0-9_-]+)(\.git)?(@|$)", req) - if pkg_name: - pkg_name = pkg_name.group(1) - processed_requirements.append(pkg_name + " @ " + req.strip()) - else: - processed_requirements.append(req) - return processed_requirements - - -requirements = read_requirements("requirements.txt") -here = path.abspath(path.dirname(__file__)) - -with open(path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - -# loading version from setup.py -with codecs.open( - os.path.join(here, "prompting/__init__.py"), encoding="utf-8" -) as init_file: - version_match = re.search( - r"^__version__ = ['\"]([^'\"]*)['\"]", init_file.read(), re.M - ) - version_string = version_match.group(1) - -setup( - name="prompting", - version=version_string, - description="SN1: An incentive mechanism for internet-scale conversational intelligence", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/opentensor/prompting", - author="bittensor.com", - packages=find_packages(), - include_package_data=True, - author_email="", - license="MIT", - python_requires=">=3.8", - install_requires=requirements, - classifiers=[ - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Topic :: Scientific/Engineering", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Software Development", - "Topic :: Software Development :: Libraries", - "Topic :: Software Development :: Libraries :: Python Modules", - ], -) diff --git a/tests/fixtures/cleaner.py b/tests/fixtures/cleaner.py index ac55700d..35c08384 100644 --- a/tests/fixtures/cleaner.py +++ b/tests/fixtures/cleaner.py @@ -1,9 +1,3 @@ -from prompting.cleaners import CleanerPipeline +from prompting.utils.cleaners import RemoveQuotes, PruneEnding, RemoveRoles, CleanerPipeline -DEFAULT_CLEANER_PIPELINE = CleanerPipeline( - [ - dict(name="remove_quotes"), - dict(name="prune_ending"), - dict(name="remove_roles"), - ] -) +DEFAULT_CLEANER_PIPELINE = CleanerPipeline(cleaning_pipeline=[RemoveQuotes, PruneEnding, RemoveRoles]) diff --git a/tests/fixtures/dataset.py b/tests/fixtures/dataset.py index c83fa25e..eda24a62 100644 --- a/tests/fixtures/dataset.py +++ b/tests/fixtures/dataset.py @@ -1,4 +1,4 @@ -from prompting.tools.datasets import ( +from prompting.datasets import ( MockDataset, HFCodingDataset, WikiDataset, @@ -14,11 +14,13 @@ MathDataset, ] + def select_first(list): return list[0] + MOCK_CONTEXT = MockDataset().next() -WIKI_CONTEXT= WikiDataset().next(name="Emilio Alvarez (bishop)", method="get", selector=select_first) +WIKI_CONTEXT = WikiDataset().next(name="Emilio Alvarez (bishop)", method="get", selector=select_first) CODING_CONTEXT = HFCodingDataset(buffer_size=1, seed=42).next() MATH_CONTEXT = MathDataset(seed=123).next() DATEQA_CONTEXT = WikiDateDataset(seed=123).next() diff --git a/tests/fixtures/llm.py b/tests/fixtures/llm.py index 19ba16a6..b7a60cd4 100644 --- a/tests/fixtures/llm.py +++ b/tests/fixtures/llm.py @@ -1,17 +1,17 @@ from prompting.mock import MockPipeline -from prompting.llms import vLLM_LLM, HuggingFaceLLM, HuggingFacePipeline, vLLMPipeline +from prompting.llms.vllm_llm import vLLM_LLM, vLLMPipeline -def mock_llm_pipeline(): - return MockPipeline("This is just another test.") +def mock_llm_pipeline(message="This is just another test."): + return MockPipeline(message) def llms(): pipeline = MockPipeline("This is just another test.") - llms = [vLLM_LLM(pipeline, ""), HuggingFaceLLM(pipeline, "")] + llms = [vLLM_LLM(pipeline, "")] return llms def pipelines(): # Return pipeline types to be instantiated downstream - return [HuggingFacePipeline, vLLMPipeline] + return [vLLMPipeline] diff --git a/tests/fixtures/task.py b/tests/fixtures/task.py deleted file mode 100644 index af6e9d05..00000000 --- a/tests/fixtures/task.py +++ /dev/null @@ -1,56 +0,0 @@ -from prompting.tasks import ( - Task, - MockTask, - QuestionAnsweringTask, - SummarizationTask, - DebuggingTask, - MathTask, - DateQuestionAnsweringTask, - TranslationTask -) -from prompting.shared import Context -from .dataset import WIKI_CONTEXT, CODING_CONTEXT, MATH_CONTEXT, DATEQA_CONTEXT, MOCK_CONTEXT - -TASKS = [ - MockTask, - QuestionAnsweringTask, - SummarizationTask, - DebuggingTask, - MathTask, - DateQuestionAnsweringTask, - #TODO: Add proper separation for tranlation task tests - #TranslationTask -] - -CONTEXTS = { - MockTask: MOCK_CONTEXT, - QuestionAnsweringTask: WIKI_CONTEXT, - SummarizationTask: WIKI_CONTEXT, - DebuggingTask: CODING_CONTEXT, - MathTask: MATH_CONTEXT, - DateQuestionAnsweringTask: DATEQA_CONTEXT, - #TranslationTask: WIKI_CONTEXT -} - -TASK_FIELDS = { - "name": str, - "desc": str, - "goal": str, - "query": str, - "topic": str, - "subtopic": str, - "tags": list, - "context": Context, - "reward_definition": list, - "reference": str, - #'reward_threshold': float , - "penalty_definition": list, - # 'criteria': str = ("",), - "delimiter": str, - "complete": bool, - "static_reference": bool, - "static_query": bool, - "reference_prompt": str, - "query_system_prompt": str, - "query_prompt": str, -} diff --git a/tests/test_agent.py b/tests/test_agent.py index 3bc64f66..fc71a5cd 100644 --- a/tests/test_agent.py +++ b/tests/test_agent.py @@ -34,9 +34,7 @@ def test_agent_creation_with_dataset_context(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) assert agent is not None @@ -44,9 +42,7 @@ def test_agent_creation_with_dataset_context(task: Task): def test_agent_contains_persona(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) assert agent.persona is not None @@ -68,9 +64,7 @@ def test_user_can_set_agent_persona(task: Task): def test_agent_contains_task(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) assert agent.task is not None @@ -78,9 +72,7 @@ def test_agent_contains_task(task: Task): def test_agent_has_system_prompt(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) assert agent.system_prompt is not None @@ -119,9 +111,7 @@ def test_agent_can_make_challenges(task: Task, begin_conversation: bool): def test_agent_progress_is_zero_on_init(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) assert agent.progress == 0 @@ -130,9 +120,7 @@ def test_agent_progress_is_one_when_task_is_complete(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) task.complete = True - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) assert agent.progress == 1 @@ -141,10 +129,8 @@ def test_agent_finished_is_true_when_task_is_complete(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) task.complete = True - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) - assert agent.finished == True + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) + assert agent.finished is True @pytest.mark.parametrize("task", TASKS) @@ -152,7 +138,5 @@ def test_agent_finished_is_false_when_task_is_not_complete(task: Task): context = CONTEXTS[task] task = task(llm_pipeline=mock_llm_pipeline(), context=context) task.complete = False - agent = HumanAgent( - llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True - ) - assert agent.finished == False + agent = HumanAgent(llm_pipeline=mock_llm_pipeline(), task=task, begin_conversation=True) + assert agent.finished is False diff --git a/tests/test_benchmark_task.py b/tests/test_benchmark_task.py new file mode 100644 index 00000000..95a607ee --- /dev/null +++ b/tests/test_benchmark_task.py @@ -0,0 +1,125 @@ +import pytest + +from types import SimpleNamespace +from itertools import permutations +from prompting.tasks.multi_choice import MultiChoiceTask +from prompting.utils.exceptions import TaskCreationError +from prompting.rewards import MultipleChoiceModel + +from .fixtures.llm import mock_llm_pipeline +from .fixtures.dataset import MOCK_CONTEXT + +QUESTION = "What is the capital of Texas?" +OPTIONS = ["Austin", "Houston", "Paris", "Bogota"] + +def make_multiple_choice_examples(question, options, correct_index, markers=None, base_marker=''): + """Creates a multiple choice question (query) + answer (reference) pairs for different formatting variations of the question""" + + messages = [] + correct = options[correct_index] + letters = ["A", "B", "C", "D"] + formats = [ + "{letter}. {option}", + "{letter}: {option}", + "{letter}) {option}", + "{letter}] {option}", + "({letter}) {option}", + ] + markers = ["*","* "," *"] if markers is None else markers + + for ordering in permutations(options): + reference = letters[ordering.index(correct)] + for form in formats: + for marker in markers: + for newlines in ["\n", "\n\n"]: + query = f"{question}{newlines}" + for letter, option in zip(letters, ordering): + indicator = marker if option == correct else base_marker + query += f"{indicator}{form.format(letter=letter, option=option)}\n" + messages.append((query, reference)) + + return messages + +# we slice the (very large) lists to reduce the number of unnecessary tests while maintaining deterministic behaviour +good_query_examples = make_multiple_choice_examples(QUESTION, OPTIONS, correct_index=0)[::11] +missing_marker_examples = make_multiple_choice_examples(QUESTION, OPTIONS, correct_index=0, markers=[""])[::17] +multiple_marker_examples = make_multiple_choice_examples(QUESTION, OPTIONS, 0, base_marker="*")[::17] + + +@pytest.mark.parametrize( + "message, reference", good_query_examples +) +def test_extract_query_and_reference_with_successful_generations( + message: str, reference: str +): + task = MultiChoiceTask(llm_pipeline=mock_llm_pipeline(message), context=MOCK_CONTEXT) + assert task.query == "\n".join([line.strip("* ") for line in message.splitlines()]) + assert task.reference == reference + + +@pytest.mark.parametrize( + "message, reference", missing_marker_examples +) +def test_extract_query_and_reference_with_missing_correct_answer_marker(message: str, reference: str): + with pytest.raises(TaskCreationError): + task = MultiChoiceTask(llm_pipeline=mock_llm_pipeline(message), context=MOCK_CONTEXT) + + +@pytest.mark.parametrize( + "message, reference", multiple_marker_examples +) +def test_extract_query_and_reference_with_multiple_correct_answer_markers( + message: str, reference: str +): + with pytest.raises(TaskCreationError): + task = MultiChoiceTask(llm_pipeline=mock_llm_pipeline(message), context=MOCK_CONTEXT) + + +answers_templates = [ + "The correct answer is {reference}", + "The correct answer: {reference}.", + "{reference} is the correct answer.", + "{reference} is correct because I saw the answer online.", + "The most likely correct answer is {reference}.", + "I don't know if it's A or B. But I'm going to just take a chance and guess {reference}..." + "A, B are interesting ideas. Not sure about C. D is dumb. My final answer is {reference}.", +] + +@pytest.mark.parametrize( + "message, reference", good_query_examples +) +@pytest.mark.parametrize( + "answer_template", answers_templates +) +def test_correct_answer_scores_one(message, reference, answer_template): + reward_model = MultipleChoiceModel() + + task = MultiChoiceTask(llm_pipeline=mock_llm_pipeline(message), context=MOCK_CONTEXT) + + # form a synthetic answer by filling in the template with the correct reference (e.g A) + response = answer_template.format(reference=reference) + response_event = SimpleNamespace(completions=[response]) + batch_reward_output = reward_model.reward(reference, response_event) + + assert all(reward == 1 for reward in batch_reward_output.rewards) + + +@pytest.mark.parametrize( + "message, reference", good_query_examples +) +@pytest.mark.parametrize( + "answer_template", answers_templates +) +def test_incorrect_answer_scores_zero(message, reference, answer_template): + reward_model = MultipleChoiceModel() + + task = MultiChoiceTask(llm_pipeline=mock_llm_pipeline(message), context=MOCK_CONTEXT) + + # Choose the wrong answer + wrong_answer = "A" if reference!="A" else "B" + # form a synthetic answer by filling in the template with the correct reference (e.g A) + response = answer_template.format(reference=wrong_answer) + response_event = SimpleNamespace(completions=[response]) + batch_reward_output = reward_model.reward(reference, response_event) + + assert all(reward == 0 for reward in batch_reward_output.rewards) diff --git a/tests/test_cleaner_pipeline.py b/tests/test_cleaner_pipeline.py index 54c37020..a7f57b17 100644 --- a/tests/test_cleaner_pipeline.py +++ b/tests/test_cleaner_pipeline.py @@ -1,37 +1,26 @@ -from prompting.cleaners.cleaner import CleanerPipeline +from prompting.utils.cleaners import CleanerPipeline +from prompting.utils.cleaners import RemoveQuotes, PruneEnding, RemoveRoles def test_cleaning_pipeline(): - cleaning_pipeline = [ - dict(name="remove_quotes"), - dict(name="prune_ending"), - dict(name="remove_roles"), - ] - - generation = ( - '"I am a quote. User: I know you are. I am asking a question. What is th"' - ) + cleaning_pipeline = [RemoveQuotes, PruneEnding, RemoveRoles] + + generation = '"I am a quote. User: I know you are. I am asking a question. What is th"' answer = "I am a quote. I know you are. I am asking a question." - clean_generation = CleanerPipeline(cleaning_pipeline=cleaning_pipeline).apply( - generation=generation - ) + clean_generation = CleanerPipeline(cleaning_pipeline=cleaning_pipeline).apply(generation=generation) assert clean_generation == answer def test_phrase_without_any_punctuation(): # arrange - cleaning_pipeline = [ - dict(name="prune_ending"), - ] + cleaning_pipeline = [PruneEnding] generation = "Austin is the capital of texas" # act - clean_generation = CleanerPipeline(cleaning_pipeline=cleaning_pipeline).apply( - generation=generation - ) + clean_generation = CleanerPipeline(cleaning_pipeline=cleaning_pipeline).apply(generation=generation) # assert assert clean_generation == generation diff --git a/tests/test_dataset.py b/tests/test_dataset.py index 9d208bd1..d4ebe570 100644 --- a/tests/test_dataset.py +++ b/tests/test_dataset.py @@ -1,7 +1,7 @@ import pytest from .fixtures.dataset import DATASETS, CONTEXTS, CONTEXT_FIELDS -from prompting.tools.datasets import Dataset +from prompting.datasets import Dataset from prompting.shared import Context @@ -36,7 +36,7 @@ def test_dataset_methods_return_contexts(dataset: Dataset, method: str): @pytest.mark.parametrize("dataset", DATASETS) def test_context_is_of_type_context_class(dataset: Dataset): - assert type(CONTEXTS[dataset]) == Context + assert isinstance(CONTEXTS[dataset], Context) @pytest.mark.parametrize("dataset", DATASETS) @@ -47,9 +47,7 @@ def test_context_contains_expected_field(dataset: Dataset, field: str): @pytest.mark.parametrize("dataset", DATASETS) @pytest.mark.parametrize("field, expected_type", list(CONTEXT_FIELDS.items())) -def test_context_field_has_expected_types( - dataset: Dataset, field: str, expected_type: type -): +def test_context_field_has_expected_types(dataset: Dataset, field: str, expected_type: type): assert isinstance(getattr(CONTEXTS[dataset], field), expected_type) @@ -60,8 +58,6 @@ def test_context_field_is_not_null(dataset: Dataset, field: str): @pytest.mark.parametrize("dataset", DATASETS) -@pytest.mark.parametrize( - "field", ("fetch_time", "num_tries", "fetch_method", "next_kwargs") -) +@pytest.mark.parametrize("field", ("fetch_time", "num_tries", "fetch_method", "next_kwargs")) def test_context_stats_field_contains_expected_keys(dataset: Dataset, field: str): assert field in CONTEXTS[dataset].stats diff --git a/tests/test_forward.py b/tests/test_forward.py index 36d93495..899cc185 100644 --- a/tests/test_forward.py +++ b/tests/test_forward.py @@ -10,12 +10,10 @@ from prompting.protocol import StreamPromptingSynapse from prompting.tasks import TASKS -sys.argv = [__file__, "--mock", "--wandb.off", "--neuron.tasks", "qa"] +sys.argv = [__file__, "--mock", "--neuron.tasks", "qa"] mock_neuron = Validator() -task = QuestionAnsweringTask( - llm_pipeline=mock_neuron.llm_pipeline, context=WIKI_CONTEXT, create_reference=False -) +task = QuestionAnsweringTask(llm_pipeline=mock_neuron.llm_pipeline, context=WIKI_CONTEXT, create_reference=False) def generate_reference(x, delay=1): @@ -25,14 +23,14 @@ def generate_reference(x, delay=1): async def mock_dendrite_call(delay=1, **kwargs): asyncio.run(asyncio.sleep(delay)) - - async def async_fn_mock(): + + async def async_fn_mock(): mock_synapse = StreamPromptingSynapse(roles=["user"], messages=[""]) mock_synapse.completion = "Fake response" - + yield mock_synapse - - mock_stream_synapse = async_fn_mock() + + mock_stream_synapse = async_fn_mock() return [mock_stream_synapse] @@ -40,9 +38,7 @@ async def async_fn_mock(): "generate_reference_time, dendrite_time, expected_forward_time", [(0.5, 0.5, 0.5), (0.5, 0.4, 0.5), (0.4, 0.5, 0.5)], ) -def test_generate_reference_parallel_to_dendrite( - generate_reference_time, dendrite_time, expected_forward_time -): +def test_generate_reference_parallel_to_dendrite(generate_reference_time, dendrite_time, expected_forward_time): task.generate_reference = partial(generate_reference, delay=generate_reference_time) mock_agent = HumanAgent(task, mock_neuron.llm_pipeline) @@ -51,15 +47,12 @@ def test_generate_reference_parallel_to_dendrite( event = asyncio.run(run_step(self=mock_neuron, agent=mock_agent, roles=[], messages=[], k=4, timeout=0.1)) step_time = event["step_time"] - reward_pipeline_time = sum( - event[key] for key in event if key.endswith("batch_time") - ) + reward_pipeline_time = sum(event[key] for key in event if key.endswith("batch_time")) network_and_reference_gen_time = step_time - reward_pipeline_time # TODO: Fix unit test to work with abs=0.1 - assert network_and_reference_gen_time == pytest.approx( - expected_forward_time, abs=1#0.1 - ) + assert network_and_reference_gen_time == pytest.approx(expected_forward_time, abs=1) # 0.1 + def test_single_turn_tasks_in_tasks(): # Test that SINGLE_TURN_TASKS is a subset of TASKS.keys() diff --git a/tests/test_llm.py b/tests/test_llm.py index 4d26c2d5..03cdca36 100644 --- a/tests/test_llm.py +++ b/tests/test_llm.py @@ -1,6 +1,7 @@ import pytest -from prompting.llms import BaseLLM, BasePipeline, load_vllm_pipeline +from prompting.llms.base_llm import BaseLLM, BasePipeline +from prompting.llms.vllm_llm import load_vllm_pipeline from prompting.llms.utils import ( contains_gpu_index_in_device, calculate_gpu_requirements, @@ -14,8 +15,6 @@ from .fixtures.llm import llms, pipelines from .fixtures.cleaner import DEFAULT_CLEANER_PIPELINE -from vllm import LLM - @pytest.mark.parametrize( "input, expected_result, cleaner", @@ -33,9 +32,7 @@ ], ) @pytest.mark.parametrize("llm", llms()) -def test_llm_clean_response( - input: str, expected_result: str, cleaner: CleanerPipeline, llm: BaseLLM -): +def test_llm_clean_response(input: str, expected_result: str, cleaner: CleanerPipeline, llm: BaseLLM): result = llm.clean_response(cleaner=cleaner, response=input) assert result == expected_result @@ -79,9 +76,7 @@ def test_llm_forward(llm: BaseLLM): assert llm.messages[0]["role"] == "system" -@pytest.mark.parametrize( - "device, expected_result", [("cpu", False), ("cuda", False), ("cuda:0", True)] -) +@pytest.mark.parametrize("device, expected_result", [("cpu", False), ("cuda", False), ("cuda:0", True)]) def test_contains_gpu_index_in_device(device: str, expected_result: bool): result = contains_gpu_index_in_device(device) assert result == expected_result @@ -110,7 +105,9 @@ def test_calculate_gpu_requirements( mock_mem_get_info.return_value = (available_memory, available_memory) # Mock current_device to return a default device index if needed mock_current_device.return_value = 0 - result = calculate_gpu_requirements(device=device, gpus=1, max_allowed_memory_allocation_in_bytes=max_allowed_memory_allocation_in_bytes) + result = calculate_gpu_requirements( + device=device, gpus=1, max_allowed_memory_allocation_in_bytes=max_allowed_memory_allocation_in_bytes + ) assert result == expected_result @@ -133,9 +130,7 @@ def test_calulate_gpu_requirements_raises_cuda_error( # Test 1: Success on first attempt @patch("prompting.llms.vllm_llm.calculate_gpu_requirements") @patch("prompting.llms.vllm_llm.LLM") -def test_load_vllm_pipeline_success( - mock_llm, mock_calculate_gpu_requirements -): +def test_load_vllm_pipeline_success(mock_llm, mock_calculate_gpu_requirements): # Mocking calculate_gpu_requirements to return a fixed value mock_calculate_gpu_requirements.return_value = 5e9 # Example value @@ -153,11 +148,10 @@ def test_load_vllm_pipeline_success( # Setting the return value of the LLM mock to the mock LLM instance mock_llm.return_value = mock_llm_instance - - + result = load_vllm_pipeline(model_id="test_name", device="cuda", gpus=1, max_allowed_memory_in_gb=0) assert isinstance(result, MagicMock) # or any other assertion you find suitable mock_llm.assert_called_once() # Ensures LLM was called exactly once - + # Verify the nested property (Specific assert for llama3) assert result.llm_engine.tokenizer.eos_token_id == 128009 diff --git a/tests/test_mock.py b/tests/test_mock.py index 7ae6f860..58392184 100644 --- a/tests/test_mock.py +++ b/tests/test_mock.py @@ -23,12 +23,10 @@ def test_mock_subtensor(netuid, n, wallet): assert len(neurons) == (n + 1 if wallet is not None else n) # Check wallet if wallet is not None: - assert subtensor.is_hotkey_registered( - netuid=netuid, hotkey_ss58=wallet.hotkey.ss58_address - ) + assert subtensor.is_hotkey_registered(netuid=netuid, hotkey_ss58=wallet.hotkey.ss58_address) for neuron in neurons: - assert type(neuron) == bt.NeuronInfo + assert type(neuron) is bt.NeuronInfo assert subtensor.is_hotkey_registered(netuid=netuid, hotkey_ss58=neuron.hotkey) @@ -41,7 +39,7 @@ def test_mock_metagraph(n): assert len(axons) == n # Check ip and port for axon in axons: - assert type(axon) == bt.AxonInfo + assert type(axon) is bt.AxonInfo assert axon.ip == mock_metagraph.DEFAULT_IP assert axon.port == mock_metagraph.DEFAULT_PORT @@ -70,9 +68,7 @@ def test_mock_dendrite_timings(timeout, min_time, max_time, n): async def run(): return await mock_dendrite( axons, - synapse=StreamPromptingSynapse( - roles=["user"], messages=["What is the capital of France?"] - ), + synapse=StreamPromptingSynapse(roles=["user"], messages=["What is the capital of France?"]), timeout=timeout, deserialize=False, ) @@ -80,9 +76,7 @@ async def run(): eps = 0.2 responses = asyncio.run(run()) for synapse in responses: - assert ( - hasattr(synapse, "dendrite") and type(synapse.dendrite) == bt.TerminalInfo - ) + assert hasattr(synapse, "dendrite") and type(synapse.dendrite) is bt.TerminalInfo dendrite = synapse.dendrite # check synapse.dendrite has (process_time, status_code, status_message) @@ -102,5 +96,5 @@ async def run(): assert dendrite.status_code == 200 assert dendrite.status_message == "OK" # check that completions are not empty for successful responses - assert type(synapse.completion) == str and len(synapse.completion) > 0 + assert isinstance(synapse.completion, str) and len(synapse.completion) > 0 # dont check for responses which take between timeout and max_time because they are not guaranteed to have a status code of 200 or 408 diff --git a/tests/test_registry.py b/tests/test_registry.py index 49c72fd2..79d0a1c5 100644 --- a/tests/test_registry.py +++ b/tests/test_registry.py @@ -7,20 +7,13 @@ def test_task_registry(): registry_missing_task = set(TASK_REGISTRY.keys()) - set(TASKS.keys()) registry_extra_task = set(TASKS.keys()) - set(TASK_REGISTRY.keys()) - assert ( - not registry_missing_task - ), f"Missing tasks in TASK_REGISTRY: {registry_missing_task}" + assert not registry_missing_task, f"Missing tasks in TASK_REGISTRY: {registry_missing_task}" assert not registry_extra_task, f"Extra tasks in TASK_REGISTRY: {registry_extra_task}" + def test_task_registry_datasets(): - registry_datasets = set( - [dataset for task, datasets in TASK_REGISTRY.items() for dataset in datasets] - ) + registry_datasets = set([dataset for task, datasets in TASK_REGISTRY.items() for dataset in datasets]) registry_missing_dataset = registry_datasets - set(DATASETS.keys()) registry_extra_dataset = set(DATASETS.keys()) - registry_datasets - assert ( - not registry_missing_dataset - ), f"Missing datasets in TASK_REGISTRY: {registry_missing_dataset}" - assert ( - not registry_extra_dataset - ), f"Extra datasets in TASK_REGISTRY: {registry_extra_dataset}" + assert not registry_missing_dataset, f"Missing datasets in TASK_REGISTRY: {registry_missing_dataset}" + assert not registry_extra_dataset, f"Extra datasets in TASK_REGISTRY: {registry_extra_dataset}" diff --git a/tests/test_reward.py b/tests/test_reward.py index d074fb9f..ea8d8163 100644 --- a/tests/test_reward.py +++ b/tests/test_reward.py @@ -3,6 +3,7 @@ from unittest.mock import MagicMock from prompting.rewards import StreamingRewardModel + @pytest.mark.parametrize( "all_tokens_per_chunk, expected_rewards", [ @@ -12,19 +13,21 @@ ([[2, 2, 2, 1, 1]], [0.75]), # Three chunks exceed ([[2, 2, 2, 2, 1]], [1]), # Four chunks exceed ([[2, 2, 2, 2, 2, 2]], [1]), # Sum of chunks > 1, clipped at 1 - ] + ], ) def test_streaming_reward_model(all_tokens_per_chunk, expected_rewards): max_tokens_per_chunk = 1 response_event = MagicMock() response_event.stream_results_all_tokens_per_chunk = all_tokens_per_chunk - + model = StreamingRewardModel(max_tokens_per_chunk) output = model.reward("", response_event) - assert torch.allclose(output.rewards, torch.tensor(expected_rewards, dtype=torch.float)), \ - f"Expected rewards {expected_rewards} but got {output.rewards.tolist()}" + assert torch.allclose( + output.rewards, torch.tensor(expected_rewards, dtype=torch.float) + ), f"Expected rewards {expected_rewards} but got {output.rewards}" + if __name__ == "__main__": - pytest.main() \ No newline at end of file + pytest.main() diff --git a/tests/test_scoring.py b/tests/test_scoring.py index 6fed49ae..5b4b4269 100644 --- a/tests/test_scoring.py +++ b/tests/test_scoring.py @@ -2,12 +2,9 @@ from datetime import datetime from prompting.rewards import ( DateRewardModel, - DiffRewardModel, - RelevanceRewardModel, - RougeRewardModel, FloatDiffModel, - RewardPipeline, ) +from prompting.rewards.pipeline import RewardPipeline date1 = datetime.strptime("2022-01-01", "%Y-%m-%d") date2 = datetime.strptime("2022-01-03", "%Y-%m-%d") @@ -23,9 +20,7 @@ scores3 = [0.0] * len(dates3) dates4 = [date4.strftime(format) for format in date_formats] scores4 = [0.38251018447178037] * len(dates4) -tuples = list( - zip(dates1 + dates2 + dates3 + dates4, scores1 + scores2 + scores3 + scores4) -) +tuples = list(zip(dates1 + dates2 + dates3 + dates4, scores1 + scores2 + scores3 + scores4)) @pytest.mark.parametrize("reference", dates1) @@ -41,9 +36,7 @@ def test_score_dates_with_different_format(reference, completion, expected_resul @pytest.mark.parametrize("reference", reference) -@pytest.mark.parametrize( - "completion, expected_result", zip(completion, expected_result) -) +@pytest.mark.parametrize("completion, expected_result", zip(completion, expected_result)) def test_math_score_expression_parsing(reference, completion, expected_result): score = FloatDiffModel().math_score(reference, completion) assert score == expected_result @@ -55,12 +48,8 @@ def test_math_score_expression_parsing(reference, completion, expected_result): @pytest.mark.parametrize("reference", reference) -@pytest.mark.parametrize( - "completion, expected_result", zip(completion, expected_result) -) -def test_math_score_expression_parsing_with_exponents( - reference, completion, expected_result -): +@pytest.mark.parametrize("completion, expected_result", zip(completion, expected_result)) +def test_math_score_expression_parsing_with_exponents(reference, completion, expected_result): score = FloatDiffModel().math_score(reference, completion) assert score == expected_result @@ -71,12 +60,8 @@ def test_math_score_expression_parsing_with_exponents( @pytest.mark.parametrize("reference", reference) -@pytest.mark.parametrize( - "completion, expected_result", zip(completion, expected_result) -) -def test_math_score_expression_parsing_with_punctuation( - reference, completion, expected_result -): +@pytest.mark.parametrize("completion, expected_result", zip(completion, expected_result)) +def test_math_score_expression_parsing_with_punctuation(reference, completion, expected_result): score = FloatDiffModel().math_score(reference, completion) assert score == expected_result @@ -87,12 +72,8 @@ def test_math_score_expression_parsing_with_punctuation( @pytest.mark.parametrize("reference", reference) -@pytest.mark.parametrize( - "completion, expected_result", zip(completion, expected_result) -) -def test_math_score_expression_parsing_with_negative_numbers( - reference, completion, expected_result -): +@pytest.mark.parametrize("completion, expected_result", zip(completion, expected_result)) +def test_math_score_expression_parsing_with_negative_numbers(reference, completion, expected_result): score = FloatDiffModel().math_score(reference, completion) assert score == expected_result @@ -103,11 +84,7 @@ def test_math_score_expression_parsing_with_negative_numbers( @pytest.mark.parametrize("reference", reference) -@pytest.mark.parametrize( - "completion, expected_result", zip(completion, expected_result) -) -def test_math_score_expression_parsing_with_zeros( - reference, completion, expected_result -): +@pytest.mark.parametrize("completion, expected_result", zip(completion, expected_result)) +def test_math_score_expression_parsing_with_zeros(reference, completion, expected_result): score = FloatDiffModel().math_score(reference, completion) assert score == expected_result diff --git a/tests/test_streaming.py b/tests/test_streaming.py index bcee0d75..2bd7fde1 100644 --- a/tests/test_streaming.py +++ b/tests/test_streaming.py @@ -30,9 +30,7 @@ async def handle_response(responses) -> List[StreamPromptingSynapse]: print(f"\nchunk {ii} for resp {resp_idx}: {chunk}", end="", flush=True) ii += 1 - synapse = ( - chunk # last object yielded is the synapse itself with completion filled - ) + synapse = chunk # last object yielded is the synapse itself with completion filled synapses.append(synapse) return synapses @@ -57,9 +55,7 @@ def test_mock_streaming(timeout: float): messages=messages, ) - async def get_responses( - synapse: StreamPromptingSynapse, timeout: float - ) -> List[AsyncGenerator]: + async def get_responses(synapse: StreamPromptingSynapse, timeout: float) -> List[AsyncGenerator]: return await mock_dendrite( # responses is an async generator that yields the response tokens axons=mock_metagraph.axons, synapse=synapse, diff --git a/tests/test_tasks.py b/tests/test_tasks.py index e0d0a9b9..f9cd6c9e 100644 --- a/tests/test_tasks.py +++ b/tests/test_tasks.py @@ -42,14 +42,12 @@ def test_task_field_is_not_null(task: Task, field: str): @pytest.mark.parametrize("task", TASKS) def test_task_complete_is_false_on_init(task: Task): task = task(llm_pipeline=mock_llm_pipeline(), context=CONTEXTS[task]) - assert task.complete == False + assert task.complete is False @pytest.mark.parametrize("task", TASKS) def test_task_contains_no_reference_if_not_static(task: Task): - task( - llm_pipeline=mock_llm_pipeline(), context=CONTEXTS[task], create_reference=False - ) + task(llm_pipeline=mock_llm_pipeline(), context=CONTEXTS[task], create_reference=False) assert task.static_reference or not task.reference @@ -69,7 +67,7 @@ def test_task_contains_reference_time(task: Task): @pytest.mark.parametrize("full", (True, False)) def test_task_state_dict(task: Task, full: bool): task = task(llm_pipeline=mock_llm_pipeline(), context=CONTEXTS[task]) - assert type(task.__state_dict__(full)) == dict + assert isinstance(task.__state_dict__(full), dict) @pytest.mark.parametrize("task", TASKS) @@ -77,9 +75,7 @@ def test_task_state_dict(task: Task, full: bool): "definition, expected_weight", [("reward_definition", 1), ("penalty_definition", None)], ) -def test_task_contains_required_definition( - task: Task, definition: str, expected_weight: float -): +def test_task_contains_required_definition(task: Task, definition: str, expected_weight: float): task = task(llm_pipeline=mock_llm_pipeline(), context=CONTEXTS[task]) model_infos = getattr(task, definition) total_weight = 0 @@ -96,9 +92,7 @@ def test_task_contains_required_definition( for k, v in params.items(): assert k in cls_params # check that the type of the parameter is correct or not annotated - assert cls_params[k].annotation == inspect._empty or isinstance( - v, cls_params[k].annotation - ) + assert cls_params[k].annotation == inspect._empty or isinstance(v, cls_params[k].annotation) # check that all class parameters without default values are in the model_info for k, v in cls_params.items(): diff --git a/tests/test_uids.py b/tests/test_uids.py index e64511ec..73e6ebe4 100644 --- a/tests/test_uids.py +++ b/tests/test_uids.py @@ -10,9 +10,7 @@ def make_mock_neuron(unique_coldkeys=False, unique_ips=False, vpermit_tao_limit= SimpleNamespace(coldkey="a", ip="0.0.0.0", is_serving=True), SimpleNamespace(coldkey="b", ip="0.0.0.1", is_serving=True), SimpleNamespace(coldkey="b", ip="0.0.0.0", is_serving=True), - SimpleNamespace( - coldkey="c", ip="0.0.0.2", is_serving=True - ), # This is the validator coldkey + SimpleNamespace(coldkey="c", ip="0.0.0.2", is_serving=True), # This is the validator coldkey ] metagraph = SimpleNamespace( axons=axons, @@ -46,8 +44,6 @@ def make_mock_neuron(unique_coldkeys=False, unique_ips=False, vpermit_tao_limit= ) def test_get_random_uids(unique_coldkeys, unique_ips, k, expected_result): mock_neuron = make_mock_neuron(unique_coldkeys, unique_ips) - uids_returned = sorted(get_random_uids(mock_neuron, k).tolist()) + uids_returned = sorted(get_random_uids(mock_neuron, k)) - assert ( - uids_returned == expected_result - ), f"Incorrect uids returned., {uids_returned}" + assert uids_returned == expected_result, f"Incorrect uids returned., {uids_returned}"