diff --git a/.github/workflows/actions/run-engine-benchmark/action.yaml b/.github/workflows/actions/run-engine-benchmark/action.yaml new file mode 100644 index 00000000..c1152814 --- /dev/null +++ b/.github/workflows/actions/run-engine-benchmark/action.yaml @@ -0,0 +1,38 @@ +name: Run Engine Benchmark +description: "Run benchmark with specified params" +inputs: + engine: + description: "engine (i.e qdrant-default)" + required: true + dataset: + description: "dataset (i.e random-100)" + required: true + compose_file: + description: "path to docker compose" + required: true + +runs: + using: "composite" + steps: + - name: Install poetry + shell: bash + run: pip install poetry + - uses: actions/setup-python@v5 + with: + python-version: "3.10" + cache: "poetry" + - name: Install deps + shell: bash + run: poetry install + - uses: hoverkraft-tech/compose-action@v2.0.0 + with: + compose-file: "${{ inputs.compose_file }}" + - name: Execution + shell: bash + run: | + engine="${{ inputs.engine }}" + if [[ "$engine" == *"elasticsearch"* || "$engine" == *"opensearch"* ]]; then + ./tools/wait_for_green_status.sh + fi + source $(poetry env info -p)/bin/activate + poetry run python3 run.py --engines "${{ inputs.engine }}" --datasets "${{ inputs.dataset }}" \ No newline at end of file diff --git a/.github/workflows/actions/send-slack-msg/action.yaml b/.github/workflows/actions/send-slack-msg/action.yaml new file mode 100644 index 00000000..c8af884e --- /dev/null +++ b/.github/workflows/actions/send-slack-msg/action.yaml @@ -0,0 +1,72 @@ +name: Send Notification +description: "Send a notification to Slack" +inputs: + bench_name: + description: "name of the failed job (i.e runBenchmark)" + required: true + job_status: + description: "status of the job (i.e failed)" + required: true + failed_outputs: + description: "details of the failed job" + required: false + default: "{}" + qdrant_version: + description: "version of Qdrant used in the benchmark" + required: false + default: "unknown" + engine_name: + description: "name of the engine used in the benchmark" + required: false + default: "unknown" + dataset: + description: "name of the dataset used in the benchmark" + required: false + default: "unknown" + +runs: + using: "composite" + steps: + - uses: slackapi/slack-github-action@v1.26.0 + with: + payload: | + { + "text": "CI benchmarks (${{ inputs.bench_name }}) run status: ${{ inputs.status }}", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "CI benchmarks (${{ inputs.bench_name }}) failed because of *${{ inputs.failed_outputs }}*." + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Qdrant version: *${{ inputs.qdrant_version }}*." + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Engine: *${{ inputs.engine_name }}*." + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Dataset: *${{ inputs.dataset }}*." + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "View the results <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|here>" + } + } + ] + } diff --git a/.github/workflows/clean-datasets.yaml b/.github/workflows/clean-datasets.yaml new file mode 100644 index 00000000..587145f1 --- /dev/null +++ b/.github/workflows/clean-datasets.yaml @@ -0,0 +1,52 @@ +name: Clean Datasets + +on: + repository_dispatch: + workflow_dispatch: + schedule: + # Run every month on the 1st day at 3 am + - cron: "0 3 1 * *" + +concurrency: + group: continuous-benchmark + +# This removes the ci-datasets volume from client machine. +# The next run of Continuous Benchmark will create the volume again and download all the datasets. +jobs: + removeDatasetsVolume: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Benches + id: benches + run: | + export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} + + set +e + + timeout 10m bash -x tools/run_client_remove_volume.sh + + set -e + - name: Send Notification + if: failure() + uses: slackapi/slack-github-action@v1.26.0 + with: + payload: | + { + "text": "Failed to remove the datasets volume (removeDatasetsVolume), run status: ${{ job.status }}", + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "View the results <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|here>" + } + } + ] + } + env: + SLACK_WEBHOOK_URL: ${{ secrets.CI_ALERTS_CHANNEL_WEBHOOK_URL }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK diff --git a/.github/workflows/continuous-benchmark-2.yaml b/.github/workflows/continuous-benchmark-2.yaml new file mode 100644 index 00000000..3ec6d6d8 --- /dev/null +++ b/.github/workflows/continuous-benchmark-2.yaml @@ -0,0 +1,86 @@ +name: Continuous Benchmark 2 + +on: + repository_dispatch: + workflow_dispatch: + schedule: + # Run every day at midnight + - cron: "0 0 * * *" + +# Restrict to only running this workflow one at a time. +# Any new runs will be queued until the previous run is complete. +# Any existing pending runs will be cancelled and replaced with current run. +concurrency: + group: continuous-benchmark + +jobs: + # Schedule this benchmark to run once a day for the sake of saving on S3 costs. + runLoadTimeBenchmark: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Benches + id: benches + run: | + export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} + export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} + export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} + export SERVER_NAME="benchmark-server-3" + bash -x tools/setup_ci.sh + + set +e + + # Benchmark collection load time + export BENCHMARK_STRATEGY="collection-reload" + + declare -A DATASET_TO_ENGINE + declare -A DATASET_TO_URL + DATASET_TO_ENGINE["all-payloads-default"]="qdrant-continuous-benchmark-snapshot" + DATASET_TO_ENGINE["all-payloads-on-disk"]="qdrant-continuous-benchmark-snapshot" + DATASET_TO_ENGINE["all-payloads-default-sparse"]="qdrant-continuous-benchmark-snapshot" + DATASET_TO_ENGINE["all-payloads-on-disk-sparse"]="qdrant-continuous-benchmark-snapshot" + + export STORAGE_URL="https://storage.googleapis.com/qdrant-benchmark-snapshots/all-payloads" + DATASET_TO_URL["all-payloads-default"]="${STORAGE_URL}/benchmark-all-payloads-500k-768-default.snapshot" + DATASET_TO_URL["all-payloads-on-disk"]="${STORAGE_URL}/benchmark-all-payloads-500k-768-on-disk.snapshot" + DATASET_TO_URL["all-payloads-default-sparse"]="${STORAGE_URL}/benchmark-all-payloads-500k-sparse-default.snapshot" + DATASET_TO_URL["all-payloads-on-disk-sparse"]="${STORAGE_URL}/benchmark-all-payloads-500k-sparse-on-disk.snapshot" + + set +e + + for dataset in "${!DATASET_TO_ENGINE[@]}"; do + export ENGINE_NAME=${DATASET_TO_ENGINE[$dataset]} + export DATASETS=$dataset + export SNAPSHOT_URL=${DATASET_TO_URL[$dataset]} + + # Benchmark the dev branch: + export QDRANT_VERSION=ghcr/dev + export QDRANT__FEATURE_FLAGS__ALL=true + timeout 30m bash -x tools/run_ci.sh + + # Benchmark the master branch: + export QDRANT_VERSION=docker/master + export QDRANT__FEATURE_FLAGS__ALL=false + timeout 30m bash -x tools/run_ci.sh + done + + set -e + - name: Fail job if any of the benches failed + if: steps.benches.outputs.failed == 'error' || steps.benches.outputs.failed == 'timeout' + run: exit 1 + - name: Send slack message + uses: ./.github/workflows/actions/send-slack-msg + if: failure() || cancelled() + with: + bench_name: "runLoadTimeBenchmark" + job_status: ${{ job.status }} + failed_outputs: ${{ steps.benches.outputs.failed }} + qdrant_version: ${{ steps.benches.outputs.qdrant_version }} + engine_name: ${{ steps.benches.outputs.engine_name }} + dataset: ${{ steps.benches.outputs.dataset }} + env: + SLACK_WEBHOOK_URL: ${{ secrets.CI_ALERTS_CHANNEL_WEBHOOK_URL }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK diff --git a/.github/workflows/continuous-benchmark.yaml b/.github/workflows/continuous-benchmark.yaml index 822a0c52..f36b7745 100644 --- a/.github/workflows/continuous-benchmark.yaml +++ b/.github/workflows/continuous-benchmark.yaml @@ -3,10 +3,20 @@ name: Continuous Benchmark on: repository_dispatch: workflow_dispatch: + inputs: + with_payload: + description: 'Flag that controls whether to search with or without payload (false or true)' + default: false schedule: # Run every 4 hours - cron: "0 */4 * * *" +# Restrict to only running this workflow one at a time. +# Any new runs will be queued until the previous run is complete. +# Any existing pending runs will be cancelled and replaced with current run. +concurrency: + group: continuous-benchmark + jobs: runBenchmark: runs-on: ubuntu-latest @@ -16,17 +26,165 @@ jobs: with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Benches + id: benches run: | - export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} - export GCS_KEY=${{ secrets.GCS_KEY }} - export GCS_SECRET=${{ secrets.GCS_SECRET }} - export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} - export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} - - # Benchmark the dev branch: - export QDRANT_VERSION=ghcr/dev - bash -x tools/run_ci.sh - - # Benchmark the master branch: - export QDRANT_VERSION=docker/master - bash -x tools/run_ci.sh + export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} + export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} + export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} + export WITH_PAYLOAD=${{ inputs.with_payload }} + export SUFFIX=$([ "${WITH_PAYLOAD}" = "true" ] && echo "-with-payload" || echo "") + + bash -x tools/setup_ci.sh + + declare -A DATASET_TO_ENGINE + DATASET_TO_ENGINE["laion-small-clip"]="qdrant-continuous-benchmark${SUFFIX}" + DATASET_TO_ENGINE["msmarco-sparse-100K"]="qdrant-sparse-vector${SUFFIX}" + DATASET_TO_ENGINE["h-and-m-2048-angular-filters"]="qdrant-continuous-benchmark${SUFFIX}" + DATASET_TO_ENGINE["dbpedia-openai-100K-1536-angular"]="qdrant-bq-continuous-benchmark${SUFFIX}" + + set +e + + for dataset in "${!DATASET_TO_ENGINE[@]}"; do + export ENGINE_NAME=${DATASET_TO_ENGINE[$dataset]} + export DATASETS=$dataset + + # Benchmark the dev branch: + export QDRANT_VERSION=ghcr/dev + export QDRANT__FEATURE_FLAGS__ALL=true + timeout 30m bash -x tools/run_ci.sh + + # Benchmark the master branch: + export QDRANT_VERSION=docker/master + export QDRANT__FEATURE_FLAGS__ALL=false + timeout 30m bash -x tools/run_ci.sh + done + + set -e + - name: Fail job if any of the benches failed + if: steps.benches.outputs.failed == 'error' || steps.benches.outputs.failed == 'timeout' + run: exit 1 + - name: Send slack message + uses: ./.github/workflows/actions/send-slack-msg + if: failure() || cancelled() + with: + bench_name: "runBenchmark" + job_status: ${{ job.status }} + failed_outputs: ${{ steps.benches.outputs.failed }} + qdrant_version: ${{ steps.benches.outputs.qdrant_version }} + engine_name: ${{ steps.benches.outputs.engine_name }} + dataset: ${{ steps.benches.outputs.dataset }} + env: + SLACK_WEBHOOK_URL: ${{ secrets.CI_ALERTS_CHANNEL_WEBHOOK_URL }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK + runTenantsBenchmark: + runs-on: ubuntu-latest + needs: runBenchmark + if: ${{ always() }} + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Benches + id: benches + run: | + export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} + export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} + export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} + export WITH_PAYLOAD=${{ inputs.with_payload }} + export SUFFIX=$([ "${WITH_PAYLOAD}" = "true" ] && echo "-with-payload" || echo "") + + bash -x tools/setup_ci.sh + + set +e + + # Benchmark filtered search by tenants with mem limitation + + export ENGINE_NAME="qdrant-all-on-disk-scalar-q${SUFFIX}" + export DATASETS="random-768-100-tenants" + export BENCHMARK_STRATEGY="tenants" + export CONTAINER_MEM_LIMIT=160mb + + # Benchmark the dev branch: + export QDRANT_VERSION=ghcr/dev + export QDRANT__FEATURE_FLAGS__ALL=true + timeout 30m bash -x tools/run_ci.sh + + # Benchmark the master branch: + export QDRANT_VERSION=docker/master + export QDRANT__FEATURE_FLAGS__ALL=false + timeout 30m bash -x tools/run_ci.sh + + set -e + - name: Fail job if any of the benches failed + if: steps.benches.outputs.failed == 'error' || steps.benches.outputs.failed == 'timeout' + run: exit 1 + - name: Send slack message + uses: ./.github/workflows/actions/send-slack-msg + if: failure() || cancelled() + with: + source_name: "runTenantsBenchmark" + job_status: ${{ job.status }} + failed_outputs: ${{ steps.benches.outputs.failed }} + qdrant_version: ${{ steps.benches.outputs.qdrant_version }} + engine_name: ${{ steps.benches.outputs.engine_name }} + dataset: ${{ steps.benches.outputs.dataset }} + env: + SLACK_WEBHOOK_URL: ${{ secrets.CI_ALERTS_CHANNEL_WEBHOOK_URL }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK + runParallelBenchmark: + runs-on: ubuntu-latest + needs: runTenantsBenchmark + if: ${{ always() }} + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Benches + id: benches + run: | + export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} + export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} + export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} + export WITH_PAYLOAD=${{ inputs.with_payload }} + export SUFFIX=$([ "${WITH_PAYLOAD}" = "true" ] && echo "-with-payload" || echo "") + + bash -x tools/setup_ci.sh + + set +e + + # Benchmark parallel search&upload + + export ENGINE_NAME="qdrant-continuous-benchmark${SUFFIX}" + export DATASETS="laion-small-clip" + export BENCHMARK_STRATEGY="parallel" + export POSTGRES_TABLE="benchmark_parallel_search_upload" + + # Benchmark the dev branch: + export QDRANT_VERSION=ghcr/dev + export QDRANT__FEATURE_FLAGS__ALL=true + timeout 30m bash -x tools/run_ci.sh + + # Benchmark the master branch: + export QDRANT_VERSION=docker/master + export QDRANT__FEATURE_FLAGS__ALL=false + timeout 30m bash -x tools/run_ci.sh + + set -e + - name: Fail job if any of the benches failed + if: steps.benches.outputs.failed == 'error' || steps.benches.outputs.failed == 'timeout' + run: exit 1 + - name: Send slack message + uses: ./.github/workflows/actions/send-slack-msg + if: failure() || cancelled() + with: + source_name: "runParallelBenchmark" + job_status: ${{ job.status }} + failed_outputs: ${{ steps.benches.outputs.failed }} + qdrant_version: ${{ steps.benches.outputs.qdrant_version }} + engine_name: ${{ steps.benches.outputs.engine_name }} + dataset: ${{ steps.benches.outputs.dataset }} + env: + SLACK_WEBHOOK_URL: ${{ secrets.CI_ALERTS_CHANNEL_WEBHOOK_URL }} + SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK diff --git a/.github/workflows/manual-all-engines-benchmark.yaml b/.github/workflows/manual-all-engines-benchmark.yaml new file mode 100644 index 00000000..d1a7ab43 --- /dev/null +++ b/.github/workflows/manual-all-engines-benchmark.yaml @@ -0,0 +1,187 @@ +name: Manual All Engines Default Benchmarks + +on: + push: + branches: + - "master" + pull_request: + types: + - opened + - reopened + workflow_dispatch: + +jobs: + elasticsearchBenchmark: + name: benchmark - elasticsearch-default - random-100 - against elasticsearch-single-node-ci + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + elasticsearch: + - 'engine/clients/elasticsearch/**' + - 'engine/servers/elasticsearch-single-node/**' + - 'engine/servers/elasticsearch-single-node-ci/**' + - 'engine/base_client/**' + poetry: + - 'poetry.lock' + - 'pyproject.toml' + - uses: ./.github/workflows/actions/run-engine-benchmark + if: ${{ steps.changes.outputs.elasticsearch == 'true' || github.event_name == 'workflow_dispatch' }} + with: + engine: "elasticsearch-default" + dataset: "random-100" + compose_file: "engine/servers/elasticsearch-single-node-ci/docker-compose.yaml" + + milvusBenchmark: + name: benchmark - milvus-default - random-100 - against milvus-single-node + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + milvus: + - 'engine/clients/milvus/**' + - 'engine/servers/milvus-single-node/**' + - 'engine/servers/milvus-limit-ram/**' + - 'engine/base_client/**' + poetry: + - 'poetry.lock' + - 'pyproject.toml' + - uses: ./.github/workflows/actions/run-engine-benchmark + if: ${{ steps.changes.outputs.milvus == 'true' || github.event_name == 'workflow_dispatch' }} + with: + engine: "milvus-default" + dataset: "random-100" + compose_file: "engine/servers/milvus-single-node/docker-compose.yaml" + + opensearchBenchmark: + name: benchmark - opensearch-default - glove-25-angular - against opensearch-single-node-ci + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + opensearch: + - 'engine/clients/opensearch/**' + - 'engine/servers/opensearch-single-node/**' + - 'engine/servers/opensearch-single-node-ci/**' + - 'engine/base_client/**' + poetry: + - 'poetry.lock' + - 'pyproject.toml' + - uses: ./.github/workflows/actions/run-engine-benchmark + if: ${{ steps.changes.outputs.opensearch == 'true' || github.event_name == 'workflow_dispatch' }} + with: + engine: "opensearch-default" + dataset: "glove-25-angular" + compose_file: "engine/servers/opensearch-single-node-ci/docker-compose.yaml" + + pgvectorBenchmark: + name: benchmark - pgvector-default - random-100 - against pgvector-single-node + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + pgvector: + - 'engine/clients/pgvector/**' + - 'engine/servers/pgvector-single-node/**' + - 'engine/base_client/**' + poetry: + - 'poetry.lock' + - 'pyproject.toml' + - uses: ./.github/workflows/actions/run-engine-benchmark + if: ${{ steps.changes.outputs.pgvector == 'true' || github.event_name == 'workflow_dispatch' }} + with: + engine: "pgvector-default" + dataset: "random-100" + compose_file: "engine/servers/pgvector-single-node/docker-compose.yaml" + + qdrantBenchmark: + name: benchmark - qdrant-default - random-100 - against qdrant-single-node + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + qdrant: + - 'engine/clients/qdrant/**' + - 'engine/servers/qdrant-single-node/**' + - 'engine/servers/qdrant-limit-ram/**' + - 'engine/servers/qdrant-billion-scale/**' + - 'engine/servers/qdrant-cluster-mode/**' + - 'engine/servers/qdrant-continuous-benchmarks/**' + - 'engine/base_client/**' + poetry: + - 'poetry.lock' + - 'pyproject.toml' + - uses: ./.github/workflows/actions/run-engine-benchmark + if: ${{ steps.changes.outputs.qdrant == 'true' || github.event_name == 'workflow_dispatch' }} + with: + engine: "qdrant-default" + dataset: "random-100" + compose_file: "engine/servers/qdrant-single-node/docker-compose.yaml" + + redisBenchmark: + name: benchmark - redis-default - random-100 - against redis-single-node + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + redis: + - 'engine/clients/redis/**' + - 'engine/servers/redis-single-node/**' + - 'engine/base_client/**' + poetry: + - 'poetry.lock' + - 'pyproject.toml' + - uses: ./.github/workflows/actions/run-engine-benchmark + if: ${{ steps.changes.outputs.weaviate == 'true' || github.event_name == 'workflow_dispatch' }} + with: + engine: "redis-default" + dataset: "random-100" + compose_file: "engine/servers/redis-single-node/docker-compose.yaml" + + weaviateBenchmark: + name: benchmark - weaviate-default - random-100 - against weaviate-single-node + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + weaviate: + - 'engine/clients/weaviate/**' + - 'engine/servers/weaviate-single-node/**' + - 'engine/base_client/**' + poetry: + - 'poetry.lock' + - 'pyproject.toml' + - uses: ./.github/workflows/actions/run-engine-benchmark + if: ${{ steps.changes.outputs.weaviate == 'true' || github.event_name == 'workflow_dispatch' }} + with: + engine: "weaviate-default" + dataset: "random-100" + compose_file: "engine/servers/weaviate-single-node/docker-compose.yaml" \ No newline at end of file diff --git a/.github/workflows/manual-benchmark.yaml b/.github/workflows/manual-benchmark.yaml index 4749d9fa..19be097a 100644 --- a/.github/workflows/manual-benchmark.yaml +++ b/.github/workflows/manual-benchmark.yaml @@ -10,6 +10,14 @@ on: dataset: description: "Dataset to benchmark" default: laion-small-clip + engine_config: + description: "Engine config to benchmark" + default: qdrant-continuous-benchmark + feature_flags_all: + type: boolean + description: "Enable all feature flags (false by default)" + default: false + jobs: runManualBenchmark: @@ -23,11 +31,12 @@ jobs: - name: Benches run: | export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} - export GCS_KEY=${{ secrets.GCS_KEY }} - export GCS_SECRET=${{ secrets.GCS_SECRET }} export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} export QDRANT_VERSION=${{ inputs.qdrant_version }} export DATASETS=${{ inputs.dataset }} + export ENGINE_NAME=${{ inputs.engine_config }} export POSTGRES_TABLE=benchmark_manual + export QDRANT__FEATURE_FLAGS__ALL=${{ inputs.feature_flags_all }} + bash -x tools/setup_ci.sh bash -x tools/run_ci.sh diff --git a/.github/workflows/manual-compare-versions-benchmark.yaml b/.github/workflows/manual-compare-versions-benchmark.yaml new file mode 100644 index 00000000..2362f4d8 --- /dev/null +++ b/.github/workflows/manual-compare-versions-benchmark.yaml @@ -0,0 +1,192 @@ +name: Manual Benchmark to compare versions +description: | + This workflow is used to compare two versions of qdrant using the same dataset and engine config. + It is triggered manually and requires the user to provide the versions of qdrant to compare, dataset and engine config. + The workflow will prepare the images for the provided versions (if needed), run the benchmark for each version and compare the results. + +on: + workflow_dispatch: + inputs: + qdrant_version_1: + description: "Version of qdrant to benchmark (ghcr/, ghcr/my-branch, docker/v1.5.1, ghcr/dev), version 1" + default: ghcr/dev + qdrant_version_2: + description: "Version of qdrant to benchmark (ghcr/, ghcr/my-branch, docker/v1.5.1, ghcr/dev), version 2" + default: docker/master + dataset: + description: "Dataset to benchmark" + default: laion-small-clip + engine_config: + description: "Engine config to benchmark" + default: qdrant-continuous-benchmark + feature_flags_all_version_1: + type: boolean + description: "Enable all feature flags (false by default), version 1" + default: false + feature_flags_all_version_2: + type: boolean + description: "Enable all feature flags (false by default), version 2" + default: false + +jobs: + prepareImage1: + name: Prepare image ${{ inputs.qdrant_version_1 }} + runs-on: ubuntu-latest + timeout-minutes: 180 + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Image for ${{ inputs.qdrant_version_1 }} + run: | + # The branch, tag or SHA to checkout. + export QDRANT_VERSION=${{ inputs.qdrant_version_1 }} + export BEARER_TOKEN="${{ secrets.TRIGGER_GH_TOKEN }}" + bash -x tools/compare_versions/prepare_image.sh + + prepareImage2: + name: Prepare image ${{ inputs.qdrant_version_2 }} + runs-on: ubuntu-latest + timeout-minutes: 180 + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Image for ${{ inputs.qdrant_version_2 }} + run: | + export QDRANT_VERSION=${{ inputs.qdrant_version_2 }} + export BEARER_TOKEN="${{ secrets.TRIGGER_GH_TOKEN }}" + bash -x tools/compare_versions/prepare_image.sh + + runBenchmarkForVersion1: + name: execute - ${{ inputs.qdrant_version_1 }} - ${{ inputs.dataset }} + needs: + - prepareImage1 + runs-on: ubuntu-latest + concurrency: + group: continuous-benchmark + outputs: + collection_load_time: ${{ steps.bench.outputs.collection_load_time }} + rps: ${{ steps.bench.outputs.rps }} + mean_precisions: ${{ steps.bench.outputs.mean_precisions }} + p95_time: ${{ steps.bench.outputs.p95_time }} + p99_time: ${{ steps.bench.outputs.p99_time }} + vm_rss_memory_usage: ${{ steps.bench.outputs.vm_rss_memory_usage }} + rss_anon_memory_usage: ${{ steps.bench.outputs.rss_anon_memory_usage }} + upload_time: ${{ steps.bench.outputs.upload_time }} + indexing_time: ${{ steps.bench.outputs.indexing_time }} + cpu: ${{ steps.bench.outputs.cpu }} + cpu_telemetry: ${{ steps.bench.outputs.cpu_telemetry }} + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Bench ${{ inputs.qdrant_version_1 }} + id: bench + run: | + export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} + export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} + export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} + export QDRANT_VERSION=${{ inputs.qdrant_version_1 }} + export DATASETS=${{ inputs.dataset }} + export ENGINE_NAME=${{ inputs.engine_config }} + export POSTGRES_TABLE=benchmark_manual + export QDRANT__FEATURE_FLAGS__ALL=${{ inputs.feature_flags_all_version_1 }} + bash -x tools/setup_ci.sh + bash -x tools/run_ci.sh + + runBenchmarkForVersion2: + name: execute - ${{ inputs.qdrant_version_2 }} - ${{ inputs.dataset }} + needs: + - prepareImage2 + - runBenchmarkForVersion1 + runs-on: ubuntu-latest + concurrency: + group: continuous-benchmark + outputs: + collection_load_time: ${{ steps.bench.outputs.collection_load_time }} + rps: ${{ steps.bench.outputs.rps }} + mean_precisions: ${{ steps.bench.outputs.mean_precisions }} + p95_time: ${{ steps.bench.outputs.p95_time }} + p99_time: ${{ steps.bench.outputs.p99_time }} + vm_rss_memory_usage: ${{ steps.bench.outputs.vm_rss_memory_usage }} + rss_anon_memory_usage: ${{ steps.bench.outputs.rss_anon_memory_usage }} + upload_time: ${{ steps.bench.outputs.upload_time }} + indexing_time: ${{ steps.bench.outputs.indexing_time }} + cpu: ${{ steps.bench.outputs.cpu }} + cpu_telemetry: ${{ steps.bench.outputs.cpu_telemetry }} + steps: + - uses: actions/checkout@v3 + - uses: webfactory/ssh-agent@v0.8.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Bench ${{ inputs.qdrant_version_2 }} + id: bench + run: | + export HCLOUD_TOKEN=${{ secrets.HCLOUD_TOKEN }} + export POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }} + export POSTGRES_HOST=${{ secrets.POSTGRES_HOST }} + export QDRANT_VERSION=${{ inputs.qdrant_version_2 }} + export DATASETS=${{ inputs.dataset }} + export ENGINE_NAME=${{ inputs.engine_config }} + export POSTGRES_TABLE=benchmark_manual + export QDRANT__FEATURE_FLAGS__ALL=${{ inputs.feature_flags_all_version_2 }} + bash -x tools/setup_ci.sh + bash -x tools/run_ci.sh + + compareVersions: + name: compare - ${{ inputs.qdrant_version_1 }} vs ${{ inputs.qdrant_version_2 }} + needs: + - runBenchmarkForVersion1 + - runBenchmarkForVersion2 + runs-on: ubuntu-latest + steps: + - name: compare + run: | + compare() { + local var_name=$1 + local value_v1=$2 + local value_v2=$3 + + if (( $(echo "$value_v1 > $value_v2" | bc -l) )); then + local diff=$(echo "$value_v1 - $value_v2" | bc -l) + local percentage=$(echo "($diff / $value_v1) * 100" | bc -l) + echo -e "${{ inputs.qdrant_version_1 }} > ${{ inputs.qdrant_version_2 }} by $diff ($percentage% greater)" + elif (( $(echo "$value_v1 < $value_v2" | bc -l) )); then + local diff=$(echo "$value_v2 - $value_v1" | bc -l) + local percentage=$(echo "($diff / $value_v2) * 100" | bc -l) + echo -e "${{ inputs.qdrant_version_1 }} < ${{ inputs.qdrant_version_2 }} by $diff ($percentage% less)" + else + echo -e "equal" + fi + } + + res_collection_load_time=$(compare "collection_load_time" "${{ needs.runBenchmarkForVersion1.outputs.collection_load_time }}" "${{ needs.runBenchmarkForVersion2.outputs.collection_load_time }}") + res_rps=$(compare "rps" "${{ needs.runBenchmarkForVersion1.outputs.rps }}" "${{ needs.runBenchmarkForVersion2.outputs.rps }}") + res_mean_precisions=$(compare "mean_precisions" "${{ needs.runBenchmarkForVersion1.outputs.mean_precisions }}" "${{ needs.runBenchmarkForVersion2.outputs.mean_precisions }}") + res_p95_time=$(compare "p95_time" "${{ needs.runBenchmarkForVersion1.outputs.p95_time }}" "${{ needs.runBenchmarkForVersion2.outputs.p95_time }}") + res_p99_time=$(compare "p99_time" "${{ needs.runBenchmarkForVersion1.outputs.p99_time }}" "${{ needs.runBenchmarkForVersion2.outputs.p99_time }}") + res_vm_rss_memory_usage=$(compare "vm_rss_memory_usage" "${{ needs.runBenchmarkForVersion1.outputs.vm_rss_memory_usage }}" "${{ needs.runBenchmarkForVersion2.outputs.vm_rss_memory_usage }}") + res_rss_anon_memory_usage=$(compare "rss_anon_memory_usage" "${{ needs.runBenchmarkForVersion1.outputs.rss_anon_memory_usage }}" "${{ needs.runBenchmarkForVersion2.outputs.rss_anon_memory_usage }}") + res_cpu_usage=$(compare "cpu_usage" "${{ needs.runBenchmarkForVersion1.outputs.cpu }}" "${{ needs.runBenchmarkForVersion2.outputs.cpu }}") + res_cpu_telemetry=$(compare "cpu_telemetry" "${{ needs.runBenchmarkForVersion1.outputs.cpu_telemetry }}" "${{ needs.runBenchmarkForVersion2.outputs.cpu_telemetry }}") + res_upload_time=$(compare "upload_time" "${{ needs.runBenchmarkForVersion1.outputs.upload_time }}" "${{ needs.runBenchmarkForVersion2.outputs.upload_time }}") + res_indexing_time=$(compare "indexing_time" "${{ needs.runBenchmarkForVersion1.outputs.indexing_time }}" "${{ needs.runBenchmarkForVersion2.outputs.indexing_time }}") + + echo "# Comparison results" >> $GITHUB_STEP_SUMMARY + echo "| Name | ${{ inputs.qdrant_version_1 }} | ${{ inputs.qdrant_version_2 }} | Result |" >> $GITHUB_STEP_SUMMARY + echo "| --------------------- | ------------ | ------------ | ------------ |" >> $GITHUB_STEP_SUMMARY + echo "| collection_load_time | ${{ needs.runBenchmarkForVersion1.outputs.collection_load_time }} | ${{ needs.runBenchmarkForVersion2.outputs.collection_load_time }} | ${res_collection_load_time} |" >> $GITHUB_STEP_SUMMARY + echo "| rps | ${{ needs.runBenchmarkForVersion1.outputs.rps }} | ${{ needs.runBenchmarkForVersion2.outputs.rps }} | ${res_rps} |" >> $GITHUB_STEP_SUMMARY + echo "| mean_precisions | ${{ needs.runBenchmarkForVersion1.outputs.mean_precisions }} | ${{ needs.runBenchmarkForVersion2.outputs.mean_precisions }} | ${res_mean_precisions} |" >> $GITHUB_STEP_SUMMARY + echo "| p95_time | ${{ needs.runBenchmarkForVersion1.outputs.p95_time }} | ${{ needs.runBenchmarkForVersion2.outputs.p95_time }} | ${res_p95_time} |" >> $GITHUB_STEP_SUMMARY + echo "| p99_time | ${{ needs.runBenchmarkForVersion1.outputs.p99_time }} | ${{ needs.runBenchmarkForVersion2.outputs.p99_time }} | ${res_p99_time} |" >> $GITHUB_STEP_SUMMARY + echo "| vm_rss_memory_usage | ${{ needs.runBenchmarkForVersion1.outputs.vm_rss_memory_usage }} | ${{ needs.runBenchmarkForVersion2.outputs.vm_rss_memory_usage }} | ${res_vm_rss_memory_usage} |" >> $GITHUB_STEP_SUMMARY + echo "| rss_anon_memory_usage | ${{ needs.runBenchmarkForVersion1.outputs.rss_anon_memory_usage }} | ${{ needs.runBenchmarkForVersion2.outputs.rss_anon_memory_usage }} | ${res_rss_anon_memory_usage} |" >> $GITHUB_STEP_SUMMARY + echo "| cpu | ${{ needs.runBenchmarkForVersion1.outputs.cpu }} | ${{ needs.runBenchmarkForVersion2.outputs.cpu }} | ${res_cpu_usage} |" >> $GITHUB_STEP_SUMMARY + echo "| cpu_telemetry | ${{ needs.runBenchmarkForVersion1.outputs.cpu_telemetry }} | ${{ needs.runBenchmarkForVersion2.outputs.cpu_telemetry }} | ${res_cpu_telemetry} |" >> $GITHUB_STEP_SUMMARY + echo "| upload_time | ${{ needs.runBenchmarkForVersion1.outputs.upload_time }} | ${{ needs.runBenchmarkForVersion2.outputs.upload_time }} | ${res_upload_time} |" >> $GITHUB_STEP_SUMMARY + echo "| indexing_time | ${{ needs.runBenchmarkForVersion1.outputs.indexing_time }} | ${{ needs.runBenchmarkForVersion2.outputs.indexing_time }} | ${res_indexing_time} |" >> $GITHUB_STEP_SUMMARY diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 754906cd..99c8a8e6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,20 +11,27 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: check-added-large-files - repo: https://github.com/psf/black - rev: 22.12.0 + rev: 24.10.0 hooks: - id: black name: "Black: The uncompromising Python code formatter" - repo: https://github.com/PyCQA/isort - rev: 5.12.0 + rev: 5.13.2 hooks: - id: isort name: "Sort Imports" args: ["--profile", "black"] + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.6 + hooks: + # Run the linter. + - id: ruff + args: [ --fix ] diff --git a/Dockerfile b/Dockerfile index de3ad063..fbec113f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ENV PYTHONFAULTHANDLER=1 \ PIP_NO_CACHE_DIR=off \ PIP_DISABLE_PIP_VERSION_CHECK=on \ PIP_DEFAULT_TIMEOUT=100 \ - POETRY_VERSION=1.5.1 + POETRY_VERSION=2.1.2 RUN apt update RUN apt install -y wget @@ -19,7 +19,7 @@ COPY poetry.lock pyproject.toml /code/ # Project initialization: RUN poetry config virtualenvs.create false \ - && poetry install --no-dev --no-interaction --no-ansi + && poetry --no-interaction --no-ansi install --without dev # Creating folders, and files for a project: COPY . /code diff --git a/README.md b/README.md index 1419a120..cc66f386 100644 --- a/README.md +++ b/README.md @@ -61,9 +61,16 @@ poetry install Run the benchmark: ```bash +$ poetry shell +$ python run.py --help + Usage: run.py [OPTIONS] - Example: python3 -m run --engines *-m-16-* --datasets glove-* + Examples: + + python3 run.py --engines "qdrant-rps-m-*-ef-*" --datasets "dbpedia-openai-100K-1536-angular" # Qdrant RPS mode + + python3 run.py --engines "*-m-*-ef-*" --datasets "glove-*" # All engines and their configs for glove datasets Options: --engines TEXT [default: *] diff --git a/benchmark/convert.py b/benchmark/convert.py new file mode 100644 index 00000000..815d01c2 --- /dev/null +++ b/benchmark/convert.py @@ -0,0 +1,91 @@ +import argparse +import glob +import json +import os + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--input-dir", type=str, required=True) + parser.add_argument("--output-file", type=str, required=True) + args = parser.parse_args() + + input_dir = args.input_dir + output_file = args.output_file + + searches = glob.glob(os.path.join(input_dir, "*-search-*.json")) + uploads = glob.glob(os.path.join(input_dir, "*-upload-*.json")) + + """ + Target data structure: + + { + "engine_name": "qdrant", + "setup_name": "qdrant-bq-rps-m-64-ef-256", + "dataset_name": "dbpedia-openai-1M-1536-angular", + "upload_time": 222.45490989403334, + "total_upload_time": 593.0384756129934, + "p95_time": 0.0025094749056734146, + "rps": 1230.5984500596446, + "parallel": 100.0, + "p99_time": 0.014029250466264838, + "mean_time": 0.00227582405093126, + "mean_precisions": 0.95258, + "engine_params": { + "hnsw_ef": 64, + "quantization": { + "rescore": true, + "oversampling": 4.0 + } + } + } + """ + + print(f"input_dir: {input_dir}") + print(f"output_file: {output_file}") + + print(f"searches: {len(searches)}") + print(f"uploads: {len(uploads)}") + + upload_data = {} + + for upload_file in uploads: + data = json.load(open(upload_file)) + experiment_name = data["params"]["experiment"] + upload_data[experiment_name] = data + + result_data = [] + + for search_file in searches: + data = json.load(open(search_file)) + experiment_name = data["params"]["experiment"] + dataset_name = data["params"]["dataset"] + engine_params = data["params"]["config"] + parallel = data["params"]["parallel"] + engine_name = data["params"]["engine"] + + upload_time = upload_data[experiment_name]["results"]["upload_time"] + total_upload_time = upload_data[experiment_name]["results"]["total_time"] + + search_results = data["results"] + search_results.pop("total_time") + + result_data.append( + { + "engine_name": engine_name, + "setup_name": experiment_name, + "dataset_name": dataset_name, + "upload_time": upload_time, + "total_upload_time": total_upload_time, + "parallel": parallel, + "engine_params": engine_params, + **search_results, + } + ) + + with open(output_file, "w") as f: + json.dump(result_data, f, indent=2) + + +if __name__ == "__main__": + main() diff --git a/benchmark/dataset.py b/benchmark/dataset.py index c71b19af..bbbaa095 100644 --- a/benchmark/dataset.py +++ b/benchmark/dataset.py @@ -4,6 +4,7 @@ import urllib.request from dataclasses import dataclass, field from typing import Dict, List, Optional, Union +from urllib.request import build_opener, install_opener import boto3 import botocore.exceptions from benchmark import DATASETS_DIR @@ -15,18 +16,23 @@ from tqdm import tqdm from pathlib import Path +# Needed for Cloudflare's firewall in ann-benchmarks +# See https://github.com/erikbern/ann-benchmarks/pull/561 +opener = build_opener() +opener.addheaders = [("User-agent", "Mozilla/5.0")] +install_opener(opener) + @dataclass class DatasetConfig: - vector_size: int - distance: str name: str type: str - path: Dict[ - str, List[Dict[str, str]] - ] # Now path is expected to handle multi-file structure for h5-multi - link: Optional[Dict[str, List[Dict[str, str]]]] = None + path: Union[str, Dict[str, List[Dict[str, str]]]] # Can be a string or a dict for multi-file structure + link: Optional[Union[str, Dict[str, List[Dict[str, str]]]]] = None schema: Optional[Dict[str, str]] = field(default_factory=dict) + # None in case of sparse vectors: + vector_size: Optional[int] = None + distance: Optional[str] = None READER_TYPE = { diff --git a/dataset_reader/ann_compound_reader.py b/dataset_reader/ann_compound_reader.py index a2b03301..9d862811 100644 --- a/dataset_reader/ann_compound_reader.py +++ b/dataset_reader/ann_compound_reader.py @@ -33,6 +33,7 @@ def read_queries(self) -> Iterator[Query]: vector /= np.linalg.norm(vector) yield Query( vector=vector.tolist(), + sparse_vector=None, meta_conditions=row_json["conditions"], expected_result=row_json["closest_ids"], expected_scores=row_json["closest_scores"], diff --git a/dataset_reader/ann_h5_reader.py b/dataset_reader/ann_h5_reader.py index 1bc984ac..fd392cfd 100644 --- a/dataset_reader/ann_h5_reader.py +++ b/dataset_reader/ann_h5_reader.py @@ -22,6 +22,7 @@ def read_queries(self) -> Iterator[Query]: vector /= np.linalg.norm(vector) yield Query( vector=vector.tolist(), + sparse_vector=None, meta_conditions=None, expected_result=expected_result.tolist(), expected_scores=expected_scores.tolist(), @@ -33,7 +34,9 @@ def read_data(self, *args, **kwargs) -> Iterator[Record]: for idx, vector in enumerate(data["train"]): if self.normalize: vector /= np.linalg.norm(vector) - yield Record(id=idx, vector=vector.tolist(), metadata=None) + yield Record( + id=idx, vector=vector.tolist(), sparse_vector=None, metadata=None + ) if __name__ == "__main__": diff --git a/dataset_reader/base_reader.py b/dataset_reader/base_reader.py index e4c3ee60..6eb1de2d 100644 --- a/dataset_reader/base_reader.py +++ b/dataset_reader/base_reader.py @@ -2,16 +2,24 @@ from typing import Iterator, List, Optional +@dataclass +class SparseVector: + indices: List[int] + values: List[float] + + @dataclass class Record: id: int - vector: List[float] + vector: Optional[List[float]] + sparse_vector: Optional[SparseVector] metadata: Optional[dict] @dataclass class Query: - vector: List[float] + vector: Optional[List[float]] + sparse_vector: Optional[SparseVector] meta_conditions: Optional[dict] expected_result: Optional[List[int]] expected_scores: Optional[List[float]] = None diff --git a/dataset_reader/json_reader.py b/dataset_reader/json_reader.py index e6bab83e..f1ccf16e 100644 --- a/dataset_reader/json_reader.py +++ b/dataset_reader/json_reader.py @@ -58,13 +58,18 @@ def read_queries(self) -> Iterator[Query]: ): # ToDo: add meta_conditions - yield Query(vector=vector, meta_conditions=None, expected_result=neighbours) + yield Query( + vector=vector, + sparse_vector=None, + meta_conditions=None, + expected_result=neighbours, + ) def read_data(self, *args, **kwargs) -> Iterator[Record]: for idx, (vector, payload) in enumerate( zip(self.read_vectors(), self.read_payloads()) ): - yield Record(id=idx, vector=vector, metadata=payload) + yield Record(id=idx, vector=vector, sparse_vector=None, metadata=payload) if __name__ == "__main__": diff --git a/dataset_reader/sparse_reader.py b/dataset_reader/sparse_reader.py new file mode 100644 index 00000000..51beecaf --- /dev/null +++ b/dataset_reader/sparse_reader.py @@ -0,0 +1,119 @@ +import os +from pathlib import Path +from typing import Iterator, List, Tuple, Union + +import numpy as np + +from dataset_reader.base_reader import BaseReader, Query, Record, SparseVector + + +def read_sparse_matrix_fields( + filename: Union[Path, str] +) -> Tuple[np.array, np.array, np.array]: + """Read the fields of a CSR matrix without instantiating it""" + + with open(filename, "rb") as f: + sizes = np.fromfile(f, dtype="int64", count=3) + n_row, n_col, n_non_zero = sizes + index_pointer = np.fromfile(f, dtype="int64", count=n_row + 1) + assert n_non_zero == index_pointer[-1] + columns = np.fromfile(f, dtype="int32", count=n_non_zero) + assert np.all(columns >= 0) and np.all(columns < n_col) + values = np.fromfile(f, dtype="float32", count=n_non_zero) + return values, columns, index_pointer + + +def mmap_sparse_matrix_fields(fname): + """mmap the fields of a CSR matrix without instantiating it""" + with open(fname, "rb") as f: + sizes = np.fromfile(f, dtype="int64", count=3) + n_row, _n_col, n_non_zero = sizes + offset = sizes.nbytes + index_pointer = np.memmap( + fname, dtype="int64", mode="r", offset=offset, shape=n_row + 1 + ) + offset += index_pointer.nbytes + columns = np.memmap(fname, dtype="int32", mode="r", offset=offset, shape=n_non_zero) + offset += columns.nbytes + values = np.memmap( + fname, dtype="float32", mode="r", offset=offset, shape=n_non_zero + ) + return values, columns, index_pointer + + +def csr_to_sparse_vectors( + values: List[float], columns: List[int], index_pointer: List[int] +) -> Iterator[SparseVector]: + """Convert a CSR matrix to a list of SparseVectors""" + num_rows = len(index_pointer) - 1 + + for i in range(num_rows): + start = index_pointer[i] + end = index_pointer[i + 1] + row_values, row_indices = [], [] + for j in range(start, end): + row_values.append(values[j]) + row_indices.append(columns[j]) + yield SparseVector(indices=row_indices, values=row_values) + + +def read_csr_matrix(filename: Union[Path, str], do_mmap=True) -> Iterator[SparseVector]: + """Read a CSR matrix in spmat format""" + if do_mmap: + values, columns, index_pointer = mmap_sparse_matrix_fields(filename) + else: + values, columns, index_pointer = read_sparse_matrix_fields(filename) + + yield from csr_to_sparse_vectors(values, columns, index_pointer) + + +def knn_result_read( + filename: Union[Path, str] +) -> Tuple[List[List[int]], List[List[float]]]: + n, d = map(int, np.fromfile(filename, dtype="uint32", count=2)) + assert os.stat(filename).st_size == 8 + n * d * (4 + 4) + with open(filename, "rb") as f: + f.seek(4 + 4) + ids = np.fromfile(f, dtype="int32", count=n * d).reshape(n, d).tolist() + scores = np.fromfile(f, dtype="float32", count=n * d).reshape(n, d).tolist() + return ids, scores + + +class SparseReader(BaseReader): + def __init__(self, path, normalize=False): + self.path = path + self.normalize = normalize + + def read_queries(self) -> Iterator[Query]: + queries_path = self.path / "queries.csr" + X = read_csr_matrix(queries_path) + + gt_path = self.path / "results.gt" + gt_indices, _ = knn_result_read(gt_path) + + for i, sparse_vector in enumerate(X): + yield Query( + vector=None, + sparse_vector=sparse_vector, + meta_conditions=None, + expected_result=gt_indices[i], + ) + + def read_data(self) -> Iterator[Record]: + data_path = self.path / "data.csr" + X = read_csr_matrix(data_path) + + for i, sparse_vector in enumerate(X): + yield Record(id=i, vector=None, sparse_vector=sparse_vector, metadata=None) + + +if __name__ == "__main__": + vals = [1, 3, 2, 3, 6, 4, 5] + cols = [0, 2, 2, 1, 3, 0, 2] + pointers = [0, 2, 3, 5, 7] + vecs = [vec for vec in csr_to_sparse_vectors(vals, cols, pointers)] + + assert vecs[0] == SparseVector(indices=[0, 2], values=[1, 3]) + assert vecs[1] == SparseVector(indices=[2], values=[2]) + assert vecs[2] == SparseVector(indices=[1, 3], values=[3, 6]) + assert vecs[3] == SparseVector(indices=[0, 2], values=[4, 5]) diff --git a/datasets/datasets.json b/datasets/datasets.json index f9728a68..bb404cf3 100644 --- a/datasets/datasets.json +++ b/datasets/datasets.json @@ -947,6 +947,26 @@ "path": "dbpedia-openai-1M-1536-angular/dbpedia_openai_1M", "link": "https://storage.googleapis.com/ann-filtered-benchmark/datasets/dbpedia_openai_1M.tgz" }, + { + "name": "dbpedia-openai-100K-1536-angular", + "vector_size": 1536, + "distance": "cosine", + "type": "tar", + "path": "dbpedia-openai-100K-1536-angular/dbpedia_openai_100K", + "link": "https://storage.googleapis.com/ann-filtered-benchmark/datasets/dbpedia_openai_100K.tgz" + }, + { + "name": "msmarco-sparse-100K", + "type": "sparse", + "path": "msmarco-sparse/100K", + "link": "https://storage.googleapis.com/ann-filtered-benchmark/datasets/msmacro-sparse-100K.tar.gz" + }, + { + "name": "msmarco-sparse-1M", + "type": "sparse", + "path": "msmarco-sparse/1M", + "link": "https://storage.googleapis.com/ann-filtered-benchmark/datasets/msmacro-sparse-1M.tar.gz" + }, { "name": "h-and-m-2048-angular-filters", "vector_size": 2048, @@ -999,7 +1019,8 @@ "schema": { "update_date_ts": "int", "labels": "keyword", - "submitter": "keyword" + "submitter": "keyword", + "id": "keyword" } }, { @@ -1196,6 +1217,17 @@ "b": "keyword" } }, + { + "name": "random-768-100-tenants", + "vector_size": 768, + "distance": "cosine", + "type": "tar", + "link": "https://storage.googleapis.com/ann-filtered-benchmark/datasets/random_keywords_1m_768_vocab_100.tgz", + "path": "random-768-100-tenants/random_keywords_1m_768_vocab_100", + "schema": { + "a": "keyword" + } + }, { "name": "random-100-match-kw-small-vocab-no-filters", "vector_size": 256, @@ -1203,5 +1235,13 @@ "type": "tar", "link": "https://storage.googleapis.com/ann-filtered-benchmark/datasets/random_keywords_1m_vocab_10_no_filters.tgz", "path": "random-100-match-kw-small-vocab/random_keywords_1m_vocab_10_no_filters" + }, + { + "name": "cohere-wiki-50m-test-only", + "vector_size": 768, + "distance": "cosine", + "type": "tar", + "link": "https://storage.googleapis.com/ann-filtered-benchmark/datasets/cohere-wiki-50m-test-only.tgz", + "path": "cohere-wiki-50m/cohere_wiki_50m" } ] diff --git a/engine/base_client/__init__.py b/engine/base_client/__init__.py index a5495554..5528bb47 100644 --- a/engine/base_client/__init__.py +++ b/engine/base_client/__init__.py @@ -6,3 +6,12 @@ class IncompatibilityError(Exception): pass + + +__all__ = [ + "BaseClient", + "BaseConfigurator", + "BaseSearcher", + "BaseUploader", + "IncompatibilityError", +] diff --git a/engine/base_client/client.py b/engine/base_client/client.py index c07f3d64..0ff001d2 100644 --- a/engine/base_client/client.py +++ b/engine/base_client/client.py @@ -2,7 +2,7 @@ import os from datetime import datetime from pathlib import Path -from typing import List +from typing import List, Optional import warnings from benchmark import ROOT_DIR @@ -35,6 +35,10 @@ def __init__( self.searchers = searchers self.engine = engine + @property + def sparse_vector_support(self): + return self.configurator.SPARSE_VECTOR_SUPPORT + def save_search_results( self, dataset_name: str, results: dict, search_id: int, search_params: dict ): @@ -87,7 +91,8 @@ def run_experiment( skip_upload: bool = False, skip_search: bool = False, skip_if_exists: bool = True, - parallels: [int] = [], + skip_configure: Optional[bool] = False, + parallels: List[int] = [], upload_start_idx: int = 0, upload_end_idx: int = -1, num_queries: int = -1, @@ -108,12 +113,14 @@ def run_experiment( return if not skip_upload: - print("Experiment stage: Configure") - self.configurator.configure(dataset) - range_max_str = ":" - if upload_end_idx > 0: - range_max_str += f"{upload_end_idx}" - print(f"Experiment stage: Upload. Vector range [{upload_start_idx}{range_max_str}]") + if not skip_configure: + print("Experiment stage: Configure") + self.configurator.configure(dataset) + else: + range_max_str = ":" + if upload_end_idx > 0: + range_max_str += f"{upload_end_idx}" + print(f"Experiment stage: Upload. Vector range [{upload_start_idx}{range_max_str}]") upload_stats = self.uploader.upload( distance=dataset.config.distance, records=reader.read_data(upload_start_idx,upload_end_idx) ) diff --git a/engine/base_client/configure.py b/engine/base_client/configure.py index 1a4aaae8..6702f49e 100644 --- a/engine/base_client/configure.py +++ b/engine/base_client/configure.py @@ -4,6 +4,7 @@ class BaseConfigurator: + SPARSE_VECTOR_SUPPORT: bool = False DISTANCE_MAPPING = {} def __init__(self, host, collection_params: dict, connection_params: dict): diff --git a/engine/base_client/search.py b/engine/base_client/search.py index 32964192..466201c6 100644 --- a/engine/base_client/search.py +++ b/engine/base_client/search.py @@ -33,13 +33,11 @@ def get_mp_start_method(cls): return None @classmethod - def search_one( - cls, vector: List[float], meta_conditions, top: Optional[int] - ) -> List[Tuple[int, float]]: + def search_one(cls, query: Query, top: Optional[int]) -> List[Tuple[int, float]]: raise NotImplementedError() @classmethod - def _search_one(cls, query, top: Optional[int] = None): + def _search_one(cls, query: Query, top: Optional[int] = None): if top is None: top = ( len(query.expected_result) @@ -48,7 +46,7 @@ def _search_one(cls, query, top: Optional[int] = None): ) start = time.perf_counter() - search_res = cls.search_one(query.vector, query.meta_conditions, top) + search_res = cls.search_one(query, top) end = time.perf_counter() precision = 1.0 diff --git a/engine/base_client/upload.py b/engine/base_client/upload.py index 2bda5479..29280ce8 100644 --- a/engine/base_client/upload.py +++ b/engine/base_client/upload.py @@ -1,6 +1,6 @@ import time from multiprocessing import get_context -from typing import Iterable, List, Optional, Tuple +from typing import Iterable, List, Optional import tqdm @@ -87,12 +87,9 @@ def upload( } @classmethod - def _upload_batch( - cls, batch: Tuple[List[int], List[list], List[Optional[dict]]] - ) -> float: - ids, vectors, metadata = batch + def _upload_batch(cls, batch: List[Record]) -> float: start = time.perf_counter() - cls.upload_batch(ids, vectors, metadata) + cls.upload_batch(batch) return time.perf_counter() - start @classmethod @@ -104,9 +101,7 @@ def get_memory_usage(cls): return {} @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: List[Optional[dict]] - ): + def upload_batch(cls, batch: List[Record]): raise NotImplementedError() @classmethod diff --git a/engine/base_client/utils.py b/engine/base_client/utils.py index 4b6b8ad5..1b0da967 100644 --- a/engine/base_client/utils.py +++ b/engine/base_client/utils.py @@ -1,20 +1,16 @@ -from typing import Any, Iterable +from typing import Iterable, List from dataset_reader.base_reader import Record -def iter_batches(records: Iterable[Record], n: int) -> Iterable[Any]: - ids = [] - vectors = [] - metadata = [] +def iter_batches(records: Iterable[Record], n: int) -> Iterable[List[Record]]: + batch = [] for record in records: - ids.append(record.id) - vectors.append(record.vector) - metadata.append(record.metadata) + batch.append(record) - if len(vectors) >= n: - yield [ids, vectors, metadata] - ids, vectors, metadata = [], [], [] - if len(ids) > 0: - yield [ids, vectors, metadata] + if len(batch) >= n: + yield batch + batch = [] + if len(batch) > 0: + yield batch diff --git a/engine/clients/elasticsearch/__init__.py b/engine/clients/elasticsearch/__init__.py index 24288e97..c1802087 100644 --- a/engine/clients/elasticsearch/__init__.py +++ b/engine/clients/elasticsearch/__init__.py @@ -1,3 +1,9 @@ from engine.clients.elasticsearch.configure import ElasticConfigurator from engine.clients.elasticsearch.search import ElasticSearcher from engine.clients.elasticsearch.upload import ElasticUploader + +__all__ = [ + "ElasticConfigurator", + "ElasticSearcher", + "ElasticUploader", +] diff --git a/engine/clients/elasticsearch/configure.py b/engine/clients/elasticsearch/configure.py index 7db91382..18a02d55 100644 --- a/engine/clients/elasticsearch/configure.py +++ b/engine/clients/elasticsearch/configure.py @@ -1,4 +1,4 @@ -from elasticsearch import Elasticsearch, NotFoundError +from elasticsearch import NotFoundError from benchmark.dataset import Dataset from engine.base_client import IncompatibilityError @@ -21,6 +21,9 @@ class ElasticConfigurator(BaseConfigurator): } INDEX_TYPE_MAPPING = { "int": "long", + "keyword": "keyword", + "text": "text", + "float": "double", "geo": "geo_point", } @@ -68,12 +71,8 @@ def recreate(self, dataset: Dataset, collection_params): "index": True, "similarity": self.DISTANCE_MAPPING[dataset.config.distance], "index_options": { - **{ - "type": "hnsw", - "m": 16, - "ef_construction": 100, - }, - **collection_params.get("index_options"), + "type": "hnsw", + **collection_params["index_options"], }, }, **self._prepare_fields_config(dataset), diff --git a/engine/clients/elasticsearch/search.py b/engine/clients/elasticsearch/search.py index b7b09e2f..96ab6b26 100644 --- a/engine/clients/elasticsearch/search.py +++ b/engine/clients/elasticsearch/search.py @@ -5,6 +5,7 @@ from elasticsearch import Elasticsearch +from dataset_reader.base_reader import Query from engine.base_client.search import BaseSearcher from engine.clients.elasticsearch.config import ELASTIC_INDEX, get_es_client from engine.clients.elasticsearch.parser import ElasticConditionParser @@ -40,15 +41,15 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic cls.search_params.pop("parallel", "1") @classmethod - def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: + def search_one(cls, query: Query, top: int) -> List[Tuple[int, float]]: knn = { "field": "vector", - "query_vector": vector, + "query_vector": query.vector, "k": top, - **{"num_candidates": 100, **cls.search_params}, + **cls.search_params["config"], } - meta_conditions = cls.parser.parse(meta_conditions) + meta_conditions = cls.parser.parse(query.meta_conditions) if meta_conditions: knn["filter"] = meta_conditions diff --git a/engine/clients/elasticsearch/upload.py b/engine/clients/elasticsearch/upload.py index e295cb5e..ef57601a 100644 --- a/engine/clients/elasticsearch/upload.py +++ b/engine/clients/elasticsearch/upload.py @@ -1,10 +1,11 @@ import multiprocessing as mp import uuid -from typing import List, Optional +from typing import List import elastic_transport from elasticsearch import Elasticsearch, ApiError +from dataset_reader.base_reader import Record from engine.base_client.upload import BaseUploader from engine.clients.elasticsearch.config import ( ELASTIC_INDEX, @@ -32,19 +33,12 @@ def init_client(cls, host, distance, connection_params, upload_params): cls.upload_params = upload_params @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: Optional[List[dict]] - ): - if metadata is None: - metadata = [{}] * len(vectors) + def upload_batch(cls, batch: List[Record]): operations = [] - for idx, vector, payload in zip(ids, vectors, metadata): - vector_id = uuid.UUID(int=idx).hex + for record in batch: + vector_id = uuid.UUID(int=record.id).hex operations.append({"index": {"_id": vector_id}}) - if payload: - operations.append({"vector": vector, **payload}) - else: - operations.append({"vector": vector}) + operations.append({"vector": record.vector, **(record.metadata or {})}) cls.client.bulk( index=ELASTIC_INDEX, diff --git a/engine/clients/milvus/__init__.py b/engine/clients/milvus/__init__.py index ca400c86..31abe17b 100644 --- a/engine/clients/milvus/__init__.py +++ b/engine/clients/milvus/__init__.py @@ -1,3 +1,9 @@ from engine.clients.milvus.configure import MilvusConfigurator from engine.clients.milvus.search import MilvusSearcher from engine.clients.milvus.upload import MilvusUploader + +__all__ = [ + "MilvusConfigurator", + "MilvusSearcher", + "MilvusUploader", +] diff --git a/engine/clients/milvus/config.py b/engine/clients/milvus/config.py index df5acd3d..45d772b2 100644 --- a/engine/clients/milvus/config.py +++ b/engine/clients/milvus/config.py @@ -26,6 +26,7 @@ DataType.INT64: 0, DataType.VARCHAR: "---MILVUS DOES NOT ACCEPT EMPTY STRINGS---", DataType.FLOAT: 0.0, + DataType.DOUBLE: 0.0, } diff --git a/engine/clients/milvus/search.py b/engine/clients/milvus/search.py index f93a8fea..a4204146 100644 --- a/engine/clients/milvus/search.py +++ b/engine/clients/milvus/search.py @@ -3,6 +3,7 @@ from pymilvus import Collection, connections +from dataset_reader.base_reader import Query from engine.base_client.search import BaseSearcher from engine.clients.milvus.config import ( DISTANCE_MAPPING, @@ -32,15 +33,15 @@ def get_mp_start_method(cls): return "forkserver" if "forkserver" in mp.get_all_start_methods() else "spawn" @classmethod - def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: - param = {"metric_type": cls.distance, "params": cls.search_params["params"]} + def search_one(cls, query: Query, top: int) -> List[Tuple[int, float]]: + param = {"metric_type": cls.distance, "params": cls.search_params["config"]} try: res = cls.collection.search( - data=[vector], + data=[query.vector], anns_field="vector", param=param, limit=top, - expr=cls.parser.parse(meta_conditions), + expr=cls.parser.parse(query.meta_conditions), ) except Exception as e: import ipdb diff --git a/engine/clients/milvus/upload.py b/engine/clients/milvus/upload.py index 6d0749ca..05ac6f57 100644 --- a/engine/clients/milvus/upload.py +++ b/engine/clients/milvus/upload.py @@ -10,6 +10,7 @@ wait_for_index_building_complete, ) +from dataset_reader.base_reader import Record from engine.base_client.upload import BaseUploader from engine.clients.milvus.config import ( DISTANCE_MAPPING, @@ -38,20 +39,26 @@ def init_client(cls, host, distance, connection_params, upload_params): cls.distance = DISTANCE_MAPPING[distance] @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: Optional[List[dict]] - ): - if metadata is not None: + def upload_batch(cls, batch: List[Record]): + has_metadata = any(record.metadata for record in batch) + if has_metadata: field_values = [ [ - payload.get(field_schema.name) or DTYPE_DEFAULT[field_schema.dtype] - for payload in metadata + record.metadata.get(field_schema.name) + or DTYPE_DEFAULT[field_schema.dtype] + for record in batch ] for field_schema in cls.collection.schema.fields if field_schema.name not in ["id", "vector"] ] else: field_values = [] + + ids, vectors = [], [] + for record in batch: + ids.append(record.id) + vectors.append(record.vector) + cls.upload_with_backoff(field_values, ids, vectors) @classmethod diff --git a/engine/clients/opensearch/__init__.py b/engine/clients/opensearch/__init__.py index 686bfcde..e4c6c59a 100644 --- a/engine/clients/opensearch/__init__.py +++ b/engine/clients/opensearch/__init__.py @@ -1,3 +1,9 @@ from engine.clients.opensearch.configure import OpenSearchConfigurator from engine.clients.opensearch.search import OpenSearchSearcher from engine.clients.opensearch.upload import OpenSearchUploader + +__all__ = [ + "OpenSearchConfigurator", + "OpenSearchSearcher", + "OpenSearchUploader", +] diff --git a/engine/clients/opensearch/parser.py b/engine/clients/opensearch/parser.py index 31eccd8f..527dc5ab 100644 --- a/engine/clients/opensearch/parser.py +++ b/engine/clients/opensearch/parser.py @@ -25,7 +25,12 @@ def build_range_filter( lte: Optional[FieldValue], gte: Optional[FieldValue], ) -> Any: - return {"range": {field_name: {"lt": lt, "gt": gt, "lte": lte, "gte": gte}}} + field_filters = { + k: v + for k, v in {"lt": lt, "gt": gt, "lte": lte, "gte": gte}.items() + if v is not None + } + return {"range": {field_name: field_filters}} def build_geo_filter( self, field_name: str, lat: float, lon: float, radius: float diff --git a/engine/clients/opensearch/search.py b/engine/clients/opensearch/search.py index 0a46c5b0..2113d316 100644 --- a/engine/clients/opensearch/search.py +++ b/engine/clients/opensearch/search.py @@ -4,6 +4,7 @@ from opensearchpy import OpenSearch +from dataset_reader.base_reader import Query from engine.base_client.search import BaseSearcher from engine.clients.opensearch.config import OPENSEARCH_INDEX, get_opensearch_client from engine.clients.opensearch.parser import OpenSearchConditionParser @@ -29,29 +30,24 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic cls.search_params = search_params @classmethod - def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: - query = { + def search_one(cls, query: Query, top: int) -> List[Tuple[int, float]]: + opensearch_query = { "knn": { "vector": { - "vector": vector, + "vector": query.vector, "k": top, } } } - meta_conditions = cls.parser.parse(meta_conditions) + meta_conditions = cls.parser.parse(query.meta_conditions) if meta_conditions: - query = { - "bool": { - "must": [query], - "filter": meta_conditions, - } - } + opensearch_query["knn"]["vector"]["filter"] = meta_conditions res = cls.client.search( index=OPENSEARCH_INDEX, body={ - "query": query, + "query": opensearch_query, "size": top, }, params={ @@ -67,5 +63,5 @@ def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: def setup_search(cls): if cls.search_params: cls.client.indices.put_settings( - body=cls.search_params, index=OPENSEARCH_INDEX + body=cls.search_params["config"], index=OPENSEARCH_INDEX ) diff --git a/engine/clients/opensearch/upload.py b/engine/clients/opensearch/upload.py index 590242cc..fb69b59e 100644 --- a/engine/clients/opensearch/upload.py +++ b/engine/clients/opensearch/upload.py @@ -1,9 +1,10 @@ import multiprocessing as mp import uuid -from typing import List, Optional +from typing import List from opensearchpy import OpenSearch +from dataset_reader.base_reader import Record from engine.base_client.upload import BaseUploader from engine.clients.opensearch.config import OPENSEARCH_INDEX, get_opensearch_client @@ -27,19 +28,12 @@ def init_client(cls, host, distance, connection_params, upload_params): cls.upload_params = upload_params @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: Optional[List[dict]] - ): - if metadata is None: - metadata = [{}] * len(vectors) + def upload_batch(cls, batch: List[Record]): operations = [] - for idx, vector, payload in zip(ids, vectors, metadata): - vector_id = uuid.UUID(int=idx).hex + for record in batch: + vector_id = uuid.UUID(int=record.id).hex operations.append({"index": {"_id": vector_id}}) - if payload: - operations.append({"vector": vector, **payload}) - else: - operations.append({"vector": vector}) + operations.append({"vector": record.vector, **(record.metadata or {})}) cls.client.bulk( index=OPENSEARCH_INDEX, diff --git a/engine/clients/pgvector/config.py b/engine/clients/pgvector/config.py index dc3b8365..5507745c 100644 --- a/engine/clients/pgvector/config.py +++ b/engine/clients/pgvector/config.py @@ -1,6 +1,6 @@ import os -PGVECTOR_PORT = int(os.getenv("PGVECTOR_PORT", 9200)) +PGVECTOR_PORT = int(os.getenv("PGVECTOR_PORT", 5432)) PGVECTOR_DB = os.getenv("PGVECTOR_DB", "postgres") PGVECTOR_USER = os.getenv("PGVECTOR_USER", "postgres") PGVECTOR_PASSWORD = os.getenv("PGVECTOR_PASSWORD", "passwd") @@ -9,6 +9,7 @@ def get_db_config(host, connection_params): return { "host": host or "localhost", + "port": PGVECTOR_PORT, "dbname": PGVECTOR_DB, "user": PGVECTOR_USER, "password": PGVECTOR_PASSWORD, diff --git a/engine/clients/pgvector/configure.py b/engine/clients/pgvector/configure.py index d5587431..9f09899d 100644 --- a/engine/clients/pgvector/configure.py +++ b/engine/clients/pgvector/configure.py @@ -9,11 +9,6 @@ class PgVectorConfigurator(BaseConfigurator): - DISTANCE_MAPPING = { - Distance.L2: "vector_l2_ops", - Distance.COSINE: "vector_cosine_ops", - } - def __init__(self, host, collection_params: dict, connection_params: dict): super().__init__(host, collection_params, connection_params) self.conn = psycopg.connect(**get_db_config(host, connection_params)) @@ -37,18 +32,6 @@ def recreate(self, dataset: Dataset, collection_params): );""" ) self.conn.execute("ALTER TABLE items ALTER COLUMN embedding SET STORAGE PLAIN") - - try: - hnsw_distance_type = self.DISTANCE_MAPPING[dataset.config.distance] - except KeyError: - raise IncompatibilityError( - f"Unsupported distance metric: {dataset.config.distance}" - ) - - self.conn.execute( - f"CREATE INDEX on items USING hnsw(embedding {hnsw_distance_type}) WITH (m = {collection_params['hnsw_config']['m']}, ef_construction = {collection_params['hnsw_config']['ef_construct']})" - ) - self.conn.close() def delete_client(self): diff --git a/engine/clients/pgvector/parser.py b/engine/clients/pgvector/parser.py index 159b8b80..938f39ba 100644 --- a/engine/clients/pgvector/parser.py +++ b/engine/clients/pgvector/parser.py @@ -13,12 +13,12 @@ def build_condition( if or_subfilters is not None and len(or_subfilters) > 0: clauses.append(f"( {' OR '.join(or_subfilters)} )") if and_subfilters is not None and len(and_subfilters) > 0: - clauses.append(f"( {' AND '.join(or_subfilters)} )") + clauses.append(f"( {' AND '.join(and_subfilters)} )") return " AND ".join(clauses) def build_exact_match_filter(self, field_name: str, value: FieldValue) -> Any: - raise f"{field_name} == {json.dumps(value)}" + return f"{field_name} == {json.dumps(value)}" def build_range_filter( self, diff --git a/engine/clients/pgvector/search.py b/engine/clients/pgvector/search.py index fa8bde5a..1e26dfc5 100644 --- a/engine/clients/pgvector/search.py +++ b/engine/clients/pgvector/search.py @@ -1,10 +1,10 @@ -import multiprocessing as mp from typing import List, Tuple import numpy as np import psycopg from pgvector.psycopg import register_vector +from dataset_reader.base_reader import Query from engine.base_client.distances import Distance from engine.base_client.search import BaseSearcher from engine.clients.pgvector.config import get_db_config @@ -23,23 +23,19 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic cls.conn = psycopg.connect(**get_db_config(host, connection_params)) register_vector(cls.conn) cls.cur = cls.conn.cursor() - cls.distance = distance - cls.search_params = search_params["search_params"] - - @classmethod - def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: - cls.cur.execute(f"SET hnsw.ef_search = {cls.search_params['hnsw_ef']}") - - if cls.distance == Distance.COSINE: - query = f"SELECT id, embedding <=> %s AS _score FROM items ORDER BY _score LIMIT {top};" - elif cls.distance == Distance.L2: - query = f"SELECT id, embedding <-> %s AS _score FROM items ORDER BY _score LIMIT {top};" + cls.cur.execute(f"SET hnsw.ef_search = {search_params['config']['hnsw_ef']}") + if distance == Distance.COSINE: + cls.query = "SELECT id, embedding <=> %s AS _score FROM items ORDER BY _score LIMIT %s" + elif distance == Distance.L2: + cls.query = "SELECT id, embedding <-> %s AS _score FROM items ORDER BY _score LIMIT %s" else: raise NotImplementedError(f"Unsupported distance metric {cls.distance}") + @classmethod + def search_one(cls, query: Query, top) -> List[Tuple[int, float]]: + # TODO: Use query.metaconditions for datasets with filtering cls.cur.execute( - query, - (np.array(vector),), + cls.query, (np.array(query.vector), top), binary=True, prepare=True ) return cls.cur.fetchall() diff --git a/engine/clients/pgvector/upload.py b/engine/clients/pgvector/upload.py index 8d59ee7f..fe0027c5 100644 --- a/engine/clients/pgvector/upload.py +++ b/engine/clients/pgvector/upload.py @@ -1,14 +1,21 @@ -from typing import List, Optional +from typing import List import numpy as np import psycopg from pgvector.psycopg import register_vector +from dataset_reader.base_reader import Record +from engine.base_client import IncompatibilityError +from engine.base_client.distances import Distance from engine.base_client.upload import BaseUploader from engine.clients.pgvector.config import get_db_config class PgVectorUploader(BaseUploader): + DISTANCE_MAPPING = { + Distance.L2: "vector_l2_ops", + Distance.COSINE: "vector_cosine_ops", + } conn = None cur = None upload_params = {} @@ -21,16 +28,36 @@ def init_client(cls, host, distance, connection_params, upload_params): cls.upload_params = upload_params @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: Optional[List[dict]] - ): - vectors = np.array(vectors) + def upload_batch(cls, batch: List[Record]): + ids, vectors = [], [] + for record in batch: + ids.append(record.id) + vectors.append(record.vector) + vectors = np.array(vectors) # Copy is faster than insert - with cls.cur.copy("COPY items (id, embedding) FROM STDIN") as copy: + with cls.cur.copy( + "COPY items (id, embedding) FROM STDIN WITH (FORMAT BINARY)" + ) as copy: + copy.set_types(["integer", "vector"]) for i, embedding in zip(ids, vectors): copy.write_row((i, embedding)) + @classmethod + def post_upload(cls, distance): + try: + hnsw_distance_type = cls.DISTANCE_MAPPING[distance] + except KeyError: + raise IncompatibilityError(f"Unsupported distance metric: {distance}") + + cls.conn.execute("SET max_parallel_workers = 128") + cls.conn.execute("SET max_parallel_maintenance_workers = 128") + cls.conn.execute( + f"CREATE INDEX ON items USING hnsw (embedding {hnsw_distance_type}) WITH (m = {cls.upload_params['hnsw_config']['m']}, ef_construction = {cls.upload_params['hnsw_config']['ef_construct']})" + ) + + return {} + @classmethod def delete_client(cls): if cls.cur: diff --git a/engine/clients/qdrant/__init__.py b/engine/clients/qdrant/__init__.py index 03642803..2c95ffc8 100644 --- a/engine/clients/qdrant/__init__.py +++ b/engine/clients/qdrant/__init__.py @@ -1,3 +1,9 @@ from engine.clients.qdrant.configure import QdrantConfigurator from engine.clients.qdrant.search import QdrantSearcher from engine.clients.qdrant.upload import QdrantUploader + +__all__ = [ + "QdrantConfigurator", + "QdrantSearcher", + "QdrantUploader", +] diff --git a/engine/clients/qdrant/configure.py b/engine/clients/qdrant/configure.py index 6a0b8161..e32f95de 100644 --- a/engine/clients/qdrant/configure.py +++ b/engine/clients/qdrant/configure.py @@ -13,6 +13,7 @@ class QdrantConfigurator(BaseConfigurator): + SPARSE_VECTOR_SUPPORT = True DISTANCE_MAPPING = { Distance.L2: rest.Distance.EUCLID, Distance.COSINE: rest.Distance.COSINE, @@ -25,6 +26,13 @@ class QdrantConfigurator(BaseConfigurator): "float": rest.PayloadSchemaType.FLOAT, "geo": rest.PayloadSchemaType.GEO, } + INDEX_PARAMS_TYPE_MAPPING = { + "int": rest.IntegerIndexParams, + "keyword": rest.KeywordIndexParams, + "text": rest.TextIndexParams, + "float": rest.FloatIndexParams, + "geo": rest.GeoIndexParams, + } def __init__(self, host, collection_params: dict, connection_params: dict): super().__init__(host, collection_params, connection_params) @@ -41,25 +49,67 @@ def clean(self): res = self.client.delete_collection(collection_name=QDRANT_COLLECTION_NAME) def recreate(self, dataset: Dataset, collection_params): + if dataset.config.type == "sparse": + vectors_config = { + "vectors_config": {}, + "sparse_vectors_config": { + "sparse": rest.SparseVectorParams( + index=rest.SparseIndexParams( + on_disk=False, + ) + ) + }, + } + else: + is_vectors_on_disk = self.collection_params.get("vectors_config", {}).get( + "on_disk", False + ) + self.collection_params.pop("vectors_config", None) + + vectors_config = { + "vectors_config": ( + rest.VectorParams( + size=dataset.config.vector_size, + distance=self.DISTANCE_MAPPING.get(dataset.config.distance), + on_disk=is_vectors_on_disk, + ) + ) + } + + payload_index_params = self.collection_params.pop("payload_index_params", {}) + if not set(payload_index_params.keys()).issubset(dataset.config.schema.keys()): + raise ValueError("payload_index_params are not found in dataset schema") + + optimizers_config = self.collection_params.setdefault("optimizers_config", {}) + # By default, disable index building while uploading + optimizers_config.setdefault("max_optimization_threads", 0) + retry_with_exponential_backoff( self.client.recreate_collection, collection_name=QDRANT_COLLECTION_NAME, - vectors_config=rest.VectorParams( - size=dataset.config.vector_size, - distance=self.DISTANCE_MAPPING.get(dataset.config.distance), - ), + **vectors_config, **self.collection_params ) - self.client.update_collection( - collection_name=QDRANT_COLLECTION_NAME, - optimizer_config=rest.OptimizersConfigDiff( - # indexing_threshold=10000000, - max_optimization_threads=0, - ), - ) + for field_name, field_type in dataset.config.schema.items(): - self.client.create_payload_index( - collection_name=QDRANT_COLLECTION_NAME, - field_name=field_name, - field_schema=self.INDEX_TYPE_MAPPING.get(field_type), - ) + if field_type in ["keyword", "uuid"]: + is_tenant = payload_index_params.get(field_name, {}).get( + "is_tenant", None + ) + on_disk = payload_index_params.get(field_name, {}).get("on_disk", None) + + self.client.create_payload_index( + collection_name=QDRANT_COLLECTION_NAME, + field_name=field_name, + field_schema=self.INDEX_PARAMS_TYPE_MAPPING.get(field_type)( + type=self.INDEX_TYPE_MAPPING.get(field_type), + is_tenant=is_tenant, + on_disk=on_disk, + ), + ) + else: + self.client.create_payload_index( + collection_name=QDRANT_COLLECTION_NAME, + field_name=field_name, + field_schema=self.INDEX_TYPE_MAPPING.get(field_type), + ) diff --git a/engine/clients/qdrant/search.py b/engine/clients/qdrant/search.py index 6ff38e25..b3bae8f8 100644 --- a/engine/clients/qdrant/search.py +++ b/engine/clients/qdrant/search.py @@ -1,11 +1,12 @@ -import multiprocessing as mp import os from typing import List, Tuple import httpx from qdrant_client import QdrantClient -from qdrant_client.http import models as rest +from qdrant_client._pydantic_compat import construct +from qdrant_client import models +from dataset_reader.base_reader import Query from engine.base_client.search import BaseSearcher from engine.clients.qdrant.config import ( QDRANT_API_KEY, @@ -25,7 +26,7 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic os.environ["GRPC_ENABLE_FORK_SUPPORT"] = "true" os.environ["GRPC_POLL_STRATEGY"] = "epoll,poll" if QDRANT_URL is None: - cls.client: QdrantClient = QdrantClient( + cls.client = QdrantClient( host, api_key=QDRANT_API_KEY, prefer_grpc=True, @@ -33,14 +34,13 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic **connection_params ) else: - cls.client: QdrantClient = QdrantClient( + cls.client = QdrantClient( url=QDRANT_URL, api_key=QDRANT_API_KEY, prefer_grpc=True, limits=httpx.Limits(max_connections=None, max_keepalive_connections=0), **connection_params ) - cls.search_params = search_params # Uncomment for gRPC @@ -49,14 +49,39 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic # return "forkserver" if "forkserver" in mp.get_all_start_methods() else "spawn" @classmethod - def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: - res = cls.client.search( - collection_name=QDRANT_COLLECTION_NAME, - query_vector=vector, - query_filter=cls.parser.parse(meta_conditions), - limit=top, - search_params=rest.SearchParams( - **cls.search_params.get("search_params", {}) - ), - ) - return [(hit.id, hit.score) for hit in res] + def search_one(cls, query: Query, top: int) -> List[Tuple[int, float]]: + + # Can query only one till we introduce re-ranking in the benchmarks + if query.sparse_vector is None: + query_vector = query.vector + else: + query_vector = construct( + models.SparseVector, + indices=query.sparse_vector.indices, + values=query.sparse_vector.values, + ) + + + prefetch = cls.search_params.get("prefetch") + + if prefetch: + prefetch = models.Prefetch( + **prefetch, + query=query_vector, + ) + + try: + res = cls.client.query_points( + using="sparse" if query.sparse_vector else None, + collection_name=QDRANT_COLLECTION_NAME, + prefetch=prefetch, + query=query_vector, + query_filter=cls.parser.parse(query.meta_conditions), + limit=top, + search_params=models.SearchParams(**cls.search_params.get("config", {})), + with_payload=cls.search_params.get("with_payload", False), + ) + except Exception as ex: + print(f"Something went wrong during search: {ex}") + raise ex + return [(hit.id, hit.score) for hit in res.points] diff --git a/engine/clients/qdrant/upload.py b/engine/clients/qdrant/upload.py index e280f45e..da99ea45 100644 --- a/engine/clients/qdrant/upload.py +++ b/engine/clients/qdrant/upload.py @@ -1,11 +1,18 @@ import json import os import time -from typing import List, Optional +from typing import List from qdrant_client import QdrantClient -from qdrant_client.http.models import Batch, CollectionStatus, OptimizersConfigDiff +from qdrant_client._pydantic_compat import construct +from qdrant_client.http.models import ( + Batch, + CollectionStatus, + OptimizersConfigDiff, + SparseVector, +) +from dataset_reader.base_reader import Record from engine.base_client.upload import BaseUploader from engine.clients.qdrant.config import ( QDRANT_ACCOUNT_ID, @@ -42,15 +49,30 @@ def init_client(cls, host, distance, connection_params, upload_params): cls.upload_params = upload_params @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: Optional[List[dict]] - ): - cls.client.upsert( + def upload_batch(cls, batch: List[Record]): + ids, vectors, payloads = [], [], [] + for point in batch: + if point.sparse_vector is None: + vector = point.vector + else: + vector = { + "sparse": construct( + SparseVector, + indices=point.sparse_vector.indices, + values=point.sparse_vector.values, + ) + } + + ids.append(point.id) + vectors.append(vector) + payloads.append(point.metadata or {}) + + _ = cls.client.upsert( collection_name=QDRANT_COLLECTION_NAME, points=Batch.model_construct( ids=ids, vectors=vectors, - payloads=[payload or {} for payload in metadata], + payloads=payloads, ), wait=False, ) @@ -60,6 +82,13 @@ def post_upload(cls, _distance): max_optimization_threads = QDRANT_MAX_OPTIMIZATION_THREADS if max_optimization_threads is not None: max_optimization_threads = int(max_optimization_threads) + else: + # If index building is disabled through the collection settings, enable it + collection = cls.client.get_collection(collection_name=QDRANT_COLLECTION_NAME) + if collection.config.optimizer_config.max_optimization_threads == 0: + # Set to a high number to not apply limits, already limited by CPU budget + max_optimization_threads = 100_000 + cls.client.update_collection( collection_name=QDRANT_COLLECTION_NAME, optimizer_config=OptimizersConfigDiff( diff --git a/engine/clients/redis/__init__.py b/engine/clients/redis/__init__.py index a1437747..75f3b150 100644 --- a/engine/clients/redis/__init__.py +++ b/engine/clients/redis/__init__.py @@ -1,3 +1,9 @@ from engine.clients.redis.configure import RedisConfigurator from engine.clients.redis.search import RedisSearcher from engine.clients.redis.upload import RedisUploader + +__all__ = [ + "RedisConfigurator", + "RedisSearcher", + "RedisUploader", +] diff --git a/engine/clients/redis/configure.py b/engine/clients/redis/configure.py index 20544c3d..86dd46a7 100644 --- a/engine/clients/redis/configure.py +++ b/engine/clients/redis/configure.py @@ -38,22 +38,22 @@ class RedisConfigurator(BaseConfigurator): def __init__(self, host, collection_params: dict, connection_params: dict): super().__init__(host, collection_params, connection_params) redis_constructor = RedisCluster if REDIS_CLUSTER else Redis - self._is_cluster = True if REDIS_CLUSTER else False + self.is_cluster = REDIS_CLUSTER self.client = redis_constructor( host=host, port=REDIS_PORT, password=REDIS_AUTH, username=REDIS_USER ) def clean(self): conns = [self.client] - if self._is_cluster: + if self.is_cluster: conns = [ self.client.get_redis_connection(node) for node in self.client.get_primaries() ] for conn in conns: - index = conn.ft() + search_namespace = conn.ft() try: - index.dropindex(delete_documents=(not REDIS_KEEP_DOCUMENTS)) + search_namespace.dropindex(delete_documents=(not REDIS_KEEP_DOCUMENTS)) except redis.ResponseError as e: str_err = e.__str__() if ( @@ -112,7 +112,7 @@ def recreate(self, dataset: Dataset, collection_params): ] + payload_fields conns = [self.client] - if self._is_cluster: + if self.is_cluster: conns = [ self.client.get_redis_connection(node) for node in self.client.get_primaries() @@ -122,7 +122,7 @@ def recreate(self, dataset: Dataset, collection_params): try: search_namespace.create_index(fields=index_fields) except redis.ResponseError as e: - if "Index already exists" not in e.__str__(): + if "Index already exists" not in str(e): raise e diff --git a/engine/clients/redis/search.py b/engine/clients/redis/search.py index 60c21dca..61dc78f4 100644 --- a/engine/clients/redis/search.py +++ b/engine/clients/redis/search.py @@ -1,8 +1,9 @@ import random -from typing import List, Tuple +from typing import List, Tuple, Union from ml_dtypes import bfloat16 import numpy as np from redis import Redis, RedisCluster +from redis.commands.search import Search as RedisSearchIndex from redis.commands.search.query import Query from engine.base_client.search import BaseSearcher from engine.clients.redis.config import ( @@ -19,8 +20,13 @@ class RedisSearcher(BaseSearcher): search_params = {} - client = None + client: Union[RedisCluster, Redis] = None parser = RedisConditionParser() + knn_conditions = "EF_RUNTIME $EF" + + is_cluster: bool + conns: List[Union[RedisCluster, Redis]] + search_namespace: RedisSearchIndex @classmethod def init_client(cls, host, distance, connection_params: dict, search_params: dict): @@ -29,7 +35,7 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic host=host, port=REDIS_PORT, password=REDIS_AUTH, username=REDIS_USER ) cls.search_params = search_params - cls.knn_conditions = "" + cls.knn_conditions = "EF_RUNTIME $EF" cls.algorithm = cls.search_params.get("algorithm", "hnsw").upper() cls.hybrid_policy = REDIS_HYBRID_POLICY @@ -54,16 +60,21 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic # In the case of CLUSTER API enabled we randomly select the starting primary shard # when doing the client initialization to evenly distribute the load among the cluster - cls.conns = [cls.client] - if cls._is_cluster: + if REDIS_CLUSTER: cls.conns = [ cls.client.get_redis_connection(node) for node in cls.client.get_primaries() ] - cls._ft = cls.conns[random.randint(0, len(cls.conns)) - 1].ft() + else: + cls.conns = [cls.client] + + cls.is_cluster = REDIS_CLUSTER + cls.search_namespace = random.choice(cls.conns).ft() @classmethod - def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: + def search_one(cls, query, meta_conditions, top) -> List[Tuple[int, float]]: + vector = query.vector if hasattr(query, 'vector') else query + meta_conditions = query.meta_conditions if hasattr(query, 'meta_conditions') else meta_conditions conditions = cls.parser.parse(meta_conditions) hybrid_policy = "" if cls.hybrid_policy != "": @@ -95,6 +106,11 @@ def search_one(cls, vector, meta_conditions, top) -> List[Tuple[int, float]]: # 'EF_RUNTIME' is irrelevant for 'ADHOC_BF' policy if cls.hybrid_policy != "ADHOC_BF": params_dict["EF"] = cls.search_params["search_params"]["ef"] - results = cls._ft.search(q, query_params=params_dict) + + # Use the correct search method based on the client + if hasattr(cls, '_ft'): + results = cls._ft.search(q, query_params=params_dict) + else: + results = cls.search_namespace.search(q, query_params=params_dict) return [(int(result.id), float(result.vector_score)) for result in results.docs] diff --git a/engine/clients/redis/upload.py b/engine/clients/redis/upload.py index e76e7da3..b5b790c9 100644 --- a/engine/clients/redis/upload.py +++ b/engine/clients/redis/upload.py @@ -6,6 +6,8 @@ import random import numpy as np from redis import Redis, RedisCluster + +from dataset_reader.base_reader import Record from engine.base_client.upload import BaseUploader from engine.clients.redis.config import ( REDIS_PORT, @@ -52,16 +54,15 @@ def init_client(cls, host, distance, connection_params, upload_params): cls._is_cluster = True if REDIS_CLUSTER else False @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: Optional[List[dict]] - ): + def upload_batch(cls, batch: List[Record]): if REDIS_JUST_INDEX: return - for i in range(len(ids)): - idx = ids[i] + + for record in batch: + idx = record.id vector_key = str(idx) - vec = vectors[i] - meta = metadata[i] if metadata else {} + vec = record.vector + meta = record.metadata or {} geopoints = {} payload = {} if meta is not None: @@ -91,7 +92,7 @@ def upload_batch( **geopoints, }, ) - + @classmethod def post_upload(cls, _distance): diff --git a/engine/clients/weaviate/__init__.py b/engine/clients/weaviate/__init__.py index d8d90121..2e8abba5 100644 --- a/engine/clients/weaviate/__init__.py +++ b/engine/clients/weaviate/__init__.py @@ -1,3 +1,9 @@ from engine.clients.weaviate.configure import WeaviateConfigurator from engine.clients.weaviate.search import WeaviateSearcher from engine.clients.weaviate.upload import WeaviateUploader + +__all__ = [ + "WeaviateConfigurator", + "WeaviateSearcher", + "WeaviateUploader", +] diff --git a/engine/clients/weaviate/search.py b/engine/clients/weaviate/search.py index 08011f60..e5cd4ddc 100644 --- a/engine/clients/weaviate/search.py +++ b/engine/clients/weaviate/search.py @@ -1,4 +1,3 @@ -import uuid from typing import List, Tuple from weaviate import WeaviateClient @@ -7,6 +6,7 @@ from weaviate.collections import Collection from weaviate.connect import ConnectionParams +from dataset_reader.base_reader import Query from engine.base_client.search import BaseSearcher from engine.clients.weaviate.config import WEAVIATE_CLASS_NAME, setup_client from engine.clients.weaviate.parser import WeaviateConditionParser @@ -26,10 +26,10 @@ def init_client(cls, host, distance, connection_params: dict, search_params: dic assert cls.client.is_ready() is True @classmethod - def search_one(self, vector, meta_conditions, top) -> List[Tuple[int, float]]: - res = self.collection.query.near_vector( - near_vector=vector, - filters=self.parser.parse(meta_conditions), + def search_one(cls, query: Query, top: int) -> List[Tuple[int, float]]: + res = cls.collection.query.near_vector( + near_vector=query.vector, + filters=cls.parser.parse(query.meta_conditions), limit=top, return_metadata=MetadataQuery(distance=True), return_properties=[], @@ -39,7 +39,7 @@ def search_one(self, vector, meta_conditions, top) -> List[Tuple[int, float]]: def setup_search(self): self.collection.config.update( vector_index_config=Reconfigure.VectorIndex.hnsw( - ef=self.search_params["vectorIndexConfig"]["ef"] + ef=self.search_params["config"]["ef"] ) ) diff --git a/engine/clients/weaviate/upload.py b/engine/clients/weaviate/upload.py index 362a6eda..e0c80ea7 100644 --- a/engine/clients/weaviate/upload.py +++ b/engine/clients/weaviate/upload.py @@ -2,6 +2,7 @@ from typing import List, Optional from weaviate import WeaviateClient +from dataset_reader.base_reader import Record from engine.base_client.upload import BaseUploader from engine.clients.weaviate.config import WEAVIATE_CLASS_NAME, setup_client from weaviate.classes.data import DataObject @@ -21,17 +22,13 @@ def init_client(cls, host, distance, connection_params, upload_params): ) @classmethod - def upload_batch( - cls, ids: List[int], vectors: List[list], metadata: List[Optional[dict]] - ): + def upload_batch(cls, batch: List[Record]): objects = [] - for pos, vector in enumerate(vectors): - _id = uuid.UUID(ids[pos]) - _property = {} - if metadata is not None and len(metadata) >= pos: - _property = metadata[pos] + for record in batch: + _id = uuid.UUID(int=record.id) + _property = record.metadata or {} objects.append( - DataObject(properties=_property, vector=vector, uuid=_id) + DataObject(properties=_property, vector=record.vector, uuid=_id) ) if len(objects) > 0: cls.collection.data.insert_many(objects) diff --git a/engine/servers/elasticsearch-single-node-ci/docker-compose.yaml b/engine/servers/elasticsearch-single-node-ci/docker-compose.yaml new file mode 100644 index 00000000..cdac3f65 --- /dev/null +++ b/engine/servers/elasticsearch-single-node-ci/docker-compose.yaml @@ -0,0 +1,23 @@ +version: '3.5' + +services: + es: + image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2 + environment: + ELASTIC_PASSWORD: "passwd" + KIBANA_PASSWORD: "passwd" + SERVER_SSL_ENABLED: "false" + discovery.type: "single-node" + xpack.security.enabled: "false" + ports: + - "9200:9200" + - "9300:9300" + logging: + driver: "json-file" + options: + max-file: 1 + max-size: 10m + deploy: + resources: + limits: + memory: 4Gb diff --git a/engine/servers/milvus-limit-ram/docker-compose.yaml b/engine/servers/milvus-limit-ram/docker-compose.yaml index 5c1aa231..948b868b 100644 --- a/engine/servers/milvus-limit-ram/docker-compose.yaml +++ b/engine/servers/milvus-limit-ram/docker-compose.yaml @@ -39,7 +39,7 @@ services: standalone: container_name: milvus-standalone - image: milvusdb/milvus:v2.3.0-beta + image: milvusdb/milvus:v2.4.1 command: ["milvus", "run", "standalone"] environment: ETCD_ENDPOINTS: etcd:2379 diff --git a/engine/servers/milvus-single-node/docker-compose.yaml b/engine/servers/milvus-single-node/docker-compose.yaml index 7fe7a56d..02fe4d0b 100644 --- a/engine/servers/milvus-single-node/docker-compose.yaml +++ b/engine/servers/milvus-single-node/docker-compose.yaml @@ -14,8 +14,8 @@ services: logging: driver: "json-file" options: - max-file: 1 - max-size: 10m + max-file: "1" + max-size: "10m" command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd minio: @@ -29,8 +29,8 @@ services: logging: driver: "json-file" options: - max-file: 1 - max-size: 10m + max-file: "1" + max-size: "10m" command: minio server /minio_data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] @@ -40,7 +40,7 @@ services: standalone: container_name: milvus-standalone - image: milvusdb/milvus:v2.3.1 + image: milvusdb/milvus:v2.4.1 command: ["milvus", "run", "standalone"] environment: ETCD_ENDPOINTS: etcd:2379 @@ -48,8 +48,8 @@ services: logging: driver: "json-file" options: - max-file: 1 - max-size: 10m + max-file: "1" + max-size: "10m" ports: - "19530:19530" depends_on: diff --git a/engine/servers/opensearch-single-node-ci/docker-compose.yaml b/engine/servers/opensearch-single-node-ci/docker-compose.yaml new file mode 100644 index 00000000..18d97779 --- /dev/null +++ b/engine/servers/opensearch-single-node-ci/docker-compose.yaml @@ -0,0 +1,21 @@ +version: '3.5' + +services: + opensearch: + image: opensearchproject/opensearch:2.10.0 + environment: + discovery.type: "single-node" + plugins.security.disabled: true + OPENSEARCH_JAVA_OPTS: "-Xms2g -Xmx2g" + ports: + - "9200:9200" + - "9300:9300" + logging: + driver: "json-file" + options: + max-file: 1 + max-size: 10m + deploy: + resources: + limits: + memory: 4Gb diff --git a/engine/servers/pgvector-single-node/docker-compose.yaml b/engine/servers/pgvector-single-node/docker-compose.yaml index ea554d92..13e8b8e6 100644 --- a/engine/servers/pgvector-single-node/docker-compose.yaml +++ b/engine/servers/pgvector-single-node/docker-compose.yaml @@ -3,13 +3,17 @@ version: '3.7' services: pgvector: container_name: pgvector - image: ankane/pgvector:v0.5.1 + image: pgvector/pgvector:0.6.2-pg16 environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=passwd - POSTGRES_HOST_AUTH_METHOD=trust - - POSTGRES_MAX_CONNECTIONS=200 + # shared_buffers should be 25% of memory + # maintenance_work_mem should be ~65% + command: postgres -c shared_buffers=6GB -c maintenance_work_mem=16GB -c max_connections=200 + # shm_size should be shared_buffers + maintenance_work_mem + shm_size: 22g ports: - 5432:5432 logging: diff --git a/engine/servers/qdrant-billion-scale/docker-compose.yaml b/engine/servers/qdrant-billion-scale/docker-compose.yaml index 36330f63..723a76b6 100644 --- a/engine/servers/qdrant-billion-scale/docker-compose.yaml +++ b/engine/servers/qdrant-billion-scale/docker-compose.yaml @@ -2,8 +2,10 @@ version: '3.7' services: qdrant_bench: - image: qdrant/qdrant:v1.7.3 - network_mode: host + image: qdrant/qdrant:${QDRANT_VERSION:-v1.11.0} + ports: + - "6333:6333" + - "6334:6334" volumes: - ./storage:/qdrant/storage environment: diff --git a/engine/servers/qdrant-cluster-mode/docker-compose.yaml b/engine/servers/qdrant-cluster-mode/docker-compose.yaml index 87fb7961..cd3adf26 100644 --- a/engine/servers/qdrant-cluster-mode/docker-compose.yaml +++ b/engine/servers/qdrant-cluster-mode/docker-compose.yaml @@ -1,8 +1,8 @@ version: "3.7" services: - qdrant_node_1: - image: qdrant/qdrant:v1.7.3 + qdrant-node-0: + image: qdrant/qdrant:${QDRANT_VERSION:-v1.11.0} environment: - QDRANT__SERVICE__GRPC_PORT=6334 - QDRANT__CLUSTER__ENABLED=true @@ -10,43 +10,43 @@ services: ports: - "6333:6333" - "6334:6334" - command: ./qdrant --uri 'http://qdrant_node_1:6335' + command: ./qdrant --uri 'http://qdrant-node-0:6335' # deploy: # resources: # limits: # cpus: '0.07' - qdrant_node_follower: - image: qdrant/qdrant:v1.7.3 + qdrant-node-1: + image: qdrant/qdrant:${QDRANT_VERSION:-v1.11.0} environment: - QDRANT__SERVICE__GRPC_PORT=6334 - QDRANT__CLUSTER__ENABLED=true - QDRANT__CLUSTER__P2P__PORT=6335 depends_on: - - qdrant_node_1 + - qdrant-node-0 ports: - "6433:6333" - "6434:6334" - command: bash -c "sleep 5 && ./qdrant --bootstrap 'http://qdrant_node_1:6335' --uri 'http://qdrant_node_follower:6335'" + command: bash -c "sleep 5 && ./qdrant --bootstrap 'http://qdrant-node-0:6335' --uri 'http://qdrant-node-1:6335'" # deploy: # resources: # limits: # cpus: '0.05' - qdrant_node_follower_2: - image: qdrant/qdrant:v1.7.3 + qdrant-node-2: + image: qdrant/qdrant:${QDRANT_VERSION:-v1.11.0} environment: - QDRANT__SERVICE__GRPC_PORT=6334 - QDRANT__CLUSTER__ENABLED=true - QDRANT__CLUSTER__P2P__PORT=6335 depends_on: - - qdrant_node_1 + - qdrant-node-0 ports: - "6533:6333" - "6534:6334" - command: bash -c "sleep 6 && ./qdrant --bootstrap 'http://qdrant_node_1:6335' --uri 'http://qdrant_node_follower_2:6335'" + command: bash -c "sleep 6 && ./qdrant --bootstrap 'http://qdrant-node-0:6335' --uri 'http://qdrant-node-2:6335'" # deploy: # resources: # limits: diff --git a/engine/servers/qdrant-continuous-benchmarks-snapshot/docker-compose.yaml b/engine/servers/qdrant-continuous-benchmarks-snapshot/docker-compose.yaml new file mode 100644 index 00000000..a1b0c4a9 --- /dev/null +++ b/engine/servers/qdrant-continuous-benchmarks-snapshot/docker-compose.yaml @@ -0,0 +1,26 @@ +version: '3.7' + +services: + qdrant_bench: + image: ${CONTAINER_REGISTRY:-docker.io}/qdrant/qdrant:${QDRANT_VERSION} + container_name: qdrant-continuous + environment: + QDRANT_NUM_CPUS: 4 + ports: + - "6333:6333" + - "6334:6334" + volumes: + - qdrant_storage:/qdrant/storage + logging: + driver: "json-file" + options: + max-file: 1 + max-size: 10m + deploy: + resources: + limits: + memory: ${CONTAINER_MEM_LIMIT:-25Gb} + +volumes: + qdrant_storage: + name: "qdrant_storage" diff --git a/engine/servers/qdrant-continuous-benchmarks-with-volume/docker-compose.yaml b/engine/servers/qdrant-continuous-benchmarks-with-volume/docker-compose.yaml new file mode 100644 index 00000000..cccc9b1c --- /dev/null +++ b/engine/servers/qdrant-continuous-benchmarks-with-volume/docker-compose.yaml @@ -0,0 +1,24 @@ +version: '3.7' + +services: + qdrant_bench: + image: ${CONTAINER_REGISTRY:-docker.io}/qdrant/qdrant:${QDRANT_VERSION} + container_name: qdrant-continuous + ports: + - "6333:6333" + - "6334:6334" + volumes: + - qdrant_storage:/qdrant/storage + logging: + driver: "json-file" + options: + max-file: 1 + max-size: 10m + deploy: + resources: + limits: + memory: ${CONTAINER_MEM_LIMIT:-25Gb} + +volumes: + qdrant_storage: + name: "qdrant_storage" diff --git a/engine/servers/qdrant-continuous-benchmarks/docker-compose.yaml b/engine/servers/qdrant-continuous-benchmarks/docker-compose.yaml index a73071a8..83a5c900 100644 --- a/engine/servers/qdrant-continuous-benchmarks/docker-compose.yaml +++ b/engine/servers/qdrant-continuous-benchmarks/docker-compose.yaml @@ -4,7 +4,9 @@ services: qdrant_bench: image: ${CONTAINER_REGISTRY:-docker.io}/qdrant/qdrant:${QDRANT_VERSION} container_name: qdrant-continuous - network_mode: host + ports: + - "6333:6333" + - "6334:6334" logging: driver: "json-file" options: @@ -14,3 +16,5 @@ services: resources: limits: memory: 25Gb + environment: + - QDRANT__FEATURE_FLAGS__ALL=${QDRANT__FEATURE_FLAGS__ALL:-false} diff --git a/engine/servers/qdrant-limit-ram/docker-compose.yaml b/engine/servers/qdrant-limit-ram/docker-compose.yaml index 69236a8f..c839d59c 100644 --- a/engine/servers/qdrant-limit-ram/docker-compose.yaml +++ b/engine/servers/qdrant-limit-ram/docker-compose.yaml @@ -2,8 +2,10 @@ version: '3.7' services: qdrant_bench: - image: qdrant/qdrant:v1.7.3 - network_mode: host + image: qdrant/qdrant:${QDRANT_VERSION:-v1.11.0} + ports: + - "6333:6333" + - "6334:6334" logging: driver: "json-file" options: diff --git a/engine/servers/qdrant-single-node/docker-compose-limit-cpu.yaml.yml b/engine/servers/qdrant-single-node/docker-compose-limit-cpu.yaml.yml index b957bbe2..9c19bb06 100644 --- a/engine/servers/qdrant-single-node/docker-compose-limit-cpu.yaml.yml +++ b/engine/servers/qdrant-single-node/docker-compose-limit-cpu.yaml.yml @@ -2,7 +2,7 @@ version: '3.7' services: qdrant_bench: - image: qdrant/qdrant:${QDRANT_VERSION:-v1.7.3} + image: qdrant/qdrant:${QDRANT_VERSION:-v1.11.0} network_mode: host logging: driver: "json-file" diff --git a/engine/servers/qdrant-single-node/docker-compose.yaml b/engine/servers/qdrant-single-node/docker-compose.yaml index 8285e9d3..3264127b 100644 --- a/engine/servers/qdrant-single-node/docker-compose.yaml +++ b/engine/servers/qdrant-single-node/docker-compose.yaml @@ -2,8 +2,10 @@ version: '3.7' services: qdrant_bench: - image: ${CONTAINER_REGISTRY:-docker.io}/qdrant/qdrant:v1.8.2 - network_mode: host + image: ${CONTAINER_REGISTRY:-docker.io}/qdrant/qdrant:${QDRANT_VERSION:-v1.11.0} + ports: + - "6333:6333" + - "6334:6334" logging: driver: "json-file" options: diff --git a/engine/servers/redis-single-node/docker-compose.yaml b/engine/servers/redis-single-node/docker-compose.yaml index 040182e7..5604bb6b 100644 --- a/engine/servers/redis-single-node/docker-compose.yaml +++ b/engine/servers/redis-single-node/docker-compose.yaml @@ -4,7 +4,7 @@ services: redis: image: redislabs/redisearch:2.8.8 ports: - - '6380:6379' + - '6379:6379' logging: driver: "json-file" options: diff --git a/engine/servers/weaviate-single-node/docker-compose.yaml b/engine/servers/weaviate-single-node/docker-compose.yaml index 9291687a..adb9c54e 100644 --- a/engine/servers/weaviate-single-node/docker-compose.yaml +++ b/engine/servers/weaviate-single-node/docker-compose.yaml @@ -8,13 +8,15 @@ services: - '8090' - --scheme - http - image: semitechnologies/weaviate:1.24.1 - network_mode: host + image: cr.weaviate.io/semitechnologies/weaviate:1.25.1 + ports: + - "8090:8090" + - "50051:50051" logging: driver: "json-file" options: - max-file: 1 - max-size: 10m + max-file: "1" + max-size: "10m" environment: QUERY_DEFAULTS_LIMIT: 10 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' diff --git a/experiments/configurations/elasticsearch-single-node.json b/experiments/configurations/elasticsearch-single-node.json index b3f0f609..529b825c 100644 --- a/experiments/configurations/elasticsearch-single-node.json +++ b/experiments/configurations/elasticsearch-single-node.json @@ -7,8 +7,8 @@ }, "collection_params": { "index_options": { "m": 16, "ef_construction": 100 } }, "search_params": [ - { "parallel": 1, "num_candidates": 128 }, { "parallel": 1, "num_candidates": 256 }, { "parallel": 1, "num_candidates": 512 }, - { "parallel": 100, "num_candidates": 128 }, { "parallel": 100, "num_candidates": 256 }, { "parallel": 100, "num_candidates": 512 } + { "parallel": 1, "config": { "num_candidates": 128 } }, { "parallel": 1, "config": { "num_candidates": 256 } }, { "parallel": 1, "config": { "num_candidates": 512 } }, + { "parallel": 100, "config": { "num_candidates": 128 } }, { "parallel": 100, "config": { "num_candidates": 256 } }, { "parallel": 100, "config": { "num_candidates": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -20,8 +20,8 @@ }, "collection_params": { "index_options": { "m": 16, "ef_construction": 128 } }, "search_params": [ - { "parallel": 1, "num_candidates": 128 }, { "parallel": 1, "num_candidates": 256 }, { "parallel": 1, "num_candidates": 512 }, - { "parallel": 100, "num_candidates": 128 }, { "parallel": 100, "num_candidates": 256 }, { "parallel": 100, "num_candidates": 512 } + { "parallel": 1, "config": { "num_candidates": 128 } }, { "parallel": 1, "config": { "num_candidates": 256 } }, { "parallel": 1, "config": { "num_candidates": 512 } }, + { "parallel": 100, "config": { "num_candidates": 128 } }, { "parallel": 100, "config": { "num_candidates": 256 } }, { "parallel": 100, "config": { "num_candidates": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -33,8 +33,8 @@ }, "collection_params": { "index_options": { "m": 32, "ef_construction": 128 } }, "search_params": [ - { "parallel": 1, "num_candidates": 128 }, { "parallel": 1, "num_candidates": 256 }, { "parallel": 1, "num_candidates": 512 }, - { "parallel": 100, "num_candidates": 128 }, { "parallel": 100, "num_candidates": 256 }, { "parallel": 100, "num_candidates": 512 } + { "parallel": 1, "config": { "num_candidates": 128 } }, { "parallel": 1, "config": { "num_candidates": 256 } }, { "parallel": 1, "config": { "num_candidates": 512 } }, + { "parallel": 100, "config": { "num_candidates": 128 } }, { "parallel": 100, "config": { "num_candidates": 256 } }, { "parallel": 100, "config": { "num_candidates": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -46,8 +46,8 @@ }, "collection_params": { "index_options": { "m": 32, "ef_construction": 256 } }, "search_params": [ - { "parallel": 1, "num_candidates": 128 }, { "parallel": 1, "num_candidates": 256 }, { "parallel": 1, "num_candidates": 512 }, - { "parallel": 100, "num_candidates": 128 }, { "parallel": 100, "num_candidates": 256 }, { "parallel": 100, "num_candidates": 512 } + { "parallel": 1, "config": { "num_candidates": 128 } }, { "parallel": 1, "config": { "num_candidates": 256 } }, { "parallel": 1, "config": { "num_candidates": 512 } }, + { "parallel": 100, "config": { "num_candidates": 128 } }, { "parallel": 100, "config": { "num_candidates": 256 } }, { "parallel": 100, "config": { "num_candidates": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -59,8 +59,8 @@ }, "collection_params": { "index_options": { "m": 32, "ef_construction": 512 } }, "search_params": [ - { "parallel": 1, "num_candidates": 128 }, { "parallel": 1, "num_candidates": 256 }, { "parallel": 1, "num_candidates": 512 }, - { "parallel": 100, "num_candidates": 128 }, { "parallel": 100, "num_candidates": 256 }, { "parallel": 100, "num_candidates": 512 } + { "parallel": 1, "config": { "num_candidates": 128 } }, { "parallel": 1, "config": { "num_candidates": 256 } }, { "parallel": 1, "config": { "num_candidates": 512 } }, + { "parallel": 100, "config": { "num_candidates": 128 } }, { "parallel": 100, "config": { "num_candidates": 256 } }, { "parallel": 100, "config": { "num_candidates": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -72,8 +72,8 @@ }, "collection_params": { "index_options": { "m": 64, "ef_construction": 256 } }, "search_params": [ - { "parallel": 1, "num_candidates": 128 }, { "parallel": 1, "num_candidates": 256 }, { "parallel": 1, "num_candidates": 512 }, - { "parallel": 100, "num_candidates": 128 }, { "parallel": 100, "num_candidates": 256 }, { "parallel": 100, "num_candidates": 512 } + { "parallel": 1, "config": { "num_candidates": 128 } }, { "parallel": 1, "config": { "num_candidates": 256 } }, { "parallel": 1, "config": { "num_candidates": 512 } }, + { "parallel": 100, "config": { "num_candidates": 128 } }, { "parallel": 100, "config": { "num_candidates": 256 } }, { "parallel": 100, "config": { "num_candidates": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -85,8 +85,8 @@ }, "collection_params": { "index_options": { "m": 64, "ef_construction": 512 } }, "search_params": [ - { "parallel": 1, "num_candidates": 128 }, { "parallel": 1, "num_candidates": 256 }, { "parallel": 1, "num_candidates": 512 }, - { "parallel": 100, "num_candidates": 128 }, { "parallel": 100, "num_candidates": 256 }, { "parallel": 100, "num_candidates": 512 } + { "parallel": 1, "config": { "num_candidates": 128 } }, { "parallel": 1, "config": { "num_candidates": 256 } }, { "parallel": 1, "config": { "num_candidates": 512 } }, + { "parallel": 100, "config": { "num_candidates": 128 } }, { "parallel": 100, "config": { "num_candidates": 256 } }, { "parallel": 100, "config": { "num_candidates": 512 } } ], "upload_params": { "parallel": 16 } } diff --git a/experiments/configurations/milvus-on-disk.json b/experiments/configurations/milvus-on-disk.json index 971bd0ee..997edcf7 100644 --- a/experiments/configurations/milvus-on-disk.json +++ b/experiments/configurations/milvus-on-disk.json @@ -5,7 +5,7 @@ "connection_params": {}, "collection_params": {}, "search_params": [ - { "parallel": 8, "params": { } } + { "parallel": 8, "config": { } } ], "upload_params": { "parallel": 4, "index_type": "DISKANN", "index_params": { } } } diff --git a/experiments/configurations/milvus-single-node.json b/experiments/configurations/milvus-single-node.json index 175965ef..a69c4f62 100644 --- a/experiments/configurations/milvus-single-node.json +++ b/experiments/configurations/milvus-single-node.json @@ -10,17 +10,6 @@ ], "upload_params": { "parallel": 16, "index_params": { "efConstruction": 100, "M": 16 } } }, - { - "name": "milvus-m-16-ef-64", - "engine": "milvus", - "connection_params": {}, - "collection_params": {}, - "search_params": [ - { "parallel": 1, "params": { "ef": 64 } }, { "parallel": 1, "params": { "ef": 128 } }, { "parallel": 1, "params": { "ef": 256 } }, { "parallel": 1, "params": { "ef": 512 } }, - { "parallel": 100, "params": { "ef": 64 } }, { "parallel": 100, "params": { "ef": 128 } }, { "parallel": 100, "params": { "ef": 256 } }, { "parallel": 100, "params": { "ef": 512 } } - ], - "upload_params": { "parallel": 16, "index_params": { "efConstruction": 64, "M": 16 } } - }, { "name": "milvus-m-16-ef-128", "engine": "milvus", diff --git a/experiments/configurations/opensearch-single-node.json b/experiments/configurations/opensearch-single-node.json index 348b850e..dda9314f 100644 --- a/experiments/configurations/opensearch-single-node.json +++ b/experiments/configurations/opensearch-single-node.json @@ -7,8 +7,8 @@ }, "collection_params": { "method": { "parameters": { "m": 16, "ef_construction": 100 } } }, "search_params": [ - { "parallel": 1, "knn.algo_param.ef_search": 128 }, { "parallel": 1, "knn.algo_param.ef_search": 256 }, { "parallel": 1, "knn.algo_param.ef_search": 512 }, - { "parallel": 100, "knn.algo_param.ef_search": 128 }, { "parallel": 100, "knn.algo_param.ef_search": 256 }, { "parallel": 100, "knn.algo_param.ef_search": 512 } + { "parallel": 1, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 512 } }, + { "parallel": 100, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -20,9 +20,8 @@ }, "collection_params": { "method": { "parameters": { "m": 16, "ef_construction": 128 } } }, "search_params": [ - { "parallel": 1, "knn.algo_param.ef_search": 128 }, { "parallel": 1, "knn.algo_param.ef_search": 256 }, { "parallel": 1, "knn.algo_param.ef_search": 512 }, - { "parallel": 100, "knn.algo_param.ef_search": 128 }, { "parallel": 100, "knn.algo_param.ef_search": 256 }, { "parallel": 100, "knn.algo_param.ef_search": 512 } - ], + { "parallel": 1, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 512 } }, + { "parallel": 100, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 512 } } ], "upload_params": { "parallel": 16 } }, { @@ -33,9 +32,8 @@ }, "collection_params": { "method": { "parameters": { "m": 32, "ef_construction": 128 } } }, "search_params": [ - { "parallel": 1, "knn.algo_param.ef_search": 128 }, { "parallel": 1, "knn.algo_param.ef_search": 256 }, { "parallel": 1, "knn.algo_param.ef_search": 512 }, - { "parallel": 100, "knn.algo_param.ef_search": 128 }, { "parallel": 100, "knn.algo_param.ef_search": 256 }, { "parallel": 100, "knn.algo_param.ef_search": 512 } - ], + { "parallel": 1, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 512 } }, + { "parallel": 100, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 512 } } ], "upload_params": { "parallel": 16 } }, { @@ -46,9 +44,8 @@ }, "collection_params": { "method": { "parameters": { "m": 32, "ef_construction": 256 } } }, "search_params": [ - { "parallel": 1, "knn.algo_param.ef_search": 128 }, { "parallel": 1, "knn.algo_param.ef_search": 256 }, { "parallel": 1, "knn.algo_param.ef_search": 512 }, - { "parallel": 100, "knn.algo_param.ef_search": 128 }, { "parallel": 100, "knn.algo_param.ef_search": 256 }, { "parallel": 100, "knn.algo_param.ef_search": 512 } - ], + { "parallel": 1, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 512 } }, + { "parallel": 100, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 512 } } ], "upload_params": { "parallel": 16 } }, { @@ -59,9 +56,8 @@ }, "collection_params": { "method": { "parameters": { "m": 32, "ef_construction": 512 } } }, "search_params": [ - { "parallel": 1, "knn.algo_param.ef_search": 128 }, { "parallel": 1, "knn.algo_param.ef_search": 256 }, { "parallel": 1, "knn.algo_param.ef_search": 512 }, - { "parallel": 100, "knn.algo_param.ef_search": 128 }, { "parallel": 100, "knn.algo_param.ef_search": 256 }, { "parallel": 100, "knn.algo_param.ef_search": 512 } - ], + { "parallel": 1, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 512 } }, + { "parallel": 100, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 512 } } ], "upload_params": { "parallel": 16 } }, { @@ -72,9 +68,8 @@ }, "collection_params": { "method": { "parameters": { "m": 64, "ef_construction": 256 } } }, "search_params": [ - { "parallel": 1, "knn.algo_param.ef_search": 128 }, { "parallel": 1, "knn.algo_param.ef_search": 256 }, { "parallel": 1, "knn.algo_param.ef_search": 512 }, - { "parallel": 100, "knn.algo_param.ef_search": 128 }, { "parallel": 100, "knn.algo_param.ef_search": 256 }, { "parallel": 100, "knn.algo_param.ef_search": 512 } - ], + { "parallel": 1, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 512 } }, + { "parallel": 100, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 512 } } ], "upload_params": { "parallel": 16 } }, { @@ -85,9 +80,8 @@ }, "collection_params": { "method": { "parameters": { "m": 64, "ef_construction": 512 } } }, "search_params": [ - { "parallel": 1, "knn.algo_param.ef_search": 128 }, { "parallel": 1, "knn.algo_param.ef_search": 256 }, { "parallel": 1, "knn.algo_param.ef_search": 512 }, - { "parallel": 100, "knn.algo_param.ef_search": 128 }, { "parallel": 100, "knn.algo_param.ef_search": 256 }, { "parallel": 100, "knn.algo_param.ef_search": 512 } - ], + { "parallel": 1, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 1, "config": { "knn.algo_param.ef_search": 512 } }, + { "parallel": 100, "config": { "knn.algo_param.ef_search": 128 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 256 } }, { "parallel": 100, "config": { "knn.algo_param.ef_search": 512 } } ], "upload_params": { "parallel": 16 } } ] diff --git a/experiments/configurations/pgvector-single-node.json b/experiments/configurations/pgvector-single-node.json index e1c8e33a..31b97fca 100644 --- a/experiments/configurations/pgvector-single-node.json +++ b/experiments/configurations/pgvector-single-node.json @@ -3,104 +3,88 @@ "name": "pgvector-default", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 16, "ef_construct": 128 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 128 } } + { "parallel": 8, "config": { "hnsw_ef": 128 } } ], - "upload_params": { "parallel": 1, "batch_size": 1024 } + "upload_params": { "parallel": 16, "batch_size": 1024, "hnsw_config": { "m": 16, "ef_construct": 128 } } }, { "name": "pgvector-parallel", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 16, "ef_construct": 128 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 8, "search_params": { "hnsw_ef": 128 } }, - { "parallel": 16, "search_params": { "hnsw_ef": 128 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128 } } + { "parallel": 8, "config": { "hnsw_ef": 128 } }, + { "parallel": 16, "config": { "hnsw_ef": 128 } }, + { "parallel": 100, "config": { "hnsw_ef": 128 } } ], - "upload_params": { "parallel": 1, "batch_size": 1024 } + "upload_params": { "parallel": 1, "batch_size": 1024, "hnsw_config": { "m": 16, "ef_construct": 128 } } }, { "name": "pgvector-m-16-ef-128", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 16, "ef_construct": 128 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], - "upload_params": { "parallel": 16 } + "upload_params": { "parallel": 16, "hnsw_config": { "m": 16, "ef_construct": 128 } } }, { "name": "pgvector-m-32-ef-128", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 32, "ef_construct": 128 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], - "upload_params": { "parallel": 16 } + "upload_params": { "parallel": 16, "hnsw_config": { "m": 32, "ef_construct": 128 } } }, { "name": "pgvector-m-32-ef-256", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 32, "ef_construct": 256 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], - "upload_params": { "parallel": 16 } + "upload_params": { "parallel": 16, "hnsw_config": { "m": 32, "ef_construct": 256 } } }, { "name": "pgvector-m-32-ef-512", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 32, "ef_construct": 512 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], - "upload_params": { "parallel": 16 } + "upload_params": { "parallel": 16, "hnsw_config": { "m": 32, "ef_construct": 512 } } }, { "name": "pgvector-m-64-ef-256", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 64, "ef_construct": 256 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], - "upload_params": { "parallel": 16 } + "upload_params": { "parallel": 16, "hnsw_config": { "m": 64, "ef_construct": 256 } } }, { "name": "pgvector-m-64-ef-512", "engine": "pgvector", "connection_params": {}, - "collection_params": { - "hnsw_config": { "m": 64, "ef_construct": 512 } - }, + "collection_params": {}, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], - "upload_params": { "parallel": 16 } + "upload_params": { "parallel": 16, "hnsw_config": { "m": 64, "ef_construct": 512 } } } ] diff --git a/experiments/configurations/qdrant-on-disk.json b/experiments/configurations/qdrant-on-disk.json index b412557a..ee5717d2 100644 --- a/experiments/configurations/qdrant-on-disk.json +++ b/experiments/configurations/qdrant-on-disk.json @@ -8,7 +8,51 @@ "hnsw_config": { "on_disk": true } }, "search_params": [ - { "parallel": 8, "search_params": { "hnsw_ef": 128 } } + { "parallel": 8, "config": { "hnsw_ef": 128 } } + ], + "upload_params": { "parallel": 4 } + }, + { + "name": "qdrant-all-on-disk-scalar-q", + "engine": "qdrant", + "connection_params": {}, + "collection_params": { + "optimizers_config": { + "default_segment_number": 17, + "max_optimization_threads": null + }, + "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": false} }, + "vectors_config": { "on_disk": true }, + "hnsw_config": { "on_disk": true, "m": 0, "payload_m": 16 }, + "on_disk_payload": true, + "payload_index_params": { + "a": { "is_tenant": true, "on_disk": true } + } + }, + "search_params": [ + { "parallel": 8 } + ], + "upload_params": { "parallel": 4 } + }, + { + "name": "qdrant-all-on-disk-scalar-q-with-payload", + "engine": "qdrant", + "connection_params": {}, + "collection_params": { + "optimizers_config": { + "default_segment_number": 17, + "max_optimization_threads": null + }, + "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": false} }, + "vectors_config": { "on_disk": true }, + "hnsw_config": { "on_disk": true, "m": 0, "payload_m": 16 }, + "on_disk_payload": true, + "payload_index_params": { + "a": { "is_tenant": true, "on_disk": true } + } + }, + "search_params": [ + { "parallel": 8, "with_payload": true } ], "upload_params": { "parallel": 4 } } diff --git a/experiments/configurations/qdrant-single-node-bq-rps.json b/experiments/configurations/qdrant-single-node-bq-rps.json index 09f95c83..c6d64630 100644 --- a/experiments/configurations/qdrant-single-node-bq-rps.json +++ b/experiments/configurations/qdrant-single-node-bq-rps.json @@ -4,12 +4,13 @@ "engine": "qdrant", "connection_params": { "timeout": 30 }, "collection_params": { + "optimizers_config": { "max_segment_size": 100000000, "memmap_threshold":10000000, "default_segment_number":2 }, "quantization_config": { "binary": {"always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } } ], - "upload_params": { "parallel": 1, "batch_size": 1024 } + "upload_params": { "parallel": 4, "batch_size": 1024 } }, { "name": "qdrant-bq-rps-m-16-ef-128", @@ -21,38 +22,38 @@ "quantization_config": { "binary": {"always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -66,38 +67,38 @@ "quantization_config": { "binary": {"always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -111,38 +112,38 @@ "quantization_config": { "binary": {"always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -156,38 +157,38 @@ "quantization_config": { "binary": {"always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -201,38 +202,38 @@ "quantization_config": { "binary": {"always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -246,38 +247,38 @@ "quantization_config": { "binary": {"always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } } diff --git a/experiments/configurations/qdrant-single-node-mmap.json b/experiments/configurations/qdrant-single-node-mmap.json index 56bc4dc4..5143cb44 100644 --- a/experiments/configurations/qdrant-single-node-mmap.json +++ b/experiments/configurations/qdrant-single-node-mmap.json @@ -8,8 +8,8 @@ "hnsw_config": { "m": 16, "ef_construct": 128 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -22,8 +22,8 @@ "hnsw_config": { "m": 32, "ef_construct": 128 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -36,8 +36,8 @@ "hnsw_config": { "m": 32, "ef_construct": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -50,8 +50,8 @@ "hnsw_config": { "m": 32, "ef_construct": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -64,8 +64,8 @@ "hnsw_config": { "m": 64, "ef_construct": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -78,8 +78,8 @@ "hnsw_config": { "m": 64, "ef_construct": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } } diff --git a/experiments/configurations/qdrant-single-node-rps.json b/experiments/configurations/qdrant-single-node-rps.json index 405b058b..9f1abc97 100644 --- a/experiments/configurations/qdrant-single-node-rps.json +++ b/experiments/configurations/qdrant-single-node-rps.json @@ -8,7 +8,7 @@ "hnsw_config": { "m": 16, "ef_construct": 128 } }, "search_params": [ - { "parallel": 8, "search_params": { "hnsw_ef": 128 } }, { "parallel": 8, "search_params": { "hnsw_ef": 256 } }, { "parallel": 8, "search_params": { "hnsw_ef": 512 } } + { "parallel": 8, "config": { "hnsw_ef": 128 } }, { "parallel": 8, "config": { "hnsw_ef": 256 } }, { "parallel": 8, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -21,9 +21,9 @@ "hnsw_config": { "m": 16, "ef_construct": 128 } }, "search_params": [ - { "parallel": 8, "search_params": { "hnsw_ef": 128 } }, - { "parallel": 16, "search_params": { "hnsw_ef": 256 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 8, "config": { "hnsw_ef": 128 } }, + { "parallel": 16, "config": { "hnsw_ef": 256 } }, + { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -36,8 +36,8 @@ "hnsw_config": { "m": 16, "ef_construct": 128 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -50,8 +50,8 @@ "hnsw_config": { "m": 32, "ef_construct": 128 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -64,8 +64,8 @@ "hnsw_config": { "m": 32, "ef_construct": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -78,8 +78,8 @@ "hnsw_config": { "m": 32, "ef_construct": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -92,8 +92,8 @@ "hnsw_config": { "m": 64, "ef_construct": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -106,8 +106,8 @@ "hnsw_config": { "m": 64, "ef_construct": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } } diff --git a/experiments/configurations/qdrant-single-node-sq-rps.json b/experiments/configurations/qdrant-single-node-sq-rps.json index 8bb83d62..a1d7d1f6 100644 --- a/experiments/configurations/qdrant-single-node-sq-rps.json +++ b/experiments/configurations/qdrant-single-node-sq-rps.json @@ -7,7 +7,7 @@ "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } } ], "upload_params": { "parallel": 1, "batch_size": 1024 } }, @@ -21,38 +21,38 @@ "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -66,38 +66,38 @@ "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -111,38 +111,38 @@ "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -156,38 +156,38 @@ "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -201,38 +201,38 @@ "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -246,38 +246,38 @@ "quantization_config": { "scalar": {"type": "int8", "quantile": 0.99, "always_ram": true} } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 128, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 1.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 2.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 4.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } } diff --git a/experiments/configurations/qdrant-single-node.json b/experiments/configurations/qdrant-single-node.json index f4e1ca47..f6804797 100644 --- a/experiments/configurations/qdrant-single-node.json +++ b/experiments/configurations/qdrant-single-node.json @@ -8,7 +8,7 @@ "optimizers_config": { "memmap_threshold": 25000000 } }, "search_params": [ - { "parallel": 8, "search_params": { "hnsw_ef": 128 } } + { "parallel": 8, "config": { "hnsw_ef": 128 } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -31,22 +31,173 @@ "optimizers_config": { "max_segment_size": 1000000, "default_segment_number": 3, - "memmap_threshold": 25000000 + "memmap_threshold": 25000000, + "max_optimization_threads": null } }, "search_params": [ { "parallel": 8, - "search_params": { + "config": { + "hnsw_ef": 256, + "quantization": { + "oversampling": 2.0, + "rescore": true + } + } + } + ], + "upload_params": { "parallel": 16, "batch_size": 1024 } + }, + { + "name": "qdrant-rescore-only", + "engine": "qdrant", + "connection_params": { "timeout": 30 }, + "search_params": [ + { + "parallel": 20, + "config": { + "hnsw_ef": 300, + "quantization": { + "rescore": true + } + } + } + ], + "upload_params": { "parallel": 16, "batch_size": 1024 } + }, + { + "name": "qdrant-continuous-benchmark-with-payload", + "engine": "qdrant", + "connection_params": { "timeout": 30 }, + "collection_params": { + "hnsw_config": { + "m": 32, + "ef_construct": 256 + }, + "quantization_config": { + "scalar": { + "type": "int8", + "quantile": 0.99 + } + }, + "optimizers_config": { + "max_segment_size": 1000000, + "default_segment_number": 3, + "memmap_threshold": 10000000, + "max_optimization_threads": null + } + }, + "search_params": [ + { + "parallel": 8, + "config": { "hnsw_ef": 256, "quantization": { "oversampling": 2.0 } + }, + "with_payload": true + } + ], + "upload_params": { "parallel": 16, "batch_size": 1024 } + }, + { + "name": "qdrant-bq-continuous-benchmark", + "engine": "qdrant", + "connection_params": { "timeout": 30 }, + "collection_params": { + "hnsw_config": { + "m": 32, + "ef_construct": 256 + }, + "quantization_config": { "binary": {"always_ram": true} }, + "optimizers_config": { + "max_segment_size": 1000000, + "default_segment_number": 3, + "memmap_threshold": 10000000, + "max_optimization_threads": null + } + }, + "search_params": [ + { + "parallel": 8, + "config": { + "hnsw_ef": 256, + "quantization": { "rescore": true, "oversampling": 2.0 } } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, + { + "name": "qdrant-bq-continuous-benchmark-with-payload", + "engine": "qdrant", + "connection_params": { "timeout": 30 }, + "collection_params": { + "hnsw_config": { + "m": 32, + "ef_construct": 256 + }, + "quantization_config": { "binary": {"always_ram": true} }, + "optimizers_config": { + "max_segment_size": 1000000, + "default_segment_number": 3, + "memmap_threshold": 10000000, + "max_optimization_threads": null + } + }, + "search_params": [ + { + "parallel": 8, + "config": { + "hnsw_ef": 256, + "quantization": { "rescore": true, "oversampling": 2.0 } + }, + "with_payload": true + } + ], + "upload_params": { "parallel": 16, "batch_size": 1024 } + }, + { + "name": "qdrant-sparse-vector", + "engine": "qdrant", + "connection_params": { "timeout": 30 }, + "collection_params": { + "optimizers_config": { + "max_segment_size": 1000000, + "default_segment_number": 3, + "memmap_threshold": 25000000 + } + }, + "search_params": [ + { + "parallel": 8, + "search_params": {} + } + ], + "upload_params": { "parallel": 16, "batch_size": 1024 } + }, + { + "name": "qdrant-sparse-vector-with-payload", + "engine": "qdrant", + "connection_params": { "timeout": 30 }, + "collection_params": { + "optimizers_config": { + "max_segment_size": 1000000, + "default_segment_number": 3, + "memmap_threshold": 10000000 + } + }, + "search_params": [ + { + "parallel": 8, + "search_params": {}, + "with_payload": true + } + ], + "upload_params": { "parallel": 16, "batch_size": 1024 } + }, { "name": "qdrant-parallel", "engine": "qdrant", @@ -56,9 +207,9 @@ "optimizers_config": { "memmap_threshold": 10000000 } }, "search_params": [ - { "parallel": 8, "search_params": { "hnsw_ef": 128 } }, - { "parallel": 16, "search_params": { "hnsw_ef": 128 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128 } } + { "parallel": 8, "config": { "hnsw_ef": 128 } }, + { "parallel": 16, "config": { "hnsw_ef": 128 } }, + { "parallel": 100, "config": { "hnsw_ef": 128 } } ], "upload_params": { "parallel": 16, "batch_size": 1024 } }, @@ -72,8 +223,8 @@ "hnsw_config": { "m": 16, "ef_construct": 128 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -117,8 +268,8 @@ "hnsw_config": { "m": 32, "ef_construct": 128 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -132,8 +283,8 @@ "hnsw_config": { "m": 32, "ef_construct": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -147,8 +298,8 @@ "hnsw_config": { "m": 32, "ef_construct": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -177,8 +328,8 @@ "hnsw_config": { "m": 64, "ef_construct": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } }, @@ -192,8 +343,8 @@ "hnsw_config": { "m": 64, "ef_construct": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, { "parallel": 100, "search_params": { "hnsw_ef": 512 } } + { "parallel": 1, "config": { "hnsw_ef": 64 } }, { "parallel": 1, "config": { "hnsw_ef": 128 } }, { "parallel": 1, "config": { "hnsw_ef": 256 } }, { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, { "parallel": 100, "config": { "hnsw_ef": 128 } }, { "parallel": 100, "config": { "hnsw_ef": 256 } }, { "parallel": 100, "config": { "hnsw_ef": 512 } } ], "upload_params": { "parallel": 16 } } diff --git a/experiments/configurations/qdrant-vs-weaviate-m32.json b/experiments/configurations/qdrant-vs-weaviate-m32.json new file mode 100644 index 00000000..a3680ece --- /dev/null +++ b/experiments/configurations/qdrant-vs-weaviate-m32.json @@ -0,0 +1,132 @@ +[ + { + "name": "latest-qdrant-bq-latency-m-32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "quantization_config": { "binary": { "always_ram": true } }, + "optimizers_config": { }, + "hnsw_config": { "m": 64, "ef_construct": 512 } + }, + "search_params": [ + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 32.0 } } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-qdrant-bq-rps-m-32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "quantization_config": { "binary": { "always_ram": true } }, + "optimizers_config": { + "max_segment_size": 100000000, + "default_segment_number": 2 + }, + "hnsw_config": { "m": 64, "ef_construct": 512 } + }, + "search_params": [ + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 128.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 128.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 128.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 128.0 } } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-qdrant-rps-m-32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "optimizers_config": { }, + "hnsw_config": { "m": 64, "ef_construct": 512 } + }, + "search_params": [ + { "parallel": 1, "config": { "hnsw_ef": 16 } }, + { "parallel": 1, "config": { "hnsw_ef": 32 } }, + { "parallel": 1, "config": { "hnsw_ef": 64 } }, + { "parallel": 1, "config": { "hnsw_ef": 128 } }, + { "parallel": 1, "config": { "hnsw_ef": 256 } }, + { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 1, "config": { "hnsw_ef": 768 } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-qdrant-rps-m32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "optimizers_config": { + "max_segment_size": 100000000, + "default_segment_number":2 + }, + "hnsw_config": { "m": 64, "ef_construct": 512 } + }, + "search_params": [ + { "parallel": 100, "config": { "hnsw_ef": 16 } }, + { "parallel": 100, "config": { "hnsw_ef": 32 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, + { "parallel": 100, "config": { "hnsw_ef": 128 } }, + { "parallel": 100, "config": { "hnsw_ef": 256 } }, + { "parallel": 100, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 768 } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-weaviate-m32", + "engine": "weaviate", + "connection_params": { + "timeout_config": 60 + }, + "collection_params": { + "vectorIndexConfig": { + "efConstruction": 512, + "maxConnections": 64 + } + }, + "search_params": [ + + { "parallel": 100, "config": { "ef": 16} }, + { "parallel": 100, "config": { "ef": 32} }, + { "parallel": 100, "config": { "ef": 64} }, + { "parallel": 100, "config": { "ef": 128} }, + { "parallel": 100, "config": { "ef": 256} }, + { "parallel": 100, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 768} }, + { "parallel": 1, "config": { "ef": 16} }, + { "parallel": 1, "config": { "ef": 32} }, + { "parallel": 1, "config": { "ef": 64} }, + { "parallel": 1, "config": { "ef": 128} }, + { "parallel": 1, "config": { "ef": 256} }, + { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 1, "config": { "ef": 768} } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + } +] \ No newline at end of file diff --git a/experiments/configurations/qdrant-vs-weaviate-m64.json b/experiments/configurations/qdrant-vs-weaviate-m64.json new file mode 100644 index 00000000..c4be46aa --- /dev/null +++ b/experiments/configurations/qdrant-vs-weaviate-m64.json @@ -0,0 +1,132 @@ +[ + { + "name": "latest-qdrant-bq-latency-m-32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "quantization_config": { "binary": { "always_ram": true } }, + "optimizers_config": { }, + "hnsw_config": { "m": 32, "ef_construct": 256 } + }, + "search_params": [ + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 1, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 32.0 } } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-qdrant-bq-rps-m-32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "quantization_config": { "binary": { "always_ram": true } }, + "optimizers_config": { + "max_segment_size": 100000000, + "default_segment_number": 2 + }, + "hnsw_config": { "m": 32, "ef_construct": 256 } + }, + "search_params": [ + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 128.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 128.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 128.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 8.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 16.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 32.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 64.0 } } }, + { "parallel": 100, "config": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 128.0 } } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-qdrant-rps-m-32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "optimizers_config": { }, + "hnsw_config": { "m": 32, "ef_construct": 256 } + }, + "search_params": [ + { "parallel": 1, "config": { "hnsw_ef": 16 } }, + { "parallel": 1, "config": { "hnsw_ef": 32 } }, + { "parallel": 1, "config": { "hnsw_ef": 64 } }, + { "parallel": 1, "config": { "hnsw_ef": 128 } }, + { "parallel": 1, "config": { "hnsw_ef": 256 } }, + { "parallel": 1, "config": { "hnsw_ef": 512 } }, + { "parallel": 1, "config": { "hnsw_ef": 768 } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-qdrant-rps-m32", + "engine": "qdrant", + "connection_params": { "timeout": 60 }, + "collection_params": { + "optimizers_config": { + "max_segment_size": 100000000, + "default_segment_number":2 + }, + "hnsw_config": { "m": 32, "ef_construct": 256 } + }, + "search_params": [ + { "parallel": 100, "config": { "hnsw_ef": 16 } }, + { "parallel": 100, "config": { "hnsw_ef": 32 } }, + { "parallel": 100, "config": { "hnsw_ef": 64 } }, + { "parallel": 100, "config": { "hnsw_ef": 128 } }, + { "parallel": 100, "config": { "hnsw_ef": 256 } }, + { "parallel": 100, "config": { "hnsw_ef": 512 } }, + { "parallel": 100, "config": { "hnsw_ef": 768 } } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + }, + { + "name": "latest-weaviate-m32", + "engine": "weaviate", + "connection_params": { + "timeout_config": 60 + }, + "collection_params": { + "vectorIndexConfig": { + "efConstruction": 256, + "maxConnections": 32 + } + }, + "search_params": [ + + { "parallel": 100, "config": { "ef": 16} }, + { "parallel": 100, "config": { "ef": 32} }, + { "parallel": 100, "config": { "ef": 64} }, + { "parallel": 100, "config": { "ef": 128} }, + { "parallel": 100, "config": { "ef": 256} }, + { "parallel": 100, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 768} }, + { "parallel": 1, "config": { "ef": 16} }, + { "parallel": 1, "config": { "ef": 32} }, + { "parallel": 1, "config": { "ef": 64} }, + { "parallel": 1, "config": { "ef": 128} }, + { "parallel": 1, "config": { "ef": 256} }, + { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 1, "config": { "ef": 768} } + ], + "upload_params": { "parallel": 8, "batch_size": 1024 } + } +] \ No newline at end of file diff --git a/experiments/configurations/qdrant-vs-weaviate.json b/experiments/configurations/qdrant-vs-weaviate.json deleted file mode 100644 index 32bbac6b..00000000 --- a/experiments/configurations/qdrant-vs-weaviate.json +++ /dev/null @@ -1,132 +0,0 @@ -[ - { - "name": "proposed-config-qdrant-bq-latency", - "engine": "qdrant", - "connection_params": { "timeout": 60 }, - "collection_params": { - "quantization_config": { "binary": { "always_ram": true } }, - "optimizers_config": { }, - "hnsw_config": { "m": 32, "ef_construct": 256 } - }, - "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 16.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 32.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 16.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 32.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 16.0 } } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 32.0 } } } - ], - "upload_params": { "parallel": 8, "batch_size": 1024 } - }, - { - "name": "proposed-config-qdrant-bq-rps", - "engine": "qdrant", - "connection_params": { "timeout": 60 }, - "collection_params": { - "quantization_config": { "binary": { "always_ram": true } }, - "optimizers_config": { - "max_segment_size": 100000000, - "default_segment_number":2 - }, - "hnsw_config": { "m": 32, "ef_construct": 256 } - }, - "search_params": [ - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 16.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 32.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 64.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64, "quantization": { "rescore": true, "oversampling": 128.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 16.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 32.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 64.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256, "quantization": { "rescore": true, "oversampling": 128.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 16.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 32.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 64.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512, "quantization": { "rescore": true, "oversampling": 128.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 8.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 16.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 32.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 64.0 } } }, - { "parallel": 100, "search_params": { "hnsw_ef": 768, "quantization": { "rescore": true, "oversampling": 128.0 } } } - ], - "upload_params": { "parallel": 8, "batch_size": 1024 } - }, - { - "name": "proposed-config-qdrant-latency", - "engine": "qdrant", - "connection_params": { "timeout": 60 }, - "collection_params": { - "optimizers_config": { }, - "hnsw_config": { "m": 32, "ef_construct": 256 } - }, - "search_params": [ - { "parallel": 1, "search_params": { "hnsw_ef": 16 } }, - { "parallel": 1, "search_params": { "hnsw_ef": 32 } }, - { "parallel": 1, "search_params": { "hnsw_ef": 64 } }, - { "parallel": 1, "search_params": { "hnsw_ef": 128 } }, - { "parallel": 1, "search_params": { "hnsw_ef": 256 } }, - { "parallel": 1, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 1, "search_params": { "hnsw_ef": 768 } } - ], - "upload_params": { "parallel": 8, "batch_size": 1024 } - }, - { - "name": "proposed-config-qdrant-rps", - "engine": "qdrant", - "connection_params": { "timeout": 60 }, - "collection_params": { - "optimizers_config": { - "max_segment_size": 100000000, - "default_segment_number":2 - }, - "hnsw_config": { "m": 32, "ef_construct": 256 } - }, - "search_params": [ - { "parallel": 100, "search_params": { "hnsw_ef": 16 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 32 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 64 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 128 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 256 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 512 } }, - { "parallel": 100, "search_params": { "hnsw_ef": 768 } } - ], - "upload_params": { "parallel": 8, "batch_size": 1024 } - }, - { - "name": "proposed-config-weaviate", - "engine": "weaviate", - "connection_params": { - "timeout_config": 60 - }, - "collection_params": { - "vectorIndexConfig": { - "efConstruction": 256, - "maxConnections": 32 - } - }, - "search_params": [ - - { "parallel": 100, "vectorIndexConfig": { "ef": 16} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 32} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 64} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 128} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 256} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 768} }, - { "parallel": 1, "vectorIndexConfig": { "ef": 16} }, - { "parallel": 1, "vectorIndexConfig": { "ef": 32} }, - { "parallel": 1, "vectorIndexConfig": { "ef": 64} }, - { "parallel": 1, "vectorIndexConfig": { "ef": 128} }, - { "parallel": 1, "vectorIndexConfig": { "ef": 256} }, - { "parallel": 1, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 1, "vectorIndexConfig": { "ef": 768} } - ], - "upload_params": { "parallel": 8, "batch_size": 1024 } - } -] \ No newline at end of file diff --git a/experiments/configurations/redis-single-node.json b/experiments/configurations/redis-single-node.json index 30632555..3ad0238f 100644 --- a/experiments/configurations/redis-single-node.json +++ b/experiments/configurations/redis-single-node.json @@ -7,8 +7,8 @@ "hnsw_config": { "M": 16, "EF_CONSTRUCTION": 64 } }, "search_params": [ - { "parallel": 1, "search_params": { "ef": 64 } }, { "parallel": 1, "search_params": { "ef": 128 } }, { "parallel": 1, "search_params": { "ef": 256 } }, { "parallel": 1, "search_params": { "ef": 512 } }, - { "parallel": 100, "search_params": { "ef": 64 } }, { "parallel": 100, "search_params": { "ef": 128 } }, { "parallel": 100, "search_params": { "ef": 256 } }, { "parallel": 100, "search_params": { "ef": 512 } } + { "parallel": 1, "config": { "EF": 64 } }, { "parallel": 1, "config": { "EF": 128 } }, { "parallel": 1, "config": { "EF": 256 } }, { "parallel": 1, "config": { "EF": 512 } }, + { "parallel": 100, "config": { "EF": 64 } }, { "parallel": 100, "config": { "EF": 128 } }, { "parallel": 100, "config": { "EF": 256 } }, { "parallel": 100, "config": { "EF": 512 } } ], "upload_params": { "parallel": 32 } }, @@ -64,6 +64,19 @@ ], "upload_params": { "parallel": 32 } }, + { + "name": "redis-m-16-ef-128", + "engine": "redis", + "connection_params": {}, + "collection_params": { + "hnsw_config": { "M": 16, "EF_CONSTRUCTION": 128 } + }, + "search_params": [ + { "parallel": 1, "config": { "EF": 64 } }, { "parallel": 1, "config": { "EF": 128 } }, { "parallel": 1, "config": { "EF": 256 } }, { "parallel": 1, "config": { "EF": 512 } }, + { "parallel": 100, "config": { "EF": 64 } }, { "parallel": 100, "config": { "EF": 128 } }, { "parallel": 100, "config": { "EF": 256 } }, { "parallel": 100, "config": { "EF": 512 } } + ], + "upload_params": { "parallel": 16 } + }, { "name": "redis-m-32-ef-128", "engine": "redis", @@ -72,8 +85,8 @@ "hnsw_config": { "M": 32, "EF_CONSTRUCTION": 128 } }, "search_params": [ - { "parallel": 1, "search_params": { "ef": 64 } }, { "parallel": 1, "search_params": { "ef": 128 } }, { "parallel": 1, "search_params": { "ef": 256 } }, { "parallel": 1, "search_params": { "ef": 512 } }, - { "parallel": 100, "search_params": { "ef": 64 } }, { "parallel": 100, "search_params": { "ef": 128 } }, { "parallel": 100, "search_params": { "ef": 256 } }, { "parallel": 100, "search_params": { "ef": 512 } } + { "parallel": 1, "config": { "EF": 64 } }, { "parallel": 1, "config": { "EF": 128 } }, { "parallel": 1, "config": { "EF": 256 } }, { "parallel": 1, "config": { "EF": 512 } }, + { "parallel": 100, "config": { "EF": 64 } }, { "parallel": 100, "config": { "EF": 128 } }, { "parallel": 100, "config": { "EF": 256 } }, { "parallel": 100, "config": { "EF": 512 } } ], "upload_params": { "parallel": 32 } }, @@ -85,8 +98,8 @@ "hnsw_config": { "M": 32, "EF_CONSTRUCTION": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "ef": 64 } }, { "parallel": 1, "search_params": { "ef": 128 } }, { "parallel": 1, "search_params": { "ef": 256 } }, { "parallel": 1, "search_params": { "ef": 512 } }, - { "parallel": 100, "search_params": { "ef": 64 } }, { "parallel": 100, "search_params": { "ef": 128 } }, { "parallel": 100, "search_params": { "ef": 256 } }, { "parallel": 100, "search_params": { "ef": 512 } } + { "parallel": 1, "config": { "EF": 64 } }, { "parallel": 1, "config": { "EF": 128 } }, { "parallel": 1, "config": { "EF": 256 } }, { "parallel": 1, "config": { "EF": 512 } }, + { "parallel": 100, "config": { "EF": 64 } }, { "parallel": 100, "config": { "EF": 128 } }, { "parallel": 100, "config": { "EF": 256 } }, { "parallel": 100, "config": { "EF": 512 } } ], "upload_params": { "parallel": 32 } }, @@ -98,8 +111,8 @@ "hnsw_config": { "M": 32, "EF_CONSTRUCTION": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "ef": 64 } }, { "parallel": 1, "search_params": { "ef": 128 } }, { "parallel": 1, "search_params": { "ef": 256 } }, { "parallel": 1, "search_params": { "ef": 512 } }, - { "parallel": 100, "search_params": { "ef": 64 } }, { "parallel": 100, "search_params": { "ef": 128 } }, { "parallel": 100, "search_params": { "ef": 256 } }, { "parallel": 100, "search_params": { "ef": 512 } } + { "parallel": 1, "config": { "EF": 64 } }, { "parallel": 1, "config": { "EF": 128 } }, { "parallel": 1, "config": { "EF": 256 } }, { "parallel": 1, "config": { "EF": 512 } }, + { "parallel": 100, "config": { "EF": 64 } }, { "parallel": 100, "config": { "EF": 128 } }, { "parallel": 100, "config": { "EF": 256 } }, { "parallel": 100, "config": { "EF": 512 } } ], "upload_params": { "parallel": 32 } }, @@ -137,8 +150,8 @@ "hnsw_config": { "M": 64, "EF_CONSTRUCTION": 256 } }, "search_params": [ - { "parallel": 1, "search_params": { "ef": 64 } }, { "parallel": 1, "search_params": { "ef": 128 } }, { "parallel": 1, "search_params": { "ef": 256 } }, { "parallel": 1, "search_params": { "ef": 512 } }, - { "parallel": 100, "search_params": { "ef": 64 } }, { "parallel": 100, "search_params": { "ef": 128 } }, { "parallel": 100, "search_params": { "ef": 256 } }, { "parallel": 100, "search_params": { "ef": 512 } } + { "parallel": 1, "config": { "EF": 64 } }, { "parallel": 1, "config": { "EF": 128 } }, { "parallel": 1, "config": { "EF": 256 } }, { "parallel": 1, "config": { "EF": 512 } }, + { "parallel": 100, "config": { "EF": 64 } }, { "parallel": 100, "config": { "EF": 128 } }, { "parallel": 100, "config": { "EF": 256 } }, { "parallel": 100, "config": { "EF": 512 } } ], "upload_params": { "parallel": 32 } }, @@ -150,8 +163,8 @@ "hnsw_config": { "M": 64, "EF_CONSTRUCTION": 512 } }, "search_params": [ - { "parallel": 1, "search_params": { "ef": 64 } }, { "parallel": 1, "search_params": { "ef": 128 } }, { "parallel": 1, "search_params": { "ef": 256 } }, { "parallel": 1, "search_params": { "ef": 512 } }, - { "parallel": 100, "search_params": { "ef": 64 } }, { "parallel": 100, "search_params": { "ef": 128 } }, { "parallel": 100, "search_params": { "ef": 256 } }, { "parallel": 100, "search_params": { "ef": 512 } } + { "parallel": 1, "config": { "EF": 64 } }, { "parallel": 1, "config": { "EF": 128 } }, { "parallel": 1, "config": { "EF": 256 } }, { "parallel": 1, "config": { "EF": 512 } }, + { "parallel": 100, "config": { "EF": 64 } }, { "parallel": 100, "config": { "EF": 128 } }, { "parallel": 100, "config": { "EF": 256 } }, { "parallel": 100, "config": { "EF": 512 } } ], "upload_params": { "parallel": 32 } } diff --git a/experiments/configurations/weaviate-single-node.json b/experiments/configurations/weaviate-single-node.json index 5fb53d87..2ddf1e0b 100644 --- a/experiments/configurations/weaviate-single-node.json +++ b/experiments/configurations/weaviate-single-node.json @@ -7,7 +7,7 @@ }, "collection_params": { "vectorIndexConfig": { "efConstruction": 256, "maxConnections": 16 } }, "search_params": [ - { "parallel": 8, "vectorIndexConfig": { "ef": 128 } } + { "parallel": 8, "config": { "ef": 128 } } ], "upload_params": { "batch_size": 1024, "parallel": 8 } }, @@ -19,8 +19,8 @@ }, "collection_params": { "vectorIndexConfig": { "efConstruction": 128, "maxConnections": 16 } }, "search_params": [ - { "parallel": 1, "vectorIndexConfig": { "ef": 64} }, { "parallel": 1, "vectorIndexConfig": { "ef": 128} }, { "parallel": 1, "vectorIndexConfig": { "ef": 256} }, { "parallel": 1, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 64} }, { "parallel": 100, "vectorIndexConfig": { "ef": 128} }, { "parallel": 100, "vectorIndexConfig": { "ef": 256} }, { "parallel": 100, "vectorIndexConfig": { "ef": 512} } + { "parallel": 1, "config": { "ef": 64} }, { "parallel": 1, "config": { "ef": 128} }, { "parallel": 1, "config": { "ef": 256} }, { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 64} }, { "parallel": 100, "config": { "ef": 128} }, { "parallel": 100, "config": { "ef": 256} }, { "parallel": 100, "config": { "ef": 512} } ], "upload_params": { "batch_size": 1024, "parallel": 8 } }, @@ -32,8 +32,8 @@ }, "collection_params": { "vectorIndexConfig": { "efConstruction": 128, "maxConnections": 32 } }, "search_params": [ - { "parallel": 1, "vectorIndexConfig": { "ef": 64} }, { "parallel": 1, "vectorIndexConfig": { "ef": 128} }, { "parallel": 1, "vectorIndexConfig": { "ef": 256} }, { "parallel": 1, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 64} }, { "parallel": 100, "vectorIndexConfig": { "ef": 128} }, { "parallel": 100, "vectorIndexConfig": { "ef": 256} }, { "parallel": 100, "vectorIndexConfig": { "ef": 512} } + { "parallel": 1, "config": { "ef": 64} }, { "parallel": 1, "config": { "ef": 128} }, { "parallel": 1, "config": { "ef": 256} }, { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 64} }, { "parallel": 100, "config": { "ef": 128} }, { "parallel": 100, "config": { "ef": 256} }, { "parallel": 100, "config": { "ef": 512} } ], "upload_params": { "batch_size": 1024, "parallel": 8 } }, @@ -45,8 +45,8 @@ }, "collection_params": { "vectorIndexConfig": { "efConstruction": 256, "maxConnections": 32 } }, "search_params": [ - { "parallel": 1, "vectorIndexConfig": { "ef": 64} }, { "parallel": 1, "vectorIndexConfig": { "ef": 128} }, { "parallel": 1, "vectorIndexConfig": { "ef": 256} }, { "parallel": 1, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 64} }, { "parallel": 100, "vectorIndexConfig": { "ef": 128} }, { "parallel": 100, "vectorIndexConfig": { "ef": 256} }, { "parallel": 100, "vectorIndexConfig": { "ef": 512} } + { "parallel": 1, "config": { "ef": 64} }, { "parallel": 1, "config": { "ef": 128} }, { "parallel": 1, "config": { "ef": 256} }, { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 64} }, { "parallel": 100, "config": { "ef": 128} }, { "parallel": 100, "config": { "ef": 256} }, { "parallel": 100, "config": { "ef": 512} } ], "upload_params": { "batch_size": 1024, "parallel": 8 } }, @@ -58,8 +58,8 @@ }, "collection_params": { "vectorIndexConfig": { "efConstruction": 512, "maxConnections": 32 } }, "search_params": [ - { "parallel": 1, "vectorIndexConfig": { "ef": 64} }, { "parallel": 1, "vectorIndexConfig": { "ef": 128} }, { "parallel": 1, "vectorIndexConfig": { "ef": 256} }, { "parallel": 1, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 64} }, { "parallel": 100, "vectorIndexConfig": { "ef": 128} }, { "parallel": 100, "vectorIndexConfig": { "ef": 256} }, { "parallel": 100, "vectorIndexConfig": { "ef": 512} } + { "parallel": 1, "config": { "ef": 64} }, { "parallel": 1, "config": { "ef": 128} }, { "parallel": 1, "config": { "ef": 256} }, { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 64} }, { "parallel": 100, "config": { "ef": 128} }, { "parallel": 100, "config": { "ef": 256} }, { "parallel": 100, "config": { "ef": 512} } ], "upload_params": { "batch_size": 1024, "parallel": 8 } }, @@ -71,8 +71,8 @@ }, "collection_params": { "vectorIndexConfig": { "efConstruction": 256, "maxConnections": 64 } }, "search_params": [ - { "parallel": 1, "vectorIndexConfig": { "ef": 64} }, { "parallel": 1, "vectorIndexConfig": { "ef": 128} }, { "parallel": 1, "vectorIndexConfig": { "ef": 256} }, { "parallel": 1, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 64} }, { "parallel": 100, "vectorIndexConfig": { "ef": 128} }, { "parallel": 100, "vectorIndexConfig": { "ef": 256} }, { "parallel": 100, "vectorIndexConfig": { "ef": 512} } + { "parallel": 1, "config": { "ef": 64} }, { "parallel": 1, "config": { "ef": 128} }, { "parallel": 1, "config": { "ef": 256} }, { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 64} }, { "parallel": 100, "config": { "ef": 128} }, { "parallel": 100, "config": { "ef": 256} }, { "parallel": 100, "config": { "ef": 512} } ], "upload_params": { "batch_size": 1024, "parallel": 8 } }, @@ -84,8 +84,8 @@ }, "collection_params": { "vectorIndexConfig": { "efConstruction": 512, "maxConnections": 64 } }, "search_params": [ - { "parallel": 1, "vectorIndexConfig": { "ef": 64} }, { "parallel": 1, "vectorIndexConfig": { "ef": 128} }, { "parallel": 1, "vectorIndexConfig": { "ef": 256} }, { "parallel": 1, "vectorIndexConfig": { "ef": 512} }, - { "parallel": 100, "vectorIndexConfig": { "ef": 64} }, { "parallel": 100, "vectorIndexConfig": { "ef": 128} }, { "parallel": 100, "vectorIndexConfig": { "ef": 256} }, { "parallel": 100, "vectorIndexConfig": { "ef": 512} } + { "parallel": 1, "config": { "ef": 64} }, { "parallel": 1, "config": { "ef": 128} }, { "parallel": 1, "config": { "ef": 256} }, { "parallel": 1, "config": { "ef": 512} }, + { "parallel": 100, "config": { "ef": 64} }, { "parallel": 100, "config": { "ef": 128} }, { "parallel": 100, "config": { "ef": 256} }, { "parallel": 100, "config": { "ef": 512} } ], "upload_params": { "batch_size": 1024, "parallel": 8 } } diff --git a/poetry.lock b/poetry.lock index c35d4fd8..9c08860e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,198 +2,77 @@ [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] [[package]] name = "anyio" -version = "4.3.0" +version = "4.9.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, - {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, + {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, + {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "appnope" -version = "0.1.4" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = ">=3.6" -files = [ - {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, - {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, -] - -[[package]] -name = "argon2-cffi" -version = "23.1.0" -description = "Argon2 for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, - {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, -] - -[package.dependencies] -argon2-cffi-bindings = "*" - -[package.extras] -dev = ["argon2-cffi[tests,typing]", "tox (>4)"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] -tests = ["hypothesis", "pytest"] -typing = ["mypy"] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -description = "Low-level CFFI bindings for Argon2" -optional = false -python-versions = ">=3.6" -files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, -] - -[package.dependencies] -cffi = ">=1.0.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] +doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "asttokens" -version = "2.4.1" +version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, ] -[package.dependencies] -six = ">=1.12.0" - [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "async-timeout" -version = "4.0.3" +version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] [[package]] name = "authlib" -version = "1.3.0" +version = "1.5.2" description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "Authlib-1.3.0-py2.py3-none-any.whl", hash = "sha256:9637e4de1fb498310a56900b3e2043a206b03cb11c05422014b0302cbc814be3"}, - {file = "Authlib-1.3.0.tar.gz", hash = "sha256:959ea62a5b7b5123c5059758296122b57cd2585ae2ed1c0622c21b371ffdae06"}, + {file = "authlib-1.5.2-py2.py3-none-any.whl", hash = "sha256:8804dd4402ac5e4a0435ac49e0b6e19e395357cfa632a3f624dcb4f6df13b4b1"}, + {file = "authlib-1.5.2.tar.gz", hash = "sha256:fe85ec7e50c5f86f1e2603518bb3b4f632985eb4a355e52256530790e326c512"}, ] [package.dependencies] cryptography = "*" -[[package]] -name = "azure-core" -version = "1.30.1" -description = "Microsoft Azure Core Library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "azure-core-1.30.1.tar.gz", hash = "sha256:26273a254131f84269e8ea4464f3560c731f29c0c1f69ac99010845f239c1a8f"}, - {file = "azure_core-1.30.1-py3-none-any.whl", hash = "sha256:7c5ee397e48f281ec4dd773d67a0a47a0962ed6fa833036057f9ea067f688e74"}, -] - -[package.dependencies] -requests = ">=2.21.0" -six = ">=1.11.0" -typing-extensions = ">=4.6.0" - -[package.extras] -aio = ["aiohttp (>=3.0)"] - -[[package]] -name = "azure-storage-blob" -version = "12.19.1" -description = "Microsoft Azure Blob Storage Client Library for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "azure-storage-blob-12.19.1.tar.gz", hash = "sha256:13e16ba42fc54ac2c7e8f976062173a5c82b9ec0594728e134aac372965a11b0"}, - {file = "azure_storage_blob-12.19.1-py3-none-any.whl", hash = "sha256:c5530dc51c21c9564e4eb706cd499befca8819b10dd89716d3fc90d747556243"}, -] - -[package.dependencies] -azure-core = ">=1.28.0,<2.0.0" -cryptography = ">=2.1.4" -isodate = ">=0.6.1" -typing-extensions = ">=4.3.0" - -[package.extras] -aio = ["azure-core[aio] (>=1.28.0,<2.0.0)"] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] - [[package]] name = "backoff" version = "2.2.1" @@ -205,76 +84,147 @@ files = [ {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] +[[package]] +name = "backports-datetime-fromisoformat" +version = "2.0.3" +description = "Backport of Python 3.11's datetime.fromisoformat" +optional = false +python-versions = ">3" +files = [ + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f681f638f10588fa3c101ee9ae2b63d3734713202ddfcfb6ec6cea0778a29d4"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:cd681460e9142f1249408e5aee6d178c6d89b49e06d44913c8fdfb6defda8d1c"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ee68bc8735ae5058695b76d3bb2aee1d137c052a11c8303f1e966aa23b72b65b"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8273fe7932db65d952a43e238318966eab9e49e8dd546550a41df12175cc2be4"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39d57ea50aa5a524bb239688adc1d1d824c31b6094ebd39aa164d6cadb85de22"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ac6272f87693e78209dc72e84cf9ab58052027733cd0721c55356d3c881791cf"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:44c497a71f80cd2bcfc26faae8857cf8e79388e3d5fbf79d2354b8c360547d58"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:6335a4c9e8af329cb1ded5ab41a666e1448116161905a94e054f205aa6d263bc"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2e4b66e017253cdbe5a1de49e0eecff3f66cd72bcb1229d7db6e6b1832c0443"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:43e2d648e150777e13bbc2549cc960373e37bf65bd8a5d2e0cef40e16e5d8dd0"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:4ce6326fd86d5bae37813c7bf1543bae9e4c215ec6f5afe4c518be2635e2e005"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7c8fac333bf860208fd522a5394369ee3c790d0aa4311f515fcc4b6c5ef8d75"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4da5ab3aa0cc293dc0662a0c6d1da1a011dc1edcbc3122a288cfed13a0b45"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58ea11e3bf912bd0a36b0519eae2c5b560b3cb972ea756e66b73fb9be460af01"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8a375c7dbee4734318714a799b6c697223e4bbb57232af37fbfff88fb48a14c6"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:ac677b1664c4585c2e014739f6678137c8336815406052349c85898206ec7061"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66ce47ee1ba91e146149cf40565c3d750ea1be94faf660ca733d8601e0848147"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:8b7e069910a66b3bba61df35b5f879e5253ff0821a70375b9daf06444d046fa4"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:a3b5d1d04a9e0f7b15aa1e647c750631a873b298cdd1255687bb68779fe8eb35"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1b95986430e789c076610aea704db20874f0781b8624f648ca9fb6ef67c6e1"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffe5f793db59e2f1d45ec35a1cf51404fdd69df9f6952a0c87c3060af4c00e32"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:620e8e73bd2595dfff1b4d256a12b67fce90ece3de87b38e1dde46b910f46f4d"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4cf9c0a985d68476c1cabd6385c691201dda2337d7453fb4da9679ce9f23f4e7"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:d144868a73002e6e2e6fef72333e7b0129cecdd121aa8f1edba7107fd067255d"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e81b26497a17c29595bc7df20bc6a872ceea5f8c9d6537283945d4b6396aec10"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:5ba00ead8d9d82fd6123eb4891c566d30a293454e54e32ff7ead7644f5f7e575"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:24d574cb4072e1640b00864e94c4c89858033936ece3fc0e1c6f7179f120d0a8"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9735695a66aad654500b0193525e590c693ab3368478ce07b34b443a1ea5e824"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63d39709e17eb72685d052ac82acf0763e047f57c86af1b791505b1fec96915d"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:1ea2cc84224937d6b9b4c07f5cb7c667f2bde28c255645ba27f8a675a7af8234"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4024e6d35a9fdc1b3fd6ac7a673bd16cb176c7e0b952af6428b7129a70f72cce"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5e2dcc94dc9c9ab8704409d86fcb5236316e9dcef6feed8162287634e3568f4c"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fa2de871801d824c255fac7e5e7e50f2be6c9c376fd9268b40c54b5e9da91f42"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:1314d4923c1509aa9696712a7bc0c7160d3b7acf72adafbbe6c558d523f5d491"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b750ecba3a8815ad8bc48311552f3f8ab99dd2326d29df7ff670d9c49321f48f"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d5117dce805d8a2f78baeddc8c6127281fa0a5e2c40c6dd992ba6b2b367876"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb35f607bd1cbe37b896379d5f5ed4dc298b536f4b959cb63180e05cacc0539d"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:61c74710900602637d2d145dda9720c94e303380803bf68811b2a151deec75c2"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ece59af54ebf67ecbfbbf3ca9066f5687879e36527ad69d8b6e3ac565d565a62"}, + {file = "backports_datetime_fromisoformat-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:d0a7c5f875068efe106f62233bc712d50db4d07c13c7db570175c7857a7b5dbd"}, + {file = "backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90e202e72a3d5aae673fcc8c9a4267d56b2f532beeb9173361293625fe4d2039"}, + {file = "backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2df98ef1b76f5a58bb493dda552259ba60c3a37557d848e039524203951c9f06"}, + {file = "backports_datetime_fromisoformat-2.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7100adcda5e818b5a894ad0626e38118bb896a347f40ebed8981155675b9ba7b"}, + {file = "backports_datetime_fromisoformat-2.0.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e410383f5d6a449a529d074e88af8bc80020bb42b402265f9c02c8358c11da5"}, + {file = "backports_datetime_fromisoformat-2.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2797593760da6bcc32c4a13fa825af183cd4bfd333c60b3dbf84711afca26ef"}, + {file = "backports_datetime_fromisoformat-2.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35a144fd681a0bea1013ccc4cd3fd4dc758ea17ee23dca019c02b82ec46fc0c4"}, + {file = "backports_datetime_fromisoformat-2.0.3.tar.gz", hash = "sha256:b58edc8f517b66b397abc250ecc737969486703a66eb97e01e6d51291b1a139d"}, +] + [[package]] name = "certifi" -version = "2024.2.2" +version = "2025.4.26" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, + {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -293,112 +243,114 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +python-versions = ">=3.7" +files = [ + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -417,43 +369,38 @@ files = [ [[package]] name = "cryptography" -version = "42.0.5" +version = "43.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, ] [package.dependencies] @@ -466,40 +413,40 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "decorator" -version = "5.1.1" +version = "5.2.1" description = "Decorators for Humans" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, + {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, + {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, ] [[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]] name = "elastic-transport" -version = "8.12.0" +version = "8.17.1" description = "Transport classes and utilities shared among Python Elastic client libraries" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "elastic-transport-8.12.0.tar.gz", hash = "sha256:48839b942fcce199eece1558ecea6272e116c58da87ca8d495ef12eb61effaf7"}, - {file = "elastic_transport-8.12.0-py3-none-any.whl", hash = "sha256:87d9dc9dee64a05235e7624ed7e6ab6e5ca16619aa7a6d22e853273b9f1cfbee"}, + {file = "elastic_transport-8.17.1-py3-none-any.whl", hash = "sha256:192718f498f1d10c5e9aa8b9cf32aed405e469a7f0e9d6a8923431dbb2c59fb8"}, + {file = "elastic_transport-8.17.1.tar.gz", hash = "sha256:5edef32ac864dca8e2f0a613ef63491ee8d6b8cfb52881fa7313ba9290cac6d2"}, ] [package.dependencies] @@ -507,25 +454,32 @@ certifi = "*" urllib3 = ">=1.26.2,<3" [package.extras] -develop = ["aiohttp", "furo", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "sphinx (>2)", "sphinx-autodoc-typehints", "trustme"] +develop = ["aiohttp", "furo", "httpx", "opentelemetry-api", "opentelemetry-sdk", "orjson", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "respx", "sphinx (>2)", "sphinx-autodoc-typehints", "trustme"] [[package]] name = "elasticsearch" -version = "8.12.1" +version = "8.18.1" description = "Python client for Elasticsearch" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "elasticsearch-8.12.1-py3-none-any.whl", hash = "sha256:cc459b7e0fb88dc85b43b9d7d254cffad552b0063a3e0a12290c8fa5f138c038"}, - {file = "elasticsearch-8.12.1.tar.gz", hash = "sha256:00c997720fbd0f2afe5417c8193cf65d116817a0250de0521e30c3e81f00b8ac"}, + {file = "elasticsearch-8.18.1-py3-none-any.whl", hash = "sha256:1a8c8b5ec3ce5be88f96d2f898375671648e96272978bce0dee3137d9326aabb"}, + {file = "elasticsearch-8.18.1.tar.gz", hash = "sha256:998035f17a8c1fba7ae26b183dca797dcf95db86da6a7ecba56d31afc40f07c7"}, ] [package.dependencies] -elastic-transport = ">=8,<9" +elastic-transport = ">=8.15.1,<9" +python-dateutil = "*" +typing-extensions = "*" [package.extras] async = ["aiohttp (>=3,<4)"] -requests = ["requests (>=2.4.0,<3.0.0)"] +dev = ["aiohttp", "black", "build", "coverage", "isort", "jinja2", "mapbox-vector-tile", "mypy", "nltk", "nox", "numpy", "orjson", "pandas", "pyarrow", "pyright", "pytest", "pytest-asyncio", "pytest-cov", "pytest-mock", "python-dateutil", "pyyaml (>=5.4)", "requests (>=2,<3)", "sentence-transformers", "simsimd", "tqdm", "twine", "types-python-dateutil", "types-tqdm", "unasync"] +docs = ["sphinx", "sphinx-autodoc-typehints", "sphinx-rtd-theme (>=2.0)"] +orjson = ["orjson (>=3)"] +pyarrow = ["pyarrow (>=1)"] +requests = ["requests (>=2.4.0,!=2.32.2,<3.0.0)"] +vectorstore-mmr = ["numpy (>=1)", "simsimd (>=3)"] [[package]] name = "environs" @@ -548,15 +502,25 @@ django = ["dj-database-url", "dj-email-url", "django-cache-url"] lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] tests = ["dj-database-url", "dj-email-url", "django-cache-url", "pytest"] +[[package]] +name = "events" +version = "0.5" +description = "Bringing the elegance of C# EventHandler to Python" +optional = false +python-versions = "*" +files = [ + {file = "Events-0.5-py3-none-any.whl", hash = "sha256:a7286af378ba3e46640ac9825156c93bdba7502174dd696090fdfcd4d80a1abd"}, +] + [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -564,13 +528,13 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.0.1" +version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, + {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] @@ -578,263 +542,258 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "filelock" -version = "3.13.1" +version = "3.18.0" description = "A platform independent file lock." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, + {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)", "pytest (>=8.3.4)", "pytest-asyncio (>=0.25.2)", "pytest-cov (>=6)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.28.1)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "grpcio" -version = "1.60.0" +version = "1.71.0" description = "HTTP/2-based RPC framework" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "grpcio-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d020cfa595d1f8f5c6b343530cd3ca16ae5aefdd1e832b777f9f0eb105f5b139"}, - {file = "grpcio-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b98f43fcdb16172dec5f4b49f2fece4b16a99fd284d81c6bbac1b3b69fcbe0ff"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:20e7a4f7ded59097c84059d28230907cd97130fa74f4a8bfd1d8e5ba18c81491"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452ca5b4afed30e7274445dd9b441a35ece656ec1600b77fff8c216fdf07df43"}, - {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e636dc2ce9ece583b3e2ca41df5c983f4302eabc6d5f9cd04f0562ee8ec1ae"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e306b97966369b889985a562ede9d99180def39ad42c8014628dd3cc343f508"}, - {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f897c3b127532e6befdcf961c415c97f320d45614daf84deba0a54e64ea2457b"}, - {file = "grpcio-1.60.0-cp310-cp310-win32.whl", hash = "sha256:b87efe4a380887425bb15f220079aa8336276398dc33fce38c64d278164f963d"}, - {file = "grpcio-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:a9c7b71211f066908e518a2ef7a5e211670761651039f0d6a80d8d40054047df"}, - {file = "grpcio-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:fb464479934778d7cc5baf463d959d361954d6533ad34c3a4f1d267e86ee25fd"}, - {file = "grpcio-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4b44d7e39964e808b071714666a812049765b26b3ea48c4434a3b317bac82f14"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:90bdd76b3f04bdb21de5398b8a7c629676c81dfac290f5f19883857e9371d28c"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91229d7203f1ef0ab420c9b53fe2ca5c1fbeb34f69b3bc1b5089466237a4a134"}, - {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b36a2c6d4920ba88fa98075fdd58ff94ebeb8acc1215ae07d01a418af4c0253"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:297eef542156d6b15174a1231c2493ea9ea54af8d016b8ca7d5d9cc65cfcc444"}, - {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87c9224acba0ad8bacddf427a1c2772e17ce50b3042a789547af27099c5f751d"}, - {file = "grpcio-1.60.0-cp311-cp311-win32.whl", hash = "sha256:95ae3e8e2c1b9bf671817f86f155c5da7d49a2289c5cf27a319458c3e025c320"}, - {file = "grpcio-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:467a7d31554892eed2aa6c2d47ded1079fc40ea0b9601d9f79204afa8902274b"}, - {file = "grpcio-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:a7152fa6e597c20cb97923407cf0934e14224af42c2b8d915f48bc3ad2d9ac18"}, - {file = "grpcio-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:7db16dd4ea1b05ada504f08d0dca1cd9b926bed3770f50e715d087c6f00ad748"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b0571a5aef36ba9177e262dc88a9240c866d903a62799e44fd4aae3f9a2ec17e"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fd9584bf1bccdfff1512719316efa77be235469e1e3295dce64538c4773840b"}, - {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6a478581b1a1a8fdf3318ecb5f4d0cda41cacdffe2b527c23707c9c1b8fdb55"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:77c8a317f0fd5a0a2be8ed5cbe5341537d5c00bb79b3bb27ba7c5378ba77dbca"}, - {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c30bb23a41df95109db130a6cc1b974844300ae2e5d68dd4947aacba5985aa5"}, - {file = "grpcio-1.60.0-cp312-cp312-win32.whl", hash = "sha256:2aef56e85901c2397bd557c5ba514f84de1f0ae5dd132f5d5fed042858115951"}, - {file = "grpcio-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e381fe0c2aa6c03b056ad8f52f8efca7be29fb4d9ae2f8873520843b6039612a"}, - {file = "grpcio-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:92f88ca1b956eb8427a11bb8b4a0c0b2b03377235fc5102cb05e533b8693a415"}, - {file = "grpcio-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:e278eafb406f7e1b1b637c2cf51d3ad45883bb5bd1ca56bc05e4fc135dfdaa65"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a48edde788b99214613e440fce495bbe2b1e142a7f214cce9e0832146c41e324"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de2ad69c9a094bf37c1102b5744c9aec6cf74d2b635558b779085d0263166454"}, - {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c826f93050c73e7769806f92e601e0efdb83ec8d7c76ddf45d514fee54e8e619"}, - {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e30be89a75ee66aec7f9e60086fadb37ff8c0ba49a022887c28c134341f7179"}, - {file = "grpcio-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b0fb2d4801546598ac5cd18e3ec79c1a9af8b8f2a86283c55a5337c5aeca4b1b"}, - {file = "grpcio-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:9073513ec380434eb8d21970e1ab3161041de121f4018bbed3146839451a6d8e"}, - {file = "grpcio-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:74d7d9fa97809c5b892449b28a65ec2bfa458a4735ddad46074f9f7d9550ad13"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1434ca77d6fed4ea312901122dc8da6c4389738bf5788f43efb19a838ac03ead"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e61e76020e0c332a98290323ecfec721c9544f5b739fab925b6e8cbe1944cf19"}, - {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675997222f2e2f22928fbba640824aebd43791116034f62006e19730715166c0"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5208a57eae445ae84a219dfd8b56e04313445d146873117b5fa75f3245bc1390"}, - {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:428d699c8553c27e98f4d29fdc0f0edc50e9a8a7590bfd294d2edb0da7be3629"}, - {file = "grpcio-1.60.0-cp38-cp38-win32.whl", hash = "sha256:83f2292ae292ed5a47cdcb9821039ca8e88902923198f2193f13959360c01860"}, - {file = "grpcio-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:705a68a973c4c76db5d369ed573fec3367d7d196673fa86614b33d8c8e9ebb08"}, - {file = "grpcio-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c193109ca4070cdcaa6eff00fdb5a56233dc7610216d58fb81638f89f02e4968"}, - {file = "grpcio-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:676e4a44e740deaba0f4d95ba1d8c5c89a2fcc43d02c39f69450b1fa19d39590"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5ff21e000ff2f658430bde5288cb1ac440ff15c0d7d18b5fb222f941b46cb0d2"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c86343cf9ff7b2514dd229bdd88ebba760bd8973dac192ae687ff75e39ebfab"}, - {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30943b9530fe3620e3b195c03130396cd0ee3a0d10a66c1bee715d1819001eaf"}, - {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b10241250cb77657ab315270b064a6c7f1add58af94befa20687e7c8d8603ae6"}, - {file = "grpcio-1.60.0-cp39-cp39-win32.whl", hash = "sha256:79a050889eb8d57a93ed21d9585bb63fca881666fc709f5d9f7f9372f5e7fd03"}, - {file = "grpcio-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a97a681e82bc11a42d4372fe57898d270a2707f36c45c6676e49ce0d5c41353"}, - {file = "grpcio-1.60.0.tar.gz", hash = "sha256:2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"}, + {file = "grpcio-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:c200cb6f2393468142eb50ab19613229dcc7829b5ccee8b658a36005f6669fdd"}, + {file = "grpcio-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b2266862c5ad664a380fbbcdbdb8289d71464c42a8c29053820ee78ba0119e5d"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0ab8b2864396663a5b0b0d6d79495657ae85fa37dcb6498a2669d067c65c11ea"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c30f393f9d5ff00a71bb56de4aa75b8fe91b161aeb61d39528db6b768d7eac69"}, + {file = "grpcio-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f250ff44843d9a0615e350c77f890082102a0318d66a99540f54769c8766ab73"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6d8de076528f7c43a2f576bc311799f89d795aa6c9b637377cc2b1616473804"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9b91879d6da1605811ebc60d21ab6a7e4bae6c35f6b63a061d61eb818c8168f6"}, + {file = "grpcio-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f71574afdf944e6652203cd1badcda195b2a27d9c83e6d88dc1ce3cfb73b31a5"}, + {file = "grpcio-1.71.0-cp310-cp310-win32.whl", hash = "sha256:8997d6785e93308f277884ee6899ba63baafa0dfb4729748200fcc537858a509"}, + {file = "grpcio-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:7d6ac9481d9d0d129224f6d5934d5832c4b1cddb96b59e7eba8416868909786a"}, + {file = "grpcio-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:d6aa986318c36508dc1d5001a3ff169a15b99b9f96ef5e98e13522c506b37eef"}, + {file = "grpcio-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:d2c170247315f2d7e5798a22358e982ad6eeb68fa20cf7a820bb74c11f0736e7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:e6f83a583ed0a5b08c5bc7a3fe860bb3c2eac1f03f1f63e0bc2091325605d2b7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be74ddeeb92cc87190e0e376dbc8fc7736dbb6d3d454f2fa1f5be1dee26b9d7"}, + {file = "grpcio-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd0dfbe4d5eb1fcfec9490ca13f82b089a309dc3678e2edabc144051270a66e"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a2242d6950dc892afdf9e951ed7ff89473aaf744b7d5727ad56bdaace363722b"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0fa05ee31a20456b13ae49ad2e5d585265f71dd19fbd9ef983c28f926d45d0a7"}, + {file = "grpcio-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3d081e859fb1ebe176de33fc3adb26c7d46b8812f906042705346b314bde32c3"}, + {file = "grpcio-1.71.0-cp311-cp311-win32.whl", hash = "sha256:d6de81c9c00c8a23047136b11794b3584cdc1460ed7cbc10eada50614baa1444"}, + {file = "grpcio-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:24e867651fc67717b6f896d5f0cac0ec863a8b5fb7d6441c2ab428f52c651c6b"}, + {file = "grpcio-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:0ff35c8d807c1c7531d3002be03221ff9ae15712b53ab46e2a0b4bb271f38537"}, + {file = "grpcio-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:b78a99cd1ece4be92ab7c07765a0b038194ded2e0a26fd654591ee136088d8d7"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:dc1a1231ed23caac1de9f943d031f1bc38d0f69d2a3b243ea0d664fc1fbd7fec"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6beeea5566092c5e3c4896c6d1d307fb46b1d4bdf3e70c8340b190a69198594"}, + {file = "grpcio-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5170929109450a2c031cfe87d6716f2fae39695ad5335d9106ae88cc32dc84c"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5b08d03ace7aca7b2fadd4baf291139b4a5f058805a8327bfe9aece7253b6d67"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f903017db76bf9cc2b2d8bdd37bf04b505bbccad6be8a81e1542206875d0e9db"}, + {file = "grpcio-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:469f42a0b410883185eab4689060a20488a1a0a00f8bbb3cbc1061197b4c5a79"}, + {file = "grpcio-1.71.0-cp312-cp312-win32.whl", hash = "sha256:ad9f30838550695b5eb302add33f21f7301b882937460dd24f24b3cc5a95067a"}, + {file = "grpcio-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:652350609332de6dac4ece254e5d7e1ff834e203d6afb769601f286886f6f3a8"}, + {file = "grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379"}, + {file = "grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29"}, + {file = "grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b"}, + {file = "grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637"}, + {file = "grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb"}, + {file = "grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366"}, + {file = "grpcio-1.71.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c6a0a28450c16809f94e0b5bfe52cabff63e7e4b97b44123ebf77f448534d07d"}, + {file = "grpcio-1.71.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:a371e6b6a5379d3692cc4ea1cb92754d2a47bdddeee755d3203d1f84ae08e03e"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:39983a9245d37394fd59de71e88c4b295eb510a3555e0a847d9965088cdbd033"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9182e0063112e55e74ee7584769ec5a0b4f18252c35787f48738627e23a62b97"}, + {file = "grpcio-1.71.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693bc706c031aeb848849b9d1c6b63ae6bcc64057984bb91a542332b75aa4c3d"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:20e8f653abd5ec606be69540f57289274c9ca503ed38388481e98fa396ed0b41"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8700a2a57771cc43ea295296330daaddc0d93c088f0a35cc969292b6db959bf3"}, + {file = "grpcio-1.71.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d35a95f05a8a2cbe8e02be137740138b3b2ea5f80bd004444e4f9a1ffc511e32"}, + {file = "grpcio-1.71.0-cp39-cp39-win32.whl", hash = "sha256:f9c30c464cb2ddfbc2ddf9400287701270fdc0f14be5f08a1e3939f1e749b455"}, + {file = "grpcio-1.71.0-cp39-cp39-win_amd64.whl", hash = "sha256:63e41b91032f298b3e973b3fa4093cbbc620c875e2da7b93e249d4728b54559a"}, + {file = "grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.60.0)"] +protobuf = ["grpcio-tools (>=1.71.0)"] [[package]] name = "grpcio-health-checking" -version = "1.60.0" +version = "1.71.0" description = "Standard Health Checking Service for gRPC" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" files = [ - {file = "grpcio-health-checking-1.60.0.tar.gz", hash = "sha256:478b5300778120fed9f6d134d72b157a59f9c06689789218cbff47fafca2f119"}, - {file = "grpcio_health_checking-1.60.0-py3-none-any.whl", hash = "sha256:13caf28bc93795bd6bdb580b21832ebdd1aa3f5b648ea47ed17362d85bed96d3"}, + {file = "grpcio_health_checking-1.71.0-py3-none-any.whl", hash = "sha256:b7d9b7a7606ab4cd02d23bd1d3943843f784ffc987c9bfec14c9d058d9e279db"}, + {file = "grpcio_health_checking-1.71.0.tar.gz", hash = "sha256:ff9bd55beb97ce3322fda2ae58781c9d6c6fcca6a35ca3b712975d9f75dd30af"}, ] [package.dependencies] -grpcio = ">=1.60.0" -protobuf = ">=4.21.6" +grpcio = ">=1.71.0" +protobuf = ">=5.26.1,<6.0dev" [[package]] name = "grpcio-tools" -version = "1.60.0" +version = "1.71.0" description = "Protobuf code generator for gRPC" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "grpcio-tools-1.60.0.tar.gz", hash = "sha256:ed30499340228d733ff69fcf4a66590ed7921f94eb5a2bf692258b1280b9dac7"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:6807b7a3f3e6e594566100bd7fe04a2c42ce6d5792652677f1aaf5aa5adaef3d"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:857c5351e9dc33a019700e171163f94fcc7e3ae0f6d2b026b10fda1e3c008ef1"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:ec0e401e9a43d927d216d5169b03c61163fb52b665c5af2fed851357b15aef88"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e68dc4474f30cad11a965f0eb5d37720a032b4720afa0ec19dbcea2de73b5aae"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbf0ed772d2ae7e8e5d7281fcc00123923ab130b94f7a843eee9af405918f924"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c771b19dce2bfe06899247168c077d7ab4e273f6655d8174834f9a6034415096"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5614cf0960456d21d8a0f4902e3e5e3bcacc4e400bf22f196e5dd8aabb978b7"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-win32.whl", hash = "sha256:87cf439178f3eb45c1a889b2e4a17cbb4c450230d92c18d9c57e11271e239c55"}, - {file = "grpcio_tools-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:687f576d7ff6ce483bc9a196d1ceac45144e8733b953620a026daed8e450bc38"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a8a758701f3ac07ed85f5a4284c6a9ddefcab7913a8e552497f919349e72438"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:7c1cde49631732356cb916ee1710507967f19913565ed5f9991e6c9cb37e3887"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:d941749bd8dc3f8be58fe37183143412a27bec3df8482d5abd6b4ec3f1ac2924"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ee35234f1da8fba7ddbc544856ff588243f1128ea778d7a1da3039be829a134"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8f7a5094adb49e85db13ea3df5d99a976c2bdfd83b0ba26af20ebb742ac6786"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:24c4ead4a03037beaeb8ef2c90d13d70101e35c9fae057337ed1a9144ef10b53"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:811abb9c4fb6679e0058dfa123fb065d97b158b71959c0e048e7972bbb82ba0f"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-win32.whl", hash = "sha256:bd2a17b0193fbe4793c215d63ce1e01ae00a8183d81d7c04e77e1dfafc4b2b8a"}, - {file = "grpcio_tools-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:b22b1299b666eebd5752ba7719da536075eae3053abcf2898b65f763c314d9da"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:74025fdd6d1cb7ba4b5d087995339e9a09f0c16cf15dfe56368b23e41ffeaf7a"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:5a907a4f1ffba86501b2cdb8682346249ea032b922fc69a92f082ba045cca548"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:1fbb9554466d560472f07d906bfc8dcaf52f365c2a407015185993e30372a886"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f10ef47460ce3c6fd400f05fe757b90df63486c9b84d1ecad42dcc5f80c8ac14"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:321b18f42a70813545e416ddcb8bf20defa407a8114906711c9710a69596ceda"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:081336d8258f1a56542aa8a7a5dec99a2b38d902e19fbdd744594783301b0210"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:addc9b23d6ff729d9f83d4a2846292d4c84f5eb2ec38f08489a6a0d66ac2b91e"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-win32.whl", hash = "sha256:e87cabac7969bdde309575edc2456357667a1b28262b2c1f12580ef48315b19d"}, - {file = "grpcio_tools-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e70d867c120d9849093b0ac24d861e378bc88af2552e743d83b9f642d2caa7c2"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:559ce714fe212aaf4abbe1493c5bb8920def00cc77ce0d45266f4fd9d8b3166f"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:7a5263a0f2ddb7b1cfb2349e392cfc4f318722e0f48f886393e06946875d40f3"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:18976684a931ca4bcba65c78afa778683aefaae310f353e198b1823bf09775a0"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5c519a0d4ba1ab44a004fa144089738c59278233e2010b2cf4527dc667ff297"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6170873b1e5b6580ebb99e87fb6e4ea4c48785b910bd7af838cc6e44b2bccb04"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fb4df80868b3e397d5fbccc004c789d2668b622b51a9d2387b4c89c80d31e2c5"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dba6e32c87b4af29b5f475fb2f470f7ee3140bfc128644f17c6c59ddeb670680"}, - {file = "grpcio_tools-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f610384dee4b1ca705e8da66c5b5fe89a2de3d165c5282c3d1ddf40cb18924e4"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:4041538f55aad5b3ae7e25ab314d7995d689e968bfc8aa169d939a3160b1e4c6"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:2fb4cf74bfe1e707cf10bc9dd38a1ebaa145179453d150febb121c7e9cd749bf"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2fd1671c52f96e79a2302c8b1c1f78b8a561664b8b3d6946f20d8f1cc6b4225a"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd1e68c232fe01dd5312a8dbe52c50ecd2b5991d517d7f7446af4ba6334ba872"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17a32b3da4fc0798cdcec0a9c974ac2a1e98298f151517bf9148294a3b1a5742"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9970d384fb0c084b00945ef57d98d57a8d32be106d8f0bd31387f7cbfe411b5b"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5ce6bbd4936977ec1114f2903eb4342781960d521b0d82f73afedb9335251f6f"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-win32.whl", hash = "sha256:2e00de389729ca8d8d1a63c2038703078a887ff738dc31be640b7da9c26d0d4f"}, - {file = "grpcio_tools-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:6192184b1f99372ff1d9594bd4b12264e3ff26440daba7eb043726785200ff77"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:eae27f9b16238e2aaee84c77b5923c6924d6dccb0bdd18435bf42acc8473ae1a"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b96981f3a31b85074b73d97c8234a5ed9053d65a36b18f4a9c45a2120a5b7a0a"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:1748893efd05cf4a59a175d7fa1e4fbb652f4d84ccaa2109f7869a2be48ed25e"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a6fe752205caae534f29fba907e2f59ff79aa42c6205ce9a467e9406cbac68c"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3456df087ea61a0972a5bc165aed132ed6ddcc63f5749e572f9fff84540bdbad"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f3d916606dcf5610d4367918245b3d9d8cd0d2ec0b7043d1bbb8c50fe9815c3a"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fc01bc1079279ec342f0f1b6a107b3f5dc3169c33369cf96ada6e2e171f74e86"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-win32.whl", hash = "sha256:2dd01257e4feff986d256fa0bac9f56de59dc735eceeeb83de1c126e2e91f653"}, - {file = "grpcio_tools-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b93ae8ffd18e9af9a965ebca5fa521e89066267de7abdde20721edc04e42721"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:f4ad7f0d756546902597053d70b3af2606fbd70d7972876cd75c1e241d22ae00"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:64bdb291df61cf570b5256777ad5fe2b1db6d67bc46e55dc56a0a862722ae329"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:8dd9795e982d77a4b496f7278b943c2563d9afde2069cdee78c111a40cc4d675"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1b5860c41a36b26fec4f52998f1a451d0525a5c9a4fb06b6ea3e9211abdb925"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3059c14035e5dc03d462f261e5900b9a077fd1a36976c3865b8507474520bad4"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f360981b215b1d5aff9235b37e7e1826246e35bbac32a53e41d4e990a37b8f4c"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bfe3888c3bbe16a5aa39409bc38744a31c0c3d2daa2b0095978c56e106c85b42"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:145985c0bf12131f0a1503e65763e0f060473f7f3928ed1ff3fb0e8aad5bc8ac"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-win32.whl", hash = "sha256:82c430edd939bb863550ee0fecf067d78feff828908a1b529bbe33cc57f2419c"}, + {file = "grpcio_tools-1.71.0-cp310-cp310-win_amd64.whl", hash = "sha256:83e90724e3f02415c628e4ead1d6ffe063820aaaa078d9a39176793df958cd5a"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:1f19b16b49afa5d21473f49c0966dd430c88d089cd52ac02404d8cef67134efb"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:459c8f5e00e390aecd5b89de67deb3ec7188a274bc6cb50e43cef35ab3a3f45d"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:edab7e6518de01196be37f96cb1e138c3819986bf5e2a6c9e1519b4d716b2f5a"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b93b9f6adc7491d4c10144c0643409db298e5e63c997106a804f6f0248dbaf4"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ae5f2efa9e644c10bf1021600bfc099dfbd8e02b184d2d25dc31fcd6c2bc59e"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:65aa082f4435571d65d5ce07fc444f23c3eff4f3e34abef599ef8c9e1f6f360f"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1331e726e08b7bdcbf2075fcf4b47dff07842b04845e6e220a08a4663e232d7f"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6693a7d3ba138b0e693b3d1f687cdd9db9e68976c3fa2b951c17a072fea8b583"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-win32.whl", hash = "sha256:6d11ed3ff7b6023b5c72a8654975324bb98c1092426ba5b481af406ff559df00"}, + {file = "grpcio_tools-1.71.0-cp311-cp311-win_amd64.whl", hash = "sha256:072b2a5805ac97e4623b3aa8f7818275f3fb087f4aa131b0fce00471065f6eaa"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:61c0409d5bdac57a7bd0ce0ab01c1c916728fe4c8a03d77a25135ad481eb505c"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:28784f39921d061d2164a9dcda5164a69d07bf29f91f0ea50b505958292312c9"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:192808cf553cedca73f0479cc61d5684ad61f24db7a5f3c4dfe1500342425866"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:989ee9da61098230d3d4c8f8f8e27c2de796f1ff21b1c90110e636d9acd9432b"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:541a756276c8a55dec991f6c0106ae20c8c8f5ce8d0bdbfcb01e2338d1a8192b"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:870c0097700d13c403e5517cb7750ab5b4a791ce3e71791c411a38c5468b64bd"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:abd57f615e88bf93c3c6fd31f923106e3beb12f8cd2df95b0d256fa07a7a0a57"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:753270e2d06d37e6d7af8967d1d059ec635ad215882041a36294f4e2fd502b2e"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-win32.whl", hash = "sha256:0e647794bd7138b8c215e86277a9711a95cf6a03ff6f9e555d54fdf7378b9f9d"}, + {file = "grpcio_tools-1.71.0-cp312-cp312-win_amd64.whl", hash = "sha256:48debc879570972d28bfe98e4970eff25bb26da3f383e0e49829b2d2cd35ad87"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:9a78d07d6c301a25ef5ede962920a522556a1dfee1ccc05795994ceb867f766c"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:580ac88141c9815557e63c9c04f5b1cdb19b4db8d0cb792b573354bde1ee8b12"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f7c678e68ece0ae908ecae1c4314a0c2c7f83e26e281738b9609860cc2c82d96"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56ecd6cc89b5e5eed1de5eb9cafce86c9c9043ee3840888cc464d16200290b53"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a041afc20ab2431d756b6295d727bd7adee813b21b06a3483f4a7a15ea15f"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a1712f12102b60c8d92779b89d0504e0d6f3a59f2b933e5622b8583f5c02992"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:41878cb7a75477e62fdd45e7e9155b3af1b7a5332844021e2511deaf99ac9e6c"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:682e958b476049ccc14c71bedf3f979bced01f6e0c04852efc5887841a32ad6b"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-win32.whl", hash = "sha256:0ccfb837152b7b858b9f26bb110b3ae8c46675d56130f6c2f03605c4f129be13"}, + {file = "grpcio_tools-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:ffff9bc5eacb34dd26b487194f7d44a3e64e752fc2cf049d798021bf25053b87"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:834959b6eceb85de5217a411aba1643b5f782798680c122202d6a06177226644"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:e3ae9556e2a1cd70e7d7b0e0459c35af71d51a7dae4cf36075068011a69f13ec"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:77fe6db1334e0ce318b2cb4e70afa94e0c173ed1a533d37aea69ad9f61ae8ea9"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57e3e2544c306b60ef2d76570bac4e977be1ad548641c9eec130c3bc47e80141"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af39e245fa56f7f5c2fe86b7d6c1b78f395c07e54d5613cbdbb3c24769a92b6e"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f987d0053351217954543b174b0bddbf51d45b3cfcf8d6de97b0a43d264d753"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8e6cdbba4dae7b37b0d25d074614be9936fb720144420f03d9f142a80be69ba2"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3adc8b229e60c77bab5a5d62b415667133bd5ced7d59b5f71d6317c9143631e"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-win32.whl", hash = "sha256:f68334d28a267fabec6e70cb5986e9999cfbfd14db654094ddf9aedd804a293a"}, + {file = "grpcio_tools-1.71.0-cp39-cp39-win_amd64.whl", hash = "sha256:1291a6136c07a86c3bb09f6c33f5cf227cc14956edd1b85cb572327a36e0aef8"}, + {file = "grpcio_tools-1.71.0.tar.gz", hash = "sha256:38dba8e0d5e0fb23a034e09644fdc6ed862be2371887eee54901999e8f6792a8"}, ] [package.dependencies] -grpcio = ">=1.60.0" -protobuf = ">=4.21.6,<5.0dev" +grpcio = ">=1.71.0" +protobuf = ">=5.26.1,<6.0dev" setuptools = "*" [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] [[package]] name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" +version = "4.2.0" +description = "Pure-Python HTTP/2 protocol implementation" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.9" files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, + {file = "h2-4.2.0-py3-none-any.whl", hash = "sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0"}, + {file = "h2-4.2.0.tar.gz", hash = "sha256:c8a52129695e88b1a0578d8d2cc6842bbd79128ac685463b887ee278126ad01f"}, ] [package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" +hpack = ">=4.1,<5" +hyperframe = ">=6.1,<7" [[package]] name = "h5py" -version = "3.10.0" +version = "3.13.0" description = "Read and write HDF5 files from Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "h5py-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f"}, - {file = "h5py-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c"}, - {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03"}, - {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d"}, - {file = "h5py-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f"}, - {file = "h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc"}, - {file = "h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd"}, - {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7"}, - {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52"}, - {file = "h5py-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684"}, - {file = "h5py-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3"}, - {file = "h5py-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20"}, - {file = "h5py-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039"}, - {file = "h5py-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339"}, - {file = "h5py-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641"}, - {file = "h5py-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3"}, - {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af"}, - {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97"}, - {file = "h5py-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99"}, - {file = "h5py-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52"}, - {file = "h5py-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3"}, - {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824"}, - {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229"}, - {file = "h5py-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770"}, - {file = "h5py-3.10.0.tar.gz", hash = "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"}, + {file = "h5py-3.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5540daee2b236d9569c950b417f13fd112d51d78b4c43012de05774908dff3f5"}, + {file = "h5py-3.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10894c55d46df502d82a7a4ed38f9c3fdbcb93efb42e25d275193e093071fade"}, + {file = "h5py-3.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb267ce4b83f9c42560e9ff4d30f60f7ae492eacf9c7ede849edf8c1b860e16b"}, + {file = "h5py-3.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2cf6a231a07c14acd504a945a6e9ec115e0007f675bde5e0de30a4dc8d86a31"}, + {file = "h5py-3.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:851ae3a8563d87a5a0dc49c2e2529c75b8842582ccaefbf84297d2cfceeacd61"}, + {file = "h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8"}, + {file = "h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868"}, + {file = "h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4"}, + {file = "h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a"}, + {file = "h5py-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508"}, + {file = "h5py-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:477c58307b6b9a2509c59c57811afb9f598aedede24a67da808262dfa0ee37b4"}, + {file = "h5py-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:57c4c74f627c616f02b7aec608a8c706fe08cb5b0ba7c08555a4eb1dde20805a"}, + {file = "h5py-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:357e6dc20b101a805ccfd0024731fbaf6e8718c18c09baf3b5e4e9d198d13fca"}, + {file = "h5py-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6f13f9b5ce549448c01e4dfe08ea8d1772e6078799af2c1c8d09e941230a90d"}, + {file = "h5py-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:21daf38171753899b5905f3d82c99b0b1ec2cbbe282a037cad431feb620e62ec"}, + {file = "h5py-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e520ec76de00943dd017c8ea3f354fa1d2f542eac994811943a8faedf2a7d5cb"}, + {file = "h5py-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e79d8368cd9295045956bfb436656bea3f915beaa11d342e9f79f129f5178763"}, + {file = "h5py-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56dd172d862e850823c4af02dc4ddbc308f042b85472ffdaca67f1598dff4a57"}, + {file = "h5py-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be949b46b7388074c5acae017fbbe3e5ba303fd9daaa52157fdfef30bbdacadd"}, + {file = "h5py-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:4f97ecde7ac6513b21cd95efdfc38dc6d19f96f6ca6f2a30550e94e551458e0a"}, + {file = "h5py-3.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82690e89c72b85addf4fc4d5058fb1e387b6c14eb063b0b879bf3f42c3b93c35"}, + {file = "h5py-3.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d571644958c5e19a61c793d8d23cd02479572da828e333498c9acc463f4a3997"}, + {file = "h5py-3.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:560e71220dc92dfa254b10a4dcb12d56b574d2d87e095db20466b32a93fec3f9"}, + {file = "h5py-3.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c10f061764d8dce0a9592ce08bfd5f243a00703325c388f1086037e5d619c5f1"}, + {file = "h5py-3.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c82ece71ed1c2b807b6628e3933bc6eae57ea21dac207dca3470e3ceaaf437c"}, + {file = "h5py-3.13.0.tar.gz", hash = "sha256:1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3"}, ] [package.dependencies] -numpy = ">=1.17.3" +numpy = ">=1.19.3" [[package]] name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" +version = "4.1.0" +description = "Pure-Python HPACK header encoding" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.9" files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, + {file = "hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496"}, + {file = "hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca"}, ] [[package]] name = "httpcore" -version = "1.0.4" +version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, - {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] [package.dependencies] certifi = "*" -h11 = ">=0.13,<0.15" +h11 = ">=0.16" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.25.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -863,24 +822,24 @@ socks = ["socksio (==1.*)"] [[package]] name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" +version = "6.1.0" +description = "Pure-Python HTTP/2 framing" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.9" files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, + {file = "hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5"}, + {file = "hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08"}, ] [[package]] name = "identify" -version = "2.5.35" +version = "2.6.10" description = "File identification library for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, - {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, + {file = "identify-2.6.10-py2.py3-none-any.whl", hash = "sha256:5f34248f54136beed1a7ba6a6b5c4b6cf21ff495aac7c359e1ef831ae3b8ab25"}, + {file = "identify-2.6.10.tar.gz", hash = "sha256:45e92fd704f3da71cc3880036633f48b4b7265fd4de2b57627cb157216eb7eb8"}, ] [package.extras] @@ -888,24 +847,27 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.6" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] [[package]] @@ -926,75 +888,59 @@ tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < [[package]] name = "ipython" -version = "8.12.3" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, - {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] - -[[package]] -name = "isodate" -version = "0.6.1" -description = "An ISO 8601 date/time/duration parser and formatter" -optional = false -python-versions = "*" -files = [ - {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, - {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, -] - -[package.dependencies] -six = "*" +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jsons" @@ -1015,86 +961,86 @@ test = ["attrs", "codecov", "coverage", "dataclasses", "pytest", "scons", "tzdat [[package]] name = "marshmallow" -version = "3.21.1" +version = "4.0.0" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "marshmallow-3.21.1-py3-none-any.whl", hash = "sha256:f085493f79efb0644f270a9bf2892843142d80d7174bbbd2f3713f2a589dc633"}, - {file = "marshmallow-3.21.1.tar.gz", hash = "sha256:4e65e9e0d80fc9e609574b9983cf32579f305c718afb30d7233ab818571768c3"}, + {file = "marshmallow-4.0.0-py3-none-any.whl", hash = "sha256:e7b0528337e9990fd64950f8a6b3a1baabed09ad17a0dfb844d701151f92d203"}, + {file = "marshmallow-4.0.0.tar.gz", hash = "sha256:3b6e80aac299a7935cfb97ed01d1854fb90b5079430969af92118ea1b12a8d55"}, ] [package.dependencies] -packaging = ">=17.0" +backports-datetime-fromisoformat = {version = "*", markers = "python_version < \"3.11\""} +typing-extensions = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] -docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==4.0.0)", "sphinx-version-warning (==1.1.2)"] -tests = ["pytest", "pytz", "simplejson"] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"] +docs = ["autodocsumm (==0.2.14)", "furo (==2024.8.6)", "sphinx (==8.2.3)", "sphinx-copybutton (==0.5.2)", "sphinx-issues (==5.0.1)", "sphinxext-opengraph (==0.10.0)"] +tests = ["pytest", "simplejson"] [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] traitlets = "*" [[package]] -name = "minio" -version = "7.2.5" -description = "MinIO Python SDK for Amazon S3 Compatible Cloud Storage" +name = "milvus-lite" +version = "2.4.12" +description = "A lightweight version of Milvus wrapped with Python." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "minio-7.2.5-py3-none-any.whl", hash = "sha256:ed9176c96d4271cb1022b9ecb8a538b1e55b32ae06add6de16425cab99ef2304"}, - {file = "minio-7.2.5.tar.gz", hash = "sha256:59d8906e2da248a9caac34d4958a859cc3a44abbe6447910c82b5abfa9d6a2e1"}, + {file = "milvus_lite-2.4.12-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:e8d4f7cdd5f731efd6faeee3715d280fd91a5f9b4d89312664d56401f65b1473"}, + {file = "milvus_lite-2.4.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:20087663e7b4385050b7ad08f1f03404426d4c87b1ff91d5a8723eee7fd49e88"}, + {file = "milvus_lite-2.4.12-py3-none-manylinux2014_aarch64.whl", hash = "sha256:a0f3a5ddbfd19f4a6b842b2fd3445693c796cde272b701a1646a94c1ac45d3d7"}, + {file = "milvus_lite-2.4.12-py3-none-manylinux2014_x86_64.whl", hash = "sha256:334037ebbab60243b5d8b43d54ca2f835d81d48c3cda0c6a462605e588deb05d"}, ] [package.dependencies] -argon2-cffi = "*" -certifi = "*" -pycryptodome = "*" -typing-extensions = "*" -urllib3 = "*" +tqdm = "*" [[package]] name = "ml-dtypes" -version = "0.4.0" +version = "0.4.1" description = "" optional = false python-versions = ">=3.9" files = [ - {file = "ml_dtypes-0.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:93afe37f3a879d652ec9ef1fc47612388890660a2657fbb5747256c3b818fd81"}, - {file = "ml_dtypes-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bb83fd064db43e67e67d021e547698af4c8d5c6190f2e9b1c53c09f6ff5531d"}, - {file = "ml_dtypes-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03e7cda6ef164eed0abb31df69d2c00c3a5ab3e2610b6d4c42183a43329c72a5"}, - {file = "ml_dtypes-0.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:a15d96d090aebb55ee85173d1775ae325a001aab607a76c8ea0b964ccd6b5364"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bdf689be7351cc3c95110c910c1b864002f113e682e44508910c849e144f3df1"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c83e4d443962d891d51669ff241d5aaad10a8d3d37a81c5532a45419885d591c"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e2f4237b459a63c97c2c9f449baa637d7e4c20addff6a9bac486f22432f3b6"}, - {file = "ml_dtypes-0.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:75b4faf99d0711b81f393db36d210b4255fd419f6f790bc6c1b461f95ffb7a9e"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ee9f91d4c4f9959a7e1051c141dc565f39e54435618152219769e24f5e9a4d06"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad6849a2db386b38e4d54fe13eb3293464561780531a918f8ef4c8169170dd49"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa32979ebfde3a0d7c947cafbf79edc1ec77ac05ad0780ee86c1d8df70f2259"}, - {file = "ml_dtypes-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:3b67ec73a697c88c1122038e0de46520e48dc2ec876d42cf61bc5efe3c0b7675"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:41affb38fdfe146e3db226cf2953021184d6f0c4ffab52136613e9601706e368"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43cf4356a0fe2eeac6d289018d0734e17a403bdf1fd911953c125dd0358edcc0"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1724ddcdf5edbaf615a62110af47407f1719b8d02e68ccee60683acb5f74da1"}, - {file = "ml_dtypes-0.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:723af6346447268a3cf0b7356e963d80ecb5732b5279b2aa3fa4b9fc8297c85e"}, - {file = "ml_dtypes-0.4.0.tar.gz", hash = "sha256:eaf197e72f4f7176a19fe3cb8b61846b38c6757607e7bf9cd4b1d84cd3e74deb"}, + {file = "ml_dtypes-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1fe8b5b5e70cd67211db94b05cfd58dace592f24489b038dc6f9fe347d2e07d5"}, + {file = "ml_dtypes-0.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c09a6d11d8475c2a9fd2bc0695628aec105f97cab3b3a3fb7c9660348ff7d24"}, + {file = "ml_dtypes-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5e8f75fa371020dd30f9196e7d73babae2abd51cf59bdd56cb4f8de7e13354"}, + {file = "ml_dtypes-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:15fdd922fea57e493844e5abb930b9c0bd0af217d9edd3724479fc3d7ce70e3f"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2d55b588116a7085d6e074cf0cdb1d6fa3875c059dddc4d2c94a4cc81c23e975"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e138a9b7a48079c900ea969341a5754019a1ad17ae27ee330f7ebf43f23877f9"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c6cfb5cf78535b103fde9ea3ded8e9f16f75bc07789054edc7776abfb3d752"}, + {file = "ml_dtypes-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:274cc7193dd73b35fb26bef6c5d40ae3eb258359ee71cd82f6e96a8c948bdaa6"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:827d3ca2097085cf0355f8fdf092b888890bb1b1455f52801a2d7756f056f54b"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:772426b08a6172a891274d581ce58ea2789cc8abc1c002a27223f314aaf894e7"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126e7d679b8676d1a958f2651949fbfa182832c3cd08020d8facd94e4114f3e9"}, + {file = "ml_dtypes-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:df0fb650d5c582a9e72bb5bd96cfebb2cdb889d89daff621c8fbc60295eba66c"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e35e486e97aee577d0890bc3bd9e9f9eece50c08c163304008587ec8cfe7575b"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:560be16dc1e3bdf7c087eb727e2cf9c0e6a3d87e9f415079d2491cc419b3ebf5"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b757d445a20df39035c4cdeed457ec8b60d236020d2560dbc25887533cf50"}, + {file = "ml_dtypes-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:ef0d7e3fece227b49b544fa69e50e607ac20948f0043e9f76b44f35f229ea450"}, + {file = "ml_dtypes-0.4.1.tar.gz", hash = "sha256:fad5f2de464fd09127e49b7fd1252b9006fb43d2edc1ff112d390c324af5ca7a"}, ] [package.dependencies] numpy = [ - {version = ">=1.23.3", markers = "python_version >= \"3.11\""}, {version = ">=1.21.2", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, {version = ">1.20", markers = "python_version < \"3.10\""}, + {version = ">=1.23.3", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [package.extras] @@ -1102,53 +1048,131 @@ dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"] [[package]] name = "nodeenv" -version = "1.8.0" +version = "1.9.1" description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, ] -[package.dependencies] -setuptools = "*" - [[package]] name = "numpy" -version = "1.24.4" +version = "2.0.2" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"}, + {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"}, + {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"}, + {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"}, + {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"}, + {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"}, + {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"}, + {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"}, + {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"}, + {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"}, + {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"}, + {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"}, + {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"}, + {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"}, + {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"}, + {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"}, + {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"}, + {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"}, + {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"}, + {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"}, + {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"}, + {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"}, + {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"}, +] + +[[package]] +name = "numpy" +version = "2.2.5" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f4a922da1729f4c40932b2af4fe84909c7a6e167e6e99f71838ce3a29f3fe26"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6f91524d31b34f4a5fee24f5bc16dcd1491b668798b6d85585d836c1e633a6a"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:19f4718c9012e3baea91a7dba661dcab2451cda2550678dc30d53acb91a7290f"}, + {file = "numpy-2.2.5-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:eb7fd5b184e5d277afa9ec0ad5e4eb562ecff541e7f60e69ee69c8d59e9aeaba"}, + {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6413d48a9be53e183eb06495d8e3b006ef8f87c324af68241bbe7a39e8ff54c3"}, + {file = "numpy-2.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7451f92eddf8503c9b8aa4fe6aa7e87fd51a29c2cfc5f7dbd72efde6c65acf57"}, + {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0bcb1d057b7571334139129b7f941588f69ce7c4ed15a9d6162b2ea54ded700c"}, + {file = "numpy-2.2.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36ab5b23915887543441efd0417e6a3baa08634308894316f446027611b53bf1"}, + {file = "numpy-2.2.5-cp310-cp310-win32.whl", hash = "sha256:422cc684f17bc963da5f59a31530b3936f57c95a29743056ef7a7903a5dbdf88"}, + {file = "numpy-2.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:e4f0b035d9d0ed519c813ee23e0a733db81ec37d2e9503afbb6e54ccfdee0fa7"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d"}, + {file = "numpy-2.2.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54"}, + {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610"}, + {file = "numpy-2.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b"}, + {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be"}, + {file = "numpy-2.2.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906"}, + {file = "numpy-2.2.5-cp311-cp311-win32.whl", hash = "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175"}, + {file = "numpy-2.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e"}, + {file = "numpy-2.2.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa"}, + {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571"}, + {file = "numpy-2.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073"}, + {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8"}, + {file = "numpy-2.2.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae"}, + {file = "numpy-2.2.5-cp312-cp312-win32.whl", hash = "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb"}, + {file = "numpy-2.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9"}, + {file = "numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191"}, + {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372"}, + {file = "numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d"}, + {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7"}, + {file = "numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73"}, + {file = "numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b"}, + {file = "numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133"}, + {file = "numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376"}, + {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19"}, + {file = "numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0"}, + {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a"}, + {file = "numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066"}, + {file = "numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e"}, + {file = "numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b4ea7e1cff6784e58fe281ce7e7f05036b3e1c89c6f922a6bfbc0a7e8768adbe"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d7543263084a85fbc09c704b515395398d31d6395518446237eac219eab9e55e"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70"}, + {file = "numpy-2.2.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d2e3bdadaba0e040d1e7ab39db73e0afe2c74ae277f5614dad53eadbecbbb169"}, + {file = "numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291"}, ] [[package]] @@ -1175,98 +1199,141 @@ develop = ["black", "botocore", "coverage (<8.0.0)", "jinja2", "mock", "myst-par docs = ["aiohttp (>=3,<4)", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] kerberos = ["requests-kerberos"] +[[package]] +name = "opensearch-py" +version = "2.8.0" +description = "Python client for OpenSearch" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "opensearch_py-2.8.0-py3-none-any.whl", hash = "sha256:52c60fdb5d4dcf6cce3ee746c13b194529b0161e0f41268b98ab8f1624abe2fa"}, + {file = "opensearch_py-2.8.0.tar.gz", hash = "sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda"}, +] + +[package.dependencies] +certifi = ">=2024.07.04" +Events = "*" +python-dateutil = "*" +requests = ">=2.32.0,<3.0.0" +urllib3 = {version = ">=1.26.19,<2.2.0 || >2.2.0,<2.2.1 || >2.2.1,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +async = ["aiohttp (>=3.9.4,<4)"] +develop = ["black (>=24.3.0)", "botocore", "coverage (<8.0.0)", "jinja2", "myst_parser", "pytest (>=3.0.0)", "pytest-cov", "pytest-mock (<4.0.0)", "pytz", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx", "sphinx_copybutton", "sphinx_rtd_theme"] +docs = ["aiohttp (>=3.9.4,<4)", "myst_parser", "sphinx", "sphinx_copybutton", "sphinx_rtd_theme"] +kerberos = ["requests_kerberos"] + [[package]] name = "packaging" -version = "24.0" +version = "25.0" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] name = "pandas" -version = "2.0.3" +version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pandas-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8"}, - {file = "pandas-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183"}, - {file = "pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0"}, - {file = "pandas-2.0.3-cp310-cp310-win32.whl", hash = "sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210"}, - {file = "pandas-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8"}, - {file = "pandas-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d"}, - {file = "pandas-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df"}, - {file = "pandas-2.0.3-cp311-cp311-win32.whl", hash = "sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd"}, - {file = "pandas-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061"}, - {file = "pandas-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089"}, - {file = "pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0"}, - {file = "pandas-2.0.3-cp38-cp38-win32.whl", hash = "sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02"}, - {file = "pandas-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b"}, - {file = "pandas-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b"}, - {file = "pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641"}, - {file = "pandas-2.0.3-cp39-cp39-win32.whl", hash = "sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682"}, - {file = "pandas-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc"}, - {file = "pandas-2.0.3.tar.gz", hash = "sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, + {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, + {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, + {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, + {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, + {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, + {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, + {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, + {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, + {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, + {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, + {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, + {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, + {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, + {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, + {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, + {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, ] [package.dependencies] numpy = [ - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {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\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" -tzdata = ">=2022.1" +tzdata = ">=2022.7" [package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pexpect" @@ -1295,41 +1362,31 @@ files = [ [package.dependencies] numpy = "*" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.3.7" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, + {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.14.1)"] [[package]] name = "pluggy" -version = "1.4.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, - {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -1338,13 +1395,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "portalocker" -version = "2.8.2" +version = "2.10.1" description = "Wraps the portalocker recipe for easy usage" optional = false python-versions = ">=3.8" files = [ - {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, - {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, + {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, + {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, ] [package.dependencies] @@ -1375,13 +1432,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.51" description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, + {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, ] [package.dependencies] @@ -1389,120 +1446,120 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.25.3" +version = "5.29.4" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, + {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, + {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, + {file = "protobuf-5.29.4-cp38-cp38-win32.whl", hash = "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de"}, + {file = "protobuf-5.29.4-cp38-cp38-win_amd64.whl", hash = "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68"}, + {file = "protobuf-5.29.4-cp39-cp39-win32.whl", hash = "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe"}, + {file = "protobuf-5.29.4-cp39-cp39-win_amd64.whl", hash = "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812"}, + {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, + {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, ] [[package]] name = "psycopg" -version = "3.1.18" +version = "3.2.7" description = "PostgreSQL database adapter for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "psycopg-3.1.18-py3-none-any.whl", hash = "sha256:4d5a0a5a8590906daa58ebd5f3cfc34091377354a1acced269dd10faf55da60e"}, - {file = "psycopg-3.1.18.tar.gz", hash = "sha256:31144d3fb4c17d78094d9e579826f047d4af1da6a10427d91dfcfb6ecdf6f12b"}, + {file = "psycopg-3.2.7-py3-none-any.whl", hash = "sha256:d39747d2d5b9658b69fa462ad21d31f1ba4a5722ad1d0cb952552bc0b4125451"}, + {file = "psycopg-3.2.7.tar.gz", hash = "sha256:9afa609c7ebf139827a38c0bf61be9c024a3ed743f56443de9d38e1efc260bf3"}, ] [package.dependencies] -psycopg-binary = {version = "3.1.18", optional = true, markers = "implementation_name != \"pypy\" and extra == \"binary\""} -typing-extensions = ">=4.1" +psycopg-binary = {version = "3.2.7", optional = true, markers = "implementation_name != \"pypy\" and extra == \"binary\""} +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.13\""} tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -binary = ["psycopg-binary (==3.1.18)"] -c = ["psycopg-c (==3.1.18)"] -dev = ["black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +binary = ["psycopg-binary (==3.2.7)"] +c = ["psycopg-c (==3.2.7)"] +dev = ["ast-comments (>=1.1.2)", "black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "isort-psycopg", "isort[colors] (>=6.0)", "mypy (>=1.14)", "pre-commit (>=4.0.1)", "types-setuptools (>=57.4)", "types-shapely (>=2.0)", "wheel (>=0.37)"] docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] pool = ["psycopg-pool"] -test = ["anyio (>=3.6.2,<4.0)", "mypy (>=1.4.1)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] +test = ["anyio (>=4.0)", "mypy (>=1.14)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] [[package]] name = "psycopg-binary" -version = "3.1.18" +version = "3.2.7" description = "PostgreSQL database adapter for Python -- C optimisation distribution" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "psycopg_binary-3.1.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c323103dfa663b88204cf5f028e83c77d7a715f9b6f51d2bbc8184b99ddd90a"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:887f8d856c91510148be942c7acd702ccf761a05f59f8abc123c22ab77b5a16c"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d322ba72cde4ca2eefc2196dad9ad7e52451acd2f04e3688d590290625d0c970"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:489aa4fe5a0b653b68341e9e44af247dedbbc655326854aa34c163ef1bcb3143"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55ff0948457bfa8c0d35c46e3a75193906d1c275538877ba65907fd67aa059ad"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b15e3653c82384b043d820fc637199b5c6a36b37fa4a4943e0652785bb2bad5d"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f8ff3bc08b43f36fdc24fedb86d42749298a458c4724fb588c4d76823ac39f54"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1729d0e3dfe2546d823841eb7a3d003144189d6f5e138ee63e5227f8b75276a5"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:13bcd3742112446037d15e360b27a03af4b5afcf767f5ee374ef8f5dd7571b31"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:320047e3d3554b857e16c2b6b615a85e0db6a02426f4d203a4594a2f125dfe57"}, - {file = "psycopg_binary-3.1.18-cp310-cp310-win_amd64.whl", hash = "sha256:888a72c2aca4316ca6d4a619291b805677bae99bba2f6e31a3c18424a48c7e4d"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e4de16a637ec190cbee82e0c2dc4860fed17a23a35f7a1e6dc479a5c6876722"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6432047b8b24ef97e3fbee1d1593a0faaa9544c7a41a2c67d1f10e7621374c83"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d684227ef8212e27da5f2aff9d4d303cc30b27ac1702d4f6881935549486dd5"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:67284e2e450dc7a9e4d76e78c0bd357dc946334a3d410defaeb2635607f632cd"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c9b6bd7fb5c6638cb32469674707649b526acfe786ba6d5a78ca4293d87bae4"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7121acc783c4e86d2d320a7fb803460fab158a7f0a04c5e8c5d49065118c1e73"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e28ff8f3de7b56588c2a398dc135fd9f157d12c612bd3daa7e6ba9872337f6f5"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c84a0174109f329eeda169004c7b7ca2e884a6305acab4a39600be67f915ed38"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:531381f6647fc267383dca88dbe8a70d0feff433a8e3d0c4939201fea7ae1b82"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b293e01057e63c3ac0002aa132a1071ce0fdb13b9ee2b6b45d3abdb3525c597d"}, - {file = "psycopg_binary-3.1.18-cp311-cp311-win_amd64.whl", hash = "sha256:780a90bcb69bf27a8b08bc35b958e974cb6ea7a04cdec69e737f66378a344d68"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:87dd9154b757a5fbf6d590f6f6ea75f4ad7b764a813ae04b1d91a70713f414a1"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f876ebbf92db70125f6375f91ab4bc6b27648aa68f90d661b1fc5affb4c9731c"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:258d2f0cb45e4574f8b2fe7c6d0a0e2eb58903a4fd1fbaf60954fba82d595ab7"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd27f713f2e5ef3fd6796e66c1a5203a27a30ecb847be27a78e1df8a9a5ae68c"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c38a4796abf7380f83b1653c2711cb2449dd0b2e5aca1caa75447d6fa5179c69"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2f7f95746efd1be2dc240248cc157f4315db3fd09fef2adfcc2a76e24aa5741"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4085f56a8d4fc8b455e8f44380705c7795be5317419aa5f8214f315e4205d804"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2e2484ae835dedc80cdc7f1b1a939377dc967fed862262cfd097aa9f50cade46"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3c2b039ae0c45eee4cd85300ef802c0f97d0afc78350946a5d0ec77dd2d7e834"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f54978c4b646dec77fefd8485fa82ec1a87807f334004372af1aaa6de9539a5"}, - {file = "psycopg_binary-3.1.18-cp312-cp312-win_amd64.whl", hash = "sha256:9ffcbbd389e486d3fd83d30107bbf8b27845a295051ccabde240f235d04ed921"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c76659ae29a84f2c14f56aad305dd00eb685bd88f8c0a3281a9a4bc6bd7d2aa7"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7afcd6f1d55992f26d9ff7b0bd4ee6b475eb43aa3f054d67d32e09f18b0065"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:639dd78ac09b144b0119076783cb64e1128cc8612243e9701d1503c816750b2e"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1cf59e0bb12e031a48bb628aae32df3d0c98fd6c759cb89f464b1047f0ca9c8"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e262398e5d51563093edf30612cd1e20fedd932ad0994697d7781ca4880cdc3d"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:59701118c7d8842e451f1e562d08e8708b3f5d14974eefbce9374badd723c4ae"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dea4a59da7850192fdead9da888e6b96166e90608cf39e17b503f45826b16f84"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4575da95fc441244a0e2ebaf33a2b2f74164603341d2046b5cde0a9aa86aa7e2"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:812726266ab96de681f2c7dbd6b734d327f493a78357fcc16b2ac86ff4f4e080"}, - {file = "psycopg_binary-3.1.18-cp37-cp37m-win_amd64.whl", hash = "sha256:3e7ce4d988112ca6c75765c7f24c83bdc476a6a5ce00878df6c140ca32c3e16d"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:02bd4da45d5ee9941432e2e9bf36fa71a3ac21c6536fe7366d1bd3dd70d6b1e7"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39242546383f6b97032de7af30edb483d237a0616f6050512eee7b218a2aa8ee"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d46ae44d66bf6058a812467f6ae84e4e157dee281bfb1cfaeca07dee07452e85"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad35ac7fd989184bf4d38a87decfb5a262b419e8ba8dcaeec97848817412c64a"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:247474af262bdd5559ee6e669926c4f23e9cf53dae2d34c4d991723c72196404"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ebecbf2406cd6875bdd2453e31067d1bd8efe96705a9489ef37e93b50dc6f09"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1859aeb2133f5ecdd9cbcee155f5e38699afc06a365f903b1512c765fd8d457e"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:da917f6df8c6b2002043193cb0d74cc173b3af7eb5800ad69c4e1fbac2a71c30"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9e24e7b6a68a51cc3b162d0339ae4e1263b253e887987d5c759652f5692b5efe"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e252d66276c992319ed6cd69a3ffa17538943954075051e992143ccbf6dc3d3e"}, - {file = "psycopg_binary-3.1.18-cp38-cp38-win_amd64.whl", hash = "sha256:5d6e860edf877d4413e4a807e837d55e3a7c7df701e9d6943c06e460fa6c058f"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eea5f14933177ffe5c40b200f04f814258cc14b14a71024ad109f308e8bad414"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:824a1bfd0db96cc6bef2d1e52d9e0963f5bf653dd5bc3ab519a38f5e6f21c299"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87e9eeb80ce8ec8c2783f29bce9a50bbcd2e2342a340f159c3326bf4697afa1"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91074f78a9f890af5f2c786691575b6b93a4967ad6b8c5a90101f7b8c1a91d9c"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e05f6825f8db4428782135e6986fec79b139210398f3710ed4aa6ef41473c008"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f68ac2364a50d4cf9bb803b4341e83678668f1881a253e1224574921c69868c"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7ac1785d67241d5074f8086705fa68e046becea27964267ab3abd392481d7773"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:cd2a9f7f0d4dacc5b9ce7f0e767ae6cc64153264151f50698898c42cabffec0c"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:3e4b0bb91da6f2238dbd4fbb4afc40dfb4f045bb611b92fce4d381b26413c686"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:74e498586b72fb819ca8ea82107747d0cb6e00ae685ea6d1ab3f929318a8ce2d"}, - {file = "psycopg_binary-3.1.18-cp39-cp39-win_amd64.whl", hash = "sha256:d4422af5232699f14b7266a754da49dc9bcd45eba244cf3812307934cd5d6679"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:17ab2b4c2722138b7a6eb42d139ad8e5fed792574c1069f27abf8f8ebb0d7f75"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:063f5a56ccab2b9eef58f55437cff78c59c5562ebb5f7453ecd480f038b045dc"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70632c9687731c8d0c9c72fbb73893e82ba4a2cdc8ffdd4c5bbcef51cc9c6b16"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebca1fd4b59523e3127eba7257bf764e80cddd9444b7f0d2870210ffc80ac688"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2371822bc0b35ad735298964d531f95e59cfa2d31b87408f7d63ae78173279c"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b1cd14d99d358483c665355eebb650f5e76f2d41c942fe6d0836b0fe76fbf0"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:82369aa7cfbff19d65182698ee542af75d90c27284201d718f54f7b52480f730"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:00ba447b23daaacd9391c6a7ee0781e0860af72d0742c4d261df07940d601e29"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0ccff5f988345dad22146f165e4395b37b9f4f3e3dd42eedad6627e791a8c8b4"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:82e9ee9943da44a08f737d80c9b3878f9d4916a947cf182cd183f81e825cc41d"}, + {file = "psycopg_binary-3.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:26b1b7e39fa5139f99cb02a186dfa447c41f7e55c0aebb5f2da6ddf5b6ec5b32"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d001950bcabb725e003609073b83678962e9308e0b194a5227d6758ba8d46e0"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:57acabe70587b65471b9f42593ec9bb17d317118e0dbe92d7173f0a75939150a"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93f3937f293a30310501204bf0833704283675a8819a395bea8e352a5abaee84"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a3fb7cd7da15157bf63792db7346dfe2a07e3bc6ff702c7e8a76719e6efca0"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0350ba9a14295b266fba83d5a691511bf4ceb5df863973b525230fd15fd483f2"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de12375a49e70a6ac52431aa92b9c2e4ca01fea4fa872b4cd31e19028e3095d7"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33bb035e6f9b4911291472d6b5386b283fc835b97d2b1dc57f2ff82f777cb9f2"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ed59c833678b55932f78aa60e85691b40fd7d2058ad60ca369fc4f908218c688"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b404c1a091dd034254694ae56111c69f07d54419c5436366c5b3af2aac9dce04"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:25a3527a26b7589434a3eb52ad32b1f67e1af034cb17bd36a77344896d54b403"}, + {file = "psycopg_binary-3.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:f5a2ebd0772c059e521b70a826a11b962fcba465b001fd655ca6aba10dc9432d"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:76e55ec30b3947b921f267795ffd2f433c65fc8a41adc4939fd9ccfb0f5b0322"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff4c97a04eeb11d54d4c8ca22459e2cca9a423e7f397c29ae311c6e7c784d49"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d1c97a7c57e83b55172b585702744cd6bdad37c7a18cabdf55ba1e5a66ce476"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b394542a8b0706102a86c7006978848cf1748f4191e0e0e32b1f814b63ae7d68"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6a10440bc02ed3a0ac1cb2d61e117273ce20e3d103061452acc7ed2c9a89e53"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8eee57667fdd8a1cd8c4c2dc7350914267baf4d699690d44e439df9ae9148e7a"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fd35ddbbfbe3cbe00a2b578defc7365e5e047e4fa9b803659bd4e8c3962069e7"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e7f1d2dc575b00d951317b788a2244fdfcdd1503221ebc7e479220f6e3414aa4"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:359b2056e1203010c0044c12a3f933d522c613d7ee280d84be3643458f416796"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:532b5c8a9ec70173812fbba26bbd5cf57c0f1c680907d637ddbb1be15dbf89d7"}, + {file = "psycopg_binary-3.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:47e9d09b4f898eaf46cd2b7433f9e6faa935246a9d8983b4f88f0a46809abbd2"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3b280862c623616e0ced03602c98b44f51ab8cdaaad31f6b3523a2a68b2f92a4"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:add318f12dc2be4d8a817e70c38cfd23a2af80ff6f871089e63012b62bf96f00"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03994806e62e795b1b286c60bb5d23e1cc3982b06192e87ec4dff0a0f7c528e2"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77709be5dc45828ca06d9d87fa7b065720fb87b1aa3e72d44177562f1df50ad2"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d959a17ac2f1ff87a191786f66ae452791fbe73cee7375f2dafd2696e605a9"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:239e24fa33c6213320da0aee72d541e4780adb21753fc692337043c235118cf1"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d31c0523e0294e008d9031f2f2034a010f043ae8c7af0589d614b0bf6ed6e6aa"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a15c88f1695c8dc8b90625931fe86909c74f7770bad7312999ee6babb0143dcc"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3c02790afcc6d82d1b9d886d9323f955c5c998693966c4c1e6d0ff9a96276a1e"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1d2288a7f1d0dec1ccce50b4470751acb563689048752fdbf7a4a804df3a0e0d"}, + {file = "psycopg_binary-3.2.7-cp313-cp313-win_amd64.whl", hash = "sha256:c3781beaffb33fce17d8f137b003ebd930a7148eab2a1f60628e86c3d67884ea"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a1e4c873cf553276cfe28ae0ec9cd969c43ef722616d092f8b17b5d69fd5c839"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa2cef360f8fd108eb9100427914e814722e1ded4631d23304865c88e69f6bbf"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8b5133fdddfd0da76e72add375fc79eee5d741c32c99e602aecdaa543d2e3466"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ec1e7287d80a22d58030862e57389654fc618ae70eeeb54e1f82fe86454ad06"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a2e82ccee04feb93bf4fd41fc56b6a961611059b777c3187321c943242c9e4e"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e3ac59a0d067199d7d438d36248e31919987e69854db196f7133f0c89d4489a1"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:51a45bfd428a0af0f42838e4f744a39ddbddc1a131e89551e569a9ed4bfd97a6"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:93a6350514ad348327f6a5cfb6c8fe29ccba9b6cdb9ffea09bb4b57a27cca18d"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b44a2c5e85d047f1fe54dc297c128f7ef375435a6cf583886a8d701c75716cd4"}, + {file = "psycopg_binary-3.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:506db31c1e08e8fb8132e4dce7708fe9aeedc3908d3ed10a3ea76e463d6ea904"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:519d7d8f35c5392599a5f5ceb9ebaa50881024fb6ecd32ea55436c8e3cda27cc"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef399143d63bd67febe92b923dc6bd56bc8a9c3581a68bc8982eed75963ad169"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a34757170706c67be94b248db458d3602269828a067a84bdc536869d35fed5"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05a7265e80b362b93af2dbea0cd8828e6cbbb6daea97f2b0b4f29e61bd34b2e3"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2a9aa6ddfd6a8fb5756498ccb7a3a4f9cd87906d9e8ac36b69e116b7104b891"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69310b8dc1277556711f6818b75a92581ae6c3cd2ca3c9c0798caf15976a8562"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73349f876b7288200c576c5c14b29c5f3266fb30598c3723dc57cfe05adf3121"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a8d3c8df6eb652e8140b24941b4da8bd07bfa7564101e9dee496a28683f7c2f8"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2321b6edfb4ca38a3446d5e88abe9ce78c04fc616d05a598ffe7cc5e2535c1fc"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2cf25feb92dceb5739dd029a047664a02f5df25a5e086d577cae810daf6a302a"}, + {file = "psycopg_binary-3.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:ac0b823a0b199d36e0570d5d2a1154ae767073907496a2e436a236e388fc0c97"}, ] [[package]] @@ -1518,223 +1575,156 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] tests = ["pytest"] -[[package]] -name = "pyarrow" -version = "15.0.1" -description = "Python library for Apache Arrow" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyarrow-15.0.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c2ddb3be5ea938c329a84171694fc230b241ce1b6b0ff1a0280509af51c375fa"}, - {file = "pyarrow-15.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7543ea88a0ff72f8e6baaf9bfdbec2c62aeabdbede9e4a571c71cc3bc43b6302"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1519e218a6941fc074e4501088d891afcb2adf77c236e03c34babcf3d6a0d1c7"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28cafa86e1944761970d3b3fc0411b14ff9b5c2b73cd22aaf470d7a3976335f5"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:be5c3d463e33d03eab496e1af7916b1d44001c08f0f458ad27dc16093a020638"}, - {file = "pyarrow-15.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:47b1eda15d3aa3f49a07b1808648e1397e5dc6a80a30bf87faa8e2d02dad7ac3"}, - {file = "pyarrow-15.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e524a31be7db22deebbbcf242b189063ab9a7652c62471d296b31bc6e3cae77b"}, - {file = "pyarrow-15.0.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:a476fefe8bdd56122fb0d4881b785413e025858803cc1302d0d788d3522b374d"}, - {file = "pyarrow-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:309e6191be385f2e220586bfdb643f9bb21d7e1bc6dd0a6963dc538e347b2431"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83bc586903dbeb4365cbc72b602f99f70b96c5882e5dfac5278813c7d624ca3c"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07e652daac6d8b05280cd2af31c0fb61a4490ec6a53dc01588014d9fa3fdbee9"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:abad2e08652df153a72177ce20c897d083b0c4ebeec051239e2654ddf4d3c996"}, - {file = "pyarrow-15.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cde663352bc83ad75ba7b3206e049ca1a69809223942362a8649e37bd22f9e3b"}, - {file = "pyarrow-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1b6e237dd7a08482a8b8f3f6512d258d2460f182931832a8c6ef3953203d31e1"}, - {file = "pyarrow-15.0.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd167536ee23192760b8c731d39b7cfd37914c27fd4582335ffd08450ff799d"}, - {file = "pyarrow-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c08bb31eb2984ba5c3747d375bb522e7e536b8b25b149c9cb5e1c49b0ccb736"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0f9c1d630ed2524bd1ddf28ec92780a7b599fd54704cd653519f7ff5aec177a"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5186048493395220550bca7b524420471aac2d77af831f584ce132680f55c3df"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:31dc30c7ec8958da3a3d9f31d6c3630429b2091ede0ecd0d989fd6bec129f0e4"}, - {file = "pyarrow-15.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3f111a014fb8ac2297b43a74bf4495cc479a332908f7ee49cb7cbd50714cb0c1"}, - {file = "pyarrow-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a6d1f7c15d7f68f08490d0cb34611497c74285b8a6bbeab4ef3fc20117310983"}, - {file = "pyarrow-15.0.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:9ad931b996f51c2f978ed517b55cb3c6078272fb4ec579e3da5a8c14873b698d"}, - {file = "pyarrow-15.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:738f6b53ab1c2f66b2bde8a1d77e186aeaab702d849e0dfa1158c9e2c030add3"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c1c3fc16bc74e33bf8f1e5a212938ed8d88e902f372c4dac6b5bad328567d2f"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1fa92512128f6c1b8dde0468c1454dd70f3bff623970e370d52efd4d24fd0be"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b4157f307c202cbbdac147d9b07447a281fa8e63494f7fc85081da351ec6ace9"}, - {file = "pyarrow-15.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:b75e7da26f383787f80ad76143b44844ffa28648fcc7099a83df1538c078d2f2"}, - {file = "pyarrow-15.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:3a99eac76ae14096c209850935057b9e8ce97a78397c5cde8724674774f34e5d"}, - {file = "pyarrow-15.0.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:dd532d3177e031e9b2d2df19fd003d0cc0520d1747659fcabbd4d9bb87de508c"}, - {file = "pyarrow-15.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce8c89848fd37e5313fc2ce601483038ee5566db96ba0808d5883b2e2e55dc53"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:862eac5e5f3b6477f7a92b2f27e560e1f4e5e9edfca9ea9da8a7478bb4abd5ce"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f0ea3a29cd5cb99bf14c1c4533eceaa00ea8fb580950fb5a89a5c771a994a4e"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:bb902f780cfd624b2e8fd8501fadab17618fdb548532620ef3d91312aaf0888a"}, - {file = "pyarrow-15.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:4f87757f02735a6bb4ad2e1b98279ac45d53b748d5baf52401516413007c6999"}, - {file = "pyarrow-15.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:efd3816c7fbfcbd406ac0f69873cebb052effd7cdc153ae5836d1b00845845d7"}, - {file = "pyarrow-15.0.1.tar.gz", hash = "sha256:21d812548d39d490e0c6928a7c663f37b96bf764034123d4b4ab4530ecc757a9"}, -] - -[package.dependencies] -numpy = ">=1.16.6,<2" - [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pycryptodome" -version = "3.20.0" -description = "Cryptographic library for Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, - {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, - {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, - {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, - {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, - {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, - {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, - {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, - {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, - {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, - {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, - {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, - {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, - {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, - {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, - {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, - {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, - {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, - {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, - {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, - {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, - {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, - {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, - {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, - {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, - {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, - {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, - {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, - {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, - {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, - {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, - {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pydantic" -version = "2.6.4" +version = "2.11.4" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pydantic-2.6.4-py3-none-any.whl", hash = "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5"}, - {file = "pydantic-2.6.4.tar.gz", hash = "sha256:b1704e0847db01817624a6b86766967f552dd9dbf3afba4004409f908dcc84e6"}, + {file = "pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb"}, + {file = "pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.16.3" -typing-extensions = ">=4.6.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.16.3" -description = "" +version = "2.33.2" +description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pydantic_core-2.16.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:75b81e678d1c1ede0785c7f46690621e4c6e63ccd9192af1f0bd9d504bbb6bf4"}, - {file = "pydantic_core-2.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c865a7ee6f93783bd5d781af5a4c43dadc37053a5b42f7d18dc019f8c9d2bd1"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:162e498303d2b1c036b957a1278fa0899d02b2842f1ff901b6395104c5554a45"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f583bd01bbfbff4eaee0868e6fc607efdfcc2b03c1c766b06a707abbc856187"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b926dd38db1519ed3043a4de50214e0d600d404099c3392f098a7f9d75029ff8"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:716b542728d4c742353448765aa7cdaa519a7b82f9564130e2b3f6766018c9ec"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ad7f7ee1a13d9cb49d8198cd7d7e3aa93e425f371a68235f784e99741561f"}, - {file = "pydantic_core-2.16.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd87f48924f360e5d1c5f770d6155ce0e7d83f7b4e10c2f9ec001c73cf475c99"}, - {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0df446663464884297c793874573549229f9eca73b59360878f382a0fc085979"}, - {file = "pydantic_core-2.16.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4df8a199d9f6afc5ae9a65f8f95ee52cae389a8c6b20163762bde0426275b7db"}, - {file = "pydantic_core-2.16.3-cp310-none-win32.whl", hash = "sha256:456855f57b413f077dff513a5a28ed838dbbb15082ba00f80750377eed23d132"}, - {file = "pydantic_core-2.16.3-cp310-none-win_amd64.whl", hash = "sha256:732da3243e1b8d3eab8c6ae23ae6a58548849d2e4a4e03a1924c8ddf71a387cb"}, - {file = "pydantic_core-2.16.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:519ae0312616026bf4cedc0fe459e982734f3ca82ee8c7246c19b650b60a5ee4"}, - {file = "pydantic_core-2.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b3992a322a5617ded0a9f23fd06dbc1e4bd7cf39bc4ccf344b10f80af58beacd"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d62da299c6ecb04df729e4b5c52dc0d53f4f8430b4492b93aa8de1f541c4aac"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2acca2be4bb2f2147ada8cac612f8a98fc09f41c89f87add7256ad27332c2fda"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b662180108c55dfbf1280d865b2d116633d436cfc0bba82323554873967b340"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7c6ed0dc9d8e65f24f5824291550139fe6f37fac03788d4580da0d33bc00c97"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1bb0827f56654b4437955555dc3aeeebeddc47c2d7ed575477f082622c49e"}, - {file = "pydantic_core-2.16.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e56f8186d6210ac7ece503193ec84104da7ceb98f68ce18c07282fcc2452e76f"}, - {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:936e5db01dd49476fa8f4383c259b8b1303d5dd5fb34c97de194560698cc2c5e"}, - {file = "pydantic_core-2.16.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33809aebac276089b78db106ee692bdc9044710e26f24a9a2eaa35a0f9fa70ba"}, - {file = "pydantic_core-2.16.3-cp311-none-win32.whl", hash = "sha256:ded1c35f15c9dea16ead9bffcde9bb5c7c031bff076355dc58dcb1cb436c4721"}, - {file = "pydantic_core-2.16.3-cp311-none-win_amd64.whl", hash = "sha256:d89ca19cdd0dd5f31606a9329e309d4fcbb3df860960acec32630297d61820df"}, - {file = "pydantic_core-2.16.3-cp311-none-win_arm64.whl", hash = "sha256:6162f8d2dc27ba21027f261e4fa26f8bcb3cf9784b7f9499466a311ac284b5b9"}, - {file = "pydantic_core-2.16.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f56ae86b60ea987ae8bcd6654a887238fd53d1384f9b222ac457070b7ac4cff"}, - {file = "pydantic_core-2.16.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9bd22a2a639e26171068f8ebb5400ce2c1bc7d17959f60a3b753ae13c632975"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4204e773b4b408062960e65468d5346bdfe139247ee5f1ca2a378983e11388a2"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f651dd19363c632f4abe3480a7c87a9773be27cfe1341aef06e8759599454120"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aaf09e615a0bf98d406657e0008e4a8701b11481840be7d31755dc9f97c44053"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e47755d8152c1ab5b55928ab422a76e2e7b22b5ed8e90a7d584268dd49e9c6b"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:500960cb3a0543a724a81ba859da816e8cf01b0e6aaeedf2c3775d12ee49cade"}, - {file = "pydantic_core-2.16.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf6204fe865da605285c34cf1172879d0314ff267b1c35ff59de7154f35fdc2e"}, - {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d33dd21f572545649f90c38c227cc8631268ba25c460b5569abebdd0ec5974ca"}, - {file = "pydantic_core-2.16.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49d5d58abd4b83fb8ce763be7794d09b2f50f10aa65c0f0c1696c677edeb7cbf"}, - {file = "pydantic_core-2.16.3-cp312-none-win32.whl", hash = "sha256:f53aace168a2a10582e570b7736cc5bef12cae9cf21775e3eafac597e8551fbe"}, - {file = "pydantic_core-2.16.3-cp312-none-win_amd64.whl", hash = "sha256:0d32576b1de5a30d9a97f300cc6a3f4694c428d956adbc7e6e2f9cad279e45ed"}, - {file = "pydantic_core-2.16.3-cp312-none-win_arm64.whl", hash = "sha256:ec08be75bb268473677edb83ba71e7e74b43c008e4a7b1907c6d57e940bf34b6"}, - {file = "pydantic_core-2.16.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:b1f6f5938d63c6139860f044e2538baeee6f0b251a1816e7adb6cbce106a1f01"}, - {file = "pydantic_core-2.16.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2a1ef6a36fdbf71538142ed604ad19b82f67b05749512e47f247a6ddd06afdc7"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704d35ecc7e9c31d48926150afada60401c55efa3b46cd1ded5a01bdffaf1d48"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d937653a696465677ed583124b94a4b2d79f5e30b2c46115a68e482c6a591c8a"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9803edf8e29bd825f43481f19c37f50d2b01899448273b3a7758441b512acf8"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72282ad4892a9fb2da25defeac8c2e84352c108705c972db82ab121d15f14e6d"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f752826b5b8361193df55afcdf8ca6a57d0232653494ba473630a83ba50d8c9"}, - {file = "pydantic_core-2.16.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4384a8f68ddb31a0b0c3deae88765f5868a1b9148939c3f4121233314ad5532c"}, - {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4b2bf78342c40b3dc830880106f54328928ff03e357935ad26c7128bbd66ce8"}, - {file = "pydantic_core-2.16.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13dcc4802961b5f843a9385fc821a0b0135e8c07fc3d9949fd49627c1a5e6ae5"}, - {file = "pydantic_core-2.16.3-cp38-none-win32.whl", hash = "sha256:e3e70c94a0c3841e6aa831edab1619ad5c511199be94d0c11ba75fe06efe107a"}, - {file = "pydantic_core-2.16.3-cp38-none-win_amd64.whl", hash = "sha256:ecdf6bf5f578615f2e985a5e1f6572e23aa632c4bd1dc67f8f406d445ac115ed"}, - {file = "pydantic_core-2.16.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bda1ee3e08252b8d41fa5537413ffdddd58fa73107171a126d3b9ff001b9b820"}, - {file = "pydantic_core-2.16.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:21b888c973e4f26b7a96491c0965a8a312e13be108022ee510248fe379a5fa23"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be0ec334369316fa73448cc8c982c01e5d2a81c95969d58b8f6e272884df0074"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5b6079cc452a7c53dd378c6f881ac528246b3ac9aae0f8eef98498a75657805"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee8d5f878dccb6d499ba4d30d757111847b6849ae07acdd1205fffa1fc1253c"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7233d65d9d651242a68801159763d09e9ec96e8a158dbf118dc090cd77a104c9"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6119dc90483a5cb50a1306adb8d52c66e447da88ea44f323e0ae1a5fcb14256"}, - {file = "pydantic_core-2.16.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:578114bc803a4c1ff9946d977c221e4376620a46cf78da267d946397dc9514a8"}, - {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d8f99b147ff3fcf6b3cc60cb0c39ea443884d5559a30b1481e92495f2310ff2b"}, - {file = "pydantic_core-2.16.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4ac6b4ce1e7283d715c4b729d8f9dab9627586dafce81d9eaa009dd7f25dd972"}, - {file = "pydantic_core-2.16.3-cp39-none-win32.whl", hash = "sha256:e7774b570e61cb998490c5235740d475413a1f6de823169b4cf94e2fe9e9f6b2"}, - {file = "pydantic_core-2.16.3-cp39-none-win_amd64.whl", hash = "sha256:9091632a25b8b87b9a605ec0e61f241c456e9248bfdcf7abdf344fdb169c81cf"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:36fa178aacbc277bc6b62a2c3da95226520da4f4e9e206fdf076484363895d2c"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dcca5d2bf65c6fb591fff92da03f94cd4f315972f97c21975398bd4bd046854a"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a72fb9963cba4cd5793854fd12f4cfee731e86df140f59ff52a49b3552db241"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60cc1a081f80a2105a59385b92d82278b15d80ebb3adb200542ae165cd7d183"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cbcc558401de90a746d02ef330c528f2e668c83350f045833543cd57ecead1ad"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:fee427241c2d9fb7192b658190f9f5fd6dfe41e02f3c1489d2ec1e6a5ab1e04a"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f4cb85f693044e0f71f394ff76c98ddc1bc0953e48c061725e540396d5c8a2e1"}, - {file = "pydantic_core-2.16.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b29eeb887aa931c2fcef5aa515d9d176d25006794610c264ddc114c053bf96fe"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a425479ee40ff021f8216c9d07a6a3b54b31c8267c6e17aa88b70d7ebd0e5e5b"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5c5cbc703168d1b7a838668998308018a2718c2130595e8e190220238addc96f"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b6add4c0b39a513d323d3b93bc173dac663c27b99860dd5bf491b240d26137"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f76ee558751746d6a38f89d60b6228fa174e5172d143886af0f85aa306fd89"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:00ee1c97b5364b84cb0bd82e9bbf645d5e2871fb8c58059d158412fee2d33d8a"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:287073c66748f624be4cef893ef9174e3eb88fe0b8a78dc22e88eca4bc357ca6"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ed25e1835c00a332cb10c683cd39da96a719ab1dfc08427d476bce41b92531fc"}, - {file = "pydantic_core-2.16.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:86b3d0033580bd6bbe07590152007275bd7af95f98eaa5bd36f3da219dcd93da"}, - {file = "pydantic_core-2.16.3.tar.gz", hash = "sha256:1cac689f80a3abab2d3c0048b29eea5751114054f032a941a32de4c852c59cad"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, ] [package.dependencies] @@ -1742,42 +1732,60 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" -version = "2.17.2" +version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyjwt" +version = "2.9.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "pymilvus" -version = "2.3.7" +version = "2.4.9" description = "Python Sdk for Milvus" optional = false python-versions = ">=3.8" files = [ - {file = "pymilvus-2.3.7-py3-none-any.whl", hash = "sha256:37d5a360d671c6fe23fe1dd4e6b41af6e4b6d6488ad8e43a06afe23d02f98272"}, - {file = "pymilvus-2.3.7.tar.gz", hash = "sha256:b8df5b8db3a82209c33b7211e0b9ef4a63ee00cb2976ccb1e9f5b92a2c2d5b82"}, + {file = "pymilvus-2.4.9-py3-none-any.whl", hash = "sha256:45313607d2c164064bdc44e0f933cb6d6afa92e9efcc7f357c5240c57db58fbe"}, + {file = "pymilvus-2.4.9.tar.gz", hash = "sha256:0937663700007c23a84cfc0656160b301f6ff9247aaec4c96d599a6b43572136"}, ] [package.dependencies] -azure-storage-blob = "*" environs = "<=9.5.0" -grpcio = ">=1.49.1,<=1.60.0" -minio = ">=7.0.0" +grpcio = ">=1.49.1" +milvus-lite = {version = ">=2.4.0,<2.5.0", markers = "sys_platform != \"win32\""} pandas = ">=1.2.4" protobuf = ">=3.20.0" -pyarrow = ">=12.0.0" -requests = "*" -setuptools = ">=67" +setuptools = ">69" ujson = ">=2.0.0" +[package.extras] +bulk-writer = ["azure-storage-blob", "minio (>=7.0.0)", "pyarrow (>=12.0.0)", "requests"] +dev = ["black", "grpcio (==1.62.2)", "grpcio-testing (==1.62.2)", "grpcio-tools (==1.62.2)", "pytest (>=5.3.4)", "pytest-cov (>=2.8.1)", "pytest-timeout (>=1.3.4)", "ruff (>0.4.0)"] +model = ["milvus-model (>=0.1.0)"] + [[package]] name = "pytest" version = "7.4.4" @@ -1816,13 +1824,13 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.1" +version = "1.1.0" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, + {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, + {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, ] [package.extras] @@ -1830,148 +1838,158 @@ cli = ["click (>=5.0)"] [[package]] name = "pytz" -version = "2024.1" +version = "2025.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, ] [[package]] name = "pywin32" -version = "306" +version = "310" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, + {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, + {file = "pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213"}, + {file = "pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd"}, + {file = "pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c"}, + {file = "pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582"}, + {file = "pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d"}, + {file = "pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060"}, + {file = "pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966"}, + {file = "pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab"}, + {file = "pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e"}, + {file = "pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33"}, + {file = "pywin32-310-cp38-cp38-win32.whl", hash = "sha256:0867beb8addefa2e3979d4084352e4ac6e991ca45373390775f7084cc0209b9c"}, + {file = "pywin32-310-cp38-cp38-win_amd64.whl", hash = "sha256:30f0a9b3138fb5e07eb4973b7077e1883f558e40c578c6925acc7a94c34eaa36"}, + {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, + {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "qdrant-client" -version = "1.8.0" +version = "1.14.2" description = "Client library for the Qdrant vector search engine" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "qdrant_client-1.8.0-py3-none-any.whl", hash = "sha256:fa28d3eb64c0c57ec029c7c85c71f6c72c197f92502022655741f3632c518e29"}, - {file = "qdrant_client-1.8.0.tar.gz", hash = "sha256:2a1a3f2cbacc7adba85644cf6cfdee20401cf25764b32da479c81fb63e178d15"}, + {file = "qdrant_client-1.14.2-py3-none-any.whl", hash = "sha256:7c283b1f0e71db9c21b85d898fb395791caca2a6d56ee751da96d797b001410c"}, + {file = "qdrant_client-1.14.2.tar.gz", hash = "sha256:da5cab4d367d099d1330b6f30d45aefc8bd76f8b8f9d8fa5d4f813501b93af0d"}, ] [package.dependencies] grpcio = ">=1.41.0" -grpcio-tools = ">=1.41.0" -httpx = {version = ">=0.14.0", extras = ["http2"]} -numpy = {version = ">=1.21", markers = "python_version >= \"3.8\" and python_version < \"3.12\""} +httpx = {version = ">=0.20.0", extras = ["http2"]} +numpy = [ + {version = ">=1.21", markers = "python_version >= \"3.10\" and python_version < \"3.12\""}, + {version = ">=1.21,<2.1.0", markers = "python_version < \"3.10\""}, + {version = ">=1.26", markers = "python_version == \"3.12\""}, +] portalocker = ">=2.7.0,<3.0.0" -pydantic = ">=1.10.8" +protobuf = ">=3.20.0" +pydantic = ">=1.10.8,<2.0.dev0 || >2.2.0" urllib3 = ">=1.26.14,<3" [package.extras] -fastembed = ["fastembed (==0.2.2)"] +fastembed = ["fastembed (==0.6.1)"] +fastembed-gpu = ["fastembed-gpu (==0.6.1)"] [[package]] name = "redis" -version = "5.0.3" +version = "5.3.0" description = "Python client for Redis database and key-value store" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "redis-5.0.3-py3-none-any.whl", hash = "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d"}, - {file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"}, + {file = "redis-5.3.0-py3-none-any.whl", hash = "sha256:f1deeca1ea2ef25c1e4e46b07f4ea1275140526b1feea4c6459c0ec27a10ef83"}, + {file = "redis-5.3.0.tar.gz", hash = "sha256:8d69d2dde11a12dc85d0dbf5c45577a5af048e2456f7077d87ad35c1c81c310e"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} +PyJWT = ">=2.9.0,<2.10.0" [package.extras] -hiredis = ["hiredis (>=1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1986,29 +2004,33 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "setuptools" -version = "69.2.0" +version = "80.3.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, - {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, + {file = "setuptools-80.3.1-py3-none-any.whl", hash = "sha256:ea8e00d7992054c4c592aeb892f6ad51fe1b4d90cc6947cc45c45717c40ec537"}, + {file = "setuptools-80.3.1.tar.gz", hash = "sha256:31e2c58dbb67c99c289f51c16d899afedae292b978f8051efaf6262d8212f927"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -2053,49 +2075,80 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] name = "tqdm" -version = "4.66.2" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, - {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.2" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.2-py3-none-any.whl", hash = "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80"}, - {file = "traitlets-5.14.2.tar.gz", hash = "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.1)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typer" @@ -2119,15 +2172,29 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6. [[package]] name = "typing-extensions" -version = "4.10.0" +version = "4.13.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.0" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +files = [ + {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, + {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "typish" version = "1.9.3" @@ -2143,98 +2210,111 @@ test = ["codecov", "coverage", "mypy", "nptyping (>=1.3.0)", "numpy", "pycodesty [[package]] name = "tzdata" -version = "2024.1" +version = "2025.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, ] [[package]] name = "ujson" -version = "5.9.0" +version = "5.10.0" description = "Ultra fast JSON encoder and decoder for Python" optional = false python-versions = ">=3.8" files = [ - {file = "ujson-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa"}, - {file = "ujson-5.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d"}, - {file = "ujson-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124"}, - {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106"}, - {file = "ujson-5.9.0-cp310-cp310-win32.whl", hash = "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c"}, - {file = "ujson-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f"}, - {file = "ujson-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b"}, - {file = "ujson-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d"}, - {file = "ujson-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b"}, - {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d"}, - {file = "ujson-5.9.0-cp311-cp311-win32.whl", hash = "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120"}, - {file = "ujson-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99"}, - {file = "ujson-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c"}, - {file = "ujson-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e"}, - {file = "ujson-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01"}, - {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c"}, - {file = "ujson-5.9.0-cp312-cp312-win32.whl", hash = "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437"}, - {file = "ujson-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c"}, - {file = "ujson-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c"}, - {file = "ujson-5.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402"}, - {file = "ujson-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd"}, - {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b"}, - {file = "ujson-5.9.0-cp38-cp38-win32.whl", hash = "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d"}, - {file = "ujson-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30"}, - {file = "ujson-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81"}, - {file = "ujson-5.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f"}, - {file = "ujson-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60"}, - {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844"}, - {file = "ujson-5.9.0-cp39-cp39-win32.whl", hash = "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34"}, - {file = "ujson-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd"}, - {file = "ujson-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378"}, - {file = "ujson-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21"}, - {file = "ujson-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd"}, - {file = "ujson-5.9.0.tar.gz", hash = "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] [[package]] name = "urllib3" -version = "2.2.1" +version = "2.4.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, + {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, ] [package.extras] @@ -2245,35 +2325,27 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "validators" -version = "0.22.0" +version = "0.33.0" description = "Python Data Validation for Humans™" optional = false python-versions = ">=3.8" files = [ - {file = "validators-0.22.0-py3-none-any.whl", hash = "sha256:61cf7d4a62bbae559f2e54aed3b000cea9ff3e2fdbe463f51179b92c58c9585a"}, - {file = "validators-0.22.0.tar.gz", hash = "sha256:77b2689b172eeeb600d9605ab86194641670cdb73b60afd577142a9397873370"}, + {file = "validators-0.33.0-py3-none-any.whl", hash = "sha256:134b586a98894f8139865953899fc2daeb3d0c35569552c5518f089ae43ed075"}, + {file = "validators-0.33.0.tar.gz", hash = "sha256:535867e9617f0100e676a1257ba1e206b9bfd847ddc171e4d44811f07ff0bfbf"}, ] [package.extras] -docs-offline = ["myst-parser (>=2.0.0)", "pypandoc-binary (>=1.11)", "sphinx (>=7.1.1)"] -docs-online = ["mkdocs (>=1.5.2)", "mkdocs-git-revision-date-localized-plugin (>=1.2.0)", "mkdocs-material (>=9.2.6)", "mkdocstrings[python] (>=0.22.0)", "pyaml (>=23.7.0)"] -hooks = ["pre-commit (>=3.3.3)"] -package = ["build (>=1.0.0)", "twine (>=4.0.2)"] -runner = ["tox (>=4.11.1)"] -sast = ["bandit[toml] (>=1.7.5)"] -testing = ["pytest (>=7.4.0)"] -tooling = ["black (>=23.7.0)", "pyright (>=1.1.325)", "ruff (>=0.0.287)"] -tooling-extras = ["pyaml (>=23.7.0)", "pypandoc-binary (>=1.11)", "pytest (>=7.4.0)"] +crypto-eth-addresses = ["eth-hash[pycryptodome] (>=0.7.0)"] [[package]] name = "virtualenv" -version = "20.25.1" +version = "20.31.1" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, - {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, + {file = "virtualenv-20.31.1-py3-none-any.whl", hash = "sha256:f448cd2f1604c831afb9ea238021060be2c0edbcad8eb0a4e8b4e14ff11a5482"}, + {file = "virtualenv-20.31.1.tar.gz", hash = "sha256:65442939608aeebb9284cd30baca5865fcd9f12b58bb740a24b220030df46d26"}, ] [package.dependencies] @@ -2282,7 +2354,7 @@ filelock = ">=3.12.2,<4" platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] @@ -2298,13 +2370,13 @@ files = [ [[package]] name = "weaviate-client" -version = "4.5.3" +version = "4.6.7" description = "A python native Weaviate client" optional = false python-versions = ">=3.8" files = [ - {file = "weaviate-client-4.5.3.tar.gz", hash = "sha256:56578f6ed84278851a3a3abb7b578367d5e7e66dfad2b114e0dc1caa4a26b141"}, - {file = "weaviate_client-4.5.3-py3-none-any.whl", hash = "sha256:fdd317c860c5cc2a428e954b6196c15ab96a4b545557eda970f8ba3fdd662b8c"}, + {file = "weaviate_client-4.6.7-py3-none-any.whl", hash = "sha256:8793de35264cab33a84fe8cb8c422a257fe4d8334657aaddd8ead853da3fb34a"}, + {file = "weaviate_client-4.6.7.tar.gz", hash = "sha256:202b32e160536f5f44e4a635d30c3d3a0790b1a7ff997f5e243919d1ac5b68a1"}, ] [package.dependencies] @@ -2312,12 +2384,12 @@ authlib = ">=1.2.1,<2.0.0" grpcio = ">=1.57.0,<2.0.0" grpcio-health-checking = ">=1.57.0,<2.0.0" grpcio-tools = ">=1.57.0,<2.0.0" -httpx = "0.27.0" +httpx = ">=0.25.0,<=0.27.0" pydantic = ">=2.5.0,<3.0.0" requests = ">=2.30.0,<3.0.0" -validators = "0.22.0" +validators = "0.33.0" [metadata] lock-version = "2.0" -python-versions = ">=3.9,<3.12" -content-hash = "2cd84469db2650a089454f7537304f184f3e7df8b60e32f53e33cd98f1921b4a" +python-versions = ">=3.9,<3.13" +content-hash = "35934bef23a858f8c9079f65b49782759e233d31723ed87326cf39ee2816795f" diff --git a/pyproject.toml b/pyproject.toml index 7b245e57..3b09c156 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,17 +2,18 @@ name = "vector-db-benchmark" version = "0.1.0" description = "" -authors = ["Kacper Łukawski "] +authors = ["Qdrant Team "] +package-mode = false [tool.poetry.dependencies] -python = ">=3.9,<3.12" -qdrant-client = "^1.8.0" +python = ">=3.9,<3.13" +qdrant-client = "^1.11.0" typer = "^0.6.1" jsons = "^1.6.3" h5py = "^3.7.0" -weaviate-client = "^4.5.0" +weaviate-client = ">= 4.5, < 4.7" elasticsearch = "^8.10.0" -pymilvus = "^2.3.1" +pymilvus = "^2.4.1" redis = "^5.0.1" ipdb = "^0.13.9" stopit = "^1.1.2" @@ -23,8 +24,7 @@ psycopg = {extras = ["binary"], version = "^3.1.17"} pgvector = "^0.2.4" ml-dtypes = "^0.4.0" - -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pre-commit = "^2.20.0" pytest = "^7.1" diff --git a/run.py b/run.py index 5a33d288..d4673fbd 100644 --- a/run.py +++ b/run.py @@ -1,6 +1,6 @@ import fnmatch import traceback -from typing import List +from typing import List, Optional import stopit import typer @@ -21,17 +21,21 @@ def run( host: str = "localhost", skip_upload: bool = False, skip_search: bool = False, - skip_if_exists: bool = True, + skip_if_exists: bool = False, exit_on_error: bool = True, timeout: float = 86400.0, + skip_configure: Optional[bool] = False, upload_start_idx: int = 0, upload_end_idx: int = -1, queries: int = typer.Option(-1, help="Number of queries to run. If the available queries are fewer, they will be reused."), ef_runtime: List[int] = typer.Option([], help="Filter search experiments by ef runtime values. Only experiments with these ef values will be run."), ): """ - Example: - python3 run.py --engines *-m-16-* --engines qdrant-* --datasets glove-* + Examples: + + python3 run.py --engines "qdrant-rps-m-*-ef-*" --datasets "dbpedia-openai-100K-1536-angular" # Qdrant RPS mode + + python3 run.py --engines "*-m-*-ef-*" --datasets "glove-*" # All engines and their configs for glove datasets """ all_engines = read_engine_configs() all_datasets = read_dataset_config() @@ -52,21 +56,22 @@ def run( for dataset_name, dataset_config in selected_datasets.items(): print(f"Running experiment: {engine_name} - {dataset_name}") client = ClientFactory(host).build_client(engine_config) - dataset = Dataset( - dataset_config, - skip_upload, - skip_search, - upload_start_idx, - upload_end_idx, - ) - dataset.download() try: + + dataset = Dataset(dataset_config) + if dataset.config.type == "sparse" and not client.sparse_vector_support: + raise IncompatibilityError( + f"{client.name} engine does not support sparse vectors" + ) + dataset.download() + with stopit.ThreadingTimeout(timeout) as tt: client.run_experiment( dataset, skip_upload, skip_search, skip_if_exists, + skip_configure, parallels, upload_start_idx, upload_end_idx, @@ -86,9 +91,11 @@ def run( ) exit(2) except IncompatibilityError as e: - print(f"Skipping {engine_name} - {dataset_name}, incompatible params") + print( + f"Skipping {engine_name} - {dataset_name}, incompatible params:", e + ) continue - except KeyboardInterrupt as e: + except KeyboardInterrupt: traceback.print_exc() exit(1) except Exception as e: diff --git a/scripts/process-benchmarks.ipynb b/scripts/process-benchmarks.ipynb index 08594905..2cf445de 100644 --- a/scripts/process-benchmarks.ipynb +++ b/scripts/process-benchmarks.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Notebook to process benchmar results\n", + "### Notebook to process benchmark results\n", "\n", "Please run this notebook after running all the benchmarks and storing them in the `results` dir. This will export them in the desired format for the single node benchmark plots of [qdrant.tech/benchmarks](https://qdrant.tech/benchmarks)" ] @@ -284,19 +284,22 @@ " match = PATH_REGEX.match(path.name)\n", " if match is None:\n", " continue\n", - " \n", + "\n", " experiment = match.groupdict()\n", - " \n", + "\n", " with open(path, \"r\") as fp:\n", " stats = json.load(fp)\n", "\n", " entry = [match[\"engine\"], match[\"m\"], match[\"ef\"], match[\"quant\"],\n", " match[\"dataset\"], match[\"search_index\"], match[\"date\"], \n", - " stats[\"params\"], stats[\"results\"]]\n", + " stats[\"params\"], stats[\"results\"]] " if experiment[\"operation\"] == \"search\":\n", + " entry.update({\"search_index\": match[\"search_index\"]})\n", " search_results.append(entry)\n", " elif experiment[\"operation\"] == \"upload\":\n", " upload_results.append(entry)\n", + " else:\n", + " raise Exception(\"Unknown operation\")\n", "\n", "len(upload_results), len(search_results)" ] @@ -419,18 +422,17 @@ } ], "source": [ - "upload_df = pd.DataFrame(upload_results, columns=column_names) \\\n", - " .drop(columns=\"search_index\")\n", + "upload_df = pd.DataFrame(upload_results)\n", "upload_df[\"date\"] = pd.to_datetime(upload_df[\"date\"], format=\"%Y-%m-%d-%H-%M-%S\")\n", "upload_df = upload_df.sort_values(\"date\", ascending=False) \\\n", " .groupby([\"engine\", \"m\", \"ef\", \"quant\", \"dataset\"]) \\\n", " .last()\n", "upload_df = pd.concat([upload_df, upload_df[\"results\"].apply(pd.Series)], axis=1)\n", - "upload_df = upload_df.drop(columns=\"results\")\n", + "upload_df = upload_df.drop(columns=\"results\") "\n", - "print(len(upload_df))\n", - "\n", - "upload_df.sort_values(\"total_time\", ascending=True).head(n=5)" + "temp_df = upload_df.copy()\n", + "temp_df[\"total_time\"] = temp_df[\"results\"].apply(lambda x: x[\"total_time\"])\n", + "temp_df.sort_values(\"total_time\", ascending=True).head(n=5)" ] }, { @@ -780,18 +782,15 @@ } ], "source": [ - "search_df = pd.DataFrame(search_results, columns=column_names)\n", + "search_df = pd.DataFrame(search_results)\n", "search_df[\"date\"] = pd.to_datetime(search_df[\"date\"], format=\"%Y-%m-%d-%H-%M-%S\")\n", "search_df = search_df.sort_values(\"date\", ascending=False) \\\n", " .groupby([\"engine\", \"m\", \"ef\", \"dataset\", \"quant\", \"search_index\"]) \\\n", " .first()\n", "\n", - "print(len(search_df))\n", - "\n", - "for column_name in [\"params\", \"results\"]:\n", - " search_df = pd.concat([search_df, search_df[column_name].apply(pd.Series)], axis=1)\n", - " search_df = search_df.drop(columns=column_name)\n", - "search_df.sort_values(\"rps\", ascending=False).head(n=10)" + "temp_df = search_df.copy()\n", + "temp_df['rps'] = temp_df['results'].apply(lambda x: x[\"rps\"])\n", + "temp_df.sort_values(\"rps\", ascending=False).head(n=10)" ] }, { @@ -889,50 +888,56 @@ } ], "source": [ - "json_all = []\n", - "json_1_or_100_thread = []\n", + "json_results = []\n", "\n", "for index, row in joined_df.reset_index().iterrows():\n", " engine_params = {}\n", - " if isinstance(row['search_params'], dict):\n", - " engine_params.update(row['search_params'])\n", - " if isinstance(row['params'], dict):\n", - " engine_params.update(row['params'])\n", + " \n", + " if isinstance(row['params_upload'], dict):\n", + " engine_params.update(row['params_upload'])\n", + " if isinstance(row['params_search'], dict):\n", + " search_params = row['params_search']\n", + " engine_params.update(search_params.get('config', {}))\n", + " engine_params.update(search_params.get('params', {}))\n", + " engine_params.update(search_params.get('search_params', {}))\n", + " engine_params.update(search_params.get('vectorIndexConfig', {}))\n", + "\n", + " engine_params.pop('experiment')\n", + " engine_params.pop('parallel')\n", "\n", " engine_name = row['engine']\n", "\n", - " if engine_name == \"qdrant-rps\" or engine_name == \"qdrant-bq-rps\" or engine_name == \"qdrant-sq-rps\":\n", + " if engine_name.startswith(\"qdrant-\"):\n", " engine_name = \"qdrant\"\n", "\n", " json_object = {\n", " \"engine_name\": engine_name,\n", - " \"setup_name\": f\"{row['engine']}-m-{row['m']}-ef-{row['ef']}\",\n", + " \"setup_name\": f\"{row['params_search']['experiment']}\",\n", " \"dataset_name\": row['dataset'],\n", - " # \"search_idx\": row['search_index'],\n", - " \"upload_time\": row['upload_time'],\n", - " \"total_upload_time\": row['total_time_upload'],\n", - " \"p95_time\": row['p95_time'],\n", - " \"rps\": row['rps'],\n", - " \"parallel\": row['parallel'],\n", - " \"p99_time\": row['p99_time'],\n", - " \"mean_time\": row['mean_time'],\n", - " \"mean_precisions\": row['mean_precisions'],\n", + " \"search_idx\": row['search_index'],\n", + " \"upload_time\": row['results_upload']['upload_time'],\n", + " \"total_upload_time\": row['results_upload']['total_time'],\n", + " \"p95_time\": row['results_search']['p95_time'],\n", + " \"rps\": row['results_search']['rps'],\n", + " \"parallel\": row['params_search']['parallel'],\n", + " \"p99_time\": row['results_search']['p99_time'],\n", + " \"mean_time\": row['results_search']['mean_time'],\n", + " \"mean_precisions\": row['results_search']['mean_precisions'],\n", " \"engine_params\": engine_params,\n", " }\n", - " json_all.append(json_object)\n", - " \n", - " parallel = row['parallel']\n", + " json_results.append(json_object)\n", "\n", - " if parallel == 1 or parallel == 100:\n", - " json_1_or_100_thread.append(json_object)\n", - "\n", - "format = '%Y-%M-%d' # T%H:%M:%S\n", + "format = '%Y-%M-%dT%H:%M:%S'\n", "now = datetime.now().replace(tzinfo=timezone.utc).strftime(format)\n", "\n", - "Path(f\"results-{now}.json\").write_text(json.dumps(json_all, indent=2))\n", - "Path(f\"results-1-100-threads-{now}.json\").write_text(json.dumps(json_1_or_100_thread, indent=2))\n", + "Path(\"results.json\").write_text(json.dumps(json_results, indent=2))\n", + "Path(f\"results-{now}.json\").write_text(json.dumps(json_results, indent=2))\n", + "\n", + "print(json_results[-1], len(json_results))\n", "\n", - "json_1_or_100_thread[-1], len(json_all), len(json_1_or_100_thread)" + "results_df = pd.DataFrame(json_results).sort_values(\"p99_time\", ascending=True)\n", + "# results_df.to_csv('results.csv')\n", + "results_df" ] } ], diff --git a/tools/compare_versions/prepare_image.sh b/tools/compare_versions/prepare_image.sh new file mode 100755 index 00000000..e93a7313 --- /dev/null +++ b/tools/compare_versions/prepare_image.sh @@ -0,0 +1,97 @@ +#!/bin/bash +# This script checks for the image in the remote repo +# and if it is not there triggers the image build in the +# main Qdrant repo for the specified version and waits +# until the image is available in the remote repository. +# +# Usage: export QDRANT_VERSION="ghcr/dev" && ./prepare_image.sh + +cancel_github_workflow() { + echo "Canceling the current GH workflow run..." + + RUN_ID=$(curl -s \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${BEARER_TOKEN}" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/runs" \ + | jq '.workflow_runs[] | select(.head_branch=="'${GITHUB_REF#refs/heads/}'") | .id' | head -n 1) + + curl -s \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${BEARER_TOKEN}" \ + "https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/runs/${RUN_ID}/cancel" +} + +QDRANT_VERSION=${QDRANT_VERSION:-"ghcr/dev"} + +MAX_RETRIES=15 + +EVENT_TYPE="benchmark-trigger-image-build" + +if [[ -z "${BEARER_TOKEN}" ]]; then + echo "BEARER_TOKEN is not set. Exiting." + cancel_github_workflow + exit 1 +fi + +# check if version starts with "docker" or "ghcr" +if [[ ${QDRANT_VERSION} == docker/* ]] || [[ ${QDRANT_VERSION} == ghcr/* ]]; then + + if [[ ${QDRANT_VERSION} == docker/* ]]; then + # pull from docker hub + QDRANT_VERSION=${QDRANT_VERSION#docker/} + QDRANT_VERSION_IMG=${QDRANT_VERSION//\//-} # replace all / with - + CONTAINER_REGISTRY='docker.io' + elif [[ ${QDRANT_VERSION} == ghcr/* ]]; then + # pull from github container registry + QDRANT_VERSION=${QDRANT_VERSION#ghcr/} + QDRANT_VERSION_IMG=${QDRANT_VERSION//\//-} # replace all / with - + CONTAINER_REGISTRY='ghcr.io' + fi +else + echo "Error: unknown version ${QDRANT_VERSION}. Version name should start with 'docker/' or 'ghcr/'" + cancel_github_workflow + exit 1 +fi + +IMAGE="${CONTAINER_REGISTRY}/qdrant/qdrant:${QDRANT_VERSION_IMG}" + +if docker manifest inspect "$IMAGE" > /dev/null 2>&1; then + echo "Image $IMAGE exists in the remote repository." + exit 0 +else + echo "Image $IMAGE does not exist in the remote repository." +fi + +if [[ "${CONTAINER_REGISTRY}" == "docker.io" ]]; then + echo "Impossible to push the image to Docker Container Registry in this workflow." + cancel_github_workflow + exit 1 +fi + +echo "Trigger image build for $IMAGE..." +curl -L \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${BEARER_TOKEN}" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/qdrant/qdrant/dispatches \ + -d "{\"event_type\": \"$EVENT_TYPE\", \"client_payload\": {\"version\": \"$QDRANT_VERSION\", \"triggered\": true}}" + +echo "Wait for the image to appear in the remote repository..." +counter=0 +while ! docker manifest inspect "$IMAGE" > /dev/null 2>&1; do + if [ $counter -ge $MAX_RETRIES ]; then + echo "Reached maximum retries. Exiting." + cancel_github_workflow + exit 2 + fi + # sleep for 10 minutes, in seconds + # together with the MAX_RETRIES it + # will wait for 150 minutes + sleep 600 + ((counter++)) +done + +echo "Image $IMAGE is now available in the remote repository." \ No newline at end of file diff --git a/tools/qdrant_collect_cpu_usage.sh b/tools/qdrant_collect_cpu_usage.sh new file mode 100755 index 00000000..a68ec0ef --- /dev/null +++ b/tools/qdrant_collect_cpu_usage.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail + +# Examples: start or end +MODE=$1 + +CLOUD_NAME=${CLOUD_NAME:-"hetzner"} +SERVER_USERNAME=${SERVER_USERNAME:-"root"} + +SCRIPT=$(realpath "$0") +SCRIPT_PATH=$(dirname "$SCRIPT") + +BENCH_SERVER_NAME=${SERVER_NAME:-"benchmark-server-1"} + +IP_OF_THE_SERVER=$(bash "${SCRIPT_PATH}/${CLOUD_NAME}/get_public_ip.sh" "$BENCH_SERVER_NAME") + +UTIME=$(ssh -tt -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "cat /proc/\$(pidof qdrant)/stat | awk '{print \$14}'") +# Clean up any whitespace characters +UTIME=$(echo "$UTIME" | tr -d '[:space:]') + +CURRENT_DATE=$(date +%Y-%m-%d-%H-%M-%S) + +mkdir -p results/cpu + +if [[ "$MODE" == "end" ]]; then + echo "Calculate CPU usage (seconds) over period of time" + UTIME_FILE=$(ls -t results/cpu/utime-*.txt | head -n 1) + UTIME_START=$(cat "$UTIME_FILE" | tr -d '[:space:]') + echo "$UTIME" >> "${UTIME_FILE}" + CPU=$(echo "scale=2; ($UTIME - $UTIME_START) / 100" | bc) + echo "$CPU" > "./results/cpu/cpu-usage-${CURRENT_DATE}.txt" +elif [[ "$MODE" == "start" ]]; then + echo "Store utime start value in ./results/cpu/utime-${CURRENT_DATE}.txt" + echo "$UTIME" > "./results/cpu/utime-${CURRENT_DATE}.txt" +else + echo "Unknown mode: $MODE" + exit 1 +fi diff --git a/tools/qdrant_collect_stats.sh b/tools/qdrant_collect_stats.sh index 495f33ec..67ae2c9a 100644 --- a/tools/qdrant_collect_stats.sh +++ b/tools/qdrant_collect_stats.sh @@ -1,6 +1,7 @@ #!/bin/bash -set -e +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail # Examples: qdrant-single-node, qdrant-single-node-rps CONTAINER_NAME=$1 @@ -16,12 +17,18 @@ BENCH_SERVER_NAME=${SERVER_NAME:-"benchmark-server-1"} IP_OF_THE_SERVER=$(bash "${SCRIPT_PATH}/${CLOUD_NAME}/get_public_ip.sh" "$BENCH_SERVER_NAME") -MEMORY_USAGE=$(ssh -t "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "grep VmRSS /proc/\$(pidof qdrant)/status | awk '{print \$2}'") +VM_RSS_MEMORY_USAGE=$(ssh -tt -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "grep VmRSS /proc/\$(pidof qdrant)/status | awk '{print \$2}'") +RSS_ANON_MEMORY_USAGE=$(ssh -tt -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "grep RssAnon /proc/\$(pidof qdrant)/status | awk '{print \$2}'") CURRENT_DATE=$(date +%Y-%m-%d-%H-%M-%S) -echo "$MEMORY_USAGE" > results/memory-usage-"${CURRENT_DATE}".txt +echo "$VM_RSS_MEMORY_USAGE" > results/vm-rss-memory-usage-"${CURRENT_DATE}".txt +echo "$RSS_ANON_MEMORY_USAGE" > results/rss-anon-memory-usage-"${CURRENT_DATE}".txt -ROOT_API_RESPONSE=$(ssh -t "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "curl -s http://localhost:6333/") +ROOT_API_RESPONSE=$(ssh -tt -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "curl -s http://localhost:6333/") echo "$ROOT_API_RESPONSE" > results/root-api-"${CURRENT_DATE}".json + +TELEMETRY_API_RESPONSE=$(ssh -tt -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "curl -s http://localhost:6333/telemetry?details_level=10") + +echo "$TELEMETRY_API_RESPONSE" > results/telemetry-api-"${CURRENT_DATE}".json diff --git a/tools/run_ci.sh b/tools/run_ci.sh old mode 100644 new mode 100755 index 039a6fb4..7604fbd6 --- a/tools/run_ci.sh +++ b/tools/run_ci.sh @@ -1,42 +1,66 @@ #!/bin/bash -set -e +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail -# Script, that runs benchmark within the GitHub Actions CI environment - -SCRIPT=$(realpath "$0") -SCRIPT_PATH=$(dirname "$SCRIPT") - -# Set up dependencies - -sudo apt update -sudo apt install -y jq +function handle_err() { + echo "qdrant_version=${QDRANT_VERSION}" >> $GITHUB_OUTPUT + echo "engine_name=${ENGINE_NAME}" >> $GITHUB_OUTPUT + echo "dataset=${DATASETS}" >> $GITHUB_OUTPUT -# Download and install hcloud + echo "failed=error" >> $GITHUB_OUTPUT +} -HCVERSION=v1.36.0 +function handle_term() { + echo "qdrant_version=${QDRANT_VERSION}" >> $GITHUB_OUTPUT + echo "engine_name=${ENGINE_NAME}" >> $GITHUB_OUTPUT + echo "dataset=${DATASETS}" >> $GITHUB_OUTPUT -wget https://github.com/hetznercloud/cli/releases/download/${HCVERSION}/hcloud-linux-amd64.tar.gz + echo "failed=timeout" >> $GITHUB_OUTPUT +} -tar xzf hcloud-linux-amd64.tar.gz +trap 'handle_err' ERR +trap 'handle_term' TERM -sudo mv hcloud /usr/local/bin +# Script, that runs benchmark within the GitHub Actions CI environment -# Install mc +# Possible values for BENCHMARK_STRATEGY: default, tenants, parallel and collection-reload +export BENCHMARK_STRATEGY=${BENCHMARK_STRATEGY:-"default"} -wget https://dl.min.io/client/mc/release/linux-amd64/mc -chmod +x mc -./mc alias set qdrant https://storage.googleapis.com "${GCS_KEY}" "${GCS_SECRET}" +SCRIPT=$(realpath "$0") +SCRIPT_PATH=$(dirname "$SCRIPT") bash -x "${SCRIPT_PATH}/run_remote_benchmark.sh" -./mc cp results/* qdrant/vector-search-engines-benchmark/results/ci/qdrant/ - # Upload to postgres # -t sorts by modification time -export SEARCH_RESULTS_FILE=$(ls -t results/*-search-*.json | head -n 1) -export UPLOAD_RESULTS_FILE=$(ls -t results/*-upload-*.json | head -n 1) -export MEMORY_USAGE_FILE=$(ls -t results/memory-usage-*.txt | head -n 1) +if [[ "$BENCHMARK_STRATEGY" == "collection-reload" ]]; then + export TELEMETRY_API_RESPONSE_FILE=$(ls -t results/telemetry-api-*.json | head -n 1) +else + # any other strategies are considered to have search & upload results + export TELEMETRY_API_RESPONSE_FILE=$(ls -t results/telemetry-api-*.json | head -n 1) + export SEARCH_RESULTS_FILE=$(find results/ -maxdepth 1 -type f -name '*-search-*.json' -printf '%T@ %p\n' | sort -nr | head -n 1 | cut -d' ' -f2-) + export UPLOAD_RESULTS_FILE=$(find results/ -maxdepth 1 -type f -name '*-upload-*.json' -printf '%T@ %p\n' | sort -nr | head -n 1 | cut -d' ' -f2-) + + if [[ "$BENCHMARK_STRATEGY" == "default" ]]; then + export CPU_USAGE_FILE=$(ls -t results/cpu/cpu-usage-*.txt | head -n 1) + fi + + if [[ "$BENCHMARK_STRATEGY" == "parallel" ]]; then + export PARALLEL_UPLOAD_RESULTS_FILE=$(ls -t results/parallel/*-upload-*.json | head -n 1) + export PARALLEL_SEARCH_RESULTS_FILE=$(ls -t results/parallel/*-search-*.json | head -n 1) + fi +fi + +export VM_RSS_MEMORY_USAGE_FILE=$(ls -t results/vm-rss-memory-usage-*.txt | head -n 1) +export RSS_ANON_MEMORY_USAGE_FILE=$(ls -t results/rss-anon-memory-usage-*.txt | head -n 1) export ROOT_API_RESPONSE_FILE=$(ls -t results/root-api-*.json | head -n 1) -bash -x "${SCRIPT_PATH}/upload_results_postgres.sh" +export IS_CI_RUN="true" + +if [[ "$BENCHMARK_STRATEGY" == "parallel" ]]; then + bash -x "${SCRIPT_PATH}/upload_parallel_results_postgres.sh" +else + bash -x "${SCRIPT_PATH}/upload_results_postgres.sh" +fi + diff --git a/tools/run_client_remove_volume.sh b/tools/run_client_remove_volume.sh new file mode 100755 index 00000000..94947327 --- /dev/null +++ b/tools/run_client_remove_volume.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail + +CLOUD_NAME=${CLOUD_NAME:-"hetzner"} +SERVER_USERNAME=${SERVER_USERNAME:-"root"} + +SCRIPT=$(realpath "$0") +SCRIPT_PATH=$(dirname "$SCRIPT") + +BENCH_CLIENT_NAME=${CLIENT_NAME:-"benchmark-client-1"} + +IP_OF_THE_CLIENT=$(bash "${SCRIPT_PATH}/${CLOUD_NAME}/get_public_ip.sh" "$BENCH_CLIENT_NAME") + +echo "Remove ci-datasets volume from client" +RUN_CMD="docker volume rm -f ci-datasets || true" + +ssh -tt -o ServerAliveInterval=120 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "${RUN_CMD}" diff --git a/tools/run_client_script.sh b/tools/run_client_script.sh index c48b87d8..1eb9c201 100644 --- a/tools/run_client_script.sh +++ b/tools/run_client_script.sh @@ -1,6 +1,10 @@ #!/bin/bash -set -e +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail + +# Possible values are: full|upload|search|parallel|snapshot +EXPERIMENT_MODE=${1:-"full"} CLOUD_NAME=${CLOUD_NAME:-"hetzner"} SERVER_USERNAME=${SERVER_USERNAME:-"root"} @@ -13,25 +17,70 @@ BENCH_CLIENT_NAME=${CLIENT_NAME:-"benchmark-client-1"} IP_OF_THE_CLIENT=$(bash "${SCRIPT_PATH}/${CLOUD_NAME}/get_public_ip.sh" "$BENCH_CLIENT_NAME") -scp "${SCRIPT_PATH}/run_experiment.sh" "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}:~/run_experiment.sh" - ENGINE_NAME=${ENGINE_NAME:-"qdrant-continuous-benchmark"} DATASETS=${DATASETS:-"laion-small-clip"} +SNAPSHOT_URL=${SNAPSHOT_URL:-""} + PRIVATE_IP_OF_THE_SERVER=$(bash "${SCRIPT_PATH}/${CLOUD_NAME}/get_private_ip.sh" "$BENCH_SERVER_NAME") -RUN_EXPERIMENT="ENGINE_NAME=${ENGINE_NAME} DATASETS=${DATASETS} PRIVATE_IP_OF_THE_SERVER=${PRIVATE_IP_OF_THE_SERVER} bash ~/run_experiment.sh" +if [[ "$EXPERIMENT_MODE" == "snapshot" ]]; then + scp "${SCRIPT_PATH}/run_experiment.sh" "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}:~/run_experiment_snapshot.sh" + + RUN_EXPERIMENT="ENGINE_NAME=${ENGINE_NAME} \ + DATASETS=${DATASETS} \ + PRIVATE_IP_OF_THE_SERVER=${PRIVATE_IP_OF_THE_SERVER} \ + EXPERIMENT_MODE=${EXPERIMENT_MODE} \ + SNAPSHOT_URL=${SNAPSHOT_URL} \ + bash ~/run_experiment_snapshot.sh" + + ssh -tt -o ServerAliveInterval=120 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "${RUN_EXPERIMENT}" + +else + scp "${SCRIPT_PATH}/run_experiment.sh" "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}:~/run_experiment.sh" + scp "${SCRIPT_PATH}/../datasets/datasets.json" "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}:~/datasets.json" + + RUN_EXPERIMENT="ENGINE_NAME=${ENGINE_NAME} \ + DATASETS=${DATASETS} \ + PRIVATE_IP_OF_THE_SERVER=${PRIVATE_IP_OF_THE_SERVER} \ + EXPERIMENT_MODE=${EXPERIMENT_MODE} \ + bash ~/run_experiment.sh" -ssh -tt "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "${RUN_EXPERIMENT}" + ssh -tt -o ServerAliveInterval=60 -o ServerAliveCountMax=3 "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "${RUN_EXPERIMENT}" -SEARCH_RESULT_FILE=$(ssh "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "ls -t results/*-search-*.json | head -n 1") -UPLOAD_RESULT_FILE=$(ssh "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "ls -t results/*-upload-*.json | head -n 1") -MEMORY_USAGE_FILE=$(ssh "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "ls -t results/memory-usage-*.txt | head -n 1") +fi + +echo "Gather experiment results..." +result_files_arr=() +result_parallel_files_arr=() + +if [[ "$EXPERIMENT_MODE" == "full" ]] || [[ "$EXPERIMENT_MODE" == "upload" ]]; then + UPLOAD_RESULT_FILE=$(ssh -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "find results/ -maxdepth 1 -type f -name '*-upload-*.json' -printf '%T@ %p\n' | sort -nr | head -n 1 | cut -d' ' -f2-") + result_files_arr+=("$UPLOAD_RESULT_FILE") +fi + +if [[ "$EXPERIMENT_MODE" == "full" ]] || [[ "$EXPERIMENT_MODE" == "search" ]]; then + SEARCH_RESULT_FILE=$(ssh -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "find results/ -maxdepth 1 -type f -name '*-search-*.json' -printf '%T@ %p\n' | sort -nr | head -n 1 | cut -d' ' -f2-") + result_files_arr+=("$SEARCH_RESULT_FILE") +fi + +if [[ "$EXPERIMENT_MODE" == "parallel" ]]; then + UPLOAD_RESULT_FILE=$(ssh -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "ls -t results/parallel/*-upload-*.json | head -n 1") + result_parallel_files_arr+=("$UPLOAD_RESULT_FILE") + + SEARCH_RESULT_FILE=$(ssh -o ServerAliveInterval=10 -o ServerAliveCountMax=10 "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}" "ls -t results/parallel/*-search-*.json | head -n 1") + result_parallel_files_arr+=("$SEARCH_RESULT_FILE") +fi mkdir -p results +mkdir -p results/parallel -for RESULT_FILE in $SEARCH_RESULT_FILE $UPLOAD_RESULT_FILE $MEMORY_USAGE_FILE; do +for RESULT_FILE in "${result_files_arr[@]}"; do # -p preseves modification time, access time, and modes (but not change time) - scp -p "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}:~/${RESULT_FILE}" "./results" + scp -o ServerAliveInterval=10 -o ServerAliveCountMax=10 -p "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}:~/${RESULT_FILE}" "./results" +done + +for RESULT_FILE in "${result_parallel_files_arr[@]}"; do + scp -o ServerAliveInterval=10 -o ServerAliveCountMax=10 -p "${SERVER_USERNAME}@${IP_OF_THE_CLIENT}:~/${RESULT_FILE}" "./results/parallel" done diff --git a/tools/run_experiment.sh b/tools/run_experiment.sh index a1b23d52..b01be1e7 100644 --- a/tools/run_experiment.sh +++ b/tools/run_experiment.sh @@ -1,11 +1,18 @@ #!/bin/bash -ENGINE_NAME=${ENGINE_NAME:-"qdrant-default"} +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail + +ENGINE_NAME=${ENGINE_NAME:-"qdrant-continuous-benchmark"} DATASETS=${DATASETS:-""} PRIVATE_IP_OF_THE_SERVER=${PRIVATE_IP_OF_THE_SERVER:-""} +EXPERIMENT_MODE=${EXPERIMENT_MODE:-"full"} + +SNAPSHOT_URL=${SNAPSHOT_URL:-""} + if [[ -z "$ENGINE_NAME" ]]; then echo "ENGINE_NAME is not set" exit 1 @@ -21,18 +28,117 @@ if [[ -z "$PRIVATE_IP_OF_THE_SERVER" ]]; then exit 1 fi -docker rmi qdrant/vector-db-benchmark:latest || true +if [[ -z "$EXPERIMENT_MODE" ]]; then + echo "EXPERIMENT_MODE is not set, possible values are: full | upload | search | snapshot | parallel" + exit 1 +fi + +if [[ "$EXPERIMENT_MODE" == "snapshot" ]] && [[ -z "$SNAPSHOT_URL" ]]; then + echo "EXPERIMENT_MODE is 'snapshot' but SNAPSHOT_URL is not set" + exit 1 +fi + +if [[ "$EXPERIMENT_MODE" != "snapshot" ]]; then + docker container rm -f ci-benchmark-upload || true + docker container rm -f ci-benchmark-search || true + + docker rmi --force qdrant/vector-db-benchmark:latest || true +fi + +echo "Ensure datasets volume exists and contains latest datasets.json" +docker volume create ci-datasets +if [[ -f "$HOME/datasets.json" ]]; then + echo "Found datasets.json, update the volume" + mv ~/datasets.json "$(docker volume inspect ci-datasets -f '{{ .Mountpoint }}')" +else + echo "datasets.json is missing, do not update the volume" +fi + +if [[ "$EXPERIMENT_MODE" == "full" ]] || [[ "$EXPERIMENT_MODE" == "upload" ]]; then + echo "EXPERIMENT_MODE=$EXPERIMENT_MODE" + docker run \ + --rm \ + -it \ + --name ci-benchmark-upload \ + -v "$HOME/results:/code/results" \ + -v "ci-datasets:/code/datasets" \ + qdrant/vector-db-benchmark:latest \ + python run.py --engines "${ENGINE_NAME}" --datasets "${DATASETS}" --host "${PRIVATE_IP_OF_THE_SERVER}" --no-skip-if-exists --skip-search +fi + -docker run \ - --rm \ - -it \ - -v "$HOME/results:/code/results" \ - qdrant/vector-db-benchmark:latest \ - python run.py --engines "${ENGINE_NAME}" --datasets "${DATASETS}" --host "${PRIVATE_IP_OF_THE_SERVER}" --no-skip-if-exists --skip-search +if [[ "$EXPERIMENT_MODE" == "full" ]] || [[ "$EXPERIMENT_MODE" == "search" ]]; then + echo "EXPERIMENT_MODE=$EXPERIMENT_MODE" -docker run \ - --rm \ - -it \ - -v "$HOME/results:/code/results" \ - qdrant/vector-db-benchmark:latest \ - python run.py --engines "${ENGINE_NAME}" --datasets "${DATASETS}" --host "${PRIVATE_IP_OF_THE_SERVER}" --no-skip-if-exists --skip-upload + if [[ "$EXPERIMENT_MODE" == "search" ]]; then + echo "Drop caches before running the experiment" + sudo bash -c 'sync; echo 1 > /proc/sys/vm/drop_caches' + fi + + docker run \ + --rm \ + -it \ + --name ci-benchmark-search \ + -v "$HOME/results:/code/results" \ + -v "ci-datasets:/code/datasets" \ + qdrant/vector-db-benchmark:latest \ + python run.py --engines "${ENGINE_NAME}" --datasets "${DATASETS}" --host "${PRIVATE_IP_OF_THE_SERVER}" --no-skip-if-exists --skip-upload +fi + + +if [[ "$EXPERIMENT_MODE" == "parallel" ]]; then + echo "EXPERIMENT_MODE=$EXPERIMENT_MODE" + + docker pull qdrant/vector-db-benchmark:latest + + echo "Starting ci-benchmark-upload container" + docker run \ + --rm \ + --name ci-benchmark-upload \ + -v "$HOME/results/parallel:/code/results" \ + -v "ci-datasets:/code/datasets" \ + qdrant/vector-db-benchmark:latest \ + python run.py --engines "${ENGINE_NAME}" --datasets "${DATASETS}" --host "${PRIVATE_IP_OF_THE_SERVER}" --no-skip-if-exists --skip-search --skip-configure & + UPLOAD_PID=$! + + echo "Starting ci-benchmark-search container" + docker run \ + --rm \ + --name ci-benchmark-search \ + -v "$HOME/results/parallel:/code/results" \ + -v "ci-datasets:/code/datasets" \ + qdrant/vector-db-benchmark:latest \ + python run.py --engines "${ENGINE_NAME}" --datasets "${DATASETS}" --host "${PRIVATE_IP_OF_THE_SERVER}" --no-skip-if-exists --skip-upload & + SEARCH_PID=$! + + echo "Waiting for both containers to finish" + wait $UPLOAD_PID + wait $SEARCH_PID + + echo "EXPERIMENT_MODE=$EXPERIMENT_MODE DONE" +fi + + +if [[ "$EXPERIMENT_MODE" == "snapshot" ]]; then + echo "EXPERIMENT_MODE=$EXPERIMENT_MODE" + + curl -X PUT \ + "http://${PRIVATE_IP_OF_THE_SERVER}:6333/collections/benchmark/snapshots/recover" \ + --data-raw "{\"location\": \"${SNAPSHOT_URL}\"}" + + collection_url="http://${PRIVATE_IP_OF_THE_SERVER}:6333/collections/benchmark" + collection_status=$(curl -s "$collection_url" | jq -r '.result.status') + counter=0 + while [[ "$collection_status" != "green" && "$counter" -lt 5 ]]; do + collection_status=$(curl -s "$collection_url" | jq -r '.result.status') + counter=$(expr $counter + 1) + sleep 1 + done + + if [[ "$collection_status" == "green" ]]; then + echo "Experiment stage: Done" + else + echo "Experiment interrupted: collection is not ready." + exit 1 + fi +fi diff --git a/tools/run_remote_benchmark.sh b/tools/run_remote_benchmark.sh old mode 100644 new mode 100755 index bcba6a23..bee56e8d --- a/tools/run_remote_benchmark.sh +++ b/tools/run_remote_benchmark.sh @@ -1,12 +1,13 @@ #!/bin/bash -set -e +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail # Setup 2 machines in Hetzner Cloud # One machine will be used as a server, another one as a client cleanup() { - echo "cleaning up..." + echo "cleaning up file=$BASH_SOURCE" # bash -x "${SCRIPT_PATH}/tear_down.sh" } @@ -30,14 +31,86 @@ trap 'cleanup' EXIT #SERVER_NAME=$BENCH_CLIENT_NAME SERVER_TYPE='cpx11' bash -x "${SCRIPT_PATH}/${CLOUD_NAME}/create_and_install.sh" #wait $SERVER_CREATION_PID +BENCHMARK_STRATEGY=${BENCHMARK_STRATEGY:-"default"} + SERVER_NAME=$BENCH_SERVER_NAME bash -x "${SCRIPT_PATH}/${CLOUD_NAME}/check_ssh_connection.sh" SERVER_NAME=$BENCH_CLIENT_NAME bash -x "${SCRIPT_PATH}/${CLOUD_NAME}/check_ssh_connection.sh" +case "$BENCHMARK_STRATEGY" in + "default") + echo "Default benchmark, no volume, no memory limit" + + SERVER_CONTAINER_NAME=${SERVER_CONTAINER_NAME:-"qdrant-continuous-benchmarks"} + + bash -x "${SCRIPT_PATH}/run_server_container.sh" "$SERVER_CONTAINER_NAME" + + bash -x "${SCRIPT_PATH}/qdrant_collect_cpu_usage.sh" "start" + + bash -x "${SCRIPT_PATH}/run_client_script.sh" + + bash -x "${SCRIPT_PATH}/qdrant_collect_cpu_usage.sh" "end" + + bash -x "${SCRIPT_PATH}/qdrant_collect_stats.sh" "$SERVER_CONTAINER_NAME" + ;; + "tenants") + if [[ -z "${CONTAINER_MEM_LIMIT:-}" ]]; then + echo "Tenants benchmark, but CONTAINER_MEM_LIMIT is not set!" + exit 2 + fi + + echo "Tenants benchmark, run search with memory limit: ${CONTAINER_MEM_LIMIT}" + + SERVER_CONTAINER_NAME=${SERVER_CONTAINER_NAME:-"qdrant-continuous-benchmarks-with-volume"} + + bash -x "${SCRIPT_PATH}/run_server_container_with_volume.sh" "$SERVER_CONTAINER_NAME" "25Gb" + + bash -x "${SCRIPT_PATH}/run_client_script.sh" "upload" + + bash -x "${SCRIPT_PATH}/run_server_container_with_volume.sh" "$SERVER_CONTAINER_NAME" "$CONTAINER_MEM_LIMIT" "continue" + + bash -x "${SCRIPT_PATH}/run_client_script.sh" "search" + + bash -x "${SCRIPT_PATH}/qdrant_collect_stats.sh" "$SERVER_CONTAINER_NAME" + ;; + + "collection-reload") + echo "Collection load time benchmark" + + SERVER_CONTAINER_NAME=${SERVER_CONTAINER_NAME:-"qdrant-continuous-benchmarks-snapshot"} + + bash -x "${SCRIPT_PATH}/run_server_container_with_volume.sh" "$SERVER_CONTAINER_NAME" "25Gb" + + bash -x "${SCRIPT_PATH}/run_client_script.sh" "snapshot" + + bash -x "${SCRIPT_PATH}/run_server_container_with_volume.sh" "$SERVER_CONTAINER_NAME" "25Gb" "continue" + + sleep 10 + + bash -x "${SCRIPT_PATH}/qdrant_collect_stats.sh" "$SERVER_CONTAINER_NAME" + ;; + + "parallel") + echo "Parallel benchmark, run upload&search at the same time" + + SERVER_CONTAINER_NAME=${SERVER_CONTAINER_NAME:-"qdrant-continuous-benchmarks-with-volume"} + + bash -x "${SCRIPT_PATH}/run_server_container_with_volume.sh" "$SERVER_CONTAINER_NAME" "25Gb" + + bash -x "${SCRIPT_PATH}/run_client_script.sh" "upload" + + bash -x "${SCRIPT_PATH}/run_server_container_with_volume.sh" "$SERVER_CONTAINER_NAME" "25Gb" "continue" + + bash -x "${SCRIPT_PATH}/run_client_script.sh" "search" -SERVER_CONTAINER_NAME=${SERVER_CONTAINER_NAME:-"qdrant-continuous-benchmarks"} + bash -x "${SCRIPT_PATH}/run_server_container_with_volume.sh" "$SERVER_CONTAINER_NAME" "25Gb" "continue" -bash -x "${SCRIPT_PATH}/run_server_container.sh" "$SERVER_CONTAINER_NAME" + bash -x "${SCRIPT_PATH}/run_client_script.sh" "parallel" -bash -x "${SCRIPT_PATH}/run_client_script.sh" + bash -x "${SCRIPT_PATH}/qdrant_collect_stats.sh" "$SERVER_CONTAINER_NAME" + ;; -bash -x "${SCRIPT_PATH}/qdrant_collect_stats.sh" "$SERVER_CONTAINER_NAME" + *) + echo "Invalid BENCHMARK_STRATEGY value: $BENCHMARK_STRATEGY" + exit 1 + ;; +esac diff --git a/tools/run_server_container.sh b/tools/run_server_container.sh index 98d6e73f..249ad92a 100644 --- a/tools/run_server_container.sh +++ b/tools/run_server_container.sh @@ -1,8 +1,9 @@ #!/bin/bash -set -e +PS4='ts=$(date "+%Y-%m-%dT%H:%M:%SZ") level=DEBUG line=$LINENO file=$BASH_SOURCE ' +set -euo pipefail -# Examples: qdrant-single-node +# Examples: qdrant-continuous-benchmarks CONTAINER_NAME=$1 CLOUD_NAME=${CLOUD_NAME:-"hetzner"} @@ -15,12 +16,13 @@ SCRIPT_PATH=$(dirname "$SCRIPT") BENCH_SERVER_NAME=${SERVER_NAME:-"benchmark-server-1"} QDRANT_VERSION=${QDRANT_VERSION:-"dev"} +QDRANT__FEATURE_FLAGS__ALL=${QDRANT__FEATURE_FLAGS__ALL:-"false"} IP_OF_THE_SERVER=$(bash "${SCRIPT_PATH}/${CLOUD_NAME}/get_public_ip.sh" "$BENCH_SERVER_NAME") bash -x "${SCRIPT_PATH}/sync_servers.sh" "root@$IP_OF_THE_SERVER" -# if version is dev or if starts with "docker" or "ghcr", use container +# if version is starts with "docker" or "ghcr", use container if [[ ${QDRANT_VERSION} == docker/* ]] || [[ ${QDRANT_VERSION} == ghcr/* ]]; then if [[ ${QDRANT_VERSION} == docker/* ]]; then @@ -33,11 +35,9 @@ if [[ ${QDRANT_VERSION} == docker/* ]] || [[ ${QDRANT_VERSION} == ghcr/* ]]; the CONTAINER_REGISTRY='ghcr.io' fi - DOCKER_COMPOSE="export QDRANT_VERSION=${QDRANT_VERSION}; export CONTAINER_REGISTRY=${CONTAINER_REGISTRY}; docker compose down ; pkill qdrant ; docker rmi ${CONTAINER_REGISTRY}/qdrant/qdrant:${QDRANT_VERSION} || true ; docker compose up -d" - ssh -t "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "cd ./projects/vector-db-benchmark/engine/servers/${CONTAINER_NAME} ; $DOCKER_COMPOSE" + DOCKER_COMPOSE="export QDRANT_VERSION=${QDRANT_VERSION}; export CONTAINER_REGISTRY=${CONTAINER_REGISTRY}; export QDRANT__FEATURE_FLAGS__ALL=${QDRANT__FEATURE_FLAGS__ALL}; docker compose down; pkill qdrant; docker rm -f qdrant-continuous || true; docker rmi -f ${CONTAINER_REGISTRY}/qdrant/qdrant:${QDRANT_VERSION} || true ; docker compose up -d; docker container ls -a" + ssh -t -o ServerAliveInterval=60 -o ServerAliveCountMax=3 "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "cd ./projects/vector-db-benchmark/engine/servers/${CONTAINER_NAME} ; $DOCKER_COMPOSE" else - # else run natively in the server - DOCKER_QDRANT_STOP="docker stop qdrant-continuous || true" - QDRANT_BUILD="source ~/.cargo/env; git fetch --tags; git checkout ${QDRANT_VERSION}; git pull; mold -run cargo run --bin qdrant --release" - ssh -t "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "cd ./projects/qdrant; ${DOCKER_QDRANT_STOP}; $QDRANT_BUILD" + echo "Error: unknown version ${QDRANT_VERSION}. Version name should start with 'docker/' or 'ghcr/'" + exit 1 fi diff --git a/tools/run_server_container_with_volume.sh b/tools/run_server_container_with_volume.sh new file mode 100644 index 00000000..fb1f3ade --- /dev/null +++ b/tools/run_server_container_with_volume.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +set -e + +# Examples: qdrant-continuous-benchmarks-with-volume +CONTAINER_NAME=$1 +CONTAINER_MEM_LIMIT=${2:-"25Gb"} +EXECUTION_MODE=${3:-"init"} + +CLOUD_NAME=${CLOUD_NAME:-"hetzner"} +SERVER_USERNAME=${SERVER_USERNAME:-"root"} + + +SCRIPT=$(realpath "$0") +SCRIPT_PATH=$(dirname "$SCRIPT") + +BENCH_SERVER_NAME=${SERVER_NAME:-"benchmark-server-1"} + +QDRANT_VERSION=${QDRANT_VERSION:-"dev"} +QDRANT__FEATURE_FLAGS__ALL=${QDRANT__FEATURE_FLAGS__ALL:-"false"} + +IP_OF_THE_SERVER=$(bash "${SCRIPT_PATH}/${CLOUD_NAME}/get_public_ip.sh" "$BENCH_SERVER_NAME") + +bash -x "${SCRIPT_PATH}/sync_servers.sh" "root@$IP_OF_THE_SERVER" + +# if version is starts with "docker" or "ghcr", use container +if [[ ${QDRANT_VERSION} == docker/* ]] || [[ ${QDRANT_VERSION} == ghcr/* ]]; then + + if [[ ${QDRANT_VERSION} == docker/* ]]; then + # pull from docker hub + QDRANT_VERSION=${QDRANT_VERSION#docker/} + CONTAINER_REGISTRY='docker.io' + elif [[ ${QDRANT_VERSION} == ghcr/* ]]; then + # pull from github container registry + QDRANT_VERSION=${QDRANT_VERSION#ghcr/} + CONTAINER_REGISTRY='ghcr.io' + fi + + if [[ "$EXECUTION_MODE" == "init" ]]; then + echo "Initialize qdrant from scratch, with qdrant_storage volume" + DOCKER_COMPOSE="export QDRANT_VERSION=${QDRANT_VERSION}; export CONTAINER_REGISTRY=${CONTAINER_REGISTRY}; export CONTAINER_MEM_LIMIT=${CONTAINER_MEM_LIMIT}; export QDRANT__FEATURE_FLAGS__ALL=${QDRANT__FEATURE_FLAGS__ALL}; docker compose down; pkill qdrant; docker rm -f qdrant-continuous || true; docker rmi -f ${CONTAINER_REGISTRY}/qdrant/qdrant:${QDRANT_VERSION} || true; docker volume rm -f qdrant_storage || true; docker compose up -d; docker container ls -a" + elif [[ "$EXECUTION_MODE" == "continue" ]]; then + # suggest that volume qdrant_storage exist and start qdrant + echo "Reload qdrant with existing data" + DOCKER_COMPOSE="export QDRANT_VERSION=${QDRANT_VERSION}; export CONTAINER_REGISTRY=${CONTAINER_REGISTRY}; export CONTAINER_MEM_LIMIT=${CONTAINER_MEM_LIMIT}; export QDRANT__FEATURE_FLAGS__ALL=${QDRANT__FEATURE_FLAGS__ALL}; docker compose down; pkill qdrant; docker rm -f qdrant-continuous || true; docker rmi -f ${CONTAINER_REGISTRY}/qdrant/qdrant:${QDRANT_VERSION} || true ; sudo bash -c 'sync; echo 1 > /proc/sys/vm/drop_caches'; docker compose up -d; docker container ls -a" + else + echo "Error: unknown execution mode ${EXECUTION_MODE}. Execution mode should be 'init' or 'continue'" + exit 1 + fi + + ssh -t -o ServerAliveInterval=60 -o ServerAliveCountMax=3 "${SERVER_USERNAME}@${IP_OF_THE_SERVER}" "cd ./projects/vector-db-benchmark/engine/servers/${CONTAINER_NAME} ; $DOCKER_COMPOSE" +else + echo "Error: unknown version ${QDRANT_VERSION}. Version name should start with 'docker/' or 'ghcr/'" + exit 1 +fi diff --git a/tools/setup_ci.sh b/tools/setup_ci.sh new file mode 100755 index 00000000..b263f499 --- /dev/null +++ b/tools/setup_ci.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Set up dependencies + +sudo apt update +sudo apt install -y jq + +# Download and install hcloud + +HCVERSION=v1.36.0 + +wget https://github.com/hetznercloud/cli/releases/download/${HCVERSION}/hcloud-linux-amd64.tar.gz + +tar xzf hcloud-linux-amd64.tar.gz + +sudo mv hcloud /usr/local/bin diff --git a/tools/sync_servers.sh b/tools/sync_servers.sh index 7304cbb7..15bf2835 100755 --- a/tools/sync_servers.sh +++ b/tools/sync_servers.sh @@ -2,5 +2,5 @@ PROJECT_PATH=$(realpath "$(dirname "$0")/..") -rsync -avP --mkpath\ +rsync -e "ssh -o ServerAliveInterval=10 -o ServerAliveCountMax=10" -avP --mkpath\ "$PROJECT_PATH/engine/servers/" $1:./projects/vector-db-benchmark/engine/servers/ diff --git a/tools/upload_parallel_results_postgres.sh b/tools/upload_parallel_results_postgres.sh new file mode 100644 index 00000000..cd54b542 --- /dev/null +++ b/tools/upload_parallel_results_postgres.sh @@ -0,0 +1,126 @@ +#!/bin/bash + + +# Read search results from json file and upload it to postgres +# +# Assume table: +# create table benchmark_parallel_search_upload ( +# id SERIAL PRIMARY key, +# engine VARCHAR(255), +# branch VARCHAR(255), +# commit CHAR(40), +# dataset VARCHAR(255), +# measure_timestamp TIMESTAMP, +# upload_time real, +# indexing_time real, +# rps real, +# mean_precisions real, +# p95_time real, +# p99_time real, +# search_time real, +# no_upsert_search_time real, +# cpu real, +# cpu_telemetry real, +# ); + +PARALLEL_SEARCH_RESULTS_FILE=${PARALLEL_SEARCH_RESULTS_FILE:-""} +SEARCH_RESULT_FILE=${SEARCH_RESULTS_FILE:-""} +PARALLEL_UPLOAD_RESULTS_FILE=${PARALLEL_UPLOAD_RESULTS_FILE:-""} +UPLOAD_RESULTS_FILE=${UPLOAD_RESULTS_FILE:-""} +ROOT_API_RESPONSE_FILE=${ROOT_API_RESPONSE_FILE:-""} +POSTGRES_TABLE=${POSTGRES_TABLE:-"benchmark_parallel_search_upload"} + +QDRANT_VERSION=${QDRANT_VERSION:-"dev"} +DATASETS=${DATASETS:-"laion-small-clip"} + +IS_CI_RUN=${IS_CI_RUN:-"false"} + +if [[ "$BENCHMARK_STRATEGY" != "parallel" ]]; then + echo "BENCHMARK_STRATEGY is not parallel" + exit 1 +else + if [[ -z "$PARALLEL_SEARCH_RESULTS_FILE" ]]; then + echo "PARALLEL_SEARCH_RESULTS_FILE is not set" + exit 1 + fi + + if [[ -z "$SEARCH_RESULT_FILE" ]]; then + echo "SEARCH_RESULT_FILE is not set" + exit 1 + fi + + if [[ -z "$PARALLEL_UPLOAD_RESULTS_FILE" ]]; then + echo "PARALLEL_UPLOAD_RESULTS_FILE is not set" + exit 1 + fi + + if [[ -z "$UPLOAD_RESULTS_FILE" ]]; then + echo "UPLOAD_RESULTS_FILE is not set" + exit 1 + fi +fi + +if [[ -z "$ROOT_API_RESPONSE_FILE" ]]; then + echo "ROOT_API_RESPONSE_FILE is not set" + exit 1 +fi + +if [[ "$BENCHMARK_STRATEGY" == "default" ]]; then + if [[ -z "$CPU_USAGE_FILE" ]]; then + echo "CPU_USAGE_FILE is not set" + exit 1 + fi +fi + +RPS=NULL +MEAN_PRECISIONS=NULL +P95_TIME=NULL +P99_TIME=NULL +UPLOAD_TIME=NULL +INDEXING_TIME=NULL +SEARCH_TIME=NULL +NO_UPSERT_SEARCH_TIME=NULL +CPU=NULL +CPU_TELEMETRY=NULL + +RPS=$(jq -r '.results.rps' "$PARALLEL_SEARCH_RESULTS_FILE") +MEAN_PRECISIONS=$(jq -r '.results.mean_precisions' "$PARALLEL_SEARCH_RESULTS_FILE") +P95_TIME=$(jq -r '.results.p95_time' "$PARALLEL_SEARCH_RESULTS_FILE") +P99_TIME=$(jq -r '.results.p99_time' "$PARALLEL_SEARCH_RESULTS_FILE") +SEARCH_TIME=$(jq -r '.results.total_time' "$PARALLEL_SEARCH_RESULTS_FILE") +NO_UPSERT_SEARCH_TIME=$(jq -r '.results.total_time' "$SEARCH_RESULT_FILE") + +UPLOAD_TIME=$(jq -r '.results.upload_time' "$PARALLEL_UPLOAD_RESULTS_FILE") +INDEXING_TIME=$(jq -r '.results.total_time' "$PARALLEL_UPLOAD_RESULTS_FILE") + +if [[ "$BENCHMARK_STRATEGY" == "default" ]]; then + # Only this strategy produces cpu usage results files + CPU=$(cat "$CPU_USAGE_FILE" | tr -d '[:space:]') +fi +CPU_TELEMETRY=$(jq -r '.result.hardware.collection_data.benchmark.cpu' "$TELEMETRY_API_RESPONSE_FILE") + +QDRANT_COMMIT=$(jq -r '.commit' "$ROOT_API_RESPONSE_FILE") + +MEASURE_TIMESTAMP=${MEASURE_TIMESTAMP:-$(date -u +"%Y-%m-%dT%H:%M:%SZ")} + + +docker run --name "vector-db" --rm jbergknoff/postgresql-client "postgresql://qdrant:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/postgres" -c " +INSERT INTO ${POSTGRES_TABLE} (engine, branch, commit, dataset, measure_timestamp, upload_time, indexing_time, rps, mean_precisions, p95_time, p99_time, search_time, no_upsert_search_time, cpu_telemetry, cpu) +VALUES ('qdrant-ci', '${QDRANT_VERSION}', '${QDRANT_COMMIT}', '${DATASETS}', '${MEASURE_TIMESTAMP}', ${UPLOAD_TIME}, ${INDEXING_TIME}, ${RPS}, ${MEAN_PRECISIONS}, ${P95_TIME}, ${P99_TIME}, ${SEARCH_TIME}, ${NO_UPSERT_SEARCH_TIME}, ${CPU_TELEMETRY}, ${CPU}); +" + +if [[ "$IS_CI_RUN" == "true" ]]; then + echo "rps=${RPS}" >> "$GITHUB_OUTPUT" + echo "mean_precisions=${MEAN_PRECISIONS}" >> "$GITHUB_OUTPUT" + echo "p95_time=${P95_TIME}" >> "$GITHUB_OUTPUT" + echo "p99_time=${P99_TIME}" >> "$GITHUB_OUTPUT" + + echo "search_time=${SEARCH_TIME}" >> "$GITHUB_OUTPUT" + echo "no_upsert_search_time=${NO_UPSERT_SEARCH_TIME}" >> "$GITHUB_OUTPUT" + + echo "upload_time=${UPLOAD_TIME}" >> "$GITHUB_OUTPUT" + echo "indexing_time=${INDEXING_TIME}" >> "$GITHUB_OUTPUT" + + echo "cpu_telemetry=${CPU_TELEMETRY}" >> "$GITHUB_OUTPUT" + echo "cpu=${CPU}" >> "$GITHUB_OUTPUT" +fi diff --git a/tools/upload_results_postgres.sh b/tools/upload_results_postgres.sh index 4bda52c2..474dcc94 100644 --- a/tools/upload_results_postgres.sh +++ b/tools/upload_results_postgres.sh @@ -8,7 +8,7 @@ # id SERIAL PRIMARY key, # engine VARCHAR(255), # branch VARCHAR(255), -# commit CHAR(40), +# commit CHAR(40), # dataset VARCHAR(255), # measure_timestamp TIMESTAMP, # upload_time real, @@ -17,32 +17,52 @@ # mean_precisions real, # p95_time real, # p99_time real, -# memory_usage real +# vm_rss_mem real, +# rss_anon_mem real, +# collection_load_time_ms real, +# cpu real, +# cpu_telemetry real, # ); SEARCH_RESULTS_FILE=${SEARCH_RESULTS_FILE:-""} UPLOAD_RESULTS_FILE=${UPLOAD_RESULTS_FILE:-""} -MEMORY_USAGE_FILE=${MEMORY_USAGE_FILE:-""} +VM_RSS_MEMORY_USAGE_FILE=${VM_RSS_MEMORY_USAGE_FILE:-""} +RSS_ANON_MEMORY_USAGE_FILE=${RSS_ANON_MEMORY_USAGE_FILE:-""} ROOT_API_RESPONSE_FILE=${ROOT_API_RESPONSE_FILE:-""} +TELEMETRY_API_RESPONSE_FILE=${TELEMETRY_API_RESPONSE_FILE:-""} POSTGRES_TABLE=${POSTGRES_TABLE:-"benchmark"} QDRANT_VERSION=${QDRANT_VERSION:-"dev"} DATASETS=${DATASETS:-"laion-small-clip"} -if [[ -z "$SEARCH_RESULTS_FILE" ]]; then - echo "SEARCH_RESULTS_FILE is not set" - exit 1 +IS_CI_RUN=${IS_CI_RUN:-"false"} + +if [[ "$BENCHMARK_STRATEGY" == "collection-reload" ]]; then + if [[ -z "$TELEMETRY_API_RESPONSE_FILE" ]]; then + echo "TELEMETRY_API_RESPONSE_FILE is not set" + exit 1 + fi +else + # any other strategies are considered to have search & upload results + if [[ -z "$SEARCH_RESULTS_FILE" ]]; then + echo "SEARCH_RESULTS_FILE is not set" + exit 1 + fi + + + if [[ -z "$UPLOAD_RESULTS_FILE" ]]; then + echo "UPLOAD_RESULTS_FILE is not set" + exit 1 + fi fi - -if [[ -z "$UPLOAD_RESULTS_FILE" ]]; then - echo "UPLOAD_RESULTS_FILE is not set" +if [[ -z "$VM_RSS_MEMORY_USAGE_FILE" ]]; then + echo "VM_RSS_MEMORY_USAGE_FILE is not set" exit 1 fi - -if [[ -z "$MEMORY_USAGE_FILE" ]]; then - echo "MEMORY_USAGE_FILE is not set" +if [[ -z "$RSS_ANON_MEMORY_USAGE_FILE" ]]; then + echo "RSS_ANON_MEMORY_USAGE_FILEis not set" exit 1 fi @@ -51,23 +71,70 @@ if [[ -z "$ROOT_API_RESPONSE_FILE" ]]; then exit 1 fi -RPS=$(jq -r '.results.rps' "$SEARCH_RESULTS_FILE") -MEAN_PRECISIONS=$(jq -r '.results.mean_precisions' "$SEARCH_RESULTS_FILE") -P95_TIME=$(jq -r '.results.p95_time' "$SEARCH_RESULTS_FILE") -P99_TIME=$(jq -r '.results.p99_time' "$SEARCH_RESULTS_FILE") +if [[ "$BENCHMARK_STRATEGY" == "default" ]]; then + if [[ -z "$CPU_USAGE_FILE" ]]; then + echo "CPU_USAGE_FILE is not set" + exit 1 + fi +fi -UPLOAD_TIME=$(jq -r '.results.upload_time' "$UPLOAD_RESULTS_FILE") -INDEXING_TIME=$(jq -r '.results.total_time' "$UPLOAD_RESULTS_FILE") +COLLECTION_LOAD_TIME=NULL +RPS=NULL +MEAN_PRECISIONS=NULL +P95_TIME=NULL +P99_TIME=NULL +UPLOAD_TIME=NULL +INDEXING_TIME=NULL +CPU=NULL +CPU_TELEMETRY=NULL + +if [[ "$BENCHMARK_STRATEGY" == "collection-reload" ]]; then + # this strategy does not produce search & upload results files + echo "BENCHMARK_STRATEGY is $BENCHMARK_STRATEGY, upload telemetry" + COLLECTION_LOAD_TIME=$(jq -r '.result.collections.collections[] | select(.id == "benchmark") | .init_time_ms' "$TELEMETRY_API_RESPONSE_FILE") +else + # any other strategies are considered to have search & upload results + RPS=$(jq -r '.results.rps' "$SEARCH_RESULTS_FILE") + MEAN_PRECISIONS=$(jq -r '.results.mean_precisions' "$SEARCH_RESULTS_FILE") + P95_TIME=$(jq -r '.results.p95_time' "$SEARCH_RESULTS_FILE") + P99_TIME=$(jq -r '.results.p99_time' "$SEARCH_RESULTS_FILE") + + UPLOAD_TIME=$(jq -r '.results.upload_time' "$UPLOAD_RESULTS_FILE") + INDEXING_TIME=$(jq -r '.results.total_time' "$UPLOAD_RESULTS_FILE") +fi + +VM_RSS_MEMORY_USAGE=$(cat "$VM_RSS_MEMORY_USAGE_FILE" | tr -d '[:space:]') +RSS_ANON_MEMORY_USAGE=$(cat "$RSS_ANON_MEMORY_USAGE_FILE" | tr -d '[:space:]') -MEMORY_USAGE=$(cat "$MEMORY_USAGE_FILE") +if [[ "$BENCHMARK_STRATEGY" == "default" ]]; then + # Only this strategy produces cpu usage results files + CPU=$(cat "$CPU_USAGE_FILE" | tr -d '[:space:]') +fi +CPU_TELEMETRY=$(jq -r '.result.hardware.collection_data.benchmark.cpu' "$TELEMETRY_API_RESPONSE_FILE") QDRANT_COMMIT=$(jq -r '.commit' "$ROOT_API_RESPONSE_FILE") MEASURE_TIMESTAMP=${MEASURE_TIMESTAMP:-$(date -u +"%Y-%m-%dT%H:%M:%SZ")} - -docker run --rm jbergknoff/postgresql-client "postgresql://qdrant:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/postgres" -c " -INSERT INTO ${POSTGRES_TABLE} (engine, branch, commit, dataset, measure_timestamp, upload_time, indexing_time, rps, mean_precisions, p95_time, p99_time, memory_usage) -VALUES ('qdrant-ci', '${QDRANT_VERSION}', '${QDRANT_COMMIT}', '${DATASETS}', '${MEASURE_TIMESTAMP}', ${UPLOAD_TIME}, ${INDEXING_TIME}, ${RPS}, ${MEAN_PRECISIONS}, ${P95_TIME}, ${P99_TIME}, ${MEMORY_USAGE}); +docker run --name "vector-db" --rm jbergknoff/postgresql-client "postgresql://qdrant:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/postgres" -c " +INSERT INTO ${POSTGRES_TABLE} (engine, branch, commit, dataset, measure_timestamp, upload_time, indexing_time, rps, mean_precisions, p95_time, p99_time, vm_rss_mem, rss_anon_mem, collection_load_time_ms, cpu_telemetry, cpu) +VALUES ('qdrant-ci', '${QDRANT_VERSION}', '${QDRANT_COMMIT}', '${DATASETS}', '${MEASURE_TIMESTAMP}', ${UPLOAD_TIME}, ${INDEXING_TIME}, ${RPS}, ${MEAN_PRECISIONS}, ${P95_TIME}, ${P99_TIME}, ${VM_RSS_MEMORY_USAGE}, ${RSS_ANON_MEMORY_USAGE}, ${COLLECTION_LOAD_TIME}, ${CPU_TELEMETRY}, ${CPU}); " +if [[ "$IS_CI_RUN" == "true" ]]; then + echo "collection_load_time=${COLLECTION_LOAD_TIME}" >> "$GITHUB_OUTPUT" + + echo "rps=${RPS}" >> "$GITHUB_OUTPUT" + echo "mean_precisions=${MEAN_PRECISIONS}" >> "$GITHUB_OUTPUT" + echo "p95_time=${P95_TIME}" >> "$GITHUB_OUTPUT" + echo "p99_time=${P99_TIME}" >> "$GITHUB_OUTPUT" + + echo "vm_rss_memory_usage=${VM_RSS_MEMORY_USAGE}" >> "$GITHUB_OUTPUT" + echo "rss_anon_memory_usage=${RSS_ANON_MEMORY_USAGE}" >> "$GITHUB_OUTPUT" + + echo "upload_time=${UPLOAD_TIME}" >> "$GITHUB_OUTPUT" + echo "indexing_time=${INDEXING_TIME}" >> "$GITHUB_OUTPUT" + + echo "cpu_telemetry=${CPU_TELEMETRY}" >> "$GITHUB_OUTPUT" + echo "cpu=${CPU}" >> "$GITHUB_OUTPUT" +fi diff --git a/tools/wait_for_green_status.sh b/tools/wait_for_green_status.sh new file mode 100755 index 00000000..229a9527 --- /dev/null +++ b/tools/wait_for_green_status.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# This scripts helps to wait for Opensearch|Elasticsearch status to become Green + +set -e + +SEARCH_CLUSTER_HOST=${1:-"localhost:9200"} + +# Wait until the search cluster host is available +until $(curl --output /dev/null --silent --head --fail "$SEARCH_CLUSTER_HOST"); do + printf '.' + sleep 1 # Wait for 1 second +done + +# Wait for ES/OS to start +response=$(curl --write-out %{http_code} --silent --output /dev/null "$SEARCH_CLUSTER_HOST") + +until [ "$response" = "200" ]; do + response=$(curl --write-out %{http_code} --silent --output /dev/null "$SEARCH_CLUSTER_HOST") + >&2 echo "Search cluster is unavailable - sleep 1s" + sleep 1 +done + +# Wait for ES/OS status to turn Green +health="$(curl -fsSL "$SEARCH_CLUSTER_HOST/_cat/health?h=status")" +health="$(echo "$health" | sed -r 's/^[[:space:]]+|[[:space:]]+$//g')" + +until [ "$health" = 'green' ]; do + health="$(curl -fsSL "$SEARCH_CLUSTER_HOST/_cat/health?h=status")" + health="$(echo "$health" | sed -r 's/^[[:space:]]+|[[:space:]]+$//g')" + >&2 echo "Search cluster status is not green yet - sleep 1s" + sleep 1 +done + +>&2 echo "Search cluster is up" \ No newline at end of file