diff --git a/.github/actions/run-script-zerox-tests/action.yml b/.github/actions/run-script-zerox-tests/action.yml
new file mode 100644
index 000000000..ea15d49e1
--- /dev/null
+++ b/.github/actions/run-script-zerox-tests/action.yml
@@ -0,0 +1,14 @@
+name: 'Run SDK Auth Tests'
+description: 'Runs SDK authentication tests for R2R'
+runs:
+ using: "composite"
+ steps:
+ - name: Ingest zerox document
+ working-directory: ./py
+ shell: bash
+ run: poetry run python core/examples/scripts/run_ingest_with_zerox.py
+
+ - name: Test ingested zerox document
+ working-directory: ./py
+ shell: bash
+ run: poetry run python tests/integration/runner_scripts.py test_ingested_zerox_document
diff --git a/.github/actions/setup-python-full/action.yml b/.github/actions/setup-python-full/action.yml
index 313573b30..661bb3b10 100644
--- a/.github/actions/setup-python-full/action.yml
+++ b/.github/actions/setup-python-full/action.yml
@@ -10,7 +10,7 @@ runs:
- name: Set up Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
- name: Install R2R CLI & Python SDK
shell: bash
diff --git a/.github/actions/setup-python-light/action.yml b/.github/actions/setup-python-light/action.yml
index 4a214fbf4..3732e26c3 100644
--- a/.github/actions/setup-python-light/action.yml
+++ b/.github/actions/setup-python-light/action.yml
@@ -10,7 +10,7 @@ runs:
- name: Set up Python environment
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
- name: Install Poetry and dependencies on Ubuntu and macOS
if: inputs.os == 'ubuntu-latest' || inputs.os == 'macos-latest'
diff --git a/.github/workflows/build-r2r-docker.yml b/.github/workflows/build-r2r-docker.yml
index b9d3f7d5f..0ea0c5c0d 100644
--- a/.github/workflows/build-r2r-docker.yml
+++ b/.github/workflows/build-r2r-docker.yml
@@ -30,7 +30,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
- name: Install toml package
run: pip install toml
diff --git a/.github/workflows/build-unst-docker.yml b/.github/workflows/build-unst-docker.yml
index 6b3b0294d..fd7f1d095 100644
--- a/.github/workflows/build-unst-docker.yml
+++ b/.github/workflows/build-unst-docker.yml
@@ -16,7 +16,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
- name: Install toml package
run: pip install toml
diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml
index 0d5935647..17b827442 100644
--- a/.github/workflows/publish-to-pypi.yml
+++ b/.github/workflows/publish-to-pypi.yml
@@ -17,7 +17,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v4
with:
- python-version: '3.10'
+ python-version: '3.11'
- name: Install poetry
working-directory: ./py
diff --git a/.github/workflows/r2r-full-integration-deep-dive-tests.yml b/.github/workflows/r2r-full-integration-deep-dive-tests.yml
new file mode 100644
index 000000000..85873eb41
--- /dev/null
+++ b/.github/workflows/r2r-full-integration-deep-dive-tests.yml
@@ -0,0 +1,44 @@
+name: R2R Deep-Dive Integration Tests
+
+on:
+ push:
+ branches:
+ - dev
+ - dev-minor
+ pull_request:
+ branches:
+ - dev
+ - dev-minor
+ workflow_dispatch:
+
+jobs:
+ test:
+ runs-on: "ubuntu-latest"
+ env:
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
+ TELEMETRY_ENABLED: 'false'
+ R2R_PROJECT_NAME: r2r_default
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Python and install dependencies
+ uses: ./.github/actions/setup-python-full
+ with:
+ os: "ubuntu-latest"
+
+ - name: Setup and start Docker
+ uses: ./.github/actions/setup-docker
+
+ - name: Login Docker
+ uses: ./.github/actions/login-docker
+ with:
+ docker_username: ${{ secrets.RAGTORICHES_DOCKER_UNAME }}
+ docker_password: ${{ secrets.RAGTORICHES_DOCKER_TOKEN }}
+
+ - name: Start R2R Full server
+ uses: ./.github/actions/start-r2r-full
+
+ - name: Run Test Zerox
+ uses: ./.github/actions/run-script-zerox-tests
diff --git a/docs/documentation/cli/graph.mdx b/docs/documentation/cli/graph.mdx
new file mode 100644
index 000000000..ba54d0736
--- /dev/null
+++ b/docs/documentation/cli/graph.mdx
@@ -0,0 +1,127 @@
+---
+title: 'Knowledge Graph'
+description: 'Managing the knowledge graph with the R2R CLI.'
+---
+
+
+Occasionally this CLI documentation falls out of date, cross-check with the automatically generated API Reference documentation for the latest parameters.
+
+
+## Knowledge Graph Management
+
+### Create Graph
+
+Create a knowledge graph for a collection using the `create-graph` command:
+
+````bash
+r2r create-graph --collection-id my-collection --run --kg-creation-settings '{"key": "value"}' --force-kg-creation
+````
+
+
+
+
+ Collection ID to create graph for. Default is "".
+
+
+
+ Run the graph creation process.
+
+
+
+ Settings for the graph creation process as a JSON string.
+
+
+
+ Force the graph creation process.
+
+
+
+
+### Enrich Graph
+
+Enrich an existing knowledge graph using the `enrich-graph` command:
+
+````bash
+r2r enrich-graph --collection-id my-collection --run --force-kg-enrichment --kg-enrichment-settings '{"key": "value"}'
+````
+
+
+
+
+ Collection ID to enrich graph for. Default is "".
+
+
+
+ Run the graph enrichment process.
+
+
+
+ Force the graph enrichment process.
+
+
+
+ Settings for the graph enrichment process as a JSON string.
+
+
+
+
+### Get Entities
+
+Retrieve entities from the knowledge graph using the `get-entities` command:
+
+````bash
+r2r get-entities --collection-id my-collection --offset 0 --limit 10 --entity-ids entity1 entity2
+````
+
+
+
+
+ Collection ID to retrieve entities from.
+
+
+
+ Offset for pagination. Default is 0.
+
+
+
+ Limit for pagination. Default is 100.
+
+
+
+ Entity IDs to filter by.
+
+
+
+
+### Get Triples
+
+Retrieve triples from the knowledge graph using the `get-triples` command:
+
+````bash
+r2r get-triples --collection-id my-collection --offset 0 --limit 10 --triple-ids triple1 triple2 --entity-names entity1 entity2
+````
+
+
+
+
+ Collection ID to retrieve triples from.
+
+
+
+ Offset for pagination. Default is 0.
+
+
+
+ Limit for pagination. Default is 100.
+
+
+
+ Triple IDs to filter by.
+
+
+
+ Entity names to filter by.
+
+
+
+````
diff --git a/docs/documentation/cli/ingestion.mdx b/docs/documentation/cli/ingestion.mdx
new file mode 100644
index 000000000..2797d1858
--- /dev/null
+++ b/docs/documentation/cli/ingestion.mdx
@@ -0,0 +1,105 @@
+---
+title: 'Ingestion'
+description: 'Ingesting files with the R2R CLI.'
+---
+
+
+Occasionally this CLI documentation falls out of date, cross-check with the automatcially generated API Reference documentation for the latest parameters.
+
+
+## Document Ingestion and Management
+
+### Ingest Files
+
+Ingest files or directories into your R2R system using the `ingest-files` command:
+
+```bash
+r2r ingest-files path/to/file1.txt path/to/file2.txt \
+ --document-ids 9fbe403b-c11c-5aae-8ade-ef22980c3ad1 \
+ --metadatas '{"key1": "value1"}'
+```
+
+
+
+
+ The paths to the files to ingest.
+
+
+
+ Optional document IDs to assign to the ingested files. If not provided, new document IDs will be generated.
+
+
+
+ Optional metadata to attach to the ingested files, provided as a JSON string. If ingesting multiple files, the metadata will be applied to all files.
+
+
+
+
+### Retry Failed Ingestions
+
+Retry ingestion for documents that previously failed using the `retry-ingest-files` command:
+
+```bash
+r2r retry-ingest-files 9fbe403b-c11c-5aae-8ade-ef22980c3ad1
+```
+
+
+
+
+ The IDs of the documents to retry ingestion for.
+
+
+
+
+### Update Files
+
+Update existing documents using the `update-files` command:
+
+```bash
+r2r update-files path/to/file1_v2.txt \
+ --document-ids 9fbe403b-c11c-5aae-8ade-ef22980c3ad1 \
+ --metadatas '{"key1": "value2"}'
+```
+
+
+
+
+ The paths to the updated files.
+
+
+
+ The IDs of the documents to update, provided as a comma-separated string.
+
+
+
+ Optional updated metadata to attach to the documents, provided as a JSON string. If updating multiple files, the metadata will be applied to all files.
+
+
+
+
+### Ingest Sample Files
+
+Ingest one or more sample files from the R2R GitHub repository using the `ingest-sample-file` or `ingest-sample-files` commands:
+
+```bash
+# Ingest a single sample file
+r2r ingest-sample-file
+
+# Ingest a smaller version of the sample file
+r2r ingest-sample-file --v2
+
+# Ingest multiple sample files
+r2r ingest-sample-files
+```
+
+These commands have no additional arguments. The `--v2` flag for `ingest-sample-file` ingests a smaller version of the sample Aristotle text file.
+
+### Ingest Local Sample Files
+
+Ingest the local sample files in the `core/examples/data_unstructured` directory using the `ingest-sample-files-from-unstructured` command:
+
+```bash
+r2r ingest-sample-files-from-unstructured
+```
+
+This command has no additional arguments. It will ingest all files found in the `data_unstructured` directory.
diff --git a/docs/documentation/cli/introduction.mdx b/docs/documentation/cli/introduction.mdx
new file mode 100644
index 000000000..c11822c4e
--- /dev/null
+++ b/docs/documentation/cli/introduction.mdx
@@ -0,0 +1,62 @@
+---
+title: 'Introduction'
+description: 'Build, scale, and manage user-facing Retrieval-Augmented Generation applications with the R2R CLI.'
+---
+
+# R2R CLI Documentation
+
+## Installation
+
+Before starting, make sure you have completed the [R2R installation](/documentation/installation).
+
+The R2R CLI is automatically installed as part of the R2R Python package. No additional installation steps are required.
+
+## Getting Started
+
+1. Ensure R2R is running correctly by checking the health status:
+
+```bash
+r2r health
+```
+
+You should see output similar to:
+```
+{"status":"ok"}
+```
+
+2. Ingest a sample file to test the ingestion process:
+
+```bash
+r2r ingest-sample-file
+```
+
+This will download and ingest a sample text file from the R2R GitHub repository. You can verify the ingestion was successful by checking the documents overview:
+
+```bash
+r2r documents-overview
+```
+
+3. Perform a search on the ingested document:
+
+```bash
+r2r search --query "What did Aristotle contribute to philosophy?"
+```
+
+This will search the ingested document for relevant information to answer the query.
+
+4. Generate a response using RAG (Retrieval-Augmented Generation):
+
+```bash
+r2r rag --query "What were Aristotle's main contributions to logic?"
+```
+
+This will perform a search on the ingested document and use the retrieved information to generate a complete response to the query.
+
+## Additional Documentation
+
+For more detailed information on specific functionalities of the R2R CLI, please refer to the following documentation:
+
+- [Document Ingestion](/documentation/cli/ingestion): Learn how to add, retrieve, and manage documents using the CLI.
+- [Search & RAG](/documentation/cli/retrieval): Explore various querying techniques and Retrieval-Augmented Generation capabilities.
+- [Knowledge Graphs](/documentation/cli/graphrag): Learn how to create and enrich knowledge graphs, and perform GraphRAG.
+- [Server Management](/documentation/cli/server): Manage your R2R server, including health checks, logs, and updates.
diff --git a/docs/documentation/cli/management.mdx b/docs/documentation/cli/management.mdx
new file mode 100644
index 000000000..d17a7ef5d
--- /dev/null
+++ b/docs/documentation/cli/management.mdx
@@ -0,0 +1,128 @@
+---
+title: 'Management'
+description: 'Managing your R2R system with the CLI.'
+---
+
+
+Occasionally this CLI documentation falls out of date, cross-check with the automatically generated API Reference documentation for the latest parameters.
+
+
+## System Management
+
+### Retrieve Analytics
+
+Retrieve analytics data using the `analytics` command:
+
+```bash
+r2r analytics --filters '{"key1": "value1"}' --analysis-types '{"type1": true}'
+```
+
+
+
+
+ Optional filters for analytics as a JSON string.
+
+
+
+ Optional analysis types as a JSON string.
+
+
+
+
+### Retrieve Application Settings
+
+Retrieve application settings using the `app-settings` command:
+
+```bash
+r2r app-settings
+```
+
+This command has no additional arguments.
+
+### Get User Overview
+
+Get an overview of users using the `users-overview` command:
+
+```bash
+r2r users-overview --user-ids user1 user2 --offset 0 --limit 10
+```
+
+
+
+
+ Optional user IDs to overview.
+
+
+
+ The offset to start from. Defaults to 0.
+
+
+
+ The maximum number of nodes to return. Defaults to 100.
+
+
+
+
+### Delete Documents
+
+Delete documents based on filters using the `delete` command:
+
+```bash
+r2r delete -f key1:eq:value1 -f key2:gt:value2
+```
+
+
+
+
+ Filters for deletion in the format key:operator:value.
+
+
+
+
+### Get Document Overview
+
+Get an overview of documents using the `documents-overview` command:
+
+```bash
+r2r documents-overview --document-ids doc1 doc2 --offset 0 --limit 10
+```
+
+
+
+
+ Optional document IDs to overview.
+
+
+
+ The offset to start from. Defaults to 0.
+
+
+
+ The maximum number of nodes to return. Defaults to 100.
+
+
+
+
+### Get Document Chunks
+
+Get chunks of a specific document using the `document-chunks` command:
+
+```bash
+r2r document-chunks --document-id doc1 --offset 0 --limit 10
+```
+
+
+
+
+ The ID of the document to retrieve chunks for.
+
+
+
+ The offset to start from. Defaults to 0.
+
+
+
+ The maximum number of nodes to return. Defaults to 100.
+
+
+
diff --git a/docs/documentation/cli/server.mdx b/docs/documentation/cli/server.mdx
new file mode 100644
index 000000000..12e7a69d3
--- /dev/null
+++ b/docs/documentation/cli/server.mdx
@@ -0,0 +1,164 @@
+---
+title: 'Server'
+description: 'Managing the R2R server with the CLI.'
+---
+
+
+Occasionally this CLI documentation falls out of date, cross-check with the automatically generated API Reference documentation for the latest parameters.
+
+
+## Server Management
+
+### Check Server Health
+
+Check the health of the server using the `health` command:
+
+````bash
+r2r health
+````
+
+This command has no additional arguments.
+
+### Check Server Stats
+
+Check the server stats using the `server-stats` command:
+
+````bash
+r2r server-stats
+````
+
+This command has no additional arguments.
+
+### Retrieve Logs
+
+Retrieve logs with an optional type filter using the `logs` command:
+
+````bash
+r2r logs --offset 0 --limit 10 --run-type-filter ingestion
+````
+
+
+
+
+ Pagination offset. Default is None.
+
+
+
+ Pagination limit. Defaults to 100.
+
+
+
+ Filter for log types.
+
+
+
+
+### Bring Down Docker Compose
+
+Bring down the Docker Compose setup and attempt to remove the network if necessary using the `docker-down` command:
+
+````bash
+r2r docker-down --volumes --remove-orphans --project-name my-project
+````
+
+
+
+
+ Remove named volumes declared in the `volumes` section of the Compose file.
+
+
+
+ Remove containers for services not defined in the Compose file.
+
+
+
+ Which Docker Compose project to bring down.
+
+
+
+
+### Generate System Report
+
+Generate a system report including R2R version, Docker info, and OS details using the `generate-report` command:
+
+````bash
+r2r generate-report
+````
+
+This command has no additional arguments.
+
+### Start R2R Server
+
+Start the R2R server using the `serve` command:
+
+````bash
+r2r serve --host localhost --port 8000 --docker --full --project-name my-project --config-name my-config --config-path /path/to/config --build --image my-image --image-env prod --exclude-postgres
+````
+
+
+
+
+ Host to run the server on. Default is None.
+
+
+
+ Port to run the server on. Default is None.
+
+
+
+ Run using Docker.
+
+
+
+ Run the full R2R compose? This includes Hatchet and Unstructured.
+
+
+
+ Project name for Docker deployment. Default is None.
+
+
+
+ Name of the R2R configuration to use. Default is None.
+
+
+
+ Path to a custom R2R configuration file. Default is None.
+
+
+
+ Run in debug mode. Only for development.
+
+
+
+ Docker image to use.
+
+
+
+ Which dev environment to pull the image from? Default is "prod".
+
+
+
+ Excludes creating a Postgres container in the Docker setup.
+
+
+
+
+### Update R2R
+
+Update the R2R package to the latest version using the `update` command:
+
+````bash
+r2r update
+````
+
+This command has no additional arguments.
+
+### Print R2R Version
+
+Print the version of R2R using the `version` command:
+
+````bash
+r2r version
+````
+
+This command has no additional arguments.
diff --git a/docs/documentation/configuration/ingestion/parsing_and_chunking.mdx b/docs/documentation/configuration/ingestion/parsing_and_chunking.mdx
index 4a1b01c4b..8e0766e1d 100644
--- a/docs/documentation/configuration/ingestion/parsing_and_chunking.mdx
+++ b/docs/documentation/configuration/ingestion/parsing_and_chunking.mdx
@@ -10,6 +10,20 @@ provider = "r2r" # or "unstructured_local" or "unstructured_api"
# ... provider-specific settings ...
```
+### Runtime Configuration
+
+In addition to configuring parsing and chunking settings in the `r2r.toml` file, you can also customize these settings at runtime when ingesting files using the Python SDK. This allows for more flexibility and control over the ingestion process on a per-file or per-request basis.
+
+Some of the configurable options include:
+
+- Chunking strategy (e.g., "recursive", "by_title", "basic")
+- Chunk size and overlap
+- Excluded parsers
+- Provider-specific settings (e.g., max characters, overlap, languages)
+
+For a comprehensive list of available runtime configuration options and examples of how to use them, refer to the [Python SDK Ingestion Documentation](/documentation/python-sdk/ingestion).
+
+
### Supported Providers
R2R offers two main parsing and chunking providers:
diff --git a/docs/documentation/installation/full/local-system.mdx b/docs/documentation/installation/full/local-system.mdx
index 782620846..a9d98c9a1 100644
--- a/docs/documentation/installation/full/local-system.mdx
+++ b/docs/documentation/installation/full/local-system.mdx
@@ -23,7 +23,7 @@ This guide will walk you through installing and running R2R on your local system
## Prerequisites
Before starting, ensure you have the following installed and/or available in the cloud:
-- Python 3.10 or higher
+- Python 3.11 or higher
- pip (Python package manager)
- Git
- Postgres + pgvector
diff --git a/docs/documentation/installation/light/local-system.mdx b/docs/documentation/installation/light/local-system.mdx
index d5a25806a..20621f690 100644
--- a/docs/documentation/installation/light/local-system.mdx
+++ b/docs/documentation/installation/light/local-system.mdx
@@ -6,7 +6,7 @@ This guide will walk you through installing and running R2R on your local system
## Prerequisites
Before starting, ensure you have the following installed and/or available in the cloud:
-- Python 3.10 or higher
+- Python 3.11 or higher
- pip (Python package manager)
- Git
- Postgres + pgvector
diff --git a/docs/mint.json b/docs/mint.json
index 7f8e532ab..6092ebc21 100644
--- a/docs/mint.json
+++ b/docs/mint.json
@@ -127,6 +127,18 @@
"documentation/js-sdk/observability"
]
},
+ {
+ "icon": "desktop",
+ "group": "CLI",
+ "pages": [
+ "documentation/cli/introduction",
+ "documentation/cli/server",
+ "documentation/cli/ingestion",
+ "documentation/cli/graph",
+ "documentation/cli/management"
+ ]
+ },
+
"documentation/api-reference"
]
},
diff --git a/js/sdk/package-lock.json b/js/sdk/package-lock.json
index 146f58572..a48f562a0 100644
--- a/js/sdk/package-lock.json
+++ b/js/sdk/package-lock.json
@@ -6,13 +6,13 @@
"packages": {
"": {
"name": "r2r-js",
- "version": "0.3.5",
+ "version": "0.3.7",
"license": "ISC",
"dependencies": {
"@jest/globals": "^29.7.0",
"@rrweb/types": "2.0.0-alpha.17",
"axios": "^1.7.4",
- "form-data": "^4.0.0",
+ "form-data": "^4.0.1",
"posthog-js": "^1.155.4",
"posthog-node": "^4.1.0",
"rrweb-snapshot": "2.0.0-alpha.4",
@@ -2011,9 +2011,9 @@
}
},
"node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
diff --git a/py/Dockerfile b/py/Dockerfile
index a232844d7..17cdc3c2b 100644
--- a/py/Dockerfile
+++ b/py/Dockerfile
@@ -1,12 +1,14 @@
-FROM python:3.10-slim AS builder
+FROM python:3.11-slim AS builder
# Install system dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc g++ musl-dev curl libffi-dev gfortran libopenblas-dev \
+ poppler-utils \
&& apt-get clean && rm -rf /var/lib/apt/lists/* \
&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
- RUN pip install --no-cache-dir poetry
+RUN pip install --no-cache-dir poetry
+
# Add Rust to PATH
ENV PATH="/root/.cargo/bin:${PATH}"
@@ -21,16 +23,24 @@ RUN poetry config virtualenvs.create false \
&& pip install --no-cache-dir gunicorn uvicorn
# Create the final image
-FROM python:3.10-slim
+FROM python:3.11-slim
# Install runtime dependencies
RUN apt-get update \
- && apt-get install -y --no-install-recommends curl \
+ && apt-get install -y --no-install-recommends curl poppler-utils \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
+# Add poppler to PATH
+ENV PATH="/usr/bin:${PATH}"
+
+# Debugging steps
+RUN echo "PATH: $PATH"
+RUN which pdfinfo
+RUN pdfinfo -v
+
WORKDIR /app
-COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
+COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
# Expose the port and set environment variables
@@ -47,8 +57,4 @@ COPY r2r.toml /app/r2r.toml
COPY pyproject.toml /app/pyproject.toml
# Run the application
-<<<<<<< HEAD
-CMD ["sh", "-c", "uvicorn core.main.app_entry:app --host $HOST --port $R2R_PORT"]
-=======
CMD ["sh", "-c", "uvicorn core.main.app_entry:app --host $R2R_HOST --port $R2R_PORT"]
->>>>>>> 8ae04c5bfdbeab77073b6ae1169c5bff1b32489b
diff --git a/py/Dockerfile.unstructured b/py/Dockerfile.unstructured
index 118b9c07e..499b2957c 100644
--- a/py/Dockerfile.unstructured
+++ b/py/Dockerfile.unstructured
@@ -1,4 +1,4 @@
-FROM python:3.10-slim AS builder
+FROM python:3.11-slim AS builder
# Install system dependencies (including those needed for Unstructured and OpenCV)
RUN apt-get update && apt-get install -y --no-install-recommends \
diff --git a/py/cli/utils/docker_utils.py b/py/cli/utils/docker_utils.py
index 7124f8e04..3be92cb2d 100644
--- a/py/cli/utils/docker_utils.py
+++ b/py/cli/utils/docker_utils.py
@@ -52,7 +52,7 @@ def remove_r2r_network():
(
network
for network in networks
- if network.startswith("r2r_") and "network" in network
+ if network.startswith("r2r") and "network" in network
),
None,
)
diff --git a/py/compose.full.yaml b/py/compose.full.yaml
index a26e44684..ee4fd6674 100644
--- a/py/compose.full.yaml
+++ b/py/compose.full.yaml
@@ -107,7 +107,7 @@ services:
- r2r-network
hatchet-migration:
- image: ghcr.io/hatchet-dev/hatchet/hatchet-migrate:v0.49.0-alpha.4
+ image: ghcr.io/hatchet-dev/hatchet/hatchet-migrate:latest
environment:
DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
depends_on:
@@ -117,7 +117,7 @@ services:
- r2r-network
hatchet-setup-config:
- image: ghcr.io/hatchet-dev/hatchet/hatchet-admin:v0.49.0-alpha.4
+ image: ghcr.io/hatchet-dev/hatchet/hatchet-admin:latest
command: /hatchet/hatchet-admin quickstart --skip certs --generated-config-dir /hatchet/config --overwrite=false
environment:
DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
@@ -151,7 +151,7 @@ services:
- r2r-network
hatchet-engine:
- image: ghcr.io/hatchet-dev/hatchet/hatchet-engine:v0.49.0-alpha.4
+ image: ghcr.io/hatchet-dev/hatchet/hatchet-engine:latest
command: /hatchet/hatchet-engine --config /hatchet/config
restart: on-failure
depends_on:
@@ -178,7 +178,7 @@ services:
retries: 5
hatchet-dashboard:
- image: ghcr.io/hatchet-dev/hatchet/hatchet-dashboard:v0.49.0-alpha.4
+ image: ghcr.io/hatchet-dev/hatchet/hatchet-dashboard:latest
command: sh ./entrypoint.sh --config /hatchet/config
restart: on-failure
depends_on:
diff --git a/py/core/base/agent/agent.py b/py/core/base/agent/agent.py
index 80e66de2d..c8fdba806 100644
--- a/py/core/base/agent/agent.py
+++ b/py/core/base/agent/agent.py
@@ -68,7 +68,7 @@ def create(cls: Type["AgentConfig"], **kwargs: Any) -> "AgentConfig":
for k, v in kwargs.items()
if k in base_args
}
- return cls(**filtered_kwargs)
+ return cls(**filtered_kwargs) # type: ignore
class Agent(ABC):
diff --git a/py/core/base/logging/run_logger.py b/py/core/base/logging/run_logger.py
index 8b24a51c9..ba4e12d54 100644
--- a/py/core/base/logging/run_logger.py
+++ b/py/core/base/logging/run_logger.py
@@ -1,3 +1,4 @@
+import json
import logging
import os
import uuid
@@ -141,6 +142,7 @@ async def _init(self):
parent_id TEXT,
content TEXT,
created_at REAL,
+ metadata TEXT,
FOREIGN KEY (conversation_id) REFERENCES conversations(id),
FOREIGN KEY (parent_id) REFERENCES messages(id)
);
@@ -282,6 +284,7 @@ async def add_message(
conversation_id: str,
content: Message,
parent_id: Optional[str] = None,
+ metadata: Optional[Dict] = None,
) -> str:
if not self.conn:
raise ValueError(
@@ -292,13 +295,14 @@ async def add_message(
created_at = datetime.utcnow().timestamp()
await self.conn.execute(
- "INSERT INTO messages (id, conversation_id, parent_id, content, created_at) VALUES (?, ?, ?, ?, ?)",
+ "INSERT INTO messages (id, conversation_id, parent_id, content, created_at, metadata) VALUES (?, ?, ?, ?, ?, ?)",
(
message_id,
conversation_id,
parent_id,
content.json(),
created_at,
+ json.dumps(metadata or {}),
),
)
@@ -384,13 +388,14 @@ async def edit_message(
new_message_id = str(uuid.uuid4())
message_created_at = datetime.utcnow().timestamp()
await self.conn.execute(
- "INSERT INTO messages (id, conversation_id, parent_id, content, created_at) VALUES (?, ?, ?, ?, ?)",
+ "INSERT INTO messages (id, conversation_id, parent_id, content, created_at, metadata) VALUES (?, ?, ?, ?, ?, ?)",
(
new_message_id,
conversation_id,
parent_id,
edited_message.json(),
message_created_at,
+ json.dumps({"edited": True}),
),
)
# Link the new message to the new branch
@@ -757,10 +762,11 @@ async def add_message(
conversation_id: str,
content: Message,
parent_id: Optional[str] = None,
+ metadata: Optional[Dict] = None,
) -> str:
async with cls.get_instance() as provider:
return await provider.add_message(
- conversation_id, content, parent_id
+ conversation_id, content, parent_id, metadata
)
@classmethod
diff --git a/py/core/base/parsers/base_parser.py b/py/core/base/parsers/base_parser.py
index f2d7cd02c..d0bc8633c 100644
--- a/py/core/base/parsers/base_parser.py
+++ b/py/core/base/parsers/base_parser.py
@@ -10,5 +10,7 @@
class AsyncParser(ABC, Generic[T]):
@abstractmethod
- async def ingest(self, data: T) -> AsyncGenerator[DataType, None]:
+ async def ingest(
+ self, data: T, **kwargs
+ ) -> AsyncGenerator[DataType, None]:
pass
diff --git a/py/core/base/providers/base.py b/py/core/base/providers/base.py
index 052ae93d6..b2cb39926 100644
--- a/py/core/base/providers/base.py
+++ b/py/core/base/providers/base.py
@@ -38,7 +38,7 @@ def create(cls: Type["ProviderConfig"], **kwargs: Any) -> "ProviderConfig":
for k, v in kwargs.items()
if k in base_args
}
- instance = cls(**filtered_kwargs)
+ instance = cls(**filtered_kwargs) # type: ignore
for k, v in kwargs.items():
if k not in base_args:
instance.extra_fields[k] = v
diff --git a/py/core/base/providers/database.py b/py/core/base/providers/database.py
index 6b417b23d..6bb888778 100644
--- a/py/core/base/providers/database.py
+++ b/py/core/base/providers/database.py
@@ -4,6 +4,8 @@
from pydantic import BaseModel
+from shared.abstractions.vector import VectorQuantizationType
+
from .base import Provider, ProviderConfig
logger = logging.getLogger(__name__)
@@ -69,7 +71,9 @@ def supported_providers(self) -> list[str]:
class VectorDBProvider(Provider, ABC):
@abstractmethod
- def _initialize_vector_db(self, dimension: int) -> None:
+ def _initialize_vector_db(
+ self, dimension: int, quantization_type: VectorQuantizationType
+ ) -> None:
pass
diff --git a/py/core/base/providers/embedding.py b/py/core/base/providers/embedding.py
index 1d7b5557a..d724d943a 100644
--- a/py/core/base/providers/embedding.py
+++ b/py/core/base/providers/embedding.py
@@ -4,6 +4,9 @@
from abc import abstractmethod
from enum import Enum
from typing import Any, Optional
+from litellm import AuthenticationError
+
+from shared.abstractions.vector import VectorQuantizationSettings
from ..abstractions import (
EmbeddingPurpose,
@@ -29,6 +32,9 @@ class EmbeddingConfig(ProviderConfig):
max_retries: int = 8
initial_backoff: float = 1
max_backoff: float = 64.0
+ quantization_settings: VectorQuantizationSettings = (
+ VectorQuantizationSettings()
+ )
def validate_config(self) -> None:
if self.provider not in self.supported_providers:
@@ -63,7 +69,8 @@ async def _execute_with_backoff_async(self, task: dict[str, Any]):
try:
async with self.semaphore:
return await self._execute_task(task)
- # TODO: Capture different error types and handle them accordingly
+ except AuthenticationError as e:
+ raise
except Exception as e:
logger.warning(
f"Request failed (attempt {retries + 1}): {str(e)}"
@@ -80,6 +87,8 @@ def _execute_with_backoff_sync(self, task: dict[str, Any]):
while retries < self.config.max_retries:
try:
return self._execute_task_sync(task)
+ except AuthenticationError as e:
+ raise
except Exception as e:
logger.warning(
f"Request failed (attempt {retries + 1}): {str(e)}"
diff --git a/py/core/base/providers/ingestion.py b/py/core/base/providers/ingestion.py
index b11ec5c84..706d7e264 100644
--- a/py/core/base/providers/ingestion.py
+++ b/py/core/base/providers/ingestion.py
@@ -10,6 +10,7 @@
class IngestionConfig(ProviderConfig):
provider: str = "r2r"
excluded_parsers: list[str] = ["mp4"]
+ extra_parsers: dict[str, str] = {}
@property
def supported_providers(self) -> list[str]:
diff --git a/py/core/base/providers/kg.py b/py/core/base/providers/kg.py
index 36c82186d..e2f458617 100644
--- a/py/core/base/providers/kg.py
+++ b/py/core/base/providers/kg.py
@@ -93,6 +93,13 @@ async def get_communities(
"""Abstract method to get communities."""
pass
+ @abstractmethod
+ async def get_existing_entity_extraction_ids(
+ self, document_id: UUID
+ ) -> list[str]:
+ """Abstract method to get existing entity extraction ids."""
+ pass
+
@abstractmethod
async def get_entities(
self,
@@ -196,6 +203,7 @@ async def get_entity_count(
self,
collection_id: Optional[UUID] = None,
document_id: Optional[UUID] = None,
+ distinct: bool = False,
entity_table_name: str = "entity_embedding",
) -> int:
"""Abstract method to get the entity count."""
@@ -208,6 +216,13 @@ async def delete_graph_for_collection(
"""Abstract method to delete the graph for a collection."""
pass
+ @abstractmethod
+ async def delete_node_via_document_id(
+ self, document_id: UUID, collection_id: UUID
+ ) -> None:
+ """Abstract method to delete the node via document id."""
+ pass
+
@abstractmethod
async def get_creation_estimate(self, *args: Any, **kwargs: Any) -> Any:
"""Abstract method to get the creation estimate."""
diff --git a/py/core/base/providers/llm.py b/py/core/base/providers/llm.py
index 9a35fe77f..f81226986 100644
--- a/py/core/base/providers/llm.py
+++ b/py/core/base/providers/llm.py
@@ -4,6 +4,7 @@
from abc import abstractmethod
from concurrent.futures import ThreadPoolExecutor
from typing import Any, AsyncGenerator, Generator, Optional
+from litellm import AuthenticationError
from core.base.abstractions import (
GenerationConfig,
@@ -56,6 +57,8 @@ async def _execute_with_backoff_async(self, task: dict[str, Any]):
try:
async with self.semaphore:
return await self._execute_task(task)
+ except AuthenticationError as e:
+ raise
except Exception as e:
logger.warning(
f"Request failed (attempt {retries + 1}): {str(e)}"
@@ -77,6 +80,8 @@ async def _execute_with_backoff_async_stream(
async for chunk in await self._execute_task(task):
yield chunk
return # Successful completion of the stream
+ except AuthenticationError as e:
+ raise
except Exception as e:
logger.warning(
f"Streaming request failed (attempt {retries + 1}): {str(e)}"
diff --git a/py/core/configs/full.toml b/py/core/configs/full.toml
index 86d8b80e5..8dbe282bb 100644
--- a/py/core/configs/full.toml
+++ b/py/core/configs/full.toml
@@ -5,7 +5,9 @@ chunking_strategy = "by_title"
new_after_n_chars = 512
max_characters = 1_024
combine_under_n_chars = 128
-overlap = 20
+overlap = 256
+ [ingestion.extra_parsers]
+ pdf = "zerox"
[orchestration]
provider = "hatchet"
diff --git a/py/core/examples/scripts/run_ingest_with_zerox.py b/py/core/examples/scripts/run_ingest_with_zerox.py
new file mode 100644
index 000000000..6b9f40834
--- /dev/null
+++ b/py/core/examples/scripts/run_ingest_with_zerox.py
@@ -0,0 +1,15 @@
+import os
+import time
+
+from r2r import R2RClient
+
+if __name__ == "__main__":
+ client = R2RClient(base_url="http://localhost:7272")
+ script_path = os.path.dirname(__file__)
+ sample_file = os.path.join(script_path, "..", "data", "graphrag.pdf")
+
+ ingest_response = client.ingest_files(
+ file_paths=[sample_file],
+ ingestion_config={"parser_overrides": {"pdf": "zerox"}},
+ )
+ time.sleep(30)
diff --git a/py/core/main/api/ingestion_router.py b/py/core/main/api/ingestion_router.py
index c546fec10..91f6106dd 100644
--- a/py/core/main/api/ingestion_router.py
+++ b/py/core/main/api/ingestion_router.py
@@ -10,6 +10,7 @@
from pydantic import Json
from core.base import R2RException, RawChunk, generate_document_id
+
from core.base.api.models import (
CreateVectorIndexResponse,
WrappedCreateVectorIndexResponse,
diff --git a/py/core/main/api/kg_router.py b/py/core/main/api/kg_router.py
index ed9da0bb2..77f95b149 100644
--- a/py/core/main/api/kg_router.py
+++ b/py/core/main/api/kg_router.py
@@ -18,7 +18,6 @@
from core.utils import generate_default_user_collection_id
from shared.abstractions.kg import KGRunType
from shared.utils.base_utils import update_settings_from_dict
-
from ..services.kg_service import KgService
from .base_router import BaseRouter
diff --git a/py/core/main/api/management_router.py b/py/core/main/api/management_router.py
index b07fe4570..478dc7627 100644
--- a/py/core/main/api/management_router.py
+++ b/py/core/main/api/management_router.py
@@ -33,6 +33,7 @@
)
from core.base.logging import AnalysisTypes, LogFilterCriteria
from core.base.providers import OrchestrationProvider
+from shared.abstractions.kg import KGRunType
from ..services.management_service import ManagementService
from .base_router import BaseRouter, RunType
@@ -339,13 +340,18 @@ async def documents_overview_app(
request_user_ids = (
None if auth_user.is_superuser else [auth_user.id]
)
+
+ filter_collection_ids = (
+ None if auth_user.is_superuser else auth_user.collection_ids
+ )
+
document_uuids = [
UUID(document_id) for document_id in document_ids
]
documents_overview_response = (
await self.service.documents_overview(
user_ids=request_user_ids,
- collection_ids=auth_user.collection_ids,
+ collection_ids=filter_collection_ids,
document_ids=document_uuids,
offset=offset,
limit=limit,
@@ -683,6 +689,14 @@ async def remove_document_from_collection_app(
document_id: str = Body(..., description="Document ID"),
collection_id: str = Body(..., description="Collection ID"),
auth_user=Depends(self.service.providers.auth.auth_wrapper),
+ run_type: Optional[KGRunType] = Body(
+ default=KGRunType.ESTIMATE,
+ description="Run type for the graph enrichment process.",
+ ),
+ kg_enrichment_settings: Optional[dict] = Body(
+ default=None,
+ description="Settings for the graph enrichment process.",
+ ),
) -> WrappedDeleteResponse:
collection_uuid = UUID(collection_id)
document_uuid = UUID(document_id)
@@ -695,9 +709,36 @@ async def remove_document_from_collection_app(
403,
)
- await self.service.remove_document_from_collection(
+ enrichment = await self.service.remove_document_from_collection(
document_uuid, collection_uuid
)
+ if enrichment:
+ if not run_type:
+ run_type = KGRunType.ESTIMATE
+
+ server_kg_enrichment_settings = (
+ self.service.providers.kg.config.kg_enrichment_settings
+ )
+ if run_type is KGRunType.ESTIMATE:
+
+ return await self.service.providers.kg.get_enrichment_estimate(
+ collection_id, server_kg_enrichment_settings
+ )
+
+ if kg_enrichment_settings:
+ for key, value in kg_enrichment_settings.items():
+ if value is not None:
+ setattr(server_kg_enrichment_settings, key, value)
+
+ workflow_input = {
+ "collection_id": str(collection_id),
+ "kg_enrichment_settings": server_kg_enrichment_settings.model_dump_json(),
+ "user": auth_user.json(),
+ }
+ await self.orchestration_provider.run_workflow(
+ "enrich-graph", {"request": workflow_input}, {}
+ )
+
return None # type: ignore
@self.router.get("/document_collections/{document_id}")
diff --git a/py/core/main/assembly/factory.py b/py/core/main/assembly/factory.py
index 56bab1f88..582b7e0fb 100644
--- a/py/core/main/assembly/factory.py
+++ b/py/core/main/assembly/factory.py
@@ -148,11 +148,17 @@ async def create_database_provider(
)
vector_db_dimension = self.config.embedding.base_dimension
+ quantization_type = (
+ self.config.embedding.quantization_settings.quantization_type
+ )
if db_config.provider == "postgres":
from core.providers import PostgresDBProvider
database_provider = PostgresDBProvider(
- db_config, vector_db_dimension, crypto_provider=crypto_provider
+ db_config,
+ vector_db_dimension,
+ crypto_provider=crypto_provider,
+ quantization_type=quantization_type,
)
await database_provider.initialize()
return database_provider
diff --git a/py/core/main/orchestration/hatchet/ingestion_workflow.py b/py/core/main/orchestration/hatchet/ingestion_workflow.py
index 1e1430988..5e912e834 100644
--- a/py/core/main/orchestration/hatchet/ingestion_workflow.py
+++ b/py/core/main/orchestration/hatchet/ingestion_workflow.py
@@ -2,6 +2,7 @@
import logging
import uuid
from typing import TYPE_CHECKING
+from litellm import AuthenticationError
from hatchet_sdk import ConcurrencyLimitStrategy, Context
@@ -51,109 +52,128 @@ def concurrency(self, context: Context) -> str:
@orchestration_provider.step(timeout="60m")
async def parse(self, context: Context) -> dict:
- input_data = context.workflow_input()["request"]
- parsed_data = IngestionServiceAdapter.parse_ingest_file_input(
- input_data
- )
+ try:
+ input_data = context.workflow_input()["request"]
+ parsed_data = IngestionServiceAdapter.parse_ingest_file_input(
+ input_data
+ )
- ingestion_result = (
- await self.ingestion_service.ingest_file_ingress(**parsed_data)
- )
+ ingestion_result = (
+ await self.ingestion_service.ingest_file_ingress(
+ **parsed_data
+ )
+ )
- document_info = ingestion_result["info"]
+ document_info = ingestion_result["info"]
- await self.ingestion_service.update_document_status(
- document_info,
- status=IngestionStatus.PARSING,
- )
+ await self.ingestion_service.update_document_status(
+ document_info,
+ status=IngestionStatus.PARSING,
+ )
- ingestion_config = parsed_data["ingestion_config"] or {}
- extractions_generator = await self.ingestion_service.parse_file(
- document_info, ingestion_config
- )
+ ingestion_config = parsed_data["ingestion_config"] or {}
+ extractions_generator = (
+ await self.ingestion_service.parse_file(
+ document_info, ingestion_config
+ )
+ )
- extractions = []
- async for extraction in extractions_generator:
- extractions.append(extraction)
+ extractions = []
+ async for extraction in extractions_generator:
+ extractions.append(extraction)
- # serializable_extractions = [
- # extraction.to_dict() for extraction in extractions
- # ]
+ # serializable_extractions = [
+ # extraction.to_dict() for extraction in extractions
+ # ]
- # return {
- # "status": "Successfully extracted data",
- # "extractions": serializable_extractions,
- # "document_info": document_info.to_dict(),
- # }
+ # return {
+ # "status": "Successfully extracted data",
+ # "extractions": serializable_extractions,
+ # "document_info": document_info.to_dict(),
+ # }
- # @orchestration_provider.step(parents=["parse"], timeout="60m")
- # async def embed(self, context: Context) -> dict:
- # document_info_dict = context.step_output("parse")["document_info"]
- # document_info = DocumentInfo(**document_info_dict)
+ # @orchestration_provider.step(parents=["parse"], timeout="60m")
+ # async def embed(self, context: Context) -> dict:
+ # document_info_dict = context.step_output("parse")["document_info"]
+ # document_info = DocumentInfo(**document_info_dict)
- await self.ingestion_service.update_document_status(
- document_info,
- status=IngestionStatus.EMBEDDING,
- )
+ await self.ingestion_service.update_document_status(
+ document_info,
+ status=IngestionStatus.EMBEDDING,
+ )
- # extractions = context.step_output("parse")["extractions"]
+ # extractions = context.step_output("parse")["extractions"]
- embedding_generator = await self.ingestion_service.embed_document(
- [extraction.to_dict() for extraction in extractions]
- )
+ embedding_generator = (
+ await self.ingestion_service.embed_document(
+ [extraction.to_dict() for extraction in extractions]
+ )
+ )
- embeddings = []
- async for embedding in embedding_generator:
- embeddings.append(embedding)
+ embeddings = []
+ async for embedding in embedding_generator:
+ embeddings.append(embedding)
- await self.ingestion_service.update_document_status(
- document_info,
- status=IngestionStatus.STORING,
- )
+ await self.ingestion_service.update_document_status(
+ document_info,
+ status=IngestionStatus.STORING,
+ )
- storage_generator = await self.ingestion_service.store_embeddings( # type: ignore
- embeddings
- )
+ storage_generator = await self.ingestion_service.store_embeddings( # type: ignore
+ embeddings
+ )
- async for _ in storage_generator:
- pass
+ async for _ in storage_generator:
+ pass
- # return {
- # "document_info": document_info.to_dict(),
- # }
+ # return {
+ # "document_info": document_info.to_dict(),
+ # }
- # @orchestration_provider.step(parents=["embed"], timeout="60m")
- # async def finalize(self, context: Context) -> dict:
- # document_info_dict = context.step_output("embed")["document_info"]
- # print("Calling finalize for document_info_dict = ", document_info_dict)
- # document_info = DocumentInfo(**document_info_dict)
+ # @orchestration_provider.step(parents=["embed"], timeout="60m")
+ # async def finalize(self, context: Context) -> dict:
+ # document_info_dict = context.step_output("embed")["document_info"]
+ # print("Calling finalize for document_info_dict = ", document_info_dict)
+ # document_info = DocumentInfo(**document_info_dict)
- is_update = context.workflow_input()["request"].get("is_update")
+ is_update = context.workflow_input()["request"].get(
+ "is_update"
+ )
- await self.ingestion_service.finalize_ingestion(
- document_info, is_update=is_update
- )
+ await self.ingestion_service.finalize_ingestion(
+ document_info, is_update=is_update
+ )
- await self.ingestion_service.update_document_status(
- document_info,
- status=IngestionStatus.SUCCESS,
- )
+ await self.ingestion_service.update_document_status(
+ document_info,
+ status=IngestionStatus.SUCCESS,
+ )
- collection_id = await service.providers.database.relational.assign_document_to_collection(
- document_id=document_info.id,
- collection_id=generate_default_user_collection_id(
- document_info.user_id
- ),
- )
+ collection_id = await service.providers.database.relational.assign_document_to_collection(
+ document_id=document_info.id,
+ collection_id=generate_default_user_collection_id(
+ document_info.user_id
+ ),
+ )
- service.providers.database.vector.assign_document_to_collection(
- document_id=document_info.id, collection_id=collection_id
- )
+ service.providers.database.vector.assign_document_to_collection(
+ document_id=document_info.id, collection_id=collection_id
+ )
- return {
- "status": "Successfully finalized ingestion",
- "document_info": document_info.to_dict(),
- }
+ return {
+ "status": "Successfully finalized ingestion",
+ "document_info": document_info.to_dict(),
+ }
+ except AuthenticationError as e:
+ raise R2RException(
+ status_code=401,
+ message="Authentication error: Invalid API key or credentials.",
+ )
+ except Exception as e:
+ raise R2RException(
+ status_code=500,
+ message=f"Error during ingestion: {str(e)}",
+ )
@orchestration_provider.failure()
async def on_failure(self, context: Context) -> None:
diff --git a/py/core/main/orchestration/hatchet/kg_workflow.py b/py/core/main/orchestration/hatchet/kg_workflow.py
index 878879b57..8e1bab8a0 100644
--- a/py/core/main/orchestration/hatchet/kg_workflow.py
+++ b/py/core/main/orchestration/hatchet/kg_workflow.py
@@ -3,14 +3,17 @@
import logging
import math
import uuid
+import time
from hatchet_sdk import ConcurrencyLimitStrategy, Context
from core import GenerationConfig
from core.base import OrchestrationProvider
-
+from shared.abstractions.document import KGExtractionStatus
from ...services import KgService
+from shared.utils import create_hatchet_logger
+
logger = logging.getLogger(__name__)
from typing import TYPE_CHECKING
@@ -57,9 +60,7 @@ def concurrency(self, context: Context) -> str:
@orchestration_provider.step(retries=1, timeout="360m")
async def kg_extract(self, context: Context) -> dict:
- context.log(
- f"Running KG Extraction for input: {context.workflow_input()['request']}"
- )
+ start_time = time.time()
input_data = get_input_data_dict(
context.workflow_input()["request"]
@@ -70,12 +71,16 @@ async def kg_extract(self, context: Context) -> dict:
await self.kg_service.kg_triples_extraction(
document_id=uuid.UUID(document_id),
- logger=context.log,
+ logger=create_hatchet_logger(context.log),
**input_data["kg_creation_settings"],
)
+ context.log(
+ f"Successfully ran kg triples extraction for document {document_id}"
+ )
+
return {
- "result": f"successfully ran kg triples extraction for document {document_id}"
+ "result": f"successfully ran kg triples extraction for document {document_id} in {time.time() - start_time:.2f} seconds",
}
@orchestration_provider.step(
@@ -90,13 +95,44 @@ async def kg_entity_description(self, context: Context) -> dict:
await self.kg_service.kg_entity_description(
document_id=uuid.UUID(document_id),
+ logger=create_hatchet_logger(context.log),
**input_data["kg_creation_settings"],
)
+ context.log(
+ f"Successfully ran kg node description for document {document_id}"
+ )
+
return {
"result": f"successfully ran kg node description for document {document_id}"
}
+ @orchestration_provider.failure()
+ async def on_failure(self, context: Context) -> None:
+ request = context.workflow_input().get("request", {})
+ document_id = request.get("document_id")
+
+ if not document_id:
+ context.log(
+ "No document id was found in workflow input to mark a failure."
+ )
+ return
+
+ try:
+ await self.kg_service.providers.database.relational.set_workflow_status(
+ id=uuid.UUID(document_id),
+ status_type="kg_extraction_status",
+ status=KGExtractionStatus.FAILED,
+ )
+ context.log(
+ f"Updated KG extraction status for {document_id} to FAILED"
+ )
+
+ except Exception as e:
+ context.log(
+ f"Failed to update document status for {document_id}: {e}"
+ )
+
@orchestration_provider.workflow(name="create-graph", timeout="360m")
class CreateGraphWorkflow:
def __init__(self, kg_service: KgService):
@@ -187,6 +223,8 @@ def __init__(self, kg_service: KgService):
@orchestration_provider.step(retries=1, parents=[], timeout="360m")
async def kg_clustering(self, context: Context) -> dict:
+ start_time = time.time()
+
logger.info("Running KG Clustering")
input_data = get_input_data_dict(
context.workflow_input()["request"]
@@ -195,11 +233,12 @@ async def kg_clustering(self, context: Context) -> dict:
kg_clustering_results = await self.kg_service.kg_clustering(
collection_id=collection_id,
+ logger=create_hatchet_logger(context.log),
**input_data["kg_enrichment_settings"],
)
context.log(
- f"Successfully ran kg clustering for collection {collection_id}: {json.dumps(kg_clustering_results)}"
+ f"Successfully ran kg clustering for collection {collection_id}: {json.dumps(kg_clustering_results)} in {time.time() - start_time:.2f} seconds"
)
logger.info(
f"Successfully ran kg clustering for collection {collection_id}: {json.dumps(kg_clustering_results)}"
@@ -220,10 +259,14 @@ async def kg_community_summary(self, context: Context) -> dict:
num_communities = context.step_output("kg_clustering")[
"kg_clustering"
][0]["num_communities"]
-
parallel_communities = min(100, num_communities)
total_workflows = math.ceil(num_communities / parallel_communities)
workflows = []
+
+ context.log(
+ f"Running KG Community Summary for {num_communities} communities, spawning {total_workflows} workflows"
+ )
+
for i in range(total_workflows):
offset = i * parallel_communities
workflows.append(
@@ -257,15 +300,19 @@ def __init__(self, kg_service: KgService):
@orchestration_provider.step(retries=1, timeout="360m")
async def kg_community_summary(self, context: Context) -> dict:
+
+ start_time = time.time()
+
input_data = get_input_data_dict(
context.workflow_input()["request"]
)
community_summary = await self.kg_service.kg_community_summary(
- **input_data
+ logger=create_hatchet_logger(context.log),
+ **input_data,
)
context.log(
- f"Successfully ran kg community summary for communities {input_data['offset']} to {input_data['offset'] + len(community_summary)}"
+ f"Successfully ran kg community summary for communities {input_data['offset']} to {input_data['offset'] + len(community_summary)} in {time.time() - start_time:.2f} seconds "
)
return {
"result": f"successfully ran kg community summary for communities {input_data['offset']} to {input_data['offset'] + len(community_summary)}"
diff --git a/py/core/main/orchestration/simple/ingestion_workflow.py b/py/core/main/orchestration/simple/ingestion_workflow.py
index 51e3b1049..b3c675226 100644
--- a/py/core/main/orchestration/simple/ingestion_workflow.py
+++ b/py/core/main/orchestration/simple/ingestion_workflow.py
@@ -1,6 +1,8 @@
import asyncio
import logging
+from litellm import AuthenticationError
+
from core.base import DocumentExtraction, R2RException, increment_version
from core.utils import (
generate_default_user_collection_id,
@@ -79,6 +81,15 @@ async def ingest_files(input_data):
f"Error during assigning document to collection: {str(e)}"
)
+ except AuthenticationError as e:
+ if document_info is not None:
+ await service.update_document_status(
+ document_info, status=IngestionStatus.FAILED
+ )
+ raise R2RException(
+ status_code=401,
+ message="Authentication error: Invalid API key or credentials.",
+ )
except Exception as e:
if document_info is not None:
await service.update_document_status(
diff --git a/py/core/main/orchestration/simple/kg_workflow.py b/py/core/main/orchestration/simple/kg_workflow.py
index b5bca7d39..6eaee35f9 100644
--- a/py/core/main/orchestration/simple/kg_workflow.py
+++ b/py/core/main/orchestration/simple/kg_workflow.py
@@ -40,15 +40,22 @@ async def create_graph(input_data):
for _, document_id in enumerate(document_ids):
# Extract triples from the document
- await service.kg_triples_extraction(
- document_id=document_id,
- **input_data["kg_creation_settings"],
- )
- # Describe the entities in the graph
- await service.kg_entity_description(
- document_id=document_id,
- **input_data["kg_creation_settings"],
- )
+
+ try:
+ await service.kg_triples_extraction(
+ document_id=document_id,
+ **input_data["kg_creation_settings"],
+ )
+ # Describe the entities in the graph
+ await service.kg_entity_description(
+ document_id=document_id,
+ **input_data["kg_creation_settings"],
+ )
+
+ except Exception as e:
+ logger.error(
+ f"Error in creating graph for document {document_id}: {e}"
+ )
async def enrich_graph(input_data):
diff --git a/py/core/main/services/ingestion_service.py b/py/core/main/services/ingestion_service.py
index d7bacce16..22ad57599 100644
--- a/py/core/main/services/ingestion_service.py
+++ b/py/core/main/services/ingestion_service.py
@@ -70,60 +70,70 @@ async def ingest_file_ingress(
*args: Any,
**kwargs: Any,
) -> dict:
- if not file_data:
- raise R2RException(
- status_code=400, message="No files provided for ingestion."
- )
-
- if not file_data.get("filename"):
- raise R2RException(
- status_code=400, message="File name not provided."
- )
+ try:
+ if not file_data:
+ raise R2RException(
+ status_code=400, message="No files provided for ingestion."
+ )
- metadata = metadata or {}
+ if not file_data.get("filename"):
+ raise R2RException(
+ status_code=400, message="File name not provided."
+ )
- version = version or STARTING_VERSION
- document_info = self._create_document_info_from_file(
- document_id,
- user,
- file_data["filename"],
- metadata,
- version,
- size_in_bytes,
- )
+ metadata = metadata or {}
- existing_document_info = (
- await self.providers.database.relational.get_documents_overview(
- filter_user_ids=[user.id],
- filter_document_ids=[document_id],
+ version = version or STARTING_VERSION
+ document_info = self._create_document_info_from_file(
+ document_id,
+ user,
+ file_data["filename"],
+ metadata,
+ version,
+ size_in_bytes,
)
- )["results"]
- if len(existing_document_info) > 0:
- existing_doc = existing_document_info[0]
- if not is_update:
- if (
- existing_doc.version >= version
- and existing_doc.ingestion_status
- == IngestionStatus.SUCCESS
- ):
- raise R2RException(
- status_code=409,
- message=f"Must increment version number before attempting to overwrite document {document_id}. Use the `update_files` endpoint if you are looking to update the existing version.",
- )
- elif existing_doc.ingestion_status != IngestionStatus.FAILED:
- raise R2RException(
- status_code=409,
- message=f"Document {document_id} was already ingested and is not in a failed state.",
- )
+ existing_document_info = (
+ await self.providers.database.relational.get_documents_overview(
+ filter_user_ids=[user.id],
+ filter_document_ids=[document_id],
+ )
+ )["results"]
+
+ if len(existing_document_info) > 0:
+ existing_doc = existing_document_info[0]
+ if not is_update:
+ if (
+ existing_doc.version >= version
+ and existing_doc.ingestion_status
+ == IngestionStatus.SUCCESS
+ ):
+ raise R2RException(
+ status_code=409,
+ message=f"Must increment version number before attempting to overwrite document {document_id}. Use the `update_files` endpoint if you are looking to update the existing version.",
+ )
+ elif (
+ existing_doc.ingestion_status != IngestionStatus.FAILED
+ ):
+ raise R2RException(
+ status_code=409,
+ message=f"Document {document_id} was already ingested and is not in a failed state.",
+ )
- await self.providers.database.relational.upsert_documents_overview(
- document_info
- )
+ await self.providers.database.relational.upsert_documents_overview(
+ document_info
+ )
- return {
- "info": document_info,
- }
+ return {
+ "info": document_info,
+ }
+ except R2RException as e:
+ logger.error(f"R2RException in ingest_file_ingress: {str(e)}")
+ raise
+ except Exception as e:
+ raise R2RException(
+ status_code=500, message=f"Error during ingestion: {str(e)}"
+ )
def _create_document_info_from_file(
self,
diff --git a/py/core/main/services/kg_service.py b/py/core/main/services/kg_service.py
index 24bf4bd3e..baaf78001 100644
--- a/py/core/main/services/kg_service.py
+++ b/py/core/main/services/kg_service.py
@@ -1,6 +1,8 @@
import logging
import math
-from typing import Any, AsyncGenerator, Optional
+import time
+from time import strftime
+from typing import Any, AsyncGenerator, Optional, Union
from uuid import UUID
from core.base import KGExtractionStatus, RunLoggingSingleton, RunManager
@@ -10,6 +12,7 @@
KGEnrichmentSettings,
)
from core.telemetry.telemetry_decorator import telemetry_event
+from shared.utils import HatchetLogger
from ..abstractions import R2RAgents, R2RPipelines, R2RPipes, R2RProviders
from ..config import R2RConfig
@@ -57,11 +60,16 @@ async def kg_triples_extraction(
max_knowledge_triples: int,
entity_types: list[str],
relation_types: list[str],
+ logger: Union[logging.Logger, HatchetLogger] = logging.getLogger(
+ __name__
+ ),
**kwargs,
):
try:
- logger.info(f"Processing document {document_id} for KG extraction")
+ logger.info(
+ f"KGService: Processing document {document_id} for KG extraction"
+ )
await self.providers.database.relational.set_workflow_status(
id=document_id,
@@ -78,12 +86,17 @@ async def kg_triples_extraction(
"max_knowledge_triples": max_knowledge_triples,
"entity_types": entity_types,
"relation_types": relation_types,
+ "logger": logger,
}
),
state=None,
run_manager=self.run_manager,
)
+ logger.info(
+ f"KGService: Finished processing document {document_id} for KG extraction"
+ )
+
result_gen = await self.pipes.kg_storage_pipe.run(
input=self.pipes.kg_storage_pipe.Input(message=triples),
state=None,
@@ -91,12 +104,13 @@ async def kg_triples_extraction(
)
except Exception as e:
- logger.error(f"Error in kg_extraction: {e}")
+ logger.error(f"KGService: Error in kg_extraction: {e}")
await self.providers.database.relational.set_workflow_status(
id=document_id,
status_type="kg_extraction_status",
status=KGExtractionStatus.FAILED,
)
+ raise e
return await _collect_results(result_gen)
@@ -114,7 +128,6 @@ async def get_document_ids_for_create_graph(
]
if force_kg_creation:
document_status_filter += [
- KGExtractionStatus.SUCCESS,
KGExtractionStatus.PROCESSING,
]
@@ -131,14 +144,28 @@ async def kg_entity_description(
self,
document_id: UUID,
max_description_input_length: int,
+ logger: Union[logging.Logger, HatchetLogger] = logging.getLogger(
+ __name__
+ ),
**kwargs,
):
+ start_time = time.time()
+
+ logger.info(
+ f"KGService: Running kg_entity_description for document {document_id}"
+ )
+
entity_count = await self.providers.kg.get_entity_count(
document_id=document_id,
+ distinct=True,
entity_table_name="entity_raw",
)
+ logger.info(
+ f"KGService: Found {entity_count} entities in document {document_id}"
+ )
+
# TODO - Do not hardcode the batch size,
# make it a configurable parameter at runtime & server-side defaults
@@ -147,7 +174,7 @@ async def kg_entity_description(
all_results = []
for i in range(num_batches):
logger.info(
- f"Running kg_entity_description for batch {i+1}/{num_batches} for document {document_id}"
+ f"KGService: Running kg_entity_description for batch {i+1}/{num_batches} for document {document_id}"
)
node_descriptions = await self.pipes.kg_entity_description_pipe.run(
@@ -157,6 +184,7 @@ async def kg_entity_description(
"limit": 256,
"max_description_input_length": max_description_input_length,
"document_id": document_id,
+ "logger": logger,
}
),
state=None,
@@ -165,12 +193,20 @@ async def kg_entity_description(
all_results.append(await _collect_results(node_descriptions))
+ logger.info(
+ f"KGService: Completed kg_entity_description for batch {i+1}/{num_batches} for document {document_id}"
+ )
+
await self.providers.database.relational.set_workflow_status(
id=document_id,
status_type="kg_extraction_status",
status=KGExtractionStatus.SUCCESS,
)
+ logger.info(
+ f"KGService: Completed kg_entity_description for document {document_id} in {time.time() - start_time:.2f} seconds",
+ )
+
return all_results
@telemetry_event("kg_clustering")
@@ -179,6 +215,9 @@ async def kg_clustering(
collection_id: UUID,
generation_config: GenerationConfig,
leiden_params: dict,
+ logger: Union[logging.Logger, HatchetLogger] = logging.getLogger(
+ __name__
+ ),
**kwargs,
):
clustering_result = await self.pipes.kg_clustering_pipe.run(
@@ -187,6 +226,7 @@ async def kg_clustering(
"collection_id": collection_id,
"generation_config": generation_config,
"leiden_params": leiden_params,
+ "logger": logger,
}
),
state=None,
@@ -202,6 +242,9 @@ async def kg_community_summary(
max_summary_input_length: int,
generation_config: GenerationConfig,
collection_id: UUID,
+ logger: Union[logging.Logger, HatchetLogger] = logging.getLogger(
+ __name__
+ ),
**kwargs,
):
summary_results = await self.pipes.kg_community_summary_pipe.run(
@@ -212,6 +255,7 @@ async def kg_community_summary(
"generation_config": generation_config,
"max_summary_input_length": max_summary_input_length,
"collection_id": collection_id,
+ "logger": logger,
}
),
state=None,
@@ -239,6 +283,17 @@ async def delete_graph_for_collection(
collection_id, cascade
)
+ @telemetry_event("delete_node_via_document_id")
+ async def delete_node_via_document_id(
+ self,
+ document_id: UUID,
+ collection_id: UUID,
+ **kwargs,
+ ):
+ return await self.providers.kg.delete_node_via_document_id(
+ collection_id, document_id
+ )
+
@telemetry_event("get_creation_estimate")
async def get_creation_estimate(
self,
diff --git a/py/core/main/services/management_service.py b/py/core/main/services/management_service.py
index 60ed600e7..00043e206 100644
--- a/py/core/main/services/management_service.py
+++ b/py/core/main/services/management_service.py
@@ -386,7 +386,7 @@ async def assign_document_to_collection(
@telemetry_event("RemoveDocumentFromCollection")
async def remove_document_from_collection(
- self, document_id: str, collection_id: UUID
+ self, document_id: UUID, collection_id: UUID
):
await self.providers.database.relational.remove_document_from_collection(
document_id, collection_id
@@ -394,7 +394,10 @@ async def remove_document_from_collection(
self.providers.database.vector.remove_document_from_collection(
document_id, collection_id
)
- return {"message": "Document removed from collection successfully"}
+ await self.providers.kg.delete_node_via_document_id(
+ document_id, collection_id
+ )
+ return None
@telemetry_event("DocumentCollections")
async def document_collections(
diff --git a/py/core/main/services/retrieval_service.py b/py/core/main/services/retrieval_service.py
index b3193e03e..c1a56844a 100644
--- a/py/core/main/services/retrieval_service.py
+++ b/py/core/main/services/retrieval_service.py
@@ -293,9 +293,9 @@ async def agent(
conversation_id = (
await self.logging_connection.create_conversation()
)
+
parent_id = None
for inner_message in messages[:-1]:
- print("rr recording message = ", inner_message)
parent_id = (
await self.logging_connection.add_message(
@@ -304,8 +304,6 @@ async def agent(
)
message = messages[-1]
- print("qq recording message = ", message)
-
# Save the new message to the conversation
message_id = await self.logging_connection.add_message(
conversation_id, # type: ignore
@@ -355,7 +353,6 @@ async def stream_response():
*args,
**kwargs,
)
- print("ss recording message = ", results[-1])
await self.logging_connection.add_message(
conversation_id,
Message(**results[-1]),
diff --git a/py/core/parsers/media/__init__.py b/py/core/parsers/media/__init__.py
index 075276e33..71c9bf0df 100644
--- a/py/core/parsers/media/__init__.py
+++ b/py/core/parsers/media/__init__.py
@@ -5,6 +5,7 @@
PDFParser,
PDFParserMarker,
PDFParserUnstructured,
+ ZeroxPDFParser,
)
from .ppt_parser import PPTParser
@@ -14,6 +15,7 @@
"ImageParser",
"PDFParser",
"PDFParserUnstructured",
+ "ZeroxPDFParser",
"PDFParserMarker",
"PPTParser",
]
diff --git a/py/core/parsers/media/audio_parser.py b/py/core/parsers/media/audio_parser.py
index 149b6352c..a8026c1af 100644
--- a/py/core/parsers/media/audio_parser.py
+++ b/py/core/parsers/media/audio_parser.py
@@ -15,7 +15,7 @@ def __init__(
self.openai_api_key = os.environ.get("OPENAI_API_KEY")
async def ingest( # type: ignore
- self, data: bytes, chunk_size: int = 1024
+ self, data: bytes, chunk_size: int = 1024, *args, **kwargs
) -> AsyncGenerator[str, None]:
"""Ingest audio data and yield a transcription."""
temp_audio_path = "temp_audio.wav"
diff --git a/py/core/parsers/media/docx_parser.py b/py/core/parsers/media/docx_parser.py
index acf471d9a..21272e1b2 100644
--- a/py/core/parsers/media/docx_parser.py
+++ b/py/core/parsers/media/docx_parser.py
@@ -18,7 +18,7 @@ def __init__(self):
"Error, `python-docx` is required to run `DOCXParser`. Please install it using `pip install python-docx`."
)
- async def ingest(self, data: DataType) -> AsyncGenerator[str, None]: # type: ignore
+ async def ingest(self, data: DataType, *args, **kwargs) -> AsyncGenerator[str, None]: # type: ignore
"""Ingest DOCX data and yield text from each paragraph."""
if isinstance(data, str):
raise ValueError("DOCX data must be in bytes format.")
diff --git a/py/core/parsers/media/img_parser.py b/py/core/parsers/media/img_parser.py
index 29aeda54b..10ce790cb 100644
--- a/py/core/parsers/media/img_parser.py
+++ b/py/core/parsers/media/img_parser.py
@@ -27,7 +27,7 @@ def __init__(
self.max_image_size = max_image_size
async def ingest( # type: ignore
- self, data: DataType, chunk_size: int = 1024
+ self, data: DataType, chunk_size: int = 1024, *args, **kwargs
) -> AsyncGenerator[str, None]:
"""Ingest image data and yield a description."""
diff --git a/py/core/parsers/media/pdf_parser.py b/py/core/parsers/media/pdf_parser.py
index 9f3e7ad27..a1f8c719f 100644
--- a/py/core/parsers/media/pdf_parser.py
+++ b/py/core/parsers/media/pdf_parser.py
@@ -1,6 +1,7 @@
# type: ignore
import asyncio
import logging
+import os
import string
import unicodedata
from io import BytesIO
@@ -10,6 +11,7 @@
from core.base.parsers.base_parser import AsyncParser
logger = logging.getLogger(__name__)
+ZEROX_DEFAULT_MODEL = "openai/gpt-4o-mini"
class PDFParser(AsyncParser[DataType]):
@@ -25,7 +27,9 @@ def __init__(self):
"Error, `pypdf` is required to run `PyPDFParser`. Please install it using `pip install pypdf`."
)
- async def ingest(self, data: DataType) -> AsyncGenerator[str, None]:
+ async def ingest(
+ self, data: DataType, **kwargs
+ ) -> AsyncGenerator[str, None]:
"""Ingest PDF data and yield text from each page."""
if isinstance(data, str):
raise ValueError("PDF data must be in bytes format.")
@@ -76,7 +80,7 @@ def __init__(self):
"Error, `pdfminer.six` is required to run `PDFParser`. Please install it using `pip install pdfminer.six`."
)
- async def ingest(self, data: bytes) -> AsyncGenerator[str, None]:
+ async def ingest(self, data: bytes, **kwargs) -> AsyncGenerator[str, None]:
"""Ingest PDF data and yield text from each page."""
if not isinstance(data, bytes):
raise ValueError("PDF data must be in bytes format.")
@@ -156,7 +160,9 @@ def __init__(self):
f"Error, marker is not installed {e}, please install using `pip install marker-pdf` "
)
- async def ingest(self, data: DataType) -> AsyncGenerator[str, None]:
+ async def ingest(
+ self, data: DataType, **kwargs
+ ) -> AsyncGenerator[str, None]:
if isinstance(data, str):
raise ValueError("PDF data must be in bytes format.")
@@ -164,3 +170,50 @@ async def ingest(self, data: DataType) -> AsyncGenerator[str, None]:
BytesIO(data), PDFParserMarker.model_refs
)
yield text
+
+
+class ZeroxPDFParser(AsyncParser[DataType]):
+ """An advanced PDF parser using zerox."""
+
+ def __init__(self):
+ """
+ Use the zerox library to parse PDF data.
+
+ Args:
+ cleanup (bool, optional): Whether to clean up temporary files after processing. Defaults to True.
+ concurrency (int, optional): The number of concurrent processes to run. Defaults to 10.
+ file_data (Optional[str], optional): The file data to process. Defaults to an empty string.
+ maintain_format (bool, optional): Whether to maintain the format from the previous page. Defaults to False.
+ model (str, optional): The model to use for generating completions. Defaults to "gpt-4o-mini". Refer to LiteLLM Providers for the correct model name, as it may differ depending on the provider.
+ temp_dir (str, optional): The directory to store temporary files, defaults to some named folder in system's temp directory. If already exists, the contents will be deleted before zerox uses it.
+ custom_system_prompt (str, optional): The system prompt to use for the model, this overrides the default system prompt of zerox.Generally it is not required unless you want some specific behaviour. When set, it will raise a friendly warning. Defaults to None.
+ kwargs (dict, optional): Additional keyword arguments to pass to the litellm.completion method. Refer to the LiteLLM Documentation and Completion Input for details.
+
+ """
+ try:
+ # from pyzerox import zerox
+ from .pyzerox import zerox
+
+ self.zerox = zerox
+
+ except ImportError as e:
+ raise ValueError(
+ f"Error, zerox installation failed with Error='{e}', please install through the R2R ingestion bundle with `pip install r2r -E ingestion-bundle` "
+ )
+
+ async def ingest(
+ self, data: DataType, **kwargs
+ ) -> AsyncGenerator[str, None]:
+ if isinstance(data, str):
+ raise ValueError("PDF data must be in bytes format.")
+
+ model = kwargs.get("zerox_parsing_model", ZEROX_DEFAULT_MODEL)
+ model = model.split("/")[-1] # remove the provider prefix
+ result = await self.zerox(
+ file_data=data,
+ model=model,
+ verbose=True,
+ )
+
+ for page in result.pages:
+ yield page.content
diff --git a/py/core/parsers/media/ppt_parser.py b/py/core/parsers/media/ppt_parser.py
index b623752ce..5f19a0171 100644
--- a/py/core/parsers/media/ppt_parser.py
+++ b/py/core/parsers/media/ppt_parser.py
@@ -18,7 +18,7 @@ def __init__(self):
"Error, `python-pptx` is required to run `PPTParser`. Please install it using `pip install python-pptx`."
)
- async def ingest(self, data: DataType) -> AsyncGenerator[str, None]: # type: ignore
+ async def ingest(self, data: DataType, **kwargs) -> AsyncGenerator[str, None]: # type: ignore
"""Ingest PPT data and yield text from each slide."""
if isinstance(data, str):
raise ValueError("PPT data must be in bytes format.")
diff --git a/py/core/parsers/media/pyzerox/__init__.py b/py/core/parsers/media/pyzerox/__init__.py
new file mode 100644
index 000000000..18cd95ac3
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/__init__.py
@@ -0,0 +1,10 @@
+from .constants.prompts import Prompts
+from .zerox_core import zerox
+
+DEFAULT_SYSTEM_PROMPT = Prompts.DEFAULT_SYSTEM_PROMPT
+
+__all__ = [
+ "zerox",
+ "Prompts",
+ "DEFAULT_SYSTEM_PROMPT",
+]
diff --git a/py/core/parsers/media/pyzerox/constants/__init__.py b/py/core/parsers/media/pyzerox/constants/__init__.py
new file mode 100644
index 000000000..4378b38e0
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/constants/__init__.py
@@ -0,0 +1,9 @@
+from .conversion import PDFConversionDefaultOptions
+from .messages import Messages
+from .prompts import Prompts
+
+__all__ = [
+ "PDFConversionDefaultOptions",
+ "Messages",
+ "Prompts",
+]
diff --git a/py/core/parsers/media/pyzerox/constants/conversion.py b/py/core/parsers/media/pyzerox/constants/conversion.py
new file mode 100644
index 000000000..4320e3484
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/constants/conversion.py
@@ -0,0 +1,8 @@
+class PDFConversionDefaultOptions:
+ """Default options for converting PDFs to images"""
+
+ DPI = 300
+ FORMAT = "png"
+ SIZE = (None, 1056)
+ THREAD_COUNT = 4
+ USE_PDFTOCAIRO = True
diff --git a/py/core/parsers/media/pyzerox/constants/messages.py b/py/core/parsers/media/pyzerox/constants/messages.py
new file mode 100644
index 000000000..ffa3f68ec
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/constants/messages.py
@@ -0,0 +1,56 @@
+class Messages:
+ """User-facing messages"""
+
+ MISSING_ENVIRONMENT_VARIABLES = """
+ Required environment variable (keys) from the model are Missing. Please set the required environment variables for the model provider.
+ Refer: https://docs.litellm.ai/docs/providers
+ """
+
+ NON_VISION_MODEL = """
+ The provided model is not a vision model. Please provide a vision model.
+ """
+
+ MODEL_ACCESS_ERROR = """
+ Your provided model can't be accessed. Please make sure you have access to the model and also required environment variables are setup correctly including valid api key(s).
+ Refer: https://docs.litellm.ai/docs/providers
+ """
+
+ CUSTOM_SYSTEM_PROMPT_WARNING = """
+ Custom system prompt was provided which overrides the default system prompt. We assume that you know what you are doing.
+ """
+
+ MAINTAIN_FORMAT_SELECTED_PAGES_WARNING = """
+ The maintain_format flag is set to True in conjunction with select_pages input given. This may result in unexpected behavior.
+ """
+
+ PAGE_NUMBER_OUT_OF_BOUND_ERROR = """
+ The page number(s) provided is out of bound. Please provide a valid page number(s).
+ """
+
+ NON_200_RESPONSE = """
+ Model API returned status code {status_code}: {data}
+
+ Please check the litellm documentation for more information. https://docs.litellm.ai/docs/exception_mapping.
+ """
+
+ COMPLETION_ERROR = """
+ Error in Completion Response. Error: {0}
+ Please check the status of your model provider API status.
+ """
+
+ PDF_CONVERSION_FAILED = """
+ Error during PDF conversion: {0}
+ Please check the PDF file and try again. For more information: https://github.com/Belval/pdf2image
+ """
+
+ FILE_UNREACHAGBLE = """
+ File not found or unreachable. Status Code: {0}
+ """
+
+ FILE_PATH_MISSING = """
+ File path is invalid or missing.
+ """
+
+ FAILED_TO_SAVE_FILE = """Failed to save file to local drive"""
+
+ FAILED_TO_PROCESS_IMAGE = """Failed to process image"""
diff --git a/py/core/parsers/media/pyzerox/constants/patterns.py b/py/core/parsers/media/pyzerox/constants/patterns.py
new file mode 100644
index 000000000..6be1a77e1
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/constants/patterns.py
@@ -0,0 +1,6 @@
+class Patterns:
+ """Regex patterns for markdown and code blocks"""
+
+ MATCH_MARKDOWN_BLOCKS = r"^```[a-z]*\n([\s\S]*?)\n```$"
+
+ MATCH_CODE_BLOCKS = r"^```\n([\s\S]*?)\n```$"
diff --git a/py/core/parsers/media/pyzerox/constants/prompts.py b/py/core/parsers/media/pyzerox/constants/prompts.py
new file mode 100644
index 000000000..a59680a37
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/constants/prompts.py
@@ -0,0 +1,8 @@
+class Prompts:
+ """Class for storing prompts for the Zerox system."""
+
+ DEFAULT_SYSTEM_PROMPT = """
+ Convert the following PDF page to markdown.
+ Return only the markdown with no explanation text.
+ Do not exclude any content from the page.
+ """
diff --git a/py/core/parsers/media/pyzerox/errors/__init__.py b/py/core/parsers/media/pyzerox/errors/__init__.py
new file mode 100644
index 000000000..7fa7bedd3
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/errors/__init__.py
@@ -0,0 +1,21 @@
+from .exceptions import (
+ FailedToProcessFile,
+ FailedToSaveFile,
+ FileUnavailable,
+ MissingEnvironmentVariables,
+ ModelAccessError,
+ NotAVisionModel,
+ PageNumberOutOfBoundError,
+ ResourceUnreachableException,
+)
+
+__all__ = [
+ "NotAVisionModel",
+ "ModelAccessError",
+ "PageNumberOutOfBoundError",
+ "MissingEnvironmentVariables",
+ "ResourceUnreachableException",
+ "FileUnavailable",
+ "FailedToSaveFile",
+ "FailedToProcessFile",
+]
diff --git a/py/core/parsers/media/pyzerox/errors/base.py b/py/core/parsers/media/pyzerox/errors/base.py
new file mode 100644
index 000000000..f1e761141
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/errors/base.py
@@ -0,0 +1,21 @@
+from typing import Optional
+
+
+class CustomException(Exception):
+ """
+ Base class for custom exceptions
+ """
+
+ def __init__(
+ self,
+ message: Optional[str] = None,
+ extra_info: Optional[dict] = None,
+ ):
+ self.message = message
+ self.extra_info = extra_info
+ super().__init__(self.message)
+
+ def __str__(self):
+ if self.extra_info:
+ return f"{self.message} (Extra Info: {self.extra_info})"
+ return self.message
diff --git a/py/core/parsers/media/pyzerox/errors/exceptions.py b/py/core/parsers/media/pyzerox/errors/exceptions.py
new file mode 100644
index 000000000..ee90873d6
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/errors/exceptions.py
@@ -0,0 +1,93 @@
+from typing import Dict, Optional
+
+# Package Imports
+from ..constants import Messages
+from .base import CustomException
+
+
+class MissingEnvironmentVariables(CustomException):
+ """Exception raised when the model provider environment variables, API key(s) are missing. Refer: https://docs.litellm.ai/docs/providers"""
+
+ def __init__(
+ self,
+ message: str = Messages.MISSING_ENVIRONMENT_VARIABLES,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
+
+
+class NotAVisionModel(CustomException):
+ """Exception raised when the provided model is not a vision model."""
+
+ def __init__(
+ self,
+ message: str = Messages.NON_VISION_MODEL,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
+
+
+class ModelAccessError(CustomException):
+ """Exception raised when the provided model can't be accessed due to incorrect credentials/keys or incorrect environent variables setup."""
+
+ def __init__(
+ self,
+ message: str = Messages.MODEL_ACCESS_ERROR,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
+
+
+class PageNumberOutOfBoundError(CustomException):
+ """Exception invalid page number(s) provided."""
+
+ def __init__(
+ self,
+ message: str = Messages.PAGE_NUMBER_OUT_OF_BOUND_ERROR,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
+
+
+class ResourceUnreachableException(CustomException):
+ """Exception raised when a resource is unreachable."""
+
+ def __init__(
+ self,
+ message: str = Messages.FILE_UNREACHAGBLE,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
+
+
+class FileUnavailable(CustomException):
+ """Exception raised when a file is unavailable."""
+
+ def __init__(
+ self,
+ message: str = Messages.FILE_PATH_MISSING,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
+
+
+class FailedToSaveFile(CustomException):
+ """Exception raised when a file fails to save."""
+
+ def __init__(
+ self,
+ message: str = Messages.FAILED_TO_SAVE_FILE,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
+
+
+class FailedToProcessFile(CustomException):
+ """Exception raised when a file fails to process."""
+
+ def __init__(
+ self,
+ message: str = Messages.FAILED_TO_PROCESS_IMAGE,
+ extra_info: Optional[Dict] = None,
+ ):
+ super().__init__(message, extra_info)
diff --git a/py/core/parsers/media/pyzerox/processor/__init__.py b/py/core/parsers/media/pyzerox/processor/__init__.py
new file mode 100644
index 000000000..1124805e8
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/processor/__init__.py
@@ -0,0 +1,14 @@
+from .image import encode_image_to_base64, save_image
+from .pdf import convert_pdf_to_images, process_page, process_pages_in_batches
+from .text import format_markdown
+from .utils import download_file
+
+__all__ = [
+ "save_image",
+ "encode_image_to_base64",
+ "convert_pdf_to_images",
+ "format_markdown",
+ "download_file",
+ "process_page",
+ "process_pages_in_batches",
+]
diff --git a/py/core/parsers/media/pyzerox/processor/image.py b/py/core/parsers/media/pyzerox/processor/image.py
new file mode 100644
index 000000000..8ad973f4f
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/processor/image.py
@@ -0,0 +1,27 @@
+import base64
+import io
+
+import aiofiles
+
+
+async def encode_image_to_base64(image_path: str) -> str:
+ """Encode an image to base64 asynchronously."""
+ async with aiofiles.open(image_path, "rb") as image_file:
+ image_data = await image_file.read()
+ return base64.b64encode(image_data).decode("utf-8")
+
+
+async def save_image(image, image_path: str):
+ """Save an image to a file asynchronously."""
+ # Convert PIL Image to BytesIO object
+ with io.BytesIO() as buffer:
+ image.save(
+ buffer, format=image.format
+ ) # Save the image to the BytesIO object
+ image_data = (
+ buffer.getvalue()
+ ) # Get the image data from the BytesIO object
+
+ # Write image data to file asynchronously
+ async with aiofiles.open(image_path, "wb") as f:
+ await f.write(image_data)
diff --git a/py/core/parsers/media/pyzerox/processor/pdf.py b/py/core/parsers/media/pyzerox/processor/pdf.py
new file mode 100644
index 000000000..5bc874382
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/processor/pdf.py
@@ -0,0 +1,115 @@
+import asyncio
+import logging
+import os
+from typing import TYPE_CHECKING, List, Optional, Tuple
+
+from pdf2image import convert_from_path
+
+from ..constants import Messages, PDFConversionDefaultOptions
+
+if TYPE_CHECKING:
+ from ..zerox_models import litellmmodel
+
+# Package Imports
+from .image import save_image
+from .text import format_markdown
+
+
+async def convert_pdf_to_images(local_path: str, temp_dir: str) -> List[str]:
+ """Converts a PDF file to a series of images in the temp_dir. Returns a list of image paths in page order."""
+ options = {
+ "pdf_path": local_path,
+ "output_folder": temp_dir,
+ "dpi": PDFConversionDefaultOptions.DPI,
+ "fmt": PDFConversionDefaultOptions.FORMAT,
+ "size": PDFConversionDefaultOptions.SIZE,
+ "thread_count": PDFConversionDefaultOptions.THREAD_COUNT,
+ "use_pdftocairo": PDFConversionDefaultOptions.USE_PDFTOCAIRO,
+ "paths_only": True,
+ }
+
+ try:
+ image_paths = await asyncio.to_thread(convert_from_path, **options)
+ return image_paths
+ except Exception as err:
+ logging.error(f"Error converting PDF to images: {err}")
+
+
+async def process_page(
+ image: str,
+ model: "litellmmodel",
+ temp_directory: str = "",
+ input_token_count: int = 0,
+ output_token_count: int = 0,
+ prior_page: str = "",
+ semaphore: Optional[asyncio.Semaphore] = None,
+) -> Tuple[str, int, int, str]:
+ """Process a single page of a PDF"""
+
+ # If semaphore is provided, acquire it before processing the page
+ if semaphore:
+ async with semaphore:
+ return await process_page(
+ image,
+ model,
+ temp_directory,
+ input_token_count,
+ output_token_count,
+ prior_page,
+ )
+
+ image_path = os.path.join(temp_directory, image)
+
+ # Get the completion from LiteLLM
+ try:
+ completion = await model.completion(
+ image_path=image_path,
+ maintain_format=True,
+ prior_page=prior_page,
+ )
+
+ formatted_markdown = format_markdown(completion.content)
+ input_token_count += completion.input_tokens
+ output_token_count += completion.output_tokens
+ prior_page = formatted_markdown
+
+ return (
+ formatted_markdown,
+ input_token_count,
+ output_token_count,
+ prior_page,
+ )
+
+ except Exception as error:
+ logging.error(f"{Messages.FAILED_TO_PROCESS_IMAGE} Error:{error}")
+ return "", input_token_count, output_token_count, ""
+
+
+async def process_pages_in_batches(
+ images: List[str],
+ concurrency: int,
+ model: "litellmmodel",
+ temp_directory: str = "",
+ input_token_count: int = 0,
+ output_token_count: int = 0,
+ prior_page: str = "",
+):
+ # Create a semaphore to limit the number of concurrent tasks
+ semaphore = asyncio.Semaphore(concurrency)
+
+ # Process each page in parallel
+ tasks = [
+ process_page(
+ image,
+ model,
+ temp_directory,
+ input_token_count,
+ output_token_count,
+ prior_page,
+ semaphore,
+ )
+ for image in images
+ ]
+
+ # Wait for all tasks to complete
+ return await asyncio.gather(*tasks)
diff --git a/py/core/parsers/media/pyzerox/processor/text.py b/py/core/parsers/media/pyzerox/processor/text.py
new file mode 100644
index 000000000..524033e6e
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/processor/text.py
@@ -0,0 +1,14 @@
+import re
+
+# Package imports
+from ..constants.patterns import Patterns
+
+
+def format_markdown(text: str) -> str:
+ """Format markdown text by removing markdown and code blocks"""
+
+ formatted_markdown = re.sub(Patterns.MATCH_MARKDOWN_BLOCKS, r"\1", text)
+ formatted_markdown = re.sub(
+ Patterns.MATCH_CODE_BLOCKS, r"\1", formatted_markdown
+ )
+ return formatted_markdown
diff --git a/py/core/parsers/media/pyzerox/processor/utils.py b/py/core/parsers/media/pyzerox/processor/utils.py
new file mode 100644
index 000000000..da703240d
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/processor/utils.py
@@ -0,0 +1,52 @@
+import os
+import re
+from typing import Iterable, Optional, Union
+from urllib.parse import urlparse
+
+import aiofiles
+import aiohttp
+from PyPDF2 import PdfReader, PdfWriter
+
+from ..constants.messages import Messages
+
+# Package Imports
+from ..errors.exceptions import (
+ PageNumberOutOfBoundError,
+ ResourceUnreachableException,
+)
+
+
+async def download_file(
+ file_path: str,
+ temp_dir: str,
+) -> Optional[str]:
+ """Downloads a file from a URL or local path to a temporary directory."""
+
+ local_pdf_path = os.path.join(temp_dir, os.path.basename(file_path))
+ if is_valid_url(file_path):
+ async with aiohttp.ClientSession() as session:
+ async with session.get(file_path) as response:
+ if response.status != 200:
+ raise ResourceUnreachableException()
+ async with aiofiles.open(local_pdf_path, "wb") as f:
+ await f.write(await response.read())
+ else:
+ async with (
+ aiofiles.open(file_path, "rb") as src,
+ aiofiles.open(local_pdf_path, "wb") as dst,
+ ):
+ await dst.write(await src.read())
+ return local_pdf_path
+
+
+def is_valid_url(string: str) -> bool:
+ """Checks if a string is a valid URL."""
+
+ try:
+ result = urlparse(string)
+ return all([result.scheme, result.netloc]) and result.scheme in [
+ "http",
+ "https",
+ ]
+ except ValueError:
+ return False
diff --git a/py/core/parsers/media/pyzerox/zerox_core/__init__.py b/py/core/parsers/media/pyzerox/zerox_core/__init__.py
new file mode 100644
index 000000000..825ed3f77
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/zerox_core/__init__.py
@@ -0,0 +1,5 @@
+from .zerox import zerox
+
+__all__ = [
+ "zerox",
+]
diff --git a/py/core/parsers/media/pyzerox/zerox_core/types.py b/py/core/parsers/media/pyzerox/zerox_core/types.py
new file mode 100644
index 000000000..8474a5524
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/zerox_core/types.py
@@ -0,0 +1,42 @@
+from dataclasses import dataclass, field
+from typing import Any, Dict, Iterable, List, Optional, Union
+
+
+@dataclass
+class ZeroxArgs:
+ """
+ Dataclass to store the arguments for the Zerox class.
+ """
+
+ file_path: str
+ cleanup: bool = True
+ concurrency: int = 10
+ maintain_format: bool = False
+ model: str = ("gpt-4o-mini",)
+ output_dir: Optional[str] = None
+ temp_dir: Optional[str] = None
+ custom_system_prompt: Optional[str] = None
+ kwargs: Dict[str, Any] = field(default_factory=dict)
+
+
+@dataclass
+class Page:
+ """
+ Dataclass to store the page content.
+ """
+
+ content: str
+ content_length: int
+ page: int
+
+
+@dataclass
+class ZeroxOutput:
+ """
+ Dataclass to store the output of the Zerox class.
+ """
+
+ completion_time: float
+ input_tokens: int
+ output_tokens: int
+ pages: List[Page]
diff --git a/py/core/parsers/media/pyzerox/zerox_core/zerox.py b/py/core/parsers/media/pyzerox/zerox_core/zerox.py
new file mode 100644
index 000000000..b89a20e54
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/zerox_core/zerox.py
@@ -0,0 +1,151 @@
+import asyncio
+import os
+import tempfile
+import warnings
+from datetime import datetime
+from typing import Iterable, List, Optional, Union
+
+import aiofiles
+import aiofiles.os as async_os
+import aioshutil as async_shutil
+
+from ..constants.messages import Messages
+from ..errors import FileUnavailable
+
+# Package Imports
+from ..processor import (
+ convert_pdf_to_images,
+ process_page,
+ process_pages_in_batches,
+)
+from ..zerox_models import litellmmodel
+from .types import Page, ZeroxOutput
+
+
+async def zerox(
+ cleanup: bool = True,
+ concurrency: int = 10,
+ file_data: Optional[bytes] = None,
+ maintain_format: bool = False,
+ model: str = "gpt-4o-mini",
+ temp_dir: Optional[str] = None,
+ custom_system_prompt: Optional[str] = None,
+ **kwargs,
+) -> ZeroxOutput:
+ """
+ API to perform OCR to markdown using Vision models.
+ Please setup the environment variables for the model and model provider before using this API. Refer: https://docs.litellm.ai/docs/providers
+
+ :param cleanup: Whether to cleanup the temporary files after processing, defaults to True
+ :type cleanup: bool, optional
+ :param concurrency: The number of concurrent processes to run, defaults to 10
+ :type concurrency: int, optional
+ :param file_path: The path or URL to the PDF file to process.
+ :type file_path: str, optional
+ :param maintain_format: Whether to maintain the format from the previous page, defaults to False
+ :type maintain_format: bool, optional
+ :param model: The model to use for generating completions, defaults to "gpt-4o-mini". Note - Refer: https://docs.litellm.ai/docs/providers to pass correct model name as according to provider it might be different from actual name.
+ :type model: str, optional
+ :param temp_dir: The directory to store temporary files, defaults to some named folder in system's temp directory. If already exists, the contents will be deleted for zerox uses it.
+ :type temp_dir: str, optional
+ :param custom_system_prompt: The system prompt to use for the model, this overrides the default system prompt of zerox. Generally it is not required unless you want some specific behaviour. When set, it will raise a friendly warning, defaults to None
+ :type custom_system_prompt: str, optional
+
+ :param kwargs: Additional keyword arguments to pass to the model.completion -> litellm.completion method. Refer: https://docs.litellm.ai/docs/providers and https://docs.litellm.ai/docs/completion/input
+ :return: The markdown content generated by the model.
+ """
+
+ input_token_count = 0
+ output_token_count = 0
+ prior_page = ""
+ aggregated_markdown: List[str] = []
+ start_time = datetime.now()
+ # File Data Validators
+ if not file_data:
+ raise FileUnavailable()
+
+ # Create an instance of the litellm model interface
+ vision_model = litellmmodel(model=model, **kwargs)
+
+ # override the system prompt if a custom prompt is provided
+ if custom_system_prompt:
+ vision_model.system_prompt = custom_system_prompt
+
+ if temp_dir:
+ if os.path.exists(temp_dir):
+ await async_shutil.rmtree(temp_dir)
+ await async_os.makedirs(temp_dir, exist_ok=True)
+
+ # Create a temporary directory to store the PDF and images
+ with tempfile.TemporaryDirectory() as temp_dir_:
+
+ if temp_dir:
+ ## use the user provided temp directory
+ temp_directory = temp_dir
+ else:
+ ## use the system temp directory
+ temp_directory = temp_dir_
+
+ local_path = os.path.join(temp_directory, "input.pdf")
+ async with aiofiles.open(local_path, "wb") as f:
+ await f.write(file_data)
+
+ # Convert the file to a series of images, below function returns a list of image paths in page order
+ images = await convert_pdf_to_images(
+ local_path=local_path, temp_dir=temp_directory
+ )
+
+ if maintain_format:
+ for image in images:
+ result, input_token_count, output_token_count, prior_page = (
+ await process_page(
+ image,
+ vision_model,
+ temp_directory,
+ input_token_count,
+ output_token_count,
+ prior_page,
+ )
+ )
+
+ if result:
+ aggregated_markdown.append(result)
+ else:
+ results = await process_pages_in_batches(
+ images,
+ concurrency,
+ vision_model,
+ temp_directory,
+ input_token_count,
+ output_token_count,
+ prior_page,
+ )
+
+ aggregated_markdown = [
+ result[0] for result in results if isinstance(result[0], str)
+ ]
+
+ ## add token usage
+ input_token_count += sum([result[1] for result in results])
+ output_token_count += sum([result[2] for result in results])
+
+ # Cleanup the downloaded PDF file
+ if cleanup and os.path.exists(temp_directory):
+ await async_shutil.rmtree(temp_directory)
+
+ # Format JSON response
+ end_time = datetime.now()
+ completion_time = (end_time - start_time).total_seconds() * 1000
+
+ # Default behavior when no is provided
+ formatted_pages = [
+ Page(content=content, page=i + 1, content_length=len(content))
+ for i, content in enumerate(aggregated_markdown)
+ ]
+
+ return ZeroxOutput(
+ completion_time=completion_time,
+ input_tokens=input_token_count,
+ output_tokens=output_token_count,
+ pages=formatted_pages,
+ )
diff --git a/py/core/parsers/media/pyzerox/zerox_models/__init__.py b/py/core/parsers/media/pyzerox/zerox_models/__init__.py
new file mode 100644
index 000000000..f19d77392
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/zerox_models/__init__.py
@@ -0,0 +1,7 @@
+from .modellitellm import litellmmodel
+from .types import CompletionResponse
+
+__all__ = [
+ "litellmmodel",
+ "CompletionResponse",
+]
diff --git a/py/core/parsers/media/pyzerox/zerox_models/base.py b/py/core/parsers/media/pyzerox/zerox_models/base.py
new file mode 100644
index 000000000..4e85dc344
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/zerox_models/base.py
@@ -0,0 +1,43 @@
+from abc import ABC, abstractmethod
+from typing import TYPE_CHECKING, Dict, Optional, Type, TypeVar
+
+if TYPE_CHECKING:
+ from ..zerox_models import CompletionResponse
+
+T = TypeVar("T", bound="BaseModel")
+
+
+class BaseModel(ABC):
+ """
+ Base class for all models.
+ """
+
+ @abstractmethod
+ async def completion(
+ self,
+ ) -> "CompletionResponse":
+ raise NotImplementedError("Subclasses must implement this method")
+
+ @abstractmethod
+ def validate_access(
+ self,
+ ) -> None:
+ raise NotImplementedError("Subclasses must implement this method")
+
+ @abstractmethod
+ def validate_model(
+ self,
+ ) -> None:
+ raise NotImplementedError("Subclasses must implement this method")
+
+ def __init__(
+ self,
+ model: Optional[str] = None,
+ **kwargs,
+ ):
+ self.model = model
+ self.kwargs = kwargs
+
+ ## validations
+ # self.validate_model()
+ # self.validate_access()
diff --git a/py/core/parsers/media/pyzerox/zerox_models/modellitellm.py b/py/core/parsers/media/pyzerox/zerox_models/modellitellm.py
new file mode 100644
index 000000000..02c5fe792
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/zerox_models/modellitellm.py
@@ -0,0 +1,169 @@
+import os
+import warnings
+from typing import Any, Dict, List, Optional
+
+import aiohttp
+import litellm
+
+from ..constants.messages import Messages
+from ..constants.prompts import Prompts
+from ..errors import (
+ MissingEnvironmentVariables,
+ ModelAccessError,
+ NotAVisionModel,
+)
+from ..processor.image import encode_image_to_base64
+
+# Package Imports
+from .base import BaseModel
+from .types import CompletionResponse
+
+DEFAULT_SYSTEM_PROMPT = Prompts.DEFAULT_SYSTEM_PROMPT
+
+
+class litellmmodel(BaseModel):
+ ## setting the default system prompt
+ _system_prompt = DEFAULT_SYSTEM_PROMPT
+
+ def __init__(
+ self,
+ model: Optional[str] = None,
+ **kwargs,
+ ):
+ """
+ Initializes the Litellm model interface.
+ :param model: The model to use for generating completions, defaults to "gpt-4o-mini". Refer: https://docs.litellm.ai/docs/providers
+ :type model: str, optional
+
+ :param kwargs: Additional keyword arguments to pass to self.completion -> litellm.completion. Refer: https://docs.litellm.ai/docs/providers and https://docs.litellm.ai/docs/completion/input
+ """
+ super().__init__(model=model, **kwargs)
+
+ ## calling custom methods to validate the environment and model
+ self.validate_environment()
+ self.validate_model()
+ self.validate_access()
+
+ @property
+ def system_prompt(self) -> str:
+ """Returns the system prompt for the model."""
+ return self._system_prompt
+
+ @system_prompt.setter
+ def system_prompt(self, prompt: str) -> None:
+ """
+ Sets/overrides the system prompt for the model.
+ Will raise a friendly warning to notify the user.
+ """
+ warnings.warn(
+ f"{Messages.CUSTOM_SYSTEM_PROMPT_WARNING}. Default prompt for zerox is:\n {DEFAULT_SYSTEM_PROMPT}"
+ )
+ self._system_prompt = prompt
+
+ ## custom method on top of BaseModel
+ def validate_environment(self) -> None:
+ """Validates the environment variables required for the model."""
+ env_config = litellm.validate_environment(model=self.model)
+
+ if not env_config["keys_in_environment"]:
+ raise MissingEnvironmentVariables(extra_info=env_config)
+
+ def validate_model(self) -> None:
+ """Validates the model to ensure it is a vision model."""
+ if not litellm.supports_vision(model=self.model):
+ raise NotAVisionModel(extra_info={"model": self.model})
+
+ def validate_access(self) -> None:
+ """Validates access to the model -> if environment variables are set correctly with correct values."""
+ if not litellm.check_valid_key(model=self.model, api_key=None):
+ raise ModelAccessError(extra_info={"model": self.model})
+
+ async def completion(
+ self,
+ image_path: str,
+ maintain_format: bool,
+ prior_page: str,
+ ) -> CompletionResponse:
+ """LitellM completion for image to markdown conversion.
+
+ :param image_path: Path to the image file.
+ :type image_path: str
+ :param maintain_format: Whether to maintain the format from the previous page.
+ :type maintain_format: bool
+ :param prior_page: The markdown content of the previous page.
+ :type prior_page: str
+
+ :return: The markdown content generated by the model.
+ """
+ messages = await self._prepare_messages(
+ image_path=image_path,
+ maintain_format=maintain_format,
+ prior_page=prior_page,
+ )
+
+ try:
+ response = await litellm.acompletion(
+ model=self.model, messages=messages, **self.kwargs
+ )
+
+ ## completion response
+ response = CompletionResponse(
+ content=response["choices"][0]["message"]["content"],
+ input_tokens=response["usage"]["prompt_tokens"],
+ output_tokens=response["usage"]["completion_tokens"],
+ )
+ return response
+
+ except Exception as err:
+ raise Exception(Messages.COMPLETION_ERROR.format(err))
+
+ async def _prepare_messages(
+ self,
+ image_path: str,
+ maintain_format: bool,
+ prior_page: str,
+ ) -> List[Dict[str, Any]]:
+ """Prepares the messages to send to the LiteLLM Completion API.
+
+ :param image_path: Path to the image file.
+ :type image_path: str
+ :param maintain_format: Whether to maintain the format from the previous page.
+ :type maintain_format: bool
+ :param prior_page: The markdown content of the previous page.
+ :type prior_page: str
+ """
+ # Default system message
+ messages: List[Dict[str, Any]] = [
+ {
+ "role": "system",
+ "content": self._system_prompt,
+ },
+ ]
+
+ # If content has already been generated, add it to context.
+ # This helps maintain the same format across pages.
+ if maintain_format and prior_page:
+ messages.append(
+ {
+ "role": "system",
+ "content": f'Markdown must maintain consistent formatting with the following page: \n\n """{prior_page}"""',
+ },
+ )
+
+ # Add Image to request
+ base64_image = await encode_image_to_base64(image_path)
+ messages.append(
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "image_url",
+ "image_url": {
+ "url": f"data:image/png;base64,{base64_image}"
+ },
+ },
+ ],
+ }
+ )
+
+ return messages
diff --git a/py/core/parsers/media/pyzerox/zerox_models/types.py b/py/core/parsers/media/pyzerox/zerox_models/types.py
new file mode 100644
index 000000000..0eea3e2ee
--- /dev/null
+++ b/py/core/parsers/media/pyzerox/zerox_models/types.py
@@ -0,0 +1,12 @@
+from dataclasses import dataclass
+
+
+@dataclass
+class CompletionResponse:
+ """
+ A class representing the response of a completion.
+ """
+
+ content: str
+ input_tokens: int
+ output_tokens: int
diff --git a/py/core/parsers/structured/csv_parser.py b/py/core/parsers/structured/csv_parser.py
index 41d2ec980..ab1e55e0d 100644
--- a/py/core/parsers/structured/csv_parser.py
+++ b/py/core/parsers/structured/csv_parser.py
@@ -16,7 +16,7 @@ def __init__(self):
self.StringIO = StringIO
async def ingest(
- self, data: Union[str, bytes]
+ self, data: Union[str, bytes], *args, **kwargs
) -> AsyncGenerator[str, None]:
"""Ingest CSV data and yield text from each row."""
if isinstance(data, bytes):
@@ -53,7 +53,11 @@ def get_delimiter(
return sniffer.sniff(data, delimiters=",;").delimiter
async def ingest(
- self, data: Union[str, bytes], num_col_times_num_rows: int = 100
+ self,
+ data: Union[str, bytes],
+ num_col_times_num_rows: int = 100,
+ *args,
+ **kwargs,
) -> AsyncGenerator[str, None]:
"""Ingest CSV data and yield text from each row."""
if isinstance(data, bytes):
diff --git a/py/core/parsers/structured/json_parser.py b/py/core/parsers/structured/json_parser.py
index 003061d5c..4e414fdeb 100644
--- a/py/core/parsers/structured/json_parser.py
+++ b/py/core/parsers/structured/json_parser.py
@@ -10,7 +10,7 @@ class JSONParser(AsyncParser[DataType]):
"""A parser for JSON data."""
async def ingest(
- self, data: DataType, **kwargs: Any
+ self, data: DataType, *args, **kwargs
) -> AsyncGenerator[str, None]:
"""
Ingest JSON data and yield a formatted text representation.
diff --git a/py/core/parsers/structured/xlsx_parser.py b/py/core/parsers/structured/xlsx_parser.py
index 33d2c4aa2..5237439ea 100644
--- a/py/core/parsers/structured/xlsx_parser.py
+++ b/py/core/parsers/structured/xlsx_parser.py
@@ -19,7 +19,9 @@ def __init__(self):
"Error, `openpyxl` is required to run `XLSXParser`. Please install it using `pip install openpyxl`."
)
- async def ingest(self, data: bytes) -> AsyncGenerator[str, None]:
+ async def ingest(
+ self, data: bytes, *args, **kwargs
+ ) -> AsyncGenerator[str, None]:
"""Ingest XLSX data and yield text from each row."""
if isinstance(data, str):
raise ValueError("XLSX data must be in bytes format.")
@@ -63,7 +65,7 @@ def connected_components(self, arr):
)
async def ingest(
- self, data: bytes, num_col_times_num_rows: int = 100
+ self, data: bytes, num_col_times_num_rows: int = 100, *args, **kwargs
) -> AsyncGenerator[str, None]:
"""Ingest XLSX data and yield text from each connected component."""
if isinstance(data, str):
diff --git a/py/core/parsers/text/md_parser.py b/py/core/parsers/text/md_parser.py
index 47c003057..725ae5724 100644
--- a/py/core/parsers/text/md_parser.py
+++ b/py/core/parsers/text/md_parser.py
@@ -15,7 +15,9 @@ def __init__(self):
self.markdown = markdown
- async def ingest(self, data: DataType) -> AsyncGenerator[str, None]:
+ async def ingest(
+ self, data: DataType, *args, **kwargs
+ ) -> AsyncGenerator[str, None]:
"""Ingest Markdown data and yield text."""
if isinstance(data, bytes):
data = data.decode("utf-8")
diff --git a/py/core/parsers/text/text_parser.py b/py/core/parsers/text/text_parser.py
index 999eaace4..da72ea85f 100644
--- a/py/core/parsers/text/text_parser.py
+++ b/py/core/parsers/text/text_parser.py
@@ -8,7 +8,9 @@
class TextParser(AsyncParser[DataType]):
"""A parser for raw text data."""
- async def ingest(self, data: DataType) -> AsyncGenerator[DataType, None]:
+ async def ingest(
+ self, data: DataType, *args, **kwargs
+ ) -> AsyncGenerator[DataType, None]:
if isinstance(data, bytes):
data = data.decode("utf-8")
yield data
diff --git a/py/core/pipes/kg/community_summary.py b/py/core/pipes/kg/community_summary.py
index 0acece79c..8af6684fc 100644
--- a/py/core/pipes/kg/community_summary.py
+++ b/py/core/pipes/kg/community_summary.py
@@ -3,7 +3,7 @@
import logging
from typing import Any, AsyncGenerator, Optional
from uuid import UUID
-
+import time
from core.base import (
AsyncPipe,
AsyncState,
@@ -193,20 +193,31 @@ async def _run_logic( # type: ignore
Executes the KG community summary pipe: summarizing communities.
"""
+ start_time = time.time()
+
offset = input.message["offset"]
limit = input.message["limit"]
generation_config = input.message["generation_config"]
max_summary_input_length = input.message["max_summary_input_length"]
collection_id = input.message["collection_id"]
community_summary_jobs = []
+ logger = input.message.get("logger", logging.getLogger(__name__))
# check which community summaries exist and don't run them again
+
+ logger.info(
+ f"KGCommunitySummaryPipe: Checking if community summaries exist for communities {offset} to {offset + limit}"
+ )
community_numbers_exist = (
await self.kg_provider.check_community_reports_exist(
collection_id=collection_id, offset=offset, limit=limit
)
)
+ logger.info(
+ f"KGCommunitySummaryPipe: Community summaries exist for communities {len(community_numbers_exist)}"
+ )
+
for community_number in range(offset, offset + limit):
if community_number not in community_numbers_exist:
community_summary_jobs.append(
@@ -218,5 +229,11 @@ async def _run_logic( # type: ignore
)
)
+ completed_community_summary_jobs = 0
for community_summary in asyncio.as_completed(community_summary_jobs):
+ completed_community_summary_jobs += 1
+ if completed_community_summary_jobs % 50 == 0:
+ logger.info(
+ f"KGCommunitySummaryPipe: {completed_community_summary_jobs}/{len(community_summary_jobs)} community summaries completed, elapsed time: {time.time() - start_time:.2f} seconds"
+ )
yield await community_summary
diff --git a/py/core/pipes/kg/entity_description.py b/py/core/pipes/kg/entity_description.py
index 12de049b3..cba1aaa8a 100644
--- a/py/core/pipes/kg/entity_description.py
+++ b/py/core/pipes/kg/entity_description.py
@@ -16,6 +16,7 @@
)
from core.base.abstractions import Entity
from core.base.pipes.base_pipe import AsyncPipe
+import time
logger = logging.getLogger(__name__)
@@ -60,6 +61,8 @@ async def _run_logic( # type: ignore
Extracts description from the input.
"""
+ start_time = time.time()
+
# TODO - Move this to a .yaml file and load it as we do in triples extraction
summarization_content = """
Provide a comprehensive yet concise summary of the given entity, incorporating its description and associated triples:
@@ -167,16 +170,23 @@ async def process_entity(
offset = input.message["offset"]
limit = input.message["limit"]
document_id = input.message["document_id"]
+ logger = input.message["logger"]
+
+ logger.info(
+ f"KGEntityDescriptionPipe: Getting entity map for document {document_id}",
+ )
+
entity_map = await self.kg_provider.get_entity_map(
offset, limit, document_id
)
-
total_entities = len(entity_map)
+
logger.info(
- f"Processing {total_entities} entities for document {document_id}"
+ f"KGEntityDescriptionPipe: Got entity map for document {document_id}, total entities: {total_entities}, time from start: {time.time() - start_time:.2f} seconds",
)
workflows = []
+
for i, (entity_name, entity_info) in enumerate(entity_map.items()):
try:
workflows.append(
@@ -190,9 +200,15 @@ async def process_entity(
except Exception as e:
logger.error(f"Error processing entity {entity_name}: {e}")
+ completed_entities = 0
for result in asyncio.as_completed(workflows):
+ if completed_entities % 100 == 0:
+ logger.info(
+ f"KGEntityDescriptionPipe: Completed {completed_entities+1} of {total_entities} entities for document {document_id}",
+ )
yield await result
+ completed_entities += 1
logger.info(
- f"Processed {total_entities} entities for document {document_id}"
+ f"KGEntityDescriptionPipe: Processed {total_entities} entities for document {document_id}, time from start: {time.time() - start_time:.2f} seconds",
)
diff --git a/py/core/pipes/kg/triples_extraction.py b/py/core/pipes/kg/triples_extraction.py
index e818b6cc9..e7e0a106a 100644
--- a/py/core/pipes/kg/triples_extraction.py
+++ b/py/core/pipes/kg/triples_extraction.py
@@ -3,7 +3,8 @@
import logging
import re
from typing import Any, AsyncGenerator, Optional, Union
-
+import time
+from shared.utils import HatchetLogger
from core.base import (
AsyncState,
CompletionProvider,
@@ -82,6 +83,11 @@ async def extract_kg(
relation_types: list[str],
retries: int = 5,
delay: int = 2,
+ logger: Union[logging.Logger, HatchetLogger] = logging.getLogger(
+ __name__
+ ),
+ task_id: Optional[int] = None,
+ total_tasks: Optional[int] = None,
) -> KGExtraction:
"""
Extracts NER triples from a extraction with retries.
@@ -207,6 +213,10 @@ def parse_fn(response_str: str) -> Any:
# raise e # you should raise an error.
# add metadata to entities and triples
+ logger.info(
+ f"KGExtractionPipe: Completed task number {task_id} of {total_tasks} for document {extractions[0].document_id}",
+ )
+
return KGExtraction(
extraction_ids=[extraction.id for extraction in extractions],
document_id=extractions[0].document_id,
@@ -222,7 +232,8 @@ async def _run_logic( # type: ignore
*args: Any,
**kwargs: Any,
) -> AsyncGenerator[Union[KGExtraction, R2RDocumentProcessingError], None]:
- logger.info("Running KG Extraction Pipe")
+
+ start_time = time.time()
document_id = input.message["document_id"]
generation_config = input.message["generation_config"]
@@ -230,6 +241,17 @@ async def _run_logic( # type: ignore
max_knowledge_triples = input.message["max_knowledge_triples"]
entity_types = input.message["entity_types"]
relation_types = input.message["relation_types"]
+
+ filter_out_existing_chunks = input.message.get(
+ "filter_out_existing_chunks", True
+ )
+
+ logger = input.message.get("logger", logging.getLogger(__name__))
+
+ logger.info(
+ f"KGTriplesExtractionPipe: Processing document {document_id} for KG extraction",
+ )
+
extractions = [
DocumentExtraction(
id=extraction["extraction_id"],
@@ -246,6 +268,33 @@ async def _run_logic( # type: ignore
]
]
+ logger.info(
+ f"Found {len(extractions)} extractions for document {document_id}"
+ )
+
+ if filter_out_existing_chunks:
+ existing_extraction_ids = (
+ await self.kg_provider.get_existing_entity_extraction_ids(
+ document_id=document_id
+ )
+ )
+ extractions = [
+ extraction
+ for extraction in extractions
+ if extraction.id not in existing_extraction_ids
+ ]
+ logger.info(
+ f"Filtered out {len(existing_extraction_ids)} existing extractions, remaining {len(extractions)} extractions for document {document_id}"
+ )
+
+ if len(extractions) == 0:
+ logger.info(f"No extractions left for document {document_id}")
+ return
+
+ logger.info(
+ f"KGTriplesExtractionPipe: Obtained {len(extractions)} extractions to process, time from start: {time.time() - start_time:.2f} seconds",
+ )
+
# sort the extractions accroding to chunk_order field in metadata in ascending order
extractions = sorted(
extractions, key=lambda x: x.metadata["chunk_order"]
@@ -257,6 +306,10 @@ async def _run_logic( # type: ignore
for i in range(0, len(extractions), extraction_merge_count)
]
+ logger.info(
+ f"KGTriplesExtractionPipe: Extracting KG Triples for document and created {len(extractions_groups)}, time from start: {time.time() - start_time:.2f} seconds",
+ )
+
tasks = [
asyncio.create_task(
self.extract_kg(
@@ -265,24 +318,36 @@ async def _run_logic( # type: ignore
max_knowledge_triples=max_knowledge_triples,
entity_types=entity_types,
relation_types=relation_types,
+ logger=logger,
+ task_id=task_id,
+ total_tasks=len(extractions_groups),
)
)
- for extractions_group in extractions_groups
+ for task_id, extractions_group in enumerate(extractions_groups)
]
completed_tasks = 0
total_tasks = len(tasks)
+ logger.info(
+ f"KGTriplesExtractionPipe: Waiting for {total_tasks} KG extraction tasks to complete",
+ )
+
for completed_task in asyncio.as_completed(tasks):
try:
yield await completed_task
completed_tasks += 1
- logger.info(
- f"Completed {completed_tasks}/{total_tasks} KG extraction tasks for document {document_id}"
- )
+ if completed_tasks % 100 == 0:
+ logger.info(
+ f"KGTriplesExtractionPipe: Completed {completed_tasks}/{total_tasks} KG extraction tasks",
+ )
except Exception as e:
logger.error(f"Error in Extracting KG Triples: {e}")
yield R2RDocumentProcessingError(
document_id=document_id,
error_message=str(e),
)
+
+ logger.info(
+ f"KGTriplesExtractionPipe: Completed {completed_tasks}/{total_tasks} KG extraction tasks, time from start: {time.time() - start_time:.2f} seconds",
+ )
diff --git a/py/core/providers/database/postgres.py b/py/core/providers/database/postgres.py
index 7cac9afb8..cc0f30770 100644
--- a/py/core/providers/database/postgres.py
+++ b/py/core/providers/database/postgres.py
@@ -13,6 +13,7 @@
RelationalDBProvider,
VectorDBProvider,
)
+from shared.abstractions.vector import VectorQuantizationType
from .relational import PostgresRelationalDBProvider
from .vector import PostgresVectorDBProvider
@@ -48,6 +49,7 @@ def __init__(
self,
config: DatabaseConfig,
dimension: int,
+ quantization_type: VectorQuantizationType,
crypto_provider: CryptoProvider,
*args,
**kwargs,
@@ -95,6 +97,7 @@ def __init__(
logger.info("Connecting to Postgres via TCP/IP")
self.vector_db_dimension = dimension
+ self.vector_db_quantization_type = quantization_type
self.conn = None
self.config: DatabaseConfig = config
self.crypto_provider = crypto_provider
@@ -119,6 +122,7 @@ def _initialize_vector_db(self) -> VectorDBProvider:
connection_string=self.connection_string,
project_name=self.project_name,
dimension=self.vector_db_dimension,
+ quantization_type=self.vector_db_quantization_type,
)
async def _initialize_relational_db(self) -> RelationalDBProvider:
diff --git a/py/core/providers/database/vecs/client.py b/py/core/providers/database/vecs/client.py
index dfb67d388..7da2f4747 100644
--- a/py/core/providers/database/vecs/client.py
+++ b/py/core/providers/database/vecs/client.py
@@ -17,6 +17,8 @@
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool
+from shared.abstractions.vector import VectorQuantizationType
+
from .adapter import Adapter
from .exc import CollectionNotFound
@@ -156,6 +158,7 @@ def get_or_create_vector_table(
*,
dimension: Optional[int] = None,
adapter: Optional[Adapter] = None,
+ quantization_type: Optional[VectorQuantizationType] = None,
) -> Collection:
"""
Get a vector collection by name, or create it if no collection with
@@ -181,6 +184,7 @@ def get_or_create_vector_table(
collection = Collection(
name=name,
dimension=dimension or adapter_dimension, # type: ignore
+ quantization_type=quantization_type,
client=self,
adapter=adapter,
)
diff --git a/py/core/providers/database/vecs/collection.py b/py/core/providers/database/vecs/collection.py
index 6770a7ab2..e3aa7ccaa 100644
--- a/py/core/providers/database/vecs/collection.py
+++ b/py/core/providers/database/vecs/collection.py
@@ -35,14 +35,15 @@
from core.base import VectorSearchResult
from core.base.abstractions import VectorSearchSettings
from shared.abstractions.vector import (
- INDEX_MEASURE_TO_OPS,
INDEX_MEASURE_TO_SQLA_ACC,
IndexArgsHNSW,
IndexArgsIVFFlat,
IndexMeasure,
IndexMethod,
+ VectorQuantizationType,
VectorTableName,
)
+from shared.utils import _decorate_vector_type
from .adapter import Adapter, AdapterContext, NoOp, Record
from .exc import (
@@ -57,15 +58,35 @@
from vecs.client import Client
+def index_measure_to_ops(
+ measure: IndexMeasure, quantization_type: VectorQuantizationType
+):
+ return _decorate_vector_type(measure.ops, quantization_type)
+
+
class Vector(UserDefinedType):
cache_ok = True
- def __init__(self, dim=None):
+ def __init__(
+ self,
+ dim=None,
+ quantization_type: Optional[
+ VectorQuantizationType
+ ] = VectorQuantizationType.FP32,
+ ):
super(UserDefinedType, self).__init__()
self.dim = dim
+ self.quantization_type = quantization_type
def get_col_spec(self, **kw):
- return "VECTOR" if self.dim is None else f"VECTOR({self.dim})"
+ col_spec = ""
+ if self.dim is None:
+ col_spec = _decorate_vector_type("", self.quantization_type)
+ else:
+ col_spec = _decorate_vector_type(
+ f"({self.dim})", self.quantization_type
+ )
+ return col_spec
def bind_processor(self, dialect):
def process(value):
@@ -131,6 +152,7 @@ def __init__(
self,
name: str,
dimension: int,
+ quantization_type: VectorQuantizationType,
client: Client,
adapter: Optional[Adapter] = None,
):
@@ -150,8 +172,13 @@ def __init__(
self.client = client
self.name = name
self.dimension = dimension
+ self.quantization_type = quantization_type
self.table = _build_table(
- client.project_name, name, client.meta, dimension
+ client.project_name,
+ name,
+ client.meta,
+ dimension,
+ quantization_type,
)
self._index: Optional[str] = None
self.adapter = adapter or Adapter(steps=[NoOp(dimension=dimension)])
@@ -862,7 +889,7 @@ def is_indexed_for_measure(self, measure: IndexMeasure):
if index_name is None:
return False
- ops = INDEX_MEASURE_TO_OPS.get(measure)
+ ops = index_measure_to_ops(measure, self.quantization_type)
if ops is None:
return False
@@ -891,6 +918,7 @@ def create_index(
] = None,
replace: bool = True,
concurrently: bool = True,
+ quantization_type: VectorQuantizationType = VectorQuantizationType.FP32,
) -> None:
"""
Creates an index for the collection.
@@ -978,7 +1006,9 @@ def create_index(
"HNSW Unavailable. Upgrade your pgvector installation to > 0.5.0 to enable HNSW support"
)
- ops = INDEX_MEASURE_TO_OPS.get(measure)
+ ops = index_measure_to_ops(
+ measure, quantization_type=self.quantization_type
+ )
if ops is None:
raise ArgError("Unknown index measure")
@@ -986,6 +1016,7 @@ def create_index(
concurrently_sql = "CONCURRENTLY" if concurrently else ""
# Drop existing index if needed (must be outside of transaction)
+ # Doesn't drop
if self.index is not None and replace:
drop_index_sql = f'DROP INDEX {concurrently_sql} IF EXISTS {self.client.project_name}."{self.index}";'
try:
@@ -1027,8 +1058,13 @@ def create_index(
def _build_table(
- project_name: str, name: str, meta: MetaData, dimension: int
+ project_name: str,
+ name: str,
+ meta: MetaData,
+ dimension: int,
+ quantization_type: VectorQuantizationType = VectorQuantizationType.FP32,
) -> Table:
+
table = Table(
name,
meta,
@@ -1040,7 +1076,11 @@ def _build_table(
postgresql.ARRAY(postgresql.UUID),
server_default="{}",
),
- Column("vec", Vector(dimension), nullable=False),
+ Column(
+ "vec",
+ Vector(dimension, quantization_type=quantization_type),
+ nullable=False,
+ ),
Column("text", postgresql.TEXT, nullable=True),
Column(
"fts",
diff --git a/py/core/providers/database/vector.py b/py/core/providers/database/vector.py
index 535dc770f..0b3b4b7d9 100644
--- a/py/core/providers/database/vector.py
+++ b/py/core/providers/database/vector.py
@@ -20,6 +20,7 @@
IndexArgsIVFFlat,
IndexMeasure,
IndexMethod,
+ VectorQuantizationType,
VectorTableName,
)
@@ -51,17 +52,20 @@ def __init__(self, config: DatabaseConfig, *args, **kwargs):
"Please provide a valid `project_name` to the `PostgresVectorDBProvider`."
)
dimension = kwargs.get("dimension", None)
+ quantization_type = kwargs.get("quantization_type", None)
if not dimension:
raise ValueError(
"Please provide a valid `dimension` to the `PostgresVectorDBProvider`."
)
- self._initialize_vector_db(dimension)
+ self._initialize_vector_db(dimension, quantization_type)
logger.info(
f"Successfully initialized PGVectorDB for project: {self.project_name}"
)
- def _initialize_vector_db(self, dimension: int) -> None:
+ def _initialize_vector_db(
+ self, dimension: int, quantization_type: VectorQuantizationType
+ ) -> None:
# Create extension for trigram similarity
with self.vx.Session() as sess:
sess.execute(text(f"CREATE EXTENSION IF NOT EXISTS pg_trgm;"))
@@ -69,7 +73,9 @@ def _initialize_vector_db(self, dimension: int) -> None:
sess.commit()
self.collection = self.vx.get_or_create_vector_table(
- name=self.project_name, dimension=dimension
+ name=self.project_name,
+ dimension=dimension,
+ quantization_type=quantization_type,
)
# NOTE: Do not create an index during initialization
@@ -316,7 +322,7 @@ def create_index(
)
end_time = time.time()
- logger.info(f"Index creation took {end_time - start_time} seconds")
+ logger.info(f"Index creation took {end_time - start_time:.2f} seconds")
def delete(
self,
diff --git a/py/core/providers/embeddings/litellm.py b/py/core/providers/embeddings/litellm.py
index 4d131c43d..0c8286154 100644
--- a/py/core/providers/embeddings/litellm.py
+++ b/py/core/providers/embeddings/litellm.py
@@ -1,8 +1,8 @@
import logging
-from typing import Any, List
+from typing import Any
import litellm
-from litellm import aembedding, embedding
+from litellm import aembedding, embedding, AuthenticationError
from core.base import (
EmbeddingConfig,
@@ -55,7 +55,7 @@ def _get_embedding_kwargs(self, **kwargs):
embedding_kwargs.update(kwargs)
return embedding_kwargs
- async def _execute_task(self, task: dict[str, Any]) -> List[List[float]]:
+ async def _execute_task(self, task: dict[str, Any]) -> list[list[float]]:
texts = task["texts"]
kwargs = self._get_embedding_kwargs(**task.get("kwargs", {}))
@@ -65,13 +65,18 @@ async def _execute_task(self, task: dict[str, Any]) -> List[List[float]]:
**kwargs,
)
return [data["embedding"] for data in response.data]
+ except AuthenticationError as e:
+ logger.error(
+ "Authentication error: Invalid API key or credentials."
+ )
+ raise
except Exception as e:
error_msg = f"Error getting embeddings: {str(e)}"
logger.error(error_msg)
raise R2RException(error_msg, 400)
- def _execute_task_sync(self, task: dict[str, Any]) -> List[List[float]]:
+ def _execute_task_sync(self, task: dict[str, Any]) -> list[list[float]]:
texts = task["texts"]
kwargs = self._get_embedding_kwargs(**task.get("kwargs", {}))
try:
@@ -80,6 +85,11 @@ def _execute_task_sync(self, task: dict[str, Any]) -> List[List[float]]:
**kwargs,
)
return [data["embedding"] for data in response.data]
+ except AuthenticationError as e:
+ logger.error(
+ "Authentication error: Invalid API key or credentials."
+ )
+ raise
except Exception as e:
error_msg = f"Error getting embeddings: {str(e)}"
logger.error(error_msg)
@@ -91,7 +101,7 @@ async def async_get_embedding(
stage: EmbeddingProvider.PipeStage = EmbeddingProvider.PipeStage.BASE,
purpose: EmbeddingPurpose = EmbeddingPurpose.INDEX,
**kwargs,
- ) -> List[float]:
+ ) -> list[float]:
if stage != EmbeddingProvider.PipeStage.BASE:
raise ValueError(
"LiteLLMEmbeddingProvider only supports search stage."
@@ -111,7 +121,7 @@ def get_embedding(
stage: EmbeddingProvider.PipeStage = EmbeddingProvider.PipeStage.BASE,
purpose: EmbeddingPurpose = EmbeddingPurpose.INDEX,
**kwargs,
- ) -> List[float]:
+ ) -> list[float]:
if stage != EmbeddingProvider.PipeStage.BASE:
raise ValueError(
"Error getting embeddings: LiteLLMEmbeddingProvider only supports search stage."
@@ -127,11 +137,11 @@ def get_embedding(
async def async_get_embeddings(
self,
- texts: List[str],
+ texts: list[str],
stage: EmbeddingProvider.PipeStage = EmbeddingProvider.PipeStage.BASE,
purpose: EmbeddingPurpose = EmbeddingPurpose.INDEX,
**kwargs,
- ) -> List[List[float]]:
+ ) -> list[list[float]]:
if stage != EmbeddingProvider.PipeStage.BASE:
raise ValueError(
"LiteLLMEmbeddingProvider only supports search stage."
@@ -147,11 +157,11 @@ async def async_get_embeddings(
def get_embeddings(
self,
- texts: List[str],
+ texts: list[str],
stage: EmbeddingProvider.PipeStage = EmbeddingProvider.PipeStage.BASE,
purpose: EmbeddingPurpose = EmbeddingPurpose.INDEX,
**kwargs,
- ) -> List[List[float]]:
+ ) -> list[list[float]]:
if stage != EmbeddingProvider.PipeStage.BASE:
raise ValueError(
"LiteLLMEmbeddingProvider only supports search stage."
diff --git a/py/core/providers/ingestion/r2r/base.py b/py/core/providers/ingestion/r2r/base.py
index 889c7b463..5f09852af 100644
--- a/py/core/providers/ingestion/r2r/base.py
+++ b/py/core/providers/ingestion/r2r/base.py
@@ -31,23 +31,33 @@ class R2RIngestionConfig(IngestionConfig):
class R2RIngestionProvider(IngestionProvider):
- AVAILABLE_PARSERS = {
- DocumentType.CSV: [parsers.CSVParser, parsers.CSVParserAdvanced],
- DocumentType.DOCX: [parsers.DOCXParser],
- DocumentType.HTML: [parsers.HTMLParser],
- DocumentType.HTM: [parsers.HTMLParser],
- DocumentType.JSON: [parsers.JSONParser],
- DocumentType.MD: [parsers.MDParser],
- DocumentType.PDF: [parsers.PDFParser, parsers.PDFParserUnstructured],
- DocumentType.PPTX: [parsers.PPTParser],
- DocumentType.TXT: [parsers.TextParser],
- DocumentType.XLSX: [parsers.XLSXParser, parsers.XLSXParserAdvanced],
- DocumentType.GIF: [parsers.ImageParser],
- DocumentType.JPEG: [parsers.ImageParser],
- DocumentType.JPG: [parsers.ImageParser],
- DocumentType.PNG: [parsers.ImageParser],
- DocumentType.SVG: [parsers.ImageParser],
- DocumentType.MP3: [parsers.AudioParser],
+ DEFAULT_PARSERS = {
+ DocumentType.CSV: parsers.CSVParser,
+ DocumentType.DOCX: parsers.DOCXParser,
+ DocumentType.HTML: parsers.HTMLParser,
+ DocumentType.HTM: parsers.HTMLParser,
+ DocumentType.JSON: parsers.JSONParser,
+ DocumentType.MD: parsers.MDParser,
+ DocumentType.PDF: parsers.PDFParser,
+ DocumentType.PPTX: parsers.PPTParser,
+ DocumentType.TXT: parsers.TextParser,
+ DocumentType.XLSX: parsers.XLSXParser,
+ DocumentType.GIF: parsers.ImageParser,
+ DocumentType.JPEG: parsers.ImageParser,
+ DocumentType.JPG: parsers.ImageParser,
+ DocumentType.PNG: parsers.ImageParser,
+ DocumentType.SVG: parsers.ImageParser,
+ DocumentType.MP3: parsers.AudioParser,
+ }
+
+ EXTRA_PARSERS = {
+ DocumentType.CSV: {"advanced": parsers.CSVParserAdvanced},
+ DocumentType.PDF: {
+ "unstructured": parsers.PDFParserUnstructured,
+ "zerox": parsers.ZeroxPDFParser,
+ "marker": parsers.PDFParserMarker,
+ },
+ DocumentType.XLSX: {"advanced": parsers.XLSXParserAdvanced},
}
IMAGE_TYPES = {
@@ -70,14 +80,14 @@ def __init__(self, config: R2RIngestionConfig):
)
def _initialize_parsers(self):
- for doc_type, parser_infos in self.AVAILABLE_PARSERS.items():
- for parser_info in parser_infos:
- if (
- doc_type not in self.config.excluded_parsers
- and doc_type not in self.parsers
- ):
- # will choose the first parser in the list
- self.parsers[doc_type] = parser_info()
+ for doc_type, parser in self.DEFAULT_PARSERS.items():
+ # will choose the first parser in the list
+ if doc_type not in self.config.excluded_parsers:
+ self.parsers[doc_type] = parser()
+ for doc_type, doc_parser_name in self.config.extra_parsers.items():
+ self.parsers[f"{doc_parser_name}_{str(doc_type)}"] = (
+ R2RIngestionProvider.EXTRA_PARSERS[doc_type][doc_parser_name]()
+ )
def _build_text_splitter(
self, ingestion_config_override: Optional[dict] = None
@@ -176,10 +186,31 @@ async def parse( # type: ignore
)
else:
t0 = time.time()
-
contents = ""
- async for text in self.parsers[document.type].ingest(file_content):
- contents += text + "\n"
+ parser_overrides = ingestion_config_override.get(
+ "parser_overrides", {}
+ )
+ if document.type.value in parser_overrides:
+ logger.info(
+ f"Using parser_override for {document.type} with input value {parser_overrides[document.type.value]}"
+ )
+ # TODO - Cleanup this approach to be less hardcoded
+ if (
+ document.type != DocumentType.PDF
+ or parser_overrides[DocumentType.PDF.value] != "zerox"
+ ):
+ raise ValueError(
+ "Only Zerox PDF parser override is available."
+ )
+ async for text in self.parsers[
+ f"zerox_{DocumentType.PDF.value}"
+ ].ingest(file_content, **ingestion_config_override):
+ contents += text + "\n"
+ else:
+ async for text in self.parsers[document.type].ingest(
+ file_content, **ingestion_config_override
+ ):
+ contents += text + "\n"
iteration = 0
chunks = self.chunk(contents, ingestion_config_override)
diff --git a/py/core/providers/ingestion/unstructured/base.py b/py/core/providers/ingestion/unstructured/base.py
index 54524085f..ff68ed8c3 100644
--- a/py/core/providers/ingestion/unstructured/base.py
+++ b/py/core/providers/ingestion/unstructured/base.py
@@ -18,6 +18,7 @@
Document,
DocumentExtraction,
DocumentType,
+ RecursiveCharacterTextSplitter,
)
from core.base.abstractions import R2RSerializable
from core.base.providers.ingestion import IngestionConfig, IngestionProvider
@@ -35,6 +36,7 @@ class UnstructuredIngestionConfig(IngestionConfig):
combine_under_n_chars: int = 128
max_characters: int = 500
new_after_n_chars: int = 1500
+ overlap: int = 64
coordinates: Optional[bool] = None
encoding: Optional[str] = None # utf-8
@@ -48,7 +50,6 @@ class UnstructuredIngestionConfig(IngestionConfig):
multipage_sections: Optional[bool] = None
ocr_languages: Optional[list[str]] = None
# output_format: Optional[str] = "application/json"
- overlap: Optional[int] = None
overlap_all: Optional[bool] = None
pdf_infer_table_structure: Optional[bool] = None
@@ -87,6 +88,16 @@ class UnstructuredIngestionProvider(IngestionProvider):
DocumentType.XLSX: [parsers.XLSXParser], # type: ignore
}
+ EXTRA_PARSERS = {
+ DocumentType.CSV: {"advanced": parsers.CSVParserAdvanced}, # type: ignore
+ DocumentType.PDF: {
+ "unstructured": parsers.PDFParserUnstructured,
+ "zerox": parsers.ZeroxPDFParser,
+ "marker": parsers.PDFParserMarker,
+ },
+ DocumentType.XLSX: {"advanced": parsers.XLSXParserAdvanced}, # type: ignore
+ }
+
IMAGE_TYPES = {
DocumentType.GIF,
DocumentType.JPG,
@@ -108,7 +119,7 @@ def __init__(self, config: UnstructuredIngestionConfig):
self.unstructured_api_url = os.environ.get(
"UNSTRUCTURED_API_URL",
- "https://api.unstructured.io/general/v0/general",
+ "https://api.unstructuredapp.io/general/v0/general",
)
self.client = UnstructuredClient(
@@ -143,21 +154,37 @@ def _initialize_parsers(self):
):
# will choose the first parser in the list
self.parsers[doc_type] = parser_info()
+ # TODO - Reduce code duplication between Unstructured & R2R
+ for doc_type, doc_parser_name in self.config.extra_parsers.items():
+ self.parsers[f"{doc_parser_name}_{str(doc_type)}"] = (
+ UnstructuredIngestionProvider.EXTRA_PARSERS[doc_type][
+ doc_parser_name
+ ]()
+ )
async def parse_fallback(
- self, file_content: bytes, document: Document, chunk_size: int
+ self,
+ file_content: bytes,
+ ingestion_config: dict,
+ parser_name: str,
) -> AsyncGenerator[FallbackElement, None]:
- texts = self.parsers[document.type].ingest( # type: ignore
- file_content, chunk_size=chunk_size
+ context = ""
+ async for text in self.parsers[parser_name].ingest(file_content, **ingestion_config): # type: ignore
+ context += text + "\n\n"
+ logging.info(f"Fallback ingestion with config = {ingestion_config}")
+ splitter = RecursiveCharacterTextSplitter(
+ chunk_size=ingestion_config["new_after_n_chars"],
+ chunk_overlap=ingestion_config["overlap"],
)
chunk_id = 0
- async for text in texts: # type: ignore
- if text and text != "":
- yield FallbackElement(
- text=text, metadata={"chunk_id": chunk_id}
- )
- chunk_id += 1
+
+ for text_chunk in splitter.create_documents([context]):
+ yield FallbackElement(
+ text=text_chunk.page_content,
+ metadata={"chunk_id": chunk_id},
+ )
+ chunk_id += 1
async def parse(
self,
@@ -166,24 +193,43 @@ async def parse(
ingestion_config_override: dict,
) -> AsyncGenerator[DocumentExtraction, None]:
- ingestion_config = {
- **self.config.to_ingestion_request(),
- **(ingestion_config_override or {}),
- }
+ ingestion_config = copy(
+ {
+ **self.config.to_ingestion_request(),
+ **(ingestion_config_override or {}),
+ }
+ )
# cleanup extra fields
ingestion_config.pop("provider", None)
ingestion_config.pop("excluded_parsers", None)
t0 = time.time()
- if document.type in self.R2R_FALLBACK_PARSERS.keys():
+ parser_overrides = ingestion_config_override.get(
+ "parser_overrides", {}
+ )
+ elements = []
+
+ # TODO - Cleanup this approach to be less hardcoded
+ # TODO - Remove code duplication between Unstructured & R2R
+ if document.type.value in parser_overrides:
+ logger.info(
+ f"Using parser_override for {document.type} with input value {parser_overrides[document.type.value]}"
+ )
+ async for element in self.parse_fallback(
+ file_content,
+ ingestion_config=ingestion_config,
+ parser_name=f"zerox_{DocumentType.PDF.value}",
+ ):
+ elements.append(element)
+
+ elif document.type in self.R2R_FALLBACK_PARSERS.keys():
logger.info(
f"Parsing {document.type}: {document.id} with fallback parser"
)
- elements = []
async for element in self.parse_fallback(
file_content,
- document,
- chunk_size=self.config.combine_under_n_chars,
+ ingestion_config=ingestion_config,
+ parser_name=document.type,
):
elements.append(element)
else:
@@ -201,6 +247,9 @@ async def parse(
file_name=document.metadata.get("title", "unknown_file"),
)
+ ingestion_config.pop("app", None)
+ ingestion_config.pop("extra_parsers", None)
+
req = self.operations.PartitionRequest(
self.shared.PartitionParameters(
files=files,
diff --git a/py/core/providers/kg/postgres.py b/py/core/providers/kg/postgres.py
index 3a1467925..9a51305fe 100644
--- a/py/core/providers/kg/postgres.py
+++ b/py/core/providers/kg/postgres.py
@@ -17,11 +17,12 @@
Triple,
)
from shared.abstractions import KGCreationSettings, KGEnrichmentSettings
+from shared.abstractions.vector import VectorQuantizationType
from shared.api.models.kg.responses import (
KGCreationEstimationResponse,
KGEnrichmentEstimationResponse,
)
-from shared.utils import llm_cost_per_million_tokens
+from shared.utils import _decorate_vector_type, llm_cost_per_million_tokens
logger = logging.getLogger(__name__)
@@ -54,7 +55,10 @@ async def initialize(self):
logger.info(
f"Initializing PostgresKGProvider for project {self.db_provider.project_name}"
)
- await self.create_tables(project_name=self.db_provider.project_name)
+ await self.create_tables(
+ embedding_dim=self.embedding_provider.config.base_dimension,
+ quantization_type=self.embedding_provider.config.quantization_settings.quantization_type,
+ )
async def execute_query(
self, query: str, params: Optional[list[Any]] = None
@@ -79,10 +83,16 @@ async def fetch_query(
def _get_table_name(self, base_name: str) -> str:
return self.db_provider._get_table_name(base_name)
- async def create_tables(self, project_name: str):
+ async def create_tables(
+ self, embedding_dim: int, quantization_type: VectorQuantizationType
+ ):
# raw entities table
# create schema
+ vector_column_str = _decorate_vector_type(
+ f"({embedding_dim})", quantization_type
+ )
+
query = f"""
CREATE TABLE IF NOT EXISTS {self._get_table_name("entity_raw")} (
id SERIAL PRIMARY KEY,
@@ -105,7 +115,7 @@ async def create_tables(self, project_name: str):
object TEXT NOT NULL,
weight FLOAT NOT NULL,
description TEXT NOT NULL,
- embedding vector({self.embedding_provider.config.base_dimension}),
+ embedding {vector_column_str},
extraction_ids UUID[] NOT NULL,
document_id UUID NOT NULL,
attributes JSONB NOT NULL
@@ -113,39 +123,6 @@ async def create_tables(self, project_name: str):
"""
await self.execute_query(query)
- # entity description table, unique by document_id, category, name
- query = f"""
- CREATE TABLE IF NOT EXISTS {self._get_table_name("entity_description")} (
- id SERIAL PRIMARY KEY,
- document_id UUID NOT NULL,
- category TEXT NOT NULL,
- name TEXT NOT NULL,
- description TEXT NOT NULL,
- description_embedding vector(1536),
- extraction_ids UUID[] NOT NULL,
- attributes JSONB NOT NULL,
- UNIQUE (document_id, category, name)
- );"""
-
- await self.execute_query(query)
-
- # triples table 2 # Relationship summaries by document ID
- query = f"""
- CREATE TABLE IF NOT EXISTS {self._get_table_name("triple_description")} (
- id SERIAL PRIMARY KEY,
- document_ids UUID[] NOT NULL,
- subject TEXT NOT NULL,
- predicate TEXT NOT NULL,
- object TEXT NOT NULL,
- weight FLOAT NOT NULL,
- description TEXT NOT NULL,
- extraction_ids UUID[] NOT NULL,
- attributes JSONB NOT NULL,
- UNIQUE (document_ids, subject, predicate, object)
- );"""
-
- await self.execute_query(query)
-
# embeddings tables
query = f"""
CREATE TABLE IF NOT EXISTS {self._get_table_name("entity_embedding")} (
@@ -153,7 +130,7 @@ async def create_tables(self, project_name: str):
name TEXT NOT NULL,
description TEXT NOT NULL,
extraction_ids UUID[] NOT NULL,
- description_embedding vector({self.embedding_provider.config.base_dimension}) NOT NULL,
+ description_embedding {vector_column_str} NOT NULL,
document_id UUID NOT NULL,
UNIQUE (name, document_id)
);
@@ -188,7 +165,7 @@ async def create_tables(self, project_name: str):
findings TEXT[] NOT NULL,
rating FLOAT NOT NULL,
rating_explanation TEXT NOT NULL,
- embedding vector({self.embedding_provider.config.base_dimension}) NOT NULL,
+ embedding {vector_column_str} NOT NULL,
attributes JSONB,
UNIQUE (community_number, level, collection_id)
);"""
@@ -223,7 +200,7 @@ async def _add_objects(
)
for obj in objects
]
- return await self.execute_many(QUERY, params)
+ return await self.execute_many(QUERY, params) # type: ignore
async def add_entities(
self,
@@ -780,12 +757,74 @@ async def delete_graph_for_collection(
QUERY, [KGExtractionStatus.PENDING, collection_id]
)
+ async def delete_node_via_document_id(
+ self, document_id: UUID, collection_id: UUID
+ ) -> None:
+ # don't delete if status is PROCESSING.
+ QUERY = f"""
+ SELECT kg_enrichment_status FROM {self._get_table_name("collections")} WHERE collection_id = $1
+ """
+ status = (await self.fetch_query(QUERY, [collection_id]))[0][
+ "kg_enrichment_status"
+ ]
+ if status == KGExtractionStatus.PROCESSING.value:
+ return
+
+ # Execute separate DELETE queries
+ delete_queries = [
+ f"DELETE FROM {self._get_table_name('entity_raw')} WHERE document_id = $1",
+ f"DELETE FROM {self._get_table_name('triple_raw')} WHERE document_id = $1",
+ f"DELETE FROM {self._get_table_name('entity_embedding')} WHERE document_id = $1",
+ ]
+
+ for query in delete_queries:
+ await self.execute_query(query, [document_id])
+
+ # Check if this is the last document in the collection
+ documents = await self.db_provider.documents_in_collection(
+ collection_id
+ )
+ count = documents["total_entries"]
+
+ if count == 0:
+ # If it's the last document, delete collection-related data
+ collection_queries = [
+ f"DELETE FROM {self._get_table_name('community')} WHERE collection_id = $1",
+ f"DELETE FROM {self._get_table_name('community_report')} WHERE collection_id = $1",
+ ]
+ for query in collection_queries:
+ await self.execute_query(
+ query, [collection_id]
+ ) # Ensure collection_id is in a list
+
+ # set status to PENDING for this collection.
+ QUERY = f"""
+ UPDATE {self._get_table_name("collections")} SET kg_enrichment_status = $1 WHERE collection_id = $2
+ """
+ await self.execute_query(
+ QUERY, [KGExtractionStatus.PENDING, collection_id]
+ )
+ return None
+ return None
+
def _get_str_estimation_output(self, x: tuple[Any, Any]) -> str:
if isinstance(x[0], int) and isinstance(x[1], int):
return " - ".join(map(str, x))
else:
return " - ".join(f"{round(a, 2)}" for a in x)
+ async def get_existing_entity_extraction_ids(
+ self, document_id: UUID
+ ) -> list[str]:
+ QUERY = f"""
+ SELECT DISTINCT unnest(extraction_ids) AS extraction_id FROM {self._get_table_name("entity_raw")} WHERE document_id = $1
+ """
+ extraction_ids = [
+ item["extraction_id"]
+ for item in await self.fetch_query(QUERY, [document_id])
+ ]
+ return extraction_ids
+
async def get_creation_estimate(
self, collection_id: UUID, kg_creation_settings: KGCreationSettings
) -> KGCreationEstimationResponse:
@@ -1049,6 +1088,7 @@ async def get_entity_count(
self,
collection_id: Optional[UUID] = None,
document_id: Optional[UUID] = None,
+ distinct: bool = False,
entity_table_name: str = "entity_embedding",
) -> int:
if collection_id is None and document_id is None:
@@ -1073,8 +1113,13 @@ async def get_entity_count(
conditions.append("document_id = $1")
params.append(str(document_id))
+ if distinct:
+ count_value = "DISTINCT name"
+ else:
+ count_value = "*"
+
QUERY = f"""
- SELECT COUNT(*) FROM {self._get_table_name(entity_table_name)}
+ SELECT COUNT({count_value}) FROM {self._get_table_name(entity_table_name)}
WHERE {" AND ".join(conditions)}
"""
return (await self.fetch_query(QUERY, params))[0]["count"]
diff --git a/py/poetry.lock b/py/poetry.lock
index 07906bb8e..9d0c54f43 100644
--- a/py/poetry.lock
+++ b/py/poetry.lock
@@ -1,4 +1,15 @@
-# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
+
+[[package]]
+name = "aiofiles"
+version = "24.1.0"
+description = "File support for asyncio."
+optional = true
+python-versions = ">=3.8"
+files = [
+ {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"},
+ {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"},
+]
[[package]]
name = "aiohappyeyeballs"
@@ -13,108 +24,107 @@ files = [
[[package]]
name = "aiohttp"
-version = "3.10.8"
+version = "3.10.10"
description = "Async http client/server framework (asyncio)"
optional = true
python-versions = ">=3.8"
files = [
- {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"},
- {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"},
- {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"},
- {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"},
- {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"},
- {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"},
- {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"},
- {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"},
- {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"},
- {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"},
- {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"},
- {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"},
- {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"},
- {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"},
- {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"},
- {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"},
- {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"},
- {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"},
- {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"},
- {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"},
- {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"},
- {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"},
- {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"},
- {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"},
- {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"},
- {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"},
- {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"},
- {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"},
- {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"},
- {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"},
- {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"},
- {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"},
- {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"},
- {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"},
- {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"},
- {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"},
- {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"},
- {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"},
- {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"},
- {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"},
- {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"},
- {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"},
- {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"},
- {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"},
- {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"},
- {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"},
- {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"},
- {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"},
- {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"},
- {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"},
- {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"},
- {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"},
- {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"},
- {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"},
- {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"},
- {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"},
- {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"},
- {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"},
- {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"},
- {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"},
- {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"},
- {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"},
- {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"},
- {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"},
- {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"},
- {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"},
- {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"},
- {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"},
- {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"},
- {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"},
- {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"},
- {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"},
- {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"},
- {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"},
- {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"},
- {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"},
- {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"},
- {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"},
- {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"},
- {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"},
- {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"},
- {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"},
- {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"},
- {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"},
- {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"},
- {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"},
- {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"},
- {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"},
- {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"},
- {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"},
- {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"},
+ {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"},
+ {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"},
+ {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"},
+ {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"},
+ {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"},
+ {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"},
+ {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"},
+ {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"},
+ {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"},
+ {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"},
+ {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"},
+ {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"},
+ {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"},
+ {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"},
+ {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"},
+ {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"},
+ {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"},
+ {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"},
+ {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"},
+ {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"},
+ {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"},
+ {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"},
+ {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"},
+ {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"},
+ {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"},
+ {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"},
+ {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"},
+ {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"},
+ {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"},
+ {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"},
+ {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"},
]
[package.dependencies]
aiohappyeyeballs = ">=2.3.0"
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"
@@ -137,6 +147,17 @@ files = [
[package.dependencies]
aiohttp = "*"
+[[package]]
+name = "aioshutil"
+version = "1.5"
+description = "Asynchronous shutil module."
+optional = true
+python-versions = ">=3.8"
+files = [
+ {file = "aioshutil-1.5-py3-none-any.whl", hash = "sha256:bc2a6cdcf1a8615b62f856154fd81131031d03f2834912ebb06d8a2391253652"},
+ {file = "aioshutil-1.5.tar.gz", hash = "sha256:2756d6cd3bb03405dc7348ac11a0b60eb949ebd63cdd15f56e922410231c1201"},
+]
+
[[package]]
name = "aiosignal"
version = "1.3.1"
@@ -196,24 +217,22 @@ files = [
[[package]]
name = "anyio"
-version = "4.6.0"
+version = "4.6.2.post1"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
optional = false
python-versions = ">=3.9"
files = [
- {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"},
- {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"},
+ {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"},
+ {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"},
]
[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.4,<8.0)", "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.21.0b1)"]
+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", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"]
trio = ["trio (>=0.26.1)"]
[[package]]
@@ -450,7 +469,7 @@ test-tox-coverage = ["coverage (>=5.5)"]
name = "beautifulsoup4"
version = "4.12.3"
description = "Screen-scraping library"
-optional = false
+optional = true
python-versions = ">=3.6.0"
files = [
{file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"},
@@ -469,33 +488,33 @@ lxml = ["lxml"]
[[package]]
name = "black"
-version = "24.8.0"
+version = "24.10.0"
description = "The uncompromising code formatter."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"},
- {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"},
- {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"},
- {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"},
- {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"},
- {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"},
- {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"},
- {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"},
- {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"},
- {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"},
- {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"},
- {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"},
- {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"},
- {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"},
- {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"},
- {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"},
- {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"},
- {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"},
- {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"},
- {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"},
- {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"},
- {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"},
+ {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"},
+ {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"},
+ {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"},
+ {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"},
+ {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"},
+ {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"},
+ {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"},
+ {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"},
+ {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"},
+ {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"},
+ {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"},
+ {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"},
+ {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"},
+ {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"},
+ {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"},
+ {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"},
+ {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"},
+ {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"},
+ {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"},
+ {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"},
+ {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"},
+ {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"},
]
[package.dependencies]
@@ -504,28 +523,26 @@ mypy-extensions = ">=0.4.3"
packaging = ">=22.0"
pathspec = ">=0.9.0"
platformdirs = ">=2"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
[package.extras]
colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"]
+d = ["aiohttp (>=3.10)"]
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "boto3"
-version = "1.35.33"
+version = "1.35.40"
description = "The AWS SDK for Python"
optional = true
python-versions = ">=3.8"
files = [
- {file = "boto3-1.35.33-py3-none-any.whl", hash = "sha256:4064e95d4035d4d3dd4eb59eaa5908d14d194b512d1dc1d271647b0c661fbdbb"},
- {file = "boto3-1.35.33.tar.gz", hash = "sha256:d206e8295e856ded7c8fab086784dc17863ed9d735458145c2ef5b25604aef69"},
+ {file = "boto3-1.35.40-py3-none-any.whl", hash = "sha256:9352f6d61f15c789231a5d608613f03425059072ed862c32e1ed102b17206abf"},
+ {file = "boto3-1.35.40.tar.gz", hash = "sha256:33c6a7aeab316f7e0b3ad8552afe95a4a10bfd58519d00741c4d4f3047da8382"},
]
[package.dependencies]
-botocore = ">=1.35.33,<1.36.0"
+botocore = ">=1.35.40,<1.36.0"
jmespath = ">=0.7.1,<2.0.0"
s3transfer = ">=0.10.0,<0.11.0"
@@ -534,13 +551,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
[[package]]
name = "botocore"
-version = "1.35.33"
+version = "1.35.40"
description = "Low-level, data-driven core of boto 3."
optional = true
python-versions = ">=3.8"
files = [
- {file = "botocore-1.35.33-py3-none-any.whl", hash = "sha256:b7b1ed59a224616912c7546fa19ffd542c745818179ee0640a8a00b155bcd9cd"},
- {file = "botocore-1.35.33.tar.gz", hash = "sha256:b149940c59aa318e020191c9e5644361b2371e77d0346a3819728b49d3fa2e4e"},
+ {file = "botocore-1.35.40-py3-none-any.whl", hash = "sha256:072cc47f29cb1de4fa77ce6632e4f0480af29b70816973ff415fbaa3f50bd1db"},
+ {file = "botocore-1.35.40.tar.gz", hash = "sha256:547e0a983856c7d7aeaa30fca2a283873c57c07366cd806d2d639856341b3c31"},
]
[package.dependencies]
@@ -555,7 +572,7 @@ crt = ["awscrt (==0.22.0)"]
name = "bs4"
version = "0.0.2"
description = "Dummy package for Beautiful Soup (beautifulsoup4)"
-optional = false
+optional = true
python-versions = "*"
files = [
{file = "bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"},
@@ -668,101 +685,116 @@ files = [
[[package]]
name = "charset-normalizer"
-version = "3.3.2"
+version = "3.4.0"
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"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"},
+ {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"},
+ {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"},
+ {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"},
+ {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"},
+ {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"},
+ {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"},
+ {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"},
+ {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"},
+ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
]
[[package]]
@@ -891,88 +923,75 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist"
[[package]]
name = "coverage"
-version = "7.6.1"
+version = "7.6.3"
description = "Code coverage measurement for Python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"},
- {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"},
- {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"},
- {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"},
- {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"},
- {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"},
- {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"},
- {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"},
- {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"},
- {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"},
- {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"},
- {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"},
- {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"},
- {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"},
- {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"},
- {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"},
- {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"},
- {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"},
- {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"},
- {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"},
- {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"},
- {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"},
- {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"},
- {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"},
- {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"},
- {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"},
- {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"},
- {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"},
- {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"},
- {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"},
- {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"},
- {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"},
- {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"},
- {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"},
- {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"},
- {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"},
- {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"},
- {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"},
- {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"},
- {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"},
- {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"},
- {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"},
- {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"},
- {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"},
+ {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"},
+ {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"},
+ {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"},
+ {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"},
+ {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"},
+ {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"},
+ {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"},
+ {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"},
+ {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"},
+ {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"},
+ {file = "coverage-7.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b"},
+ {file = "coverage-7.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba"},
+ {file = "coverage-7.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38"},
+ {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549"},
+ {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2"},
+ {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175"},
+ {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b"},
+ {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f"},
+ {file = "coverage-7.6.3-cp311-cp311-win32.whl", hash = "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97"},
+ {file = "coverage-7.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6"},
+ {file = "coverage-7.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6"},
+ {file = "coverage-7.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f"},
+ {file = "coverage-7.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234"},
+ {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f"},
+ {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4"},
+ {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3"},
+ {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83"},
+ {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167"},
+ {file = "coverage-7.6.3-cp312-cp312-win32.whl", hash = "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd"},
+ {file = "coverage-7.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6"},
+ {file = "coverage-7.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6"},
+ {file = "coverage-7.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929"},
+ {file = "coverage-7.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990"},
+ {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4"},
+ {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39"},
+ {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21"},
+ {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b"},
+ {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4"},
+ {file = "coverage-7.6.3-cp313-cp313-win32.whl", hash = "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f"},
+ {file = "coverage-7.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce"},
+ {file = "coverage-7.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3"},
+ {file = "coverage-7.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3"},
+ {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d"},
+ {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38"},
+ {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd"},
+ {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92"},
+ {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5"},
+ {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91"},
+ {file = "coverage-7.6.3-cp313-cp313t-win32.whl", hash = "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43"},
+ {file = "coverage-7.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0"},
+ {file = "coverage-7.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2"},
+ {file = "coverage-7.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba"},
+ {file = "coverage-7.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c"},
+ {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40"},
+ {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e"},
+ {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6"},
+ {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb"},
+ {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13"},
+ {file = "coverage-7.6.3-cp39-cp39-win32.whl", hash = "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3"},
+ {file = "coverage-7.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d"},
+ {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"},
+ {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"},
]
-[package.dependencies]
-tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
-
[package.extras]
toml = ["tomli"]
@@ -1106,13 +1125,13 @@ packaging = "*"
[[package]]
name = "distlib"
-version = "0.3.8"
+version = "0.3.9"
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"},
+ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"},
+ {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
]
[[package]]
@@ -1128,21 +1147,21 @@ files = [
[[package]]
name = "dnspython"
-version = "2.6.1"
+version = "2.7.0"
description = "DNS toolkit"
optional = true
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"},
- {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"},
+ {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"},
+ {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"},
]
[package.extras]
-dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"]
-dnssec = ["cryptography (>=41)"]
+dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "hypercorn (>=0.16.0)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "quart-trio (>=0.11.0)", "sphinx (>=7.2.0)", "sphinx-rtd-theme (>=2.0.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"]
+dnssec = ["cryptography (>=43)"]
doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"]
-doq = ["aioquic (>=0.9.25)"]
-idna = ["idna (>=3.6)"]
+doq = ["aioquic (>=1.0.0)"]
+idna = ["idna (>=3.7)"]
trio = ["trio (>=0.23)"]
wmi = ["wmi (>=1.5.1)"]
@@ -1172,20 +1191,6 @@ files = [
{file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
]
-[[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 = "fastapi"
version = "0.114.2"
@@ -1523,17 +1528,17 @@ test-win = ["POT", "pytest", "pytest-cov", "testfixtures"]
[[package]]
name = "gotrue"
-version = "2.9.1"
+version = "2.9.2"
description = "Python Client Library for Supabase Auth"
optional = true
python-versions = "<4.0,>=3.8"
files = [
- {file = "gotrue-2.9.1-py3-none-any.whl", hash = "sha256:6ffccd0d971d8e2883a650640fa94e53483c022119d687d1496cd79040736127"},
- {file = "gotrue-2.9.1.tar.gz", hash = "sha256:bc076c2030e5b5a189937fc1985b311844105ad1c78685b353f05253d0ebffed"},
+ {file = "gotrue-2.9.2-py3-none-any.whl", hash = "sha256:fcd5279e8f1cc630f3ac35af5485fe39f8030b23906776920d2c32a4e308cff4"},
+ {file = "gotrue-2.9.2.tar.gz", hash = "sha256:57b3245e916c5efbf19a21b1181011a903c1276bb1df2d847558f2f24f29abb2"},
]
[package.dependencies]
-httpx = {version = ">=0.24,<0.28", extras = ["http2"]}
+httpx = {version = ">=0.26,<0.28", extras = ["http2"]}
pydantic = ">=1.10,<3"
[[package]]
@@ -1926,13 +1931,13 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "huggingface-hub"
-version = "0.25.1"
+version = "0.25.2"
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
optional = true
python-versions = ">=3.8.0"
files = [
- {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"},
- {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"},
+ {file = "huggingface_hub-0.25.2-py3-none-any.whl", hash = "sha256:1897caf88ce7f97fe0110603d8f66ac264e3ba6accdf30cd66cc0fed5282ad25"},
+ {file = "huggingface_hub-0.25.2.tar.gz", hash = "sha256:a1014ea111a5f40ccd23f7f7ba8ac46e20fa3b658ced1f86a00c75c06ec6423c"},
]
[package.dependencies]
@@ -2084,72 +2089,84 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "jiter"
-version = "0.5.0"
+version = "0.6.1"
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"},
+ {file = "jiter-0.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d08510593cb57296851080018006dfc394070178d238b767b1879dc1013b106c"},
+ {file = "jiter-0.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adef59d5e2394ebbad13b7ed5e0306cceb1df92e2de688824232a91588e77aa7"},
+ {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3e02f7a27f2bcc15b7d455c9df05df8ffffcc596a2a541eeda9a3110326e7a3"},
+ {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed69a7971d67b08f152c17c638f0e8c2aa207e9dd3a5fcd3cba294d39b5a8d2d"},
+ {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2019d966e98f7c6df24b3b8363998575f47d26471bfb14aade37630fae836a1"},
+ {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36c0b51a285b68311e207a76c385650322734c8717d16c2eb8af75c9d69506e7"},
+ {file = "jiter-0.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:220e0963b4fb507c525c8f58cde3da6b1be0bfddb7ffd6798fb8f2531226cdb1"},
+ {file = "jiter-0.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa25c7a9bf7875a141182b9c95aed487add635da01942ef7ca726e42a0c09058"},
+ {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e90552109ca8ccd07f47ca99c8a1509ced93920d271bb81780a973279974c5ab"},
+ {file = "jiter-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:67723a011964971864e0b484b0ecfee6a14de1533cff7ffd71189e92103b38a8"},
+ {file = "jiter-0.6.1-cp310-none-win32.whl", hash = "sha256:33af2b7d2bf310fdfec2da0177eab2fedab8679d1538d5b86a633ebfbbac4edd"},
+ {file = "jiter-0.6.1-cp310-none-win_amd64.whl", hash = "sha256:7cea41c4c673353799906d940eee8f2d8fd1d9561d734aa921ae0f75cb9732f4"},
+ {file = "jiter-0.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b03c24e7da7e75b170c7b2b172d9c5e463aa4b5c95696a368d52c295b3f6847f"},
+ {file = "jiter-0.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:47fee1be677b25d0ef79d687e238dc6ac91a8e553e1a68d0839f38c69e0ee491"},
+ {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0d2f6e01a8a0fb0eab6d0e469058dab2be46ff3139ed2d1543475b5a1d8e7"},
+ {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b809e39e342c346df454b29bfcc7bca3d957f5d7b60e33dae42b0e5ec13e027"},
+ {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e9ac7c2f092f231f5620bef23ce2e530bd218fc046098747cc390b21b8738a7a"},
+ {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e51a2d80d5fe0ffb10ed2c82b6004458be4a3f2b9c7d09ed85baa2fbf033f54b"},
+ {file = "jiter-0.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3343d4706a2b7140e8bd49b6c8b0a82abf9194b3f0f5925a78fc69359f8fc33c"},
+ {file = "jiter-0.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82521000d18c71e41c96960cb36e915a357bc83d63a8bed63154b89d95d05ad1"},
+ {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c843e7c1633470708a3987e8ce617ee2979ee18542d6eb25ae92861af3f1d62"},
+ {file = "jiter-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2e861658c3fe849efc39b06ebb98d042e4a4c51a8d7d1c3ddc3b1ea091d0784"},
+ {file = "jiter-0.6.1-cp311-none-win32.whl", hash = "sha256:7d72fc86474862c9c6d1f87b921b70c362f2b7e8b2e3c798bb7d58e419a6bc0f"},
+ {file = "jiter-0.6.1-cp311-none-win_amd64.whl", hash = "sha256:3e36a320634f33a07794bb15b8da995dccb94f944d298c8cfe2bd99b1b8a574a"},
+ {file = "jiter-0.6.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1fad93654d5a7dcce0809aff66e883c98e2618b86656aeb2129db2cd6f26f867"},
+ {file = "jiter-0.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4e6e340e8cd92edab7f6a3a904dbbc8137e7f4b347c49a27da9814015cc0420c"},
+ {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:691352e5653af84ed71763c3c427cff05e4d658c508172e01e9c956dfe004aba"},
+ {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:defee3949313c1f5b55e18be45089970cdb936eb2a0063f5020c4185db1b63c9"},
+ {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26d2bdd5da097e624081c6b5d416d3ee73e5b13f1703bcdadbb1881f0caa1933"},
+ {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18aa9d1626b61c0734b973ed7088f8a3d690d0b7f5384a5270cd04f4d9f26c86"},
+ {file = "jiter-0.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a3567c8228afa5ddcce950631c6b17397ed178003dc9ee7e567c4c4dcae9fa0"},
+ {file = "jiter-0.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e5c0507131c922defe3f04c527d6838932fcdfd69facebafd7d3574fa3395314"},
+ {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:540fcb224d7dc1bcf82f90f2ffb652df96f2851c031adca3c8741cb91877143b"},
+ {file = "jiter-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e7b75436d4fa2032b2530ad989e4cb0ca74c655975e3ff49f91a1a3d7f4e1df2"},
+ {file = "jiter-0.6.1-cp312-none-win32.whl", hash = "sha256:883d2ced7c21bf06874fdeecab15014c1c6d82216765ca6deef08e335fa719e0"},
+ {file = "jiter-0.6.1-cp312-none-win_amd64.whl", hash = "sha256:91e63273563401aadc6c52cca64a7921c50b29372441adc104127b910e98a5b6"},
+ {file = "jiter-0.6.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:852508a54fe3228432e56019da8b69208ea622a3069458252f725d634e955b31"},
+ {file = "jiter-0.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f491cc69ff44e5a1e8bc6bf2b94c1f98d179e1aaf4a554493c171a5b2316b701"},
+ {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc56c8f0b2a28ad4d8047f3ae62d25d0e9ae01b99940ec0283263a04724de1f3"},
+ {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51b58f7a0d9e084a43b28b23da2b09fc5e8df6aa2b6a27de43f991293cab85fd"},
+ {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f79ce15099154c90ef900d69c6b4c686b64dfe23b0114e0971f2fecd306ec6c"},
+ {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03a025b52009f47e53ea619175d17e4ded7c035c6fbd44935cb3ada11e1fd592"},
+ {file = "jiter-0.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c74a8d93718137c021d9295248a87c2f9fdc0dcafead12d2930bc459ad40f885"},
+ {file = "jiter-0.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40b03b75f903975f68199fc4ec73d546150919cb7e534f3b51e727c4d6ccca5a"},
+ {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:825651a3f04cf92a661d22cad61fc913400e33aa89b3e3ad9a6aa9dc8a1f5a71"},
+ {file = "jiter-0.6.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:928bf25eb69ddb292ab8177fe69d3fbf76c7feab5fce1c09265a7dccf25d3991"},
+ {file = "jiter-0.6.1-cp313-none-win32.whl", hash = "sha256:352cd24121e80d3d053fab1cc9806258cad27c53cad99b7a3cac57cf934b12e4"},
+ {file = "jiter-0.6.1-cp313-none-win_amd64.whl", hash = "sha256:be7503dd6f4bf02c2a9bacb5cc9335bc59132e7eee9d3e931b13d76fd80d7fda"},
+ {file = "jiter-0.6.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:31d8e00e1fb4c277df8ab6f31a671f509ebc791a80e5c61fdc6bc8696aaa297c"},
+ {file = "jiter-0.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77c296d65003cd7ee5d7b0965f6acbe6cffaf9d1fa420ea751f60ef24e85fed5"},
+ {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeeb0c0325ef96c12a48ea7e23e2e86fe4838e6e0a995f464cf4c79fa791ceeb"},
+ {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a31c6fcbe7d6c25d6f1cc6bb1cba576251d32795d09c09961174fe461a1fb5bd"},
+ {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59e2b37f3b9401fc9e619f4d4badcab2e8643a721838bcf695c2318a0475ae42"},
+ {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bae5ae4853cb9644144e9d0755854ce5108d470d31541d83f70ca7ecdc2d1637"},
+ {file = "jiter-0.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df588e9c830b72d8db1dd7d0175af6706b0904f682ea9b1ca8b46028e54d6e9"},
+ {file = "jiter-0.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15f8395e835cf561c85c1adee72d899abf2733d9df72e9798e6d667c9b5c1f30"},
+ {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a99d4e0b5fc3b05ea732d67eb2092fe894e95a90e6e413f2ea91387e228a307"},
+ {file = "jiter-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a311df1fa6be0ccd64c12abcd85458383d96e542531bafbfc0a16ff6feda588f"},
+ {file = "jiter-0.6.1-cp38-none-win32.whl", hash = "sha256:81116a6c272a11347b199f0e16b6bd63f4c9d9b52bc108991397dd80d3c78aba"},
+ {file = "jiter-0.6.1-cp38-none-win_amd64.whl", hash = "sha256:13f9084e3e871a7c0b6e710db54444088b1dd9fbefa54d449b630d5e73bb95d0"},
+ {file = "jiter-0.6.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f1c53615fcfec3b11527c08d19cff6bc870da567ce4e57676c059a3102d3a082"},
+ {file = "jiter-0.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f791b6a4da23238c17a81f44f5b55d08a420c5692c1fda84e301a4b036744eb1"},
+ {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c97e90fec2da1d5f68ef121444c2c4fa72eabf3240829ad95cf6bbeca42a301"},
+ {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cbc1a66b4e41511209e97a2866898733c0110b7245791ac604117b7fb3fedb7"},
+ {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e85f9e12cd8418ab10e1fcf0e335ae5bb3da26c4d13a0fd9e6a17a674783b6"},
+ {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08be33db6dcc374c9cc19d3633af5e47961a7b10d4c61710bd39e48d52a35824"},
+ {file = "jiter-0.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:677be9550004f5e010d673d3b2a2b815a8ea07a71484a57d3f85dde7f14cf132"},
+ {file = "jiter-0.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8bd065be46c2eecc328e419d6557bbc37844c88bb07b7a8d2d6c91c7c4dedc9"},
+ {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bd95375ce3609ec079a97c5d165afdd25693302c071ca60c7ae1cf826eb32022"},
+ {file = "jiter-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db459ed22d0208940d87f614e1f0ea5a946d29a3cfef71f7e1aab59b6c6b2afb"},
+ {file = "jiter-0.6.1-cp39-none-win32.whl", hash = "sha256:d71c962f0971347bd552940ab96aa42ceefcd51b88c4ced8a27398182efa8d80"},
+ {file = "jiter-0.6.1-cp39-none-win_amd64.whl", hash = "sha256:d465db62d2d10b489b7e7a33027c4ae3a64374425d757e963f86df5b5f2e7fc5"},
+ {file = "jiter-0.6.1.tar.gz", hash = "sha256:e19cd21221fc139fb032e4112986656cb2739e9fe6d84c13956ab30ccc7d4449"},
]
[[package]]
@@ -2208,13 +2225,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
[[package]]
name = "jsonschema-specifications"
-version = "2023.12.1"
+version = "2024.10.1"
description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
optional = true
-python-versions = ">=3.8"
+python-versions = ">=3.9"
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"},
+ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"},
+ {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"},
]
[package.dependencies]
@@ -2345,13 +2362,13 @@ files = [
[[package]]
name = "litellm"
-version = "1.48.11"
+version = "1.49.3"
description = "Library to easily interface with LLM API providers"
optional = true
python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8"
files = [
- {file = "litellm-1.48.11-py3-none-any.whl", hash = "sha256:6e38c83430b40a9d4afc2974daad4ead198e18facb9fd8923b0590ae56b30acd"},
- {file = "litellm-1.48.11.tar.gz", hash = "sha256:7c0a4622dfbab4099effb11fce02eb0ba64788b6465ed5f2de5ddcea8a4e80d2"},
+ {file = "litellm-1.49.3-py3-none-any.whl", hash = "sha256:300c3c9e1600441f8b6d3afe0fd79c6193f901b2091f3730883ffe3709eebfa2"},
+ {file = "litellm-1.49.3.tar.gz", hash = "sha256:e51ce30286894803dcf2949ddb4aab5c2e00809694a48ce6e997953566113c0b"},
]
[package.dependencies]
@@ -2590,71 +2607,72 @@ testing = ["coverage", "pyyaml"]
[[package]]
name = "markupsafe"
-version = "2.1.5"
+version = "3.0.1"
description = "Safely add untrusted strings to HTML/XML markup."
optional = true
-python-versions = ">=3.7"
+python-versions = ">=3.9"
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"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"},
+ {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"},
+ {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"},
+ {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"},
+ {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"},
+ {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"},
+ {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"},
]
[[package]]
@@ -2862,48 +2880,49 @@ files = [
{file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"},
]
-[package.dependencies]
-typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""}
-
[[package]]
name = "mypy"
-version = "1.11.2"
+version = "1.12.0"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"},
- {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"},
- {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"},
- {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"},
- {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"},
- {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"},
- {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"},
- {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"},
- {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"},
- {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"},
- {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"},
- {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"},
- {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"},
- {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"},
- {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"},
- {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"},
- {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"},
- {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"},
- {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"},
- {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"},
- {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"},
- {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"},
- {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"},
- {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"},
- {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"},
- {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"},
- {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"},
+ {file = "mypy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4397081e620dc4dc18e2f124d5e1d2c288194c2c08df6bdb1db31c38cd1fe1ed"},
+ {file = "mypy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:684a9c508a283f324804fea3f0effeb7858eb03f85c4402a967d187f64562469"},
+ {file = "mypy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cabe4cda2fa5eca7ac94854c6c37039324baaa428ecbf4de4567279e9810f9e"},
+ {file = "mypy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:060a07b10e999ac9e7fa249ce2bdcfa9183ca2b70756f3bce9df7a92f78a3c0a"},
+ {file = "mypy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0eff042d7257f39ba4ca06641d110ca7d2ad98c9c1fb52200fe6b1c865d360ff"},
+ {file = "mypy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b86de37a0da945f6d48cf110d5206c5ed514b1ca2614d7ad652d4bf099c7de7"},
+ {file = "mypy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20c7c5ce0c1be0b0aea628374e6cf68b420bcc772d85c3c974f675b88e3e6e57"},
+ {file = "mypy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a64ee25f05fc2d3d8474985c58042b6759100a475f8237da1f4faf7fcd7e6309"},
+ {file = "mypy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:faca7ab947c9f457a08dcb8d9a8664fd438080e002b0fa3e41b0535335edcf7f"},
+ {file = "mypy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:5bc81701d52cc8767005fdd2a08c19980de9ec61a25dbd2a937dfb1338a826f9"},
+ {file = "mypy-1.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8462655b6694feb1c99e433ea905d46c478041a8b8f0c33f1dab00ae881b2164"},
+ {file = "mypy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:923ea66d282d8af9e0f9c21ffc6653643abb95b658c3a8a32dca1eff09c06475"},
+ {file = "mypy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ebf9e796521f99d61864ed89d1fb2926d9ab6a5fab421e457cd9c7e4dd65aa9"},
+ {file = "mypy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e478601cc3e3fa9d6734d255a59c7a2e5c2934da4378f3dd1e3411ea8a248642"},
+ {file = "mypy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:c72861b7139a4f738344faa0e150834467521a3fba42dc98264e5aa9507dd601"},
+ {file = "mypy-1.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52b9e1492e47e1790360a43755fa04101a7ac72287b1a53ce817f35899ba0521"},
+ {file = "mypy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48d3e37dd7d9403e38fa86c46191de72705166d40b8c9f91a3de77350daa0893"},
+ {file = "mypy-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f106db5ccb60681b622ac768455743ee0e6a857724d648c9629a9bd2ac3f721"},
+ {file = "mypy-1.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:233e11b3f73ee1f10efada2e6da0f555b2f3a5316e9d8a4a1224acc10e7181d3"},
+ {file = "mypy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:4ae8959c21abcf9d73aa6c74a313c45c0b5a188752bf37dace564e29f06e9c1b"},
+ {file = "mypy-1.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eafc1b7319b40ddabdc3db8d7d48e76cfc65bbeeafaa525a4e0fa6b76175467f"},
+ {file = "mypy-1.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9b9ce1ad8daeb049c0b55fdb753d7414260bad8952645367e70ac91aec90e07e"},
+ {file = "mypy-1.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfe012b50e1491d439172c43ccb50db66d23fab714d500b57ed52526a1020bb7"},
+ {file = "mypy-1.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c40658d4fa1ab27cb53d9e2f1066345596af2f8fe4827defc398a09c7c9519b"},
+ {file = "mypy-1.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:dee78a8b9746c30c1e617ccb1307b351ded57f0de0d287ca6276378d770006c0"},
+ {file = "mypy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b5df6c8a8224f6b86746bda716bbe4dbe0ce89fd67b1fa4661e11bfe38e8ec8"},
+ {file = "mypy-1.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5feee5c74eb9749e91b77f60b30771563327329e29218d95bedbe1257e2fe4b0"},
+ {file = "mypy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77278e8c6ffe2abfba6db4125de55f1024de9a323be13d20e4f73b8ed3402bd1"},
+ {file = "mypy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dcfb754dea911039ac12434d1950d69a2f05acd4d56f7935ed402be09fad145e"},
+ {file = "mypy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:06de0498798527451ffb60f68db0d368bd2bae2bbfb5237eae616d4330cc87aa"},
+ {file = "mypy-1.12.0-py3-none-any.whl", hash = "sha256:fd313226af375d52e1e36c383f39bf3836e1f192801116b31b090dfcd3ec5266"},
+ {file = "mypy-1.12.0.tar.gz", hash = "sha256:65a22d87e757ccd95cbbf6f7e181e6caa87128255eb2b6be901bb71b26d8a99d"},
]
[package.dependencies]
mypy-extensions = ">=1.0.0"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing-extensions = ">=4.6.0"
[package.extras]
@@ -2936,20 +2955,21 @@ files = [
[[package]]
name = "networkx"
-version = "3.3"
+version = "3.4.1"
description = "Python package for creating and manipulating graphs and networks"
optional = true
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"},
+ {file = "networkx-3.4.1-py3-none-any.whl", hash = "sha256:e30a87b48c9a6a7cc220e732bffefaee585bdb166d13377734446ce1a0620eed"},
+ {file = "networkx-3.4.1.tar.gz", hash = "sha256:f9df45e85b78f5bd010993e897b4f1fdb242c11e015b101bd951e5c0e29982d8"},
]
[package.extras]
-default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"]
+default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=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)"]
+doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"]
+example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"]
+extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"]
test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
[[package]]
@@ -3058,13 +3078,13 @@ httpx = ">=0.27.0,<0.28.0"
[[package]]
name = "openai"
-version = "1.51.0"
+version = "1.51.2"
description = "The official Python library for the openai API"
optional = false
python-versions = ">=3.7.1"
files = [
- {file = "openai-1.51.0-py3-none-any.whl", hash = "sha256:d9affafb7e51e5a27dce78589d4964ce4d6f6d560307265933a94b2e3f3c5d2c"},
- {file = "openai-1.51.0.tar.gz", hash = "sha256:8dc4f9d75ccdd5466fc8c99a952186eddceb9fd6ba694044773f3736a847149d"},
+ {file = "openai-1.51.2-py3-none-any.whl", hash = "sha256:5c5954711cba931423e471c37ff22ae0fd3892be9b083eee36459865fbbb83fa"},
+ {file = "openai-1.51.2.tar.gz", hash = "sha256:c6a51fac62a1ca9df85a522e462918f6bb6bc51a8897032217e453a0730123a6"},
]
[package.dependencies]
@@ -3172,7 +3192,6 @@ files = [
[package.dependencies]
numpy = [
- {version = ">=1.22.4", markers = "python_version < \"3.11\""},
{version = ">=1.23.2", markers = "python_version == \"3.11\""},
{version = ">=1.26.0", markers = "python_version >= \"3.12\""},
]
@@ -3251,6 +3270,20 @@ six = "*"
[package.extras]
test = ["pytest", "pytest-cov", "scipy"]
+[[package]]
+name = "pdf2image"
+version = "1.17.0"
+description = "A wrapper around the pdftoppm and pdftocairo command line tools to convert PDF to a PIL Image list."
+optional = true
+python-versions = "*"
+files = [
+ {file = "pdf2image-1.17.0-py3-none-any.whl", hash = "sha256:ecdd58d7afb810dffe21ef2b1bbc057ef434dabbac6c33778a38a3f7744a27e2"},
+ {file = "pdf2image-1.17.0.tar.gz", hash = "sha256:eaa959bc116b420dd7ec415fcae49b98100dda3dd18cd2fdfa86d09f112f6d57"},
+]
+
+[package.dependencies]
+pillow = "*"
+
[[package]]
name = "pgvector"
version = "0.1.8"
@@ -3394,18 +3427,18 @@ testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "postgrest"
-version = "0.17.0"
+version = "0.17.1"
description = "PostgREST client for Python. This library provides an ORM interface to PostgREST."
optional = true
python-versions = "<4.0,>=3.8"
files = [
- {file = "postgrest-0.17.0-py3-none-any.whl", hash = "sha256:df2530e903955ffddbd21d92a99abc8d09d6efb357ce33438fca68d4b46b5d95"},
- {file = "postgrest-0.17.0.tar.gz", hash = "sha256:5ee05d8d6796b9d716585d2ad589db57ef832af6c2592a3e39dcef8993929cff"},
+ {file = "postgrest-0.17.1-py3-none-any.whl", hash = "sha256:ec1d00dc8532fe5ffb342cfc7c4e610a1e0e2272eb14f78f9b2b61094f9be510"},
+ {file = "postgrest-0.17.1.tar.gz", hash = "sha256:e31d9977dbb80dc5f9fdd4d444014686606692dc4ddb9adc85639e56c6d54c92"},
]
[package.dependencies]
deprecation = ">=2.1.0,<3.0.0"
-httpx = {version = ">=0.24,<0.28", extras = ["http2"]}
+httpx = {version = ">=0.26,<0.28", extras = ["http2"]}
pydantic = ">=1.9,<3.0"
strenum = ">=0.4.9,<0.5.0"
@@ -3514,6 +3547,113 @@ nodeenv = ">=0.11.1"
pyyaml = ">=5.1"
virtualenv = ">=20.10.0"
+[[package]]
+name = "propcache"
+version = "0.2.0"
+description = "Accelerated property cache"
+optional = true
+python-versions = ">=3.8"
+files = [
+ {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"},
+ {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"},
+ {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"},
+ {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"},
+ {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"},
+ {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"},
+ {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"},
+ {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"},
+ {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"},
+ {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"},
+ {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"},
+ {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"},
+ {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"},
+ {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"},
+ {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"},
+ {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"},
+ {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"},
+ {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"},
+ {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"},
+ {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"},
+ {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"},
+ {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"},
+ {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"},
+ {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"},
+ {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"},
+ {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"},
+ {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"},
+ {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"},
+ {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"},
+ {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"},
+ {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"},
+ {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"},
+ {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"},
+ {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"},
+ {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"},
+ {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"},
+ {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"},
+ {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"},
+ {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"},
+ {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"},
+ {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"},
+ {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"},
+ {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"},
+ {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"},
+ {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"},
+ {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"},
+ {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"},
+ {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"},
+ {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"},
+ {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"},
+ {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"},
+ {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"},
+ {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"},
+ {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"},
+ {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"},
+ {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"},
+ {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"},
+ {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"},
+ {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"},
+ {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"},
+ {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"},
+ {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"},
+ {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"},
+ {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"},
+ {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"},
+ {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"},
+ {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"},
+ {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"},
+ {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"},
+ {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"},
+ {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"},
+ {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"},
+ {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"},
+ {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"},
+ {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"},
+ {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"},
+ {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"},
+ {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"},
+ {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"},
+ {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"},
+ {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"},
+ {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"},
+ {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"},
+ {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"},
+ {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"},
+ {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"},
+ {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"},
+ {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"},
+ {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"},
+ {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"},
+ {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"},
+ {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"},
+ {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"},
+ {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"},
+ {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"},
+ {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"},
+ {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"},
+ {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"},
+]
+
[[package]]
name = "protobuf"
version = "4.25.5"
@@ -3836,13 +3976,13 @@ scipy = ">=1.0"
[[package]]
name = "pyparsing"
-version = "3.1.4"
+version = "3.2.0"
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
optional = true
-python-versions = ">=3.6.8"
+python-versions = ">=3.9"
files = [
- {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"},
- {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"},
+ {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"},
+ {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"},
]
[package.extras]
@@ -3859,9 +3999,6 @@ files = [
{file = "pypdf-4.3.1.tar.gz", hash = "sha256:b2f37fe9a3030aa97ca86067a56ba3f9d3565f9a791b305c7355d8392c30d91b"},
]
-[package.dependencies]
-typing_extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
-
[package.extras]
crypto = ["PyCryptodome", "cryptography"]
dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"]
@@ -3869,6 +4006,24 @@ docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"]
full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"]
image = ["Pillow (>=8.0.0)"]
+[[package]]
+name = "pypdf2"
+version = "3.0.1"
+description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files"
+optional = true
+python-versions = ">=3.6"
+files = [
+ {file = "PyPDF2-3.0.1.tar.gz", hash = "sha256:a74408f69ba6271f71b9352ef4ed03dc53a31aa404d29b5d31f53bfecfee1440"},
+ {file = "pypdf2-3.0.1-py3-none-any.whl", hash = "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928"},
+]
+
+[package.extras]
+crypto = ["PyCryptodome"]
+dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "wheel"]
+docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"]
+full = ["Pillow", "PyCryptodome"]
+image = ["Pillow"]
+
[[package]]
name = "pytest"
version = "8.3.3"
@@ -3882,11 +4037,9 @@ files = [
[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"]
@@ -4389,13 +4542,13 @@ files = [
[[package]]
name = "s3transfer"
-version = "0.10.2"
+version = "0.10.3"
description = "An Amazon S3 Transfer Manager"
optional = true
python-versions = ">=3.8"
files = [
- {file = "s3transfer-0.10.2-py3-none-any.whl", hash = "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69"},
- {file = "s3transfer-0.10.2.tar.gz", hash = "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6"},
+ {file = "s3transfer-0.10.3-py3-none-any.whl", hash = "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d"},
+ {file = "s3transfer-0.10.3.tar.gz", hash = "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c"},
]
[package.dependencies]
@@ -4426,11 +4579,6 @@ files = [
{file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"},
{file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"},
{file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"},
- {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"},
- {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"},
- {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"},
- {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"},
- {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"},
{file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"},
{file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"},
{file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"},
@@ -4550,13 +4698,13 @@ files = [
[[package]]
name = "smart-open"
-version = "7.0.4"
+version = "7.0.5"
description = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)"
optional = true
python-versions = "<4.0,>=3.7"
files = [
- {file = "smart_open-7.0.4-py3-none-any.whl", hash = "sha256:4e98489932b3372595cddc075e6033194775165702887216b65eba760dfd8d47"},
- {file = "smart_open-7.0.4.tar.gz", hash = "sha256:62b65852bdd1d1d516839fcb1f6bc50cd0f16e05b4ec44b52f43d38bcb838524"},
+ {file = "smart_open-7.0.5-py3-none-any.whl", hash = "sha256:8523ed805c12dff3eaa50e9c903a6cb0ae78800626631c5fe7ea073439847b89"},
+ {file = "smart_open-7.0.5.tar.gz", hash = "sha256:d3672003b1dbc85e2013e4983b88eb9a5ccfd389b0d4e5015f39a9ee5620ec18"},
]
[package.dependencies]
@@ -4569,7 +4717,7 @@ gcs = ["google-cloud-storage (>=2.6.0)"]
http = ["requests"]
s3 = ["boto3"]
ssh = ["paramiko"]
-test = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "paramiko", "pytest", "pytest-rerunfailures", "requests", "responses", "zstandard"]
+test = ["awscli", "azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "numpy", "paramiko", "pyopenssl", "pytest", "pytest-benchmark", "pytest-rerunfailures", "requests", "responses", "zstandard"]
webhdfs = ["requests"]
zst = ["zstandard"]
@@ -4588,7 +4736,7 @@ files = [
name = "soupsieve"
version = "2.6"
description = "A modern CSS selector implementation for Beautiful Soup."
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"},
@@ -4752,17 +4900,17 @@ docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "n
[[package]]
name = "storage3"
-version = "0.8.0"
+version = "0.8.1"
description = "Supabase Storage client for Python."
optional = true
python-versions = "<4.0,>=3.8"
files = [
- {file = "storage3-0.8.0-py3-none-any.whl", hash = "sha256:a1aa28a6eb685b8158f2de26589cd216fcd18328c5762d21159a4545e8cf6709"},
- {file = "storage3-0.8.0.tar.gz", hash = "sha256:cdb5af60ff240a8c2ef83cecdb5816042ce4a9162803456bcd1bca075b4c82df"},
+ {file = "storage3-0.8.1-py3-none-any.whl", hash = "sha256:0b21205f43eaf0d1dd33bde6c6d0612f88524b7865f017d2ae9827e3f63d9cdc"},
+ {file = "storage3-0.8.1.tar.gz", hash = "sha256:ea60b68b2221b3868ccc1a7f1294d57d0d9c51642cdc639d8115fe5d0adc8892"},
]
[package.dependencies]
-httpx = {version = ">=0.24,<0.28", extras = ["http2"]}
+httpx = {version = ">=0.26,<0.28", extras = ["http2"]}
python-dateutil = ">=2.8.2,<3.0.0"
typing-extensions = ">=4.2.0,<5.0.0"
@@ -4784,18 +4932,18 @@ test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"]
[[package]]
name = "supabase"
-version = "2.8.1"
+version = "2.9.0"
description = "Supabase client for Python."
optional = true
python-versions = "<4.0,>=3.9"
files = [
- {file = "supabase-2.8.1-py3-none-any.whl", hash = "sha256:dfa8bef89b54129093521d5bba2136ff765baf67cd76d8ad0aa4984d61a7815c"},
- {file = "supabase-2.8.1.tar.gz", hash = "sha256:711c70e6acd9e2ff48ca0dc0b1bb70c01c25378cc5189ec9f5ed9655b30bc41d"},
+ {file = "supabase-2.9.0-py3-none-any.whl", hash = "sha256:04b794dd737f7b50a8de4fcba0507983e27c9eea29577eb0af7fe06e9fe69757"},
+ {file = "supabase-2.9.0.tar.gz", hash = "sha256:d94c0ee491fe0d137387bd860071fee97cb01f32a1c1485266804783b14c1c32"},
]
[package.dependencies]
gotrue = ">=2.7.0,<3.0.0"
-httpx = ">=0.24,<0.28"
+httpx = ">=0.26,<0.28"
postgrest = ">=0.17.0,<0.18.0"
realtime = ">=2.0.0,<3.0.0"
storage3 = ">=0.8.0,<0.9.0"
@@ -4804,17 +4952,17 @@ typing-extensions = ">=4.12.2,<5.0.0"
[[package]]
name = "supafunc"
-version = "0.6.0"
+version = "0.6.1"
description = "Library for Supabase Functions"
optional = true
python-versions = "<4.0,>=3.8"
files = [
- {file = "supafunc-0.6.0-py3-none-any.whl", hash = "sha256:6e7fbc9992c2722216e1799f314aacf4ac147628741ad7cdd5c7be367e21f619"},
- {file = "supafunc-0.6.0.tar.gz", hash = "sha256:2f7b538d52f268dc5cc7e25743085665242ee1cc8b2b2d867ff0bccfea2d1856"},
+ {file = "supafunc-0.6.1-py3-none-any.whl", hash = "sha256:01aeeeb4bf429977664454a32c86418345140faf6d2e6eb0636d52e4547c5fbb"},
+ {file = "supafunc-0.6.1.tar.gz", hash = "sha256:3c8761e3999336ccdb7550498a395fd08afc8469382f55ea56f7f640e5a909aa"},
]
[package.dependencies]
-httpx = {version = ">=0.24,<0.28", extras = ["http2"]}
+httpx = {version = ">=0.26,<0.28", extras = ["http2"]}
[[package]]
name = "tenacity"
@@ -4833,13 +4981,13 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"]
[[package]]
name = "termcolor"
-version = "2.4.0"
+version = "2.5.0"
description = "ANSI color formatting for output in terminal"
optional = true
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"},
- {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"},
+ {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"},
+ {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"},
]
[package.extras]
@@ -4871,7 +5019,6 @@ files = [
{file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"},
{file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"},
{file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"},
- {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"},
{file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"},
{file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"},
{file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"},
@@ -5031,17 +5178,6 @@ files = [
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
]
-[[package]]
-name = "tomli"
-version = "2.0.2"
-description = "A lil' TOML parser"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"},
- {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"},
-]
-
[[package]]
name = "tqdm"
version = "4.66.5"
@@ -5232,7 +5368,6 @@ files = [
[package.dependencies]
click = ">=7.0"
h11 = ">=0.8"
-typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
[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)"]
@@ -5480,108 +5615,115 @@ files = [
[[package]]
name = "yarl"
-version = "1.13.1"
+version = "1.15.2"
description = "Yet another URL library"
optional = true
python-versions = ">=3.8"
files = [
- {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"},
- {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"},
- {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"},
- {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"},
- {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"},
- {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"},
- {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"},
- {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"},
- {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"},
- {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"},
- {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"},
- {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"},
- {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"},
- {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"},
- {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"},
- {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"},
- {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"},
- {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"},
- {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"},
- {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"},
- {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"},
- {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"},
- {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"},
- {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"},
- {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"},
- {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"},
- {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"},
- {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"},
- {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"},
- {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"},
- {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"},
- {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"},
- {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"},
- {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"},
- {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"},
- {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"},
- {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"},
- {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"},
- {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"},
- {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"},
- {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"},
- {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"},
- {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"},
- {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"},
- {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"},
- {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"},
- {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"},
- {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"},
- {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"},
- {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"},
- {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"},
- {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"},
- {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"},
- {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"},
- {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"},
- {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"},
- {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"},
- {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"},
- {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"},
- {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"},
- {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"},
- {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"},
- {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"},
- {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"},
- {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"},
- {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"},
- {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"},
- {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"},
- {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"},
- {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"},
- {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"},
- {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"},
- {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"},
- {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"},
- {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"},
- {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"},
- {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"},
- {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"},
- {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"},
- {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"},
- {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"},
- {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"},
- {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"},
- {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"},
- {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"},
- {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"},
- {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"},
- {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"},
- {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"},
- {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"},
- {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"},
- {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"},
+ {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"},
+ {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"},
+ {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"},
+ {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"},
+ {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"},
+ {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"},
+ {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"},
+ {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"},
+ {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"},
+ {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"},
+ {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"},
+ {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"},
+ {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"},
+ {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"},
+ {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"},
+ {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"},
+ {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"},
+ {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"},
+ {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"},
+ {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"},
+ {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"},
+ {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"},
+ {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"},
+ {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"},
+ {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"},
+ {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"},
+ {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"},
+ {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"},
+ {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"},
+ {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"},
+ {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"},
+ {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"},
+ {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"},
+ {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"},
+ {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"},
+ {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"},
+ {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"},
+ {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"},
+ {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"},
+ {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"},
+ {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"},
+ {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"},
+ {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"},
+ {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"},
+ {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"},
+ {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"},
+ {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"},
+ {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"},
+ {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"},
+ {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"},
+ {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"},
+ {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"},
+ {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"},
+ {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"},
+ {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"},
+ {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"},
+ {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"},
+ {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"},
+ {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"},
+ {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"},
+ {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"},
+ {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"},
+ {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"},
+ {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"},
+ {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"},
+ {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"},
+ {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"},
+ {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"},
+ {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"},
+ {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"},
+ {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"},
+ {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"},
+ {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"},
+ {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"},
+ {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"},
+ {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"},
+ {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"},
+ {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"},
+ {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"},
+ {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"},
+ {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"},
+ {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"},
+ {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"},
+ {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"},
+ {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"},
+ {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"},
+ {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"},
+ {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"},
+ {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"},
+ {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"},
+ {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"},
+ {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"},
+ {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"},
+ {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"},
+ {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"},
+ {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"},
+ {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"},
+ {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"},
]
[package.dependencies]
idna = ">=2.0"
multidict = ">=4.0"
+propcache = ">=0.2.0"
[[package]]
name = "zipp"
@@ -5603,11 +5745,10 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools",
type = ["pytest-mypy"]
[extras]
-core = ["aiosqlite", "apscheduler", "asyncpg", "bcrypt", "boto3", "deepdiff", "fire", "future", "graspologic", "gunicorn", "hatchet-sdk", "litellm", "networkx", "ollama", "passlib", "psutil", "pydantic", "pyjwt", "python-multipart", "pyyaml", "sqlalchemy", "supabase", "tokenizers", "unstructured-client", "uvicorn", "vecs"]
-hatchet = ["hatchet-sdk"]
-ingestion-bundle = ["beautifulsoup4", "markdown", "numpy", "openpyxl", "pypdf", "python-docx", "python-pptx"]
+core = ["aiosqlite", "apscheduler", "asyncpg", "bcrypt", "boto3", "deepdiff", "fire", "fsspec", "future", "graspologic", "gunicorn", "hatchet-sdk", "litellm", "networkx", "ollama", "passlib", "psutil", "pydantic", "pyjwt", "python-multipart", "pyyaml", "sqlalchemy", "supabase", "tokenizers", "unstructured-client", "uvicorn", "vecs"]
+ingestion-bundle = ["aiofiles", "aioshutil", "beautifulsoup4", "bs4", "markdown", "numpy", "openpyxl", "pdf2image", "pypdf", "pypdf2", "python-docx", "python-pptx"]
[metadata]
lock-version = "2.0"
-python-versions = ">=3.10,<3.13"
-content-hash = "5c69411b316396adbf4267e0a9f531732d1758e58e8c37c27ca1581f3bcb4c00"
+python-versions = ">=3.11,<3.13"
+content-hash = "ae304d2dee6e5258a0cae4cc0f414e4bc2be5d7fd7925ff32fad30cea94f5929"
diff --git a/py/pyproject.toml b/py/pyproject.toml
index 40a6b11fd..0e846f276 100644
--- a/py/pyproject.toml
+++ b/py/pyproject.toml
@@ -5,7 +5,7 @@ build-backend = "poetry.core.masonry.api"
[tool.poetry]
name = "r2r"
readme = "README.md"
-version = "3.2.12"
+version = "3.2.13"
description = "SciPhi R2R"
authors = ["Owen Colegrove "]
@@ -21,7 +21,7 @@ packages = [
[tool.poetry.dependencies]
# Python Versions
-python = ">=3.10,<3.13"
+python = ">=3.11,<3.13"
asyncclick = "^8.1.7.2"
click = "^8.0.0"
@@ -48,6 +48,7 @@ fsspec = { version = "^2024.6.0", optional = true }
future = { version = "^1.0.0", optional = true }
graspologic = { version = "^3.4.1", optional = true }
gunicorn = { version = "^21.2.0", optional = true }
+hatchet-sdk = { version = "^0.36.17", optional = true }
litellm = { version = "^1.42.3", optional = true }
networkx = { version = "^3.3", optional = true }
ollama = { version = "^0.3.1", optional = true }
@@ -63,19 +64,19 @@ tokenizers = { version = "0.19", optional = true }
uvicorn = { version = "^0.27.0.post1", optional = true }
vecs = { version = "^0.4.0", optional = true }
-# Hatchet
-hatchet-sdk = { version = "^0.36.17", optional = true }
-
# R2R Ingestion
+aiofiles = { version = "^24.1.0", optional = true }
+aioshutil = { version = "^1.5", optional = true }
+beautifulsoup4 = { version = "^4.12.3", optional = true }
+bs4 = { version = "^0.0.2", optional = true }
numpy = { version = ">=1.22.4,<1.29.0", optional = true }
markdown = { version = "^3.6", optional = true }
openpyxl = { version = "^3.1.2", optional = true }
+pdf2image = { version = "^1.17.0", optional = true }
pypdf = { version = "^4.2.0", optional = true }
+pypdf2 = { version = "^3.0.1", optional = true }
python-pptx = { version = "^1.0.1", optional = true }
python-docx = { version = "^1.1.0", optional = true }
-beautifulsoup4 = { version = "^4.12.3", optional = true }
-bs4 = "^0.0.2"
-
[tool.poetry.extras]
core = [
@@ -86,9 +87,11 @@ core = [
"boto3",
"deepdiff",
"fire",
+ "fsspec",
"future",
"graspologic",
"gunicorn",
+ "hatchet-sdk",
"litellm",
"networkx",
"ollama",
@@ -104,17 +107,20 @@ core = [
"uvicorn",
"vecs",
"python-multipart",
- "hatchet-sdk",
]
-hatchet = ["hatchet-sdk"]
ingestion-bundle = [
+ "aiofiles",
+ "aioshutil",
+ "beautifulsoup4",
+ "bs4",
"numpy",
"markdown",
"openpyxl",
+ "pdf2image",
"pypdf",
+ "pypdf2",
"python-pptx",
"python-docx",
- "beautifulsoup4",
]
[tool.poetry.group.dev.dependencies]
@@ -156,7 +162,7 @@ profile = "black"
[tool.mypy]
ignore_missing_imports = true
-exclude = 'playground/.*|deprecated/.*|dump/.*|docs/source|vecs/*|core/examples/*|sdk/examples/*|cli/examples/*|tests/*'
+exclude = 'core/parsers/media/pyzerox/.*|playground/.*|deprecated/.*|dump/.*|docs/source|vecs/*|core/examples/*|sdk/examples/*|cli/examples/*|tests/*'
[[tool.mypy.overrides]]
module = "yaml"
diff --git a/py/r2r.toml b/py/r2r.toml
index d1566147f..56528a2c1 100644
--- a/py/r2r.toml
+++ b/py/r2r.toml
@@ -44,6 +44,7 @@ batch_size = 128
add_title_as_prefix = false
rerank_model = "None"
concurrent_request_limit = 256
+quantization_settings = { quantization_type = "FP16" }
[file]
provider = "postgres"
@@ -54,6 +55,8 @@ chunking_strategy = "recursive"
chunk_size = 1_024
chunk_overlap = 512
excluded_parsers = ["mp4"]
+ [ingestion.extra_parsers]
+ pdf = "zerox"
[kg]
provider = "postgres"
diff --git a/py/shared/abstractions/vector.py b/py/shared/abstractions/vector.py
index 8af3f3ba9..19294f15d 100644
--- a/py/shared/abstractions/vector.py
+++ b/py/shared/abstractions/vector.py
@@ -51,6 +51,14 @@ class IndexMeasure(str, Enum):
def __str__(self) -> str:
return self.value
+ @property
+ def ops(self) -> str:
+ return {
+ IndexMeasure.cosine_distance: "_cosine_ops",
+ IndexMeasure.l2_distance: "_l2_ops",
+ IndexMeasure.max_inner_product: "_ip_ops",
+ }[self]
+
class IndexArgsIVFFlat(R2RSerializable):
"""
@@ -84,14 +92,6 @@ class IndexArgsHNSW(R2RSerializable):
ef_construction: Optional[int] = 64
-INDEX_MEASURE_TO_OPS = {
- # Maps the IndexMeasure enum options to the SQL ops string required by
- # the pgvector `create index` statement
- IndexMeasure.cosine_distance: "vector_cosine_ops",
- IndexMeasure.l2_distance: "vector_l2_ops",
- IndexMeasure.max_inner_product: "vector_ip_ops",
-}
-
INDEX_MEASURE_TO_SQLA_ACC = {
IndexMeasure.cosine_distance: lambda x: x.cosine_distance,
IndexMeasure.l2_distance: lambda x: x.l2_distance,
@@ -117,6 +117,42 @@ def __str__(self) -> str:
return self.value
+class VectorQuantizationType(str, Enum):
+ """
+ An enum representing the types of quantization available for vectors.
+
+ Attributes:
+ FP32 (str): 32-bit floating point quantization.
+ FP16 (str): 16-bit floating point quantization.
+ INT1 (str): 1-bit integer quantization.
+ SPARSE (str): Sparse vector quantization.
+ """
+
+ FP32 = "FP32"
+ FP16 = "FP16"
+ INT1 = "INT1"
+ SPARSE = "SPARSE"
+
+ def __str__(self) -> str:
+ return self.value
+
+ @property
+ def db_type(self) -> str:
+ db_type_mapping = {
+ "FP32": "vector",
+ "FP16": "halfvec",
+ "INT1": "bit",
+ "SPARSE": "sparsevec",
+ }
+ return db_type_mapping[self.value]
+
+
+class VectorQuantizationSettings(R2RSerializable):
+ quantization_type: VectorQuantizationType = Field(
+ default=VectorQuantizationType.FP32
+ )
+
+
class Vector(R2RSerializable):
"""A vector with the option to fix the number of elements."""
diff --git a/py/shared/utils/__init__.py b/py/shared/utils/__init__.py
index ea86962d6..843ae2f03 100644
--- a/py/shared/utils/__init__.py
+++ b/py/shared/utils/__init__.py
@@ -1,4 +1,7 @@
from .base_utils import (
+ HatchetLogger,
+ _decorate_vector_type,
+ create_hatchet_logger,
decrement_version,
format_entity_types,
format_relations,
@@ -41,7 +44,11 @@
"to_async_generator",
"llm_cost_per_million_tokens",
"validate_uuid",
+ "create_hatchet_logger",
# Text splitter
"RecursiveCharacterTextSplitter",
"TextSplitter",
+ "HatchetLogger",
+ # Vector utils
+ "_decorate_vector_type",
]
diff --git a/py/shared/utils/base_utils.py b/py/shared/utils/base_utils.py
index e90332a99..34a060776 100644
--- a/py/shared/utils/base_utils.py
+++ b/py/shared/utils/base_utils.py
@@ -3,10 +3,9 @@
import logging
from copy import deepcopy
from datetime import datetime
-from typing import TYPE_CHECKING, Any, AsyncGenerator, Iterable
+from typing import TYPE_CHECKING, Any, AsyncGenerator, Iterable, Optional
from uuid import NAMESPACE_DNS, UUID, uuid4, uuid5
-from ..abstractions import R2RSerializable
from ..abstractions.graph import EntityType, RelationshipType
from ..abstractions.search import (
AggregateSearchResult,
@@ -15,6 +14,7 @@
KGGlobalResult,
KGRelationshipResult,
)
+from ..abstractions.vector import VectorQuantizationType
logger = logging.getLogger(__name__)
@@ -264,3 +264,44 @@ def update_settings_from_dict(server_settings, settings_dict: dict):
setattr(settings, key, value)
return settings
+
+
+class HatchetLogger:
+ def __init__(self, hatchet_logger: Any):
+ self.hatchet_logger = hatchet_logger
+
+ def _log(self, level: str, message: str, function: Optional[str] = None):
+ if function:
+ log_message = f"[{level}]: {function}: {message}"
+ else:
+ log_message = f"[{level}]: {message}"
+ self.hatchet_logger(log_message)
+
+ def debug(self, message: str, function: Optional[str] = None):
+ self._log("DEBUG", message, function)
+
+ def info(self, message: str, function: Optional[str] = None):
+ self._log("INFO", message, function)
+
+ def warning(self, message: str, function: Optional[str] = None):
+ self._log("WARNING", message, function)
+
+ def error(self, message: str, function: Optional[str] = None):
+ self._log("ERROR", message, function)
+
+ def critical(self, message: str, function: Optional[str] = None):
+ self._log("CRITICAL", message, function)
+
+
+def create_hatchet_logger(hatchet_logger: Any) -> HatchetLogger:
+ """
+ Creates a HatchetLogger instance with different logging levels.
+ """
+ return HatchetLogger(hatchet_logger)
+
+
+def _decorate_vector_type(
+ input_str: str,
+ quantization_type: VectorQuantizationType = VectorQuantizationType.FP32,
+) -> str:
+ return f"{quantization_type.db_type}{input_str}"
diff --git a/py/shared/utils/splitter/text.py b/py/shared/utils/splitter/text.py
index 15a3f475f..b7dec5f26 100644
--- a/py/shared/utils/splitter/text.py
+++ b/py/shared/utils/splitter/text.py
@@ -1038,7 +1038,7 @@ def split_text_from_file(self, file: Any) -> List[SplitterDocument]:
]
-# should be in newer Python versions (3.10+)
+# should be in newer Python versions (3.11+)
# @dataclass(frozen=True, kw_only=True, slots=True)
@dataclass(frozen=True)
class Tokenizer:
diff --git a/py/tests/integration/runner_cli.py b/py/tests/integration/runner_cli.py
index e24e12b65..e8576a550 100644
--- a/py/tests/integration/runner_cli.py
+++ b/py/tests/integration/runner_cli.py
@@ -252,7 +252,7 @@ def test_kg_create_graph_sample_file_cli():
print("Testing: KG create graph")
print("Calling `poetry run r2r create-graph --run` ")
run_command("poetry run r2r create-graph --run")
- time.sleep(30)
+ time.sleep(120)
response = requests.get(
"http://localhost:7272/v2/entities",
@@ -282,7 +282,8 @@ def test_kg_create_graph_sample_file_cli():
def test_kg_enrich_graph_sample_file_cli():
print("Testing: KG enrich graph")
run_command("poetry run r2r enrich-graph --run")
- time.sleep(60)
+
+ time.sleep(120)
response = requests.get(
"http://localhost:7272/v2/communities",
diff --git a/py/tests/integration/runner_scripts.py b/py/tests/integration/runner_scripts.py
new file mode 100644
index 000000000..4138889d5
--- /dev/null
+++ b/py/tests/integration/runner_scripts.py
@@ -0,0 +1,51 @@
+import argparse
+import sys
+import time
+
+from r2r import Message, R2RClient, R2RException
+
+
+def compare_result_fields(result, expected_fields):
+ for field, expected_value in expected_fields.items():
+ if callable(expected_value):
+ if not expected_value(result[field]):
+ print(f"Test failed: Incorrect {field}")
+ print(f"Expected {field} to satisfy the condition")
+ print(f"Actual {field}:", result[field])
+ sys.exit(1)
+ else:
+ if result[field] != expected_value:
+ print(f"Test failed: Incorrect {field}")
+ print(f"Expected {field}:", expected_value)
+ print(f"Actual {field}:", result[field])
+ sys.exit(1)
+
+
+def test_ingested_zerox_document():
+ print("Testing: Ingest sample file SDK")
+ documents_overview = client.documents_overview()
+ results = documents_overview["results"]
+ assert results[0]["id"] == "7b0f40c5-2ace-5781-ae35-ead99ddee8c5"
+ assert len(results) == 1
+ assert results[0]["ingestion_status"] == "success"
+
+
+def create_client(base_url):
+ return R2RClient(base_url)
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="R2R SDK Integration Tests")
+ parser.add_argument("test_function", help="Test function to run")
+ parser.add_argument(
+ "--base-url",
+ default="http://localhost:7272",
+ help="Base URL for the R2R client",
+ )
+ args = parser.parse_args()
+
+ global client
+ client = create_client(args.base_url)
+
+ test_function = args.test_function
+ globals()[test_function]()
diff --git a/py/tests/integration/runner_sdk.py b/py/tests/integration/runner_sdk.py
index de0555ebc..bccb76d3d 100644
--- a/py/tests/integration/runner_sdk.py
+++ b/py/tests/integration/runner_sdk.py
@@ -47,6 +47,19 @@ def test_ingest_sample_file_2_sdk():
print("~" * 100)
+def test_ingest_sample_file_3_sdk():
+ print("Testing: Ingest sample file SDK 2")
+ file_paths = ["core/examples/data/lyft_2021.pdf"]
+ ingest_response = client.ingest_files(file_paths=file_paths)
+
+ if not ingest_response["results"]:
+ print("Ingestion test failed")
+ sys.exit(1)
+ time.sleep(60)
+ print("Ingestion successful")
+ print("~" * 100)
+
+
def test_ingest_sample_file_with_config_sdk():
print("Testing: Ingest sample file 2")
file_paths = ["core/examples/data/aristotle_v2.txt"]
@@ -672,6 +685,8 @@ def test_kg_create_graph_sample_file_sdk():
collection_id="122fdf6a-e116-546b-a8f6-e4cb2e2c0a09", run_type="run"
)
+ time.sleep(120)
+
result = client.get_entities(
collection_id="122fdf6a-e116-546b-a8f6-e4cb2e2c0a09", limit=1000
)
@@ -694,6 +709,8 @@ def test_kg_enrich_graph_sample_file_sdk():
collection_id="122fdf6a-e116-546b-a8f6-e4cb2e2c0a09", run_type="run"
)
+ time.sleep(120)
+
result = client.get_communities(
collection_id="122fdf6a-e116-546b-a8f6-e4cb2e2c0a09"
)
diff --git a/services/unstructured/Dockerfile.unstructured b/services/unstructured/Dockerfile.unstructured
index e7249c124..5fab7c565 100644
--- a/services/unstructured/Dockerfile.unstructured
+++ b/services/unstructured/Dockerfile.unstructured
@@ -1,4 +1,4 @@
-FROM python:3.10-slim AS builder
+FROM python:3.11-slim AS builder
# Install system dependencies (including those needed for Unstructured and OpenCV)
RUN apt-get update && apt-get install -y --no-install-recommends \