diff --git a/.env.template b/.env.template index 138346463..84dc46d1c 100644 --- a/.env.template +++ b/.env.template @@ -6,7 +6,7 @@ # Default graph database : Kuzu # # These default databases are all file-based, so no extra setup is needed -# for local use. +# for local use. The data by default will be stored in your .venv ############################################################################### ################################################################################ @@ -16,7 +16,7 @@ STRUCTURED_OUTPUT_FRAMEWORK="instructor" LLM_API_KEY="your_api_key" -LLM_MODEL="openai/gpt-4o-mini" +LLM_MODEL="openai/gpt-5-mini" LLM_PROVIDER="openai" LLM_ENDPOINT="" LLM_API_VERSION="" @@ -33,11 +33,20 @@ EMBEDDING_MAX_TOKENS=8191 # If using BAML structured output these env variables will be used BAML_LLM_PROVIDER=openai -BAML_LLM_MODEL="gpt-4o-mini" +BAML_LLM_MODEL="gpt-5-mini" BAML_LLM_ENDPOINT="" BAML_LLM_API_KEY="your_api_key" BAML_LLM_API_VERSION="" + +################################################################################ +# 📂 ROOT DIRECTORY FOR DATABASES +################################################################################ +# Set up the Cognee system directory. Cognee will store system files and databases here. +# Useful for setting root directory inside docker and also to avoid storing the databases in .venv +# DATA_ROOT_DIRECTORY='/Users//Desktop/cognee/.cognee_data/' +# SYSTEM_ROOT_DIRECTORY='/Users//Desktop/cognee/.cognee_system/' + ################################################################################ # 🗄️ Relational database settings ################################################################################ @@ -85,12 +94,7 @@ VECTOR_DB_PROVIDER="lancedb" VECTOR_DB_URL= VECTOR_DB_KEY= -################################################################################ -# 📂 ROOT DIRECTORY IF USING COGNEE LIB INSIDE A DOCKER -################################################################################ -# Set up the Cognee system directory. Cognee will store system files and databases here. -# DATA_ROOT_DIRECTORY='/Users//Desktop/cognee/.cognee_data/' -# SYSTEM_ROOT_DIRECTORY='/Users//Desktop/cognee/.cognee_system/' + ################################################################################ # 🔄 MIGRATION (RELATIONAL → GRAPH) SETTINGS @@ -157,8 +161,8 @@ LITELLM_LOG="ERROR" # Uncomment + fill values to switch. ########## Azure OpenAI ####################################################### -#LLM_MODEL="azure/gpt-4o-mini" -#LLM_ENDPOINT="https://DNS.azure.com/openai/deployments/gpt-4o-mini" +#LLM_MODEL="azure/gpt-5-mini" +#LLM_ENDPOINT="https://DNS.azure.com/openai/deployments/gpt-5-mini" #LLM_API_KEY="< /dev/null 2>&1; then + echo "Neo4j is ready!" + break + fi + echo "Waiting... ($counter/$timeout)" + sleep 2 + counter=$((counter + 2)) + done + + if [ $counter -ge $timeout ]; then + echo "Neo4j failed to start within $timeout seconds" + docker logs neo4j-test + exit 1 + fi + + - name: Verify GDS is available + shell: bash + run: | + echo "Verifying Graph Data Science library is available..." + docker exec neo4j-test cypher-shell -u neo4j -p "${{ inputs.neo4j-password }}" \ + "CALL gds.version() YIELD gdsVersion RETURN gdsVersion" + echo "GDS verification complete!" diff --git a/.github/workflows/basic_tests.yml b/.github/workflows/basic_tests.yml index 28c708ddb..2173b228e 100644 --- a/.github/workflows/basic_tests.yml +++ b/.github/workflows/basic_tests.yml @@ -98,7 +98,7 @@ jobs: python-version: ${{ inputs.python-version }} - name: Run Unit Tests - run: poetry run pytest cognee/tests/unit/ + run: uv run pytest cognee/tests/unit/ integration-tests: name: Run Integration Tests @@ -115,7 +115,7 @@ jobs: python-version: ${{ inputs.python-version }} - name: Run Integration Tests - run: poetry run pytest cognee/tests/integration/ + run: uv run pytest cognee/tests/integration/ simple-examples: name: Run Simple Examples @@ -144,7 +144,7 @@ jobs: python-version: ${{ inputs.python-version }} - name: Run Simple Examples - run: poetry run python ./examples/python/simple_example.py + run: uv run python ./examples/python/simple_example.py simple-examples-baml: name: Run Simple Examples BAML @@ -180,7 +180,7 @@ jobs: python-version: ${{ inputs.python-version }} - name: Run Simple Examples - run: poetry run python ./examples/python/simple_example.py + run: uv run python ./examples/python/simple_example.py graph-tests: name: Run Basic Graph Tests @@ -209,4 +209,4 @@ jobs: python-version: ${{ inputs.python-version }} - name: Run Graph Tests - run: poetry run python ./examples/python/code_graph_example.py --repo_path ./cognee/tasks/graph + run: uv run python ./examples/python/code_graph_example.py --repo_path ./cognee/tasks/graph diff --git a/.github/workflows/db_examples_tests.yml b/.github/workflows/db_examples_tests.yml index f585e8200..a1a81b4d4 100644 --- a/.github/workflows/db_examples_tests.yml +++ b/.github/workflows/db_examples_tests.yml @@ -54,10 +54,6 @@ jobs: with: python-version: ${{ inputs.python-version }} - - name: Install Neo4j extra - run: | - poetry install -E neo4j - - name: Run Neo4j Example env: ENV: dev @@ -74,7 +70,7 @@ jobs: GRAPH_DATABASE_USERNAME: "neo4j" GRAPH_DATABASE_PASSWORD: ${{ secrets.NEO4J_API_KEY }} run: | - poetry run python examples/database_examples/neo4j_example.py + uv run python examples/database_examples/neo4j_example.py run-db-example-kuzu: name: "Kuzu DB Example Test" @@ -90,9 +86,8 @@ jobs: with: python-version: ${{ inputs.python-version }} - - name: Install Kuzu extra - run: | - poetry install + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run Kuzu Example env: @@ -107,7 +102,7 @@ jobs: EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} GRAPH_DATABASE_PROVIDER: "kuzu" run: | - poetry run python examples/database_examples/kuzu_example.py + uv run python examples/database_examples/kuzu_example.py run-db-example-pgvector: name: "PostgreSQL PGVector DB Example Test" @@ -138,10 +133,7 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: ${{ inputs.python-version }} - - - name: Install PGVector extra - run: | - poetry install -E postgres + extra-dependencies: "postgres" - name: Run PGVector Example env: @@ -155,4 +147,4 @@ jobs: EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} run: | - poetry run python examples/database_examples/pgvector_example.py + uv run python examples/database_examples/pgvector_example.py diff --git a/.github/workflows/e2e_tests.yml b/.github/workflows/e2e_tests.yml index 99eb2a72c..54a7cf98c 100644 --- a/.github/workflows/e2e_tests.yml +++ b/.github/workflows/e2e_tests.yml @@ -57,7 +57,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_cognee_server_start.py + run: uv run python ./cognee/tests/test_cognee_server_start.py run-telemetry-test: name: Run Telemetry Test @@ -81,7 +81,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_telemetry.py + run: uv run python ./cognee/tests/test_telemetry.py run-telemetry-pipeline-test: name: Run Telemetry Pipeline Test @@ -110,7 +110,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_library.py + run: uv run python ./cognee/tests/test_library.py run-deduplication-test: name: Deduplication Test @@ -140,10 +140,7 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: '3.11.x' - - - name: Install specific db dependency - run: | - poetry install -E postgres + extra-dependencies: "postgres" - name: Run Deduplication Example env: @@ -154,7 +151,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_deduplication.py + run: uv run python ./cognee/tests/test_deduplication.py run-deletion-test: name: Deletion Test @@ -179,7 +176,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_deletion.py + run: uv run python ./cognee/tests/test_deletion.py run-s3-bucket-test: name: S3 Bucket Test @@ -192,10 +189,10 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: '3.11.x' + extra-dependencies: "aws" - - name: Install specific S3 dependency - run: | - poetry install -E aws + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run S3 Bucket Test env: @@ -210,7 +207,7 @@ jobs: EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - run: poetry run python ./cognee/tests/test_s3.py + run: uv run python ./cognee/tests/test_s3.py test-parallel-databases: name: Test using different async databases in parallel in Cognee @@ -224,9 +221,8 @@ jobs: with: python-version: '3.11.x' - - name: Install specific graph db dependency - run: | - poetry install + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run parallel databases test env: @@ -239,7 +235,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_parallel_databases.py + run: uv run python ./cognee/tests/test_parallel_databases.py test-permissions: name: Test permissions with different situations in Cognee @@ -253,9 +249,8 @@ jobs: with: python-version: '3.11.x' - - name: Install specific graph db dependency - run: | - poetry install + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run parallel databases test env: @@ -268,7 +263,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_permissions.py + run: uv run python ./cognee/tests/test_permissions.py test-graph-edges: name: Test graph edge ingestion @@ -282,9 +277,8 @@ jobs: with: python-version: '3.11.x' - - name: Install specific graph db dependency - run: | - poetry install + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run graph edges test env: @@ -297,4 +291,4 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_edge_ingestion.py + run: uv run python ./cognee/tests/test_edge_ingestion.py diff --git a/.github/workflows/examples_tests.yml b/.github/workflows/examples_tests.yml index 796faf2e0..1dc720f8e 100644 --- a/.github/workflows/examples_tests.yml +++ b/.github/workflows/examples_tests.yml @@ -20,7 +20,7 @@ jobs: env: LLM_API_KEY: ${{ secrets.OPENAI_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - run: poetry run python ./examples/python/multimedia_example.py + run: uv run python ./examples/python/multimedia_example.py test-eval-example: name: Run Eval Example @@ -33,10 +33,7 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: '3.11.x' - - - name: Install specific eval dependency - run: | - poetry install -E deepeval + extra-dependencies: "deepeval" - name: Run Evaluation Framework Example env: @@ -49,7 +46,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/eval_framework/run_eval.py + run: uv run python ./cognee/eval_framework/run_eval.py test-descriptive-metrics: name: Run Descriptive Metrics Example @@ -63,6 +60,10 @@ jobs: with: python-version: '3.11.x' + - name: Setup Neo4j with GDS + uses: ./.github/actions/setup_neo4j + id: neo4j + - name: Run Descriptive Graph Metrics Example env: LLM_MODEL: ${{ secrets.LLM_MODEL }} @@ -74,7 +75,11 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/tasks/descriptive_metrics/networkx_metrics_test.py + GRAPH_DATABASE_PROVIDER: "neo4j" + GRAPH_DATABASE_URL: ${{ steps.neo4j.outputs.neo4j-url }} + GRAPH_DATABASE_USERNAME: ${{ steps.neo4j.outputs.neo4j-username }} + GRAPH_DATABASE_PASSWORD: ${{ steps.neo4j.outputs.neo4j-password }} + run: uv run python ./cognee/tests/tasks/descriptive_metrics/neo4j_metrics_test.py test-dynamic-steps-metrics: @@ -100,4 +105,4 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./examples/python/dynamic_steps_example.py + run: uv run python ./examples/python/dynamic_steps_example.py diff --git a/.github/workflows/graph_db_tests.yml b/.github/workflows/graph_db_tests.yml index 379539e14..e7e5a11b8 100644 --- a/.github/workflows/graph_db_tests.yml +++ b/.github/workflows/graph_db_tests.yml @@ -28,9 +28,8 @@ jobs: with: python-version: ${{ inputs.python-version }} - - name: Install specific db dependency - run: | - poetry install + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run Kuzu Tests env: @@ -43,7 +42,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_kuzu.py + run: uv run python ./cognee/tests/test_kuzu.py - name: Run Weighted Edges Tests with Kuzu env: @@ -57,7 +56,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v + run: uv run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v run-neo4j-tests: name: Neo4j Tests @@ -72,10 +71,6 @@ jobs: with: python-version: ${{ inputs.python-version }} - - name: Install specific db dependency - run: | - poetry install -E neo4j - - name: Run default Neo4j env: ENV: 'dev' @@ -91,7 +86,7 @@ jobs: GRAPH_DATABASE_URL: ${{ secrets.NEO4J_API_URL }} GRAPH_DATABASE_PASSWORD: ${{ secrets.NEO4J_API_KEY }} GRAPH_DATABASE_USERNAME: "neo4j" - run: poetry run python ./cognee/tests/test_neo4j.py + run: uv run python ./cognee/tests/test_neo4j.py - name: Run Weighted Edges Tests with Neo4j env: @@ -108,4 +103,4 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v + run: uv run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v diff --git a/.github/workflows/python_version_tests.yml b/.github/workflows/python_version_tests.yml index 6db67d115..d7a7da050 100644 --- a/.github/workflows/python_version_tests.yml +++ b/.github/workflows/python_version_tests.yml @@ -55,7 +55,7 @@ jobs: - name: Run unit tests shell: bash - run: poetry run pytest cognee/tests/unit/ + run: uv run pytest cognee/tests/unit/ env: PYTHONUTF8: 1 LLM_PROVIDER: openai @@ -73,7 +73,7 @@ jobs: - name: Run integration tests if: ${{ !contains(matrix.os, 'windows') }} shell: bash - run: poetry run pytest cognee/tests/integration/ + run: uv run pytest cognee/tests/integration/ env: PYTHONUTF8: 1 LLM_PROVIDER: openai @@ -103,11 +103,11 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_library.py + run: uv run python ./cognee/tests/test_library.py - - name: Build with Poetry + - name: Build with uv shell: bash - run: poetry build + run: uv build - name: Install Package if: ${{ !contains(matrix.os, 'windows') }} diff --git a/.github/workflows/relational_db_migration_tests.yml b/.github/workflows/relational_db_migration_tests.yml index e44d54d02..26fd7e150 100644 --- a/.github/workflows/relational_db_migration_tests.yml +++ b/.github/workflows/relational_db_migration_tests.yml @@ -58,10 +58,10 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: '3.11.x' + extra-dependencies: "postgres" - name: Install specific db dependency - run: | - poetry install -E postgres + run: echo "Dependencies already installed in setup" - name: Run PostgreSQL Script to create test data (Chinook_PostgreSql.sql) env: @@ -90,7 +90,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_relational_db_migration.py + run: uv run python ./cognee/tests/test_relational_db_migration.py run-relational-db-migration-test-kuzu: name: Kuzu Relational DB Migration Test @@ -120,10 +120,10 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: '3.11.x' + extra-dependencies: "postgres" - name: Install specific db dependency - run: | - poetry install -E postgres + run: echo "Dependencies already installed in setup" - name: Run PostgreSQL Script to create test data (Chinook_PostgreSql.sql) env: @@ -154,7 +154,7 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_relational_db_migration.py + run: uv run python ./cognee/tests/test_relational_db_migration.py run-relational-db-migration-test-neo4j: name: Neo4j Relational DB Migration Test @@ -184,10 +184,10 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: '3.11.x' + extra-dependencies: "postgres" - name: Install specific db dependency - run: | - poetry install -E postgres -E neo4j + run: echo "Dependencies already installed in setup" - name: Run PostgreSQL Script to create test data (Chinook_PostgreSql.sql) env: @@ -221,4 +221,4 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_relational_db_migration.py + run: uv run python ./cognee/tests/test_relational_db_migration.py diff --git a/.github/workflows/reusable_notebook.yml b/.github/workflows/reusable_notebook.yml index 4f97476ef..8eaf7ce3a 100644 --- a/.github/workflows/reusable_notebook.yml +++ b/.github/workflows/reusable_notebook.yml @@ -46,10 +46,7 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: ${{ inputs.python-version }} - - - name: Install specific db dependency - run: | - poetry install -E notebook + extra-dependencies: "notebook" - name: Execute Jupyter Notebook env: @@ -64,7 +61,7 @@ jobs: EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} run: | - poetry run jupyter nbconvert \ + uv run jupyter nbconvert \ --to notebook \ --execute ${{ inputs.notebook-location }} \ --output executed_notebook.ipynb \ diff --git a/.github/workflows/search_db_tests.yml b/.github/workflows/search_db_tests.yml index 3f4bbf1ca..0b749526d 100644 --- a/.github/workflows/search_db_tests.yml +++ b/.github/workflows/search_db_tests.yml @@ -28,9 +28,8 @@ jobs: with: python-version: ${{ inputs.python-version }} - - name: Install specific db dependency - run: | - poetry install + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run Kuzu search Tests env: @@ -46,7 +45,7 @@ jobs: GRAPH_DATABASE_PROVIDER: 'kuzu' VECTOR_DB_PROVIDER: 'lancedb' DB_PROVIDER: 'sqlite' - run: poetry run python ./cognee/tests/test_search_db.py + run: uv run python ./cognee/tests/test_search_db.py run-neo4j-lance-sqlite-search-tests: name: Search test for Neo4j/LanceDB/Sqlite @@ -78,9 +77,8 @@ jobs: with: python-version: ${{ inputs.python-version }} - - name: Install specific db dependency - run: | - poetry install -E neo4j + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run Neo4j search Tests env: @@ -99,7 +97,7 @@ jobs: GRAPH_DATABASE_URL: bolt://localhost:7687 GRAPH_DATABASE_USERNAME: neo4j GRAPH_DATABASE_PASSWORD: pleaseletmein - run: poetry run python ./cognee/tests/test_search_db.py + run: uv run python ./cognee/tests/test_search_db.py run-kuzu-pgvector-postgres-search-tests: name: Search test for Kuzu/PGVector/Postgres @@ -129,9 +127,10 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: ${{ inputs.python-version }} + extra-dependencies: "postgres" - - name: Install dependencies - run: poetry install -E postgres + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run Kuzu/PGVector/Postgres Tests env: @@ -152,7 +151,7 @@ jobs: DB_PORT: 5432 DB_USERNAME: cognee DB_PASSWORD: cognee - run: poetry run python ./cognee/tests/test_search_db.py + run: uv run python ./cognee/tests/test_search_db.py run-neo4j-pgvector-postgres-search-tests: name: Search test for Neo4j/PGVector/Postgres @@ -195,10 +194,10 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: ${{ inputs.python-version }} + extra-dependencies: "postgres" - - name: Install dependencies - run: | - poetry install -E neo4j -E postgres + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run Neo4j + PGVector + Postgres search Tests env: @@ -222,4 +221,4 @@ jobs: DB_PORT: 5432 DB_USERNAME: cognee DB_PASSWORD: cognee - run: poetry run python ./cognee/tests/test_search_db.py + run: uv run python ./cognee/tests/test_search_db.py diff --git a/.github/workflows/test_gemini.yml b/.github/workflows/test_gemini.yml index 41fd954a2..544e15a5e 100644 --- a/.github/workflows/test_gemini.yml +++ b/.github/workflows/test_gemini.yml @@ -26,4 +26,4 @@ jobs: EMBEDDING_MODEL: "gemini/text-embedding-004" EMBEDDING_DIMENSIONS: "768" EMBEDDING_MAX_TOKENS: "8076" - run: poetry run python ./examples/python/simple_example.py + run: uv run python ./examples/python/simple_example.py diff --git a/.github/workflows/test_ollama.yml b/.github/workflows/test_ollama.yml index 8f85efadc..fbd687319 100644 --- a/.github/workflows/test_ollama.yml +++ b/.github/workflows/test_ollama.yml @@ -26,7 +26,7 @@ jobs: - name: Install torch dependency run: | - poetry add torch + uv add torch # - name: Install ollama # run: curl -fsSL https://ollama.com/install.sh | sh @@ -101,4 +101,4 @@ jobs: EMBEDDING_ENDPOINT: "http://localhost:11434/api/embeddings" EMBEDDING_DIMENSIONS: "4096" HUGGINGFACE_TOKENIZER: "Salesforce/SFR-Embedding-Mistral" - run: poetry run python ./examples/python/simple_example.py + run: uv run python ./examples/python/simple_example.py diff --git a/.github/workflows/test_s3_file_storage.yml b/.github/workflows/test_s3_file_storage.yml index 8035a9bc3..c4866ec2d 100644 --- a/.github/workflows/test_s3_file_storage.yml +++ b/.github/workflows/test_s3_file_storage.yml @@ -36,4 +36,4 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_s3_file_storage.py + run: uv run python ./cognee/tests/test_s3_file_storage.py diff --git a/.github/workflows/vector_db_tests.yml b/.github/workflows/vector_db_tests.yml index 00ce21cbf..a82194db3 100644 --- a/.github/workflows/vector_db_tests.yml +++ b/.github/workflows/vector_db_tests.yml @@ -56,7 +56,7 @@ jobs: # EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} # EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} # EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - # run: poetry run python ./cognee/tests/test_chromadb.py + # run: uv run python ./cognee/tests/test_chromadb.py run-postgres-tests: @@ -87,10 +87,7 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: ${{ inputs.python-version }} - - - name: Install specific db dependency - run: | - poetry install -E postgres + extra-dependencies: "postgres" - name: Run PGVector Tests env: @@ -103,4 +100,4 @@ jobs: EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }} EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }} EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }} - run: poetry run python ./cognee/tests/test_pgvector.py + run: uv run python ./cognee/tests/test_pgvector.py diff --git a/.github/workflows/weighted_edges_tests.yml b/.github/workflows/weighted_edges_tests.yml index d33bd1ceb..df5e048f2 100644 --- a/.github/workflows/weighted_edges_tests.yml +++ b/.github/workflows/weighted_edges_tests.yml @@ -31,7 +31,7 @@ jobs: python-version: ['3.11', '3.12'] env: LLM_PROVIDER: openai - LLM_MODEL: gpt-4o-mini + LLM_MODEL: gpt-5-mini LLM_API_KEY: ${{ secrets.LLM_API_KEY }} steps: @@ -47,11 +47,11 @@ jobs: - name: Run Weighted Edges Unit Tests run: | - poetry run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v --tb=short + uv run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v --tb=short - name: Run Standard Graph Tests (Regression) run: | - poetry run pytest cognee/tests/unit/interfaces/graph/get_graph_from_model_unit_test.py -v --tb=short + uv run pytest cognee/tests/unit/interfaces/graph/get_graph_from_model_unit_test.py -v --tb=short test-with-different-databases: name: Test Weighted Edges with Different Graph Databases @@ -61,14 +61,12 @@ jobs: database: ['kuzu', 'neo4j'] include: - database: kuzu - install_extra: "" graph_db_provider: "kuzu" - database: neo4j - install_extra: "-E neo4j" graph_db_provider: "neo4j" env: LLM_PROVIDER: openai - LLM_MODEL: gpt-4o-mini + LLM_MODEL: gpt-5-mini LLM_ENDPOINT: https://api.openai.com/v1/ LLM_API_KEY: ${{ secrets.LLM_API_KEY }} LLM_API_VERSION: "2024-02-01" @@ -88,22 +86,21 @@ jobs: with: python-version: '3.11' - - name: Install Database Dependencies - run: | - poetry install ${{ matrix.install_extra }} + - name: Dependencies already installed + run: echo "Dependencies already installed in setup" - name: Run Weighted Edges Tests env: GRAPH_DATABASE_PROVIDER: ${{ matrix.graph_db_provider }} run: | - poetry run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v --tb=short + uv run pytest cognee/tests/unit/interfaces/graph/test_weighted_edges.py -v --tb=short test-examples: name: Test Weighted Edges Examples runs-on: ubuntu-22.04 env: LLM_PROVIDER: openai - LLM_MODEL: gpt-4o-mini + LLM_MODEL: gpt-5-mini LLM_ENDPOINT: https://api.openai.com/v1/ LLM_API_KEY: ${{ secrets.LLM_API_KEY }} LLM_API_VERSION: "2024-02-01" @@ -125,7 +122,7 @@ jobs: - name: Test Weighted Edges Example run: | - poetry run python examples/python/weighted_edges_example.py + uv run python examples/python/weighted_edges_example.py - name: Verify Visualization File Created run: | diff --git a/README.md b/README.md index 194ede720..a7e7f1e05 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,8 @@ Your contributions are at the core of making this a true open source project. An ## 📦 Installation You can install Cognee using either **pip**, **poetry**, **uv** or any other python package manager. -Cognee supports Python 3.8 to 3.12 + +Cognee supports Python 3.10 to 3.13 ### With pip @@ -102,7 +103,7 @@ pip install cognee ## Local Cognee installation -You can install the local Cognee repo using **pip**, **poetry** and **uv**. +You can install the local Cognee repo using **uv**, **pip** and **poetry**. For local pip installation please make sure your pip version is above version 21.3. ### with UV with all optional dependencies diff --git a/assets/cognee_benefits.png b/assets/cognee_benefits.png index f4b32066d..2a2ed7628 100644 Binary files a/assets/cognee_benefits.png and b/assets/cognee_benefits.png differ diff --git a/cognee-frontend/src/ui/Partials/SettingsModal/Settings.tsx b/cognee-frontend/src/ui/Partials/SettingsModal/Settings.tsx index 8a2638ec3..70aa38b44 100644 --- a/cognee-frontend/src/ui/Partials/SettingsModal/Settings.tsx +++ b/cognee-frontend/src/ui/Partials/SettingsModal/Settings.tsx @@ -34,8 +34,8 @@ // }; // const defaultModel = { -// label: 'gpt-4o-mini', -// value: 'gpt-4o-mini', +// label: 'gpt-5-mini', +// value: 'gpt-5-mini', // }; // export default function Settings({ onDone = () => {}, submitButtonText = 'Save' }) { diff --git a/cognee-mcp/pyproject.toml b/cognee-mcp/pyproject.toml index 7dd9ad8e2..a90457457 100644 --- a/cognee-mcp/pyproject.toml +++ b/cognee-mcp/pyproject.toml @@ -8,7 +8,7 @@ requires-python = ">=3.10" dependencies = [ # For local cognee repo usage remove comment bellow and add absolute path to cognee. Then run `uv sync --reinstall` in the mcp folder on local cognee changes. # "cognee[postgres,codegraph,gemini,huggingface,docs,neo4j] @ file:/Users/vasilije/Projects/tiktok/cognee", - "cognee[postgres,codegraph,gemini,huggingface,docs,neo4j]==0.2.1", + "cognee[postgres,codegraph,gemini,huggingface,docs,neo4j]==0.2.2", "fastmcp>=2.10.0,<3.0.0", "mcp>=1.12.0,<2.0.0", "uv>=0.6.3,<1.0.0", diff --git a/cognee-mcp/src/server.py b/cognee-mcp/src/server.py index a657225f5..3e65a5eb7 100755 --- a/cognee-mcp/src/server.py +++ b/cognee-mcp/src/server.py @@ -221,14 +221,6 @@ async def cognify(data: str, graph_model_file: str = None, graph_model_name: str - The actual cognify process may take significant time depending on text length - Use the cognify_status tool to check the progress of the operation - Raises - ------ - InvalidValueError - If LLM_API_KEY is not set - ValueError - If chunks exceed max token limits (reduce chunk_size) - DatabaseNotCreatedError - If databases are not properly initialized """ async def cognify_task( @@ -512,14 +504,6 @@ async def search(search_query: str, search_type: str) -> list: - Different search types produce different output formats - The function handles the conversion between Cognee's internal result format and MCP's output format - Raises - ------ - InvalidValueError - If LLM_API_KEY is not set (for LLM-based search types) - ValueError - If query_text is empty or search parameters are invalid - NoDataError - If no relevant data found for the search query """ async def search_task(search_query: str, search_type: str) -> str: diff --git a/cognee-starter-kit/.env.template b/cognee-starter-kit/.env.template index 10fea5553..1aefd2739 100644 --- a/cognee-starter-kit/.env.template +++ b/cognee-starter-kit/.env.template @@ -1,6 +1,6 @@ # In case you choose to use OpenAI provider, just adjust the model and api_key. LLM_API_KEY="" -LLM_MODEL="openai/gpt-4o-mini" +LLM_MODEL="openai/gpt-5-mini" LLM_PROVIDER="openai" # Not needed if you use OpenAI LLM_ENDPOINT="" diff --git a/cognee/api/v1/add/add.py b/cognee/api/v1/add/add.py index 7daaaf1dd..e8eea42c3 100644 --- a/cognee/api/v1/add/add.py +++ b/cognee/api/v1/add/add.py @@ -128,17 +128,12 @@ async def add( Optional: - LLM_PROVIDER: "openai" (default), "anthropic", "gemini", "ollama" - - LLM_MODEL: Model name (default: "gpt-4o-mini") + - LLM_MODEL: Model name (default: "gpt-5-mini") - DEFAULT_USER_EMAIL: Custom default user email - DEFAULT_USER_PASSWORD: Custom default user password - VECTOR_DB_PROVIDER: "lancedb" (default), "chromadb", "pgvector" - - GRAPH_DATABASE_PROVIDER: "kuzu" (default), "neo4j", "networkx" + - GRAPH_DATABASE_PROVIDER: "kuzu" (default), "neo4j" - Raises: - FileNotFoundError: If specified file paths don't exist - PermissionError: If user lacks access to files or dataset - UnsupportedFileTypeError: If file format cannot be processed - InvalidValueError: If LLM_API_KEY is not set or invalid """ tasks = [ Task(resolve_data_directories, include_subdirectories=True), diff --git a/cognee/api/v1/cognify/cognify.py b/cognee/api/v1/cognify/cognify.py index c6508f3a7..90c3c469e 100644 --- a/cognee/api/v1/cognify/cognify.py +++ b/cognee/api/v1/cognify/cognify.py @@ -91,7 +91,7 @@ async def cognify( - LangchainChunker: Recursive character splitting with overlap Determines how documents are segmented for processing. chunk_size: Maximum tokens per chunk. Auto-calculated based on LLM if None. - Formula: min(embedding_max_tokens, llm_max_tokens // 2) + Formula: min(embedding_max_completion_tokens, llm_max_completion_tokens // 2) Default limits: ~512-8192 tokens depending on models. Smaller chunks = more granular but potentially fragmented knowledge. ontology_file_path: Path to RDF/OWL ontology file for domain-specific entity types. @@ -177,14 +177,6 @@ async def cognify( - LLM_PROVIDER, LLM_MODEL, VECTOR_DB_PROVIDER, GRAPH_DATABASE_PROVIDER - LLM_RATE_LIMIT_ENABLED: Enable rate limiting (default: False) - LLM_RATE_LIMIT_REQUESTS: Max requests per interval (default: 60) - - Raises: - DatasetNotFoundError: If specified datasets don't exist - PermissionError: If user lacks processing rights - InvalidValueError: If LLM_API_KEY is not set - OntologyParsingError: If ontology file is malformed - ValueError: If chunks exceed max token limits (reduce chunk_size) - DatabaseNotCreatedError: If databases are not properly initialized """ tasks = await get_default_tasks(user, graph_model, chunker, chunk_size, ontology_file_path) diff --git a/cognee/api/v1/config/config.py b/cognee/api/v1/config/config.py index 9970b7471..464753438 100644 --- a/cognee/api/v1/config/config.py +++ b/cognee/api/v1/config/config.py @@ -2,7 +2,6 @@ import os from cognee.base_config import get_base_config -from cognee.exceptions import InvalidValueError, InvalidAttributeError from cognee.modules.cognify.config import get_cognify_config from cognee.infrastructure.data.chunking.config import get_chunk_config from cognee.infrastructure.databases.vector import get_vectordb_config @@ -11,6 +10,7 @@ from cognee.infrastructure.llm.config import ( get_llm_config, ) from cognee.infrastructure.databases.relational import get_relational_config, get_migration_config +from cognee.api.v1.exceptions.exceptions import InvalidConfigAttributeError class config: @@ -92,9 +92,7 @@ class config: if hasattr(llm_config, key): object.__setattr__(llm_config, key, value) else: - raise InvalidAttributeError( - message=f"'{key}' is not a valid attribute of the config." - ) + raise InvalidConfigAttributeError(attribute=key) @staticmethod def set_chunk_strategy(chunk_strategy: object): @@ -131,9 +129,7 @@ class config: if hasattr(relational_db_config, key): object.__setattr__(relational_db_config, key, value) else: - raise InvalidAttributeError( - message=f"'{key}' is not a valid attribute of the config." - ) + raise InvalidConfigAttributeError(attribute=key) @staticmethod def set_migration_db_config(config_dict: dict): @@ -145,9 +141,7 @@ class config: if hasattr(migration_db_config, key): object.__setattr__(migration_db_config, key, value) else: - raise InvalidAttributeError( - message=f"'{key}' is not a valid attribute of the config." - ) + raise InvalidConfigAttributeError(attribute=key) @staticmethod def set_graph_db_config(config_dict: dict) -> None: @@ -171,9 +165,7 @@ class config: if hasattr(vector_db_config, key): object.__setattr__(vector_db_config, key, value) else: - raise InvalidAttributeError( - message=f"'{key}' is not a valid attribute of the config." - ) + InvalidConfigAttributeError(attribute=key) @staticmethod def set_vector_db_key(db_key: str): diff --git a/cognee/api/v1/datasets/routers/get_datasets_router.py b/cognee/api/v1/datasets/routers/get_datasets_router.py index 627be226d..a6938d764 100644 --- a/cognee/api/v1/datasets/routers/get_datasets_router.py +++ b/cognee/api/v1/datasets/routers/get_datasets_router.py @@ -13,7 +13,7 @@ from cognee.infrastructure.databases.relational import get_relational_engine from cognee.modules.data.methods import get_authorized_existing_datasets from cognee.modules.data.methods import create_dataset, get_datasets_by_name from cognee.shared.logging_utils import get_logger -from cognee.api.v1.delete.exceptions import DataNotFoundError, DatasetNotFoundError +from cognee.api.v1.exceptions import DataNotFoundError, DatasetNotFoundError from cognee.modules.users.models import User from cognee.modules.users.methods import get_authenticated_user from cognee.modules.users.permissions.methods import ( diff --git a/cognee/api/v1/delete/delete.py b/cognee/api/v1/delete/delete.py index 98f6cb9fc..73f264670 100644 --- a/cognee/api/v1/delete/delete.py +++ b/cognee/api/v1/delete/delete.py @@ -16,7 +16,7 @@ from cognee.modules.users.methods import get_default_user from cognee.modules.data.methods import get_authorized_existing_datasets from cognee.context_global_variables import set_database_global_context_variables -from cognee.api.v1.delete.exceptions import ( +from cognee.api.v1.exceptions import ( DocumentNotFoundError, DatasetNotFoundError, DocumentSubgraphNotFoundError, diff --git a/cognee/api/v1/exceptions/__init__.py b/cognee/api/v1/exceptions/__init__.py new file mode 100644 index 000000000..5767a5801 --- /dev/null +++ b/cognee/api/v1/exceptions/__init__.py @@ -0,0 +1,13 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various data errors +""" + +from .exceptions import ( + InvalidConfigAttributeError, + DocumentNotFoundError, + DatasetNotFoundError, + DataNotFoundError, + DocumentSubgraphNotFoundError, +) diff --git a/cognee/api/v1/delete/exceptions.py b/cognee/api/v1/exceptions/exceptions.py similarity index 61% rename from cognee/api/v1/delete/exceptions.py rename to cognee/api/v1/exceptions/exceptions.py index a4d2a77ed..12dfa9d37 100644 --- a/cognee/api/v1/delete/exceptions.py +++ b/cognee/api/v1/exceptions/exceptions.py @@ -1,10 +1,19 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeConfigurationError, CogneeValidationError from fastapi import status -class DocumentNotFoundError(CogneeApiError): - """Raised when a document cannot be found in the database.""" +class InvalidConfigAttributeError(CogneeConfigurationError): + def __init__( + self, + attribute: str, + name: str = "InvalidConfigAttributeError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + message = f"'{attribute}' is not a valid attribute of the configuration." + super().__init__(message, name, status_code) + +class DocumentNotFoundError(CogneeValidationError): def __init__( self, message: str = "Document not found in database.", @@ -14,9 +23,7 @@ class DocumentNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class DatasetNotFoundError(CogneeApiError): - """Raised when a dataset cannot be found.""" - +class DatasetNotFoundError(CogneeValidationError): def __init__( self, message: str = "Dataset not found.", @@ -26,9 +33,7 @@ class DatasetNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class DataNotFoundError(CogneeApiError): - """Raised when a dataset cannot be found.""" - +class DataNotFoundError(CogneeValidationError): def __init__( self, message: str = "Data not found.", @@ -38,9 +43,7 @@ class DataNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class DocumentSubgraphNotFoundError(CogneeApiError): - """Raised when a document's subgraph cannot be found in the graph database.""" - +class DocumentSubgraphNotFoundError(CogneeValidationError): def __init__( self, message: str = "Document subgraph not found in graph database.", diff --git a/cognee/api/v1/responses/models.py b/cognee/api/v1/responses/models.py index f23b105ee..328c8db7e 100644 --- a/cognee/api/v1/responses/models.py +++ b/cognee/api/v1/responses/models.py @@ -70,7 +70,7 @@ class ResponseRequest(InDTO): tool_choice: Optional[Union[str, Dict[str, Any]]] = "auto" user: Optional[str] = None temperature: Optional[float] = 1.0 - max_tokens: Optional[int] = None + max_completion_tokens: Optional[int] = None class ToolCallOutput(BaseModel): diff --git a/cognee/api/v1/search/search.py b/cognee/api/v1/search/search.py index 118412566..b4499192d 100644 --- a/cognee/api/v1/search/search.py +++ b/cognee/api/v1/search/search.py @@ -161,13 +161,6 @@ async def search( - VECTOR_DB_PROVIDER: Must match what was used during cognify - GRAPH_DATABASE_PROVIDER: Must match what was used during cognify - Raises: - DatasetNotFoundError: If specified datasets don't exist or aren't accessible - PermissionDeniedError: If user lacks read access to requested datasets - NoDataError: If no relevant data found for the search query - InvalidValueError: If LLM_API_KEY is not set (for LLM-based search types) - ValueError: If query_text is empty or search parameters are invalid - CollectionNotFoundError: If vector collection not found (data not processed) """ # We use lists from now on for datasets if isinstance(datasets, UUID) or isinstance(datasets, str): diff --git a/cognee/eval_framework/eval_config.py b/cognee/eval_framework/eval_config.py index 7baf58cf9..6edcc0454 100644 --- a/cognee/eval_framework/eval_config.py +++ b/cognee/eval_framework/eval_config.py @@ -25,7 +25,7 @@ class EvalConfig(BaseSettings): "EM", "f1", ] # Use only 'correctness' for DirectLLM - deepeval_model: str = "gpt-4o-mini" + deepeval_model: str = "gpt-5-mini" # Metrics params calculate_metrics: bool = True diff --git a/cognee/exceptions/__init__.py b/cognee/exceptions/__init__.py index d1d4ecbf5..2f1589291 100644 --- a/cognee/exceptions/__init__.py +++ b/cognee/exceptions/__init__.py @@ -2,13 +2,13 @@ Custom exceptions for the Cognee API. This module defines a set of exceptions for handling various application errors, -such as service failures, resource conflicts, and invalid operations. +such as System, Validation, Configuration or TransientErrors """ from .exceptions import ( CogneeApiError, - ServiceError, - InvalidValueError, - InvalidAttributeError, - CriticalError, + CogneeSystemError, + CogneeValidationError, + CogneeConfigurationError, + CogneeTransientError, ) diff --git a/cognee/exceptions/exceptions.py b/cognee/exceptions/exceptions.py index 46e0af1a8..d956d9cef 100644 --- a/cognee/exceptions/exceptions.py +++ b/cognee/exceptions/exceptions.py @@ -35,37 +35,57 @@ class CogneeApiError(Exception): return f"{self.name}: {self.message} (Status code: {self.status_code})" -class ServiceError(CogneeApiError): - """Failures in external services or APIs, like a database or a third-party service""" +class CogneeSystemError(CogneeApiError): + """System error""" def __init__( self, - message: str = "Service is unavailable.", - name: str = "ServiceError", - status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + message: str = "A system error occurred.", + name: str = "CogneeSystemError", + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + log=True, + log_level="ERROR", ): - super().__init__(message, name, status_code) + super().__init__(message, name, status_code, log, log_level) -class InvalidValueError(CogneeApiError): +class CogneeValidationError(CogneeApiError): + """Validation error""" + def __init__( self, - message: str = "Invalid Value.", - name: str = "InvalidValueError", + message: str = "A validation error occurred.", + name: str = "CogneeValidationError", status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + log=True, + log_level="ERROR", ): - super().__init__(message, name, status_code) + super().__init__(message, name, status_code, log, log_level) -class InvalidAttributeError(CogneeApiError): +class CogneeConfigurationError(CogneeApiError): + """SystemConfigError""" + def __init__( self, - message: str = "Invalid attribute.", - name: str = "InvalidAttributeError", - status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + message: str = "A system configuration error occurred.", + name: str = "CogneeConfigurationError", + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + log=True, + log_level="ERROR", ): - super().__init__(message, name, status_code) + super().__init__(message, name, status_code, log, log_level) -class CriticalError(CogneeApiError): - pass +class CogneeTransientError(CogneeApiError): + """TransientError""" + + def __init__( + self, + message: str = "A transient error occurred.", + name: str = "CogneeTransientError", + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + log=True, + log_level="ERROR", + ): + super().__init__(message, name, status_code, log, log_level) diff --git a/cognee/infrastructure/data/exceptions/__init__.py b/cognee/infrastructure/data/exceptions/__init__.py new file mode 100644 index 000000000..cc5f6044f --- /dev/null +++ b/cognee/infrastructure/data/exceptions/__init__.py @@ -0,0 +1,7 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various data errors +""" + +from .exceptions import KeywordExtractionError diff --git a/cognee/infrastructure/data/exceptions/exceptions.py b/cognee/infrastructure/data/exceptions/exceptions.py new file mode 100644 index 000000000..5c36d6754 --- /dev/null +++ b/cognee/infrastructure/data/exceptions/exceptions.py @@ -0,0 +1,22 @@ +from cognee.exceptions import ( + CogneeValidationError, +) +from fastapi import status + + +class KeywordExtractionError(CogneeValidationError): + """ + Raised when a provided value is syntactically valid but semantically unacceptable + for the given operation. + + Example: + - Passing an empty string to a keyword extraction function. + """ + + def __init__( + self, + message: str = "Extract_keywords cannot extract keywords from empty text.", + name: str = "KeywordExtractionError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + super().__init__(message, name, status_code) diff --git a/cognee/infrastructure/data/utils/extract_keywords.py b/cognee/infrastructure/data/utils/extract_keywords.py index bd4fedd56..8085459c9 100644 --- a/cognee/infrastructure/data/utils/extract_keywords.py +++ b/cognee/infrastructure/data/utils/extract_keywords.py @@ -1,6 +1,6 @@ from sklearn.feature_extraction.text import TfidfVectorizer -from cognee.exceptions import InvalidValueError +from cognee.infrastructure.data.exceptions.exceptions import KeywordExtractionError from cognee.shared.utils import extract_pos_tags @@ -8,7 +8,7 @@ def extract_keywords(text: str) -> list[str]: """ Extract keywords from the provided text string. - This function raises an InvalidValueError if the input text is empty. It processes the + This function raises an KeyWordExtractionError if the input text is empty. It processes the text to extract parts of speech, focusing on nouns, and uses TF-IDF to identify the most relevant keywords based on their frequency. The function returns a list of up to 15 keywords, each having more than 3 characters. @@ -25,7 +25,7 @@ def extract_keywords(text: str) -> list[str]: with more than 3 characters. """ if len(text) == 0: - raise InvalidValueError(message="extract_keywords cannot extract keywords from empty text.") + raise KeywordExtractionError() tags = extract_pos_tags(text) nouns = [word for (word, tag) in tags if tag == "NN"] diff --git a/cognee/infrastructure/databases/exceptions/EmbeddingException.py b/cognee/infrastructure/databases/exceptions/EmbeddingException.py deleted file mode 100644 index 62616899c..000000000 --- a/cognee/infrastructure/databases/exceptions/EmbeddingException.py +++ /dev/null @@ -1,20 +0,0 @@ -from cognee.exceptions import CogneeApiError -from fastapi import status - - -class EmbeddingException(CogneeApiError): - """ - Custom exception for handling embedding-related errors. - - This exception class is designed to indicate issues specifically related to embeddings - within the application. It extends the base exception class CogneeApiError and allows - for customization of the error message, name, and status code. - """ - - def __init__( - self, - message: str = "Embedding Exception.", - name: str = "EmbeddingException", - status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, - ): - super().__init__(message, name, status_code) diff --git a/cognee/infrastructure/databases/exceptions/__init__.py b/cognee/infrastructure/databases/exceptions/__init__.py index 9d8d18567..2969b1c59 100644 --- a/cognee/infrastructure/databases/exceptions/__init__.py +++ b/cognee/infrastructure/databases/exceptions/__init__.py @@ -8,4 +8,7 @@ from .exceptions import ( EntityNotFoundError, EntityAlreadyExistsError, DatabaseNotCreatedError, + EmbeddingException, + MissingQueryParameterError, + MutuallyExclusiveQueryParametersError, ) diff --git a/cognee/infrastructure/databases/exceptions/exceptions.py b/cognee/infrastructure/databases/exceptions/exceptions.py index 7a4220358..c240d3133 100644 --- a/cognee/infrastructure/databases/exceptions/exceptions.py +++ b/cognee/infrastructure/databases/exceptions/exceptions.py @@ -1,13 +1,13 @@ from fastapi import status -from cognee.exceptions import CogneeApiError, CriticalError +from cognee.exceptions import CogneeSystemError, CogneeValidationError, CogneeConfigurationError -class DatabaseNotCreatedError(CriticalError): +class DatabaseNotCreatedError(CogneeSystemError): """ Represents an error indicating that the database has not been created. This error should be raised when an attempt is made to access the database before it has been initialized. - Inherits from CriticalError. Overrides the constructor to include a default message and + Inherits from CogneeSystemError. Overrides the constructor to include a default message and status code. """ @@ -20,10 +20,10 @@ class DatabaseNotCreatedError(CriticalError): super().__init__(message, name, status_code) -class EntityNotFoundError(CogneeApiError): +class EntityNotFoundError(CogneeValidationError): """ Represents an error when a requested entity is not found in the database. This class - inherits from CogneeApiError. + inherits from CogneeValidationError. Public methods: @@ -49,11 +49,11 @@ class EntityNotFoundError(CogneeApiError): # super().__init__(message, name, status_code) :TODO: This is not an error anymore with the dynamic exception handling therefore we shouldn't log error -class EntityAlreadyExistsError(CogneeApiError): +class EntityAlreadyExistsError(CogneeValidationError): """ Represents an error when an entity creation is attempted but the entity already exists. - This class is derived from CogneeApiError and is used to signal a conflict in operations + This class is derived from CogneeValidationError and is used to signal a conflict in operations involving resource creation. """ @@ -66,11 +66,11 @@ class EntityAlreadyExistsError(CogneeApiError): super().__init__(message, name, status_code) -class NodesetFilterNotSupportedError(CogneeApiError): +class NodesetFilterNotSupportedError(CogneeConfigurationError): """ Raise an exception when a nodeset filter is not supported by the current database. - This exception inherits from `CogneeApiError` and is designed to provide information + This exception inherits from `CogneeConfigurationError` and is designed to provide information about the specific issue of unsupported nodeset filters in the context of graph databases. """ @@ -84,3 +84,51 @@ class NodesetFilterNotSupportedError(CogneeApiError): self.message = message self.name = name self.status_code = status_code + + +class EmbeddingException(CogneeConfigurationError): + """ + Custom exception for handling embedding-related errors. + + This exception class is designed to indicate issues specifically related to embeddings + within the application. It extends the base exception class CogneeConfigurationError allows + for customization of the error message, name, and status code. + """ + + def __init__( + self, + message: str = "Embedding Exception.", + name: str = "EmbeddingException", + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + ): + super().__init__(message, name, status_code) + + +class MissingQueryParameterError(CogneeValidationError): + """ + Raised when neither 'query_text' nor 'query_vector' is provided, + and at least one is required to perform the operation. + """ + + def __init__( + self, + name: str = "MissingQueryParameterError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + message = "One of query_text or query_vector must be provided!" + super().__init__(message, name, status_code) + + +class MutuallyExclusiveQueryParametersError(CogneeValidationError): + """ + Raised when both 'text' and 'embedding' are provided to the search function, + but only one type of input is allowed at a time. + """ + + def __init__( + self, + name: str = "MutuallyExclusiveQueryParametersError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + message = "The search function accepts either text or embedding as input, but not both." + super().__init__(message, name, status_code) diff --git a/cognee/infrastructure/databases/graph/get_graph_engine.py b/cognee/infrastructure/databases/graph/get_graph_engine.py index 37be4bc7b..4ec0eb483 100644 --- a/cognee/infrastructure/databases/graph/get_graph_engine.py +++ b/cognee/infrastructure/databases/graph/get_graph_engine.py @@ -21,10 +21,6 @@ async def get_graph_engine() -> GraphDBInterface: if hasattr(graph_client, "initialize"): await graph_client.initialize() - # Handle loading of graph for NetworkX - if config["graph_database_provider"].lower() == "networkx" and graph_client.graph is None: - await graph_client.load_graph_from_file() - return graph_client @@ -181,8 +177,7 @@ def create_graph_engine( graph_id=graph_identifier, ) - from .networkx.adapter import NetworkXAdapter - - graph_client = NetworkXAdapter(filename=graph_file_path) - - return graph_client + raise EnvironmentError( + f"Unsupported graph database provider: {graph_database_provider}. " + f"Supported providers are: {', '.join(list(supported_databases.keys()) + ['neo4j', 'falkordb', 'kuzu', 'kuzu-remote', 'memgraph', 'neptune', 'neptune_analytics'])}" + ) diff --git a/cognee/infrastructure/databases/graph/neptune_driver/exceptions.py b/cognee/infrastructure/databases/graph/neptune_driver/exceptions.py index 57d54d74d..a200aad39 100644 --- a/cognee/infrastructure/databases/graph/neptune_driver/exceptions.py +++ b/cognee/infrastructure/databases/graph/neptune_driver/exceptions.py @@ -3,11 +3,16 @@ This module defines custom exceptions for Neptune Analytics operations. """ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import ( + CogneeSystemError, + CogneeTransientError, + CogneeValidationError, + CogneeConfigurationError, +) from fastapi import status -class NeptuneAnalyticsError(CogneeApiError): +class NeptuneAnalyticsError(CogneeSystemError): """Base exception for Neptune Analytics operations.""" def __init__( @@ -19,7 +24,7 @@ class NeptuneAnalyticsError(CogneeApiError): super().__init__(message, name, status_code) -class NeptuneAnalyticsConnectionError(NeptuneAnalyticsError): +class NeptuneAnalyticsConnectionError(CogneeTransientError): """Exception raised when connection to Neptune Analytics fails.""" def __init__( @@ -31,7 +36,7 @@ class NeptuneAnalyticsConnectionError(NeptuneAnalyticsError): super().__init__(message, name, status_code) -class NeptuneAnalyticsQueryError(NeptuneAnalyticsError): +class NeptuneAnalyticsQueryError(CogneeValidationError): """Exception raised when a query execution fails.""" def __init__( @@ -43,7 +48,7 @@ class NeptuneAnalyticsQueryError(NeptuneAnalyticsError): super().__init__(message, name, status_code) -class NeptuneAnalyticsAuthenticationError(NeptuneAnalyticsError): +class NeptuneAnalyticsAuthenticationError(CogneeConfigurationError): """Exception raised when authentication with Neptune Analytics fails.""" def __init__( @@ -55,7 +60,7 @@ class NeptuneAnalyticsAuthenticationError(NeptuneAnalyticsError): super().__init__(message, name, status_code) -class NeptuneAnalyticsConfigurationError(NeptuneAnalyticsError): +class NeptuneAnalyticsConfigurationError(CogneeConfigurationError): """Exception raised when Neptune Analytics configuration is invalid.""" def __init__( @@ -67,7 +72,7 @@ class NeptuneAnalyticsConfigurationError(NeptuneAnalyticsError): super().__init__(message, name, status_code) -class NeptuneAnalyticsTimeoutError(NeptuneAnalyticsError): +class NeptuneAnalyticsTimeoutError(CogneeTransientError): """Exception raised when a Neptune Analytics operation times out.""" def __init__( @@ -79,7 +84,7 @@ class NeptuneAnalyticsTimeoutError(NeptuneAnalyticsError): super().__init__(message, name, status_code) -class NeptuneAnalyticsThrottlingError(NeptuneAnalyticsError): +class NeptuneAnalyticsThrottlingError(CogneeTransientError): """Exception raised when requests are throttled by Neptune Analytics.""" def __init__( @@ -91,7 +96,7 @@ class NeptuneAnalyticsThrottlingError(NeptuneAnalyticsError): super().__init__(message, name, status_code) -class NeptuneAnalyticsResourceNotFoundError(NeptuneAnalyticsError): +class NeptuneAnalyticsResourceNotFoundError(CogneeValidationError): """Exception raised when a Neptune Analytics resource is not found.""" def __init__( @@ -103,7 +108,7 @@ class NeptuneAnalyticsResourceNotFoundError(NeptuneAnalyticsError): super().__init__(message, name, status_code) -class NeptuneAnalyticsInvalidParameterError(NeptuneAnalyticsError): +class NeptuneAnalyticsInvalidParameterError(CogneeValidationError): """Exception raised when invalid parameters are provided to Neptune Analytics.""" def __init__( diff --git a/cognee/infrastructure/databases/graph/networkx/__init__.py b/cognee/infrastructure/databases/graph/networkx/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/cognee/infrastructure/databases/graph/networkx/adapter.py b/cognee/infrastructure/databases/graph/networkx/adapter.py deleted file mode 100644 index da9b506a0..000000000 --- a/cognee/infrastructure/databases/graph/networkx/adapter.py +++ /dev/null @@ -1,1017 +0,0 @@ -"""Adapter for NetworkX graph database.""" - -import os -import json -import asyncio -import numpy as np -from uuid import UUID -import networkx as nx -from datetime import datetime, timezone -from typing import Dict, Any, List, Union, Type, Tuple - -from cognee.infrastructure.databases.exceptions.exceptions import NodesetFilterNotSupportedError -from cognee.infrastructure.files.storage import get_file_storage -from cognee.shared.logging_utils import get_logger -from cognee.infrastructure.databases.graph.graph_db_interface import ( - GraphDBInterface, - record_graph_changes, -) -from cognee.infrastructure.engine import DataPoint -from cognee.infrastructure.engine.utils import parse_id -from cognee.modules.storage.utils import JSONEncoder - -logger = get_logger() - - -class NetworkXAdapter(GraphDBInterface): - """ - Manage a singleton instance of a graph database interface, utilizing the NetworkX - library. Handles graph data access and manipulation, including nodes and edges - management, persistence, and auxiliary functionalities. - """ - - _instance = None - graph = None # Class variable to store the singleton instance - - def __new__(cls, filename): - if cls._instance is None: - cls._instance = super().__new__(cls) - cls._instance.filename = filename - return cls._instance - - def __init__(self, filename="cognee_graph.pkl"): - self.filename = filename - - async def get_graph_data(self): - """ - Retrieve graph data including nodes and edges. - - Returns: - -------- - - A tuple containing a list of node data and a list of edge data. - """ - await self.load_graph_from_file() - return (list(self.graph.nodes(data=True)), list(self.graph.edges(data=True, keys=True))) - - async def query(self, query: str, params: dict): - """ - Execute a query against the graph data. The specifics of the query execution need to be - implemented. - - Parameters: - ----------- - - - query (str): The query string to run against the graph. - - params (dict): Parameters for the query, if necessary. - """ - pass - - async def has_node(self, node_id: UUID) -> bool: - """ - Determine if a specific node exists in the graph. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node to check. - - Returns: - -------- - - - bool: True if the node exists, otherwise False. - """ - return self.graph.has_node(node_id) - - async def add_node(self, node: DataPoint) -> None: - """ - Add a node to the graph and persist the graph state to the file. - - Parameters: - ----------- - - - node (DataPoint): The node to be added, represented as a DataPoint object. - """ - self.graph.add_node(node.id, **node.model_dump()) - - await self.save_graph_to_file(self.filename) - - @record_graph_changes - async def add_nodes(self, nodes: list[DataPoint]) -> None: - """ - Bulk add multiple nodes to the graph and persist the graph state to the file. - - Parameters: - ----------- - - - nodes (list[DataPoint]): A list of DataPoint objects defining the nodes to be - added. - """ - nodes = [(node.id, node.model_dump()) for node in nodes] - self.graph.add_nodes_from(nodes) - await self.save_graph_to_file(self.filename) - - async def get_graph(self): - """ - Retrieve the current state of the graph. - - Returns: - -------- - - The current graph instance. - """ - return self.graph - - async def has_edge(self, from_node: str, to_node: str, edge_label: str) -> bool: - """ - Check for the existence of a specific edge in the graph. - - Parameters: - ----------- - - - from_node (str): The identifier of the source node. - - to_node (str): The identifier of the target node. - - edge_label (str): The label of the edge to check. - - Returns: - -------- - - - bool: True if the edge exists, otherwise False. - """ - return self.graph.has_edge(from_node, to_node, key=edge_label) - - async def has_edges(self, edges): - """ - Check for the existence of multiple edges in the graph. - - Parameters: - ----------- - - - edges: A list of edges to check, defined as tuples of (from_node, to_node, - edge_label). - - Returns: - -------- - - A list of edges that exist in the graph. - """ - result = [] - - for from_node, to_node, edge_label in edges: - if self.graph.has_edge(from_node, to_node, edge_label): - result.append((from_node, to_node, edge_label)) - - return result - - @record_graph_changes - async def add_edge( - self, - from_node: str, - to_node: str, - relationship_name: str, - edge_properties: Dict[str, Any] = {}, - ) -> None: - """ - Add a single edge to the graph and persist the graph state to the file. - - Parameters: - ----------- - - - from_node (str): The identifier of the source node for the edge. - - to_node (str): The identifier of the target node for the edge. - - relationship_name (str): The label for the relationship as the edge is created. - - edge_properties (Dict[str, Any]): Additional properties for the edge, if any. - (default {}) - """ - edge_properties["updated_at"] = datetime.now(timezone.utc) - self.graph.add_edge( - from_node, - to_node, - key=relationship_name, - **(edge_properties if edge_properties else {}), - ) - - await self.save_graph_to_file(self.filename) - - @record_graph_changes - async def add_edges(self, edges: list[tuple[str, str, str, dict]]) -> None: - """ - Bulk add multiple edges to the graph and persist the graph state to the file. - - Parameters: - ----------- - - - edges (list[tuple[str, str, str, dict]]): A list of edges defined as tuples - containing (from_node, to_node, relationship_name, edge_properties). - """ - if not edges: - logger.debug("No edges to add") - return - - try: - # Validate edge format and convert UUIDs to strings - processed_edges = [] - for edge in edges: - if len(edge) < 3 or len(edge) > 4: - raise ValueError( - f"Invalid edge format: {edge}. Expected (from_node, to_node, relationship_name[, properties])" - ) - - # Convert UUIDs to strings if needed - from_node = str(edge[0]) if isinstance(edge[0], UUID) else edge[0] - to_node = str(edge[1]) if isinstance(edge[1], UUID) else edge[1] - relationship_name = edge[2] - - if not all(isinstance(x, str) for x in [from_node, to_node, relationship_name]): - raise ValueError( - f"First three elements of edge must be strings or UUIDs: {edge}" - ) - - # Process edge with updated_at timestamp - processed_edge = ( - from_node, - to_node, - relationship_name, - { - **(edge[3] if len(edge) == 4 else {}), - "updated_at": datetime.now(timezone.utc), - }, - ) - processed_edges.append(processed_edge) - - # Add edges to graph - self.graph.add_edges_from(processed_edges) - logger.debug(f"Added {len(processed_edges)} edges to graph") - - # Save changes - await self.save_graph_to_file(self.filename) - except Exception as e: - logger.error(f"Failed to add edges: {e}") - raise - - async def get_edges(self, node_id: UUID): - """ - Retrieve edges connected to a specific node. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node whose edges are to be retrieved. - - Returns: - -------- - - A list of edges connected to the specified node. - """ - return list(self.graph.in_edges(node_id, data=True)) + list( - self.graph.out_edges(node_id, data=True) - ) - - async def delete_node(self, node_id: UUID) -> None: - """ - Remove a node and its associated edges from the graph, then persist the changes. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node to delete. - """ - - if self.graph.has_node(node_id): - # First remove all edges connected to the node - for edge in list(self.graph.edges(node_id, data=True)): - source, target, data = edge - self.graph.remove_edge(source, target, key=data.get("relationship_name")) - - # Then remove the node itself - self.graph.remove_node(node_id) - - # Save the updated graph state - await self.save_graph_to_file(self.filename) - else: - logger.error(f"Node {node_id} not found in graph") - - async def delete_nodes(self, node_ids: List[UUID]) -> None: - """ - Bulk delete nodes from the graph and persist the changes. - - Parameters: - ----------- - - - node_ids (List[UUID]): A list of node identifiers to delete. - """ - self.graph.remove_nodes_from(node_ids) - await self.save_graph_to_file(self.filename) - - async def get_disconnected_nodes(self) -> List[str]: - """ - Identify nodes that are not connected to any other nodes in the graph. - - Returns: - -------- - - - List[str]: A list of identifiers for disconnected nodes. - """ - connected_components = list(nx.weakly_connected_components(self.graph)) - - disconnected_nodes = [] - biggest_subgraph = max(connected_components, key=len) - - for component in connected_components: - if component != biggest_subgraph: - disconnected_nodes.extend(list(component)) - - return disconnected_nodes - - async def extract_node(self, node_id: UUID) -> dict: - """ - Retrieve data for a specific node based on its identifier. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node to retrieve. - - Returns: - -------- - - - dict: The data of the specified node, or None if not found. - """ - if self.graph.has_node(node_id): - return self.graph.nodes[node_id] - - return None - - async def extract_nodes(self, node_ids: List[UUID]) -> List[dict]: - """ - Retrieve data for multiple nodes based on their identifiers. - - Parameters: - ----------- - - - node_ids (List[UUID]): A list of node identifiers to retrieve data. - - Returns: - -------- - - - List[dict]: A list of data for each node identified that exists in the graph. - """ - return [self.graph.nodes[node_id] for node_id in node_ids if self.graph.has_node(node_id)] - - async def get_predecessors(self, node_id: UUID, edge_label: str = None) -> list: - """ - Retrieve the predecessor nodes of a specified node according to a specific edge label. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node for which to find predecessors. - - edge_label (str): The label for the edges connecting to predecessors; if None, all - predecessors are retrieved. (default None) - - Returns: - -------- - - - list: A list of predecessor nodes. - """ - if self.graph.has_node(node_id): - if edge_label is None: - return [ - self.graph.nodes[predecessor] - for predecessor in list(self.graph.predecessors(node_id)) - ] - - nodes = [] - - for predecessor_id in list(self.graph.predecessors(node_id)): - if self.graph.has_edge(predecessor_id, node_id, edge_label): - nodes.append(self.graph.nodes[predecessor_id]) - - return nodes - - async def get_successors(self, node_id: UUID, edge_label: str = None) -> list: - """ - Retrieve the successor nodes of a specified node according to a specific edge label. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node for which to find successors. - - edge_label (str): The label for the edges connecting to successors; if None, all - successors are retrieved. (default None) - - Returns: - -------- - - - list: A list of successor nodes. - """ - if self.graph.has_node(node_id): - if edge_label is None: - return [ - self.graph.nodes[successor] - for successor in list(self.graph.successors(node_id)) - ] - - nodes = [] - - for successor_id in list(self.graph.successors(node_id)): - if self.graph.has_edge(node_id, successor_id, edge_label): - nodes.append(self.graph.nodes[successor_id]) - - return nodes - - async def get_neighbors(self, node_id: UUID) -> list: - """ - Get the neighboring nodes of a specified node, including both predecessors and - successors. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node whose neighbors are to be retrieved. - - Returns: - -------- - - - list: A list of neighboring nodes. - """ - if not self.graph.has_node(node_id): - return [] - - predecessors, successors = await asyncio.gather( - self.get_predecessors(node_id), - self.get_successors(node_id), - ) - - neighbors = predecessors + successors - - return neighbors - - async def get_connections(self, node_id: UUID) -> list: - """ - Get the connections of a specified node to its neighbors. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node for which to get connections. - - Returns: - -------- - - - list: A list of connections involving the specified node and its neighbors. - """ - if not self.graph.has_node(node_id): - return [] - - node = self.graph.nodes[node_id] - - if "id" not in node: - return [] - - predecessors, successors = await asyncio.gather( - self.get_predecessors(node_id), - self.get_successors(node_id), - ) - - connections = [] - - # Handle None values for predecessors and successors - if predecessors is not None: - for neighbor in predecessors: - if "id" in neighbor: - edge_data = self.graph.get_edge_data(neighbor["id"], node["id"]) - if edge_data is not None: - for edge_properties in edge_data.values(): - connections.append((neighbor, edge_properties, node)) - - if successors is not None: - for neighbor in successors: - if "id" in neighbor: - edge_data = self.graph.get_edge_data(node["id"], neighbor["id"]) - if edge_data is not None: - for edge_properties in edge_data.values(): - connections.append((node, edge_properties, neighbor)) - - return connections - - async def remove_connection_to_predecessors_of( - self, node_ids: list[UUID], edge_label: str - ) -> None: - """ - Remove connections to predecessors of specified nodes based on an edge label and persist - changes. - - Parameters: - ----------- - - - node_ids (list[UUID]): A list of node identifiers whose predecessor connections - need to be removed. - - edge_label (str): The label of the edges to remove. - """ - for node_id in node_ids: - if self.graph.has_node(node_id): - for predecessor_id in list(self.graph.predecessors(node_id)): - if self.graph.has_edge(predecessor_id, node_id, edge_label): - self.graph.remove_edge(predecessor_id, node_id, edge_label) - - await self.save_graph_to_file(self.filename) - - async def remove_connection_to_successors_of( - self, node_ids: list[UUID], edge_label: str - ) -> None: - """ - Remove connections to successors of specified nodes based on an edge label and persist - changes. - - Parameters: - ----------- - - - node_ids (list[UUID]): A list of node identifiers whose successor connections need - to be removed. - - edge_label (str): The label of the edges to remove. - """ - for node_id in node_ids: - if self.graph.has_node(node_id): - for successor_id in list(self.graph.successors(node_id)): - if self.graph.has_edge(node_id, successor_id, edge_label): - self.graph.remove_edge(node_id, successor_id, edge_label) - - await self.save_graph_to_file(self.filename) - - async def create_empty_graph(self, file_path: str) -> None: - """ - Initialize an empty graph and save it to a specified file path. - - Parameters: - ----------- - - - file_path (str): The file path where the empty graph should be saved. - """ - self.graph = nx.MultiDiGraph() - - await self.save_graph_to_file(file_path) - - async def save_graph_to_file(self, file_path: str = None) -> None: - """ - Save the graph data asynchronously to a specified file in JSON format. - - Parameters: - ----------- - - - file_path (str): The file path to save the graph data; if None, saves to the - default filename. (default None) - """ - if not file_path: - file_path = self.filename - - graph_data = nx.readwrite.json_graph.node_link_data(self.graph, edges="links") - - file_dir_path = os.path.dirname(file_path) - file_path = os.path.basename(file_path) - - file_storage = get_file_storage(file_dir_path) - - json_data = json.dumps(graph_data, cls=JSONEncoder) - - await file_storage.store(file_path, json_data, overwrite=True) - - async def load_graph_from_file(self, file_path: str = None): - """ - Load graph data asynchronously from a specified file in JSON format. - - Parameters: - ----------- - - - file_path (str): The file path from which to load the graph data; if None, loads - from the default filename. (default None) - """ - if not file_path: - file_path = self.filename - try: - file_dir_path = os.path.dirname(file_path) - file_name = os.path.basename(file_path) - - file_storage = get_file_storage(file_dir_path) - - if await file_storage.file_exists(file_name): - async with file_storage.open(file_name, "r") as file: - graph_data = json.loads(file.read()) - for node in graph_data["nodes"]: - try: - if not isinstance(node["id"], UUID): - try: - node["id"] = UUID(node["id"]) - except Exception: - # If conversion fails, keep the original id - pass - except Exception as e: - logger.error(e) - raise e - - if isinstance(node.get("updated_at"), int): - node["updated_at"] = datetime.fromtimestamp( - node["updated_at"] / 1000, tz=timezone.utc - ) - elif isinstance(node.get("updated_at"), str): - node["updated_at"] = datetime.strptime( - node["updated_at"], "%Y-%m-%dT%H:%M:%S.%f%z" - ) - - for edge in graph_data["links"]: - try: - if not isinstance(edge["source"], UUID): - source_id = parse_id(edge["source"]) - else: - source_id = edge["source"] - - if not isinstance(edge["target"], UUID): - target_id = parse_id(edge["target"]) - else: - target_id = edge["target"] - - edge["source"] = source_id - edge["target"] = target_id - edge["source_node_id"] = source_id - edge["target_node_id"] = target_id - except Exception as e: - logger.error(e) - raise e - - if isinstance( - edge.get("updated_at"), int - ): # Handle timestamp in milliseconds - edge["updated_at"] = datetime.fromtimestamp( - edge["updated_at"] / 1000, tz=timezone.utc - ) - elif isinstance(edge.get("updated_at"), str): - edge["updated_at"] = datetime.strptime( - edge["updated_at"], "%Y-%m-%dT%H:%M:%S.%f%z" - ) - - self.graph = nx.readwrite.json_graph.node_link_graph(graph_data, edges="links") - - for node_id, node_data in self.graph.nodes(data=True): - node_data["id"] = node_id - else: - # Log that the file does not exist and an empty graph is initialized - logger.warning("File %s not found. Initializing an empty graph.", file_path) - await self.create_empty_graph(file_path) - - except Exception: - logger.error("Failed to load graph from file: %s", file_path) - - await self.create_empty_graph(file_path) - - async def delete_graph(self, file_path: str = None): - """ - Delete the graph file from the filesystem asynchronously. - - Parameters: - ----------- - - - file_path (str): The file path of the graph to delete; if None, deletes the - default graph file. (default None) - """ - if file_path is None: - file_path = ( - self.filename - ) # Assuming self.filename is defined elsewhere and holds the default graph file path - try: - file_dir_path = os.path.dirname(file_path) - file_name = os.path.basename(file_path) - - file_storage = get_file_storage(file_dir_path) - - await file_storage.remove(file_name) - - self.graph = None - logger.info("Graph deleted successfully.") - except Exception as error: - logger.error("Failed to delete graph: %s", error) - raise error - - async def get_nodeset_subgraph( - self, node_type: Type[Any], node_name: List[str] - ) -> Tuple[List[Tuple[int, dict]], List[Tuple[int, int, str, dict]]]: - """ - Obtain a subgraph based on specific node types and names. Not supported in this - implementation. - - Parameters: - ----------- - - - node_type (Type[Any]): The type of nodes to include in the subgraph. - - node_name (List[str]): A list of node names to filter by. - """ - raise NodesetFilterNotSupportedError - - async def get_filtered_graph_data( - self, attribute_filters: List[Dict[str, List[Union[str, int]]]] - ): - """ - Fetch nodes and relationships filtered by specified attributes. - - Parameters: - ----------- - - - attribute_filters (List[Dict[str, List[Union[str, int]]]]): A list of dictionaries - defining attributes to filter on. - - Returns: - -------- - - A tuple containing filtered nodes and edges based on the specified attributes. - """ - # Create filters for nodes based on the attribute filters - where_clauses = [] - for attribute, values in attribute_filters[0].items(): - where_clauses.append((attribute, values)) - - # Filter nodes - filtered_nodes = [ - (node, data) - for node, data in self.graph.nodes(data=True) - if all(data.get(attr) in values for attr, values in where_clauses) - ] - - # Filter edges where both source and target nodes satisfy the filters - filtered_edges = [ - (source, target, data.get("relationship_type", "UNKNOWN"), data) - for source, target, data in self.graph.edges(data=True) - if ( - all(self.graph.nodes[source].get(attr) in values for attr, values in where_clauses) - and all( - self.graph.nodes[target].get(attr) in values for attr, values in where_clauses - ) - ) - ] - - return filtered_nodes, filtered_edges - - async def get_graph_metrics(self, include_optional=False): - """ - Calculate various metrics related to the graph, optionally including optional metrics. - - Parameters: - ----------- - - - include_optional: Indicates whether optional metrics should be included in the - calculation. (default False) - - Returns: - -------- - - A dictionary containing the calculated graph metrics. - """ - graph = self.graph - - def _get_mean_degree(graph): - degrees = [d for _, d in graph.degree()] - return np.mean(degrees) if degrees else 0 - - def _get_edge_density(graph): - num_nodes = graph.number_of_nodes() - num_edges = graph.number_of_edges() - num_possible_edges = num_nodes * (num_nodes - 1) - edge_density = num_edges / num_possible_edges if num_possible_edges > 0 else 0 - return edge_density - - def _get_diameter(graph): - try: - return nx.diameter(nx.DiGraph(graph.to_undirected())) - except Exception as e: - logger.warning("Failed to calculate diameter: %s", e) - return None - - def _get_avg_shortest_path_length(graph): - try: - return nx.average_shortest_path_length(nx.DiGraph(graph.to_undirected())) - except Exception as e: - logger.warning("Failed to calculate average shortest path length: %s", e) - return None - - def _get_avg_clustering(graph): - try: - return nx.average_clustering(nx.DiGraph(graph.to_undirected())) - except Exception as e: - logger.warning("Failed to calculate clustering coefficient: %s", e) - return None - - mandatory_metrics = { - "num_nodes": graph.number_of_nodes(), - "num_edges": graph.number_of_edges(), - "mean_degree": _get_mean_degree(graph), - "edge_density": _get_edge_density(graph), - "num_connected_components": nx.number_weakly_connected_components(graph), - "sizes_of_connected_components": [ - len(c) for c in nx.weakly_connected_components(graph) - ], - } - - if include_optional: - optional_metrics = { - "num_selfloops": sum(1 for u, v in graph.edges() if u == v), - "diameter": _get_diameter(graph), - "avg_shortest_path_length": _get_avg_shortest_path_length(graph), - "avg_clustering": _get_avg_clustering(graph), - } - else: - optional_metrics = { - "num_selfloops": -1, - "diameter": -1, - "avg_shortest_path_length": -1, - "avg_clustering": -1, - } - - return mandatory_metrics | optional_metrics - - async def get_document_subgraph(self, data_id: str): - """ - Retrieve all relevant nodes when a document is being deleted, including chunks and - orphaned entities. - - Parameters: - ----------- - - - data_id(str): The data id identifying the document to fetch - related nodes for. - - Returns: - -------- - - A dictionary containing the document, its chunks, orphan entities, made from nodes, - and orphan types. - """ - # Ensure graph is loaded - if self.graph is None: - await self.load_graph_from_file() - - # Find the document node by looking for content_hash in the name field - document = None - document_node_id = None - for node_id, attrs in self.graph.nodes(data=True): - if ( - attrs.get("type") in ["TextDocument", "PdfDocument"] - and attrs.get("id") == f"{data_id}" - ): - document = {"id": str(node_id), **attrs} # Convert UUID to string for consistency - document_node_id = node_id # Keep the original UUID - break - - if not document: - return None - - # Find chunks connected via is_part_of (chunks point TO document) - chunks = [] - for source, target, edge_data in self.graph.in_edges(document_node_id, data=True): - if edge_data.get("relationship_name") == "is_part_of": - chunks.append({"id": source, **self.graph.nodes[source]}) # Keep as UUID object - - # Find entities connected to chunks (chunks point TO entities via contains) - entities = [] - for chunk in chunks: - chunk_id = chunk["id"] # Already a UUID object - for source, target, edge_data in self.graph.out_edges(chunk_id, data=True): - if edge_data.get("relationship_name") == "contains": - entities.append( - {"id": target, **self.graph.nodes[target]} - ) # Keep as UUID object - - # Find orphaned entities (entities only connected to chunks we're deleting) - orphan_entities = [] - for entity in entities: - entity_id = entity["id"] # Already a UUID object - # Get all chunks that contain this entity - containing_chunks = [] - for source, target, edge_data in self.graph.in_edges(entity_id, data=True): - if edge_data.get("relationship_name") == "contains": - containing_chunks.append(source) # Keep as UUID object - - # Check if all containing chunks are in our chunks list - chunk_ids = [chunk["id"] for chunk in chunks] - if containing_chunks and all(c in chunk_ids for c in containing_chunks): - orphan_entities.append(entity) - - # Find orphaned entity types - orphan_types = [] - seen_types = set() # Track seen types to avoid duplicates - for entity in orphan_entities: - entity_id = entity["id"] # Already a UUID object - for _, target, edge_data in self.graph.out_edges(entity_id, data=True): - if edge_data.get("relationship_name") in ["is_a", "instance_of"]: - # Check if this type is only connected to entities we're deleting - type_node = self.graph.nodes[target] - if type_node.get("type") == "EntityType" and target not in seen_types: - is_orphaned = True - # Get all incoming edges to this type node - for source, _, edge_data in self.graph.in_edges(target, data=True): - if edge_data.get("relationship_name") in ["is_a", "instance_of"]: - # Check if the source entity is not in our orphan_entities list - if source not in [e["id"] for e in orphan_entities]: - is_orphaned = False - break - if is_orphaned: - orphan_types.append({"id": target, **type_node}) # Keep as UUID object - seen_types.add(target) # Mark as seen - - # Find nodes connected via made_from (chunks point TO summaries) - made_from_nodes = [] - for chunk in chunks: - chunk_id = chunk["id"] # Already a UUID object - for source, target, edge_data in self.graph.in_edges(chunk_id, data=True): - if edge_data.get("relationship_name") == "made_from": - made_from_nodes.append( - {"id": source, **self.graph.nodes[source]} - ) # Keep as UUID object - - # Return UUIDs directly without string conversion - return { - "document": [{"id": document["id"], **{k: v for k, v in document.items() if k != "id"}}] - if document - else [], - "chunks": [ - {"id": chunk["id"], **{k: v for k, v in chunk.items() if k != "id"}} - for chunk in chunks - ], - "orphan_entities": [ - {"id": entity["id"], **{k: v for k, v in entity.items() if k != "id"}} - for entity in orphan_entities - ], - "made_from_nodes": [ - {"id": node["id"], **{k: v for k, v in node.items() if k != "id"}} - for node in made_from_nodes - ], - "orphan_types": [ - {"id": type_node["id"], **{k: v for k, v in type_node.items() if k != "id"}} - for type_node in orphan_types - ], - } - - async def get_degree_one_nodes(self, node_type: str): - """ - Retrieve nodes that have only a single connection, filtered by node type. - - Parameters: - ----------- - - - node_type (str): Type of nodes to filter by ('Entity' or 'EntityType'). - - Returns: - -------- - - A list of nodes that have a single connection of the specified type. - """ - if not node_type or node_type not in ["Entity", "EntityType"]: - raise ValueError("node_type must be either 'Entity' or 'EntityType'") - - nodes = [] - for node_id, node_data in self.graph.nodes(data=True): - if node_data.get("type") == node_type: - # Count both incoming and outgoing edges - degree = self.graph.degree(node_id) - if degree == 1: - nodes.append(node_data) - return nodes - - async def get_node(self, node_id: UUID) -> dict: - """ - Retrieve the details of a specific node identified by its identifier. - - Parameters: - ----------- - - - node_id (UUID): The identifier of the node to retrieval. - - Returns: - -------- - - - dict: The data of the specified node if found, otherwise None. - """ - if self.graph.has_node(node_id): - return self.graph.nodes[node_id] - return None - - async def get_nodes(self, node_ids: List[UUID] = None) -> List[dict]: - """ - Retrieve data for multiple nodes by their identifiers, or all nodes if no identifiers - are provided. - - Parameters: - ----------- - - - node_ids (List[UUID]): List of node identifiers to fetch data for; if None, - retrieves all nodes in the graph. (default None) - - Returns: - -------- - - - List[dict]: A list of node data for each found node. - """ - if node_ids is None: - return [{"id": node_id, **data} for node_id, data in self.graph.nodes(data=True)] - return [ - {"id": node_id, **self.graph.nodes[node_id]} - for node_id in node_ids - if self.graph.has_node(node_id) - ] diff --git a/cognee/infrastructure/databases/hybrid/falkordb/FalkorDBAdapter.py b/cognee/infrastructure/databases/hybrid/falkordb/FalkorDBAdapter.py index 35ce7c77e..cb6899925 100644 --- a/cognee/infrastructure/databases/hybrid/falkordb/FalkorDBAdapter.py +++ b/cognee/infrastructure/databases/hybrid/falkordb/FalkorDBAdapter.py @@ -9,7 +9,7 @@ from typing import List, Dict, Any, Optional, Tuple, Type, Union from falkordb import FalkorDB -from cognee.exceptions import InvalidValueError +from cognee.infrastructure.databases.exceptions import MissingQueryParameterError from cognee.infrastructure.databases.graph.graph_db_interface import ( GraphDBInterface, record_graph_changes, @@ -721,7 +721,7 @@ class FalkorDBAdapter(VectorDBInterface, GraphDBInterface): Returns the search results as a result set from the graph database. """ if query_text is None and query_vector is None: - raise InvalidValueError(message="One of query_text or query_vector must be provided!") + raise MissingQueryParameterError() if query_text and not query_vector: query_vector = (await self.embed_data([query_text]))[0] diff --git a/cognee/infrastructure/databases/hybrid/neptune_analytics/NeptuneAnalyticsAdapter.py b/cognee/infrastructure/databases/hybrid/neptune_analytics/NeptuneAnalyticsAdapter.py index a04e6f09e..4baf8ff13 100644 --- a/cognee/infrastructure/databases/hybrid/neptune_analytics/NeptuneAnalyticsAdapter.py +++ b/cognee/infrastructure/databases/hybrid/neptune_analytics/NeptuneAnalyticsAdapter.py @@ -5,7 +5,8 @@ import json from typing import List, Optional, Any, Dict, Type, Tuple from uuid import UUID -from cognee.exceptions import InvalidValueError +from cognee.infrastructure.databases.exceptions import MissingQueryParameterError +from cognee.infrastructure.databases.exceptions import MutuallyExclusiveQueryParametersError from cognee.infrastructure.databases.graph.neptune_driver.adapter import NeptuneGraphDB from cognee.infrastructure.databases.vector.vector_db_interface import VectorDBInterface from cognee.infrastructure.engine import DataPoint @@ -274,11 +275,9 @@ class NeptuneAnalyticsAdapter(NeptuneGraphDB, VectorDBInterface): limit = self._TOPK_UPPER_BOUND if query_vector and query_text: - raise InvalidValueError( - message="The search function accepts either text or embedding as input, but not both." - ) + raise MutuallyExclusiveQueryParametersError() elif query_text is None and query_vector is None: - raise InvalidValueError(message="One of query_text or query_vector must be provided!") + raise MissingQueryParameterError() elif query_vector: embedding = query_vector else: diff --git a/cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py b/cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py index 84c781db6..96e0a3bf6 100644 --- a/cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py +++ b/cognee/infrastructure/databases/vector/chromadb/ChromaDBAdapter.py @@ -4,13 +4,13 @@ from uuid import UUID from typing import List, Optional from chromadb import AsyncHttpClient, Settings -from cognee.exceptions import InvalidValueError from cognee.shared.logging_utils import get_logger from cognee.modules.storage.utils import get_own_properties from cognee.infrastructure.engine import DataPoint from cognee.infrastructure.engine.utils import parse_id from cognee.infrastructure.databases.vector.exceptions import CollectionNotFoundError from cognee.infrastructure.databases.vector.models.ScoredResult import ScoredResult +from cognee.infrastructure.databases.exceptions import MissingQueryParameterError from ..embeddings.EmbeddingEngine import EmbeddingEngine from ..vector_db_interface import VectorDBInterface @@ -378,7 +378,7 @@ class ChromaDBAdapter(VectorDBInterface): Returns a list of ScoredResult instances representing the search results. """ if query_text is None and query_vector is None: - raise InvalidValueError(message="One of query_text or query_vector must be provided!") + raise MissingQueryParameterError() if query_text and not query_vector: query_vector = (await self.embedding_engine.embed_text([query_text]))[0] diff --git a/cognee/infrastructure/databases/vector/embeddings/FastembedEmbeddingEngine.py b/cognee/infrastructure/databases/vector/embeddings/FastembedEmbeddingEngine.py index f7925a3d2..dc8443459 100644 --- a/cognee/infrastructure/databases/vector/embeddings/FastembedEmbeddingEngine.py +++ b/cognee/infrastructure/databases/vector/embeddings/FastembedEmbeddingEngine.py @@ -41,11 +41,11 @@ class FastembedEmbeddingEngine(EmbeddingEngine): self, model: Optional[str] = "openai/text-embedding-3-large", dimensions: Optional[int] = 3072, - max_tokens: int = 512, + max_completion_tokens: int = 512, ): self.model = model self.dimensions = dimensions - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens self.tokenizer = self.get_tokenizer() # self.retry_count = 0 self.embedding_model = TextEmbedding(model_name=model) @@ -112,7 +112,9 @@ class FastembedEmbeddingEngine(EmbeddingEngine): """ logger.debug("Loading tokenizer for FastembedEmbeddingEngine...") - tokenizer = TikTokenTokenizer(model="gpt-4o", max_tokens=self.max_tokens) + tokenizer = TikTokenTokenizer( + model="gpt-4o", max_completion_tokens=self.max_completion_tokens + ) logger.debug("Tokenizer loaded for for FastembedEmbeddingEngine") return tokenizer diff --git a/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py b/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py index e3cdaea00..0cb8286fc 100644 --- a/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py +++ b/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py @@ -6,7 +6,7 @@ import math import litellm import os from cognee.infrastructure.databases.vector.embeddings.EmbeddingEngine import EmbeddingEngine -from cognee.infrastructure.databases.exceptions.EmbeddingException import EmbeddingException +from cognee.infrastructure.databases.exceptions import EmbeddingException from cognee.infrastructure.llm.tokenizer.Gemini import ( GeminiTokenizer, ) @@ -57,7 +57,7 @@ class LiteLLMEmbeddingEngine(EmbeddingEngine): api_key: str = None, endpoint: str = None, api_version: str = None, - max_tokens: int = 512, + max_completion_tokens: int = 512, ): self.api_key = api_key self.endpoint = endpoint @@ -65,7 +65,7 @@ class LiteLLMEmbeddingEngine(EmbeddingEngine): self.provider = provider self.model = model self.dimensions = dimensions - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens self.tokenizer = self.get_tokenizer() self.retry_count = 0 @@ -179,20 +179,29 @@ class LiteLLMEmbeddingEngine(EmbeddingEngine): model = self.model.split("/")[-1] if "openai" in self.provider.lower(): - tokenizer = TikTokenTokenizer(model=model, max_tokens=self.max_tokens) + tokenizer = TikTokenTokenizer( + model=model, max_completion_tokens=self.max_completion_tokens + ) elif "gemini" in self.provider.lower(): - tokenizer = GeminiTokenizer(model=model, max_tokens=self.max_tokens) + tokenizer = GeminiTokenizer( + model=model, max_completion_tokens=self.max_completion_tokens + ) elif "mistral" in self.provider.lower(): - tokenizer = MistralTokenizer(model=model, max_tokens=self.max_tokens) + tokenizer = MistralTokenizer( + model=model, max_completion_tokens=self.max_completion_tokens + ) else: try: tokenizer = HuggingFaceTokenizer( - model=self.model.replace("hosted_vllm/", ""), max_tokens=self.max_tokens + model=self.model.replace("hosted_vllm/", ""), + max_completion_tokens=self.max_completion_tokens, ) except Exception as e: logger.warning(f"Could not get tokenizer from HuggingFace due to: {e}") logger.info("Switching to TikToken default tokenizer.") - tokenizer = TikTokenTokenizer(model=None, max_tokens=self.max_tokens) + tokenizer = TikTokenTokenizer( + model=None, max_completion_tokens=self.max_completion_tokens + ) logger.debug(f"Tokenizer loaded for model: {self.model}") return tokenizer diff --git a/cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py b/cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py index bfb24a2d3..e1237a657 100644 --- a/cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py +++ b/cognee/infrastructure/databases/vector/embeddings/OllamaEmbeddingEngine.py @@ -30,7 +30,7 @@ class OllamaEmbeddingEngine(EmbeddingEngine): Instance variables: - model - dimensions - - max_tokens + - max_completion_tokens - endpoint - mock - huggingface_tokenizer_name @@ -39,7 +39,7 @@ class OllamaEmbeddingEngine(EmbeddingEngine): model: str dimensions: int - max_tokens: int + max_completion_tokens: int endpoint: str mock: bool huggingface_tokenizer_name: str @@ -50,13 +50,13 @@ class OllamaEmbeddingEngine(EmbeddingEngine): self, model: Optional[str] = "avr/sfr-embedding-mistral:latest", dimensions: Optional[int] = 1024, - max_tokens: int = 512, + max_completion_tokens: int = 512, endpoint: Optional[str] = "http://localhost:11434/api/embeddings", huggingface_tokenizer: str = "Salesforce/SFR-Embedding-Mistral", ): self.model = model self.dimensions = dimensions - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens self.endpoint = endpoint self.huggingface_tokenizer_name = huggingface_tokenizer self.tokenizer = self.get_tokenizer() @@ -132,7 +132,7 @@ class OllamaEmbeddingEngine(EmbeddingEngine): """ logger.debug("Loading HuggingfaceTokenizer for OllamaEmbeddingEngine...") tokenizer = HuggingFaceTokenizer( - model=self.huggingface_tokenizer_name, max_tokens=self.max_tokens + model=self.huggingface_tokenizer_name, max_completion_tokens=self.max_completion_tokens ) logger.debug("Tokenizer loaded for OllamaEmbeddingEngine") return tokenizer diff --git a/cognee/infrastructure/databases/vector/embeddings/config.py b/cognee/infrastructure/databases/vector/embeddings/config.py index 2ae60d64a..04a1f18f2 100644 --- a/cognee/infrastructure/databases/vector/embeddings/config.py +++ b/cognee/infrastructure/databases/vector/embeddings/config.py @@ -18,7 +18,7 @@ class EmbeddingConfig(BaseSettings): embedding_endpoint: Optional[str] = None embedding_api_key: Optional[str] = None embedding_api_version: Optional[str] = None - embedding_max_tokens: Optional[int] = 8191 + embedding_max_completion_tokens: Optional[int] = 8191 huggingface_tokenizer: Optional[str] = None model_config = SettingsConfigDict(env_file=".env", extra="allow") @@ -38,7 +38,7 @@ class EmbeddingConfig(BaseSettings): "embedding_endpoint": self.embedding_endpoint, "embedding_api_key": self.embedding_api_key, "embedding_api_version": self.embedding_api_version, - "embedding_max_tokens": self.embedding_max_tokens, + "embedding_max_completion_tokens": self.embedding_max_completion_tokens, "huggingface_tokenizer": self.huggingface_tokenizer, } diff --git a/cognee/infrastructure/databases/vector/embeddings/get_embedding_engine.py b/cognee/infrastructure/databases/vector/embeddings/get_embedding_engine.py index d250525a3..ae15b6c6e 100644 --- a/cognee/infrastructure/databases/vector/embeddings/get_embedding_engine.py +++ b/cognee/infrastructure/databases/vector/embeddings/get_embedding_engine.py @@ -27,7 +27,7 @@ def get_embedding_engine() -> EmbeddingEngine: config.embedding_provider, config.embedding_model, config.embedding_dimensions, - config.embedding_max_tokens, + config.embedding_max_completion_tokens, config.embedding_endpoint, config.embedding_api_key, config.embedding_api_version, @@ -41,7 +41,7 @@ def create_embedding_engine( embedding_provider, embedding_model, embedding_dimensions, - embedding_max_tokens, + embedding_max_completion_tokens, embedding_endpoint, embedding_api_key, embedding_api_version, @@ -58,7 +58,7 @@ def create_embedding_engine( 'ollama', or another supported provider. - embedding_model: The model to be used for the embedding engine. - embedding_dimensions: The number of dimensions for the embeddings. - - embedding_max_tokens: The maximum number of tokens for the embeddings. + - embedding_max_completion_tokens: The maximum number of tokens for the embeddings. - embedding_endpoint: The endpoint for the embedding service, relevant for certain providers. - embedding_api_key: API key to authenticate with the embedding service, if @@ -81,7 +81,7 @@ def create_embedding_engine( return FastembedEmbeddingEngine( model=embedding_model, dimensions=embedding_dimensions, - max_tokens=embedding_max_tokens, + max_completion_tokens=embedding_max_completion_tokens, ) if embedding_provider == "ollama": @@ -90,7 +90,7 @@ def create_embedding_engine( return OllamaEmbeddingEngine( model=embedding_model, dimensions=embedding_dimensions, - max_tokens=embedding_max_tokens, + max_completion_tokens=embedding_max_completion_tokens, endpoint=embedding_endpoint, huggingface_tokenizer=huggingface_tokenizer, ) @@ -104,5 +104,5 @@ def create_embedding_engine( api_version=embedding_api_version, model=embedding_model, dimensions=embedding_dimensions, - max_tokens=embedding_max_tokens, + max_completion_tokens=embedding_max_completion_tokens, ) diff --git a/cognee/infrastructure/databases/vector/exceptions/exceptions.py b/cognee/infrastructure/databases/vector/exceptions/exceptions.py index b6a8237d8..ecd106c0d 100644 --- a/cognee/infrastructure/databases/vector/exceptions/exceptions.py +++ b/cognee/infrastructure/databases/vector/exceptions/exceptions.py @@ -1,12 +1,12 @@ from fastapi import status -from cognee.exceptions import CriticalError +from cognee.exceptions import CogneeValidationError -class CollectionNotFoundError(CriticalError): +class CollectionNotFoundError(CogneeValidationError): """ Represents an error that occurs when a requested collection cannot be found. - This class extends the CriticalError to handle specific cases where a requested + This class extends the CogneeValidationError to handle specific cases where a requested collection is unavailable. It can be initialized with a custom message and allows for logging options including log level and whether to log the error. """ diff --git a/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py b/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py index f37c83113..0184ec3ee 100644 --- a/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py +++ b/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py @@ -5,7 +5,7 @@ from pydantic import BaseModel from lancedb.pydantic import LanceModel, Vector from typing import Generic, List, Optional, TypeVar, Union, get_args, get_origin, get_type_hints -from cognee.exceptions import InvalidValueError +from cognee.infrastructure.databases.exceptions import MissingQueryParameterError from cognee.infrastructure.engine import DataPoint from cognee.infrastructure.engine.utils import parse_id from cognee.infrastructure.files.storage import get_file_storage @@ -228,7 +228,7 @@ class LanceDBAdapter(VectorDBInterface): normalized: bool = True, ): if query_text is None and query_vector is None: - raise InvalidValueError(message="One of query_text or query_vector must be provided!") + raise MissingQueryParameterError() if query_text and not query_vector: query_vector = (await self.embedding_engine.embed_text([query_text]))[0] diff --git a/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py b/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py index ac40b91b8..4dfd9792f 100644 --- a/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py +++ b/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py @@ -9,7 +9,7 @@ from sqlalchemy.exc import ProgrammingError from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential from asyncpg import DeadlockDetectedError, DuplicateTableError, UniqueViolationError -from cognee.exceptions import InvalidValueError + from cognee.shared.logging_utils import get_logger from cognee.infrastructure.engine import DataPoint from cognee.infrastructure.engine.utils import parse_id @@ -17,6 +17,7 @@ from cognee.infrastructure.databases.relational import get_relational_engine from distributed.utils import override_distributed from distributed.tasks.queued_add_data_points import queued_add_data_points +from cognee.infrastructure.databases.exceptions import MissingQueryParameterError from ...relational.ModelBase import Base from ...relational.sqlalchemy.SqlAlchemyAdapter import SQLAlchemyAdapter @@ -275,7 +276,7 @@ class PGVectorAdapter(SQLAlchemyAdapter, VectorDBInterface): return metadata.tables[collection_name] else: raise CollectionNotFoundError( - f"Collection '{collection_name}' not found!", log_level="DEBUG" + f"Collection '{collection_name}' not found!", ) async def retrieve(self, collection_name: str, data_point_ids: List[str]): @@ -302,7 +303,7 @@ class PGVectorAdapter(SQLAlchemyAdapter, VectorDBInterface): with_vector: bool = False, ) -> List[ScoredResult]: if query_text is None and query_vector is None: - raise InvalidValueError(message="One of query_text or query_vector must be provided!") + raise MissingQueryParameterError() if query_text and not query_vector: query_vector = (await self.embedding_engine.embed_text([query_text]))[0] diff --git a/cognee/infrastructure/llm/config.py b/cognee/infrastructure/llm/config.py index f31aada33..de2e2168e 100644 --- a/cognee/infrastructure/llm/config.py +++ b/cognee/infrastructure/llm/config.py @@ -18,7 +18,7 @@ class LLMConfig(BaseSettings): - llm_api_version - llm_temperature - llm_streaming - - llm_max_tokens + - llm_max_completion_tokens - transcription_model - graph_prompt_path - llm_rate_limit_enabled @@ -35,16 +35,16 @@ class LLMConfig(BaseSettings): structured_output_framework: str = "instructor" llm_provider: str = "openai" - llm_model: str = "gpt-4o-mini" + llm_model: str = "gpt-5-mini" llm_endpoint: str = "" llm_api_key: Optional[str] = None llm_api_version: Optional[str] = None llm_temperature: float = 0.0 llm_streaming: bool = False - llm_max_tokens: int = 16384 + llm_max_completion_tokens: int = 16384 baml_llm_provider: str = "openai" - baml_llm_model: str = "gpt-4o-mini" + baml_llm_model: str = "gpt-5-mini" baml_llm_endpoint: str = "" baml_llm_api_key: Optional[str] = None baml_llm_temperature: float = 0.0 @@ -171,7 +171,7 @@ class LLMConfig(BaseSettings): "api_version": self.llm_api_version, "temperature": self.llm_temperature, "streaming": self.llm_streaming, - "max_tokens": self.llm_max_tokens, + "max_completion_tokens": self.llm_max_completion_tokens, "transcription_model": self.transcription_model, "graph_prompt_path": self.graph_prompt_path, "rate_limit_enabled": self.llm_rate_limit_enabled, diff --git a/cognee/infrastructure/llm/exceptions.py b/cognee/infrastructure/llm/exceptions.py index af3aa5832..1d390a951 100644 --- a/cognee/infrastructure/llm/exceptions.py +++ b/cognee/infrastructure/llm/exceptions.py @@ -1,5 +1,33 @@ -from cognee.exceptions.exceptions import CriticalError +from cognee.exceptions.exceptions import CogneeValidationError -class ContentPolicyFilterError(CriticalError): +class ContentPolicyFilterError(CogneeValidationError): pass + + +class LLMAPIKeyNotSetError(CogneeValidationError): + """ + Raised when the LLM API key is not set in the configuration. + """ + + def __init__(self, message: str = "LLM API key is not set."): + super().__init__(message=message, name="LLMAPIKeyNotSetError") + + +class UnsupportedLLMProviderError(CogneeValidationError): + """ + Raised when an unsupported LLM provider is specified in the configuration. + """ + + def __init__(self, provider: str): + message = f"Unsupported LLM provider: {provider}" + super().__init__(message=message, name="UnsupportedLLMProviderError") + + +class MissingSystemPromptPathError(CogneeValidationError): + def __init__( + self, + name: str = "MissingSystemPromptPathError", + ): + message = "No system prompt path provided." + super().__init__(message, name) diff --git a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py index 636e6c0f2..103ac5e08 100644 --- a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py +++ b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/anthropic/adapter.py @@ -2,7 +2,7 @@ from typing import Type from pydantic import BaseModel import instructor -from cognee.exceptions import InvalidValueError +from cognee.infrastructure.llm.exceptions import MissingSystemPromptPathError from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.llm_interface import ( LLMInterface, ) @@ -23,7 +23,7 @@ class AnthropicAdapter(LLMInterface): name = "Anthropic" model: str - def __init__(self, max_tokens: int, model: str = None): + def __init__(self, max_completion_tokens: int, model: str = None): import anthropic self.aclient = instructor.patch( @@ -31,7 +31,7 @@ class AnthropicAdapter(LLMInterface): ) self.model = model - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens @sleep_and_retry_async() @rate_limit_async @@ -57,7 +57,7 @@ class AnthropicAdapter(LLMInterface): return await self.aclient( model=self.model, - max_tokens=4096, + max_completion_tokens=4096, max_retries=5, messages=[ { @@ -89,7 +89,7 @@ class AnthropicAdapter(LLMInterface): if not text_input: text_input = "No user input provided." if not system_prompt: - raise InvalidValueError(message="No system prompt path provided.") + raise MissingSystemPromptPathError() system_prompt = LLMGateway.read_query_prompt(system_prompt) diff --git a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py index 61d42ff5f..2ba94e06f 100644 --- a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py +++ b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/gemini/adapter.py @@ -5,7 +5,7 @@ from litellm import acompletion, JSONSchemaValidationError from cognee.shared.logging_utils import get_logger from cognee.modules.observability.get_observe import get_observe -from cognee.exceptions import InvalidValueError +from cognee.infrastructure.llm.exceptions import MissingSystemPromptPathError from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.llm_interface import ( LLMInterface, ) @@ -34,7 +34,7 @@ class GeminiAdapter(LLMInterface): self, api_key: str, model: str, - max_tokens: int, + max_completion_tokens: int, endpoint: Optional[str] = None, api_version: Optional[str] = None, streaming: bool = False, @@ -44,7 +44,7 @@ class GeminiAdapter(LLMInterface): self.endpoint = endpoint self.api_version = api_version self.streaming = streaming - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens @observe(as_type="generation") @sleep_and_retry_async() @@ -90,7 +90,7 @@ class GeminiAdapter(LLMInterface): model=f"{self.model}", messages=messages, api_key=self.api_key, - max_tokens=self.max_tokens, + max_completion_tokens=self.max_completion_tokens, temperature=0.1, response_format=response_schema, timeout=100, @@ -118,7 +118,7 @@ class GeminiAdapter(LLMInterface): """ Format and display the prompt for a user query. - Raises an InvalidValueError if no system prompt is provided. + Raises an MissingQueryParameterError if no system prompt is provided. Parameters: ----------- @@ -135,7 +135,7 @@ class GeminiAdapter(LLMInterface): if not text_input: text_input = "No user input provided." if not system_prompt: - raise InvalidValueError(message="No system prompt path provided.") + raise MissingSystemPromptPathError() system_prompt = LLMGateway.read_query_prompt(system_prompt) formatted_prompt = ( diff --git a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py index c62ab1b2b..86adac25a 100644 --- a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py +++ b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/generic_llm_api/adapter.py @@ -41,7 +41,7 @@ class GenericAPIAdapter(LLMInterface): api_key: str, model: str, name: str, - max_tokens: int, + max_completion_tokens: int, fallback_model: str = None, fallback_api_key: str = None, fallback_endpoint: str = None, @@ -50,7 +50,7 @@ class GenericAPIAdapter(LLMInterface): self.model = model self.api_key = api_key self.endpoint = endpoint - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens self.fallback_model = fallback_model self.fallback_api_key = fallback_api_key diff --git a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py index 22d101077..44679dcf7 100644 --- a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py +++ b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/get_llm_client.py @@ -2,11 +2,14 @@ from enum import Enum -from cognee.exceptions import InvalidValueError from cognee.infrastructure.llm import get_llm_config from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.ollama.adapter import ( OllamaAPIAdapter, ) +from cognee.infrastructure.llm.exceptions import ( + LLMAPIKeyNotSetError, + UnsupportedLLMProviderError, +) # Define an Enum for LLM Providers @@ -35,7 +38,7 @@ def get_llm_client(): This function retrieves the configuration for the LLM provider and model, and initializes the appropriate LLM client adapter accordingly. It raises an - InvalidValueError if the LLM API key is not set for certain providers or if the provider + LLMAPIKeyNotSetError if the LLM API key is not set for certain providers or if the provider is unsupported. Returns: @@ -51,15 +54,19 @@ def get_llm_client(): # Check if max_token value is defined in liteLLM for given model # if not use value from cognee configuration from cognee.infrastructure.llm.utils import ( - get_model_max_tokens, + get_model_max_completion_tokens, ) # imported here to avoid circular imports - model_max_tokens = get_model_max_tokens(llm_config.llm_model) - max_tokens = model_max_tokens if model_max_tokens else llm_config.llm_max_tokens + model_max_completion_tokens = get_model_max_completion_tokens(llm_config.llm_model) + max_completion_tokens = ( + model_max_completion_tokens + if model_max_completion_tokens + else llm_config.llm_max_completion_tokens + ) if provider == LLMProvider.OPENAI: if llm_config.llm_api_key is None: - raise InvalidValueError(message="LLM API key is not set.") + raise LLMAPIKeyNotSetError() from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.openai.adapter import ( OpenAIAdapter, @@ -71,7 +78,7 @@ def get_llm_client(): api_version=llm_config.llm_api_version, model=llm_config.llm_model, transcription_model=llm_config.transcription_model, - max_tokens=max_tokens, + max_completion_tokens=max_completion_tokens, streaming=llm_config.llm_streaming, fallback_api_key=llm_config.fallback_api_key, fallback_endpoint=llm_config.fallback_endpoint, @@ -80,7 +87,7 @@ def get_llm_client(): elif provider == LLMProvider.OLLAMA: if llm_config.llm_api_key is None: - raise InvalidValueError(message="LLM API key is not set.") + raise LLMAPIKeyNotSetError() from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.generic_llm_api.adapter import ( GenericAPIAdapter, @@ -91,7 +98,7 @@ def get_llm_client(): llm_config.llm_api_key, llm_config.llm_model, "Ollama", - max_tokens=max_tokens, + max_completion_tokens=max_completion_tokens, ) elif provider == LLMProvider.ANTHROPIC: @@ -99,11 +106,13 @@ def get_llm_client(): AnthropicAdapter, ) - return AnthropicAdapter(max_tokens=max_tokens, model=llm_config.llm_model) + return AnthropicAdapter( + max_completion_tokens=max_completion_tokens, model=llm_config.llm_model + ) elif provider == LLMProvider.CUSTOM: if llm_config.llm_api_key is None: - raise InvalidValueError(message="LLM API key is not set.") + raise LLMAPIKeyNotSetError() from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.generic_llm_api.adapter import ( GenericAPIAdapter, @@ -114,7 +123,7 @@ def get_llm_client(): llm_config.llm_api_key, llm_config.llm_model, "Custom", - max_tokens=max_tokens, + max_completion_tokens=max_completion_tokens, fallback_api_key=llm_config.fallback_api_key, fallback_endpoint=llm_config.fallback_endpoint, fallback_model=llm_config.fallback_model, @@ -122,7 +131,7 @@ def get_llm_client(): elif provider == LLMProvider.GEMINI: if llm_config.llm_api_key is None: - raise InvalidValueError(message="LLM API key is not set.") + raise LLMAPIKeyNotSetError() from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.gemini.adapter import ( GeminiAdapter, @@ -131,11 +140,11 @@ def get_llm_client(): return GeminiAdapter( api_key=llm_config.llm_api_key, model=llm_config.llm_model, - max_tokens=max_tokens, + max_completion_tokens=max_completion_tokens, endpoint=llm_config.llm_endpoint, api_version=llm_config.llm_api_version, streaming=llm_config.llm_streaming, ) else: - raise InvalidValueError(message=f"Unsupported LLM provider: {provider}") + raise UnsupportedLLMProviderError(provider) diff --git a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py index cd7276694..314cb79d8 100644 --- a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py +++ b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/ollama/adapter.py @@ -30,16 +30,18 @@ class OllamaAPIAdapter(LLMInterface): - model - api_key - endpoint - - max_tokens + - max_completion_tokens - aclient """ - def __init__(self, endpoint: str, api_key: str, model: str, name: str, max_tokens: int): + def __init__( + self, endpoint: str, api_key: str, model: str, name: str, max_completion_tokens: int + ): self.name = name self.model = model self.api_key = api_key self.endpoint = endpoint - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens self.aclient = instructor.from_openai( OpenAI(base_url=self.endpoint, api_key=self.api_key), mode=instructor.Mode.JSON @@ -159,7 +161,7 @@ class OllamaAPIAdapter(LLMInterface): ], } ], - max_tokens=300, + max_completion_tokens=300, ) # Ensure response is valid before accessing .choices[0].message.content diff --git a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py index 69c1bac1c..95c14f1bc 100644 --- a/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py +++ b/cognee/infrastructure/llm/structured_output_framework/litellm_instructor/llm/openai/adapter.py @@ -7,12 +7,14 @@ from openai import ContentFilterFinishReasonError from litellm.exceptions import ContentPolicyViolationError from instructor.exceptions import InstructorRetryException -from cognee.exceptions import InvalidValueError from cognee.infrastructure.llm.LLMGateway import LLMGateway from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.llm_interface import ( LLMInterface, ) -from cognee.infrastructure.llm.exceptions import ContentPolicyFilterError +from cognee.infrastructure.llm.exceptions import ( + ContentPolicyFilterError, + MissingSystemPromptPathError, +) from cognee.infrastructure.files.utils.open_data_file import open_data_file from cognee.infrastructure.llm.structured_output_framework.litellm_instructor.llm.rate_limiter import ( rate_limit_async, @@ -62,7 +64,7 @@ class OpenAIAdapter(LLMInterface): api_version: str, model: str, transcription_model: str, - max_tokens: int, + max_completion_tokens: int, streaming: bool = False, fallback_model: str = None, fallback_api_key: str = None, @@ -75,7 +77,7 @@ class OpenAIAdapter(LLMInterface): self.api_key = api_key self.endpoint = endpoint self.api_version = api_version - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens self.streaming = streaming self.fallback_model = fallback_model @@ -299,7 +301,7 @@ class OpenAIAdapter(LLMInterface): api_key=self.api_key, api_base=self.endpoint, api_version=self.api_version, - max_tokens=300, + max_completion_tokens=300, max_retries=self.MAX_RETRIES, ) @@ -308,7 +310,7 @@ class OpenAIAdapter(LLMInterface): Format and display the prompt for a user query. This method formats the prompt using the provided user input and system prompt, - returning a string representation. Raises InvalidValueError if the system prompt is not + returning a string representation. Raises MissingSystemPromptPathError if the system prompt is not provided. Parameters: @@ -325,7 +327,7 @@ class OpenAIAdapter(LLMInterface): if not text_input: text_input = "No user input provided." if not system_prompt: - raise InvalidValueError(message="No system prompt path provided.") + raise MissingSystemPromptPathError() system_prompt = LLMGateway.read_query_prompt(system_prompt) formatted_prompt = ( diff --git a/cognee/infrastructure/llm/tokenizer/Gemini/adapter.py b/cognee/infrastructure/llm/tokenizer/Gemini/adapter.py index 5e1b48b66..a57cff3f7 100644 --- a/cognee/infrastructure/llm/tokenizer/Gemini/adapter.py +++ b/cognee/infrastructure/llm/tokenizer/Gemini/adapter.py @@ -17,10 +17,10 @@ class GeminiTokenizer(TokenizerInterface): def __init__( self, model: str, - max_tokens: int = 3072, + max_completion_tokens: int = 3072, ): self.model = model - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens # Get LLM API key from config from cognee.infrastructure.databases.vector.embeddings.config import get_embedding_config diff --git a/cognee/infrastructure/llm/tokenizer/HuggingFace/adapter.py b/cognee/infrastructure/llm/tokenizer/HuggingFace/adapter.py index 4ac68ff20..26aef4b1a 100644 --- a/cognee/infrastructure/llm/tokenizer/HuggingFace/adapter.py +++ b/cognee/infrastructure/llm/tokenizer/HuggingFace/adapter.py @@ -14,17 +14,17 @@ class HuggingFaceTokenizer(TokenizerInterface): Instance variables include: - model: str - - max_tokens: int + - max_completion_tokens: int - tokenizer: AutoTokenizer """ def __init__( self, model: str, - max_tokens: int = 512, + max_completion_tokens: int = 512, ): self.model = model - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens # Import here to make it an optional dependency from transformers import AutoTokenizer diff --git a/cognee/infrastructure/llm/tokenizer/Mistral/adapter.py b/cognee/infrastructure/llm/tokenizer/Mistral/adapter.py index 5f23046ca..a0bdfd222 100644 --- a/cognee/infrastructure/llm/tokenizer/Mistral/adapter.py +++ b/cognee/infrastructure/llm/tokenizer/Mistral/adapter.py @@ -16,17 +16,17 @@ class MistralTokenizer(TokenizerInterface): Instance variables include: - model: str - - max_tokens: int + - max_completion_tokens: int - tokenizer: MistralTokenizer """ def __init__( self, model: str, - max_tokens: int = 3072, + max_completion_tokens: int = 3072, ): self.model = model - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens # Import here to make it an optional dependency from mistral_common.tokens.tokenizers.mistral import MistralTokenizer diff --git a/cognee/infrastructure/llm/tokenizer/TikToken/adapter.py b/cognee/infrastructure/llm/tokenizer/TikToken/adapter.py index 8806112c3..e51747612 100644 --- a/cognee/infrastructure/llm/tokenizer/TikToken/adapter.py +++ b/cognee/infrastructure/llm/tokenizer/TikToken/adapter.py @@ -13,10 +13,10 @@ class TikTokenTokenizer(TokenizerInterface): def __init__( self, model: Optional[str] = None, - max_tokens: int = 8191, + max_completion_tokens: int = 8191, ): self.model = model - self.max_tokens = max_tokens + self.max_completion_tokens = max_completion_tokens # Initialize TikToken for GPT based on model if model: self.tokenizer = tiktoken.encoding_for_model(self.model) @@ -93,9 +93,9 @@ class TikTokenTokenizer(TokenizerInterface): num_tokens = len(self.tokenizer.encode(text)) return num_tokens - def trim_text_to_max_tokens(self, text: str) -> str: + def trim_text_to_max_completion_tokens(self, text: str) -> str: """ - Trim the text so that the number of tokens does not exceed max_tokens. + Trim the text so that the number of tokens does not exceed max_completion_tokens. Parameters: ----------- @@ -111,13 +111,13 @@ class TikTokenTokenizer(TokenizerInterface): num_tokens = self.count_tokens(text) # If the number of tokens is within the limit, return the text as is - if num_tokens <= self.max_tokens: + if num_tokens <= self.max_completion_tokens: return text # If the number exceeds the limit, trim the text # This is a simple trim, it may cut words in half; consider using word boundaries for a cleaner cut encoded_text = self.tokenizer.encode(text) - trimmed_encoded_text = encoded_text[: self.max_tokens] + trimmed_encoded_text = encoded_text[: self.max_completion_tokens] # Decoding the trimmed text trimmed_text = self.tokenizer.decode(trimmed_encoded_text) return trimmed_text diff --git a/cognee/infrastructure/llm/utils.py b/cognee/infrastructure/llm/utils.py index 7190db654..cb88fa85e 100644 --- a/cognee/infrastructure/llm/utils.py +++ b/cognee/infrastructure/llm/utils.py @@ -32,13 +32,13 @@ def get_max_chunk_tokens(): # We need to make sure chunk size won't take more than half of LLM max context token size # but it also can't be bigger than the embedding engine max token size - llm_cutoff_point = llm_client.max_tokens // 2 # Round down the division - max_chunk_tokens = min(embedding_engine.max_tokens, llm_cutoff_point) + llm_cutoff_point = llm_client.max_completion_tokens // 2 # Round down the division + max_chunk_tokens = min(embedding_engine.max_completion_tokens, llm_cutoff_point) return max_chunk_tokens -def get_model_max_tokens(model_name: str): +def get_model_max_completion_tokens(model_name: str): """ Retrieve the maximum token limit for a specified model name if it exists. @@ -56,15 +56,15 @@ def get_model_max_tokens(model_name: str): Number of max tokens of model, or None if model is unknown """ - max_tokens = None + max_completion_tokens = None if model_name in litellm.model_cost: - max_tokens = litellm.model_cost[model_name]["max_tokens"] - logger.debug(f"Max input tokens for {model_name}: {max_tokens}") + max_completion_tokens = litellm.model_cost[model_name]["max_tokens"] + logger.debug(f"Max input tokens for {model_name}: {max_completion_tokens}") else: logger.info("Model not found in LiteLLM's model_cost.") - return max_tokens + return max_completion_tokens async def test_llm_connection(): diff --git a/cognee/infrastructure/loaders/LoaderInterface.py b/cognee/infrastructure/loaders/LoaderInterface.py index f0e91adee..3a1c9bf3e 100644 --- a/cognee/infrastructure/loaders/LoaderInterface.py +++ b/cognee/infrastructure/loaders/LoaderInterface.py @@ -58,7 +58,7 @@ class LoaderInterface(ABC): pass @abstractmethod - async def load(self, file_path: str, file_stream: Optional[Any] = None, **kwargs): + async def load(self, file_path: str, **kwargs): """ Load and process the file, returning standardized result. diff --git a/cognee/modules/data/exceptions/exceptions.py b/cognee/modules/data/exceptions/exceptions.py index 214bf5381..ac3b68e64 100644 --- a/cognee/modules/data/exceptions/exceptions.py +++ b/cognee/modules/data/exceptions/exceptions.py @@ -1,8 +1,11 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import ( + CogneeValidationError, + CogneeConfigurationError, +) from fastapi import status -class UnstructuredLibraryImportError(CogneeApiError): +class UnstructuredLibraryImportError(CogneeConfigurationError): def __init__( self, message: str = "Import error. Unstructured library is not installed.", @@ -12,7 +15,7 @@ class UnstructuredLibraryImportError(CogneeApiError): super().__init__(message, name, status_code) -class UnauthorizedDataAccessError(CogneeApiError): +class UnauthorizedDataAccessError(CogneeValidationError): def __init__( self, message: str = "User does not have permission to access this data.", @@ -22,7 +25,7 @@ class UnauthorizedDataAccessError(CogneeApiError): super().__init__(message, name, status_code) -class DatasetNotFoundError(CogneeApiError): +class DatasetNotFoundError(CogneeValidationError): def __init__( self, message: str = "Dataset not found.", @@ -32,7 +35,7 @@ class DatasetNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class DatasetTypeError(CogneeApiError): +class DatasetTypeError(CogneeValidationError): def __init__( self, message: str = "Dataset type not supported.", @@ -40,3 +43,13 @@ class DatasetTypeError(CogneeApiError): status_code=status.HTTP_400_BAD_REQUEST, ): super().__init__(message, name, status_code) + + +class InvalidTableAttributeError(CogneeValidationError): + def __init__( + self, + message: str = "The provided data object is missing the required '__tablename__' attribute.", + name: str = "InvalidTableAttributeError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + super().__init__(message, name, status_code) diff --git a/cognee/modules/data/methods/delete_data.py b/cognee/modules/data/methods/delete_data.py index 2d87d73a5..5425acac3 100644 --- a/cognee/modules/data/methods/delete_data.py +++ b/cognee/modules/data/methods/delete_data.py @@ -1,4 +1,4 @@ -from cognee.exceptions import InvalidAttributeError +from cognee.modules.data.exceptions.exceptions import InvalidTableAttributeError from cognee.modules.data.models import Data from cognee.infrastructure.databases.relational import get_relational_engine @@ -13,9 +13,7 @@ async def delete_data(data: Data): ValueError: If the data object is invalid. """ if not hasattr(data, "__tablename__"): - raise InvalidAttributeError( - message="The provided data object is missing the required '__tablename__' attribute." - ) + raise InvalidTableAttributeError() db_engine = get_relational_engine() diff --git a/cognee/modules/data/processing/document_types/exceptions/exceptions.py b/cognee/modules/data/processing/document_types/exceptions/exceptions.py index b5126a8a7..a05e64d60 100644 --- a/cognee/modules/data/processing/document_types/exceptions/exceptions.py +++ b/cognee/modules/data/processing/document_types/exceptions/exceptions.py @@ -1,8 +1,8 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeSystemError from fastapi import status -class PyPdfInternalError(CogneeApiError): +class PyPdfInternalError(CogneeSystemError): """Internal pypdf error""" def __init__( diff --git a/cognee/modules/graph/cognee_graph/CogneeGraph.py b/cognee/modules/graph/cognee_graph/CogneeGraph.py index ca1984dfe..ed867ae24 100644 --- a/cognee/modules/graph/cognee_graph/CogneeGraph.py +++ b/cognee/modules/graph/cognee_graph/CogneeGraph.py @@ -2,8 +2,11 @@ import time from cognee.shared.logging_utils import get_logger from typing import List, Dict, Union, Optional, Type -from cognee.exceptions import InvalidValueError -from cognee.modules.graph.exceptions import EntityNotFoundError, EntityAlreadyExistsError +from cognee.modules.graph.exceptions import ( + EntityNotFoundError, + EntityAlreadyExistsError, + InvalidDimensionsError, +) from cognee.infrastructure.databases.graph.graph_db_interface import GraphDBInterface from cognee.modules.graph.cognee_graph.CogneeGraphElements import Node, Edge from cognee.modules.graph.cognee_graph.CogneeAbstractGraph import CogneeAbstractGraph @@ -66,8 +69,7 @@ class CogneeGraph(CogneeAbstractGraph): node_name: Optional[List[str]] = None, ) -> None: if node_dimension < 1 or edge_dimension < 1: - raise InvalidValueError(message="Dimensions must be positive integers") - + raise InvalidDimensionsError() try: import time diff --git a/cognee/modules/graph/cognee_graph/CogneeGraphElements.py b/cognee/modules/graph/cognee_graph/CogneeGraphElements.py index 063248ee2..0ca9c4fb9 100644 --- a/cognee/modules/graph/cognee_graph/CogneeGraphElements.py +++ b/cognee/modules/graph/cognee_graph/CogneeGraphElements.py @@ -1,7 +1,6 @@ import numpy as np from typing import List, Dict, Optional, Any, Union - -from cognee.exceptions import InvalidValueError +from cognee.modules.graph.exceptions import InvalidDimensionsError, DimensionOutOfRangeError class Node: @@ -24,7 +23,7 @@ class Node: self, node_id: str, attributes: Optional[Dict[str, Any]] = None, dimension: int = 1 ): if dimension <= 0: - raise InvalidValueError(message="Dimension must be a positive integer") + raise InvalidDimensionsError() self.id = node_id self.attributes = attributes if attributes is not None else {} self.attributes["vector_distance"] = float("inf") @@ -58,9 +57,7 @@ class Node: def is_node_alive_in_dimension(self, dimension: int) -> bool: if dimension < 0 or dimension >= len(self.status): - raise InvalidValueError( - message=f"Dimension {dimension} is out of range. Valid range is 0 to {len(self.status) - 1}." - ) + raise DimensionOutOfRangeError(dimension=dimension, max_index=len(self.status) - 1) return self.status[dimension] == 1 def add_attribute(self, key: str, value: Any) -> None: @@ -110,7 +107,7 @@ class Edge: dimension: int = 1, ): if dimension <= 0: - raise InvalidValueError(message="Dimensions must be a positive integer.") + raise InvalidDimensionsError() self.node1 = node1 self.node2 = node2 self.attributes = attributes if attributes is not None else {} @@ -120,9 +117,7 @@ class Edge: def is_edge_alive_in_dimension(self, dimension: int) -> bool: if dimension < 0 or dimension >= len(self.status): - raise InvalidValueError( - message=f"Dimension {dimension} is out of range. Valid range is 0 to {len(self.status) - 1}." - ) + raise DimensionOutOfRangeError(dimension=dimension, max_index=len(self.status) - 1) return self.status[dimension] == 1 def add_attribute(self, key: str, value: Any) -> None: diff --git a/cognee/modules/graph/exceptions/__init__.py b/cognee/modules/graph/exceptions/__init__.py index 5cf600099..04bec74ad 100644 --- a/cognee/modules/graph/exceptions/__init__.py +++ b/cognee/modules/graph/exceptions/__init__.py @@ -7,4 +7,6 @@ This module defines a set of exceptions for handling various graph errors from .exceptions import ( EntityNotFoundError, EntityAlreadyExistsError, + InvalidDimensionsError, + DimensionOutOfRangeError, ) diff --git a/cognee/modules/graph/exceptions/exceptions.py b/cognee/modules/graph/exceptions/exceptions.py index 854e620ff..67f4200ff 100644 --- a/cognee/modules/graph/exceptions/exceptions.py +++ b/cognee/modules/graph/exceptions/exceptions.py @@ -1,8 +1,8 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeValidationError from fastapi import status -class EntityNotFoundError(CogneeApiError): +class EntityNotFoundError(CogneeValidationError): """Database returns nothing""" def __init__( @@ -14,7 +14,7 @@ class EntityNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class EntityAlreadyExistsError(CogneeApiError): +class EntityAlreadyExistsError(CogneeValidationError): """Conflict detected, like trying to create a resource that already exists""" def __init__( @@ -24,3 +24,25 @@ class EntityAlreadyExistsError(CogneeApiError): status_code=status.HTTP_409_CONFLICT, ): super().__init__(message, name, status_code) + + +class InvalidDimensionsError(CogneeValidationError): + def __init__( + self, + name: str = "InvalidDimensionsError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + message = "Dimensions must be positive integers." + super().__init__(message, name, status_code) + + +class DimensionOutOfRangeError(CogneeValidationError): + def __init__( + self, + dimension: int, + max_index: int, + name: str = "DimensionOutOfRangeError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + message = f"Dimension {dimension} is out of range. Valid range is 0 to {max_index}." + super().__init__(message, name, status_code) diff --git a/cognee/modules/ingestion/exceptions/exceptions.py b/cognee/modules/ingestion/exceptions/exceptions.py index 08991a946..d43b69d60 100644 --- a/cognee/modules/ingestion/exceptions/exceptions.py +++ b/cognee/modules/ingestion/exceptions/exceptions.py @@ -1,8 +1,8 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeValidationError from fastapi import status -class IngestionError(CogneeApiError): +class IngestionError(CogneeValidationError): def __init__( self, message: str = "Type of data sent to classify not supported.", diff --git a/cognee/modules/ontology/exceptions/exceptions.py b/cognee/modules/ontology/exceptions/exceptions.py index 511e41524..daa8dcdb5 100644 --- a/cognee/modules/ontology/exceptions/exceptions.py +++ b/cognee/modules/ontology/exceptions/exceptions.py @@ -1,8 +1,8 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeSystemError from fastapi import status -class OntologyInitializationError(CogneeApiError): +class OntologyInitializationError(CogneeSystemError): def __init__( self, message: str = "Ontology initialization failed", @@ -12,7 +12,7 @@ class OntologyInitializationError(CogneeApiError): super().__init__(message, name, status_code) -class FindClosestMatchError(CogneeApiError): +class FindClosestMatchError(CogneeSystemError): def __init__( self, message: str = "Error in find_closest_match", @@ -22,7 +22,7 @@ class FindClosestMatchError(CogneeApiError): super().__init__(message, name, status_code) -class GetSubgraphError(CogneeApiError): +class GetSubgraphError(CogneeSystemError): def __init__( self, message: str = "Failed to retrieve subgraph", diff --git a/cognee/modules/pipelines/exceptions/exceptions.py b/cognee/modules/pipelines/exceptions/exceptions.py index 0a4863075..646a51286 100644 --- a/cognee/modules/pipelines/exceptions/exceptions.py +++ b/cognee/modules/pipelines/exceptions/exceptions.py @@ -1,8 +1,8 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeSystemError from fastapi import status -class PipelineRunFailedError(CogneeApiError): +class PipelineRunFailedError(CogneeSystemError): def __init__( self, message: str = "Pipeline run failed.", diff --git a/cognee/modules/retrieval/cypher_search_retriever.py b/cognee/modules/retrieval/cypher_search_retriever.py index 2329bae51..b885891e8 100644 --- a/cognee/modules/retrieval/cypher_search_retriever.py +++ b/cognee/modules/retrieval/cypher_search_retriever.py @@ -1,6 +1,5 @@ from typing import Any, Optional from cognee.infrastructure.databases.graph import get_graph_engine -from cognee.infrastructure.databases.graph.networkx.adapter import NetworkXAdapter from cognee.modules.retrieval.base_retriever import BaseRetriever from cognee.modules.retrieval.utils.completion import generate_completion from cognee.modules.retrieval.exceptions import SearchTypeNotSupported, CypherSearchError @@ -31,8 +30,7 @@ class CypherSearchRetriever(BaseRetriever): """ Retrieves relevant context using a cypher query. - If the graph engine is an instance of NetworkXAdapter, raises SearchTypeNotSupported. If - any error occurs during execution, logs the error and raises CypherSearchError. + If any error occurs during execution, logs the error and raises CypherSearchError. Parameters: ----------- @@ -46,12 +44,6 @@ class CypherSearchRetriever(BaseRetriever): """ try: graph_engine = await get_graph_engine() - - if isinstance(graph_engine, NetworkXAdapter): - raise SearchTypeNotSupported( - "CYPHER search type not supported for NetworkXAdapter." - ) - result = await graph_engine.query(query) except Exception as e: logger.error("Failed to execture cypher search retrieval: %s", str(e)) diff --git a/cognee/modules/retrieval/exceptions/exceptions.py b/cognee/modules/retrieval/exceptions/exceptions.py index a403f3e44..3e934909b 100644 --- a/cognee/modules/retrieval/exceptions/exceptions.py +++ b/cognee/modules/retrieval/exceptions/exceptions.py @@ -1,8 +1,8 @@ from fastapi import status -from cognee.exceptions import CogneeApiError, CriticalError +from cognee.exceptions import CogneeValidationError, CogneeSystemError -class SearchTypeNotSupported(CogneeApiError): +class SearchTypeNotSupported(CogneeValidationError): def __init__( self, message: str = "CYPHER search type not supported by the adapter.", @@ -12,7 +12,7 @@ class SearchTypeNotSupported(CogneeApiError): super().__init__(message, name, status_code) -class CypherSearchError(CogneeApiError): +class CypherSearchError(CogneeSystemError): def __init__( self, message: str = "An error occurred during the execution of the Cypher query.", @@ -22,11 +22,17 @@ class CypherSearchError(CogneeApiError): super().__init__(message, name, status_code) -class NoDataError(CriticalError): - message: str = "No data found in the system, please add data first." +class NoDataError(CogneeValidationError): + def __init__( + self, + message: str = "No data found in the system, please add data first.", + name: str = "NoDataError", + status_code: int = status.HTTP_404_NOT_FOUND, + ): + super().__init__(message, name, status_code) -class CollectionDistancesNotFoundError(CogneeApiError): +class CollectionDistancesNotFoundError(CogneeValidationError): def __init__( self, message: str = "No collection distances found for the given query.", diff --git a/cognee/modules/retrieval/natural_language_retriever.py b/cognee/modules/retrieval/natural_language_retriever.py index d9a77bd7e..9797c28a0 100644 --- a/cognee/modules/retrieval/natural_language_retriever.py +++ b/cognee/modules/retrieval/natural_language_retriever.py @@ -1,7 +1,6 @@ from typing import Any, Optional from cognee.shared.logging_utils import get_logger from cognee.infrastructure.databases.graph import get_graph_engine -from cognee.infrastructure.databases.graph.networkx.adapter import NetworkXAdapter from cognee.infrastructure.llm.LLMGateway import LLMGateway from cognee.modules.retrieval.base_retriever import BaseRetriever from cognee.modules.retrieval.exceptions import SearchTypeNotSupported @@ -123,9 +122,6 @@ class NaturalLanguageRetriever(BaseRetriever): """ graph_engine = await get_graph_engine() - if isinstance(graph_engine, (NetworkXAdapter)): - raise SearchTypeNotSupported("Natural language search type not supported.") - return await self._execute_cypher_query(query, graph_engine) async def get_completion(self, query: str, context: Optional[Any] = None) -> Any: diff --git a/cognee/modules/search/exceptions/__init__.py b/cognee/modules/search/exceptions/__init__.py new file mode 100644 index 000000000..a019da249 --- /dev/null +++ b/cognee/modules/search/exceptions/__init__.py @@ -0,0 +1,7 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various data errors +""" + +from .exceptions import UnsupportedSearchTypeError diff --git a/cognee/modules/search/exceptions/exceptions.py b/cognee/modules/search/exceptions/exceptions.py new file mode 100644 index 000000000..ddc877700 --- /dev/null +++ b/cognee/modules/search/exceptions/exceptions.py @@ -0,0 +1,15 @@ +from cognee.exceptions import ( + CogneeValidationError, +) +from fastapi import status + + +class UnsupportedSearchTypeError(CogneeValidationError): + def __init__( + self, + search_type: str, + name: str = "UnsupportedSearchTypeError", + status_code: int = status.HTTP_400_BAD_REQUEST, + ): + message = f"Unsupported search type: {search_type}" + super().__init__(message, name, status_code) diff --git a/cognee/modules/search/methods/search.py b/cognee/modules/search/methods/search.py index 2e66a2461..ba11d7f72 100644 --- a/cognee/modules/search/methods/search.py +++ b/cognee/modules/search/methods/search.py @@ -3,9 +3,8 @@ import json import asyncio from uuid import UUID from typing import Callable, List, Optional, Type, Union - +from cognee.modules.search.exceptions import UnsupportedSearchTypeError from cognee.context_global_variables import set_database_global_context_variables -from cognee.exceptions import InvalidValueError from cognee.modules.retrieval.chunks_retriever import ChunksRetriever from cognee.modules.retrieval.insights_retriever import InsightsRetriever from cognee.modules.retrieval.summaries_retriever import SummariesRetriever @@ -143,7 +142,7 @@ async def specific_search( search_task = search_tasks.get(query_type) if search_task is None: - raise InvalidValueError(message=f"Unsupported search type: {query_type}") + raise UnsupportedSearchTypeError(str(query_type)) send_telemetry("cognee.search EXECUTION STARTED", user.id) diff --git a/cognee/modules/settings/get_settings.py b/cognee/modules/settings/get_settings.py index fa7dfc2df..fa92c8043 100644 --- a/cognee/modules/settings/get_settings.py +++ b/cognee/modules/settings/get_settings.py @@ -88,8 +88,8 @@ def get_settings() -> SettingsDict: "models": { "openai": [ { - "value": "gpt-4o-mini", - "label": "gpt-4o-mini", + "value": "gpt-5-mini", + "label": "gpt-5-mini", }, { "value": "gpt-4o", diff --git a/cognee/modules/users/exceptions/exceptions.py b/cognee/modules/users/exceptions/exceptions.py index a7484c05e..85ca8ab63 100644 --- a/cognee/modules/users/exceptions/exceptions.py +++ b/cognee/modules/users/exceptions/exceptions.py @@ -1,8 +1,8 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeValidationError from fastapi import status -class RoleNotFoundError(CogneeApiError): +class RoleNotFoundError(CogneeValidationError): """User group not found""" def __init__( @@ -14,7 +14,7 @@ class RoleNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class TenantNotFoundError(CogneeApiError): +class TenantNotFoundError(CogneeValidationError): """User group not found""" def __init__( @@ -26,7 +26,7 @@ class TenantNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class UserNotFoundError(CogneeApiError): +class UserNotFoundError(CogneeValidationError): """User not found""" def __init__( @@ -38,7 +38,7 @@ class UserNotFoundError(CogneeApiError): super().__init__(message, name, status_code) -class PermissionDeniedError(CogneeApiError): +class PermissionDeniedError(CogneeValidationError): def __init__( self, message: str = "User does not have permission on documents.", @@ -48,7 +48,7 @@ class PermissionDeniedError(CogneeApiError): super().__init__(message, name, status_code) -class PermissionNotFoundError(CogneeApiError): +class PermissionNotFoundError(CogneeValidationError): def __init__( self, message: str = "Permission type does not exist.", diff --git a/cognee/shared/exceptions/exceptions.py b/cognee/shared/exceptions/exceptions.py index 4b4164995..43084e04b 100644 --- a/cognee/shared/exceptions/exceptions.py +++ b/cognee/shared/exceptions/exceptions.py @@ -1,8 +1,8 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeValidationError from fastapi import status -class IngestionError(CogneeApiError): +class IngestionError(CogneeValidationError): def __init__( self, message: str = "Failed to load data.", diff --git a/cognee/shared/utils.py b/cognee/shared/utils.py index f965119fd..fb4193a8c 100644 --- a/cognee/shared/utils.py +++ b/cognee/shared/utils.py @@ -3,7 +3,6 @@ import os import requests from datetime import datetime, timezone -import networkx as nx import matplotlib.pyplot as plt import http.server import socketserver diff --git a/cognee/tasks/completion/exceptions/exceptions.py b/cognee/tasks/completion/exceptions/exceptions.py index ac105a966..e5ab5b67c 100644 --- a/cognee/tasks/completion/exceptions/exceptions.py +++ b/cognee/tasks/completion/exceptions/exceptions.py @@ -1,11 +1,11 @@ -from cognee.exceptions import CogneeApiError +from cognee.exceptions import CogneeValidationError from fastapi import status -class NoRelevantDataError(CogneeApiError): +class NoRelevantDataError(CogneeValidationError): """ Represents an error when no relevant data is found during a search. This class is a - subclass of CogneeApiError. + subclass of CogneeValidationError. Public methods: diff --git a/cognee/tasks/documents/classify_documents.py b/cognee/tasks/documents/classify_documents.py index 673e17c75..9fa512906 100644 --- a/cognee/tasks/documents/classify_documents.py +++ b/cognee/tasks/documents/classify_documents.py @@ -10,6 +10,7 @@ from cognee.modules.data.processing.document_types import ( ) from cognee.modules.engine.models.node_set import NodeSet from cognee.modules.engine.utils.generate_node_id import generate_node_id +from cognee.tasks.documents.exceptions import WrongDataDocumentInputError EXTENSION_TO_DOCUMENT_CLASS = { "pdf": PdfDocument, # Text documents @@ -111,6 +112,9 @@ async def classify_documents(data_documents: list[Data]) -> list[Document]: - list[Document]: A list of Document objects created based on the classified data documents. """ + if not isinstance(data_documents, list): + raise WrongDataDocumentInputError("data_documents") + documents = [] for data_item in data_documents: document = EXTENSION_TO_DOCUMENT_CLASS[data_item.extension]( diff --git a/cognee/tasks/documents/exceptions/__init__.py b/cognee/tasks/documents/exceptions/__init__.py new file mode 100644 index 000000000..a8602d6f5 --- /dev/null +++ b/cognee/tasks/documents/exceptions/__init__.py @@ -0,0 +1,11 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various data errors +""" + +from .exceptions import ( + WrongDataDocumentInputError, + InvalidChunkSizeError, + InvalidChunkerError, +) diff --git a/cognee/tasks/documents/exceptions/exceptions.py b/cognee/tasks/documents/exceptions/exceptions.py new file mode 100644 index 000000000..737e9a3d1 --- /dev/null +++ b/cognee/tasks/documents/exceptions/exceptions.py @@ -0,0 +1,36 @@ +from cognee.exceptions import ( + CogneeValidationError, + CogneeConfigurationError, +) +from fastapi import status + + +class WrongDataDocumentInputError(CogneeValidationError): + """Raised when a wrong data document is provided.""" + + def __init__( + self, + field: str, + name: str = "WrongDataDocumentInputError", + status_code: int = status.HTTP_422_UNPROCESSABLE_ENTITY, + ): + message = f"Missing of invalid parameter: '{field}'." + super().__init__(message, name, status_code) + + +class InvalidChunkSizeError(CogneeValidationError): + def __init__(self, value): + super().__init__( + message=f"max_chunk_size must be a positive integer (got {value}).", + name="InvalidChunkSizeError", + status_code=status.HTTP_400_BAD_REQUEST, + ) + + +class InvalidChunkerError(CogneeValidationError): + def __init__(self): + super().__init__( + message="chunker must be a valid Chunker class.", + name="InvalidChunkerError", + status_code=status.HTTP_400_BAD_REQUEST, + ) diff --git a/cognee/tasks/documents/extract_chunks_from_documents.py b/cognee/tasks/documents/extract_chunks_from_documents.py index 216185495..d52380c8d 100644 --- a/cognee/tasks/documents/extract_chunks_from_documents.py +++ b/cognee/tasks/documents/extract_chunks_from_documents.py @@ -8,6 +8,7 @@ from cognee.modules.data.models import Data from cognee.infrastructure.databases.relational import get_relational_engine from cognee.modules.chunking.TextChunker import TextChunker from cognee.modules.chunking.Chunker import Chunker +from cognee.tasks.documents.exceptions import InvalidChunkSizeError, InvalidChunkerError async def update_document_token_count(document_id: UUID, token_count: int) -> None: @@ -37,6 +38,13 @@ async def extract_chunks_from_documents( - The `read` method of the `Document` class must be implemented to support the chunking operation. - The `chunker` parameter determines the chunking logic and should align with the document type. """ + if not isinstance(max_chunk_size, int) or max_chunk_size <= 0: + raise InvalidChunkSizeError(max_chunk_size) + if not isinstance(chunker, type): + raise InvalidChunkerError() + if not hasattr(chunker, "read"): + raise InvalidChunkerError() + for document in documents: document_token_count = 0 @@ -48,5 +56,3 @@ async def extract_chunks_from_documents( yield document_chunk await update_document_token_count(document.id, document_token_count) - - # todo rita diff --git a/cognee/tasks/graph/exceptions/__init__.py b/cognee/tasks/graph/exceptions/__init__.py new file mode 100644 index 000000000..d91bbbd36 --- /dev/null +++ b/cognee/tasks/graph/exceptions/__init__.py @@ -0,0 +1,12 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various data errors +""" + +from .exceptions import ( + InvalidDataChunksError, + InvalidGraphModelError, + InvalidOntologyAdapterError, + InvalidChunkGraphInputError, +) diff --git a/cognee/tasks/graph/exceptions/exceptions.py b/cognee/tasks/graph/exceptions/exceptions.py new file mode 100644 index 000000000..c09ee1c08 --- /dev/null +++ b/cognee/tasks/graph/exceptions/exceptions.py @@ -0,0 +1,41 @@ +from cognee.exceptions import ( + CogneeValidationError, + CogneeConfigurationError, +) +from fastapi import status + + +class InvalidDataChunksError(CogneeValidationError): + def __init__(self, detail: str): + super().__init__( + message=f"Invalid data_chunks: {detail}", + name="InvalidDataChunksError", + status_code=status.HTTP_400_BAD_REQUEST, + ) + + +class InvalidGraphModelError(CogneeValidationError): + def __init__(self, got): + super().__init__( + message=f"graph_model must be a subclass of BaseModel (got {got}).", + name="InvalidGraphModelError", + status_code=status.HTTP_400_BAD_REQUEST, + ) + + +class InvalidOntologyAdapterError(CogneeConfigurationError): + def __init__(self, got): + super().__init__( + message=f"ontology_adapter lacks required interface (got {got}).", + name="InvalidOntologyAdapterError", + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + ) + + +class InvalidChunkGraphInputError(CogneeValidationError): + def __init__(self, detail: str): + super().__init__( + message=f"Invalid chunk inputs or LLM Chunkgraphs: {detail}", + name="InvalidChunkGraphInputError", + status_code=status.HTTP_400_BAD_REQUEST, + ) diff --git a/cognee/tasks/graph/extract_graph_from_data.py b/cognee/tasks/graph/extract_graph_from_data.py index aa415d504..019e9e4a1 100644 --- a/cognee/tasks/graph/extract_graph_from_data.py +++ b/cognee/tasks/graph/extract_graph_from_data.py @@ -12,6 +12,12 @@ from cognee.modules.graph.utils import ( ) from cognee.shared.data_models import KnowledgeGraph from cognee.infrastructure.llm.LLMGateway import LLMGateway +from cognee.tasks.graph.exceptions import ( + InvalidGraphModelError, + InvalidDataChunksError, + InvalidChunkGraphInputError, + InvalidOntologyAdapterError, +) async def integrate_chunk_graphs( @@ -21,6 +27,20 @@ async def integrate_chunk_graphs( ontology_adapter: OntologyResolver, ) -> List[DocumentChunk]: """Updates DocumentChunk objects, integrates data points and edges into databases.""" + + if not isinstance(data_chunks, list) or not isinstance(chunk_graphs, list): + raise InvalidChunkGraphInputError("data_chunks and chunk_graphs must be lists.") + if len(data_chunks) != len(chunk_graphs): + raise InvalidChunkGraphInputError( + f"length mismatch: {len(data_chunks)} chunks vs {len(chunk_graphs)} graphs." + ) + if not isinstance(graph_model, type) or not issubclass(graph_model, BaseModel): + raise InvalidGraphModelError(graph_model) + if ontology_adapter is None or not hasattr(ontology_adapter, "get_subgraph"): + raise InvalidOntologyAdapterError( + type(ontology_adapter).__name__ if ontology_adapter else "None" + ) + graph_engine = await get_graph_engine() if graph_model is not KnowledgeGraph: @@ -55,6 +75,14 @@ async def extract_graph_from_data( """ Extracts and integrates a knowledge graph from the text content of document chunks using a specified graph model. """ + + if not isinstance(data_chunks, list) or not data_chunks: + raise InvalidDataChunksError("must be a non-empty list of DocumentChunk.") + if not all(hasattr(c, "text") for c in data_chunks): + raise InvalidDataChunksError("each chunk must have a 'text' attribute") + if not isinstance(graph_model, type) or not issubclass(graph_model, BaseModel): + raise InvalidGraphModelError(graph_model) + chunk_graphs = await asyncio.gather( *[LLMGateway.extract_content_graph(chunk.text, graph_model) for chunk in data_chunks] ) diff --git a/cognee/tasks/ingestion/exceptions/__init__.py b/cognee/tasks/ingestion/exceptions/__init__.py new file mode 100644 index 000000000..f24792d1f --- /dev/null +++ b/cognee/tasks/ingestion/exceptions/__init__.py @@ -0,0 +1,8 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various application errors, +such as System, Validation, Configuration or TransientErrors +""" + +from .exceptions import S3FileSystemNotFoundError diff --git a/cognee/tasks/ingestion/exceptions/exceptions.py b/cognee/tasks/ingestion/exceptions/exceptions.py new file mode 100644 index 000000000..9d07b9ab3 --- /dev/null +++ b/cognee/tasks/ingestion/exceptions/exceptions.py @@ -0,0 +1,12 @@ +from cognee.exceptions import CogneeSystemError +from fastapi import status + + +class S3FileSystemNotFoundError(CogneeSystemError): + def __init__( + self, + name: str = "S3FileSystemNotFoundError", + status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR, + ): + message = "Could not find S3FileSystem." + super().__init__(message, name, status_code) diff --git a/cognee/tasks/ingestion/resolve_data_directories.py b/cognee/tasks/ingestion/resolve_data_directories.py index 0f2f2a85f..1d3124a0c 100644 --- a/cognee/tasks/ingestion/resolve_data_directories.py +++ b/cognee/tasks/ingestion/resolve_data_directories.py @@ -1,6 +1,9 @@ import os from urllib.parse import urlparse from typing import List, Union, BinaryIO + +from cognee.tasks.ingestion.exceptions import S3FileSystemNotFoundError +from cognee.exceptions import CogneeSystemError from cognee.infrastructure.files.storage.s3_config import get_s3_config @@ -54,6 +57,8 @@ async def resolve_data_directories( else: s3_files.append(key) resolved_data.extend(s3_files) + else: + raise S3FileSystemNotFoundError() elif os.path.isdir(item): # If it's a directory if include_subdirectories: diff --git a/cognee/tasks/storage/add_data_points.py b/cognee/tasks/storage/add_data_points.py index 28ec28a30..27054ca66 100644 --- a/cognee/tasks/storage/add_data_points.py +++ b/cognee/tasks/storage/add_data_points.py @@ -5,6 +5,10 @@ from cognee.infrastructure.databases.graph import get_graph_engine from cognee.modules.graph.utils import deduplicate_nodes_and_edges, get_graph_from_model from .index_data_points import index_data_points from .index_graph_edges import index_graph_edges +from cognee.tasks.storage.exceptions import ( + InvalidDataPointsInAddDataPointsError, +) + async def add_data_points( @@ -37,6 +41,13 @@ async def add_data_points( - Inserts nodes and edges into the graph engine. - Optionally updates the edge index via `index_graph_edges`. """ + +async def add_data_points(data_points: List[DataPoint]) -> List[DataPoint]: + if not isinstance(data_points, list): + raise InvalidDataPointsInAddDataPointsError("data_points must be a list.") + if not all(isinstance(dp, DataPoint) for dp in data_points): + raise InvalidDataPointsInAddDataPointsError("data_points: each item must be a DataPoint.") + nodes = [] edges = [] diff --git a/cognee/tasks/storage/exceptions/__init__.py b/cognee/tasks/storage/exceptions/__init__.py new file mode 100644 index 000000000..33dd215d6 --- /dev/null +++ b/cognee/tasks/storage/exceptions/__init__.py @@ -0,0 +1,9 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various data errors +""" + +from .exceptions import ( + InvalidDataPointsInAddDataPointsError, +) diff --git a/cognee/tasks/storage/exceptions/exceptions.py b/cognee/tasks/storage/exceptions/exceptions.py new file mode 100644 index 000000000..9b2de9efd --- /dev/null +++ b/cognee/tasks/storage/exceptions/exceptions.py @@ -0,0 +1,13 @@ +from cognee.exceptions import ( + CogneeValidationError, +) +from fastapi import status + + +class InvalidDataPointsInAddDataPointsError(CogneeValidationError): + def __init__(self, detail: str): + super().__init__( + message=f"Invalid data_points: {detail}", + name="InvalidDataPointsInAddDataPointsError", + status_code=status.HTTP_400_BAD_REQUEST, + ) diff --git a/cognee/tasks/storage/index_data_points.py b/cognee/tasks/storage/index_data_points.py index 51b6c2d6e..9c363c04c 100644 --- a/cognee/tasks/storage/index_data_points.py +++ b/cognee/tasks/storage/index_data_points.py @@ -1,6 +1,6 @@ from cognee.shared.logging_utils import get_logger -from cognee.infrastructure.databases.exceptions.EmbeddingException import EmbeddingException +from cognee.infrastructure.databases.exceptions import EmbeddingException from cognee.infrastructure.databases.vector import get_vector_engine from cognee.infrastructure.engine import DataPoint diff --git a/cognee/tasks/summarization/exceptions/__init__.py b/cognee/tasks/summarization/exceptions/__init__.py new file mode 100644 index 000000000..502f973e7 --- /dev/null +++ b/cognee/tasks/summarization/exceptions/__init__.py @@ -0,0 +1,9 @@ +""" +Custom exceptions for the Cognee API. + +This module defines a set of exceptions for handling various data errors +""" + +from .exceptions import ( + InvalidSummaryInputsError, +) diff --git a/cognee/tasks/summarization/exceptions/exceptions.py b/cognee/tasks/summarization/exceptions/exceptions.py new file mode 100644 index 000000000..9e8e7197e --- /dev/null +++ b/cognee/tasks/summarization/exceptions/exceptions.py @@ -0,0 +1,14 @@ +from cognee.exceptions import ( + CogneeValidationError, + CogneeConfigurationError, +) +from fastapi import status + + +class InvalidSummaryInputsError(CogneeValidationError): + def __init__(self, detail: str): + super().__init__( + message=f"Invalid summarize_text inputs: {detail}", + name="InvalidSummaryInputsError", + status_code=status.HTTP_400_BAD_REQUEST, + ) diff --git a/cognee/tasks/summarization/summarize_text.py b/cognee/tasks/summarization/summarize_text.py index ca6964f83..f6dcc54a2 100644 --- a/cognee/tasks/summarization/summarize_text.py +++ b/cognee/tasks/summarization/summarize_text.py @@ -3,10 +3,11 @@ from typing import Type from uuid import uuid5 from pydantic import BaseModel +from cognee.tasks.summarization.exceptions import InvalidSummaryInputsError from cognee.modules.chunking.models.DocumentChunk import DocumentChunk from cognee.infrastructure.llm.LLMGateway import LLMGateway from cognee.modules.cognify.config import get_cognify_config -from .models import TextSummary +from cognee.tasks.summarization.models import TextSummary async def summarize_text( @@ -35,6 +36,12 @@ async def summarize_text( A list of TextSummary objects, each containing the summary of a corresponding DocumentChunk. """ + + if not isinstance(data_chunks, list): + raise InvalidSummaryInputsError("data_chunks must be a list.") + if not all(hasattr(c, "text") for c in data_chunks): + raise InvalidSummaryInputsError("each DocumentChunk must have a 'text' attribute.") + if len(data_chunks) == 0: return data_chunks diff --git a/cognee/tests/tasks/descriptive_metrics/networkx_metrics_test.py b/cognee/tests/tasks/descriptive_metrics/networkx_metrics_test.py deleted file mode 100644 index 32e61b7d9..000000000 --- a/cognee/tests/tasks/descriptive_metrics/networkx_metrics_test.py +++ /dev/null @@ -1,7 +0,0 @@ -from cognee.tests.tasks.descriptive_metrics.metrics_test_utils import assert_metrics -import asyncio - - -if __name__ == "__main__": - asyncio.run(assert_metrics(provider="networkx", include_optional=False)) - asyncio.run(assert_metrics(provider="networkx", include_optional=True)) diff --git a/cognee/tests/test_delete_by_id.py b/cognee/tests/test_delete_by_id.py index 36e0a57f5..8fc5395eb 100644 --- a/cognee/tests/test_delete_by_id.py +++ b/cognee/tests/test_delete_by_id.py @@ -7,7 +7,7 @@ from cognee.shared.logging_utils import get_logger from cognee.modules.users.methods import get_default_user, create_user from cognee.modules.users.permissions.methods import authorized_give_permission_on_datasets from cognee.modules.data.methods import get_dataset_data, get_datasets_by_name -from cognee.api.v1.delete.exceptions import DocumentNotFoundError, DatasetNotFoundError +from cognee.api.v1.exceptions import DocumentNotFoundError, DatasetNotFoundError logger = get_logger() diff --git a/cognee/tests/unit/modules/graph/cognee_graph_elements_test.py b/cognee/tests/unit/modules/graph/cognee_graph_elements_test.py index 000856b12..37ba113b5 100644 --- a/cognee/tests/unit/modules/graph/cognee_graph_elements_test.py +++ b/cognee/tests/unit/modules/graph/cognee_graph_elements_test.py @@ -1,8 +1,8 @@ import numpy as np import pytest -from cognee.exceptions import InvalidValueError from cognee.modules.graph.cognee_graph.CogneeGraphElements import Edge, Node +from cognee.modules.graph.exceptions import InvalidDimensionsError, DimensionOutOfRangeError def test_node_initialization(): @@ -16,7 +16,7 @@ def test_node_initialization(): def test_node_invalid_dimension(): """Test that initializing a Node with a non-positive dimension raises an error.""" - with pytest.raises(InvalidValueError, match="Dimension must be a positive integer"): + with pytest.raises(InvalidDimensionsError): Node("node1", dimension=0) @@ -69,7 +69,7 @@ def test_is_node_alive_in_dimension(): def test_node_alive_invalid_dimension(): """Test that checking alive status with an invalid dimension raises an error.""" node = Node("node1", dimension=1) - with pytest.raises(InvalidValueError, match="Dimension 1 is out of range"): + with pytest.raises(DimensionOutOfRangeError): node.is_node_alive_in_dimension(1) @@ -106,7 +106,7 @@ def test_edge_invalid_dimension(): """Test that initializing an Edge with a non-positive dimension raises an error.""" node1 = Node("node1") node2 = Node("node2") - with pytest.raises(InvalidValueError, match="Dimensions must be a positive integer."): + with pytest.raises(InvalidDimensionsError): Edge(node1, node2, dimension=0) @@ -125,7 +125,7 @@ def test_edge_alive_invalid_dimension(): node1 = Node("node1") node2 = Node("node2") edge = Edge(node1, node2, dimension=1) - with pytest.raises(InvalidValueError, match="Dimension 1 is out of range"): + with pytest.raises(DimensionOutOfRangeError): edge.is_edge_alive_in_dimension(1) diff --git a/cognee/tests/unit/modules/search/search_methods_test.py b/cognee/tests/unit/modules/search/search_methods_test.py index 14712f6d2..8e9afff1c 100644 --- a/cognee/tests/unit/modules/search/search_methods_test.py +++ b/cognee/tests/unit/modules/search/search_methods_test.py @@ -5,7 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, patch import pytest from pylint.checkers.utils import node_type -from cognee.exceptions import InvalidValueError +from cognee.modules.search.exceptions import UnsupportedSearchTypeError from cognee.modules.search.methods.search import search, specific_search from cognee.modules.search.types import SearchType from cognee.modules.users.models import User @@ -217,7 +217,7 @@ async def test_specific_search_invalid_type(mock_user): query_type = "INVALID_TYPE" # Not a valid SearchType # Execute and verify - with pytest.raises(InvalidValueError) as excinfo: + with pytest.raises(UnsupportedSearchTypeError) as excinfo: await specific_search(query_type, query, mock_user) assert "Unsupported search type" in str(excinfo.value) diff --git a/evals/old/comparative_eval/helpers/modal_evaluate_answers.py b/evals/old/comparative_eval/helpers/modal_evaluate_answers.py index fd00db50a..92c0ac1c9 100644 --- a/evals/old/comparative_eval/helpers/modal_evaluate_answers.py +++ b/evals/old/comparative_eval/helpers/modal_evaluate_answers.py @@ -121,7 +121,7 @@ async def main(): evaluation_metrics=["correctness", "EM", "f1"], calculate_metrics=True, dashboard=True, - deepeval_model="gpt-4o-mini", + deepeval_model="gpt-5-mini", ).to_dict() logger.info(f"Starting evaluation of {len(json_file_paths)} JSON files") diff --git a/evals/old/falkor_01042025/hotpot_qa_falkor_graphrag_sdk.py b/evals/old/falkor_01042025/hotpot_qa_falkor_graphrag_sdk.py index f7cd634f0..506eb2b62 100644 --- a/evals/old/falkor_01042025/hotpot_qa_falkor_graphrag_sdk.py +++ b/evals/old/falkor_01042025/hotpot_qa_falkor_graphrag_sdk.py @@ -35,7 +35,7 @@ def _get_sources_from_corpus_json(corpus_file, limit=None, batch_size=None): def create_ontology( corpus_file="hotpot_50_corpus.json", output_file="hotpot_qa_ontology.json", - model_name="gpt-4o-mini", + model_name="gpt-5-mini", ): """Creates ontology from corpus data.""" print(f"Loading corpus from {corpus_file}...") @@ -67,7 +67,7 @@ def create_knowledge_graph( ontology_file="hotpot_qa_ontology.json", corpus_file="hotpot_50_corpus.json", kg_name="hotpot_qa_kg", - model_name="gpt-4o-mini", + model_name="gpt-5-mini", host="127.0.0.1", port=6379, username=None, @@ -208,11 +208,11 @@ if __name__ == "__main__": # Ontology parameters corpus_file: str = "hotpot_50_corpus.json" ontology_file: str = "hotpot_qa_ontology.json" - ontology_model: str = "gpt-4o-mini" + ontology_model: str = "gpt-5-mini" # Knowledge graph parameters kg_name: str = "hotpot_qa" - kg_model: str = "gpt-4o-mini" + kg_model: str = "gpt-5-mini" kg_host: str = "127.0.0.1" kg_port: int = 6379 kg_recreate: bool = False diff --git a/evals/old/graphiti_01042025/hotpot_qa_graphiti.py b/evals/old/graphiti_01042025/hotpot_qa_graphiti.py index 07d3be92b..73b29c7fb 100644 --- a/evals/old/graphiti_01042025/hotpot_qa_graphiti.py +++ b/evals/old/graphiti_01042025/hotpot_qa_graphiti.py @@ -50,7 +50,7 @@ async def search_graphiti(query: str, graphiti_client: Graphiti, num_results: in async def answer_questions( graphiti: Graphiti, - model_name: str = "gpt-4o-mini", + model_name: str = "gpt-5-mini", qa_pairs_file: str = "hotpot_50_qa_pairs.json", print_results: bool = True, output_file: str = None, @@ -173,7 +173,7 @@ if __name__ == "__main__": corpus_limit: int = None # Limit number of documents to process # Model parameters - model_name: str = "gpt-4o-mini" + model_name: str = "gpt-5-mini" # QA parameters qa_pairs_file: str = "hotpot_50_qa_pairs.json" diff --git a/evals/old/mem0_01042025/hotpot_qa_mem0.py b/evals/old/mem0_01042025/hotpot_qa_mem0.py index 222d4e005..7eb078dcf 100644 --- a/evals/old/mem0_01042025/hotpot_qa_mem0.py +++ b/evals/old/mem0_01042025/hotpot_qa_mem0.py @@ -41,7 +41,7 @@ def load_corpus_to_memory( def answer_questions( memory: Memory, openai_client: OpenAI, - model_name: str = "gpt-4o-mini", + model_name: str = "gpt-5-mini", user_id: str = "hotpot_qa_user", qa_pairs_file: str = "hotpot_50_qa_pairs.json", print_results: bool = True, @@ -150,7 +150,7 @@ if __name__ == "__main__": user_id: str = "hotpot_qa_user" # Model parameters - model_name: str = "gpt-4o-mini" + model_name: str = "gpt-5-mini" # QA parameters qa_pairs_file: str = "hotpot_50_qa_pairs.json" diff --git a/evals/src/helpers/modal_evaluate_answers.py b/evals/src/helpers/modal_evaluate_answers.py index fd00db50a..92c0ac1c9 100644 --- a/evals/src/helpers/modal_evaluate_answers.py +++ b/evals/src/helpers/modal_evaluate_answers.py @@ -121,7 +121,7 @@ async def main(): evaluation_metrics=["correctness", "EM", "f1"], calculate_metrics=True, dashboard=True, - deepeval_model="gpt-4o-mini", + deepeval_model="gpt-5-mini", ).to_dict() logger.info(f"Starting evaluation of {len(json_file_paths)} JSON files") diff --git a/evals/src/qa/qa_benchmark_graphiti.py b/evals/src/qa/qa_benchmark_graphiti.py index 20912e274..474a756a0 100644 --- a/evals/src/qa/qa_benchmark_graphiti.py +++ b/evals/src/qa/qa_benchmark_graphiti.py @@ -26,7 +26,7 @@ class GraphitiConfig(QABenchmarkConfig): db_password: str = os.getenv("NEO4J_PASSWORD") # Model parameters - # model_name: str = "gpt-4o-mini" + # model_name: str = "gpt-5-mini" model_name: str = "gpt-4o" # Default results file @@ -43,7 +43,7 @@ class QABenchmarkGraphiti(QABenchmarkRAG): async def initialize_rag(self) -> Any: """Initialize Graphiti and LLM.""" - llm_config = LLMConfig(model=self.config.model_name, max_tokens=65536) + llm_config = LLMConfig(model=self.config.model_name, max_completion_tokens=65536) llm_client = OpenAIClient(config=llm_config) graphiti = Graphiti( self.config.db_url, diff --git a/evals/src/qa/qa_benchmark_mem0.py b/evals/src/qa/qa_benchmark_mem0.py index 50816bd2f..e2595398c 100644 --- a/evals/src/qa/qa_benchmark_mem0.py +++ b/evals/src/qa/qa_benchmark_mem0.py @@ -19,7 +19,7 @@ class Mem0Config(QABenchmarkConfig): user_id: str = "hotpot_qa_user" # Model parameters - # model_name: str = "gpt-4o-mini" + # model_name: str = "gpt-5-mini" model_name: str = "gpt-4o" # Default results file diff --git a/examples/python/cognee_simple_document_demo.py b/examples/python/cognee_simple_document_demo.py index 621d743c3..b82b7e4d3 100644 --- a/examples/python/cognee_simple_document_demo.py +++ b/examples/python/cognee_simple_document_demo.py @@ -3,7 +3,7 @@ import cognee import os -# By default cognee uses OpenAI's gpt-4o-mini LLM model +# By default cognee uses OpenAI's gpt-5-mini LLM model # Provide your OpenAI LLM API KEY os.environ["LLM_API_KEY"] = "" diff --git a/notebooks/cognee_simple_demo.ipynb b/notebooks/cognee_simple_demo.ipynb index 432ef9eb3..248bbc5b7 100644 --- a/notebooks/cognee_simple_demo.ipynb +++ b/notebooks/cognee_simple_demo.ipynb @@ -29,7 +29,7 @@ "id": "f51e92e9fdcf77b7", "metadata": {}, "source": [ - " By default cognee uses OpenAI's gpt-4o-mini LLM model.\n", + " By default cognee uses OpenAI's gpt-5-mini LLM model.\n", "\n", " Provide your OpenAI LLM API KEY in the step bellow. Here's a guide on how to get your [OpenAI API key](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key)." ] @@ -208,11 +208,11 @@ "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:16:56 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:16:56 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:16:57 - LiteLLM:INFO\u001B[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001B[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001B[0m\u001B[92m20:16:59 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001B[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001B[0m\u001B[92m20:16:59 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001B[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001B[0m" + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001B[0m\u001B[92m20:16:59 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001B[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001B[0m\u001B[92m20:16:59 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001B[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001B[0m" ] }, { @@ -264,11 +264,11 @@ "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:17:03 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:17:03 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:17:03 - LiteLLM:INFO\u001B[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001B[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001B[0m\u001B[92m20:17:05 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001B[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001B[0m\u001B[92m20:17:05 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001B[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001B[0m" + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001B[0m\u001B[92m20:17:05 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001B[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001B[0m\u001B[92m20:17:05 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001B[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001B[0m" ] }, { @@ -320,11 +320,11 @@ "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:17:06 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:17:07 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001B[1mselected model name for cost calculation: openai/text-embedding-3-large\u001B[0m\u001B[92m20:17:07 - LiteLLM:INFO\u001B[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001B[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001B[0m\u001B[92m20:17:08 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001B[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001B[0m\u001B[92m20:17:08 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001B[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001B[0m" + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001B[0m\u001B[92m20:17:08 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001B[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001B[0m\u001B[92m20:17:08 - LiteLLM:INFO\u001B[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001B[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001B[0m" ] }, { diff --git a/notebooks/ontology_demo.ipynb b/notebooks/ontology_demo.ipynb index 6bfcc9db1..d227e634a 100644 --- a/notebooks/ontology_demo.ipynb +++ b/notebooks/ontology_demo.ipynb @@ -192,12 +192,12 @@ "text": [ "\n", "\u001b[1mLangfuse client is disabled since no public_key was provided as a parameter or environment variable 'LANGFUSE_PUBLIC_KEY'. See our docs: https://langfuse.com/docs/sdk/python/low-level-sdk#initialize-client\u001b[0m\u001b[92m20:23:36 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:23:37 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\n", - "\u001b[1mEmbeddingRateLimiter initialized: enabled=False, requests_limit=60, interval_seconds=60\u001b[0m\u001b[92m20:23:37 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:37 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:23:37 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\n", + "\u001b[1mEmbeddingRateLimiter initialized: enabled=False, requests_limit=60, interval_seconds=60\u001b[0m\u001b[92m20:23:37 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:37 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\n", "\u001b[2m2025-06-18T18:23:38.051934\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mPipeline run started: `2bec40b8-e3d1-54ab-bfc5-eb5d4695ce63`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks(tasks: [Task], data)\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:23:38.052396\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `resolve_data_directories`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\n", @@ -225,36 +225,36 @@ "\u001b[2m2025-06-18T18:23:38.513906\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `check_permissions_on_dataset`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:23:38.517146\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mAsync Generator task started: `extract_chunks_from_documents`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:23:38.799196\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `extract_graph_from_data`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:23:38 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:23:49 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:49 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:56 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:56 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:57 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:57 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:59 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:23:59 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:23:49 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:49 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:56 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:56 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:57 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:57 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:59 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:23:59 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\n", "\u001b[2m2025-06-18T18:23:59.600042\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mNo close match found for 'concept' in category 'classes'\u001b[0m [\u001b[0m\u001b[1m\u001b[34mOntologyAdapter\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:23:59.600534\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mNo close match found for 'coffee consumption' in category 'individuals'\u001b[0m [\u001b[0m\u001b[1m\u001b[34mOntologyAdapter\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:23:59.600963\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mNo close match found for 'cardiovascular health' in category 'individuals'\u001b[0m [\u001b[0m\u001b[1m\u001b[34mOntologyAdapter\u001b[0m]\u001b[0m\n", @@ -336,36 +336,36 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\n", "\u001b[2m2025-06-18T18:24:04.634561\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `summarize_text`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:04 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:10 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\n", "\u001b[2m2025-06-18T18:24:10.329954\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `add_data_points`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\u001b[92m20:24:11 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:12 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:13 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -403,11 +403,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:16 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:17 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:19 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:19 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:19 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:19 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:19 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:19 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:20 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:20 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:20 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -431,11 +431,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:21 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:21 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:21 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:24 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:24 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:24 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:24 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:24 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -459,11 +459,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:25 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:26 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:26 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:29 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:29 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:29 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:29 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -487,11 +487,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:31 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:31 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m" + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m" ] }, { @@ -580,36 +580,36 @@ "\u001b[2m2025-06-18T18:24:33.516136\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `check_permissions_on_dataset`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:24:33.519493\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mAsync Generator task started: `extract_chunks_from_documents`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:24:33.807889\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `extract_graph_from_data`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:33 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:42 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:42 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:43 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:43 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:46 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:46 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:52 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:52 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:42 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:42 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:43 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:43 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:46 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:46 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:52 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:52 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:24:53 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\n", "\u001b[2m2025-06-18T18:24:53.860301\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mNo close match found for 'person' in category 'classes'\u001b[0m [\u001b[0m\u001b[1m\u001b[34mOntologyAdapter\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:24:53.860877\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mNo close match found for 'laura torres-collado' in category 'individuals'\u001b[0m [\u001b[0m\u001b[1m\u001b[34mOntologyAdapter\u001b[0m]\u001b[0m\n", "\u001b[2m2025-06-18T18:24:53.861358\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mNo close match found for 'laura maría compañ-gabucio' in category 'individuals'\u001b[0m [\u001b[0m\u001b[1m\u001b[34mOntologyAdapter\u001b[0m]\u001b[0m\n", @@ -723,36 +723,36 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\n", "\u001b[2m2025-06-18T18:24:58.280117\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `summarize_text`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:24:58 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:02 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:02 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:01 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:02 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:02 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:05 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:06 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\n", "\u001b[2m2025-06-18T18:25:06.543776\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCoroutine task started: `add_data_points`\u001b[0m [\u001b[0m\u001b[1m\u001b[34mrun_tasks_base\u001b[0m]\u001b[0m\u001b[92m20:25:07 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:08 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:09 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -790,11 +790,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:14 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:15 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:15 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:17 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -818,11 +818,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:20 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:20 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:20 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:25:22 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:22 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:25:22 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:22 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:23 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -846,11 +846,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:24 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:24 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:24 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:27 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:28 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", @@ -874,11 +874,11 @@ "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:28 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:28 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/text-embedding-3-large\n", "\u001b[1mselected model name for cost calculation: openai/text-embedding-3-large\u001b[0m\u001b[92m20:25:28 - LiteLLM:INFO\u001b[0m: utils.py:3101 - \n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\n", + "LiteLLM completion() model= gpt-5-mini; provider = openai\n", "\u001b[1m\n", - "LiteLLM completion() model= gpt-4o-mini; provider = openai\u001b[0m\u001b[92m20:25:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m\u001b[92m20:25:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\n", - "\u001b[1mselected model name for cost calculation: openai/gpt-4o-mini-2024-07-18\u001b[0m" + "LiteLLM completion() model= gpt-5-mini; provider = openai\u001b[0m\u001b[92m20:25:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m\u001b[92m20:25:30 - LiteLLM:INFO\u001b[0m: cost_calculator.py:655 - selected model name for cost calculation: openai/gpt-5-mini-2024-07-18\n", + "\u001b[1mselected model name for cost calculation: openai/gpt-5-mini-2024-07-18\u001b[0m" ] }, { diff --git a/poetry.lock b/poetry.lock index 0e2faaa88..2a618cb3f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,15 +1,15 @@ -# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. [[package]] name = "aiobotocore" -version = "2.24.0" +version = "2.24.1" description = "Async client for aws services using botocore and aiohttp" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "aiobotocore-2.24.0-py3-none-any.whl", hash = "sha256:72bb1f8eb1b962779a95e1bcc9cf35bc33196ad763b622a40ae7fa9d2e95c87c"}, - {file = "aiobotocore-2.24.0.tar.gz", hash = "sha256:b32c0c45d38c22a18ce395a0b5448606c5260603296a152895b5bdb40ab3139d"}, + {file = "aiobotocore-2.24.1-py3-none-any.whl", hash = "sha256:557922823455ca65bbd065b363b54846f16b9c4b6bd0b61ecdfa01ca13a04531"}, + {file = "aiobotocore-2.24.1.tar.gz", hash = "sha256:59237f1b2d4ff619f9a9e78360b691d59b92fdd4d03d054dbd2eeff8ada5667e"}, ] [package.dependencies] @@ -251,7 +251,7 @@ description = "The official Python library for the anthropic API" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"anthropic\"" +markers = "extra == \"anthropic\" or extra == \"deepeval\"" files = [ {file = "anthropic-0.26.1-py3-none-any.whl", hash = "sha256:2812b9b250b551ed8a1f0a7e6ae3f005654098994f45ebca5b5808bd154c9628"}, {file = "anthropic-0.26.1.tar.gz", hash = "sha256:26680ff781a6f678a30a1dccd0743631e602b23a47719439ffdef5335fa167d8"}, @@ -435,27 +435,14 @@ files = [ [package.dependencies] typing_extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.7" -groups = ["main"] -markers = "python_version == \"3.10\"" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] - [[package]] name = "async-timeout" version = "5.0.1" description = "Timeout context manager for asyncio programs" -optional = true +optional = false python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"falkordb\" and python_full_version < \"3.11.3\" and python_version == \"3.11\"" +markers = "extra == \"falkordb\" and python_full_version < \"3.11.3\" or python_version == \"3.10\"" files = [ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, @@ -577,23 +564,6 @@ files = [ {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] -[[package]] -name = "backports-tarfile" -version = "1.2.0" -description = "Backport of CPython tarfile module" -optional = true -python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"deepeval\" and python_version < \"3.12\"" -files = [ - {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, - {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] - [[package]] name = "backrefs" version = "5.9" @@ -640,7 +610,7 @@ description = "A prompt programming language" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\"" +markers = "extra == \"llama-index\"" files = [ {file = "banks-2.2.0-py3-none-any.whl", hash = "sha256:963cd5c85a587b122abde4f4064078def35c50c688c1b9d36f43c92503854e7d"}, {file = "banks-2.2.0.tar.gz", hash = "sha256:d1446280ce6e00301e3e952dd754fd8cee23ff277d29ed160994a84d0d7ffe62"}, @@ -728,7 +698,7 @@ description = "Screen-scraping library" optional = true python-versions = ">=3.7.0" groups = ["main"] -markers = "extra == \"notebook\" or extra == \"dev\" or extra == \"deepeval\" or extra == \"docs\" or extra == \"evals\"" +markers = "extra == \"notebook\" or extra == \"dev\" or extra == \"docs\" or extra == \"evals\"" files = [ {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, @@ -745,54 +715,6 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "black" -version = "25.1.0" -description = "The uncompromising code formatter." -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, - {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, - {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, - {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, - {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, - {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, - {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, - {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, - {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, - {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, - {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, - {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, - {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, - {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, - {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, - {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, - {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, - {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, - {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, - {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, - {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, - {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.10)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "bleach" version = "6.2.0" @@ -860,7 +782,7 @@ description = "Extensible memoizing collections and decorators" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"gemini\"" +markers = "extra == \"gemini\" or extra == \"deepeval\"" files = [ {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, @@ -1210,7 +1132,7 @@ description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["main"] -markers = "(platform_system == \"Windows\" or sys_platform == \"win32\" or extra == \"llama-index\" or extra == \"deepeval\" or extra == \"dev\") and (platform_system == \"Windows\" or python_version <= \"3.12\" or extra == \"notebook\" or extra == \"dev\" or extra == \"llama-index\" or extra == \"deepeval\" or extra == \"chromadb\") and (platform_system == \"Windows\" or extra == \"notebook\" or extra == \"dev\" or extra == \"llama-index\" or extra == \"deepeval\" or extra == \"chromadb\" or extra == \"codegraph\")" +markers = "(platform_system == \"Windows\" or sys_platform == \"win32\" or extra == \"llama-index\" or extra == \"dev\") and (platform_system == \"Windows\" or python_version <= \"3.12\" or extra == \"notebook\" or extra == \"dev\" or extra == \"llama-index\" or extra == \"deepeval\" or extra == \"chromadb\") and (platform_system == \"Windows\" or extra == \"notebook\" or extra == \"dev\" or extra == \"llama-index\" or extra == \"deepeval\" or extra == \"chromadb\" or extra == \"codegraph\")" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1423,101 +1345,101 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.10.3" +version = "7.10.4" description = "Code coverage measurement for Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"deepeval\" or extra == \"dev\"" +markers = "extra == \"dev\"" files = [ - {file = "coverage-7.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53808194afdf948c462215e9403cca27a81cf150d2f9b386aee4dab614ae2ffe"}, - {file = "coverage-7.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4d1b837d1abf72187a61645dbf799e0d7705aa9232924946e1f57eb09a3bf00"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2a90dd4505d3cc68b847ab10c5ee81822a968b5191664e8a0801778fa60459fa"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d52989685ff5bf909c430e6d7f6550937bc6d6f3e6ecb303c97a86100efd4596"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdb558a1d97345bde3a9f4d3e8d11c9e5611f748646e9bb61d7d612a796671b5"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c9e6331a8f09cb1fc8bda032752af03c366870b48cce908875ba2620d20d0ad4"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:992f48bf35b720e174e7fae916d943599f1a66501a2710d06c5f8104e0756ee1"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c5595fc4ad6a39312c786ec3326d7322d0cf10e3ac6a6df70809910026d67cfb"}, - {file = "coverage-7.10.3-cp310-cp310-win32.whl", hash = "sha256:9e92fa1f2bd5a57df9d00cf9ce1eb4ef6fccca4ceabec1c984837de55329db34"}, - {file = "coverage-7.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:b96524d6e4a3ce6a75c56bb15dbd08023b0ae2289c254e15b9fbdddf0c577416"}, - {file = "coverage-7.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2ff2e2afdf0d51b9b8301e542d9c21a8d084fd23d4c8ea2b3a1b3c96f5f7397"}, - {file = "coverage-7.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18ecc5d1b9a8c570f6c9b808fa9a2b16836b3dd5414a6d467ae942208b095f85"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1af4461b25fe92889590d438905e1fc79a95680ec2a1ff69a591bb3fdb6c7157"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3966bc9a76b09a40dc6063c8b10375e827ea5dfcaffae402dd65953bef4cba54"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:205a95b87ef4eb303b7bc5118b47b6b6604a644bcbdb33c336a41cfc0a08c06a"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b3801b79fb2ad61e3c7e2554bab754fc5f105626056980a2b9cf3aef4f13f84"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0dc69c60224cda33d384572da945759756e3f06b9cdac27f302f53961e63160"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a83d4f134bab2c7ff758e6bb1541dd72b54ba295ced6a63d93efc2e20cb9b124"}, - {file = "coverage-7.10.3-cp311-cp311-win32.whl", hash = "sha256:54e409dd64e5302b2a8fdf44ec1c26f47abd1f45a2dcf67bd161873ee05a59b8"}, - {file = "coverage-7.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:30c601610a9b23807c5e9e2e442054b795953ab85d525c3de1b1b27cebeb2117"}, - {file = "coverage-7.10.3-cp311-cp311-win_arm64.whl", hash = "sha256:dabe662312a97958e932dee056f2659051d822552c0b866823e8ba1c2fe64770"}, - {file = "coverage-7.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:449c1e2d3a84d18bd204258a897a87bc57380072eb2aded6a5b5226046207b42"}, - {file = "coverage-7.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d4f9ce50b9261ad196dc2b2e9f1fbbee21651b54c3097a25ad783679fd18294"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4dd4564207b160d0d45c36a10bc0a3d12563028e8b48cd6459ea322302a156d7"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ca3c9530ee072b7cb6a6ea7b640bcdff0ad3b334ae9687e521e59f79b1d0437"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b6df359e59fa243c9925ae6507e27f29c46698359f45e568fd51b9315dbbe587"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a181e4c2c896c2ff64c6312db3bda38e9ade2e1aa67f86a5628ae85873786cea"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a374d4e923814e8b72b205ef6b3d3a647bb50e66f3558582eda074c976923613"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daeefff05993e5e8c6e7499a8508e7bd94502b6b9a9159c84fd1fe6bce3151cb"}, - {file = "coverage-7.10.3-cp312-cp312-win32.whl", hash = "sha256:187ecdcac21f9636d570e419773df7bd2fda2e7fa040f812e7f95d0bddf5f79a"}, - {file = "coverage-7.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:4a50ad2524ee7e4c2a95e60d2b0b83283bdfc745fe82359d567e4f15d3823eb5"}, - {file = "coverage-7.10.3-cp312-cp312-win_arm64.whl", hash = "sha256:c112f04e075d3495fa3ed2200f71317da99608cbb2e9345bdb6de8819fc30571"}, - {file = "coverage-7.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b99e87304ffe0eb97c5308447328a584258951853807afdc58b16143a530518a"}, - {file = "coverage-7.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4af09c7574d09afbc1ea7da9dcea23665c01f3bc1b1feb061dac135f98ffc53a"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:488e9b50dc5d2aa9521053cfa706209e5acf5289e81edc28291a24f4e4488f46"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:913ceddb4289cbba3a310704a424e3fb7aac2bc0c3a23ea473193cb290cf17d4"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b1f91cbc78c7112ab84ed2a8defbccd90f888fcae40a97ddd6466b0bec6ae8a"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0bac054d45af7cd938834b43a9878b36ea92781bcb009eab040a5b09e9927e3"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fe72cbdd12d9e0f4aca873fa6d755e103888a7f9085e4a62d282d9d5b9f7928c"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c1e2e927ab3eadd7c244023927d646e4c15c65bb2ac7ae3c3e9537c013700d21"}, - {file = "coverage-7.10.3-cp313-cp313-win32.whl", hash = "sha256:24d0c13de473b04920ddd6e5da3c08831b1170b8f3b17461d7429b61cad59ae0"}, - {file = "coverage-7.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:3564aae76bce4b96e2345cf53b4c87e938c4985424a9be6a66ee902626edec4c"}, - {file = "coverage-7.10.3-cp313-cp313-win_arm64.whl", hash = "sha256:f35580f19f297455f44afcd773c9c7a058e52eb6eb170aa31222e635f2e38b87"}, - {file = "coverage-7.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07009152f497a0464ffdf2634586787aea0e69ddd023eafb23fc38267db94b84"}, - {file = "coverage-7.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd2ba5f0c7e7e8cc418be2f0c14c4d9e3f08b8fb8e4c0f83c2fe87d03eb655e"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1ae22b97003c74186e034a93e4f946c75fad8c0ce8d92fbbc168b5e15ee2841f"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb329f1046888a36b1dc35504d3029e1dd5afe2196d94315d18c45ee380f67d5"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce01048199a91f07f96ca3074b0c14021f4fe7ffd29a3e6a188ac60a5c3a4af8"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08b989a06eb9dfacf96d42b7fb4c9a22bafa370d245dc22fa839f2168c6f9fa1"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:669fe0d4e69c575c52148511029b722ba8d26e8a3129840c2ce0522e1452b256"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3262d19092771c83f3413831d9904b1ccc5f98da5de4ffa4ad67f5b20c7aaf7b"}, - {file = "coverage-7.10.3-cp313-cp313t-win32.whl", hash = "sha256:cc0ee4b2ccd42cab7ee6be46d8a67d230cb33a0a7cd47a58b587a7063b6c6b0e"}, - {file = "coverage-7.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:03db599f213341e2960430984e04cf35fb179724e052a3ee627a068653cf4a7c"}, - {file = "coverage-7.10.3-cp313-cp313t-win_arm64.whl", hash = "sha256:46eae7893ba65f53c71284585a262f083ef71594f05ec5c85baf79c402369098"}, - {file = "coverage-7.10.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:bce8b8180912914032785850d8f3aacb25ec1810f5f54afc4a8b114e7a9b55de"}, - {file = "coverage-7.10.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07790b4b37d56608536f7c1079bd1aa511567ac2966d33d5cec9cf520c50a7c8"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e79367ef2cd9166acedcbf136a458dfe9a4a2dd4d1ee95738fb2ee581c56f667"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:419d2a0f769f26cb1d05e9ccbc5eab4cb5d70231604d47150867c07822acbdf4"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee221cf244757cdc2ac882e3062ab414b8464ad9c884c21e878517ea64b3fa26"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c2079d8cdd6f7373d628e14b3357f24d1db02c9dc22e6a007418ca7a2be0435a"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bd8df1f83c0703fa3ca781b02d36f9ec67ad9cb725b18d486405924f5e4270bd"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6b4e25e0fa335c8aa26e42a52053f3786a61cc7622b4d54ae2dad994aa754fec"}, - {file = "coverage-7.10.3-cp314-cp314-win32.whl", hash = "sha256:d7c3d02c2866deb217dce664c71787f4b25420ea3eaf87056f44fb364a3528f5"}, - {file = "coverage-7.10.3-cp314-cp314-win_amd64.whl", hash = "sha256:9c8916d44d9e0fe6cdb2227dc6b0edd8bc6c8ef13438bbbf69af7482d9bb9833"}, - {file = "coverage-7.10.3-cp314-cp314-win_arm64.whl", hash = "sha256:1007d6a2b3cf197c57105cc1ba390d9ff7f0bee215ced4dea530181e49c65ab4"}, - {file = "coverage-7.10.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ebc8791d346410d096818788877d675ca55c91db87d60e8f477bd41c6970ffc6"}, - {file = "coverage-7.10.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f4e4d8e75f6fd3c6940ebeed29e3d9d632e1f18f6fb65d33086d99d4d073241"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:24581ed69f132b6225a31b0228ae4885731cddc966f8a33fe5987288bdbbbd5e"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec151569ddfccbf71bac8c422dce15e176167385a00cd86e887f9a80035ce8a5"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2ae8e7c56290b908ee817200c0b65929b8050bc28530b131fe7c6dfee3e7d86b"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb742309766d7e48e9eb4dc34bc95a424707bc6140c0e7d9726e794f11b92a0"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c65e2a5b32fbe1e499f1036efa6eb9cb4ea2bf6f7168d0e7a5852f3024f471b1"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d48d2cb07d50f12f4f18d2bb75d9d19e3506c26d96fffabf56d22936e5ed8f7c"}, - {file = "coverage-7.10.3-cp314-cp314t-win32.whl", hash = "sha256:dec0d9bc15ee305e09fe2cd1911d3f0371262d3cfdae05d79515d8cb712b4869"}, - {file = "coverage-7.10.3-cp314-cp314t-win_amd64.whl", hash = "sha256:424ea93a323aa0f7f01174308ea78bde885c3089ec1bef7143a6d93c3e24ef64"}, - {file = "coverage-7.10.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f5983c132a62d93d71c9ef896a0b9bf6e6828d8d2ea32611f58684fba60bba35"}, - {file = "coverage-7.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da749daa7e141985487e1ff90a68315b0845930ed53dc397f4ae8f8bab25b551"}, - {file = "coverage-7.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3126fb6a47d287f461d9b1aa5d1a8c97034d1dffb4f452f2cf211289dae74ef"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3da794db13cc27ca40e1ec8127945b97fab78ba548040047d54e7bfa6d442dca"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4e27bebbd184ef8d1c1e092b74a2b7109dcbe2618dce6e96b1776d53b14b3fe8"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8fd4ee2580b9fefbd301b4f8f85b62ac90d1e848bea54f89a5748cf132782118"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6999920bdd73259ce11cabfc1307484f071ecc6abdb2ca58d98facbcefc70f16"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3623f929db885fab100cb88220a5b193321ed37e03af719efdbaf5d10b6e227"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:25b902c5e15dea056485d782e420bb84621cc08ee75d5131ecb3dbef8bd1365f"}, - {file = "coverage-7.10.3-cp39-cp39-win32.whl", hash = "sha256:f930a4d92b004b643183451fe9c8fe398ccf866ed37d172ebaccfd443a097f61"}, - {file = "coverage-7.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:08e638a93c8acba13c7842953f92a33d52d73e410329acd472280d2a21a6c0e1"}, - {file = "coverage-7.10.3-py3-none-any.whl", hash = "sha256:416a8d74dc0adfd33944ba2f405897bab87b7e9e84a391e09d241956bd953ce1"}, - {file = "coverage-7.10.3.tar.gz", hash = "sha256:812ba9250532e4a823b070b0420a36499859542335af3dca8f47fc6aa1a05619"}, + {file = "coverage-7.10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d92d6edb0ccafd20c6fbf9891ca720b39c2a6a4b4a6f9cf323ca2c986f33e475"}, + {file = "coverage-7.10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7202da14dc0236884fcc45665ffb2d79d4991a53fbdf152ab22f69f70923cc22"}, + {file = "coverage-7.10.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ada418633ae24ec8d0fcad5efe6fc7aa3c62497c6ed86589e57844ad04365674"}, + {file = "coverage-7.10.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b828e33eca6c3322adda3b5884456f98c435182a44917ded05005adfa1415500"}, + {file = "coverage-7.10.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:802793ba397afcfdbe9f91f89d65ae88b958d95edc8caf948e1f47d8b6b2b606"}, + {file = "coverage-7.10.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d0b23512338c54101d3bf7a1ab107d9d75abda1d5f69bc0887fd079253e4c27e"}, + {file = "coverage-7.10.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f36b7dcf72d06a8c5e2dd3aca02be2b1b5db5f86404627dff834396efce958f2"}, + {file = "coverage-7.10.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fce316c367a1dc2c411821365592eeb335ff1781956d87a0410eae248188ba51"}, + {file = "coverage-7.10.4-cp310-cp310-win32.whl", hash = "sha256:8c5dab29fc8070b3766b5fc85f8d89b19634584429a2da6d42da5edfadaf32ae"}, + {file = "coverage-7.10.4-cp310-cp310-win_amd64.whl", hash = "sha256:4b0d114616f0fccb529a1817457d5fb52a10e106f86c5fb3b0bd0d45d0d69b93"}, + {file = "coverage-7.10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:05d5f98ec893d4a2abc8bc5f046f2f4367404e7e5d5d18b83de8fde1093ebc4f"}, + {file = "coverage-7.10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9267efd28f8994b750d171e58e481e3bbd69e44baed540e4c789f8e368b24b88"}, + {file = "coverage-7.10.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4456a039fdc1a89ea60823d0330f1ac6f97b0dbe9e2b6fb4873e889584b085fb"}, + {file = "coverage-7.10.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c2bfbd2a9f7e68a21c5bd191be94bfdb2691ac40d325bac9ef3ae45ff5c753d9"}, + {file = "coverage-7.10.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab7765f10ae1df7e7fe37de9e64b5a269b812ee22e2da3f84f97b1c7732a0d8"}, + {file = "coverage-7.10.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a09b13695166236e171ec1627ff8434b9a9bae47528d0ba9d944c912d33b3d2"}, + {file = "coverage-7.10.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5c9e75dfdc0167d5675e9804f04a56b2cf47fb83a524654297000b578b8adcb7"}, + {file = "coverage-7.10.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c751261bfe6481caba15ec005a194cb60aad06f29235a74c24f18546d8377df0"}, + {file = "coverage-7.10.4-cp311-cp311-win32.whl", hash = "sha256:051c7c9e765f003c2ff6e8c81ccea28a70fb5b0142671e4e3ede7cebd45c80af"}, + {file = "coverage-7.10.4-cp311-cp311-win_amd64.whl", hash = "sha256:1a647b152f10be08fb771ae4a1421dbff66141e3d8ab27d543b5eb9ea5af8e52"}, + {file = "coverage-7.10.4-cp311-cp311-win_arm64.whl", hash = "sha256:b09b9e4e1de0d406ca9f19a371c2beefe3193b542f64a6dd40cfcf435b7d6aa0"}, + {file = "coverage-7.10.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a1f0264abcabd4853d4cb9b3d164adbf1565da7dab1da1669e93f3ea60162d79"}, + {file = "coverage-7.10.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:536cbe6b118a4df231b11af3e0f974a72a095182ff8ec5f4868c931e8043ef3e"}, + {file = "coverage-7.10.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9a4c0d84134797b7bf3f080599d0cd501471f6c98b715405166860d79cfaa97e"}, + {file = "coverage-7.10.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7c155fc0f9cee8c9803ea0ad153ab6a3b956baa5d4cd993405dc0b45b2a0b9e0"}, + {file = "coverage-7.10.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5f2ab6e451d4b07855d8bcf063adf11e199bff421a4ba57f5bb95b7444ca62"}, + {file = "coverage-7.10.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:685b67d99b945b0c221be0780c336b303a7753b3e0ec0d618c795aada25d5e7a"}, + {file = "coverage-7.10.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0c079027e50c2ae44da51c2e294596cbc9dbb58f7ca45b30651c7e411060fc23"}, + {file = "coverage-7.10.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3749aa72b93ce516f77cf5034d8e3c0dfd45c6e8a163a602ede2dc5f9a0bb927"}, + {file = "coverage-7.10.4-cp312-cp312-win32.whl", hash = "sha256:fecb97b3a52fa9bcd5a7375e72fae209088faf671d39fae67261f37772d5559a"}, + {file = "coverage-7.10.4-cp312-cp312-win_amd64.whl", hash = "sha256:26de58f355626628a21fe6a70e1e1fad95702dafebfb0685280962ae1449f17b"}, + {file = "coverage-7.10.4-cp312-cp312-win_arm64.whl", hash = "sha256:67e8885408f8325198862bc487038a4980c9277d753cb8812510927f2176437a"}, + {file = "coverage-7.10.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b8e1d2015d5dfdbf964ecef12944c0c8c55b885bb5c0467ae8ef55e0e151233"}, + {file = "coverage-7.10.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:25735c299439018d66eb2dccf54f625aceb78645687a05f9f848f6e6c751e169"}, + {file = "coverage-7.10.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:715c06cb5eceac4d9b7cdf783ce04aa495f6aff657543fea75c30215b28ddb74"}, + {file = "coverage-7.10.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e017ac69fac9aacd7df6dc464c05833e834dc5b00c914d7af9a5249fcccf07ef"}, + {file = "coverage-7.10.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bad180cc40b3fccb0f0e8c702d781492654ac2580d468e3ffc8065e38c6c2408"}, + {file = "coverage-7.10.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:becbdcd14f685fada010a5f792bf0895675ecf7481304fe159f0cd3f289550bd"}, + {file = "coverage-7.10.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0b485ca21e16a76f68060911f97ebbe3e0d891da1dbbce6af7ca1ab3f98b9097"}, + {file = "coverage-7.10.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6c1d098ccfe8e1e0a1ed9a0249138899948afd2978cbf48eb1cc3fcd38469690"}, + {file = "coverage-7.10.4-cp313-cp313-win32.whl", hash = "sha256:8630f8af2ca84b5c367c3df907b1706621abe06d6929f5045fd628968d421e6e"}, + {file = "coverage-7.10.4-cp313-cp313-win_amd64.whl", hash = "sha256:f68835d31c421736be367d32f179e14ca932978293fe1b4c7a6a49b555dff5b2"}, + {file = "coverage-7.10.4-cp313-cp313-win_arm64.whl", hash = "sha256:6eaa61ff6724ca7ebc5326d1fae062d85e19b38dd922d50903702e6078370ae7"}, + {file = "coverage-7.10.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:702978108876bfb3d997604930b05fe769462cc3000150b0e607b7b444f2fd84"}, + {file = "coverage-7.10.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e8f978e8c5521d9c8f2086ac60d931d583fab0a16f382f6eb89453fe998e2484"}, + {file = "coverage-7.10.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:df0ac2ccfd19351411c45e43ab60932b74472e4648b0a9edf6a3b58846e246a9"}, + {file = "coverage-7.10.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:73a0d1aaaa3796179f336448e1576a3de6fc95ff4f07c2d7251d4caf5d18cf8d"}, + {file = "coverage-7.10.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:873da6d0ed6b3ffc0bc01f2c7e3ad7e2023751c0d8d86c26fe7322c314b031dc"}, + {file = "coverage-7.10.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c6446c75b0e7dda5daa876a1c87b480b2b52affb972fedd6c22edf1aaf2e00ec"}, + {file = "coverage-7.10.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6e73933e296634e520390c44758d553d3b573b321608118363e52113790633b9"}, + {file = "coverage-7.10.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52073d4b08d2cb571234c8a71eb32af3c6923149cf644a51d5957ac128cf6aa4"}, + {file = "coverage-7.10.4-cp313-cp313t-win32.whl", hash = "sha256:e24afb178f21f9ceb1aefbc73eb524769aa9b504a42b26857243f881af56880c"}, + {file = "coverage-7.10.4-cp313-cp313t-win_amd64.whl", hash = "sha256:be04507ff1ad206f4be3d156a674e3fb84bbb751ea1b23b142979ac9eebaa15f"}, + {file = "coverage-7.10.4-cp313-cp313t-win_arm64.whl", hash = "sha256:f3e3ff3f69d02b5dad67a6eac68cc9c71ae343b6328aae96e914f9f2f23a22e2"}, + {file = "coverage-7.10.4-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a59fe0af7dd7211ba595cf7e2867458381f7e5d7b4cffe46274e0b2f5b9f4eb4"}, + {file = "coverage-7.10.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3a6c35c5b70f569ee38dc3350cd14fdd0347a8b389a18bb37538cc43e6f730e6"}, + {file = "coverage-7.10.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:acb7baf49f513554c4af6ef8e2bd6e8ac74e6ea0c7386df8b3eb586d82ccccc4"}, + {file = "coverage-7.10.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a89afecec1ed12ac13ed203238b560cbfad3522bae37d91c102e690b8b1dc46c"}, + {file = "coverage-7.10.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:480442727f464407d8ade6e677b7f21f3b96a9838ab541b9a28ce9e44123c14e"}, + {file = "coverage-7.10.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a89bf193707f4a17f1ed461504031074d87f035153239f16ce86dfb8f8c7ac76"}, + {file = "coverage-7.10.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:3ddd912c2fc440f0fb3229e764feec85669d5d80a988ff1b336a27d73f63c818"}, + {file = "coverage-7.10.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a538944ee3a42265e61c7298aeba9ea43f31c01271cf028f437a7b4075592cf"}, + {file = "coverage-7.10.4-cp314-cp314-win32.whl", hash = "sha256:fd2e6002be1c62476eb862b8514b1ba7e7684c50165f2a8d389e77da6c9a2ebd"}, + {file = "coverage-7.10.4-cp314-cp314-win_amd64.whl", hash = "sha256:ec113277f2b5cf188d95fb66a65c7431f2b9192ee7e6ec9b72b30bbfb53c244a"}, + {file = "coverage-7.10.4-cp314-cp314-win_arm64.whl", hash = "sha256:9744954bfd387796c6a091b50d55ca7cac3d08767795b5eec69ad0f7dbf12d38"}, + {file = "coverage-7.10.4-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5af4829904dda6aabb54a23879f0f4412094ba9ef153aaa464e3c1b1c9bc98e6"}, + {file = "coverage-7.10.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7bba5ed85e034831fac761ae506c0644d24fd5594727e174b5a73aff343a7508"}, + {file = "coverage-7.10.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d57d555b0719834b55ad35045de6cc80fc2b28e05adb6b03c98479f9553b387f"}, + {file = "coverage-7.10.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ba62c51a72048bb1ea72db265e6bd8beaabf9809cd2125bbb5306c6ce105f214"}, + {file = "coverage-7.10.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0acf0c62a6095f07e9db4ec365cc58c0ef5babb757e54745a1aa2ea2a2564af1"}, + {file = "coverage-7.10.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e1033bf0f763f5cf49ffe6594314b11027dcc1073ac590b415ea93463466deec"}, + {file = "coverage-7.10.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:92c29eff894832b6a40da1789b1f252305af921750b03ee4535919db9179453d"}, + {file = "coverage-7.10.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:822c4c830989c2093527e92acd97be4638a44eb042b1bdc0e7a278d84a070bd3"}, + {file = "coverage-7.10.4-cp314-cp314t-win32.whl", hash = "sha256:e694d855dac2e7cf194ba33653e4ba7aad7267a802a7b3fc4347d0517d5d65cd"}, + {file = "coverage-7.10.4-cp314-cp314t-win_amd64.whl", hash = "sha256:efcc54b38ef7d5bfa98050f220b415bc5bb3d432bd6350a861cf6da0ede2cdcd"}, + {file = "coverage-7.10.4-cp314-cp314t-win_arm64.whl", hash = "sha256:6f3a3496c0fa26bfac4ebc458747b778cff201c8ae94fa05e1391bab0dbc473c"}, + {file = "coverage-7.10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:48fd4d52600c2a9d5622e52dfae674a7845c5e1dceaf68b88c99feb511fbcfd6"}, + {file = "coverage-7.10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:56217b470d09d69e6b7dcae38200f95e389a77db801cb129101697a4553b18b6"}, + {file = "coverage-7.10.4-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:44ac3f21a6e28c5ff7f7a47bca5f87885f6a1e623e637899125ba47acd87334d"}, + {file = "coverage-7.10.4-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3387739d72c84d17b4d2f7348749cac2e6700e7152026912b60998ee9a40066b"}, + {file = "coverage-7.10.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f111ff20d9a6348e0125be892608e33408dd268f73b020940dfa8511ad05503"}, + {file = "coverage-7.10.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:01a852f0a9859734b018a3f483cc962d0b381d48d350b1a0c47d618c73a0c398"}, + {file = "coverage-7.10.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:225111dd06759ba4e37cee4c0b4f3df2b15c879e9e3c37bf986389300b9917c3"}, + {file = "coverage-7.10.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2178d4183bd1ba608f0bb12e71e55838ba1b7dbb730264f8b08de9f8ef0c27d0"}, + {file = "coverage-7.10.4-cp39-cp39-win32.whl", hash = "sha256:93d175fe81913aee7a6ea430abbdf2a79f1d9fd451610e12e334e4fe3264f563"}, + {file = "coverage-7.10.4-cp39-cp39-win_amd64.whl", hash = "sha256:2221a823404bb941c7721cf0ef55ac6ee5c25d905beb60c0bba5e5e85415d353"}, + {file = "coverage-7.10.4-py3-none-any.whl", hash = "sha256:065d75447228d05121e5c938ca8f0e91eed60a1eb2d1258d42d5084fecfc3302"}, + {file = "coverage-7.10.4.tar.gz", hash = "sha256:25f5130af6c8e7297fd14634955ba9e1697f47143f289e2a23284177c0061d27"}, ] [package.dependencies] @@ -1621,7 +1543,7 @@ description = "Easily serialize dataclasses to and from JSON." optional = true python-versions = "<4.0,>=3.7" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\" or extra == \"docs\"" +markers = "extra == \"llama-index\" or extra == \"docs\"" files = [ {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, @@ -1708,46 +1630,45 @@ test = ["pytest (>=8.3.0,<8.4.0)", "pytest-benchmark (>=5.1.0,<5.2.0)", "pytest- [[package]] name = "deepeval" -version = "2.6.6" +version = "3.3.9" description = "The LLM Evaluation Framework" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] markers = "extra == \"deepeval\"" files = [ - {file = "deepeval-2.6.6-py3-none-any.whl", hash = "sha256:8935887e03863bdd105f0fed66fd774efef94af5369bfb7ab217e542a897e754"}, - {file = "deepeval-2.6.6.tar.gz", hash = "sha256:4e998b0ddcda19376a13f6558b67547ae8a6e6f4795e1ff27d6c3514e3c327c1"}, + {file = "deepeval-3.3.9-py3-none-any.whl", hash = "sha256:1ff9afc44547092425179bf397c314da20977827b09a4ec8f7daf036767b3ef9"}, + {file = "deepeval-3.3.9.tar.gz", hash = "sha256:b9e2361603102d27b1e599446fa7fcc09d05b8f0c695a53efcbdedfb940d5ab6"}, ] [package.dependencies] aiohttp = "*" -black = "*" -coverage = "*" +anthropic = "*" +click = ">=8.0.0,<8.3.0" +google-genai = ">=1.9.0,<2.0.0" grpcio = ">=1.67.1,<2.0.0" -instructor = "*" -langchain_community = "*" -langchain_openai = "*" -llama-index = "*" +nest_asyncio = "*" ollama = "*" openai = "*" opentelemetry-api = ">=1.24.0,<2.0.0" opentelemetry-exporter-otlp-proto-grpc = ">=1.24.0,<2.0.0" opentelemetry-sdk = ">=1.24.0,<2.0.0" portalocker = "*" +posthog = ">=3.23.0,<4.0.0" +pyfiglet = "*" pytest = "*" pytest-asyncio = "*" pytest-repeat = "*" pytest-rerunfailures = ">=12.0,<13.0" pytest-xdist = "*" requests = ">=2.31.0,<3.0.0" -rich = ">=13.6.0,<14.0.0" +rich = ">=13.6.0,<15.0.0" sentry-sdk = "*" setuptools = "*" tabulate = ">=0.9.0,<0.10.0" -tenacity = "<=9.0.0" +tenacity = ">=8.0.0,<=10.0.0" tqdm = ">=4.66.1,<5.0.0" -twine = "5.1.1" -typer = "*" +typer = ">=0.9,<1.0.0" wheel = "*" [[package]] @@ -1757,7 +1678,7 @@ description = "XML bomb protection for Python stdlib modules" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" groups = ["main"] -markers = "extra == \"notebook\" or extra == \"dev\" or extra == \"deepeval\"" +markers = "extra == \"notebook\" or extra == \"dev\"" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -1848,7 +1769,7 @@ description = "JSON decoder for Python that can extract data from the muck" optional = true python-versions = "*" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\"" +markers = "extra == \"llama-index\"" files = [ {file = "dirtyjson-1.0.8-py3-none-any.whl", hash = "sha256:125e27248435a58acace26d5c2c4c11a1c0de0a9c5124c5a94ba78e517d74f53"}, {file = "dirtyjson-1.0.8.tar.gz", hash = "sha256:90ca4a18f3ff30ce849d100dcf4a003953c79d3a2348ef056f1d9c22231a25fd"}, @@ -2006,19 +1927,6 @@ dev = ["pre-commit (>=2.16.0) ; python_version >= \"3.9\"", "pydoctor (>=25.4.0) docs = ["pydoctor (>=25.4.0)"] test = ["pytest"] -[[package]] -name = "docutils" -version = "0.22" -description = "Docutils -- Python Documentation Utilities" -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "docutils-0.22-py3-none-any.whl", hash = "sha256:4ed966a0e96a0477d852f7af31bdcb3adc049fbb35ccba358c2ea8a03287615e"}, - {file = "docutils-0.22.tar.gz", hash = "sha256:ba9d57750e92331ebe7c08a1bbf7a7f8143b86c476acd51528b042216a6aad0f"}, -] - [[package]] name = "duckdb" version = "1.3.2" @@ -2745,7 +2653,7 @@ description = "Google Authentication Library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"gemini\"" +markers = "extra == \"gemini\" or extra == \"deepeval\"" files = [ {file = "google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca"}, {file = "google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77"}, @@ -2783,6 +2691,32 @@ files = [ google-auth = "*" httplib2 = ">=0.19.0" +[[package]] +name = "google-genai" +version = "1.30.0" +description = "GenAI Python SDK" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"deepeval\"" +files = [ + {file = "google_genai-1.30.0-py3-none-any.whl", hash = "sha256:52955e79284899991bf2fef36b30f375b0736030ba3d089ca39002c18aa95c01"}, + {file = "google_genai-1.30.0.tar.gz", hash = "sha256:90dad6a9a895f30d0cbd5754462c82d3c060afcc2c3c9dccbcef4ff54019ef3f"}, +] + +[package.dependencies] +anyio = ">=4.8.0,<5.0.0" +google-auth = ">=2.14.1,<3.0.0" +httpx = ">=0.28.1,<1.0.0" +pydantic = ">=2.0.0,<3.0.0" +requests = ">=2.28.1,<3.0.0" +tenacity = ">=8.2.3,<9.2.0" +typing-extensions = ">=4.11.0,<5.0.0" +websockets = ">=13.0.0,<15.1.0" + +[package.extras] +aiohttp = ["aiohttp (<4.0.0)"] + [[package]] name = "google-generativeai" version = "0.8.5" @@ -2920,15 +2854,15 @@ test = ["objgraph", "psutil", "setuptools"] [[package]] name = "griffe" -version = "1.12.0" +version = "1.12.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\" or extra == \"dev\"" +markers = "extra == \"llama-index\" or extra == \"dev\"" files = [ - {file = "griffe-1.12.0-py3-none-any.whl", hash = "sha256:634cf7bf93ab7d12003f3704043e8e530637fc3d40c67a2a052e57d2fcde173a"}, - {file = "griffe-1.12.0.tar.gz", hash = "sha256:6085b03f3763f67a7ec6675d29017573f72dd2826b14e3f92c88525a058eb16a"}, + {file = "griffe-1.12.1-py3-none-any.whl", hash = "sha256:2d7c12334de00089c31905424a00abcfd931b45b8b516967f224133903d302cc"}, + {file = "griffe-1.12.1.tar.gz", hash = "sha256:29f5a6114c0aeda7d9c86a570f736883f8a2c5b38b57323d56b3d1c000565567"}, ] [package.dependencies] @@ -3335,19 +3269,6 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] zstd = ["zstandard (>=0.18.0)"] -[[package]] -name = "httpx-sse" -version = "0.4.1" -description = "Consume Server-Sent Event (SSE) messages with HTTPX." -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37"}, - {file = "httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e"}, -] - [[package]] name = "huggingface-hub" version = "0.34.4" @@ -3718,70 +3639,6 @@ files = [ colors = ["colorama"] plugins = ["setuptools"] -[[package]] -name = "jaraco-classes" -version = "3.4.0" -description = "Utility functions for Python class constructs" -optional = true -python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, - {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, -] - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "jaraco-context" -version = "6.0.1" -description = "Useful decorators and context managers" -optional = true -python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, - {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, -] - -[package.dependencies] -"backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} - -[package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] - -[[package]] -name = "jaraco-functools" -version = "4.2.1" -description = "Functools like those found in stdlib" -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "jaraco_functools-4.2.1-py3-none-any.whl", hash = "sha256:590486285803805f4b1f99c60ca9e94ed348d4added84b74c7a12885561e524e"}, - {file = "jaraco_functools-4.2.1.tar.gz", hash = "sha256:be634abfccabce56fa3053f8c7ebe37b682683a4ee7793670ced17bab0087353"}, -] - -[package.dependencies] -more_itertools = "*" - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] -type = ["pytest-mypy"] - [[package]] name = "jedi" version = "0.19.2" @@ -3803,23 +3660,6 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] -[[package]] -name = "jeepney" -version = "0.9.0" -description = "Low-level, pure Python DBus protocol wrapper." -optional = true -python-versions = ">=3.7" -groups = ["main"] -markers = "sys_platform == \"linux\" and extra == \"deepeval\"" -files = [ - {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, - {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, -] - -[package.extras] -test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["trio"] - [[package]] name = "jinja2" version = "3.1.6" @@ -3984,7 +3824,7 @@ description = "Apply JSON-Patches (RFC 6902)" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" groups = ["main"] -markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"deepeval\"" +markers = "extra == \"neptune\" or extra == \"langchain\"" files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, @@ -4002,6 +3842,8 @@ python-versions = "*" groups = ["main"] files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, + {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, + {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -4027,7 +3869,7 @@ description = "Identify specific nodes in a JSON document (RFC 6901)" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"deepeval\" or extra == \"notebook\" or extra == \"dev\"" +markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"notebook\" or extra == \"dev\"" files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -4230,21 +4072,21 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.4.5" +version = "4.4.6" description = "JupyterLab computational environment" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"notebook\" or extra == \"dev\"" files = [ - {file = "jupyterlab-4.4.5-py3-none-any.whl", hash = "sha256:e76244cceb2d1fb4a99341f3edc866f2a13a9e14c50368d730d75d8017be0863"}, - {file = "jupyterlab-4.4.5.tar.gz", hash = "sha256:0bd6c18e6a3c3d91388af6540afa3d0bb0b2e76287a7b88ddf20ab41b336e595"}, + {file = "jupyterlab-4.4.6-py3-none-any.whl", hash = "sha256:e877e930f46dde2e3ee9da36a935c6cd4fdb15aa7440519d0fde696f9fadb833"}, + {file = "jupyterlab-4.4.6.tar.gz", hash = "sha256:e0b720ff5392846bdbc01745f32f29f4d001c071a4bff94d8b516ba89b5a4157"}, ] [package.dependencies] async-lru = ">=1.0.0" -httpx = ">=0.25.0" -ipykernel = ">=6.5.0" +httpx = ">=0.25.0,<1" +ipykernel = ">=6.5.0,<6.30.0 || >6.30.0" jinja2 = ">=3.0.3" jupyter-core = "*" jupyter-lsp = ">=2.0.0" @@ -4304,37 +4146,6 @@ docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pyd openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] -[[package]] -name = "keyring" -version = "25.6.0" -description = "Store and access your passwords safely." -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, - {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, -] - -[package.dependencies] -importlib_metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -"jaraco.classes" = "*" -"jaraco.context" = "*" -"jaraco.functools" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -completion = ["shtab (>=1.1.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] -type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] - [[package]] name = "kiwisolver" version = "1.4.9" @@ -4495,19 +4306,19 @@ files = [ [[package]] name = "lancedb" -version = "0.24.2" +version = "0.24.3" description = "lancedb" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "lancedb-0.24.2-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:925a71f8f865ebd8d3792bbe1d5743bc43ae28263ef33ec4781bee4cc6f18b6a"}, - {file = "lancedb-0.24.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:5894c09b03b833e8480c8921178ebcf917599e05000d4a74990e5f1b9ddd1b6a"}, - {file = "lancedb-0.24.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:482f8e0f09ac68f50a511baea420501908adbf749d09bf04af0b27a018260831"}, - {file = "lancedb-0.24.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4a33fb4327880eecc71b9bdc5b4bd722b8fa0f0cbe1cf454b3b0f8521147cd8"}, - {file = "lancedb-0.24.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:cf8473303853fc798f023495d4a4ace3ba95ce816b9da85aad691ec189e7be45"}, - {file = "lancedb-0.24.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:693ce4dfcdbf9d1f0d6b79bac12e089091e2576cd5f1e2a5ba08cdbf635179f2"}, - {file = "lancedb-0.24.2-cp39-abi3-win_amd64.whl", hash = "sha256:46c211f1a0a3cfc385e9031d8ebe30a98d7dfb60751aed0f9626a4f61795ea57"}, + {file = "lancedb-0.24.3-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:65b5aa6201d6f1d921694dce614a2686c1272e25926cc7809ad8eb89a8eb85fa"}, + {file = "lancedb-0.24.3-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f2b86928b3175afde9507ca2e39f545df380ca52c415511ffd52fab8b09937ec"}, + {file = "lancedb-0.24.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7756d020c2e6d22130d8f59f32b816fbfda5f65ecc80c5b1bbeb01bf55dc834"}, + {file = "lancedb-0.24.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c933d2680e7bb28d99cb32b2395e808593a845a2b5ab59030e7d840d97e91f2"}, + {file = "lancedb-0.24.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:60ecfaabd1d33f435b498624f988e610cafacd5dfea26368e5582647730495e0"}, + {file = "lancedb-0.24.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:78632bd98e6c317609ce844eb737d1dd306786291ed2d98009e37377be13e1b4"}, + {file = "lancedb-0.24.3-cp39-abi3-win_amd64.whl", hash = "sha256:d5eb70b8a3b66d728c183f9b77ddfed13894c12880f647bf5cd85e477ad5368b"}, ] [package.dependencies] @@ -4523,53 +4334,12 @@ tqdm = ">=4.27.0" azure = ["adlfs (>=2024.2.0)"] clip = ["open-clip-torch", "pillow", "torch"] dev = ["pre-commit", "pyright", "ruff", "typing-extensions (>=4.0.0) ; python_full_version < \"3.11.0\""] -docs = ["mkdocs", "mkdocs-jupyter", "mkdocs-material", "mkdocstrings[python]"] -embeddings = ["awscli (>=1.29.57)", "boto3 (>=1.28.57)", "botocore (>=1.31.57)", "cohere", "colpali-engine (>=0.3.10)", "google-generativeai", "huggingface-hub", "ibm-watsonx-ai (>=1.1.2) ; python_full_version >= \"3.10.0\"", "instructorembedding", "ollama (>=0.3.0)", "open-clip-torch", "openai (>=1.6.1)", "pillow", "requests (>=2.31.0)", "sentence-transformers", "torch"] +docs = ["mkdocs", "mkdocs-jupyter", "mkdocs-material", "mkdocstrings-python"] +embeddings = ["awscli (>=1.29.57)", "boto3 (>=1.28.57)", "botocore (>=1.31.57)", "cohere", "colpali-engine (>=0.3.10)", "google-generativeai", "huggingface-hub", "ibm-watsonx-ai (>=1.1.2) ; python_full_version >= \"3.10.0\"", "instructorembedding", "ollama (>=0.3.0)", "open-clip-torch", "openai (>=1.6.1)", "pillow", "requests (>=2.31.0)", "sentence-transformers", "sentencepiece", "torch"] pylance = ["pylance (>=0.25)"] +siglip = ["pillow", "sentencepiece", "torch", "transformers (>=4.41.0)"] tests = ["aiohttp", "boto3", "datafusion", "duckdb", "pandas (>=1.4)", "polars (>=0.19,<=1.3.0)", "pyarrow-stubs", "pylance (>=0.25)", "pytest", "pytest-asyncio", "pytest-mock", "pytz", "requests", "tantivy"] -[[package]] -name = "langchain" -version = "0.3.27" -description = "Building applications with LLMs through composability" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "langchain-0.3.27-py3-none-any.whl", hash = "sha256:7b20c4f338826acb148d885b20a73a16e410ede9ee4f19bb02011852d5f98798"}, - {file = "langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62"}, -] - -[package.dependencies] -async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.72,<1.0.0" -langchain-text-splitters = ">=0.3.9,<1.0.0" -langsmith = ">=0.1.17" -pydantic = ">=2.7.4,<3.0.0" -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" - -[package.extras] -anthropic = ["langchain-anthropic"] -aws = ["langchain-aws"] -azure-ai = ["langchain-azure-ai"] -cohere = ["langchain-cohere"] -community = ["langchain-community"] -deepseek = ["langchain-deepseek"] -fireworks = ["langchain-fireworks"] -google-genai = ["langchain-google-genai"] -google-vertexai = ["langchain-google-vertexai"] -groq = ["langchain-groq"] -huggingface = ["langchain-huggingface"] -mistralai = ["langchain-mistralai"] -ollama = ["langchain-ollama"] -openai = ["langchain-openai"] -perplexity = ["langchain-perplexity"] -together = ["langchain-together"] -xai = ["langchain-xai"] - [[package]] name = "langchain-aws" version = "0.2.30" @@ -4595,36 +4365,6 @@ pydantic = ">=2.10.0,<3" [package.extras] tools = ["beautifulsoup4 (>=4.13.4)", "bedrock-agentcore (>=0.1.0) ; python_version >= \"3.10\"", "playwright (>=1.53.0)"] -[[package]] -name = "langchain-community" -version = "0.3.27" -description = "Community contributed LangChain integrations." -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "langchain_community-0.3.27-py3-none-any.whl", hash = "sha256:581f97b795f9633da738ea95da9cb78f8879b538090c9b7a68c0aed49c828f0d"}, - {file = "langchain_community-0.3.27.tar.gz", hash = "sha256:e1037c3b9da0c6d10bf06e838b034eb741e016515c79ef8f3f16e53ead33d882"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -dataclasses-json = ">=0.5.7,<0.7" -httpx-sse = ">=0.4.0,<1.0.0" -langchain = ">=0.3.26,<1.0.0" -langchain-core = ">=0.3.66,<1.0.0" -langsmith = ">=0.1.125" -numpy = [ - {version = ">=1.26.2", markers = "python_version < \"3.13\""}, - {version = ">=2.1.0", markers = "python_version >= \"3.13\""}, -] -pydantic-settings = ">=2.4.0,<3.0.0" -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" - [[package]] name = "langchain-core" version = "0.3.74" @@ -4632,7 +4372,7 @@ description = "Building applications with LLMs through composability" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"deepeval\"" +markers = "extra == \"neptune\" or extra == \"langchain\"" files = [ {file = "langchain_core-0.3.74-py3-none-any.whl", hash = "sha256:088338b5bc2f6a66892f9afc777992c24ee3188f41cbc603d09181e34a228ce7"}, {file = "langchain_core-0.3.74.tar.gz", hash = "sha256:ff604441aeade942fbcc0a3860a592daba7671345230c2078ba2eb5f82b6ba76"}, @@ -4647,24 +4387,6 @@ PyYAML = ">=5.3" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" typing-extensions = ">=4.7" -[[package]] -name = "langchain-openai" -version = "0.3.30" -description = "An integration package connecting OpenAI and LangChain" -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "langchain_openai-0.3.30-py3-none-any.whl", hash = "sha256:280f1f31004393228e3f75ff8353b1aae86bbc282abc7890a05beb5f43b89923"}, - {file = "langchain_openai-0.3.30.tar.gz", hash = "sha256:90df37509b2dcf5e057f491326fcbf78cf2a71caff5103a5a7de560320171842"}, -] - -[package.dependencies] -langchain-core = ">=0.3.74,<1.0.0" -openai = ">=1.99.9,<2.0.0" -tiktoken = ">=0.7,<1" - [[package]] name = "langchain-text-splitters" version = "0.3.9" @@ -4672,7 +4394,7 @@ description = "LangChain text splitting utilities" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"langchain\" or extra == \"deepeval\"" +markers = "extra == \"langchain\"" files = [ {file = "langchain_text_splitters-0.3.9-py3-none-any.whl", hash = "sha256:cee0bb816211584ea79cc79927317c358543f40404bcfdd69e69ba3ccde54401"}, {file = "langchain_text_splitters-0.3.9.tar.gz", hash = "sha256:7cd1e5a3aaf609979583eeca2eb34177622570b8fa8f586a605c6b1c34e7ebdb"}, @@ -4731,7 +4453,7 @@ description = "Client library to connect to the LangSmith LLM Tracing and Evalua optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"deepeval\"" +markers = "extra == \"neptune\" or extra == \"langchain\"" files = [ {file = "langsmith-0.4.14-py3-none-any.whl", hash = "sha256:b6d070ac425196947d2a98126fb0e35f3b8c001a2e6e5b7049dd1c56f0767d0b"}, {file = "langsmith-0.4.14.tar.gz", hash = "sha256:4d29c7a9c85b20ba813ab9c855407bccdf5eb4f397f512ffa89959b2a2cb83ed"}, @@ -4833,109 +4555,6 @@ extra-proxy = ["azure-identity (>=1.15.0,<2.0.0)", "azure-keyvault-secrets (>=4. proxy = ["PyJWT (>=2.8.0,<3.0.0)", "apscheduler (>=3.10.4,<4.0.0)", "backoff", "boto3 (==1.34.34)", "cryptography (>=43.0.1,<44.0.0)", "fastapi (>=0.115.5,<0.116.0)", "fastapi-sso (>=0.16.0,<0.17.0)", "gunicorn (>=23.0.0,<24.0.0)", "litellm-enterprise (==0.1.5)", "litellm-proxy-extras (==0.1.21)", "mcp (==1.5.0) ; python_version >= \"3.10\"", "orjson (>=3.9.7,<4.0.0)", "pynacl (>=1.5.0,<2.0.0)", "python-multipart (>=0.0.18,<0.0.19)", "pyyaml (>=6.0.1,<7.0.0)", "rich (==13.7.1)", "rq", "uvicorn (>=0.29.0,<0.30.0)", "uvloop (>=0.21.0,<0.22.0) ; sys_platform != \"win32\"", "websockets (>=13.1.0,<14.0.0)"] utils = ["numpydoc"] -[[package]] -name = "llama-cloud" -version = "0.1.35" -description = "" -optional = true -python-versions = "<4,>=3.8" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_cloud-0.1.35-py3-none-any.whl", hash = "sha256:b7abab4423118e6f638d2f326749e7a07c6426543bea6da99b623c715b22af71"}, - {file = "llama_cloud-0.1.35.tar.gz", hash = "sha256:200349d5d57424d7461f304cdb1355a58eea3e6ca1e6b0d75c66b2e937216983"}, -] - -[package.dependencies] -certifi = ">=2024.7.4" -httpx = ">=0.20.0" -pydantic = ">=1.10" - -[[package]] -name = "llama-cloud-services" -version = "0.6.54" -description = "Tailored SDK clients for LlamaCloud services." -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_cloud_services-0.6.54-py3-none-any.whl", hash = "sha256:07f595f7a0ba40c6a1a20543d63024ca7600fe65c4811d1951039977908997be"}, - {file = "llama_cloud_services-0.6.54.tar.gz", hash = "sha256:baf65d9bffb68f9dca98ac6e22908b6675b2038b021e657ead1ffc0e43cbd45d"}, -] - -[package.dependencies] -click = ">=8.1.7,<9" -llama-cloud = "0.1.35" -llama-index-core = ">=0.12.0" -platformdirs = ">=4.3.7,<5" -pydantic = ">=2.8,<2.10 || >2.10" -python-dotenv = ">=1.0.1,<2" -tenacity = ">=8.5.0,<10.0" - -[[package]] -name = "llama-index" -version = "0.12.52" -description = "Interface between LLMs and your data" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index-0.12.52-py3-none-any.whl", hash = "sha256:21e05e5a02b3601e18358eeed8748384eac8d35d384fdcbe16d03f0ffb09ea61"}, - {file = "llama_index-0.12.52.tar.gz", hash = "sha256:3a81fa4fbf1a36e30502d2fb7da26d53bc1a1ab02db1db12e62f06bb014d5ad9"}, -] - -[package.dependencies] -llama-index-agent-openai = ">=0.4.0,<0.5" -llama-index-cli = ">=0.4.2,<0.5" -llama-index-core = ">=0.12.52.post1,<0.13" -llama-index-embeddings-openai = ">=0.3.0,<0.4" -llama-index-indices-managed-llama-cloud = ">=0.4.0" -llama-index-llms-openai = ">=0.4.0,<0.5" -llama-index-multi-modal-llms-openai = ">=0.5.0,<0.6" -llama-index-program-openai = ">=0.3.0,<0.4" -llama-index-question-gen-openai = ">=0.3.0,<0.4" -llama-index-readers-file = ">=0.4.0,<0.5" -llama-index-readers-llama-parse = ">=0.4.0" -nltk = ">3.8.1" - -[[package]] -name = "llama-index-agent-openai" -version = "0.4.12" -description = "llama-index agent openai integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_agent_openai-0.4.12-py3-none-any.whl", hash = "sha256:6dbb6276b2e5330032a726b28d5eef5140825f36d72d472b231f08ad3af99665"}, - {file = "llama_index_agent_openai-0.4.12.tar.gz", hash = "sha256:d2fe53feb69cfe45752edb7328bf0d25f6a9071b3c056787e661b93e5b748a28"}, -] - -[package.dependencies] -llama-index-core = ">=0.12.41,<0.13" -llama-index-llms-openai = ">=0.4.0,<0.5" -openai = ">=1.14.0" - -[[package]] -name = "llama-index-cli" -version = "0.4.4" -description = "llama-index cli" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_cli-0.4.4-py3-none-any.whl", hash = "sha256:1070593cf79407054735ab7a23c5a65a26fc18d264661e42ef38fc549b4b7658"}, - {file = "llama_index_cli-0.4.4.tar.gz", hash = "sha256:c3af0cf1e2a7e5ef44d0bae5aa8e8872b54c5dd6b731afbae9f13ffeb4997be0"}, -] - -[package.dependencies] -llama-index-core = ">=0.12.0,<0.13" -llama-index-embeddings-openai = ">=0.3.1,<0.4" -llama-index-llms-openai = ">=0.4.0,<0.5" - [[package]] name = "llama-index-core" version = "0.12.52.post1" @@ -4943,7 +4562,7 @@ description = "Interface between LLMs and your data" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\"" +markers = "extra == \"llama-index\"" files = [ {file = "llama_index_core-0.12.52.post1-py3-none-any.whl", hash = "sha256:3e28d65d238bad8ec5ce372659ae0a3878851c6ba9c9447d6ddb4de138694b1f"}, {file = "llama_index_core-0.12.52.post1.tar.gz", hash = "sha256:ac6f447271e5ac4c12e1901373ec4b5ac7814ea33bd1ad3c3c8e9ac9771834ab"}, @@ -4978,40 +4597,6 @@ typing-extensions = ">=4.5.0" typing-inspect = ">=0.8.0" wrapt = "*" -[[package]] -name = "llama-index-embeddings-openai" -version = "0.3.1" -description = "llama-index embeddings openai integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_embeddings_openai-0.3.1-py3-none-any.whl", hash = "sha256:f15a3d13da9b6b21b8bd51d337197879a453d1605e625a1c6d45e741756c0290"}, - {file = "llama_index_embeddings_openai-0.3.1.tar.gz", hash = "sha256:1368aad3ce24cbaed23d5ad251343cef1eb7b4a06d6563d6606d59cb347fef20"}, -] - -[package.dependencies] -llama-index-core = ">=0.12.0,<0.13.0" -openai = ">=1.1.0" - -[[package]] -name = "llama-index-indices-managed-llama-cloud" -version = "0.8.0" -description = "llama-index indices llama-cloud integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_indices_managed_llama_cloud-0.8.0-py3-none-any.whl", hash = "sha256:817d6bd4715d45522e7165d29208e093d06179cc1bc5f9590382245f73dfd7aa"}, - {file = "llama_index_indices_managed_llama_cloud-0.8.0.tar.gz", hash = "sha256:762de10d3949e04997766f6a665ed4503394d82ea4b3339139a365edde6e753e"}, -] - -[package.dependencies] -llama-cloud = "0.1.35" -llama-index-core = ">=0.12.0,<0.13" - [[package]] name = "llama-index-instrumentation" version = "0.4.0" @@ -5019,7 +4604,7 @@ description = "Add your description here" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\"" +markers = "extra == \"llama-index\"" files = [ {file = "llama_index_instrumentation-0.4.0-py3-none-any.whl", hash = "sha256:83f73156be34dd0121dfe9e259883620e19f0162f152ac483e179ad5ad0396ac"}, {file = "llama_index_instrumentation-0.4.0.tar.gz", hash = "sha256:f38ecc1f02b6c1f7ab84263baa6467fac9f86538c0ee25542853de46278abea7"}, @@ -5029,117 +4614,6 @@ files = [ deprecated = ">=1.2.18" pydantic = ">=2.11.5" -[[package]] -name = "llama-index-llms-openai" -version = "0.4.7" -description = "llama-index llms openai integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_llms_openai-0.4.7-py3-none-any.whl", hash = "sha256:3b8d9d3c1bcadc2cff09724de70f074f43eafd5b7048a91247c9a41b7cd6216d"}, - {file = "llama_index_llms_openai-0.4.7.tar.gz", hash = "sha256:564af8ab39fb3f3adfeae73a59c0dca46c099ab844a28e725eee0c551d4869f8"}, -] - -[package.dependencies] -llama-index-core = ">=0.12.41,<0.13" -openai = ">=1.81.0,<2" - -[[package]] -name = "llama-index-multi-modal-llms-openai" -version = "0.5.3" -description = "llama-index multi-modal-llms openai integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_multi_modal_llms_openai-0.5.3-py3-none-any.whl", hash = "sha256:be6237df8f9caaa257f9beda5317287bbd2ec19473d777a30a34e41a7c5bddf8"}, - {file = "llama_index_multi_modal_llms_openai-0.5.3.tar.gz", hash = "sha256:b755a8b47d8d2f34b5a3d249af81d9bfb69d3d2cf9ab539d3a42f7bfa3e2391a"}, -] - -[package.dependencies] -llama-index-core = ">=0.12.47,<0.13" -llama-index-llms-openai = ">=0.4.0,<0.5" - -[[package]] -name = "llama-index-program-openai" -version = "0.3.2" -description = "llama-index program openai integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_program_openai-0.3.2-py3-none-any.whl", hash = "sha256:451829ae53e074e7b47dcc60a9dd155fcf9d1dcbc1754074bdadd6aab4ceb9aa"}, - {file = "llama_index_program_openai-0.3.2.tar.gz", hash = "sha256:04c959a2e616489894bd2eeebb99500d6f1c17d588c3da0ddc75ebd3eb7451ee"}, -] - -[package.dependencies] -llama-index-agent-openai = ">=0.4.0,<0.5" -llama-index-core = ">=0.12.0,<0.13" -llama-index-llms-openai = ">=0.4.0,<0.5" - -[[package]] -name = "llama-index-question-gen-openai" -version = "0.3.1" -description = "llama-index question_gen openai integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_question_gen_openai-0.3.1-py3-none-any.whl", hash = "sha256:1ce266f6c8373fc8d884ff83a44dfbacecde2301785db7144872db51b8b99429"}, - {file = "llama_index_question_gen_openai-0.3.1.tar.gz", hash = "sha256:5e9311b433cc2581ff8a531fa19fb3aa21815baff75aaacdef11760ac9522aa9"}, -] - -[package.dependencies] -llama-index-core = ">=0.12.0,<0.13" -llama-index-llms-openai = ">=0.4.0,<0.5" -llama-index-program-openai = ">=0.3.0,<0.4" - -[[package]] -name = "llama-index-readers-file" -version = "0.4.11" -description = "llama-index readers file integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_readers_file-0.4.11-py3-none-any.whl", hash = "sha256:e71192d8d6d0bf95131762da15fa205cf6e0cc248c90c76ee04d0fbfe160d464"}, - {file = "llama_index_readers_file-0.4.11.tar.gz", hash = "sha256:1b21cb66d78dd5f60e8716607d9a47ccd81bb39106d459665be1ca7799e9597b"}, -] - -[package.dependencies] -beautifulsoup4 = ">=4.12.3,<5" -defusedxml = ">=0.7.1" -llama-index-core = ">=0.12.0,<0.13" -pandas = "<2.3.0" -pypdf = ">=5.1.0,<6" -striprtf = ">=0.0.26,<0.0.27" - -[package.extras] -pymupdf = ["pymupdf (>=1.23.21,<2)"] - -[[package]] -name = "llama-index-readers-llama-parse" -version = "0.4.0" -description = "llama-index readers llama-parse integration" -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_index_readers_llama_parse-0.4.0-py3-none-any.whl", hash = "sha256:574e48386f28d2c86c3f961ca4a4906910312f3400dd0c53014465bfbc6b32bf"}, - {file = "llama_index_readers_llama_parse-0.4.0.tar.gz", hash = "sha256:e99ec56f4f8546d7fda1a7c1ae26162fb9acb7ebcac343b5abdb4234b4644e0f"}, -] - -[package.dependencies] -llama-index-core = ">=0.12.0,<0.13.0" -llama-parse = ">=0.5.0" - [[package]] name = "llama-index-workflows" version = "1.3.0" @@ -5147,7 +4621,7 @@ description = "An event-driven, async-first, step-based way to control the execu optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\"" +markers = "extra == \"llama-index\"" files = [ {file = "llama_index_workflows-1.3.0-py3-none-any.whl", hash = "sha256:328cc25d92b014ef527f105a2f2088c0924fff0494e53d93decb951f14fbfe47"}, {file = "llama_index_workflows-1.3.0.tar.gz", hash = "sha256:9c1688e237efad384f16485af71c6f9456a2eb6d85bf61ff49e5717f10ff286d"}, @@ -5161,22 +4635,6 @@ typing-extensions = ">=4.6.0" [package.extras] server = ["starlette (>=0.39.0)", "uvicorn (>=0.32.0)"] -[[package]] -name = "llama-parse" -version = "0.6.54" -description = "Parse files into RAG-Optimized formats." -optional = true -python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "llama_parse-0.6.54-py3-none-any.whl", hash = "sha256:c66c8d51cf6f29a44eaa8595a595de5d2598afc86e5a33a4cebe5fe228036920"}, - {file = "llama_parse-0.6.54.tar.gz", hash = "sha256:c707b31152155c9bae84e316fab790bbc8c85f4d8825ce5ee386ebeb7db258f1"}, -] - -[package.dependencies] -llama-cloud-services = ">=0.6.54" - [[package]] name = "loguru" version = "0.7.3" @@ -5512,7 +4970,7 @@ description = "A lightweight library for converting complex datatypes to and fro optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\" or extra == \"docs\"" +markers = "extra == \"llama-index\" or extra == \"docs\"" files = [ {file = "marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c"}, {file = "marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6"}, @@ -5778,20 +5236,21 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.6.16" +version = "9.6.17" description = "Documentation that simply works" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"dev\"" files = [ - {file = "mkdocs_material-9.6.16-py3-none-any.whl", hash = "sha256:8d1a1282b892fe1fdf77bfeb08c485ba3909dd743c9ba69a19a40f637c6ec18c"}, - {file = "mkdocs_material-9.6.16.tar.gz", hash = "sha256:d07011df4a5c02ee0877496d9f1bfc986cfb93d964799b032dd99fe34c0e9d19"}, + {file = "mkdocs_material-9.6.17-py3-none-any.whl", hash = "sha256:221dd8b37a63f52e580bcab4a7e0290e4a6f59bd66190be9c3d40767e05f9417"}, + {file = "mkdocs_material-9.6.17.tar.gz", hash = "sha256:48ae7aec72a3f9f501a70be3fbd329c96ff5f5a385b67a1563e5ed5ce064affe"}, ] [package.dependencies] babel = ">=2.10,<3.0" backrefs = ">=5.7.post1,<6.0" +click = "<8.2.2" colorama = ">=0.4,<1.0" jinja2 = ">=3.1,<4.0" markdown = ">=3.2,<4.0" @@ -6028,15 +5487,15 @@ type = ["mypy (==1.17.0)"] [[package]] name = "modal" -version = "1.1.1" +version = "1.1.2" description = "Python client library for Modal" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"distributed\"" files = [ - {file = "modal-1.1.1-py3-none-any.whl", hash = "sha256:ec2e2f68848a29228b61a646d2af7ac239558c005b66ca996d7c6c5de587ae36"}, - {file = "modal-1.1.1.tar.gz", hash = "sha256:f353ca3b6151abec0b253c398198261859ceab79dbaa2238a58d068ce889b2c0"}, + {file = "modal-1.1.2-py3-none-any.whl", hash = "sha256:3c7fc01aeb64e58f94c6658a41fc5e2a92dff9ae7415712e22f27c93e6dbe08d"}, + {file = "modal-1.1.2.tar.gz", hash = "sha256:9601029a6926c7c6e96e77126e04b7fdb55d23c0ec5313aa669e6da9680729c5"}, ] [package.dependencies] @@ -6046,7 +5505,7 @@ click = ">=8.1,<9.0" grpclib = ">=0.4.7,<0.4.9" protobuf = ">=3.19,<4.24.0 || >4.24.0,<7.0" rich = ">=12.0.0" -synchronicity = ">=0.10.1,<0.11.0" +synchronicity = ">=0.10.2,<0.11.0" toml = "*" typer = ">=0.9" types-certifi = "*" @@ -6061,25 +5520,12 @@ description = "An implementation of time.monotonic() for Python 2 & < 3.3" optional = true python-versions = "*" groups = ["main"] -markers = "extra == \"posthog\" or extra == \"chromadb\"" +markers = "extra == \"deepeval\" or extra == \"posthog\" or extra == \"chromadb\"" files = [ {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"}, {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"}, ] -[[package]] -name = "more-itertools" -version = "10.7.0" -description = "More routines for operating on iterables, beyond itertools" -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, - {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, -] - [[package]] name = "mpmath" version = "1.3.0" @@ -6307,7 +5753,7 @@ description = "Type system extensions for programs checked with the mypy type ch optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\" or extra == \"docs\" or extra == \"dev\"" +markers = "extra == \"llama-index\" or extra == \"docs\" or extra == \"dev\"" files = [ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, @@ -6315,15 +5761,15 @@ files = [ [[package]] name = "narwhals" -version = "2.1.1" +version = "2.1.2" description = "Extremely lightweight compatibility layer between dataframe libraries" optional = true python-versions = ">=3.9" groups = ["main"] markers = "extra == \"evals\"" files = [ - {file = "narwhals-2.1.1-py3-none-any.whl", hash = "sha256:dee7d7582d456ef325cb831a65b80783041ef841bbf183180ec445d132a154c6"}, - {file = "narwhals-2.1.1.tar.gz", hash = "sha256:308ec9d0e40616b66b61cd76ede4083a4232ae04942a3acef7e514d49641cb77"}, + {file = "narwhals-2.1.2-py3-none-any.whl", hash = "sha256:136b2f533a4eb3245c54254f137c5d14cef5c4668cff67dc6e911a602acd3547"}, + {file = "narwhals-2.1.2.tar.gz", hash = "sha256:afb9597e76d5b38c2c4b7c37d27a2418b8cc8049a66b8a5aca9581c92ae8f8bf"}, ] [package.extras] @@ -6501,43 +5947,6 @@ extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.1 test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] test-extras = ["pytest-mpl", "pytest-randomly"] -[[package]] -name = "nh3" -version = "0.3.0" -description = "Python binding to Ammonia HTML sanitizer Rust crate" -optional = true -python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "nh3-0.3.0-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a537ece1bf513e5a88d8cff8a872e12fe8d0f42ef71dd15a5e7520fecd191bbb"}, - {file = "nh3-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c915060a2c8131bef6a29f78debc29ba40859b6dbe2362ef9e5fd44f11487c2"}, - {file = "nh3-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba0caa8aa184196daa6e574d997a33867d6d10234018012d35f86d46024a2a95"}, - {file = "nh3-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:80fe20171c6da69c7978ecba33b638e951b85fb92059259edd285ff108b82a6d"}, - {file = "nh3-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e90883f9f85288f423c77b3f5a6f4486375636f25f793165112679a7b6363b35"}, - {file = "nh3-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0649464ac8eee018644aacbc103874ccbfac80e3035643c3acaab4287e36e7f5"}, - {file = "nh3-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1adeb1062a1c2974bc75b8d1ecb014c5fd4daf2df646bbe2831f7c23659793f9"}, - {file = "nh3-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:7275fdffaab10cc5801bf026e3c089d8de40a997afc9e41b981f7ac48c5aa7d5"}, - {file = "nh3-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:423201bbdf3164a9e09aa01e540adbb94c9962cc177d5b1cbb385f5e1e79216e"}, - {file = "nh3-0.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:16f8670201f7e8e0e05ed1a590eb84bfa51b01a69dd5caf1d3ea57733de6a52f"}, - {file = "nh3-0.3.0-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ec6cfdd2e0399cb79ba4dcffb2332b94d9696c52272ff9d48a630c5dca5e325a"}, - {file = "nh3-0.3.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5e7185599f89b0e391e2f29cc12dc2e206167380cea49b33beda4891be2fe1"}, - {file = "nh3-0.3.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:389d93d59b8214d51c400fb5b07866c2a4f79e4e14b071ad66c92184fec3a392"}, - {file = "nh3-0.3.0-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e9e6a7e4d38f7e8dda9edd1433af5170c597336c1a74b4693c5cb75ab2b30f2a"}, - {file = "nh3-0.3.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7852f038a054e0096dac12b8141191e02e93e0b4608c4b993ec7d4ffafea4e49"}, - {file = "nh3-0.3.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af5aa8127f62bbf03d68f67a956627b1bd0469703a35b3dad28d0c1195e6c7fb"}, - {file = "nh3-0.3.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f416c35efee3e6a6c9ab7716d9e57aa0a49981be915963a82697952cba1353e1"}, - {file = "nh3-0.3.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37d3003d98dedca6cd762bf88f2e70b67f05100f6b949ffe540e189cc06887f9"}, - {file = "nh3-0.3.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:634e34e6162e0408e14fb61d5e69dbaea32f59e847cfcfa41b66100a6b796f62"}, - {file = "nh3-0.3.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b0612ccf5de8a480cf08f047b08f9d3fecc12e63d2ee91769cb19d7290614c23"}, - {file = "nh3-0.3.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c7a32a7f0d89f7d30cb8f4a84bdbd56d1eb88b78a2434534f62c71dac538c450"}, - {file = "nh3-0.3.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3f1b4f8a264a0c86ea01da0d0c390fe295ea0bcacc52c2103aca286f6884f518"}, - {file = "nh3-0.3.0-cp38-abi3-win32.whl", hash = "sha256:6d68fa277b4a3cf04e5c4b84dd0c6149ff7d56c12b3e3fab304c525b850f613d"}, - {file = "nh3-0.3.0-cp38-abi3-win_amd64.whl", hash = "sha256:bae63772408fd63ad836ec569a7c8f444dd32863d0c67f6e0b25ebbd606afa95"}, - {file = "nh3-0.3.0-cp38-abi3-win_arm64.whl", hash = "sha256:d97d3efd61404af7e5721a0e74d81cdbfc6e5f97e11e731bb6d090e30a7b62b2"}, - {file = "nh3-0.3.0.tar.gz", hash = "sha256:d8ba24cb31525492ea71b6aac11a4adac91d828aadeff7c4586541bf5dc34d2f"}, -] - [[package]] name = "nltk" version = "3.9.1" @@ -7019,7 +6428,7 @@ description = "" optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(sys_platform != \"emscripten\" or extra == \"neptune\" or extra == \"langchain\" or extra == \"deepeval\") and (sys_platform != \"emscripten\" or platform_python_implementation != \"PyPy\")" +markers = "(sys_platform != \"emscripten\" or extra == \"neptune\" or extra == \"langchain\") and (sys_platform != \"emscripten\" or platform_python_implementation != \"PyPy\")" files = [ {file = "orjson-3.11.2-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d6b8a78c33496230a60dc9487118c284c15ebdf6724386057239641e1eb69761"}, {file = "orjson-3.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc04036eeae11ad4180d1f7b5faddb5dab1dee49ecd147cd431523869514873b"}, @@ -7149,54 +6558,54 @@ lint = ["black"] [[package]] name = "pandas" -version = "2.2.3" +version = "2.3.1" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {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"}, + {file = "pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9"}, + {file = "pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0"}, + {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1"}, + {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97"}, + {file = "pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b"}, + {file = "pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85"}, + {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678"}, + {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299"}, + {file = "pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3"}, + {file = "pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e"}, + {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8"}, + {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679"}, + {file = "pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22"}, + {file = "pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928"}, + {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12"}, + {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb"}, + {file = "pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a"}, + {file = "pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275"}, + {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96"}, + {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8"}, + {file = "pandas-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da"}, + {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7"}, + {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88"}, + {file = "pandas-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d"}, + {file = "pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2"}, ] [package.dependencies] @@ -7271,7 +6680,7 @@ description = "Utility library for gitignore style pattern matching of file path optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"deepeval\" or extra == \"dev\"" +markers = "extra == \"dev\"" files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -7532,22 +6941,6 @@ tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "ole typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] -[[package]] -name = "pkginfo" -version = "1.10.0" -description = "Query metadata from sdists / bdists / installed packages." -optional = true -python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"}, - {file = "pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297"}, -] - -[package.extras] -testing = ["pytest", "pytest-cov", "wheel"] - [[package]] name = "platformdirs" version = "4.3.8" @@ -7646,7 +7039,7 @@ description = "Integrate PostHog into any python application." optional = true python-versions = "*" groups = ["main"] -markers = "extra == \"posthog\" or extra == \"chromadb\"" +markers = "extra == \"deepeval\" or extra == \"posthog\" or extra == \"chromadb\"" files = [ {file = "posthog-3.25.0-py2.py3-none-any.whl", hash = "sha256:85db78c13d1ecb11aed06fad53759c4e8fb3633442c2f3d0336bc0ce8a585d30"}, {file = "posthog-3.25.0.tar.gz", hash = "sha256:9168f3e7a0a5571b6b1065c41b3c171fbc68bfe72c3ac0bfd6e3d2fcdb7df2ca"}, @@ -7966,6 +7359,7 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -8225,7 +7619,7 @@ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"gemini\"" +markers = "extra == \"gemini\" or extra == \"deepeval\"" files = [ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, @@ -8238,7 +7632,7 @@ description = "A collection of ASN.1-based protocols modules" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"gemini\"" +markers = "extra == \"gemini\" or extra == \"deepeval\"" files = [ {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, @@ -8456,6 +7850,19 @@ gcp-secret-manager = ["google-cloud-secret-manager (>=2.23.1)"] toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "pyfiglet" +version = "1.0.4" +description = "Pure-python FIGlet implementation" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"deepeval\"" +files = [ + {file = "pyfiglet-1.0.4-py3-none-any.whl", hash = "sha256:65b57b7a8e1dff8a67dc8e940a117238661d5e14c3e49121032bd404d9b2b39f"}, + {file = "pyfiglet-1.0.4.tar.gz", hash = "sha256:db9c9940ed1bf3048deff534ed52ff2dafbbc2cd7610b17bb5eca1df6d4278ef"}, +] + [[package]] name = "pygments" version = "2.19.2" @@ -9043,19 +8450,6 @@ files = [ {file = "pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d"}, ] -[[package]] -name = "pywin32-ctypes" -version = "0.2.3" -description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -optional = true -python-versions = ">=3.6" -groups = ["main"] -markers = "sys_platform == \"win32\" and extra == \"deepeval\"" -files = [ - {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, - {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, -] - [[package]] name = "pywinpty" version = "3.0.0" @@ -9403,27 +8797,6 @@ lxml = ["lxml (>=4.3,<6.0)"] networkx = ["networkx (>=2,<4)"] orjson = ["orjson (>=3.9.14,<4)"] -[[package]] -name = "readme-renderer" -version = "44.0" -description = "readme_renderer is a library for rendering readme descriptions for Warehouse" -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, - {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, -] - -[package.dependencies] -docutils = ">=0.21.2" -nh3 = ">=0.2.14" -Pygments = ">=2.5.1" - -[package.extras] -md = ["cmarkgfm (>=0.8.0)"] - [[package]] name = "redis" version = "5.3.1" @@ -9609,7 +8982,7 @@ description = "A utility belt for advanced users of python-requests" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" groups = ["main"] -markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"deepeval\" or extra == \"docs\"" +markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"docs\"" files = [ {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, @@ -9649,22 +9022,6 @@ files = [ [package.dependencies] six = "*" -[[package]] -name = "rfc3986" -version = "2.0.0" -description = "Validating URI References per RFC 3986" -optional = true -python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, -] - -[package.extras] -idna2008 = ["idna"] - [[package]] name = "rfc3986-validator" version = "0.1.1" @@ -9699,20 +9056,19 @@ testing = ["pytest (>=8.3.5)"] [[package]] name = "rich" -version = "13.9.4" +version = "14.1.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.8.0" groups = ["main"] files = [ - {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, - {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, + {file = "rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f"}, + {file = "rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8"}, ] [package.dependencies] markdown-it-py = ">=2.2.0" pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] @@ -9904,7 +9260,7 @@ description = "Pure-Python RSA implementation" optional = true python-versions = "<4,>=3.6" groups = ["main"] -markers = "extra == \"gemini\"" +markers = "extra == \"gemini\" or extra == \"deepeval\"" files = [ {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, @@ -10215,23 +9571,6 @@ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodest doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] -[[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -optional = true -python-versions = ">=3.6" -groups = ["main"] -markers = "sys_platform == \"linux\" and extra == \"deepeval\"" -files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, -] - -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" - [[package]] name = "semver" version = "3.0.4" @@ -10632,7 +9971,7 @@ description = "A modern CSS selector implementation for Beautiful Soup." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"notebook\" or extra == \"dev\" or extra == \"deepeval\" or extra == \"docs\" or extra == \"evals\"" +markers = "extra == \"notebook\" or extra == \"dev\" or extra == \"docs\" or extra == \"evals\"" files = [ {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"}, {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"}, @@ -10790,19 +10129,6 @@ typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\"" [package.extras] full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] -[[package]] -name = "striprtf" -version = "0.0.26" -description = "A simple library to convert rtf to text" -optional = true -python-versions = "*" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "striprtf-0.0.26-py3-none-any.whl", hash = "sha256:8c8f9d32083cdc2e8bfb149455aa1cc5a4e0a035893bedc75db8b73becb3a1bb"}, - {file = "striprtf-0.0.26.tar.gz", hash = "sha256:fdb2bba7ac440072d1c41eab50d8d74ae88f60a8b6575c6e2c7805dc462093aa"}, -] - [[package]] name = "structlog" version = "25.4.0" @@ -11315,30 +10641,6 @@ async = ["aiohttp (>=3.7.3,<4)", "async-lru (>=1.0.3,<3)"] dev = ["coverage (>=4.4.2)", "coveralls (>=2.1.0)", "tox (>=3.21.0)"] test = ["urllib3 (<2)", "vcrpy (>=1.10.3)"] -[[package]] -name = "twine" -version = "5.1.1" -description = "Collection of utilities for publishing packages on PyPI" -optional = true -python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"deepeval\"" -files = [ - {file = "twine-5.1.1-py3-none-any.whl", hash = "sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997"}, - {file = "twine-5.1.1.tar.gz", hash = "sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db"}, -] - -[package.dependencies] -importlib-metadata = ">=3.6" -keyring = ">=15.1" -pkginfo = ">=1.8.1,<1.11" -readme-renderer = ">=35.0" -requests = ">=2.20" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -rfc3986 = ">=1.4.0" -rich = ">=12.0.0" -urllib3 = ">=1.26.0" - [[package]] name = "typer" version = "0.16.0" @@ -11415,7 +10717,7 @@ description = "Runtime inspection utilities for typing module." optional = true python-versions = "*" groups = ["main"] -markers = "extra == \"llama-index\" or extra == \"deepeval\" or extra == \"docs\"" +markers = "extra == \"llama-index\" or extra == \"docs\"" files = [ {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, @@ -11934,7 +11236,7 @@ description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"api\" or extra == \"chromadb\"" +markers = "extra == \"api\" or extra == \"deepeval\" or extra == \"chromadb\"" files = [ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, @@ -12331,7 +11633,7 @@ description = "Zstandard bindings for Python" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"deepeval\" or extra == \"chromadb\"" +markers = "extra == \"neptune\" or extra == \"langchain\" or extra == \"chromadb\"" files = [ {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, @@ -12470,4 +11772,4 @@ posthog = ["posthog"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<=3.13" -content-hash = "7682898d3c726a0b1e3d08560ceb26180e1841e89a4a417377ee876b55878a9b" +content-hash = "87f0fef839ba608e1ab06c7d2bd6a1c4fd4b60e5df3750fc7672fc03f614f3d7" diff --git a/pyproject.toml b/pyproject.toml index 095349ff3..559831f9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "cognee" -version = "0.2.2" +version = "0.2.3.dev1" description = "Cognee - is a library for enriching LLM context with a semantic layer for better understanding and reasoning." authors = [ { name = "Vasilije Markovic" }, @@ -96,7 +96,7 @@ huggingface = ["transformers>=4.46.3,<5"] ollama = ["transformers>=4.46.3,<5"] mistral = ["mistral-common>=1.5.2,<2"] anthropic = ["anthropic>=0.26.1,<0.27"] -deepeval = ["deepeval>=2.0.1,<3"] +deepeval = ["deepeval>=3.0.1,<4"] posthog = ["posthog>=3.5.0,<4"] falkordb = ["falkordb>=1.0.9,<2.0.0"] groq = ["groq>=0.8.0,<1.0.0"] @@ -156,7 +156,6 @@ exclude = [ "/.data", "/.github", "/alembic", - "/distributed", "/deployment", "/cognee-mcp", "/cognee-frontend",