diff --git a/.github/actions/cognee_setup/action.yml b/.github/actions/cognee_setup/action.yml index 9ae669b53..e46a42edb 100644 --- a/.github/actions/cognee_setup/action.yml +++ b/.github/actions/cognee_setup/action.yml @@ -24,7 +24,7 @@ runs: uses: astral-sh/setup-uv@v4 with: enable-cache: true - + - name: Rebuild uv lockfile shell: bash run: | diff --git a/.github/workflows/basic_tests.yml b/.github/workflows/basic_tests.yml index e2264da3d..3f3e644a2 100644 --- a/.github/workflows/basic_tests.yml +++ b/.github/workflows/basic_tests.yml @@ -188,6 +188,7 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: ${{ inputs.python-version }} + extra-dependencies: "baml" - name: Run Simple Examples run: uv run python ./examples/python/simple_example.py diff --git a/.github/workflows/e2e_tests.yml b/.github/workflows/e2e_tests.yml index af3a3ff44..3fe7a7992 100644 --- a/.github/workflows/e2e_tests.yml +++ b/.github/workflows/e2e_tests.yml @@ -166,9 +166,6 @@ jobs: python-version: '3.11.x' extra-dependencies: "aws" - - name: Dependencies already installed - run: echo "Dependencies already installed in setup" - - name: Run S3 Bucket Test env: ENV: 'dev' diff --git a/.github/workflows/test_s3_file_storage.yml b/.github/workflows/test_s3_file_storage.yml index c4866ec2d..a477d8933 100644 --- a/.github/workflows/test_s3_file_storage.yml +++ b/.github/workflows/test_s3_file_storage.yml @@ -18,6 +18,7 @@ jobs: uses: ./.github/actions/cognee_setup with: python-version: '3.11.x' + extra-dependencies: "aws" - name: Run S3 File Storage Test env: diff --git a/cognee/api/client.py b/cognee/api/client.py index 7d5f48672..f129ff2ec 100644 --- a/cognee/api/client.py +++ b/cognee/api/client.py @@ -3,7 +3,6 @@ import os import uvicorn -import sentry_sdk from traceback import format_exc from contextlib import asynccontextmanager from fastapi import Request @@ -42,11 +41,18 @@ from cognee.modules.users.methods.get_authenticated_user import REQUIRE_AUTHENTI logger = get_logger() if os.getenv("ENV", "prod") == "prod": - sentry_sdk.init( - dsn=os.getenv("SENTRY_REPORTING_URL"), - traces_sample_rate=1.0, - profiles_sample_rate=1.0, - ) + try: + import sentry_sdk + + sentry_sdk.init( + dsn=os.getenv("SENTRY_REPORTING_URL"), + traces_sample_rate=1.0, + profiles_sample_rate=1.0, + ) + except ImportError: + logger.info( + "Sentry SDK not available. Install with 'pip install cognee\"[monitoring]\"' to enable error monitoring." + ) app_environment = os.getenv("ENV", "prod") diff --git a/cognee/eval_framework/modal_eval_dashboard.py b/cognee/eval_framework/modal_eval_dashboard.py index acc0c3aa9..9b1147528 100644 --- a/cognee/eval_framework/modal_eval_dashboard.py +++ b/cognee/eval_framework/modal_eval_dashboard.py @@ -1,6 +1,6 @@ import os import json -import pandas as pd + import subprocess import modal import streamlit as st @@ -78,6 +78,14 @@ def main(): } ) + try: + import pandas as pd + except ImportError: + st.error( + "Pandas is required for the evaluation dashboard. Install with 'pip install cognee\"[evals]\"' to use this feature." + ) + return + df = pd.DataFrame(records) if df.empty: st.warning("No JSON files found in the volume.") diff --git a/cognee/infrastructure/data/utils/extract_keywords.py b/cognee/infrastructure/data/utils/extract_keywords.py deleted file mode 100644 index 8085459c9..000000000 --- a/cognee/infrastructure/data/utils/extract_keywords.py +++ /dev/null @@ -1,48 +0,0 @@ -from sklearn.feature_extraction.text import TfidfVectorizer - -from cognee.infrastructure.data.exceptions.exceptions import KeywordExtractionError -from cognee.shared.utils import extract_pos_tags - - -def extract_keywords(text: str) -> list[str]: - """ - Extract keywords from the provided text string. - - 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. - - Parameters: - ----------- - - - text (str): The input text from which to extract keywords. - - Returns: - -------- - - - list[str]: A list of keywords extracted from the text, containing up to 15 nouns - with more than 3 characters. - """ - if len(text) == 0: - raise KeywordExtractionError() - - tags = extract_pos_tags(text) - nouns = [word for (word, tag) in tags if tag == "NN"] - - vectorizer = TfidfVectorizer() - tfidf = vectorizer.fit_transform(nouns) - - top_nouns = sorted( - vectorizer.vocabulary_, key=lambda x: tfidf[0, vectorizer.vocabulary_[x]], reverse=True - ) - - keywords = [] - - for word in top_nouns: - if len(word) > 3: - keywords.append(word) - if len(keywords) >= 15: - break - - return keywords diff --git a/cognee/infrastructure/databases/relational/create_relational_engine.py b/cognee/infrastructure/databases/relational/create_relational_engine.py index a889e1758..deaeaa2da 100644 --- a/cognee/infrastructure/databases/relational/create_relational_engine.py +++ b/cognee/infrastructure/databases/relational/create_relational_engine.py @@ -39,8 +39,16 @@ def create_relational_engine( connection_string = f"sqlite+aiosqlite:///{db_path}/{db_name}" if db_provider == "postgres": - connection_string = ( - f"postgresql+asyncpg://{db_username}:{db_password}@{db_host}:{db_port}/{db_name}" - ) + try: + # Test if asyncpg is available + import asyncpg + + connection_string = ( + f"postgresql+asyncpg://{db_username}:{db_password}@{db_host}:{db_port}/{db_name}" + ) + except ImportError: + raise ImportError( + "PostgreSQL dependencies are not installed. Please install with 'pip install cognee\"[postgres]\"' or 'pip install cognee\"[postgres-binary]\"' to use PostgreSQL functionality." + ) return SQLAlchemyAdapter(connection_string) diff --git a/cognee/infrastructure/databases/vector/create_vector_engine.py b/cognee/infrastructure/databases/vector/create_vector_engine.py index 77bf7d83f..5c4e93359 100644 --- a/cognee/infrastructure/databases/vector/create_vector_engine.py +++ b/cognee/infrastructure/databases/vector/create_vector_engine.py @@ -66,7 +66,12 @@ def create_vector_engine( f"postgresql+asyncpg://{db_username}:{db_password}@{db_host}:{db_port}/{db_name}" ) - from .pgvector.PGVectorAdapter import PGVectorAdapter + try: + from .pgvector.PGVectorAdapter import PGVectorAdapter + except ImportError: + raise ImportError( + "PostgreSQL dependencies are not installed. Please install with 'pip install cognee\"[postgres]\"' or 'pip install cognee\"[postgres-binary]\"' to use PGVector functionality." + ) return PGVectorAdapter( connection_string, diff --git a/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py b/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py index 0184ec3ee..0c93f81e7 100644 --- a/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py +++ b/cognee/infrastructure/databases/vector/lancedb/LanceDBAdapter.py @@ -205,9 +205,12 @@ class LanceDBAdapter(VectorDBInterface): collection = await self.get_collection(collection_name) if len(data_point_ids) == 1: - results = await collection.query().where(f"id = '{data_point_ids[0]}'").to_pandas() + results = await collection.query().where(f"id = '{data_point_ids[0]}'") else: - results = await collection.query().where(f"id IN {tuple(data_point_ids)}").to_pandas() + results = await collection.query().where(f"id IN {tuple(data_point_ids)}") + + # Convert query results to list format + results_list = results.to_list() if hasattr(results, "to_list") else list(results) return [ ScoredResult( @@ -215,7 +218,7 @@ class LanceDBAdapter(VectorDBInterface): payload=result["payload"], score=0, ) - for result in results.to_dict("index").values() + for result in results_list ] async def search( @@ -242,9 +245,7 @@ class LanceDBAdapter(VectorDBInterface): if limit == 0: return [] - results = await collection.vector_search(query_vector).limit(limit).to_pandas() - - result_values = list(results.to_dict("index").values()) + result_values = await collection.vector_search(query_vector).limit(limit).to_list() if not result_values: return [] diff --git a/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py b/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py index 4dfd9792f..d20d7d519 100644 --- a/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py +++ b/cognee/infrastructure/databases/vector/pgvector/PGVectorAdapter.py @@ -9,7 +9,6 @@ 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.shared.logging_utils import get_logger from cognee.infrastructure.engine import DataPoint from cognee.infrastructure.engine.utils import parse_id diff --git a/cognee/infrastructure/files/storage/S3FileStorage.py b/cognee/infrastructure/files/storage/S3FileStorage.py index ca2a73291..4c986bbe9 100644 --- a/cognee/infrastructure/files/storage/S3FileStorage.py +++ b/cognee/infrastructure/files/storage/S3FileStorage.py @@ -1,6 +1,5 @@ import os -import s3fs -from typing import BinaryIO, Union +from typing import BinaryIO, Union, TYPE_CHECKING from contextlib import asynccontextmanager from cognee.infrastructure.files.storage.s3_config import get_s3_config @@ -8,17 +7,27 @@ from cognee.infrastructure.utils.run_async import run_async from cognee.infrastructure.files.storage.FileBufferedReader import FileBufferedReader from .storage import Storage +if TYPE_CHECKING: + import s3fs + class S3FileStorage(Storage): """ - Manage local file storage operations such as storing, retrieving, and managing files on - the filesystem. + Manage S3 file storage operations such as storing, retrieving, and managing files on + S3-compatible storage. """ storage_path: str - s3: s3fs.S3FileSystem + s3: "s3fs.S3FileSystem" def __init__(self, storage_path: str): + try: + import s3fs + except ImportError: + raise ImportError( + 's3fs is required for S3FileStorage. Install it with: pip install cognee"[aws]"' + ) + self.storage_path = storage_path s3_config = get_s3_config() if s3_config.aws_access_key_id is not None and s3_config.aws_secret_access_key is not None: diff --git a/cognee/infrastructure/files/utils/open_data_file.py b/cognee/infrastructure/files/utils/open_data_file.py index 171f5deb7..ad8a6b63e 100644 --- a/cognee/infrastructure/files/utils/open_data_file.py +++ b/cognee/infrastructure/files/utils/open_data_file.py @@ -4,7 +4,6 @@ from urllib.parse import urlparse from contextlib import asynccontextmanager from cognee.infrastructure.files.utils.get_data_file_path import get_data_file_path -from cognee.infrastructure.files.storage.S3FileStorage import S3FileStorage from cognee.infrastructure.files.storage.LocalFileStorage import LocalFileStorage @@ -23,23 +22,17 @@ async def open_data_file(file_path: str, mode: str = "rb", encoding: str = None, yield file elif file_path.startswith("s3://"): + try: + from cognee.infrastructure.files.storage.S3FileStorage import S3FileStorage + except ImportError: + raise ImportError( + "S3 dependencies are not installed. Please install with 'pip install cognee\"[aws]\"' to use S3 functionality." + ) + normalized_url = get_data_file_path(file_path) s3_dir_path = os.path.dirname(normalized_url) s3_filename = os.path.basename(normalized_url) - # if "/" in s3_path: - # s3_dir = "/".join(s3_path.split("/")[:-1]) - # s3_filename = s3_path.split("/")[-1] - # else: - # s3_dir = "" - # s3_filename = s3_path - - # Extract filesystem path from S3 URL structure - # file_dir_path = ( - # f"s3://{parsed_url.netloc}/{s3_dir}" if s3_dir else f"s3://{parsed_url.netloc}" - # ) - # file_name = s3_filename - file_storage = S3FileStorage(s3_dir_path) async with file_storage.open(s3_filename, mode=mode, **kwargs) as file: diff --git a/cognee/infrastructure/llm/config.py b/cognee/infrastructure/llm/config.py index 495b583d6..6658a6251 100644 --- a/cognee/infrastructure/llm/config.py +++ b/cognee/infrastructure/llm/config.py @@ -1,9 +1,13 @@ import os -from typing import Optional, ClassVar +from typing import Optional, ClassVar, Any from functools import lru_cache from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import model_validator -from baml_py import ClientRegistry + +try: + from baml_py import ClientRegistry +except ImportError: + ClientRegistry = None class LLMConfig(BaseSettings): @@ -65,27 +69,36 @@ class LLMConfig(BaseSettings): fallback_endpoint: str = "" fallback_model: str = "" - baml_registry: ClassVar[ClientRegistry] = ClientRegistry() + baml_registry: Optional[Any] = None model_config = SettingsConfigDict(env_file=".env", extra="allow") def model_post_init(self, __context) -> None: """Initialize the BAML registry after the model is created.""" - raw_options = { - "model": self.baml_llm_model, - "temperature": self.baml_llm_temperature, - "api_key": self.baml_llm_api_key, - "base_url": self.baml_llm_endpoint, - "api_version": self.baml_llm_api_version, - } + # Check if BAML is selected as structured output framework but not available + if self.structured_output_framework.lower() == "baml" and ClientRegistry is None: + raise ImportError( + "BAML is selected as structured output framework but not available. " + "Please install with 'pip install cognee\"[baml]\"' to use BAML extraction features." + ) + elif self.structured_output_framework.lower() == "baml" and ClientRegistry is not None: + self.baml_registry = ClientRegistry() - # Note: keep the item only when the value is not None or an empty string (they would override baml default values) - options = {k: v for k, v in raw_options.items() if v not in (None, "")} - self.baml_registry.add_llm_client( - name=self.baml_llm_provider, provider=self.baml_llm_provider, options=options - ) - # Sets the primary client - self.baml_registry.set_primary(self.baml_llm_provider) + raw_options = { + "model": self.baml_llm_model, + "temperature": self.baml_llm_temperature, + "api_key": self.baml_llm_api_key, + "base_url": self.baml_llm_endpoint, + "api_version": self.baml_llm_api_version, + } + + # Note: keep the item only when the value is not None or an empty string (they would override baml default values) + options = {k: v for k, v in raw_options.items() if v not in (None, "")} + self.baml_registry.add_llm_client( + name=self.baml_llm_provider, provider=self.baml_llm_provider, options=options + ) + # Sets the primary client + self.baml_registry.set_primary(self.baml_llm_provider) @model_validator(mode="after") def ensure_env_vars_for_ollama(self) -> "LLMConfig": diff --git a/cognee/infrastructure/llm/structured_output_framework/baml/baml_src/extraction/acreate_structured_output.py b/cognee/infrastructure/llm/structured_output_framework/baml/baml_src/extraction/acreate_structured_output.py index 8efcce23d..6ef27e51d 100644 --- a/cognee/infrastructure/llm/structured_output_framework/baml/baml_src/extraction/acreate_structured_output.py +++ b/cognee/infrastructure/llm/structured_output_framework/baml/baml_src/extraction/acreate_structured_output.py @@ -53,7 +53,8 @@ async def acreate_structured_output( # Transform BAML response to proper pydantic reponse model if response_model is str: - return str(result) + # Note: when a response model is set to string in python, result is stored in text property in the BAML response model + return str(result.text) return response_model.model_validate(result.dict()) diff --git a/cognee/modules/ingestion/data_types/TextData.py b/cognee/modules/ingestion/data_types/TextData.py index 7c2364a5a..90d5335b5 100644 --- a/cognee/modules/ingestion/data_types/TextData.py +++ b/cognee/modules/ingestion/data_types/TextData.py @@ -1,7 +1,6 @@ from typing import BinaryIO from contextlib import asynccontextmanager import hashlib -from cognee.infrastructure.data.utils.extract_keywords import extract_keywords from .IngestionData import IngestionData diff --git a/cognee/modules/visualization/cognee_network_visualization.py b/cognee/modules/visualization/cognee_network_visualization.py index dde2fe98d..bbdbc0019 100644 --- a/cognee/modules/visualization/cognee_network_visualization.py +++ b/cognee/modules/visualization/cognee_network_visualization.py @@ -1,6 +1,5 @@ import os import json -import networkx from cognee.shared.logging_utils import get_logger from cognee.infrastructure.files.storage.LocalFileStorage import LocalFileStorage @@ -9,6 +8,8 @@ logger = get_logger() async def cognee_network_visualization(graph_data, destination_file_path: str = None): + import networkx + nodes_data, edges_data = graph_data G = networkx.DiGraph() @@ -104,7 +105,7 @@ async def cognee_network_visualization(graph_data, destination_file_path: str = .nodes circle { stroke: white; stroke-width: 0.5px; filter: drop-shadow(0 0 5px rgba(255,255,255,0.3)); } .node-label { font-size: 5px; font-weight: bold; fill: white; text-anchor: middle; dominant-baseline: middle; font-family: 'Inter', sans-serif; pointer-events: none; } .edge-label { font-size: 3px; fill: rgba(255, 255, 255, 0.7); text-anchor: middle; dominant-baseline: middle; font-family: 'Inter', sans-serif; pointer-events: none; } - + .tooltip { position: absolute; text-align: left; @@ -166,7 +167,7 @@ async def cognee_network_visualization(graph_data, destination_file_path: str = // Create tooltip content for edge var content = "Edge Information
"; content += "Relationship: " + d.relation + "
"; - + // Show all weights if (d.all_weights && Object.keys(d.all_weights).length > 0) { content += "Weights:
"; @@ -176,23 +177,23 @@ async def cognee_network_visualization(graph_data, destination_file_path: str = } else if (d.weight !== null && d.weight !== undefined) { content += "Weight: " + d.weight + "
"; } - + if (d.relationship_type) { content += "Type: " + d.relationship_type + "
"; } - + // Add other edge properties if (d.edge_info) { Object.keys(d.edge_info).forEach(function(key) { - if (key !== 'weight' && key !== 'weights' && key !== 'relationship_type' && - key !== 'source_node_id' && key !== 'target_node_id' && - key !== 'relationship_name' && key !== 'updated_at' && + if (key !== 'weight' && key !== 'weights' && key !== 'relationship_type' && + key !== 'source_node_id' && key !== 'target_node_id' && + key !== 'relationship_name' && key !== 'updated_at' && !key.startsWith('weight_')) { content += key + ": " + d.edge_info[key] + "
"; } }); } - + tooltip.html(content) .style("left", (d3.event.pageX + 10) + "px") .style("top", (d3.event.pageY - 10) + "px") diff --git a/cognee/shared/utils.py b/cognee/shared/utils.py index 6ecdbc8f1..90fbb9cd4 100644 --- a/cognee/shared/utils.py +++ b/cognee/shared/utils.py @@ -4,7 +4,6 @@ import os import ssl import requests from datetime import datetime, timezone -import matplotlib.pyplot as plt import http.server import socketserver from threading import Thread @@ -30,37 +29,6 @@ def create_secure_ssl_context() -> ssl.SSLContext: return ssl.create_default_context() -def get_entities(tagged_tokens): - import nltk - - nltk.download("maxent_ne_chunker", quiet=True) - - from nltk.chunk import ne_chunk - - return ne_chunk(tagged_tokens) - - -def extract_pos_tags(sentence): - """Extract Part-of-Speech (POS) tags for words in a sentence.""" - import nltk - - # Ensure that the necessary NLTK resources are downloaded - nltk.download("words", quiet=True) - nltk.download("punkt", quiet=True) - nltk.download("averaged_perceptron_tagger", quiet=True) - - from nltk.tag import pos_tag - from nltk.tokenize import word_tokenize - - # Tokenize the sentence into words - tokens = word_tokenize(sentence) - - # Tag each word with its corresponding POS tag - pos_tags = pos_tag(tokens) - - return pos_tags - - def get_anonymous_id(): """Creates or reads a anonymous user id""" tracking_id = os.getenv("TRACKING_ID", None) diff --git a/cognee/tasks/graph/infer_data_ontology.py b/cognee/tasks/graph/infer_data_ontology.py deleted file mode 100644 index 93b02db9f..000000000 --- a/cognee/tasks/graph/infer_data_ontology.py +++ /dev/null @@ -1,309 +0,0 @@ -# PROPOSED TO BE DEPRECATED - -"""This module contains the OntologyEngine class which is responsible for adding graph ontology from a JSON or CSV file.""" - -import csv -import json -from cognee.shared.logging_utils import get_logger -from datetime import datetime, timezone -from fastapi import status -from typing import Any, Dict, List, Optional, Union, Type - -import aiofiles -import pandas as pd -from pydantic import BaseModel - -from cognee.modules.graph.exceptions import EntityNotFoundError -from cognee.modules.ingestion.exceptions import IngestionError - -from cognee.infrastructure.data.chunking.config import get_chunk_config -from cognee.infrastructure.data.chunking.get_chunking_engine import get_chunk_engine -from cognee.infrastructure.databases.graph.get_graph_engine import get_graph_engine -from cognee.infrastructure.files.utils.extract_text_from_file import extract_text_from_file -from cognee.infrastructure.files.utils.guess_file_type import guess_file_type, FileTypeException -from cognee.modules.data.methods.add_model_class_to_graph import ( - add_model_class_to_graph, -) -from cognee.tasks.graph.models import NodeModel, GraphOntology -from cognee.shared.data_models import KnowledgeGraph -from cognee.modules.engine.utils import generate_node_id, generate_node_name -from cognee.infrastructure.llm.LLMGateway import LLMGateway - -logger = get_logger("task:infer_data_ontology") - - -async def extract_ontology(content: str, response_model: Type[BaseModel]): - """ - Extracts structured ontology from the provided content using a pre-defined LLM client. - - This asynchronous function retrieves a system prompt from a file and utilizes an LLM - client to create a structured output based on the input content and specified response - model. - - Parameters: - ----------- - - - content (str): The content from which to extract the ontology. - - response_model (Type[BaseModel]): The model that defines the structure of the - output ontology. - - Returns: - -------- - - The structured ontology extracted from the content. - """ - - system_prompt = LLMGateway.read_query_prompt("extract_ontology.txt") - - ontology = await LLMGateway.acreate_structured_output(content, system_prompt, response_model) - - return ontology - - -class OntologyEngine: - """ - Manage ontology data and operations for graph structures, providing methods for data - loading, flattening models, and adding ontological relationships to a graph database. - - Public methods: - - - flatten_model - - recursive_flatten - - load_data - - add_graph_ontology - """ - - async def flatten_model( - self, model: NodeModel, parent_id: Optional[str] = None - ) -> Dict[str, Any]: - """ - Flatten the model to a dictionary including optional parent ID and relationship details - if available. - - Parameters: - ----------- - - - model (NodeModel): The NodeModel instance to flatten. - - parent_id (Optional[str]): An optional ID of the parent node for hierarchical - purposes. (default None) - - Returns: - -------- - - - Dict[str, Any]: A dictionary representation of the model with flattened - attributes. - """ - result = model.dict() - result["parent_id"] = parent_id - if model.default_relationship: - result.update( - { - "relationship_type": model.default_relationship.type, - "relationship_source": model.default_relationship.source, - "relationship_target": model.default_relationship.target, - } - ) - return result - - async def recursive_flatten( - self, items: Union[List[Dict[str, Any]], Dict[str, Any]], parent_id: Optional[str] = None - ) -> List[Dict[str, Any]]: - """ - Recursively flatten a hierarchical structure of models into a flat list of dictionaries. - - Parameters: - ----------- - - - items (Union[List[Dict[str, Any]], Dict[str, Any]]): A list or dictionary - containing models to flatten. - - parent_id (Optional[str]): An optional ID of the parent node to maintain hierarchy - during flattening. (default None) - - Returns: - -------- - - - List[Dict[str, Any]]: A flat list of dictionaries representing the hierarchical - model structure. - """ - flat_list = [] - - if isinstance(items, list): - for item in items: - flat_list.extend(await self.recursive_flatten(item, parent_id)) - elif isinstance(items, dict): - model = NodeModel.model_validate(items) - flat_list.append(await self.flatten_model(model, parent_id)) - for child in model.children: - flat_list.extend(await self.recursive_flatten(child, model.node_id)) - return flat_list - - async def load_data(self, file_path: str) -> Union[List[Dict[str, Any]], Dict[str, Any]]: - """ - Load data from a specified JSON or CSV file and return it in a structured format. - - Parameters: - ----------- - - - file_path (str): The path to the file to load data from. - - Returns: - -------- - - - Union[List[Dict[str, Any]], Dict[str, Any]]: Parsed data from the file as either a - list of dictionaries or a single dictionary depending on content type. - """ - try: - if file_path.endswith(".json"): - async with aiofiles.open(file_path, mode="r") as f: - data = await f.read() - return json.loads(data) - elif file_path.endswith(".csv"): - async with aiofiles.open(file_path, mode="r") as f: - content = await f.read() - reader = csv.DictReader(content.splitlines()) - return list(reader) - else: - raise IngestionError(message="Unsupported file format") - except Exception as e: - raise IngestionError( - message=f"Failed to load data from {file_path}: {e}", - status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, - ) - - async def add_graph_ontology(self, file_path: str = None, documents: list = None): - """ - Add graph ontology from a JSON or CSV file, or infer relationships from provided - document content. Raise exceptions for invalid file types or missing entities. - - Parameters: - ----------- - - - file_path (str): Optional path to a file containing data to be loaded. (default - None) - - documents (list): Optional list of document objects for content extraction if no - file path is provided. (default None) - """ - if file_path is None: - initial_chunks_and_ids = [] - - chunk_config = get_chunk_config() - chunk_engine = get_chunk_engine() - chunk_strategy = chunk_config.chunk_strategy - - for base_file in documents: - with open(base_file.raw_data_location, "rb") as file: - try: - file_type = guess_file_type(file) - text = extract_text_from_file(file, file_type) - - subchunks, chunks_with_ids = chunk_engine.chunk_data( - chunk_strategy, - text, - chunk_config.chunk_size, - chunk_config.chunk_overlap, - ) - - if chunks_with_ids[0][0] == 1: - initial_chunks_and_ids.append({base_file.id: chunks_with_ids}) - - except FileTypeException: - logger.warning( - "File (%s) has an unknown file type. We are skipping it.", file["id"] - ) - - ontology = await extract_ontology(str(initial_chunks_and_ids), GraphOntology) - graph_client = await get_graph_engine() - - await graph_client.add_nodes( - [ - ( - node.id, - dict( - uuid=generate_node_id(node.id), - name=generate_node_name(node.name), - type=generate_node_id(node.id), - description=node.description, - updated_at=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S"), - ), - ) - for node in ontology.nodes - ] - ) - - await graph_client.add_edges( - ( - generate_node_id(edge.source_id), - generate_node_id(edge.target_id), - edge.relationship_type, - dict( - source_node_id=generate_node_id(edge.source_id), - target_node_id=generate_node_id(edge.target_id), - relationship_name=edge.relationship_type, - updated_at=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S"), - ), - ) - for edge in ontology.edges - ) - - else: - dataset_level_information = documents[0][1] - - # Extract the list of valid IDs from the explanations - valid_ids = {item["id"] for item in dataset_level_information} - try: - data = await self.load_data(file_path) - flt_ontology = await self.recursive_flatten(data) - df = pd.DataFrame(flt_ontology) - graph_client = await get_graph_engine() - - for _, row in df.iterrows(): - node_data = row.to_dict() - node_id = node_data.pop("node_id", None) - if node_id in valid_ids: - await graph_client.add_node(node_id, node_data) - if node_id not in valid_ids: - raise EntityNotFoundError( - message=f"Node ID {node_id} not found in the dataset" - ) - if pd.notna(row.get("relationship_source")) and pd.notna( - row.get("relationship_target") - ): - await graph_client.add_edge( - row["relationship_source"], - row["relationship_target"], - relationship_name=row["relationship_type"], - edge_properties={ - "source_node_id": row["relationship_source"], - "target_node_id": row["relationship_target"], - "relationship_name": row["relationship_type"], - "updated_at": datetime.now(timezone.utc).strftime( - "%Y-%m-%d %H:%M:%S" - ), - }, - ) - - return - except Exception as e: - raise RuntimeError(f"Failed to add graph ontology from {file_path}: {e}") from e - - -async def infer_data_ontology(documents, ontology_model=KnowledgeGraph, root_node_id=None): - """ - Infer data ontology from provided documents and optionally add it to a graph. - - Parameters: - ----------- - - - documents: The documents from which to infer the ontology. - - ontology_model: The ontology model to use for the inference, defaults to - KnowledgeGraph. (default KnowledgeGraph) - - root_node_id: An optional root node identifier for the ontology. (default None) - """ - if ontology_model == KnowledgeGraph: - ontology_engine = OntologyEngine() - root_node_id = await ontology_engine.add_graph_ontology(documents=documents) - else: - graph_engine = await get_graph_engine() - await add_model_class_to_graph(ontology_model, graph_engine) - - yield (documents, root_node_id) diff --git a/poetry.lock b/poetry.lock index 346c1929e..6a11d967c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4,9 +4,10 @@ name = "aiobotocore" version = "2.24.2" description = "Async client for aws services using botocore and aiohttp" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"aws\"" files = [ {file = "aiobotocore-2.24.2-py3-none-any.whl", hash = "sha256:808c63b2bd344b91e2f2acb874831118a9f53342d248acd16a68455a226e283a"}, {file = "aiobotocore-2.24.2.tar.gz", hash = "sha256:dfb21bdb2610e8de4d22f401e91a24d50f1330a302d03c62c485757becd439a9"}, @@ -164,9 +165,10 @@ speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (> name = "aioitertools" version = "0.12.0" description = "itertools and builtins for AsyncIO and mixed iterables" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] +markers = "extra == \"aws\"" files = [ {file = "aioitertools-0.12.0-py3-none-any.whl", hash = "sha256:fc1f5fac3d737354de8831cbba3eb04f79dd649d8f3afb4c5b114925e662a796"}, {file = "aioitertools-0.12.0.tar.gz", hash = "sha256:c2a9055b4fbb7705f561b9d86053e8af5d10cc845d22c32008c43490b2d8dd6b"}, @@ -576,9 +578,10 @@ dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)" name = "backoff" version = "2.2.1" description = "Function decoration for backoff and retry" -optional = false +optional = true python-versions = ">=3.7,<4.0" groups = ["main"] +markers = "extra == \"deepeval\" or extra == \"posthog\" or extra == \"chromadb\" or extra == \"docs\" or extra == \"monitoring\"" files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, @@ -609,9 +612,10 @@ extras = ["regex"] name = "baml-py" version = "0.206.0" description = "BAML python bindings (pyproject.toml)" -optional = false +optional = true python-versions = "*" groups = ["main"] +markers = "extra == \"baml\"" files = [ {file = "baml_py-0.206.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d9e95f0b481a18ae6936d720b8fc609baec4ea1eabbdde48f1536ffc94ebf39f"}, {file = "baml_py-0.206.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:0f698127da030b728c7aa2641c3164a3ab19779594019234361dd48f0784f195"}, @@ -759,9 +763,10 @@ css = ["tinycss2 (>=1.1.0,<1.5)"] name = "boto3" version = "1.40.18" description = "The AWS SDK for Python" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"neptune\" or extra == \"aws\"" files = [ {file = "boto3-1.40.18-py3-none-any.whl", hash = "sha256:daa776ba1251a7458c9d6c7627873d0c2460c8e8272d35759065580e9193700a"}, {file = "boto3-1.40.18.tar.gz", hash = "sha256:64301d39adecc154e3e595eaf0d4f28998ef0a5551f1d033aeac51a9e1a688e5"}, @@ -779,9 +784,10 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] name = "botocore" version = "1.40.18" description = "Low-level, data-driven core of boto 3." -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"neptune\" or extra == \"aws\"" files = [ {file = "botocore-1.40.18-py3-none-any.whl", hash = "sha256:57025c46ca00cf8cec25de07a759521bfbfb3036a0f69b272654a354615dc45f"}, {file = "botocore-1.40.18.tar.gz", hash = "sha256:afd69bdadd8c55cc89d69de0799829e555193a352d87867f746e19020271cc0f"}, @@ -1151,7 +1157,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 os_name == \"nt\" or extra == \"llama-index\" or extra == \"dev\") and (platform_system == \"Windows\" or sys_platform == \"win32\" or extra == \"llama-index\" or extra == \"dev\" or extra == \"chromadb\") 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\" or os_name == \"nt\") and (platform_system == \"Windows\" or sys_platform == \"win32\" or extra == \"llama-index\" or extra == \"dev\" or extra == \"chromadb\")" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -1195,10 +1201,10 @@ test = ["pytest"] name = "contourpy" version = "1.3.2" description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false +optional = true python-versions = ">=3.10" groups = ["main"] -markers = "python_version == \"3.10\"" +markers = "python_version == \"3.10\" and extra == \"evals\"" files = [ {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, @@ -1273,10 +1279,10 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" name = "contourpy" version = "1.3.3" description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false +optional = true python-versions = ">=3.11" groups = ["main"] -markers = "python_version >= \"3.11\"" +markers = "python_version >= \"3.11\" and extra == \"evals\"" files = [ {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"}, {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"}, @@ -1577,9 +1583,10 @@ files = [ name = "cycler" version = "0.12.1" description = "Composable style cycles" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] +markers = "extra == \"evals\"" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -1873,9 +1880,10 @@ files = [ name = "dlt" version = "1.16.0" description = "dlt is an open-source python-first scalable data loading library that does not require any backend to run." -optional = false +optional = true python-versions = "<3.15,>=3.9.2" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "dlt-1.16.0-py3-none-any.whl", hash = "sha256:882ef281bbdc32eaba3b5ced984a8ed7014d8978fd7ab4a58b198023c8938c9f"}, {file = "dlt-1.16.0.tar.gz", hash = "sha256:113d17a3f27aa4f41c3438b0b032a68d30db195d8415a471ba43a9502e971a21"}, @@ -2180,10 +2188,9 @@ sqlalchemy = {version = ">=2.0.0,<2.1.0", extras = ["asyncio"]} name = "fastembed" version = "0.6.0" description = "Fast, light, accurate library built for retrieval embedding generation" -optional = true +optional = false python-versions = ">=3.9.0" groups = ["main"] -markers = "extra == \"codegraph\" and python_version <= \"3.12\"" files = [ {file = "fastembed-0.6.0-py3-none-any.whl", hash = "sha256:a08385e9388adea0529a586004f2d588c9787880a510e4e5d167127a11e75328"}, {file = "fastembed-0.6.0.tar.gz", hash = "sha256:5c9ead25f23449535b07243bbe1f370b820dcc77ec2931e61674e3fe7ff24733"}, @@ -2196,8 +2203,12 @@ mmh3 = ">=4.1.0,<6.0.0" numpy = [ {version = ">=1.21", markers = "python_version >= \"3.10\" and python_version < \"3.12\""}, {version = ">=1.26", markers = "python_version == \"3.12\""}, + {version = ">=2.1.0", markers = "python_version >= \"3.13\""}, +] +onnxruntime = [ + {version = ">=1.17.0,<1.20.0 || >1.20.0", markers = "python_version >= \"3.10\" and python_version < \"3.13\""}, + {version = ">1.20.0", markers = "python_version >= \"3.13\""}, ] -onnxruntime = {version = ">=1.17.0,<1.20.0 || >1.20.0", markers = "python_version >= \"3.10\" and python_version < \"3.13\""} pillow = ">=10.3.0,<12.0.0" py-rust-stemmers = ">=0.1.0,<0.2.0" requests = ">=2.31,<3.0" @@ -2294,9 +2305,10 @@ files = [ name = "fonttools" version = "4.60.0" description = "Tools to manipulate font files" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"evals\"" files = [ {file = "fonttools-4.60.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:151282a235c36024168c21c02193e939e8b28c73d5fa0b36ae1072671d8fa134"}, {file = "fonttools-4.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3f32cc42d485d9b1546463b9a7a92bdbde8aef90bac3602503e04c2ddb27e164"}, @@ -2583,9 +2595,10 @@ dev = ["flake8", "markdown", "twine", "wheel"] name = "gitdb" version = "4.0.12" description = "Git Object Database" -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"dlt\" or extra == \"dev\"" files = [ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, @@ -2598,9 +2611,10 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.45" description = "GitPython is a Python library used to interact with Git repositories" -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"dlt\" or extra == \"dev\"" files = [ {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, @@ -2617,9 +2631,10 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3. name = "giturlparse" version = "0.12.0" description = "A Git URL parsing module (supports parsing and rewriting)" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "giturlparse-0.12.0-py2.py3-none-any.whl", hash = "sha256:412b74f2855f1da2fefa89fd8dde62df48476077a72fc19b62039554d27360eb"}, {file = "giturlparse-0.12.0.tar.gz", hash = "sha256:c0fff7c21acc435491b1779566e038757a205c1ffdcb47e4f81ea52ad8c3859a"}, @@ -3112,9 +3127,10 @@ hyperframe = ">=6.1,<7" name = "hexbytes" version = "1.3.1" description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" -optional = false +optional = true python-versions = "<4,>=3.8" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "hexbytes-1.3.1-py3-none-any.whl", hash = "sha256:da01ff24a1a9a2b1881c4b85f0e9f9b0f51b526b379ffa23832ae7899d29c2c7"}, {file = "hexbytes-1.3.1.tar.gz", hash = "sha256:a657eebebdfe27254336f98d8af6e2236f3f83aed164b87466b6cf6c5f5a4765"}, @@ -3373,9 +3389,10 @@ pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_ve name = "humanize" version = "4.13.0" description = "Python humanize utilities" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "humanize-4.13.0-py3-none-any.whl", hash = "sha256:b810820b31891813b1673e8fec7f1ed3312061eab2f26e3fa192c393d11ed25f"}, {file = "humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0"}, @@ -3837,9 +3854,10 @@ files = [ name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"neptune\" or extra == \"aws\"" files = [ {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, @@ -3905,9 +3923,10 @@ jsonpointer = ">=1.9" name = "jsonpath-ng" version = "1.7.0" description = "A final implementation of JSONPath for Python that aims to be standard compliant, including arithmetic and binary comparison operators and providing clear AST for metaprogramming." -optional = false +optional = true python-versions = "*" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, ] @@ -4215,9 +4234,10 @@ test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-v name = "kiwisolver" version = "1.4.9" description = "A fast implementation of the Cassowary constraint solver" -optional = false +optional = true python-versions = ">=3.10" groups = ["main"] +markers = "extra == \"evals\"" files = [ {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b"}, {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f"}, @@ -4558,9 +4578,10 @@ six = "*" name = "langfuse" version = "2.60.10" description = "A client library for accessing langfuse" -optional = false +optional = true python-versions = "<4.0,>=3.9" groups = ["main"] +markers = "extra == \"monitoring\"" files = [ {file = "langfuse-2.60.10-py3-none-any.whl", hash = "sha256:815c6369194aa5b2a24f88eb9952f7c3fc863272c41e90642a71f3bc76f4a11f"}, {file = "langfuse-2.60.10.tar.gz", hash = "sha256:a26d0d927a28ee01b2d12bb5b862590b643cc4e60a28de6e2b0c2cfff5dbfc6a"}, @@ -4779,10 +4800,9 @@ server = ["starlette (>=0.39.0)", "uvicorn (>=0.32.0)"] name = "loguru" version = "0.7.3" description = "Python logging made (stupidly) simple" -optional = true +optional = false python-versions = "<4.0,>=3.5" groups = ["main"] -markers = "extra == \"codegraph\" and python_version <= \"3.12\"" files = [ {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, @@ -5133,9 +5153,10 @@ tests = ["pytest", "simplejson"] name = "matplotlib" version = "3.10.6" description = "Python plotting package" -optional = false +optional = true python-versions = ">=3.10" groups = ["main"] +markers = "extra == \"evals\"" files = [ {file = "matplotlib-3.10.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bc7316c306d97463a9866b89d5cc217824e799fa0de346c8f68f4f3d27c8693d"}, {file = "matplotlib-3.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d00932b0d160ef03f59f9c0e16d1e3ac89646f7785165ce6ad40c842db16cc2e"}, @@ -5494,10 +5515,9 @@ mkdocstrings = ">=0.26" name = "mmh3" version = "5.2.0" description = "Python extension for MurmurHash (MurmurHash3), a set of fast and robust hash functions." -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"codegraph\" or extra == \"chromadb\") and (python_version <= \"3.12\" or extra == \"chromadb\")" files = [ {file = "mmh3-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:81c504ad11c588c8629536b032940f2a359dda3b6cbfd4ad8f74cb24dcd1b0bc"}, {file = "mmh3-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b898cecff57442724a0f52bf42c2de42de63083a91008fb452887e372f9c328"}, @@ -6095,9 +6115,10 @@ test-extras = ["pytest-mpl", "pytest-randomly"] name = "nltk" version = "3.9.1" description = "Natural Language Toolkit" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] +markers = "extra == \"llama-index\" or extra == \"docs\"" files = [ {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"}, {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"}, @@ -6648,10 +6669,10 @@ test = ["pytest (>=8.3.0,<8.4.0)", "pytest-benchmark (>=5.1.0,<5.2.0)", "pytest- name = "orjson" version = "3.11.3" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(sys_platform != \"emscripten\" or platform_python_implementation != \"PyPy\" or extra == \"chromadb\") and (sys_platform != \"emscripten\" or extra == \"neptune\" or extra == \"langchain\" or extra == \"chromadb\")" +markers = "(sys_platform != \"emscripten\" or platform_python_implementation != \"PyPy\" or extra == \"chromadb\") and (sys_platform != \"emscripten\" or extra == \"neptune\" or extra == \"langchain\" or extra == \"chromadb\") and (platform_python_implementation != \"PyPy\" or extra == \"chromadb\" or extra == \"dlt\") and (extra == \"neptune\" or extra == \"langchain\" or extra == \"chromadb\" or extra == \"dlt\")" files = [ {file = "orjson-3.11.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:29cb1f1b008d936803e2da3d7cba726fc47232c45df531b29edf0b232dd737e7"}, {file = "orjson-3.11.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97dceed87ed9139884a55db8722428e27bd8452817fbf1869c58b49fecab1120"}, @@ -6783,9 +6804,10 @@ lint = ["black"] name = "pandas" version = "2.3.2" description = "Powerful data structures for data analysis, time series, and statistics" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"docs\" or extra == \"evals\"" files = [ {file = "pandas-2.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52bc29a946304c360561974c6542d1dd628ddafa69134a7131fdfd6a5d7a1a35"}, {file = "pandas-2.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:220cc5c35ffaa764dd5bb17cf42df283b5cb7fdf49e10a7b053a06c9cb48ee2b"}, @@ -6913,9 +6935,10 @@ files = [ name = "pathvalidate" version = "3.3.1" description = "pathvalidate is a Python library to sanitize/validate a string such as filenames/file-paths/etc." -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f"}, {file = "pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177"}, @@ -6930,9 +6953,10 @@ test = ["Faker (>=1.0.8)", "allpairspy (>=2)", "click (>=6.2)", "pytest (>=6.0.1 name = "pendulum" version = "3.1.0" description = "Python datetimes made easy" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "pendulum-3.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:aa545a59e6517cf43597455a6fb44daa4a6e08473d67a7ad34e4fa951efb9620"}, {file = "pendulum-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:299df2da6c490ede86bb8d58c65e33d7a2a42479d21475a54b467b03ccb88531"}, @@ -7210,9 +7234,10 @@ kaleido = ["kaleido (>=1.0.0)"] name = "pluggy" version = "1.6.0" description = "plugin and hook calling mechanisms for python" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"deepeval\" or extra == \"dev\" or extra == \"dlt\"" files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -7226,9 +7251,10 @@ testing = ["coverage", "pytest", "pytest-benchmark"] name = "ply" version = "3.11" description = "Python Lex & Yacc" -optional = false +optional = true python-versions = "*" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, @@ -7672,10 +7698,9 @@ bcrypt = ["bcrypt (>=4.1.2,<5)"] name = "py-rust-stemmers" version = "0.1.5" description = "Fast and parallel snowball stemmer" -optional = true +optional = false python-versions = "*" groups = ["main"] -markers = "extra == \"codegraph\" and python_version <= \"3.12\"" files = [ {file = "py_rust_stemmers-0.1.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bfbd9034ae00419ff2154e33b8f5b4c4d99d1f9271f31ed059e5c7e9fa005844"}, {file = "py_rust_stemmers-0.1.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7162ae66df2bb0fc39b350c24a049f5f5151c03c046092ba095c2141ec223a2"}, @@ -8273,66 +8298,6 @@ files = [ [package.extras] dev = ["build", "flake8", "mypy", "pytest", "twine"] -[[package]] -name = "pyside6" -version = "6.9.2" -description = "Python bindings for the Qt cross-platform application and UI framework" -optional = true -python-versions = "<3.14,>=3.9" -groups = ["main"] -markers = "extra == \"gui\"" -files = [ - {file = "pyside6-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:71245c76bfbe5c41794ffd8546730ec7cc869d4bbe68535639e026e4ef8a7714"}, - {file = "pyside6-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:64a9e2146e207d858e00226f68d7c1b4ab332954742a00dcabb721bb9e4aa0cd"}, - {file = "pyside6-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a78fad16241a1f2ed0fa0098cf3d621f591fc75b4badb7f3fa3959c9d861c806"}, - {file = "pyside6-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:d1afbf48f9a5612b9ee2dc7c384c1a65c08b5830ba5e7d01f66d82678e5459df"}, - {file = "pyside6-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:1499b1d7629ab92119118e2636b4ace836b25e457ddf01003fdca560560b8c0a"}, -] - -[package.dependencies] -PySide6_Addons = "6.9.2" -PySide6_Essentials = "6.9.2" -shiboken6 = "6.9.2" - -[[package]] -name = "pyside6-addons" -version = "6.9.2" -description = "Python bindings for the Qt cross-platform application and UI framework (Addons)" -optional = true -python-versions = "<3.14,>=3.9" -groups = ["main"] -markers = "extra == \"gui\"" -files = [ - {file = "pyside6_addons-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:7019fdcc0059626eb1608b361371f4dc8cb7f2d02f066908fd460739ff5a07cd"}, - {file = "pyside6_addons-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:24350e5415317f269e743d1f7b4933fe5f59d90894aa067676c9ce6bfe9e7988"}, - {file = "pyside6_addons-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:af8dee517de8d336735a6543f7dd496eb580e852c14b4d2304b890e2a29de499"}, - {file = "pyside6_addons-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:98d2413904ee4b2b754b077af7875fa6ec08468c01a6628a2c9c3d2cece4874f"}, - {file = "pyside6_addons-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:b430cae782ff1a99fb95868043557f22c31b30c94afb9cf73278584e220a2ab6"}, -] - -[package.dependencies] -PySide6_Essentials = "6.9.2" -shiboken6 = "6.9.2" - -[[package]] -name = "pyside6-essentials" -version = "6.9.2" -description = "Python bindings for the Qt cross-platform application and UI framework (Essentials)" -optional = true -python-versions = "<3.14,>=3.9" -groups = ["main"] -markers = "extra == \"gui\"" -files = [ - {file = "pyside6_essentials-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:713eb8dcbb016ff10e6fca129c1bf2a0fd8cfac979e689264e0be3b332f9398e"}, - {file = "pyside6_essentials-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:84b8ca4fa56506e2848bdb4c7a0851a5e7adcb916bef9bce25ce2eeb6c7002cc"}, - {file = "pyside6_essentials-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:d0f701503974bd51b408966539aa6956f3d8536e547ea8002fbfb3d77796bbc3"}, - {file = "pyside6_essentials-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:b2f746f795138ac63eb173f9850a6db293461a1b6ce22cf6dafac7d194a38951"}, - {file = "pyside6_essentials-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:ecd7b5cd9e271f397fb89a6357f4ec301d8163e50869c6c557f9ccc6bed42789"}, -] - -[package.dependencies] -shiboken6 = "6.9.2" - [[package]] name = "pysocks" version = "1.7.1" @@ -8626,9 +8591,10 @@ XlsxWriter = ">=0.5.7" name = "pytz" version = "2025.2" description = "World timezone definitions, modern and historical" -optional = false +optional = true python-versions = "*" groups = ["main"] +markers = "extra == \"neo4j\" or extra == \"graphiti\" or extra == \"docs\" or extra == \"evals\" or extra == \"dlt\"" files = [ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, @@ -8641,7 +8607,7 @@ description = "Python for Window Extensions" optional = false python-versions = "*" groups = ["main"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" +markers = "(sys_platform == \"win32\" or platform_system == \"Windows\") and (platform_python_implementation != \"PyPy\" or platform_system == \"Windows\" or extra == \"dlt\")" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, @@ -8868,19 +8834,6 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "qasync" -version = "0.27.1" -description = "Python library for using asyncio in Qt-based applications" -optional = true -python-versions = ">=3.8,<4.0" -groups = ["main"] -markers = "extra == \"gui\"" -files = [ - {file = "qasync-0.27.1-py3-none-any.whl", hash = "sha256:5d57335723bc7d9b328dadd8cb2ed7978640e4bf2da184889ce50ee3ad2602c7"}, - {file = "qasync-0.27.1.tar.gz", hash = "sha256:8dc768fd1ee5de1044c7c305eccf2d39d24d87803ea71189d4024fb475f4985f"}, -] - [[package]] name = "rapidfuzz" version = "3.14.1" @@ -9236,9 +9189,10 @@ requests = ">=2.0.1,<3.0.0" name = "requirements-parser" version = "0.13.0" description = "This is a small Python module for parsing Pip requirement files." -optional = false +optional = true python-versions = "<4.0,>=3.8" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "requirements_parser-0.13.0-py3-none-any.whl", hash = "sha256:2b3173faecf19ec5501971b7222d38f04cb45bb9d87d0ad629ca71e2e62ded14"}, {file = "requirements_parser-0.13.0.tar.gz", hash = "sha256:0843119ca2cb2331de4eb31b10d70462e39ace698fd660a915c247d2301a4418"}, @@ -9318,9 +9272,10 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "rich-argparse" version = "1.7.1" description = "Rich help formatters for argparse and optparse" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "rich_argparse-1.7.1-py3-none-any.whl", hash = "sha256:a8650b42e4a4ff72127837632fba6b7da40784842f08d7395eb67a9cbd7b4bf9"}, {file = "rich_argparse-1.7.1.tar.gz", hash = "sha256:d7a493cde94043e41ea68fb43a74405fa178de981bf7b800f7a3bd02ac5c27be"}, @@ -9544,9 +9499,10 @@ files = [ name = "s3fs" version = "2025.3.2" description = "Convenient Filesystem interface over S3" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"aws\"" files = [ {file = "s3fs-2025.3.2-py3-none-any.whl", hash = "sha256:81eae3f37b4b04bcc08845d7bcc607c6ca45878813ef7e6a28d77b2688417130"}, {file = "s3fs-2025.3.2.tar.gz", hash = "sha256:6798f896ec76dd3bfd8beb89f0bb7c5263cb2760e038bae0978505cd172a307c"}, @@ -9568,9 +9524,10 @@ boto3 = ["aiobotocore[boto3] (>=2.5.4,<3.0.0)"] name = "s3transfer" version = "0.13.1" description = "An Amazon S3 Transfer Manager" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"neptune\" or extra == \"aws\"" files = [ {file = "s3transfer-0.13.1-py3-none-any.whl", hash = "sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724"}, {file = "s3transfer-0.13.1.tar.gz", hash = "sha256:c3fdba22ba1bd367922f27ec8032d6a1cf5f10c934fb5d68cf60fd5a23d936cf"}, @@ -9827,9 +9784,10 @@ test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6 name = "semver" version = "3.0.4" description = "Python helper for Semantic Versioning (https://semver.org)" -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"}, {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"}, @@ -9857,9 +9815,10 @@ win32 = ["pywin32 ; sys_platform == \"win32\""] name = "sentry-sdk" version = "2.38.0" description = "Python client for Sentry (https://sentry.io)" -optional = false +optional = true python-versions = ">=3.6" groups = ["main"] +markers = "extra == \"deepeval\" or extra == \"monitoring\"" files = [ {file = "sentry_sdk-2.38.0-py2.py3-none-any.whl", hash = "sha256:2324aea8573a3fa1576df7fb4d65c4eb8d9929c8fa5939647397a07179eef8d0"}, {file = "sentry_sdk-2.38.0.tar.gz", hash = "sha256:792d2af45e167e2f8a3347143f525b9b6bac6f058fb2014720b40b84ccbeb985"}, @@ -9916,9 +9875,10 @@ unleash = ["UnleashClient (>=6.0.1)"] name = "setuptools" version = "80.9.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"notebook\" or extra == \"dev\" or extra == \"llama-index\" or extra == \"deepeval\" or extra == \"dlt\"" files = [ {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, @@ -9945,22 +9905,6 @@ files = [ {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] -[[package]] -name = "shiboken6" -version = "6.9.2" -description = "Python/C++ bindings helper module" -optional = true -python-versions = "<3.14,>=3.9" -groups = ["main"] -markers = "extra == \"gui\"" -files = [ - {file = "shiboken6-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:8bb1c4326330e53adeac98bfd9dcf57f5173a50318a180938dcc4825d9ca38da"}, - {file = "shiboken6-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3b54c0a12ea1b03b9dc5dcfb603c366e957dc75341bf7cb1cc436d0d848308ee"}, - {file = "shiboken6-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a5f5985938f5acb604c23536a0ff2efb3cccb77d23da91fbaff8fd8ded3dceb4"}, - {file = "shiboken6-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:68c33d565cd4732be762d19ff67dfc53763256bac413d392aa8598b524980bc4"}, - {file = "shiboken6-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:c5b827797b3d89d9b9a3753371ff533fcd4afc4531ca51a7c696952132098054"}, -] - [[package]] name = "sigtools" version = "4.0.1" @@ -9985,9 +9929,10 @@ tests = ["coverage", "mock", "repeated-test (>=2.2.1)", "sphinx"] name = "simplejson" version = "3.20.1" description = "Simple, fast, extensible JSON encoder/decoder for Python" -optional = false +optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.5" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "simplejson-3.20.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f5272b5866b259fe6c33c4a8c5073bf8b359c3c97b70c298a2f09a69b52c7c41"}, {file = "simplejson-3.20.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5c0de368f3052a59a1acf21f8b2dd28686a9e4eba2da7efae7ed9554cb31e7bc"}, @@ -10117,9 +10062,10 @@ files = [ name = "smmap" version = "5.0.2" description = "A pure Python implementation of a sliding window memory map manager" -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"dlt\" or extra == \"dev\"" files = [ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, @@ -10250,9 +10196,10 @@ sqlcipher = ["sqlcipher3_binary"] name = "sqlglot" version = "27.16.3" description = "An easily customizable SQL parser and transpiler" -optional = false +optional = true python-versions = ">=3.9" groups = ["main"] +markers = "extra == \"dlt\"" files = [ {file = "sqlglot-27.16.3-py3-none-any.whl", hash = "sha256:3765ef1da6c9a04dd9e9ab4bcf24ca54daae72d86d693954aed84dbbbff2ff3b"}, {file = "sqlglot-27.16.3.tar.gz", hash = "sha256:bf5cc3b7c90c3682365353a318089e69e859939943d7882562ba39be650a6202"}, @@ -10580,9 +10527,10 @@ files = [ name = "tomlkit" version = "0.13.3" description = "Style preserving TOML library" -optional = false +optional = true python-versions = ">=3.8" groups = ["main"] +markers = "extra == \"dlt\" or extra == \"dev\"" files = [ {file = "tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"}, {file = "tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1"}, @@ -10919,9 +10867,10 @@ typing-extensions = ">=4.12.0" name = "tzdata" version = "2025.2" description = "Provider of IANA time zone data" -optional = false +optional = true python-versions = ">=2" groups = ["main"] +markers = "extra == \"docs\" or extra == \"evals\" or extra == \"dlt\"" files = [ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, @@ -11501,10 +11450,10 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] name = "win-precise-time" version = "1.4.2" description = "" -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] -markers = "os_name == \"nt\" and python_version <= \"3.12\"" +markers = "extra == \"dlt\" and os_name == \"nt\" and python_version <= \"3.12\"" files = [ {file = "win-precise-time-1.4.2.tar.gz", hash = "sha256:89274785cbc5f2997e01675206da3203835a442c60fd97798415c6b3c179c0b9"}, {file = "win_precise_time-1.4.2-cp310-cp310-win32.whl", hash = "sha256:7fa13a2247c2ef41cd5e9b930f40716eacc7fc1f079ea72853bd5613fe087a1a"}, @@ -11525,10 +11474,10 @@ files = [ name = "win32-setctime" version = "1.2.0" description = "A small Python utility to set file creation time on Windows" -optional = true +optional = false python-versions = ">=3.5" groups = ["main"] -markers = "sys_platform == \"win32\" and extra == \"codegraph\" and python_version <= \"3.12\"" +markers = "sys_platform == \"win32\"" files = [ {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, @@ -11915,23 +11864,25 @@ cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and pyt anthropic = ["anthropic"] api = [] aws = ["s3fs"] +baml = ["baml-py"] chromadb = ["chromadb", "pypika"] codegraph = ["fastembed", "transformers", "tree-sitter", "tree-sitter-python"] debug = ["debugpy"] deepeval = ["deepeval"] dev = ["coverage", "deptry", "gitpython", "mkdocs-material", "mkdocs-minify-plugin", "mkdocstrings", "mypy", "notebook", "pre-commit", "pylint", "pytest", "pytest-asyncio", "pytest-cov", "ruff", "tweepy"] distributed = ["modal"] +dlt = ["dlt"] docs = ["unstructured"] -evals = ["gdown", "plotly"] +evals = ["gdown", "matplotlib", "pandas", "plotly"] falkordb = ["falkordb"] gemini = ["google-generativeai"] graphiti = ["graphiti-core"] groq = ["groq"] -gui = ["pyside6", "qasync"] huggingface = ["transformers"] langchain = ["langchain_text_splitters", "langsmith"] llama-index = ["llama-index-core"] mistral = ["mistral-common"] +monitoring = ["langfuse", "sentry-sdk"] neo4j = ["neo4j"] neptune = ["langchain_aws"] notebook = ["notebook"] @@ -11943,4 +11894,4 @@ posthog = ["posthog"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<=3.13" -content-hash = "3c5f1fbbd1ec57adbc83d1a1d99ed39a4566c518661940fa43c06906c98221de" +content-hash = "c43bb5150980f3e5867b14f16ffdc13567df6fe516f991e4e31ca0bb456979d8" diff --git a/pyproject.toml b/pyproject.toml index fbf2203e7..d5203ac1e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,31 +20,23 @@ classifiers = [ "Operating System :: Microsoft :: Windows", ] dependencies = [ - "openai>=1.80.1,<2.0.0", + "openai>=1.80.1", "python-dotenv>=1.0.1,<2.0.0", "pydantic>=2.10.5,<3.0.0", "pydantic-settings>=2.2.1,<3", "typing_extensions>=4.12.2,<5.0.0", - "nltk>=3.9.1,<4.0.0", "numpy>=1.26.4, <=4.0.0", - "pandas>=2.2.2,<3.0.0", - # Note: New s3fs and boto3 versions don't work well together - # Always use comaptible fixed versions of these two dependencies - "s3fs[boto3]==2025.3.2", "sqlalchemy>=2.0.39,<3.0.0", "aiosqlite>=0.20.0,<1.0.0", "tiktoken>=0.8.0,<1.0.0", - "litellm>=1.71.0, <2.0.0", + "litellm>=1.76.0", "instructor>=1.9.1,<2.0.0", - "langfuse>=2.32.0,<3", "filetype>=1.2.0,<2.0.0", "aiohttp>=3.11.14,<4.0.0", "aiofiles>=23.2.1,<24.0.0", "rdflib>=7.1.4,<7.2.0", "pypdf>=4.1.0,<7.0.0", "jinja2>=3.1.3,<4", - "matplotlib>=3.8.3,<4", - "networkx>=3.4.2,<4", "lancedb>=0.24.0,<1.0.0", "nbformat>=5.7.0,<6.0.0", "alembic>=1.13.3,<2", @@ -53,22 +45,22 @@ dependencies = [ "fastapi>=0.115.7,<1.0.0", "python-multipart>=0.0.20,<1.0.0", "fastapi-users[sqlalchemy]>=14.0.1,<15.0.0", - "dlt[sqlalchemy]>=1.9.0,<2", - "sentry-sdk[fastapi]>=2.9.0,<3", "structlog>=25.2.0,<26", - "baml-py (==0.206.0)", "pympler>=1.1,<2.0.0", "onnxruntime>=1.0.0,<2.0.0", - "pylance>=0.22.0,<1.0.0", "kuzu (==0.11.0)", "python-magic-bin<0.5 ; platform_system == 'Windows'", # Only needed for Windows + "fastembed<=0.6.0 ", + "networkx>=3.4.2,<4", "uvicorn>=0.34.0,<1.0.0", "gunicorn>=20.1.0,<24", "websockets>=15.0.1,<16.0.0" + ] [project.optional-dependencies] api=[] + distributed = [ "modal>=1.0.5,<2.0.0", ] @@ -114,15 +106,16 @@ codegraph = [ evals = [ "plotly>=6.0.0,<7", "gdown>=5.2.0,<6", + "pandas>=2.2.2,<3.0.0", + "matplotlib>=3.8.3,<4", ] -gui = [ - "pyside6>=6.8.3,<7", - "qasync>=0.27.1,<0.28", -] + graphiti = ["graphiti-core>=0.7.0,<0.8"] # Note: New s3fs and boto3 versions don't work well together # Always use comaptible fixed versions of these two dependencies aws = ["s3fs[boto3]==2025.3.2"] +dlt = ["dlt[sqlalchemy]>=1.9.0,<2"] +baml = ["baml-py (==0.206.0)"] dev = [ "pytest>=7.4.0,<8", "pytest-cov>=6.1.1,<7.0.0", @@ -142,6 +135,8 @@ dev = [ ] debug = ["debugpy>=1.8.9,<2.0.0"] +monitoring = ["sentry-sdk[fastapi]>=2.9.0,<3", "langfuse>=2.32.0,<3"] + [project.urls] Homepage = "https://www.cognee.ai" Repository = "https://github.com/topoteretes/cognee" diff --git a/uv.lock b/uv.lock index af2cee0b6..02993b4a9 100644 --- a/uv.lock +++ b/uv.lock @@ -822,41 +822,33 @@ dependencies = [ { name = "aiohttp" }, { name = "aiosqlite" }, { name = "alembic" }, - { name = "baml-py" }, - { name = "dlt", extra = ["sqlalchemy"] }, { name = "fastapi" }, { name = "fastapi-users", extra = ["sqlalchemy"] }, + { name = "fastembed" }, { name = "filetype" }, { name = "gunicorn" }, { name = "instructor" }, { name = "jinja2" }, { name = "kuzu" }, { name = "lancedb" }, - { name = "langfuse" }, { name = "limits" }, { name = "litellm" }, - { name = "matplotlib" }, { name = "nbformat" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "networkx", version = "3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "nltk" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "onnxruntime" }, { name = "openai" }, - { name = "pandas" }, { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "pylance" }, { name = "pympler" }, { name = "pypdf" }, { name = "python-dotenv" }, { name = "python-magic-bin", marker = "sys_platform == 'win32'" }, { name = "python-multipart" }, { name = "rdflib" }, - { name = "s3fs", extra = ["boto3"] }, { name = "scikit-learn" }, - { name = "sentry-sdk", extra = ["fastapi"] }, { name = "sqlalchemy" }, { name = "structlog" }, { name = "tiktoken" }, @@ -872,6 +864,9 @@ anthropic = [ aws = [ { name = "s3fs", extra = ["boto3"] }, ] +baml = [ + { name = "baml-py" }, +] chromadb = [ { name = "chromadb" }, { name = "pypika" }, @@ -908,11 +903,16 @@ dev = [ distributed = [ { name = "modal" }, ] +dlt = [ + { name = "dlt", extra = ["sqlalchemy"] }, +] docs = [ { name = "unstructured", extra = ["csv", "doc", "docx", "epub", "md", "odt", "org", "ppt", "pptx", "rst", "rtf", "tsv", "xlsx"] }, ] evals = [ { name = "gdown" }, + { name = "matplotlib" }, + { name = "pandas" }, { name = "plotly" }, ] falkordb = [ @@ -927,10 +927,6 @@ graphiti = [ groq = [ { name = "groq" }, ] -gui = [ - { name = "pyside6" }, - { name = "qasync" }, -] huggingface = [ { name = "transformers" }, ] @@ -944,6 +940,10 @@ llama-index = [ mistral = [ { name = "mistral-common" }, ] +monitoring = [ + { name = "langfuse" }, + { name = "sentry-sdk", extra = ["fastapi"] }, +] neo4j = [ { name = "neo4j" }, ] @@ -979,16 +979,17 @@ requires-dist = [ { name = "anthropic", marker = "extra == 'anthropic'", specifier = ">=0.27" }, { name = "asyncpg", marker = "extra == 'postgres'", specifier = ">=0.30.0,<1.0.0" }, { name = "asyncpg", marker = "extra == 'postgres-binary'", specifier = ">=0.30.0,<1.0.0" }, - { name = "baml-py", specifier = "==0.206.0" }, + { name = "baml-py", marker = "extra == 'baml'", specifier = "==0.206.0" }, { name = "chromadb", marker = "extra == 'chromadb'", specifier = ">=0.6,<0.7" }, { name = "coverage", marker = "extra == 'dev'", specifier = ">=7.3.2,<8" }, { name = "debugpy", marker = "extra == 'debug'", specifier = ">=1.8.9,<2.0.0" }, { name = "deepeval", marker = "extra == 'deepeval'", specifier = ">=3.0.1,<4" }, { name = "deptry", marker = "extra == 'dev'", specifier = ">=0.20.0,<0.21" }, - { name = "dlt", extras = ["sqlalchemy"], specifier = ">=1.9.0,<2" }, + { name = "dlt", extras = ["sqlalchemy"], marker = "extra == 'dlt'", specifier = ">=1.9.0,<2" }, { name = "falkordb", marker = "extra == 'falkordb'", specifier = ">=1.0.9,<2.0.0" }, { name = "fastapi", specifier = ">=0.115.7,<1.0.0" }, { name = "fastapi-users", extras = ["sqlalchemy"], specifier = ">=14.0.1,<15.0.0" }, + { name = "fastembed", specifier = "<=0.6.0" }, { name = "fastembed", marker = "python_full_version < '3.13' and extra == 'codegraph'", specifier = "<=0.6.0" }, { name = "filetype", specifier = ">=1.2.0,<2.0.0" }, { name = "gdown", marker = "extra == 'evals'", specifier = ">=5.2.0,<6" }, @@ -1003,12 +1004,12 @@ requires-dist = [ { name = "lancedb", specifier = ">=0.24.0,<1.0.0" }, { name = "langchain-aws", marker = "extra == 'neptune'", specifier = ">=0.2.22" }, { name = "langchain-text-splitters", marker = "extra == 'langchain'", specifier = ">=0.3.2,<1.0.0" }, - { name = "langfuse", specifier = ">=2.32.0,<3" }, + { name = "langfuse", marker = "extra == 'monitoring'", specifier = ">=2.32.0,<3" }, { name = "langsmith", marker = "extra == 'langchain'", specifier = ">=0.2.3,<1.0.0" }, { name = "limits", specifier = ">=4.4.1,<5" }, - { name = "litellm", specifier = ">=1.71.0,<2.0.0" }, + { name = "litellm", specifier = ">=1.76.0" }, { name = "llama-index-core", marker = "extra == 'llama-index'", specifier = ">=0.12.11,<0.13" }, - { name = "matplotlib", specifier = ">=3.8.3,<4" }, + { name = "matplotlib", marker = "extra == 'evals'", specifier = ">=3.8.3,<4" }, { name = "mistral-common", marker = "extra == 'mistral'", specifier = ">=1.5.2,<2" }, { name = "mkdocs-material", marker = "extra == 'dev'", specifier = ">=9.5.42,<10" }, { name = "mkdocs-minify-plugin", marker = "extra == 'dev'", specifier = ">=0.8.0,<0.9" }, @@ -1018,13 +1019,12 @@ requires-dist = [ { name = "nbformat", specifier = ">=5.7.0,<6.0.0" }, { name = "neo4j", marker = "extra == 'neo4j'", specifier = ">=5.28.0,<6" }, { name = "networkx", specifier = ">=3.4.2,<4" }, - { name = "nltk", specifier = ">=3.9.1,<4.0.0" }, { name = "notebook", marker = "extra == 'dev'", specifier = ">=7.1.0,<8" }, { name = "notebook", marker = "extra == 'notebook'", specifier = ">=7.1.0,<8" }, { name = "numpy", specifier = ">=1.26.4,<=4.0.0" }, { name = "onnxruntime", specifier = ">=1.0.0,<2.0.0" }, - { name = "openai", specifier = ">=1.80.1,<2.0.0" }, - { name = "pandas", specifier = ">=2.2.2,<3.0.0" }, + { name = "openai", specifier = ">=1.80.1" }, + { name = "pandas", marker = "extra == 'evals'", specifier = ">=2.2.2,<3.0.0" }, { name = "pgvector", marker = "extra == 'postgres'", specifier = ">=0.3.5,<0.4" }, { name = "pgvector", marker = "extra == 'postgres-binary'", specifier = ">=0.3.5,<0.4" }, { name = "plotly", marker = "extra == 'evals'", specifier = ">=6.0.0,<7" }, @@ -1034,25 +1034,21 @@ requires-dist = [ { name = "psycopg2-binary", marker = "extra == 'postgres-binary'", specifier = ">=2.9.10,<3.0.0" }, { name = "pydantic", specifier = ">=2.10.5,<3.0.0" }, { name = "pydantic-settings", specifier = ">=2.2.1,<3" }, - { name = "pylance", specifier = ">=0.22.0,<1.0.0" }, { name = "pylint", marker = "extra == 'dev'", specifier = ">=3.0.3,<4" }, { name = "pympler", specifier = ">=1.1,<2.0.0" }, { name = "pypdf", specifier = ">=4.1.0,<7.0.0" }, { name = "pypika", marker = "extra == 'chromadb'", specifier = "==0.48.9" }, - { name = "pyside6", marker = "extra == 'gui'", specifier = ">=6.8.3,<7" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0,<8" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.1,<0.22" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.1.1,<7.0.0" }, { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, { name = "python-magic-bin", marker = "sys_platform == 'win32'", specifier = "<0.5" }, { name = "python-multipart", specifier = ">=0.0.20,<1.0.0" }, - { name = "qasync", marker = "extra == 'gui'", specifier = ">=0.27.1,<0.28" }, { name = "rdflib", specifier = ">=7.1.4,<7.2.0" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.9.2,<=0.13.1" }, - { name = "s3fs", extras = ["boto3"], specifier = "==2025.3.2" }, { name = "s3fs", extras = ["boto3"], marker = "extra == 'aws'", specifier = "==2025.3.2" }, { name = "scikit-learn", specifier = ">=1.6.1,<2" }, - { name = "sentry-sdk", extras = ["fastapi"], specifier = ">=2.9.0,<3" }, + { name = "sentry-sdk", extras = ["fastapi"], marker = "extra == 'monitoring'", specifier = ">=2.9.0,<3" }, { name = "sqlalchemy", specifier = ">=2.0.39,<3.0.0" }, { name = "structlog", specifier = ">=25.2.0,<26" }, { name = "tiktoken", specifier = ">=0.8.0,<1.0.0" }, @@ -1067,7 +1063,7 @@ requires-dist = [ { name = "uvicorn", specifier = ">=0.34.0,<1.0.0" }, { name = "websockets", specifier = ">=15.0.1,<16.0.0" }, ] -provides-extras = ["api", "distributed", "neo4j", "neptune", "postgres", "postgres-binary", "notebook", "langchain", "llama-index", "gemini", "huggingface", "ollama", "mistral", "anthropic", "deepeval", "posthog", "falkordb", "groq", "chromadb", "docs", "codegraph", "evals", "gui", "graphiti", "aws", "dev", "debug"] +provides-extras = ["api", "distributed", "neo4j", "neptune", "postgres", "postgres-binary", "notebook", "langchain", "llama-index", "gemini", "huggingface", "ollama", "mistral", "anthropic", "deepeval", "posthog", "falkordb", "groq", "chromadb", "docs", "codegraph", "evals", "graphiti", "aws", "dlt", "baml", "dev", "debug", "monitoring"] [[package]] name = "colorama" @@ -1785,17 +1781,17 @@ name = "fastembed" version = "0.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub", marker = "python_full_version < '3.13'" }, - { name = "loguru", marker = "python_full_version < '3.13'" }, - { name = "mmh3", marker = "python_full_version < '3.13'" }, + { name = "huggingface-hub" }, + { name = "loguru" }, + { name = "mmh3" }, { name = "numpy", version = "1.26.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, - { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.12.*'" }, - { name = "onnxruntime", marker = "python_full_version < '3.13'" }, - { name = "pillow", marker = "python_full_version < '3.13'" }, - { name = "py-rust-stemmers", marker = "python_full_version < '3.13'" }, - { name = "requests", marker = "python_full_version < '3.13'" }, - { name = "tokenizers", marker = "python_full_version < '3.13'" }, - { name = "tqdm", marker = "python_full_version < '3.13'" }, + { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "onnxruntime" }, + { name = "pillow" }, + { name = "py-rust-stemmers" }, + { name = "requests" }, + { name = "tokenizers" }, + { name = "tqdm" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c6/f4/036a656c605f63dc25f11284f60f69900a54a19c513e1ae60d21d6977e75/fastembed-0.6.0.tar.gz", hash = "sha256:5c9ead25f23449535b07243bbe1f370b820dcc77ec2931e61674e3fe7ff24733", size = 50731, upload-time = "2025-02-26T13:50:33.031Z" } wheels = [ @@ -3539,8 +3535,8 @@ name = "loguru" version = "0.7.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version < '3.13' and sys_platform == 'win32'" }, - { name = "win32-setctime", marker = "python_full_version < '3.13' and sys_platform == 'win32'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" } wheels = [ @@ -5938,54 +5934,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, ] -[[package]] -name = "pyside6" -version = "6.9.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyside6-addons" }, - { name = "pyside6-essentials" }, - { name = "shiboken6" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/42/43577413bd5ab26f5f21e7a43c9396aac158a5d01900c87e4609c0e96278/pyside6-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:71245c76bfbe5c41794ffd8546730ec7cc869d4bbe68535639e026e4ef8a7714", size = 558102, upload-time = "2025-08-26T07:52:57.302Z" }, - { url = "https://files.pythonhosted.org/packages/12/df/cb84f802df3dcc1d196d2f9f37dbb8227761826f936987c9386b8ae1ffcc/pyside6-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:64a9e2146e207d858e00226f68d7c1b4ab332954742a00dcabb721bb9e4aa0cd", size = 558243, upload-time = "2025-08-26T07:52:59.272Z" }, - { url = "https://files.pythonhosted.org/packages/94/2d/715db9da437b4632d06e2c4718aee9937760b84cf36c23d5441989e581b0/pyside6-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a78fad16241a1f2ed0fa0098cf3d621f591fc75b4badb7f3fa3959c9d861c806", size = 558245, upload-time = "2025-08-26T07:53:00.838Z" }, - { url = "https://files.pythonhosted.org/packages/59/90/2e75cbff0e17f16b83d2b7e8434ae9175cae8d6ff816c9b56d307cf53c86/pyside6-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:d1afbf48f9a5612b9ee2dc7c384c1a65c08b5830ba5e7d01f66d82678e5459df", size = 564604, upload-time = "2025-08-26T07:53:02.402Z" }, - { url = "https://files.pythonhosted.org/packages/dc/34/e3dd4e046673efcbcfbe0aa2760df06b2877739b8f4da60f0229379adebd/pyside6-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:1499b1d7629ab92119118e2636b4ace836b25e457ddf01003fdca560560b8c0a", size = 401833, upload-time = "2025-08-26T07:53:03.742Z" }, -] - -[[package]] -name = "pyside6-addons" -version = "6.9.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyside6-essentials" }, - { name = "shiboken6" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/39/a8f4a55001b6a0aaee042e706de2447f21c6dc2a610f3d3debb7d04db821/pyside6_addons-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:7019fdcc0059626eb1608b361371f4dc8cb7f2d02f066908fd460739ff5a07cd", size = 316693692, upload-time = "2025-08-26T07:33:31.529Z" }, - { url = "https://files.pythonhosted.org/packages/14/48/0b16e9dabd4cafe02d59531832bc30b6f0e14c92076e90dd02379d365cb2/pyside6_addons-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:24350e5415317f269e743d1f7b4933fe5f59d90894aa067676c9ce6bfe9e7988", size = 166984613, upload-time = "2025-08-26T07:33:47.569Z" }, - { url = "https://files.pythonhosted.org/packages/f4/55/dc42a73387379bae82f921b7659cd2006ec0e80f7052f83ddc07e9eb9cca/pyside6_addons-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:af8dee517de8d336735a6543f7dd496eb580e852c14b4d2304b890e2a29de499", size = 162908466, upload-time = "2025-08-26T07:39:49.331Z" }, - { url = "https://files.pythonhosted.org/packages/14/fa/396a2e86230c493b565e2dc89dc64e4b1c63582ac69afe77b693c3817a53/pyside6_addons-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:98d2413904ee4b2b754b077af7875fa6ec08468c01a6628a2c9c3d2cece4874f", size = 160216647, upload-time = "2025-08-26T07:42:18.903Z" }, - { url = "https://files.pythonhosted.org/packages/a7/fe/25f61259f1d5ec4648c9f6d2abd8e2cba2188f10735a57abafda719958e5/pyside6_addons-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:b430cae782ff1a99fb95868043557f22c31b30c94afb9cf73278584e220a2ab6", size = 27126649, upload-time = "2025-08-26T07:42:37.696Z" }, -] - -[[package]] -name = "pyside6-essentials" -version = "6.9.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "shiboken6" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/21/41960c03721a99e7be99a96ebb8570bdfd6f76f512b5d09074365e27ce28/pyside6_essentials-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:713eb8dcbb016ff10e6fca129c1bf2a0fd8cfac979e689264e0be3b332f9398e", size = 133092348, upload-time = "2025-08-26T07:43:57.231Z" }, - { url = "https://files.pythonhosted.org/packages/3e/02/e38ff18f3d2d8d3071aa6823031aad6089267aa4668181db65ce9948bfc0/pyside6_essentials-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:84b8ca4fa56506e2848bdb4c7a0851a5e7adcb916bef9bce25ce2eeb6c7002cc", size = 96569791, upload-time = "2025-08-26T07:44:41.392Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a1/1203d4db6919b42a937d9ac5ddb84b20ea42eb119f7c1ddeb77cb8fdb00c/pyside6_essentials-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:d0f701503974bd51b408966539aa6956f3d8536e547ea8002fbfb3d77796bbc3", size = 94311809, upload-time = "2025-08-26T07:46:44.924Z" }, - { url = "https://files.pythonhosted.org/packages/a8/e3/3b3e869d3e332b6db93f6f64fac3b12f5c48b84f03f2aa50ee5c044ec0de/pyside6_essentials-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:b2f746f795138ac63eb173f9850a6db293461a1b6ce22cf6dafac7d194a38951", size = 72624566, upload-time = "2025-08-26T07:48:04.64Z" }, - { url = "https://files.pythonhosted.org/packages/91/70/db78afc8b60b2e53f99145bde2f644cca43924a4dd869ffe664e0792730a/pyside6_essentials-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:ecd7b5cd9e271f397fb89a6357f4ec301d8163e50869c6c557f9ccc6bed42789", size = 49561720, upload-time = "2025-08-26T07:49:43.708Z" }, -] - [[package]] name = "pysocks" version = "1.7.1" @@ -6344,15 +6292,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, ] -[[package]] -name = "qasync" -version = "0.27.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/e0/7c7c973f52e1765d6ddfc41e9272294f65d5d52b8f5f5eae92adf411ad46/qasync-0.27.1.tar.gz", hash = "sha256:8dc768fd1ee5de1044c7c305eccf2d39d24d87803ea71189d4024fb475f4985f", size = 14287, upload-time = "2023-11-19T14:19:55.535Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/06/bc628aa2981bcfd452a08ee435b812fd3eee4ada8acb8a76c4a09d1a5a77/qasync-0.27.1-py3-none-any.whl", hash = "sha256:5d57335723bc7d9b328dadd8cb2ed7978640e4bf2da184889ce50ee3ad2602c7", size = 14866, upload-time = "2023-11-19T14:19:54.345Z" }, -] - [[package]] name = "rapidfuzz" version = "3.14.1" @@ -7082,18 +7021,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] -[[package]] -name = "shiboken6" -version = "6.9.2" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/1e/62a8757aa0aa8d5dbf876f6cb6f652a60be9852e7911b59269dd983a7fb5/shiboken6-6.9.2-cp39-abi3-macosx_12_0_universal2.whl", hash = "sha256:8bb1c4326330e53adeac98bfd9dcf57f5173a50318a180938dcc4825d9ca38da", size = 406337, upload-time = "2025-08-26T07:52:39.614Z" }, - { url = "https://files.pythonhosted.org/packages/3b/bb/72a8ed0f0542d9ea935f385b396ee6a4bbd94749c817cbf2be34e80a16d3/shiboken6-6.9.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3b54c0a12ea1b03b9dc5dcfb603c366e957dc75341bf7cb1cc436d0d848308ee", size = 206733, upload-time = "2025-08-26T07:52:41.768Z" }, - { url = "https://files.pythonhosted.org/packages/52/c4/09e902f5612a509cef2c8712c516e4fe44f3a1ae9fcd8921baddb5e6bae4/shiboken6-6.9.2-cp39-abi3-manylinux_2_39_aarch64.whl", hash = "sha256:a5f5985938f5acb604c23536a0ff2efb3cccb77d23da91fbaff8fd8ded3dceb4", size = 202784, upload-time = "2025-08-26T07:52:43.172Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ea/a56b094a4bf6facf89f52f58e83684e168b1be08c14feb8b99969f3d4189/shiboken6-6.9.2-cp39-abi3-win_amd64.whl", hash = "sha256:68c33d565cd4732be762d19ff67dfc53763256bac413d392aa8598b524980bc4", size = 1152089, upload-time = "2025-08-26T07:52:45.162Z" }, - { url = "https://files.pythonhosted.org/packages/48/64/562a527fc55fbf41fa70dae735929988215505cb5ec0809fb0aef921d4a0/shiboken6-6.9.2-cp39-abi3-win_arm64.whl", hash = "sha256:c5b827797b3d89d9b9a3753371ff533fcd4afc4531ca51a7c696952132098054", size = 1708948, upload-time = "2025-08-26T07:52:48.016Z" }, -] - [[package]] name = "sigtools" version = "4.0.1"