From 4ceb28009af0621234cf93c61539f6c93088c3b8 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Fri, 18 Oct 2024 12:35:12 -0700 Subject: [PATCH] mongodb: migrate to repo (#27467) --- libs/partners/mongodb/.gitignore | 1 - libs/partners/mongodb/LICENSE | 21 - libs/partners/mongodb/Makefile | 59 - libs/partners/mongodb/README.md | 40 +- .../mongodb/langchain_mongodb/__init__.py | 20 - .../mongodb/langchain_mongodb/cache.py | 308 --- .../chat_message_histories.py | 162 -- .../mongodb/langchain_mongodb/index.py | 270 --- .../mongodb/langchain_mongodb/pipelines.py | 160 -- .../mongodb/langchain_mongodb/py.typed | 0 .../langchain_mongodb/retrievers/__init__.py | 15 - .../retrievers/full_text_search.py | 59 - .../retrievers/hybrid_search.py | 126 - .../mongodb/langchain_mongodb/utils.py | 183 -- .../mongodb/langchain_mongodb/vectorstores.py | 796 ------ libs/partners/mongodb/poetry.lock | 2158 ----------------- libs/partners/mongodb/pyproject.toml | 103 - .../partners/mongodb/scripts/check_imports.py | 17 - libs/partners/mongodb/scripts/lint_imports.sh | 17 - libs/partners/mongodb/tests/__init__.py | 0 .../tests/integration_tests/__init__.py | 0 .../tests/integration_tests/test_cache.py | 161 -- .../integration_tests/test_chain_example.py | 144 -- .../test_chat_message_histories.py | 43 - .../tests/integration_tests/test_compile.py | 7 - .../tests/integration_tests/test_index.py | 83 - .../integration_tests/test_retrievers.py | 176 -- .../integration_tests/test_vectorstores.py | 473 ---- .../mongodb/tests/unit_tests/__init__.py | 0 .../mongodb/tests/unit_tests/test_cache.py | 215 -- .../unit_tests/test_chat_message_histories.py | 44 - .../mongodb/tests/unit_tests/test_imports.py | 12 - .../mongodb/tests/unit_tests/test_index.py | 72 - .../tests/unit_tests/test_vectorstores.py | 191 -- libs/partners/mongodb/tests/utils.py | 273 --- 35 files changed, 2 insertions(+), 6407 deletions(-) delete mode 100644 libs/partners/mongodb/.gitignore delete mode 100644 libs/partners/mongodb/LICENSE delete mode 100644 libs/partners/mongodb/Makefile delete mode 100644 libs/partners/mongodb/langchain_mongodb/__init__.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/cache.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/chat_message_histories.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/index.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/pipelines.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/py.typed delete mode 100644 libs/partners/mongodb/langchain_mongodb/retrievers/__init__.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/retrievers/full_text_search.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/retrievers/hybrid_search.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/utils.py delete mode 100644 libs/partners/mongodb/langchain_mongodb/vectorstores.py delete mode 100644 libs/partners/mongodb/poetry.lock delete mode 100644 libs/partners/mongodb/pyproject.toml delete mode 100644 libs/partners/mongodb/scripts/check_imports.py delete mode 100755 libs/partners/mongodb/scripts/lint_imports.sh delete mode 100644 libs/partners/mongodb/tests/__init__.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/__init__.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/test_cache.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/test_chain_example.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/test_chat_message_histories.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/test_compile.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/test_index.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/test_retrievers.py delete mode 100644 libs/partners/mongodb/tests/integration_tests/test_vectorstores.py delete mode 100644 libs/partners/mongodb/tests/unit_tests/__init__.py delete mode 100644 libs/partners/mongodb/tests/unit_tests/test_cache.py delete mode 100644 libs/partners/mongodb/tests/unit_tests/test_chat_message_histories.py delete mode 100644 libs/partners/mongodb/tests/unit_tests/test_imports.py delete mode 100644 libs/partners/mongodb/tests/unit_tests/test_index.py delete mode 100644 libs/partners/mongodb/tests/unit_tests/test_vectorstores.py delete mode 100644 libs/partners/mongodb/tests/utils.py diff --git a/libs/partners/mongodb/.gitignore b/libs/partners/mongodb/.gitignore deleted file mode 100644 index bee8a64b79a99..0000000000000 --- a/libs/partners/mongodb/.gitignore +++ /dev/null @@ -1 +0,0 @@ -__pycache__ diff --git a/libs/partners/mongodb/LICENSE b/libs/partners/mongodb/LICENSE deleted file mode 100644 index fc0602feecdd6..0000000000000 --- a/libs/partners/mongodb/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 LangChain, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/libs/partners/mongodb/Makefile b/libs/partners/mongodb/Makefile deleted file mode 100644 index 63fc9d46f0ead..0000000000000 --- a/libs/partners/mongodb/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -.PHONY: all format lint test tests integration_tests docker_tests help extended_tests - -# Default target executed when no arguments are given to make. -all: help - -# Define a variable for the test file path. -TEST_FILE ?= tests/unit_tests/ -integration_test integration_tests: TEST_FILE=tests/integration_tests/ - -test tests integration_test integration_tests: - poetry run pytest $(TEST_FILE) - -test_watch: - poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE) - - -###################### -# LINTING AND FORMATTING -###################### - -# Define a variable for Python and notebook files. -PYTHON_FILES=. -MYPY_CACHE=.mypy_cache -lint format: PYTHON_FILES=. -lint_diff format_diff: PYTHON_FILES=$(shell git diff --relative=libs/partners/mongodb --name-only --diff-filter=d master | grep -E '\.py$$|\.ipynb$$') -lint_package: PYTHON_FILES=langchain_mongodb -lint_tests: PYTHON_FILES=tests -lint_tests: MYPY_CACHE=.mypy_cache_test - -lint lint_diff lint_package lint_tests: - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES) - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff - [ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) - -format format_diff: - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES) - -spell_check: - poetry run codespell --toml pyproject.toml - -spell_fix: - poetry run codespell --toml pyproject.toml -w - -check_imports: $(shell find langchain_mongodb -name '*.py') - poetry run python ./scripts/check_imports.py $^ - -###################### -# HELP -###################### - -help: - @echo '----' - @echo 'check_imports - check imports' - @echo 'format - run code formatters' - @echo 'lint - run linters' - @echo 'test - run unit tests' - @echo 'tests - run unit tests' - @echo 'test TEST_FILE= - run all tests in file' diff --git a/libs/partners/mongodb/README.md b/libs/partners/mongodb/README.md index a8b08a2a71bca..d99bbccd53264 100644 --- a/libs/partners/mongodb/README.md +++ b/libs/partners/mongodb/README.md @@ -1,39 +1,3 @@ -# langchain-mongodb +This package has moved! -# Installation -``` -pip install -U langchain-mongodb -``` - -# Usage -- See [Getting Started with the LangChain Integration](https://www.mongodb.com/docs/atlas/atlas-vector-search/ai-integrations/langchain/#get-started-with-the-langchain-integration) for a walkthrough on using your first LangChain implementation with MongoDB Atlas. - -## Using MongoDBAtlasVectorSearch -```python -from langchain_mongodb import MongoDBAtlasVectorSearch - -# Pull MongoDB Atlas URI from environment variables -MONGODB_ATLAS_CLUSTER_URI = os.environ.get("MONGODB_ATLAS_CLUSTER_URI") - -DB_NAME = "langchain_db" -COLLECTION_NAME = "test" -ATLAS_VECTOR_SEARCH_INDEX_NAME = "index_name" -MONGODB_COLLECTION = client[DB_NAME][COLLECTION_NAME] - -# Create the vector search via `from_connection_string` -vector_search = MongoDBAtlasVectorSearch.from_connection_string( - MONGODB_ATLAS_CLUSTER_URI, - DB_NAME + "." + COLLECTION_NAME, - OpenAIEmbeddings(disallowed_special=()), - index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME, -) - -# Initialize MongoDB python client -client = MongoClient(MONGODB_ATLAS_CLUSTER_URI) -# Create the vector search via instantiation -vector_search_2 = MongoDBAtlasVectorSearch( - collection=MONGODB_COLLECTION, - embeddings=OpenAIEmbeddings(disallowed_special=()), - index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME, -) -``` +https://github.com/langchain-ai/langchain-mongodb/tree/main/libs/mongodb diff --git a/libs/partners/mongodb/langchain_mongodb/__init__.py b/libs/partners/mongodb/langchain_mongodb/__init__.py deleted file mode 100644 index d7aab3e785f87..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Integrate your operational database and vector search in a single, unified, -fully managed platform with full vector database capabilities on MongoDB Atlas. - - -Store your operational data, metadata, and vector embeddings in oue VectorStore, -MongoDBAtlasVectorSearch. -Insert into a Chain via a Vector, FullText, or Hybrid Retriever. -""" - -from langchain_mongodb.cache import MongoDBAtlasSemanticCache, MongoDBCache -from langchain_mongodb.chat_message_histories import MongoDBChatMessageHistory -from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch - -__all__ = [ - "MongoDBAtlasVectorSearch", - "MongoDBChatMessageHistory", - "MongoDBCache", - "MongoDBAtlasSemanticCache", -] diff --git a/libs/partners/mongodb/langchain_mongodb/cache.py b/libs/partners/mongodb/langchain_mongodb/cache.py deleted file mode 100644 index a6ce680c5168f..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/cache.py +++ /dev/null @@ -1,308 +0,0 @@ -"""LangChain MongoDB Caches.""" - -import json -import logging -import time -from importlib.metadata import version -from typing import Any, Callable, Dict, Optional, Union - -from langchain_core.caches import RETURN_VAL_TYPE, BaseCache -from langchain_core.embeddings import Embeddings -from langchain_core.load.dump import dumps -from langchain_core.load.load import loads -from langchain_core.outputs import Generation -from pymongo import MongoClient -from pymongo.collection import Collection -from pymongo.database import Database -from pymongo.driver_info import DriverInfo - -from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch - -logger = logging.getLogger(__file__) - - -class MongoDBCache(BaseCache): - """MongoDB Atlas cache - - A cache that uses MongoDB Atlas as a backend - """ - - PROMPT = "prompt" - LLM = "llm" - RETURN_VAL = "return_val" - - def __init__( - self, - connection_string: str, - collection_name: str = "default", - database_name: str = "default", - **kwargs: Dict[str, Any], - ) -> None: - """ - Initialize Atlas Cache. Creates collection on instantiation - - Args: - collection_name (str): Name of collection for cache to live. - Defaults to "default". - connection_string (str): Connection URI to MongoDB Atlas. - Defaults to "default". - database_name (str): Name of database for cache to live. - Defaults to "default". - """ - self.client = _generate_mongo_client(connection_string) - self.__database_name = database_name - self.__collection_name = collection_name - - if self.__collection_name not in self.database.list_collection_names(): - self.database.create_collection(self.__collection_name) - # Create an index on key and llm_string - self.collection.create_index([self.PROMPT, self.LLM]) - - @property - def database(self) -> Database: - """Returns the database used to store cache values.""" - return self.client[self.__database_name] - - @property - def collection(self) -> Collection: - """Returns the collection used to store cache values.""" - return self.database[self.__collection_name] - - def lookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: - """Look up based on prompt and llm_string.""" - return_doc = ( - self.collection.find_one(self._generate_keys(prompt, llm_string)) or {} - ) - return_val = return_doc.get(self.RETURN_VAL) - return _loads_generations(return_val) if return_val else None # type: ignore - - def update(self, prompt: str, llm_string: str, return_val: RETURN_VAL_TYPE) -> None: - """Update cache based on prompt and llm_string.""" - self.collection.update_one( - {**self._generate_keys(prompt, llm_string)}, - {"$set": {self.RETURN_VAL: _dumps_generations(return_val)}}, - upsert=True, - ) - - def _generate_keys(self, prompt: str, llm_string: str) -> Dict[str, str]: - """Create keyed fields for caching layer""" - return {self.PROMPT: prompt, self.LLM: llm_string} - - def clear(self, **kwargs: Any) -> None: - """Clear cache that can take additional keyword arguments. - Any additional arguments will propagate as filtration criteria for - what gets deleted. - - E.g. - # Delete only entries that have llm_string as "fake-model" - self.clear(llm_string="fake-model") - """ - self.collection.delete_many({**kwargs}) - - -class MongoDBAtlasSemanticCache(BaseCache, MongoDBAtlasVectorSearch): - """MongoDB Atlas Semantic cache. - - A Cache backed by a MongoDB Atlas server with vector-store support - """ - - LLM = "llm_string" - RETURN_VAL = "return_val" - - def __init__( - self, - connection_string: str, - embedding: Embeddings, - collection_name: str = "default", - database_name: str = "default", - index_name: str = "default", - wait_until_ready: Optional[float] = None, - score_threshold: Optional[float] = None, - **kwargs: Dict[str, Any], - ): - """ - Initialize Atlas VectorSearch Cache. - Assumes collection exists before instantiation - - Args: - connection_string (str): MongoDB URI to connect to MongoDB Atlas cluster. - embedding (Embeddings): Text embedding model to use. - collection_name (str): MongoDB Collection to add the texts to. - Defaults to "default". - database_name (str): MongoDB Database where to store texts. - Defaults to "default". - index_name: Name of the Atlas Search index. - defaults to 'default' - wait_until_ready (float): Wait this time for Atlas to finish indexing - the stored text. Defaults to None. - """ - client = _generate_mongo_client(connection_string) - self.collection = client[database_name][collection_name] - self.score_threshold = score_threshold - self._wait_until_ready = wait_until_ready - super().__init__( - collection=self.collection, - embedding=embedding, - index_name=index_name, - **kwargs, # type: ignore - ) - - def lookup(self, prompt: str, llm_string: str) -> Optional[RETURN_VAL_TYPE]: - """Look up based on prompt and llm_string.""" - post_filter_pipeline = ( - [{"$match": {"score": {"$gte": self.score_threshold}}}] - if self.score_threshold - else None - ) - - search_response = self.similarity_search_with_score( - prompt, - 1, - pre_filter={self.LLM: {"$eq": llm_string}}, - post_filter_pipeline=post_filter_pipeline, - ) - if search_response: - return_val = search_response[0][0].metadata.get(self.RETURN_VAL) - response = _loads_generations(return_val) or return_val # type: ignore - return response - return None - - def update( - self, - prompt: str, - llm_string: str, - return_val: RETURN_VAL_TYPE, - wait_until_ready: Optional[float] = None, - ) -> None: - """Update cache based on prompt and llm_string.""" - self.add_texts( - [prompt], - [ - { - self.LLM: llm_string, - self.RETURN_VAL: _dumps_generations(return_val), - } - ], - ) - wait = self._wait_until_ready if wait_until_ready is None else wait_until_ready - - def is_indexed() -> bool: - return self.lookup(prompt, llm_string) == return_val - - if wait: - _wait_until(is_indexed, return_val, timeout=wait) - - def clear(self, **kwargs: Any) -> None: - """Clear cache that can take additional keyword arguments. - Any additional arguments will propagate as filtration criteria for - what gets deleted. It will delete any locally cached content regardless - - E.g. - # Delete only entries that have llm_string as "fake-model" - self.clear(llm_string="fake-model") - """ - self.collection.delete_many({**kwargs}) - - -def _generate_mongo_client(connection_string: str) -> MongoClient: - return MongoClient( - connection_string, - driver=DriverInfo(name="Langchain", version=version("langchain-mongodb")), - ) - - -def _dumps_generations(generations: RETURN_VAL_TYPE) -> str: - """ - Serialization for generic RETURN_VAL_TYPE, i.e. sequence of `Generation` - - Args: - generations (RETURN_VAL_TYPE): A list of language model generations. - - Returns: - str: a single string representing a list of generations. - - This, and "_dumps_generations" are duplicated in this utility - from modules: "libs/community/langchain_community/cache.py" - - This function and its counterpart rely on - the dumps/loads pair with Reviver, so are able to deal - with all subclasses of Generation. - - Each item in the list can be `dumps`ed to a string, - then we make the whole list of strings into a json-dumped. - """ - return json.dumps([dumps(_item) for _item in generations]) - - -def _loads_generations(generations_str: str) -> Union[RETURN_VAL_TYPE, None]: - """ - Deserialization of a string into a generic RETURN_VAL_TYPE - (i.e. a sequence of `Generation`). - - Args: - generations_str (str): A string representing a list of generations. - - Returns: - RETURN_VAL_TYPE: A list of generations. - - - This function and its counterpart rely on - the dumps/loads pair with Reviver, so are able to deal - with all subclasses of Generation. - - See `_dumps_generations`, the inverse of this function. - - Compatible with the legacy cache-blob format - Does not raise exceptions for malformed entries, just logs a warning - and returns none: the caller should be prepared for such a cache miss. - - - """ - try: - generations = [loads(_item_str) for _item_str in json.loads(generations_str)] - return generations - except (json.JSONDecodeError, TypeError): - # deferring the (soft) handling to after the legacy-format attempt - pass - - try: - gen_dicts = json.loads(generations_str) - # not relying on `_load_generations_from_json` (which could disappear): - generations = [Generation(**generation_dict) for generation_dict in gen_dicts] - logger.warning( - f"Legacy 'Generation' cached blob encountered: '{generations_str}'" - ) - return generations - except (json.JSONDecodeError, TypeError): - logger.warning( - f"Malformed/unparsable cached blob encountered: '{generations_str}'" - ) - return None - - -def _wait_until( - predicate: Callable, success_description: Any, timeout: float = 10.0 -) -> None: - """Wait up to 10 seconds (by default) for predicate to be true. - - E.g.: - - wait_until(lambda: client.primary == ('a', 1), - 'connect to the primary') - - If the lambda-expression isn't true after 10 seconds, we raise - AssertionError("Didn't ever connect to the primary"). - - Returns the predicate's first true value. - """ - start = time.time() - interval = min(float(timeout) / 100, 0.1) - while True: - retval = predicate() - if retval: - return retval - - if time.time() - start > timeout: - raise TimeoutError("Didn't ever %s" % success_description) - - time.sleep(interval) diff --git a/libs/partners/mongodb/langchain_mongodb/chat_message_histories.py b/libs/partners/mongodb/langchain_mongodb/chat_message_histories.py deleted file mode 100644 index 7604f43e03c76..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/chat_message_histories.py +++ /dev/null @@ -1,162 +0,0 @@ -import json -import logging -from typing import Dict, List, Optional - -from langchain_core.chat_history import BaseChatMessageHistory -from langchain_core.messages import ( - BaseMessage, - message_to_dict, - messages_from_dict, -) -from pymongo import MongoClient, errors - -logger = logging.getLogger(__name__) - -DEFAULT_DBNAME = "chat_history" -DEFAULT_COLLECTION_NAME = "message_store" -DEFAULT_SESSION_ID_KEY = "SessionId" -DEFAULT_HISTORY_KEY = "History" - - -class MongoDBChatMessageHistory(BaseChatMessageHistory): - """Chat message history that stores history in MongoDB. - - Setup: - Install ``langchain-mongodb`` python package. - - .. code-block:: bash - - pip install langchain-mongodb - - Instantiate: - .. code-block:: python - - from langchain_mongodb import MongoDBChatMessageHistory - - - history = MongoDBChatMessageHistory( - connection_string="mongodb://your-host:your-port/", # mongodb://localhost:27017/ - session_id = "your-session-id", - ) - - Add and retrieve messages: - .. code-block:: python - - # Add single message - history.add_message(message) - - # Add batch messages - history.add_messages([message1, message2, message3, ...]) - - # Add human message - history.add_user_message(human_message) - - # Add ai message - history.add_ai_message(ai_message) - - # Retrieve messages - messages = history.messages - """ # noqa: E501 - - def __init__( - self, - connection_string: str, - session_id: str, - database_name: str = DEFAULT_DBNAME, - collection_name: str = DEFAULT_COLLECTION_NAME, - *, - session_id_key: str = DEFAULT_SESSION_ID_KEY, - history_key: str = DEFAULT_HISTORY_KEY, - create_index: bool = True, - history_size: Optional[int] = None, - index_kwargs: Optional[Dict] = None, - ): - """Initialize with a MongoDBChatMessageHistory instance. - - Args: - connection_string: str - connection string to connect to MongoDB. - session_id: str - arbitrary key that is used to store the messages of - a single chat session. - database_name: Optional[str] - name of the database to use. - collection_name: Optional[str] - name of the collection to use. - session_id_key: Optional[str] - name of the field that stores the session id. - history_key: Optional[str] - name of the field that stores the chat history. - create_index: Optional[bool] - whether to create an index on the session id field. - history_size: Optional[int] - count of (most recent) messages to fetch from MongoDB. - index_kwargs: Optional[Dict] - additional keyword arguments to pass to the index creation. - """ - self.connection_string = connection_string - self.session_id = session_id - self.database_name = database_name - self.collection_name = collection_name - self.session_id_key = session_id_key - self.history_key = history_key - self.history_size = history_size - - try: - self.client: MongoClient = MongoClient(connection_string) - except errors.ConnectionFailure as error: - logger.error(error) - - self.db = self.client[database_name] - self.collection = self.db[collection_name] - - if create_index: - index_kwargs = index_kwargs or {} - self.collection.create_index(self.session_id_key, **index_kwargs) - - @property - def messages(self) -> List[BaseMessage]: # type: ignore - """Retrieve the messages from MongoDB""" - try: - if self.history_size is None: - cursor = self.collection.find({self.session_id_key: self.session_id}) - else: - skip_count = max( - 0, - self.collection.count_documents( - {self.session_id_key: self.session_id} - ) - - self.history_size, - ) - cursor = self.collection.find( - {self.session_id_key: self.session_id}, skip=skip_count - ) - except errors.OperationFailure as error: - logger.error(error) - - if cursor: - items = [json.loads(document[self.history_key]) for document in cursor] - else: - items = [] - - messages = messages_from_dict(items) - return messages - - def add_message(self, message: BaseMessage) -> None: - """Append the message to the record in MongoDB""" - try: - self.collection.insert_one( - { - self.session_id_key: self.session_id, - self.history_key: json.dumps(message_to_dict(message)), - } - ) - except errors.WriteError as err: - logger.error(err) - - def clear(self) -> None: - """Clear session memory from MongoDB""" - try: - self.collection.delete_many({self.session_id_key: self.session_id}) - except errors.WriteError as err: - logger.error(err) diff --git a/libs/partners/mongodb/langchain_mongodb/index.py b/libs/partners/mongodb/langchain_mongodb/index.py deleted file mode 100644 index 59cb6d32eaadd..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/index.py +++ /dev/null @@ -1,270 +0,0 @@ -"""Search Index Commands""" - -import logging -from time import monotonic, sleep -from typing import Any, Callable, Dict, List, Optional - -from pymongo.collection import Collection -from pymongo.errors import OperationFailure -from pymongo.operations import SearchIndexModel - -logger = logging.getLogger(__file__) - - -def _search_index_error_message() -> str: - return ( - "Search index operations are not currently available on shared clusters, " - "such as MO. They require dedicated clusters >= M10. " - "You may still perform vector search. " - "You simply must set up indexes manually. Follow the instructions here: " - "https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-type/" - ) - - -def _vector_search_index_definition( - dimensions: int, - path: str, - similarity: str, - filters: Optional[List[str]] = None, - **kwargs: Any, -) -> Dict[str, Any]: - # https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-type/ - fields = [ - { - "numDimensions": dimensions, - "path": path, - "similarity": similarity, - "type": "vector", - }, - ] - if filters: - for field in filters: - fields.append({"type": "filter", "path": field}) - definition = {"fields": fields} - definition.update(kwargs) - return definition - - -def create_vector_search_index( - collection: Collection, - index_name: str, - dimensions: int, - path: str, - similarity: str, - filters: Optional[List[str]] = None, - *, - wait_until_complete: Optional[float] = None, - **kwargs: Any, -) -> None: - """Experimental Utility function to create a vector search index - - Args: - collection (Collection): MongoDB Collection - index_name (str): Name of Index - dimensions (int): Number of dimensions in embedding - path (str): field with vector embedding - similarity (str): The similarity score used for the index - filters (List[str]): Fields/paths to index to allow filtering in $vectorSearch - wait_until_complete (Optional[float]): If provided, number of seconds to wait - until search index is ready. - kwargs: Keyword arguments supplying any additional options to SearchIndexModel. - """ - logger.info("Creating Search Index %s on %s", index_name, collection.name) - - try: - result = collection.create_search_index( - SearchIndexModel( - definition=_vector_search_index_definition( - dimensions=dimensions, - path=path, - similarity=similarity, - filters=filters, - **kwargs, - ), - name=index_name, - type="vectorSearch", - ) - ) - except OperationFailure as e: - raise OperationFailure(_search_index_error_message()) from e - - if wait_until_complete: - _wait_for_predicate( - predicate=lambda: _is_index_ready(collection, index_name), - err=f"{index_name=} did not complete in {wait_until_complete}!", - timeout=wait_until_complete, - ) - logger.info(result) - - -def drop_vector_search_index( - collection: Collection, - index_name: str, - *, - wait_until_complete: Optional[float] = None, -) -> None: - """Drop a created vector search index - - Args: - collection (Collection): MongoDB Collection with index to be dropped - index_name (str): Name of the MongoDB index - wait_until_complete (Optional[float]): If provided, number of seconds to wait - until search index is ready. - """ - logger.info( - "Dropping Search Index %s from Collection: %s", index_name, collection.name - ) - try: - collection.drop_search_index(index_name) - except OperationFailure as e: - if "CommandNotSupported" in str(e): - raise OperationFailure(_search_index_error_message()) from e - # else this most likely means an ongoing drop request was made so skip - if wait_until_complete: - _wait_for_predicate( - predicate=lambda: len(list(collection.list_search_indexes())) == 0, - err=f"Index {index_name} did not drop in {wait_until_complete}!", - timeout=wait_until_complete, - ) - logger.info("Vector Search index %s.%s dropped", collection.name, index_name) - - -def update_vector_search_index( - collection: Collection, - index_name: str, - dimensions: int, - path: str, - similarity: str, - filters: Optional[List[str]] = None, - *, - wait_until_complete: Optional[float] = None, - **kwargs: Any, -) -> None: - """Update a search index. - - Replace the existing index definition with the provided definition. - - Args: - collection (Collection): MongoDB Collection - index_name (str): Name of Index - dimensions (int): Number of dimensions in embedding - path (str): field with vector embedding - similarity (str): The similarity score used for the index. - filters (List[str]): Fields/paths to index to allow filtering in $vectorSearch - wait_until_complete (Optional[float]): If provided, number of seconds to wait - until search index is ready. - kwargs: Keyword arguments supplying any additional options to SearchIndexModel. - """ - - logger.info( - "Updating Search Index %s from Collection: %s", index_name, collection.name - ) - try: - collection.update_search_index( - name=index_name, - definition=_vector_search_index_definition( - dimensions=dimensions, - path=path, - similarity=similarity, - filters=filters, - **kwargs, - ), - ) - except OperationFailure as e: - raise OperationFailure(_search_index_error_message()) from e - - if wait_until_complete: - _wait_for_predicate( - predicate=lambda: _is_index_ready(collection, index_name), - err=f"Index {index_name} update did not complete in {wait_until_complete}!", - timeout=wait_until_complete, - ) - logger.info("Update succeeded") - - -def _is_index_ready(collection: Collection, index_name: str) -> bool: - """Check for the index name in the list of available search indexes to see if the - specified index is of status READY - - Args: - collection (Collection): MongoDB Collection to for the search indexes - index_name (str): Vector Search Index name - - Returns: - bool : True if the index is present and READY false otherwise - """ - try: - search_indexes = collection.list_search_indexes(index_name) - except OperationFailure as e: - raise OperationFailure(_search_index_error_message()) from e - - for index in search_indexes: - if index["type"] == "vectorSearch" and index["status"] == "READY": - return True - return False - - -def _wait_for_predicate( - predicate: Callable, err: str, timeout: float = 120, interval: float = 0.5 -) -> None: - """Generic to block until the predicate returns true - - Args: - predicate (Callable[, bool]): A function that returns a boolean value - err (str): Error message to raise if nothing occurs - timeout (float, optional): Wait time for predicate. Defaults to TIMEOUT. - interval (float, optional): Interval to check predicate. Defaults to DELAY. - - Raises: - TimeoutError: _description_ - """ - start = monotonic() - while not predicate(): - if monotonic() - start > timeout: - raise TimeoutError(err) - sleep(interval) - - -def create_fulltext_search_index( - collection: Collection, - index_name: str, - field: str, - *, - wait_until_complete: Optional[float] = None, - **kwargs: Any, -) -> None: - """Experimental Utility function to create an Atlas Search index - - Args: - collection (Collection): MongoDB Collection - index_name (str): Name of Index - field (str): Field to index - wait_until_complete (Optional[float]): If provided, number of seconds to wait - until search index is ready - kwargs: Keyword arguments supplying any additional options to SearchIndexModel. - """ - logger.info("Creating Search Index %s on %s", index_name, collection.name) - - definition = { - "mappings": {"dynamic": False, "fields": {field: [{"type": "string"}]}} - } - - try: - result = collection.create_search_index( - SearchIndexModel( - definition=definition, - name=index_name, - type="search", - **kwargs, - ) - ) - except OperationFailure as e: - raise OperationFailure(_search_index_error_message()) from e - - if wait_until_complete: - _wait_for_predicate( - predicate=lambda: _is_index_ready(collection, index_name), - err=f"{index_name=} did not complete in {wait_until_complete}!", - timeout=wait_until_complete, - ) - logger.info(result) diff --git a/libs/partners/mongodb/langchain_mongodb/pipelines.py b/libs/partners/mongodb/langchain_mongodb/pipelines.py deleted file mode 100644 index 5820ce388f3d6..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/pipelines.py +++ /dev/null @@ -1,160 +0,0 @@ -"""Aggregation pipeline components used in Atlas Full-Text, Vector, and Hybrid Search - -See the following for more: - - `Full-Text Search `_ - - `MongoDB Operators `_ - - `Vector Search `_ - - `Filter Example `_ -""" - -from typing import Any, Dict, List, Optional - - -def text_search_stage( - query: str, - search_field: str, - index_name: str, - limit: Optional[int] = None, - filter: Optional[Dict[str, Any]] = None, - include_scores: Optional[bool] = True, - **kwargs: Any, -) -> List[Dict[str, Any]]: # noqa: E501 - """Full-Text search using Lucene's standard (BM25) analyzer - - Args: - query: Input text to search for - search_field: Field in Collection that will be searched - index_name: Atlas Search Index name - limit: Maximum number of documents to return. Default of no limit - filter: Any MQL match expression comparing an indexed field - include_scores: Scores provide measure of relative relevance - - Returns: - Dictionary defining the $search stage - """ - pipeline = [ - { - "$search": { - "index": index_name, - "text": {"query": query, "path": search_field}, - } - } - ] - if filter: - pipeline.append({"$match": filter}) # type: ignore - if include_scores: - pipeline.append({"$set": {"score": {"$meta": "searchScore"}}}) - if limit: - pipeline.append({"$limit": limit}) # type: ignore - - return pipeline # type: ignore - - -def vector_search_stage( - query_vector: List[float], - search_field: str, - index_name: str, - top_k: int = 4, - filter: Optional[Dict[str, Any]] = None, - oversampling_factor: int = 10, - **kwargs: Any, -) -> Dict[str, Any]: # noqa: E501 - """Vector Search Stage without Scores. - - Scoring is applied later depending on strategy. - vector search includes a vectorSearchScore that is typically used. - hybrid uses Reciprocal Rank Fusion. - - Args: - query_vector: List of embedding vector - search_field: Field in Collection containing embedding vectors - index_name: Name of Atlas Vector Search Index tied to Collection - top_k: Number of documents to return - oversampling_factor: this times limit is the number of candidates - filter: MQL match expression comparing an indexed field. - Some operators are not supported. - See `vectorSearch filter docs `_ - - - Returns: - Dictionary defining the $vectorSearch - """ - stage = { - "index": index_name, - "path": search_field, - "queryVector": query_vector, - "numCandidates": top_k * oversampling_factor, - "limit": top_k, - } - if filter: - stage["filter"] = filter - return {"$vectorSearch": stage} - - -def combine_pipelines( - pipeline: List[Any], stage: List[Dict[str, Any]], collection_name: str -) -> None: - """Combines two aggregations into a single result set in-place.""" - if pipeline: - pipeline.append({"$unionWith": {"coll": collection_name, "pipeline": stage}}) - else: - pipeline.extend(stage) - - -def reciprocal_rank_stage( - score_field: str, penalty: float = 0, **kwargs: Any -) -> List[Dict[str, Any]]: - """Stage adds Reciprocal Rank Fusion weighting. - - First, it pushes documents retrieved from previous stage - into a temporary sub-document. It then unwinds to establish - the rank to each and applies the penalty. - - Args: - score_field: A unique string to identify the search being ranked - penalty: A non-negative float. - extra_fields: Any fields other than text_field that one wishes to keep. - - Returns: - RRF score := \frac{1}{rank + penalty} with rank in [1,2,..,n] - """ - - rrf_pipeline = [ - {"$group": {"_id": None, "docs": {"$push": "$$ROOT"}}}, - {"$unwind": {"path": "$docs", "includeArrayIndex": "rank"}}, - { - "$addFields": { - f"docs.{score_field}": { - "$divide": [1.0, {"$add": ["$rank", penalty, 1]}] - }, - "docs.rank": "$rank", - "_id": "$docs._id", - } - }, - {"$replaceRoot": {"newRoot": "$docs"}}, - ] - - return rrf_pipeline # type: ignore - - -def final_hybrid_stage( - scores_fields: List[str], limit: int, **kwargs: Any -) -> List[Dict[str, Any]]: - """Sum weighted scores, sort, and apply limit. - - Args: - scores_fields: List of fields given to scores of vector and text searches - limit: Number of documents to return - - Returns: - Final aggregation stages - """ - - return [ - {"$group": {"_id": "$_id", "docs": {"$mergeObjects": "$$ROOT"}}}, - {"$replaceRoot": {"newRoot": "$docs"}}, - {"$set": {score: {"$ifNull": [f"${score}", 0]} for score in scores_fields}}, - {"$addFields": {"score": {"$add": [f"${score}" for score in scores_fields]}}}, - {"$sort": {"score": -1}}, - {"$limit": limit}, - ] diff --git a/libs/partners/mongodb/langchain_mongodb/py.typed b/libs/partners/mongodb/langchain_mongodb/py.typed deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/mongodb/langchain_mongodb/retrievers/__init__.py b/libs/partners/mongodb/langchain_mongodb/retrievers/__init__.py deleted file mode 100644 index c78e3fba44aef..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/retrievers/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Search Retrievers of various types. - -Use ``MongoDBAtlasVectorSearch.as_retriever(**)`` -to create MongoDB's core Vector Search Retriever. -""" - -from langchain_mongodb.retrievers.full_text_search import ( - MongoDBAtlasFullTextSearchRetriever, -) -from langchain_mongodb.retrievers.hybrid_search import MongoDBAtlasHybridSearchRetriever - -__all__ = [ - "MongoDBAtlasHybridSearchRetriever", - "MongoDBAtlasFullTextSearchRetriever", -] diff --git a/libs/partners/mongodb/langchain_mongodb/retrievers/full_text_search.py b/libs/partners/mongodb/langchain_mongodb/retrievers/full_text_search.py deleted file mode 100644 index 52f12c4780a2c..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/retrievers/full_text_search.py +++ /dev/null @@ -1,59 +0,0 @@ -from typing import Any, Dict, List, Optional - -from langchain_core.callbacks.manager import CallbackManagerForRetrieverRun -from langchain_core.documents import Document -from langchain_core.retrievers import BaseRetriever -from pymongo.collection import Collection - -from langchain_mongodb.pipelines import text_search_stage -from langchain_mongodb.utils import make_serializable - - -class MongoDBAtlasFullTextSearchRetriever(BaseRetriever): - """Hybrid Search Retriever performs full-text searches - using Lucene's standard (BM25) analyzer. - """ - - collection: Collection - """MongoDB Collection on an Atlas cluster""" - search_index_name: str - """Atlas Search Index name""" - search_field: str - """Collection field that contains the text to be searched. It must be indexed""" - top_k: Optional[int] = None - """Number of documents to return. Default is no limit""" - filter: Optional[Dict[str, Any]] = None - """(Optional) List of MQL match expression comparing an indexed field""" - show_embeddings: float = False - """If true, returned Document metadata will include vectors""" - - def _get_relevant_documents( - self, query: str, *, run_manager: CallbackManagerForRetrieverRun - ) -> List[Document]: - """Retrieve documents that are highest scoring / most similar to query. - - Args: - query: String to find relevant documents for - run_manager: The callback handler to use - Returns: - List of relevant documents - """ - - pipeline = text_search_stage( # type: ignore - query=query, - search_field=self.search_field, - index_name=self.search_index_name, - limit=self.top_k, - filter=self.filter, - ) - - # Execution - cursor = self.collection.aggregate(pipeline) # type: ignore[arg-type] - - # Formatting - docs = [] - for res in cursor: - text = res.pop(self.search_field) - make_serializable(res) - docs.append(Document(page_content=text, metadata=res)) - return docs diff --git a/libs/partners/mongodb/langchain_mongodb/retrievers/hybrid_search.py b/libs/partners/mongodb/langchain_mongodb/retrievers/hybrid_search.py deleted file mode 100644 index 9e876e9ff81e1..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/retrievers/hybrid_search.py +++ /dev/null @@ -1,126 +0,0 @@ -from typing import Any, Dict, List, Optional - -from langchain_core.callbacks.manager import CallbackManagerForRetrieverRun -from langchain_core.documents import Document -from langchain_core.retrievers import BaseRetriever -from pymongo.collection import Collection - -from langchain_mongodb import MongoDBAtlasVectorSearch -from langchain_mongodb.pipelines import ( - combine_pipelines, - final_hybrid_stage, - reciprocal_rank_stage, - text_search_stage, - vector_search_stage, -) -from langchain_mongodb.utils import make_serializable - - -class MongoDBAtlasHybridSearchRetriever(BaseRetriever): - """Hybrid Search Retriever combines vector and full-text searches - weighting them the via Reciprocal Rank Fusion (RRF) algorithm. - - Increasing the vector_penalty will reduce the importance on the vector search. - Increasing the fulltext_penalty will correspondingly reduce the fulltext score. - For more on the algorithm,see - https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking - """ - - vectorstore: MongoDBAtlasVectorSearch - """MongoDBAtlas VectorStore""" - search_index_name: str - """Atlas Search Index (full-text) name""" - top_k: int = 4 - """Number of documents to return.""" - oversampling_factor: int = 10 - """This times top_k is the number of candidates chosen at each step""" - pre_filter: Optional[Dict[str, Any]] = None - """(Optional) Any MQL match expression comparing an indexed field""" - post_filter: Optional[List[Dict[str, Any]]] = None - """(Optional) Pipeline of MongoDB aggregation stages for postprocessing.""" - vector_penalty: float = 60.0 - """Penalty applied to vector search results in RRF: scores=1/(rank + penalty)""" - fulltext_penalty: float = 60.0 - """Penalty applied to full-text search results in RRF: scores=1/(rank + penalty)""" - show_embeddings: float = False - """If true, returned Document metadata will include vectors.""" - - @property - def collection(self) -> Collection: - return self.vectorstore._collection - - def _get_relevant_documents( - self, query: str, *, run_manager: CallbackManagerForRetrieverRun - ) -> List[Document]: - """Retrieve documents that are highest scoring / most similar to query. - - Note that the same query is used in both searches, - embedded for vector search, and as-is for full-text search. - - Args: - query: String to find relevant documents for - run_manager: The callback handler to use - Returns: - List of relevant documents - """ - - query_vector = self.vectorstore._embedding.embed_query(query) - - scores_fields = ["vector_score", "fulltext_score"] - pipeline: List[Any] = [] - - # First we build up the aggregation pipeline, - # then it is passed to the server to execute - # Vector Search stage - vector_pipeline = [ - vector_search_stage( - query_vector=query_vector, - search_field=self.vectorstore._embedding_key, - index_name=self.vectorstore._index_name, - top_k=self.top_k, - filter=self.pre_filter, - oversampling_factor=self.oversampling_factor, - ) - ] - vector_pipeline += reciprocal_rank_stage("vector_score", self.vector_penalty) - - combine_pipelines(pipeline, vector_pipeline, self.collection.name) - - # Full-Text Search stage - text_pipeline = text_search_stage( - query=query, - search_field=self.vectorstore._text_key, - index_name=self.search_index_name, - limit=self.top_k, - filter=self.pre_filter, - ) - - text_pipeline.extend( - reciprocal_rank_stage("fulltext_score", self.fulltext_penalty) - ) - - combine_pipelines(pipeline, text_pipeline, self.collection.name) - - # Sum and sort stage - pipeline.extend( - final_hybrid_stage(scores_fields=scores_fields, limit=self.top_k) - ) - - # Removal of embeddings unless requested. - if not self.show_embeddings: - pipeline.append({"$project": {self.vectorstore._embedding_key: 0}}) - # Post filtering - if self.post_filter is not None: - pipeline.extend(self.post_filter) - - # Execution - cursor = self.collection.aggregate(pipeline) # type: ignore[arg-type] - - # Formatting - docs = [] - for res in cursor: - text = res.pop(self.vectorstore._text_key) - # score = res.pop("score") # The score remains buried! - make_serializable(res) - docs.append(Document(page_content=text, metadata=res)) - return docs diff --git a/libs/partners/mongodb/langchain_mongodb/utils.py b/libs/partners/mongodb/langchain_mongodb/utils.py deleted file mode 100644 index f228c56bcebb1..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/utils.py +++ /dev/null @@ -1,183 +0,0 @@ -"""Various Utility Functions - -- Tools for handling bson.ObjectId - -The help IDs live as ObjectId in MongoDB and str in Langchain and JSON. - - -- Tools for the Maximal Marginal Relevance (MMR) reranking - -These are duplicated from langchain_community to avoid cross-dependencies. - -Functions "maximal_marginal_relevance" and "cosine_similarity" -are duplicated in this utility respectively from modules: - - "libs/community/langchain_community/vectorstores/utils.py" - - "libs/community/langchain_community/utils/math.py" -""" - -from __future__ import annotations - -import logging -from datetime import date, datetime -from typing import Any, Dict, List, Union - -import numpy as np - -logger = logging.getLogger(__name__) - -Matrix = Union[List[List[float]], List[np.ndarray], np.ndarray] - - -def cosine_similarity(X: Matrix, Y: Matrix) -> np.ndarray: - """Row-wise cosine similarity between two equal-width matrices.""" - if len(X) == 0 or len(Y) == 0: - return np.array([]) - - X = np.array(X) - Y = np.array(Y) - if X.shape[1] != Y.shape[1]: - raise ValueError( - f"Number of columns in X and Y must be the same. X has shape {X.shape} " - f"and Y has shape {Y.shape}." - ) - try: - import simsimd as simd - - X = np.array(X, dtype=np.float32) - Y = np.array(Y, dtype=np.float32) - Z = 1 - np.array(simd.cdist(X, Y, metric="cosine")) - return Z - except ImportError: - logger.debug( - "Unable to import simsimd, defaulting to NumPy implementation. If you want " - "to use simsimd please install with `pip install simsimd`." - ) - X_norm = np.linalg.norm(X, axis=1) - Y_norm = np.linalg.norm(Y, axis=1) - # Ignore divide by zero errors run time warnings as those are handled below. - with np.errstate(divide="ignore", invalid="ignore"): - similarity = np.dot(X, Y.T) / np.outer(X_norm, Y_norm) - similarity[np.isnan(similarity) | np.isinf(similarity)] = 0.0 - return similarity - - -def maximal_marginal_relevance( - query_embedding: np.ndarray, - embedding_list: list, - lambda_mult: float = 0.5, - k: int = 4, -) -> List[int]: - """Compute Maximal Marginal Relevance (MMR). - - MMR is a technique used to select documents that are both relevant to the query - and diverse among themselves. This function returns the indices - of the top-k embeddings that maximize the marginal relevance. - - Args: - query_embedding (np.ndarray): The embedding vector of the query. - embedding_list (list of np.ndarray): A list containing the embedding vectors - of the candidate documents. - lambda_mult (float, optional): The trade-off parameter between - relevance and diversity. Defaults to 0.5. - k (int, optional): The number of embeddings to select. Defaults to 4. - - Returns: - list of int: The indices of the embeddings that maximize the marginal relevance. - - Notes: - The Maximal Marginal Relevance (MMR) is computed using the following formula: - - MMR = argmax_{D_i ∈ R \ S} [λ * Sim(D_i, Q) - (1 - λ) * max_{D_j ∈ S} Sim(D_i, D_j)] - - where: - - R is the set of candidate documents, - - S is the set of selected documents, - - Q is the query embedding, - - Sim(D_i, Q) is the similarity between document D_i and the query, - - Sim(D_i, D_j) is the similarity between documents D_i and D_j, - - λ is the trade-off parameter. - """ - - if min(k, len(embedding_list)) <= 0: - return [] - if query_embedding.ndim == 1: - query_embedding = np.expand_dims(query_embedding, axis=0) - similarity_to_query = cosine_similarity(query_embedding, embedding_list)[0] - most_similar = int(np.argmax(similarity_to_query)) - idxs = [most_similar] - selected = np.array([embedding_list[most_similar]]) - while len(idxs) < min(k, len(embedding_list)): - best_score = -np.inf - idx_to_add = -1 - similarity_to_selected = cosine_similarity(embedding_list, selected) - for i, query_score in enumerate(similarity_to_query): - if i in idxs: - continue - redundant_score = max(similarity_to_selected[i]) - equation_score = ( - lambda_mult * query_score - (1 - lambda_mult) * redundant_score - ) - if equation_score > best_score: - best_score = equation_score - idx_to_add = i - idxs.append(idx_to_add) - selected = np.append(selected, [embedding_list[idx_to_add]], axis=0) - return idxs - - -def str_to_oid(str_repr: str) -> Any | str: - """Attempt to cast string representation of id to MongoDB's internal BSON ObjectId. - - To be consistent with ObjectId, input must be a 24 character hex string. - If it is not, MongoDB will happily use the string in the main _id index. - Importantly, the str representation that comes out of MongoDB will have this form. - - Args: - str_repr: id as string. - - Returns: - ObjectID - """ - from bson import ObjectId - from bson.errors import InvalidId - - try: - return ObjectId(str_repr) - except InvalidId: - logger.debug( - "ObjectIds must be 12-character byte or 24-character hex strings. " - "Examples: b'heres12bytes', '6f6e6568656c6c6f68656768'" - ) - return str_repr - - -def oid_to_str(oid: Any) -> str: - """Convert MongoDB's internal BSON ObjectId into a simple str for compatibility. - - Instructive helper to show where data is coming out of MongoDB. - - Args: - oid: bson.ObjectId - - Returns: - 24 character hex string. - """ - return str(oid) - - -def make_serializable( - obj: Dict[str, Any], -) -> None: - """Recursively cast values in a dict to a form able to json.dump""" - - from bson import ObjectId - - for k, v in obj.items(): - if isinstance(v, dict): - make_serializable(v) - elif isinstance(v, list) and v and isinstance(v[0], (ObjectId, date, datetime)): - obj[k] = [oid_to_str(item) for item in v] - elif isinstance(v, ObjectId): - obj[k] = oid_to_str(v) - elif isinstance(v, (datetime, date)): - obj[k] = v.isoformat() diff --git a/libs/partners/mongodb/langchain_mongodb/vectorstores.py b/libs/partners/mongodb/langchain_mongodb/vectorstores.py deleted file mode 100644 index 7860281eda038..0000000000000 --- a/libs/partners/mongodb/langchain_mongodb/vectorstores.py +++ /dev/null @@ -1,796 +0,0 @@ -from __future__ import annotations - -import logging -from importlib.metadata import version -from typing import ( - Any, - Callable, - Dict, - Generator, - Iterable, - List, - Optional, - Tuple, - TypeVar, - Union, -) - -import numpy as np -from langchain_core.documents import Document -from langchain_core.embeddings import Embeddings -from langchain_core.runnables.config import run_in_executor -from langchain_core.vectorstores import VectorStore -from pymongo import MongoClient -from pymongo.collection import Collection -from pymongo.driver_info import DriverInfo -from pymongo.errors import CollectionInvalid - -from langchain_mongodb.index import ( - create_vector_search_index, - update_vector_search_index, -) -from langchain_mongodb.pipelines import vector_search_stage -from langchain_mongodb.utils import ( - make_serializable, - maximal_marginal_relevance, - oid_to_str, - str_to_oid, -) - -VST = TypeVar("VST", bound=VectorStore) - -logger = logging.getLogger(__name__) - -DEFAULT_INSERT_BATCH_SIZE = 100_000 - - -class MongoDBAtlasVectorSearch(VectorStore): - """MongoDB Atlas vector store integration. - - MongoDBAtlasVectorSearch performs data operations on - text, embeddings and arbitrary data. In addition to CRUD operations, - the VectorStore provides Vector Search - based on similarity of embedding vectors following the - Hierarchical Navigable Small Worlds (HNSW) algorithm. - - This supports a number of models to ascertain scores, - "similarity" (default), "MMR", and "similarity_score_threshold". - These are described in the search_type argument to as_retriever, - which provides the Runnable.invoke(query) API, allowing - MongoDBAtlasVectorSearch to be used within a chain. - - Setup: - * Set up a MongoDB Atlas cluster. The free tier M0 will allow you to start. - Search Indexes are only available on Atlas, the fully managed cloud service, - not the self-managed MongoDB. - Follow [this guide](https://www.mongodb.com/basics/mongodb-atlas-tutorial) - - * Create a Collection and a Vector Search Index.The procedure is described - [here](https://www.mongodb.com/docs/atlas/atlas-vector-search/create-index/#procedure). - - * Install ``langchain-mongodb`` - - - .. code-block:: bash - - pip install -qU langchain-mongodb pymongo - - - .. code-block:: python - - import getpass - MONGODB_ATLAS_CLUSTER_URI = getpass.getpass("MongoDB Atlas Cluster URI:") - - Key init args — indexing params: - embedding: Embeddings - Embedding function to use. - - Key init args — client params: - collection: Collection - MongoDB collection to use. - index_name: str - Name of the Atlas Search index. - - Instantiate: - .. code-block:: python - - from pymongo import MongoClient - from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch - from pymongo import MongoClient - from langchain_openai import OpenAIEmbeddings - - # initialize MongoDB python client - client = MongoClient(MONGODB_ATLAS_CLUSTER_URI) - - DB_NAME = "langchain_test_db" - COLLECTION_NAME = "langchain_test_vectorstores" - ATLAS_VECTOR_SEARCH_INDEX_NAME = "langchain-test-index-vectorstores" - - MONGODB_COLLECTION = client[DB_NAME][COLLECTION_NAME] - - vector_store = MongoDBAtlasVectorSearch( - collection=MONGODB_COLLECTION, - embedding=OpenAIEmbeddings(), - index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME, - relevance_score_fn="cosine", - ) - - Add Documents: - .. code-block:: python - - from langchain_core.documents import Document - - document_1 = Document(page_content="foo", metadata={"baz": "bar"}) - document_2 = Document(page_content="thud", metadata={"bar": "baz"}) - document_3 = Document(page_content="i will be deleted :(") - - documents = [document_1, document_2, document_3] - ids = ["1", "2", "3"] - vector_store.add_documents(documents=documents, ids=ids) - - Delete Documents: - .. code-block:: python - - vector_store.delete(ids=["3"]) - - Search: - .. code-block:: python - - results = vector_store.similarity_search(query="thud",k=1) - for doc in results: - print(f"* {doc.page_content} [{doc.metadata}]") - - .. code-block:: python - - * thud [{'_id': '2', 'baz': 'baz'}] - - - Search with filter: - .. code-block:: python - - results = vector_store.similarity_search(query="thud",k=1,post_filter=[{"bar": "baz"]}) - for doc in results: - print(f"* {doc.page_content} [{doc.metadata}]") - - .. code-block:: python - - * thud [{'_id': '2', 'baz': 'baz'}] - - Search with score: - .. code-block:: python - - results = vector_store.similarity_search_with_score(query="qux",k=1) - for doc, score in results: - print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]") - - .. code-block:: python - - * [SIM=0.916096] foo [{'_id': '1', 'baz': 'bar'}] - - Async: - .. code-block:: python - - # add documents - # await vector_store.aadd_documents(documents=documents, ids=ids) - - # delete documents - # await vector_store.adelete(ids=["3"]) - - # search - # results = vector_store.asimilarity_search(query="thud",k=1) - - # search with score - results = await vector_store.asimilarity_search_with_score(query="qux",k=1) - for doc,score in results: - print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]") - - .. code-block:: python - - * [SIM=0.916096] foo [{'_id': '1', 'baz': 'bar'}] - - Use as Retriever: - .. code-block:: python - - retriever = vector_store.as_retriever( - search_type="mmr", - search_kwargs={"k": 1, "fetch_k": 2, "lambda_mult": 0.5}, - ) - retriever.invoke("thud") - - .. code-block:: python - - [Document(metadata={'_id': '2', 'embedding': [-0.01850726455450058, -0.0014740974875167012, -0.009762819856405258, ...], 'baz': 'baz'}, page_content='thud')] - - """ # noqa: E501 - - def __init__( - self, - collection: Collection[Dict[str, Any]], - embedding: Embeddings, - index_name: str = "vector_index", - text_key: str = "text", - embedding_key: str = "embedding", - relevance_score_fn: str = "cosine", - **kwargs: Any, - ): - """ - Args: - collection: MongoDB collection to add the texts to - embedding: Text embedding model to use - text_key: MongoDB field that will contain the text for each document - index_name: Existing Atlas Vector Search Index - embedding_key: Field that will contain the embedding for each document - vector_index_name: Name of the Atlas Vector Search index - relevance_score_fn: The similarity score used for the index - Currently supported: 'euclidean', 'cosine', and 'dotProduct' - """ - self._collection = collection - self._embedding = embedding - self._index_name = index_name - self._text_key = text_key - self._embedding_key = embedding_key - self._relevance_score_fn = relevance_score_fn - - @property - def embeddings(self) -> Embeddings: - return self._embedding - - def _select_relevance_score_fn(self) -> Callable[[float], float]: - scoring: dict[str, Callable] = { - "euclidean": self._euclidean_relevance_score_fn, - "dotProduct": self._max_inner_product_relevance_score_fn, - "cosine": self._cosine_relevance_score_fn, - } - if self._relevance_score_fn in scoring: - return scoring[self._relevance_score_fn] - else: - raise NotImplementedError( - f"No relevance score function for ${self._relevance_score_fn}" - ) - - @classmethod - def from_connection_string( - cls, - connection_string: str, - namespace: str, - embedding: Embeddings, - **kwargs: Any, - ) -> MongoDBAtlasVectorSearch: - """Construct a `MongoDB Atlas Vector Search` vector store - from a MongoDB connection URI. - - Args: - connection_string: A valid MongoDB connection URI. - namespace: A valid MongoDB namespace (database and collection). - embedding: The text embedding model to use for the vector store. - - Returns: - A new MongoDBAtlasVectorSearch instance. - - """ - client: MongoClient = MongoClient( - connection_string, - driver=DriverInfo(name="Langchain", version=version("langchain")), - ) - db_name, collection_name = namespace.split(".") - collection = client[db_name][collection_name] - return cls(collection, embedding, **kwargs) - - def add_texts( - self, - texts: Iterable[str], - metadatas: Optional[List[Dict[str, Any]]] = None, - ids: Optional[List[str]] = None, - **kwargs: Any, - ) -> List[str]: - """Add texts, create embeddings, and add to the Collection and index. - - Important notes on ids: - - If _id or id is a key in the metadatas dicts, one must - pop them and provide as separate list. - - They must be unique. - - If they are not provided, the VectorStore will create unique ones, - stored as bson.ObjectIds internally, and strings in Langchain. - These will appear in Document.metadata with key, '_id'. - - Args: - texts: Iterable of strings to add to the vectorstore. - metadatas: Optional list of metadatas associated with the texts. - ids: Optional list of unique ids that will be used as index in VectorStore. - See note on ids. - - Returns: - List of ids added to the vectorstore. - """ - - # Check to see if metadata includes ids - if metadatas is not None and ( - metadatas[0].get("_id") or metadatas[0].get("id") - ): - logger.warning( - "_id or id key found in metadata. " - "Please pop from each dict and input as separate list." - "Retrieving methods will include the same id as '_id' in metadata." - ) - - texts_batch = texts - _metadatas: Union[List, Generator] = metadatas or ({} for _ in texts) - metadatas_batch = _metadatas - - result_ids = [] - batch_size = kwargs.get("batch_size", DEFAULT_INSERT_BATCH_SIZE) - if batch_size: - texts_batch = [] - metadatas_batch = [] - size = 0 - i = 0 - for j, (text, metadata) in enumerate(zip(texts, _metadatas)): - size += len(text) + len(metadata) - texts_batch.append(text) - metadatas_batch.append(metadata) - if (j + 1) % batch_size == 0 or size >= 47_000_000: - if ids: - batch_res = self.bulk_embed_and_insert_texts( - texts_batch, metadatas_batch, ids[i : j + 1] - ) - else: - batch_res = self.bulk_embed_and_insert_texts( - texts_batch, metadatas_batch - ) - result_ids.extend(batch_res) - texts_batch = [] - metadatas_batch = [] - size = 0 - i = j + 1 - if texts_batch: - if ids: - batch_res = self.bulk_embed_and_insert_texts( - texts_batch, metadatas_batch, ids[i : j + 1] - ) - else: - batch_res = self.bulk_embed_and_insert_texts( - texts_batch, metadatas_batch - ) - result_ids.extend(batch_res) - return result_ids - - def bulk_embed_and_insert_texts( - self, - texts: Union[List[str], Iterable[str]], - metadatas: Union[List[dict], Generator[dict, Any, Any]], - ids: Optional[List[str]] = None, - ) -> List[str]: - """Bulk insert single batch of texts, embeddings, and optionally ids. - - See add_texts for additional details. - """ - if not texts: - return [] - # Compute embedding vectors - embeddings = self._embedding.embed_documents(texts) # type: ignore - if ids: - to_insert = [ - { - "_id": str_to_oid(i), - self._text_key: t, - self._embedding_key: embedding, - **m, - } - for i, t, m, embedding in zip(ids, texts, metadatas, embeddings) - ] - else: - to_insert = [ - {self._text_key: t, self._embedding_key: embedding, **m} - for t, m, embedding in zip(texts, metadatas, embeddings) - ] - # insert the documents in MongoDB Atlas - insert_result = self._collection.insert_many(to_insert) # type: ignore - return [oid_to_str(_id) for _id in insert_result.inserted_ids] - - def add_documents( - self, - documents: List[Document], - ids: Optional[List[str]] = None, - batch_size: int = DEFAULT_INSERT_BATCH_SIZE, - **kwargs: Any, - ) -> List[str]: - """Add documents to the vectorstore. - - Args: - documents: Documents to add to the vectorstore. - ids: Optional list of unique ids that will be used as index in VectorStore. - See note on ids in add_texts. - batch_size: Number of documents to insert at a time. - Tuning this may help with performance and sidestep MongoDB limits. - - Returns: - List of IDs of the added texts. - """ - n_docs = len(documents) - if ids: - assert len(ids) == n_docs, "Number of ids must equal number of documents." - result_ids = [] - start = 0 - for end in range(batch_size, n_docs + batch_size, batch_size): - texts, metadatas = zip( - *[(doc.page_content, doc.metadata) for doc in documents[start:end]] - ) - if ids: - result_ids.extend( - self.bulk_embed_and_insert_texts( - texts=texts, metadatas=metadatas, ids=ids[start:end] - ) - ) - else: - result_ids.extend( - self.bulk_embed_and_insert_texts(texts=texts, metadatas=metadatas) - ) - start = end - return result_ids - - def similarity_search_with_score( - self, - query: str, - k: int = 4, - pre_filter: Optional[Dict[str, Any]] = None, - post_filter_pipeline: Optional[List[Dict]] = None, - oversampling_factor: int = 10, - include_embeddings: bool = False, - **kwargs: Any, - ) -> List[Tuple[Document, float]]: # noqa: E501 - """Return MongoDB documents most similar to the given query and their scores. - - Atlas Vector Search eliminates the need to run a separate - search system alongside your database. - - Args: - query: Input text of semantic query - k: Number of documents to return. Also known as top_k. - pre_filter: List of MQL match expressions comparing an indexed field - post_filter_pipeline: (Optional) Arbitrary pipeline of MongoDB - aggregation stages applied after the search is complete. - oversampling_factor: This times k is the number of candidates chosen - at each step in the in HNSW Vector Search - include_embeddings: If True, the embedding vector of each result - will be included in metadata. - kwargs: Additional arguments are specific to the search_type - - Returns: - List of documents most similar to the query and their scores. - """ - embedding = self._embedding.embed_query(query) - docs = self._similarity_search_with_score( - embedding, - k=k, - pre_filter=pre_filter, - post_filter_pipeline=post_filter_pipeline, - oversampling_factor=oversampling_factor, - include_embeddings=include_embeddings, - **kwargs, - ) - return docs - - def similarity_search( - self, - query: str, - k: int = 4, - pre_filter: Optional[Dict[str, Any]] = None, - post_filter_pipeline: Optional[List[Dict]] = None, - oversampling_factor: int = 10, - include_scores: bool = False, - include_embeddings: bool = False, - **kwargs: Any, - ) -> List[Document]: # noqa: E501 - """Return MongoDB documents most similar to the given query. - - Atlas Vector Search eliminates the need to run a separate - search system alongside your database. - - Args: - query: Input text of semantic query - k: (Optional) number of documents to return. Defaults to 4. - pre_filter: List of MQL match expressions comparing an indexed field - post_filter_pipeline: (Optional) Pipeline of MongoDB aggregation stages - to filter/process results after $vectorSearch. - oversampling_factor: Multiple of k used when generating number of candidates - at each step in the HNSW Vector Search, - include_scores: If True, the query score of each result - will be included in metadata. - include_embeddings: If True, the embedding vector of each result - will be included in metadata. - kwargs: Additional arguments are specific to the search_type - - Returns: - List of documents most similar to the query and their scores. - """ - docs_and_scores = self.similarity_search_with_score( - query, - k=k, - pre_filter=pre_filter, - post_filter_pipeline=post_filter_pipeline, - oversampling_factor=oversampling_factor, - include_embeddings=include_embeddings, - **kwargs, - ) - - if include_scores: - for doc, score in docs_and_scores: - doc.metadata["score"] = score - return [doc for doc, _ in docs_and_scores] - - def max_marginal_relevance_search( - self, - query: str, - k: int = 4, - fetch_k: int = 20, - lambda_mult: float = 0.5, - pre_filter: Optional[Dict[str, Any]] = None, - post_filter_pipeline: Optional[List[Dict]] = None, - **kwargs: Any, - ) -> List[Document]: - """Return documents selected using the maximal marginal relevance. - - Maximal marginal relevance optimizes for similarity to query AND diversity - among selected documents. - - Args: - query: Text to look up documents similar to. - k: (Optional) number of documents to return. Defaults to 4. - fetch_k: (Optional) number of documents to fetch before passing to MMR - algorithm. Defaults to 20. - lambda_mult: Number between 0 and 1 that determines the degree - of diversity among the results with 0 corresponding - to maximum diversity and 1 to minimum diversity. Defaults to 0.5. - pre_filter: List of MQL match expressions comparing an indexed field - post_filter_pipeline: (Optional) pipeline of MongoDB aggregation stages - following the $vectorSearch stage. - Returns: - List of documents selected by maximal marginal relevance. - """ - return self.max_marginal_relevance_search_by_vector( - embedding=self._embedding.embed_query(query), - k=k, - fetch_k=fetch_k, - lambda_mult=lambda_mult, - pre_filter=pre_filter, - post_filter_pipeline=post_filter_pipeline, - **kwargs, - ) - - @classmethod - def from_texts( - cls, - texts: List[str], - embedding: Embeddings, - metadatas: Optional[List[Dict]] = None, - collection: Optional[Collection] = None, - ids: Optional[List[str]] = None, - **kwargs: Any, - ) -> MongoDBAtlasVectorSearch: - """Construct a `MongoDB Atlas Vector Search` vector store from raw documents. - - This is a user-friendly interface that: - 1. Embeds documents. - 2. Adds the documents to a provided MongoDB Atlas Vector Search index - (Lucene) - - This is intended to be a quick way to get started. - - See `MongoDBAtlasVectorSearch` for kwargs and further description. - - - Example: - .. code-block:: python - from pymongo import MongoClient - - from langchain_mongodb import MongoDBAtlasVectorSearch - from langchain_openai import OpenAIEmbeddings - - mongo_client = MongoClient("") - collection = mongo_client[""][""] - embeddings = OpenAIEmbeddings() - vectorstore = MongoDBAtlasVectorSearch.from_texts( - texts, - embeddings, - metadatas=metadatas, - collection=collection - ) - """ - if collection is None: - raise ValueError("Must provide 'collection' named parameter.") - vectorstore = cls(collection, embedding, **kwargs) - vectorstore.add_texts(texts=texts, metadatas=metadatas, ids=ids, **kwargs) - return vectorstore - - def delete(self, ids: Optional[List[str]] = None, **kwargs: Any) -> Optional[bool]: - """Delete documents from VectorStore by ids. - - Args: - ids: List of ids to delete. - **kwargs: Other keyword arguments passed to Collection.delete_many() - - Returns: - Optional[bool]: True if deletion is successful, - False otherwise, None if not implemented. - """ - filter = {} - if ids: - oids = [str_to_oid(i) for i in ids] - filter = {"_id": {"$in": oids}} - return self._collection.delete_many(filter=filter, **kwargs).acknowledged - - async def adelete( - self, ids: Optional[List[str]] = None, **kwargs: Any - ) -> Optional[bool]: - """Delete by vector ID or other criteria. - - Args: - ids: List of ids to delete. - **kwargs: Other keyword arguments that subclasses might use. - - Returns: - Optional[bool]: True if deletion is successful, - False otherwise, None if not implemented. - """ - return await run_in_executor(None, self.delete, ids=ids, **kwargs) - - def max_marginal_relevance_search_by_vector( - self, - embedding: List[float], - k: int = 4, - fetch_k: int = 20, - lambda_mult: float = 0.5, - pre_filter: Optional[Dict[str, Any]] = None, - post_filter_pipeline: Optional[List[Dict]] = None, - oversampling_factor: int = 10, - **kwargs: Any, - ) -> List[Document]: # type: ignore - """Return docs selected using the maximal marginal relevance. - - Maximal marginal relevance optimizes for similarity to query AND diversity - among selected documents. - - Args: - embedding: Embedding to look up documents similar to. - k: Number of Documents to return. Defaults to 4. - fetch_k: Number of Documents to fetch to pass to MMR algorithm. - lambda_mult: Number between 0 and 1 that determines the degree - of diversity among the results with 0 corresponding - to maximum diversity and 1 to minimum diversity. - Defaults to 0.5. - pre_filter: (Optional) dictionary of arguments to filter document fields on. - post_filter_pipeline: (Optional) pipeline of MongoDB aggregation stages - following the vectorSearch stage. - oversampling_factor: Multiple of k used when generating number - of candidates in HNSW Vector Search, - kwargs: Additional arguments are specific to the search_type - - Returns: - List of Documents selected by maximal marginal relevance. - """ - docs = self._similarity_search_with_score( - embedding, - k=fetch_k, - pre_filter=pre_filter, - post_filter_pipeline=post_filter_pipeline, - include_embeddings=True, - oversampling_factor=oversampling_factor, - **kwargs, - ) - mmr_doc_indexes = maximal_marginal_relevance( - np.array(embedding), - [doc.metadata[self._embedding_key] for doc, _ in docs], - k=k, - lambda_mult=lambda_mult, - ) - mmr_docs = [docs[i][0] for i in mmr_doc_indexes] - return mmr_docs - - async def amax_marginal_relevance_search_by_vector( - self, - embedding: List[float], - k: int = 4, - fetch_k: int = 20, - lambda_mult: float = 0.5, - pre_filter: Optional[Dict[str, Any]] = None, - post_filter_pipeline: Optional[List[Dict]] = None, - oversampling_factor: int = 10, - **kwargs: Any, - ) -> List[Document]: - """Return docs selected using the maximal marginal relevance.""" - return await run_in_executor( - None, - self.max_marginal_relevance_search_by_vector, # type: ignore[arg-type] - embedding, - k=k, - fetch_k=fetch_k, - lambda_mult=lambda_mult, - pre_filter=pre_filter, - post_filter_pipeline=post_filter_pipeline, - oversampling_factor=oversampling_factor, - **kwargs, - ) - - def _similarity_search_with_score( - self, - query_vector: List[float], - k: int = 4, - pre_filter: Optional[Dict[str, Any]] = None, - post_filter_pipeline: Optional[List[Dict]] = None, - oversampling_factor: int = 10, - include_embeddings: bool = False, - **kwargs: Any, - ) -> List[Tuple[Document, float]]: - """Core search routine. See external methods for details.""" - - # Atlas Vector Search, potentially with filter - pipeline = [ - vector_search_stage( - query_vector, - self._embedding_key, - self._index_name, - k, - pre_filter, - oversampling_factor, - **kwargs, - ), - {"$set": {"score": {"$meta": "vectorSearchScore"}}}, - ] - - # Remove embeddings unless requested. - if not include_embeddings: - pipeline.append({"$project": {self._embedding_key: 0}}) - # Post-processing - if post_filter_pipeline is not None: - pipeline.extend(post_filter_pipeline) - - # Execution - cursor = self._collection.aggregate(pipeline) # type: ignore[arg-type] - docs = [] - - # Format - for res in cursor: - text = res.pop(self._text_key) - score = res.pop("score") - make_serializable(res) - docs.append((Document(page_content=text, metadata=res), score)) - return docs - - def create_vector_search_index( - self, - dimensions: int, - filters: Optional[List[str]] = None, - update: bool = False, - ) -> None: - """Creates a MongoDB Atlas vectorSearch index for the VectorStore - - Note**: This method may fail as it requires a MongoDB Atlas with these - `pre-requisites `. - Currently, vector and full-text search index operations need to be - performed manually on the Atlas UI for shared M0 clusters. - - Args: - dimensions (int): Number of dimensions in embedding - filters (Optional[List[Dict[str, str]]], optional): additional filters - for index definition. - Defaults to None. - update (bool, optional): Updates existing vectorSearch index. - Defaults to False. - """ - try: - self._collection.database.create_collection(self._collection.name) - except CollectionInvalid: - pass - - index_operation = ( - update_vector_search_index if update else create_vector_search_index - ) - - index_operation( - collection=self._collection, - index_name=self._index_name, - dimensions=dimensions, - path=self._embedding_key, - similarity=self._relevance_score_fn, - filters=filters or [], - ) # type: ignore [operator] diff --git a/libs/partners/mongodb/poetry.lock b/libs/partners/mongodb/poetry.lock deleted file mode 100644 index 193ccae0fe1b4..0000000000000 --- a/libs/partners/mongodb/poetry.lock +++ /dev/null @@ -1,2158 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. - -[[package]] -name = "aiohappyeyeballs" -version = "2.4.0" -description = "Happy Eyeballs for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, -] - -[[package]] -name = "aiohttp" -version = "3.10.5" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, -] - -[package.dependencies] -aiohappyeyeballs = ">=2.3.0" -aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} -attrs = ">=17.3.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "anyio" -version = "4.4.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] - -[[package]] -name = "attrs" -version = "24.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, -] - -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - -[[package]] -name = "certifi" -version = "2024.8.30" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.3.2" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, -] - -[[package]] -name = "codespell" -version = "2.3.0" -description = "Codespell" -optional = false -python-versions = ">=3.8" -files = [ - {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, - {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, -] - -[package.extras] -dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] -hard-encoding-detection = ["chardet"] -toml = ["tomli"] -types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "distro" -version = "1.9.0" -description = "Distro - an OS platform information API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, - {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, -] - -[[package]] -name = "dnspython" -version = "2.6.1" -description = "DNS toolkit" -optional = false -python-versions = ">=3.8" -files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, -] - -[package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] -dnssec = ["cryptography (>=41)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] -doq = ["aioquic (>=0.9.25)"] -idna = ["idna (>=3.6)"] -trio = ["trio (>=0.23)"] -wmi = ["wmi (>=1.5.1)"] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "freezegun" -version = "1.5.1" -description = "Let your Python tests travel through time" -optional = false -python-versions = ">=3.7" -files = [ - {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, - {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, -] - -[package.dependencies] -python-dateutil = ">=2.7" - -[[package]] -name = "frozenlist" -version = "1.4.1" -description = "A list-like structure which implements collections.abc.MutableSequence" -optional = false -python-versions = ">=3.8" -files = [ - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, - {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, - {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, - {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, - {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, - {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, - {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, - {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, - {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, - {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, - {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, - {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, - {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, - {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, - {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, - {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, - {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, - {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, - {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, - {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, - {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, - {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, - {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, - {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, - {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, - {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, - {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, - {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, -] - -[[package]] -name = "greenlet" -version = "3.1.0" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25"}, - {file = "greenlet-3.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682"}, - {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1"}, - {file = "greenlet-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99"}, - {file = "greenlet-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54"}, - {file = "greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"}, - {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"}, - {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"}, - {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"}, - {file = "greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"}, - {file = "greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"}, - {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"}, - {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"}, - {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"}, - {file = "greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"}, - {file = "greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"}, - {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"}, - {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"}, - {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"}, - {file = "greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df"}, - {file = "greenlet-3.1.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637"}, - {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954"}, - {file = "greenlet-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3"}, - {file = "greenlet-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00"}, - {file = "greenlet-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6"}, - {file = "greenlet-3.1.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491"}, - {file = "greenlet-3.1.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b"}, - {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d"}, - {file = "greenlet-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0"}, - {file = "greenlet-3.1.0-cp38-cp38-win32.whl", hash = "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2"}, - {file = "greenlet-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910"}, - {file = "greenlet-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a"}, - {file = "greenlet-3.1.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28"}, - {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b"}, - {file = "greenlet-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8"}, - {file = "greenlet-3.1.0-cp39-cp39-win32.whl", hash = "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc"}, - {file = "greenlet-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97"}, - {file = "greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"}, -] - -[package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httpx" -version = "0.27.2" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "idna" -version = "3.8" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "jiter" -version = "0.5.0" -description = "Fast iterable JSON parser." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, - {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, - {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, - {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, - {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, - {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, - {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, - {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, - {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, - {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, - {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, - {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, - {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, - {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, - {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, - {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, - {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, - {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, - {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, - {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, - {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, - {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, - {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, - {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, - {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, - {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, - {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, - {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, - {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, - {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, - {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, - {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, - {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, - {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, - {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, - {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - -[[package]] -name = "langchain" -version = "0.3.0" -description = "Building applications with LLMs through composability" -optional = false -python-versions = ">=3.9,<4.0" -files = [] -develop = true - -[package.dependencies] -aiohttp = "^3.8.3" -async-timeout = {version = "^4.0.0", markers = "python_version < \"3.11\""} -langchain-core = "^0.3.0" -langchain-text-splitters = "^0.3.0" -langsmith = "^0.1.17" -numpy = [ - {version = ">=1,<2", markers = "python_version < \"3.12\""}, - {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, -] -pydantic = "^2.7.4" -PyYAML = ">=5.3" -requests = "^2" -SQLAlchemy = ">=1.4,<3" -tenacity = "^8.1.0,!=8.4.0" - -[package.source] -type = "directory" -url = "../../langchain" - -[[package]] -name = "langchain-core" -version = "0.3.0" -description = "Building applications with LLMs through composability" -optional = false -python-versions = ">=3.9,<4.0" -files = [] -develop = true - -[package.dependencies] -jsonpatch = "^1.33" -langsmith = "^0.1.117" -packaging = ">=23.2,<25" -pydantic = [ - {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -PyYAML = ">=5.3" -tenacity = "^8.1.0,!=8.4.0" -typing-extensions = ">=4.7" - -[package.source] -type = "directory" -url = "../../core" - -[[package]] -name = "langchain-openai" -version = "0.2.0" -description = "An integration package connecting OpenAI and LangChain" -optional = false -python-versions = ">=3.9,<4.0" -files = [] -develop = true - -[package.dependencies] -langchain-core = "^0.3" -openai = "^1.40.0" -tiktoken = ">=0.7,<1" - -[package.source] -type = "directory" -url = "../openai" - -[[package]] -name = "langchain-text-splitters" -version = "0.3.0" -description = "LangChain text splitting utilities" -optional = false -python-versions = ">=3.9,<4.0" -files = [] -develop = true - -[package.dependencies] -langchain-core = "^0.3.0" - -[package.source] -type = "directory" -url = "../../text-splitters" - -[[package]] -name = "langsmith" -version = "0.1.120" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langsmith-0.1.120-py3-none-any.whl", hash = "sha256:54d2785e301646c0988e0a69ebe4d976488c87b41928b358cb153b6ddd8db62b"}, - {file = "langsmith-0.1.120.tar.gz", hash = "sha256:25499ca187b41bd89d784b272b97a8d76f60e0e21bdf20336e8a2aa6a9b23ac9"}, -] - -[package.dependencies] -httpx = ">=0.23.0,<1" -orjson = ">=3.9.14,<4.0.0" -pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -requests = ">=2,<3" - -[[package]] -name = "multidict" -version = "6.1.0" -description = "multidict implementation" -optional = false -python-versions = ">=3.8" -files = [ - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, - {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, - {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, - {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, - {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, - {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, - {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, - {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, - {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, - {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, - {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, - {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, - {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, - {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, - {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "mypy" -version = "1.11.2" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, - {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, - {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, - {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, - {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, - {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, - {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, - {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, - {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, - {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, - {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, - {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, - {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, - {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, - {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, - {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, - {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "numpy" -version = "1.26.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - -[[package]] -name = "openai" -version = "1.45.0" -description = "The official Python library for the openai API" -optional = false -python-versions = ">=3.7.1" -files = [ - {file = "openai-1.45.0-py3-none-any.whl", hash = "sha256:2f1f7b7cf90f038a9f1c24f0d26c0f1790c102ec5acd07ffd70a9b7feac1ff4e"}, - {file = "openai-1.45.0.tar.gz", hash = "sha256:731207d10637335413aa3c0955f8f8df30d7636a4a0f9c381f2209d32cf8de97"}, -] - -[package.dependencies] -anyio = ">=3.5.0,<5" -distro = ">=1.7.0,<2" -httpx = ">=0.23.0,<1" -jiter = ">=0.4.0,<1" -pydantic = ">=1.9.0,<3" -sniffio = "*" -tqdm = ">4" -typing-extensions = ">=4.11,<5" - -[package.extras] -datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] - -[[package]] -name = "orjson" -version = "3.10.7" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "orjson-3.10.7-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:74f4544f5a6405b90da8ea724d15ac9c36da4d72a738c64685003337401f5c12"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34a566f22c28222b08875b18b0dfbf8a947e69df21a9ed5c51a6bf91cfb944ac"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf6ba8ebc8ef5792e2337fb0419f8009729335bb400ece005606336b7fd7bab7"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac7cf6222b29fbda9e3a472b41e6a5538b48f2c8f99261eecd60aafbdb60690c"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de817e2f5fc75a9e7dd350c4b0f54617b280e26d1631811a43e7e968fa71e3e9"}, - {file = "orjson-3.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:348bdd16b32556cf8d7257b17cf2bdb7ab7976af4af41ebe79f9796c218f7e91"}, - {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:479fd0844ddc3ca77e0fd99644c7fe2de8e8be1efcd57705b5c92e5186e8a250"}, - {file = "orjson-3.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fdf5197a21dd660cf19dfd2a3ce79574588f8f5e2dbf21bda9ee2d2b46924d84"}, - {file = "orjson-3.10.7-cp310-none-win32.whl", hash = "sha256:d374d36726746c81a49f3ff8daa2898dccab6596864ebe43d50733275c629175"}, - {file = "orjson-3.10.7-cp310-none-win_amd64.whl", hash = "sha256:cb61938aec8b0ffb6eef484d480188a1777e67b05d58e41b435c74b9d84e0b9c"}, - {file = "orjson-3.10.7-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7db8539039698ddfb9a524b4dd19508256107568cdad24f3682d5773e60504a2"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:480f455222cb7a1dea35c57a67578848537d2602b46c464472c995297117fa09"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8a9c9b168b3a19e37fe2778c0003359f07822c90fdff8f98d9d2a91b3144d8e0"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8de062de550f63185e4c1c54151bdddfc5625e37daf0aa1e75d2a1293e3b7d9a"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b0dd04483499d1de9c8f6203f8975caf17a6000b9c0c54630cef02e44ee624e"}, - {file = "orjson-3.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b58d3795dafa334fc8fd46f7c5dc013e6ad06fd5b9a4cc98cb1456e7d3558bd6"}, - {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33cfb96c24034a878d83d1a9415799a73dc77480e6c40417e5dda0710d559ee6"}, - {file = "orjson-3.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e724cebe1fadc2b23c6f7415bad5ee6239e00a69f30ee423f319c6af70e2a5c0"}, - {file = "orjson-3.10.7-cp311-none-win32.whl", hash = "sha256:82763b46053727a7168d29c772ed5c870fdae2f61aa8a25994c7984a19b1021f"}, - {file = "orjson-3.10.7-cp311-none-win_amd64.whl", hash = "sha256:eb8d384a24778abf29afb8e41d68fdd9a156cf6e5390c04cc07bbc24b89e98b5"}, - {file = "orjson-3.10.7-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44a96f2d4c3af51bfac6bc4ef7b182aa33f2f054fd7f34cc0ee9a320d051d41f"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ac14cd57df0572453543f8f2575e2d01ae9e790c21f57627803f5e79b0d3c3"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bdbb61dcc365dd9be94e8f7df91975edc9364d6a78c8f7adb69c1cdff318ec93"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b48b3db6bb6e0a08fa8c83b47bc169623f801e5cc4f24442ab2b6617da3b5313"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23820a1563a1d386414fef15c249040042b8e5d07b40ab3fe3efbfbbcbcb8864"}, - {file = "orjson-3.10.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0c6a008e91d10a2564edbb6ee5069a9e66df3fbe11c9a005cb411f441fd2c09"}, - {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d352ee8ac1926d6193f602cbe36b1643bbd1bbcb25e3c1a657a4390f3000c9a5"}, - {file = "orjson-3.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2d9f990623f15c0ae7ac608103c33dfe1486d2ed974ac3f40b693bad1a22a7b"}, - {file = "orjson-3.10.7-cp312-none-win32.whl", hash = "sha256:7c4c17f8157bd520cdb7195f75ddbd31671997cbe10aee559c2d613592e7d7eb"}, - {file = "orjson-3.10.7-cp312-none-win_amd64.whl", hash = "sha256:1d9c0e733e02ada3ed6098a10a8ee0052dd55774de3d9110d29868d24b17faa1"}, - {file = "orjson-3.10.7-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:77d325ed866876c0fa6492598ec01fe30e803272a6e8b10e992288b009cbe149"}, - {file = "orjson-3.10.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea2c232deedcb605e853ae1db2cc94f7390ac776743b699b50b071b02bea6fe"}, - {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3dcfbede6737fdbef3ce9c37af3fb6142e8e1ebc10336daa05872bfb1d87839c"}, - {file = "orjson-3.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11748c135f281203f4ee695b7f80bb1358a82a63905f9f0b794769483ea854ad"}, - {file = "orjson-3.10.7-cp313-none-win32.whl", hash = "sha256:a7e19150d215c7a13f39eb787d84db274298d3f83d85463e61d277bbd7f401d2"}, - {file = "orjson-3.10.7-cp313-none-win_amd64.whl", hash = "sha256:eef44224729e9525d5261cc8d28d6b11cafc90e6bd0be2157bde69a52ec83024"}, - {file = "orjson-3.10.7-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6ea2b2258eff652c82652d5e0f02bd5e0463a6a52abb78e49ac288827aaa1469"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430ee4d85841e1483d487e7b81401785a5dfd69db5de01314538f31f8fbf7ee1"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b6146e439af4c2472c56f8540d799a67a81226e11992008cb47e1267a9b3225"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:084e537806b458911137f76097e53ce7bf5806dda33ddf6aaa66a028f8d43a23"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829cf2195838e3f93b70fd3b4292156fc5e097aac3739859ac0dcc722b27ac0"}, - {file = "orjson-3.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1193b2416cbad1a769f868b1749535d5da47626ac29445803dae7cc64b3f5c98"}, - {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4e6c3da13e5a57e4b3dca2de059f243ebec705857522f188f0180ae88badd354"}, - {file = "orjson-3.10.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c31008598424dfbe52ce8c5b47e0752dca918a4fdc4a2a32004efd9fab41d866"}, - {file = "orjson-3.10.7-cp38-none-win32.whl", hash = "sha256:7122a99831f9e7fe977dc45784d3b2edc821c172d545e6420c375e5a935f5a1c"}, - {file = "orjson-3.10.7-cp38-none-win_amd64.whl", hash = "sha256:a763bc0e58504cc803739e7df040685816145a6f3c8a589787084b54ebc9f16e"}, - {file = "orjson-3.10.7-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e76be12658a6fa376fcd331b1ea4e58f5a06fd0220653450f0d415b8fd0fbe20"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed350d6978d28b92939bfeb1a0570c523f6170efc3f0a0ef1f1df287cd4f4960"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:144888c76f8520e39bfa121b31fd637e18d4cc2f115727865fdf9fa325b10412"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09b2d92fd95ad2402188cf51573acde57eb269eddabaa60f69ea0d733e789fe9"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b24a579123fa884f3a3caadaed7b75eb5715ee2b17ab5c66ac97d29b18fe57f"}, - {file = "orjson-3.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591bcfe7512353bd609875ab38050efe3d55e18934e2f18950c108334b4ff"}, - {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f4db56635b58cd1a200b0a23744ff44206ee6aa428185e2b6c4a65b3197abdcd"}, - {file = "orjson-3.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0fa5886854673222618638c6df7718ea7fe2f3f2384c452c9ccedc70b4a510a5"}, - {file = "orjson-3.10.7-cp39-none-win32.whl", hash = "sha256:8272527d08450ab16eb405f47e0f4ef0e5ff5981c3d82afe0efd25dcbef2bcd2"}, - {file = "orjson-3.10.7-cp39-none-win_amd64.whl", hash = "sha256:974683d4618c0c7dbf4f69c95a979734bf183d0658611760017f6e70a145af58"}, - {file = "orjson-3.10.7.tar.gz", hash = "sha256:75ef0640403f945f3a1f9f6400686560dbfb0fb5b16589ad62cd477043c4eee3"}, -] - -[[package]] -name = "packaging" -version = "24.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pydantic" -version = "2.9.1" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, -] - -[package.dependencies] -annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" -typing-extensions = [ - {version = ">=4.6.1", markers = "python_version < \"3.13\""}, - {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, -] - -[package.extras] -email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] - -[[package]] -name = "pydantic-core" -version = "2.23.3" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pymongo" -version = "4.8.0" -description = "Python driver for MongoDB " -optional = false -python-versions = ">=3.8" -files = [ - {file = "pymongo-4.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2b7bec27e047e84947fbd41c782f07c54c30c76d14f3b8bf0c89f7413fac67a"}, - {file = "pymongo-4.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c68fe128a171493018ca5c8020fc08675be130d012b7ab3efe9e22698c612a1"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920d4f8f157a71b3cb3f39bc09ce070693d6e9648fb0e30d00e2657d1dca4e49"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52b4108ac9469febba18cea50db972605cc43978bedaa9fea413378877560ef8"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:180d5eb1dc28b62853e2f88017775c4500b07548ed28c0bd9c005c3d7bc52526"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aec2b9088cdbceb87e6ca9c639d0ff9b9d083594dda5ca5d3c4f6774f4c81b33"}, - {file = "pymongo-4.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0cf61450feadca81deb1a1489cb1a3ae1e4266efd51adafecec0e503a8dcd84"}, - {file = "pymongo-4.8.0-cp310-cp310-win32.whl", hash = "sha256:8b18c8324809539c79bd6544d00e0607e98ff833ca21953df001510ca25915d1"}, - {file = "pymongo-4.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e5df28f74002e37bcbdfdc5109799f670e4dfef0fb527c391ff84f078050e7b5"}, - {file = "pymongo-4.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b50040d9767197b77ed420ada29b3bf18a638f9552d80f2da817b7c4a4c9c68"}, - {file = "pymongo-4.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:417369ce39af2b7c2a9c7152c1ed2393edfd1cbaf2a356ba31eb8bcbd5c98dd7"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf821bd3befb993a6db17229a2c60c1550e957de02a6ff4dd0af9476637b2e4d"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9365166aa801c63dff1a3cb96e650be270da06e3464ab106727223123405510f"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc8b8582f4209c2459b04b049ac03c72c618e011d3caa5391ff86d1bda0cc486"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e5019f75f6827bb5354b6fef8dfc9d6c7446894a27346e03134d290eb9e758"}, - {file = "pymongo-4.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b5802151fc2b51cd45492c80ed22b441d20090fb76d1fd53cd7760b340ff554"}, - {file = "pymongo-4.8.0-cp311-cp311-win32.whl", hash = "sha256:4bf58e6825b93da63e499d1a58de7de563c31e575908d4e24876234ccb910eba"}, - {file = "pymongo-4.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:b747c0e257b9d3e6495a018309b9e0c93b7f0d65271d1d62e572747f4ffafc88"}, - {file = "pymongo-4.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6a720a3d22b54183352dc65f08cd1547204d263e0651b213a0a2e577e838526"}, - {file = "pymongo-4.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31e4d21201bdf15064cf47ce7b74722d3e1aea2597c6785882244a3bb58c7eab"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b804bb4f2d9dc389cc9e827d579fa327272cdb0629a99bfe5b83cb3e269ebf"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fbdb87fe5075c8beb17a5c16348a1ea3c8b282a5cb72d173330be2fecf22f5"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd39455b7ee70aabee46f7399b32ab38b86b236c069ae559e22be6b46b2bbfc4"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940d456774b17814bac5ea7fc28188c7a1338d4a233efbb6ba01de957bded2e8"}, - {file = "pymongo-4.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:236bbd7d0aef62e64caf4b24ca200f8c8670d1a6f5ea828c39eccdae423bc2b2"}, - {file = "pymongo-4.8.0-cp312-cp312-win32.whl", hash = "sha256:47ec8c3f0a7b2212dbc9be08d3bf17bc89abd211901093e3ef3f2adea7de7a69"}, - {file = "pymongo-4.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e84bc7707492f06fbc37a9f215374d2977d21b72e10a67f1b31893ec5a140ad8"}, - {file = "pymongo-4.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:519d1bab2b5e5218c64340b57d555d89c3f6c9d717cecbf826fb9d42415e7750"}, - {file = "pymongo-4.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87075a1feb1e602e539bdb1ef8f4324a3427eb0d64208c3182e677d2c0718b6f"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f53429515d2b3e86dcc83dadecf7ff881e538c168d575f3688698a8707b80a"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdc20cd1e1141b04696ffcdb7c71e8a4a665db31fe72e51ec706b3bdd2d09f36"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:284d0717d1a7707744018b0b6ee7801b1b1ff044c42f7be7a01bb013de639470"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5bf0eb8b6ef40fa22479f09375468c33bebb7fe49d14d9c96c8fd50355188b0"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ecd71b9226bd1d49416dc9f999772038e56f415a713be51bf18d8676a0841c8"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0061af6e8c5e68b13f1ec9ad5251247726653c5af3c0bbdfbca6cf931e99216"}, - {file = "pymongo-4.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:658d0170f27984e0d89c09fe5c42296613b711a3ffd847eb373b0dbb5b648d5f"}, - {file = "pymongo-4.8.0-cp38-cp38-win32.whl", hash = "sha256:3ed1c316718a2836f7efc3d75b4b0ffdd47894090bc697de8385acd13c513a70"}, - {file = "pymongo-4.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:7148419eedfea9ecb940961cfe465efaba90595568a1fb97585fb535ea63fe2b"}, - {file = "pymongo-4.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8400587d594761e5136a3423111f499574be5fd53cf0aefa0d0f05b180710b0"}, - {file = "pymongo-4.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af3e98dd9702b73e4e6fd780f6925352237f5dce8d99405ff1543f3771201704"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3a860f037bb51f968de320baef85090ff0bbb42ec4f28ec6a5ddf88be61871"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fc18b3a093f3db008c5fea0e980dbd3b743449eee29b5718bc2dc15ab5088bb"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18c9d8f975dd7194c37193583fd7d1eb9aea0c21ee58955ecf35362239ff31ac"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:408b2f8fdbeca3c19e4156f28fff1ab11c3efb0407b60687162d49f68075e63c"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6564780cafd6abeea49759fe661792bd5a67e4f51bca62b88faab497ab5fe89"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d18d86bc9e103f4d3d4f18b85a0471c0e13ce5b79194e4a0389a224bb70edd53"}, - {file = "pymongo-4.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9097c331577cecf8034422956daaba7ec74c26f7b255d718c584faddd7fa2e3c"}, - {file = "pymongo-4.8.0-cp39-cp39-win32.whl", hash = "sha256:d5428dbcd43d02f6306e1c3c95f692f68b284e6ee5390292242f509004c9e3a8"}, - {file = "pymongo-4.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:ef7225755ed27bfdb18730c68f6cb023d06c28f2b734597480fb4c0e500feb6f"}, - {file = "pymongo-4.8.0.tar.gz", hash = "sha256:454f2295875744dc70f1881e4b2eb99cdad008a33574bc8aaf120530f66c0cde"}, -] - -[package.dependencies] -dnspython = ">=1.16.0,<3.0.0" - -[package.extras] -aws = ["pymongo-auth-aws (>=1.1.0,<2.0.0)"] -docs = ["furo (==2023.9.10)", "readthedocs-sphinx-search (>=0.3,<1.0)", "sphinx (>=5.3,<8)", "sphinx-rtd-theme (>=2,<3)", "sphinxcontrib-shellcheck (>=1,<2)"] -encryption = ["certifi", "pymongo-auth-aws (>=1.1.0,<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] -gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] -ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] -snappy = ["python-snappy"] -test = ["pytest (>=7)"] -zstd = ["zstandard"] - -[[package]] -name = "pytest" -version = "7.4.4" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.21.2" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest_asyncio-0.21.2-py3-none-any.whl", hash = "sha256:ab664c88bb7998f711d8039cacd4884da6430886ae8bbd4eded552ed2004f16b"}, - {file = "pytest_asyncio-0.21.2.tar.gz", hash = "sha256:d67738fc232b94b326b9d060750beb16e0074210b98dd8b58a5239fa2a154f45"}, -] - -[package.dependencies] -pytest = ">=7.0.0" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] - -[[package]] -name = "pytest-mock" -version = "3.14.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, - {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "pytest-watcher" -version = "0.3.5" -description = "Automatically rerun your tests on file modifications" -optional = false -python-versions = ">=3.7.0,<4.0.0" -files = [ - {file = "pytest_watcher-0.3.5-py3-none-any.whl", hash = "sha256:af00ca52c7be22dc34c0fd3d7ffef99057207a73b05dc5161fe3b2fe91f58130"}, - {file = "pytest_watcher-0.3.5.tar.gz", hash = "sha256:8896152460ba2b1a8200c12117c6611008ec96c8b2d811f0a05ab8a82b043ff8"}, -] - -[package.dependencies] -tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} -watchdog = ">=2.0.0" - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "regex" -version = "2024.9.11" -description = "Alternative regular expression module, to replace re." -optional = false -python-versions = ">=3.8" -files = [ - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, - {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, - {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, - {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, - {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, - {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, - {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, -] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "ruff" -version = "0.5.7" -description = "An extremely fast Python linter and code formatter, written in Rust." -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"}, - {file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"}, - {file = "ruff-0.5.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e"}, - {file = "ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8"}, - {file = "ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea"}, - {file = "ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc"}, - {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692"}, - {file = "ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf"}, - {file = "ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb"}, - {file = "ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e"}, - {file = "ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499"}, - {file = "ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e"}, - {file = "ruff-0.5.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5"}, - {file = "ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e"}, - {file = "ruff-0.5.7-py3-none-win32.whl", hash = "sha256:33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a"}, - {file = "ruff-0.5.7-py3-none-win_amd64.whl", hash = "sha256:083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3"}, - {file = "ruff-0.5.7-py3-none-win_arm64.whl", hash = "sha256:2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4"}, - {file = "ruff-0.5.7.tar.gz", hash = "sha256:8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5"}, -] - -[[package]] -name = "simsimd" -version = "5.2.1" -description = "Fastest SIMD-Accelerated Vector Similarity Functions for x86 and Arm" -optional = false -python-versions = "*" -files = [ - {file = "simsimd-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c077d30656507812eb502b13da21d383f209729980e6f33775c005e54c834080"}, - {file = "simsimd-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8a6489fd3251295e40ea646aef9bfd68488eef67f29f10acda185eca65cda48a"}, - {file = "simsimd-5.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:881401ab4aac969cfb1ba0301590fdf40cc53149dc0baa0556823b032a9213b6"}, - {file = "simsimd-5.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f15689b58a79cd21d5975a4ce166d9fb01b59b8b509e76ef9f0eb77453cdaec"}, - {file = "simsimd-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d249db978814a25a4c802c1eb24e82deca078d311da9952edd0e7cf28b8cb75"}, - {file = "simsimd-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25cf244831e79ef4157fabf7e1390b7187f509850f3926fc7c49d16c0aa1a1f0"}, - {file = "simsimd-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d7a146bc9271cef4a1543e9cdcabab0b0f5b8bccc3ef3d2277d5126ab285adca"}, - {file = "simsimd-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:8ce059db56c798f0647cd50fecac8f20f5ad609ad77ce644fc91373487dd3c37"}, - {file = "simsimd-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:face4052008d5c4b12dc6fc09d5ce0f39b81e6114c38b714695d52f4877e9953"}, - {file = "simsimd-5.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cbc9774af40625033a5e6be90768154d1aef18f539b456e7691dc3576a31bcd5"}, - {file = "simsimd-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6396ea925ae3fcaa6374684bff5049b87e76ad1888cf2e53d25767039144a360"}, - {file = "simsimd-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9c802c21ca47072b7135ad5393af3231c6c15f27ee18fb7c9809f5251b5c478c"}, - {file = "simsimd-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:99f8e80d5758d1dba871d29adf9301e4d2d721902a8084e961247841fc4306a3"}, - {file = "simsimd-5.2.1-cp310-cp310-win32.whl", hash = "sha256:305ca88529a178dc2293337aa38ba733ad85f5e31e0c35111dabd77c45691718"}, - {file = "simsimd-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:305499b42baf559d0ddaaf5a8c14810ed9f11d248c19a16418ab88a6c7fb1c05"}, - {file = "simsimd-5.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:a405c8bdaec9b9cd634a25e153994705fb22f4e2f674e0b3a1e349dd514d3b1e"}, - {file = "simsimd-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f342914fd54b90939a053d6ec6dde0b47131d39c2b2c3bfcf10acb9feac62be"}, - {file = "simsimd-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44287add557bb4e78d249e3b076a37272c8ff62df379f4f837bf7d66534eae5d"}, - {file = "simsimd-5.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cece60f867d54b15342aa421d561f26860fe70b93e0f13b9499718de3bf791b"}, - {file = "simsimd-5.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f02d7520b5f794ed1d8b1177214f263a06e334750fc6b4d8ba7bccfc0ea30d1d"}, - {file = "simsimd-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e3a288d5eac00a15df181354822f5714278d3b4123a5d8f1dcfc62fd1d2ffa9d"}, - {file = "simsimd-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16dfc66f54b2ab95f74e3b1d886351ad65a69ab75041e069355b89f18e3ea36"}, - {file = "simsimd-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:78080b55b213117648038a657ad1437f465065077e79762ce04990b7cc4645dd"}, - {file = "simsimd-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:b7fb76b585194f040807aa40928515610d19ef0fb7d8bbb316dde17a05597b77"}, - {file = "simsimd-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a9f042fe6b8102b9e301c862aa655b1181cc73ebf589448ee2525c8c7023fd59"}, - {file = "simsimd-5.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b5935ec1e4c62945972139f6ba6ca955e27d7781870fd89aab95c38e1614603c"}, - {file = "simsimd-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:07d77442a796b88ec984c2180f9c81ca912b11686f3e730a9648ff18644a136a"}, - {file = "simsimd-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e95dcbcd2931f51a449b664252746b1eba0dfc04715d14e9d79116000e13db3a"}, - {file = "simsimd-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:059c4b357d99757c8661d54141f4004fbb0ebbccf985cb39a1b630304af5fedf"}, - {file = "simsimd-5.2.1-cp311-cp311-win32.whl", hash = "sha256:0cf31a6fa6a62efd12d477f493411c1af1c64a7d61509ceebac593a83d1d4209"}, - {file = "simsimd-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:45d174f65ffe89020b01321a7f37404da8460c4800617fa5902ccc99b696ec9a"}, - {file = "simsimd-5.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6dc78085e112c0e36e6eeca546074cf8c56b2d80fba757bef8bebc444e61b72b"}, - {file = "simsimd-5.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4936f92a6f25bf1b8cfd4069e850821e6ffe17addd997893d945994139cf1ec0"}, - {file = "simsimd-5.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e16167789eb54c81ffdd0c1e185dd61df9a2fec6044067a047698b0af67865c0"}, - {file = "simsimd-5.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b04ba0570d9e258fd059a5f3964039e2fe6298d57363a9a9bb4ae0c000cd65a7"}, - {file = "simsimd-5.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d4228bc8be42f9c9b6d59399303e9682f2edc9f2cc1550a3658ba8a9f0519a7"}, - {file = "simsimd-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c3a80fdb3582d08f2da3d53daec73ea872fdac303529910aef71a774c1568bf"}, - {file = "simsimd-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5fbbc0068ef3daa85195508b25aa73562b07c3097fea1243aa2864e21dfd178d"}, - {file = "simsimd-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3fe52c6b94f6777b0eca796a5751dbd4e55bae947d1906a00b31dd32f1a085f7"}, - {file = "simsimd-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:cdeda38843f4544e3cdc5687332ccd030ec9a3e10a47a7a63a9652ddc60f20ba"}, - {file = "simsimd-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8234b6a9308d5025a594413ca93b1e9dc4f9f9e2d4020af32529ed302570dacd"}, - {file = "simsimd-5.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:687725313925297aa36effac39013b1e31ed4d01764b5322bdc9eb0e73c51b6a"}, - {file = "simsimd-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bb9aadd29b0def9d6d0811bd2e9fde1643e755aaf8d4010892c0e00f0e586477"}, - {file = "simsimd-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1df8520eac767584677367c598bd3c90abe0fa9ff49924eb289fea5b6fb6b2b3"}, - {file = "simsimd-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f802b5435b9014fd2882641d45e279ff418c9bed83322957a99796fc6a9fae3d"}, - {file = "simsimd-5.2.1-cp312-cp312-win32.whl", hash = "sha256:271a5bb5daf3db37b4ca71c419ecc6c5c0d3a801cf4773907ae338aa34f18a1a"}, - {file = "simsimd-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5d2a3ec2c3b90bd036823f16184d3fbfabc2a8fa9ba120f29cc3361ab3c68be8"}, - {file = "simsimd-5.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:cf63293357013aa8d135d8f30443ce248223a53faf30e1e6d1464e559afd0b30"}, - {file = "simsimd-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f95a7b56803e2ce952aa2476b7ed4ed5b8fe0f2c40daf14d6100bcd923282b99"}, - {file = "simsimd-5.2.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01af17b95e1736f006177b3a84b6d25ec6068a2e0af97eed33f87c9d23684d0a"}, - {file = "simsimd-5.2.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfef17e3a12f2c379d428bc4785637472b6a379e7122d3d227bbd5d9c20454ee"}, - {file = "simsimd-5.2.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef288a2f89fe4b00c65f16895519da78c443d2e75080a8067b9d83196e911592"}, - {file = "simsimd-5.2.1-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:82fe3f4a70e79eb7a17cfac8b129fe0e0ea63408513091618703b85a6c90db00"}, - {file = "simsimd-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:035487a05b923541c3c524af56472f4121f14cb9a6761ae0d0d9101da077fe7a"}, - {file = "simsimd-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:0b1fe4154cb9622a3640b81d05d07276c785ada6ac59512160624f4f2225b8cc"}, - {file = "simsimd-5.2.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:b55bc8fd307f7cb8fa2bd76ae0bdd4a196b7e92ae592d08bc151991357aa636e"}, - {file = "simsimd-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:d8e5075a8798b7641fd394dd7fbda5c7be349f5616780076d8a5cf826f29fc5f"}, - {file = "simsimd-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:c310dda98e8cc56fc856f369fe6a925bbde72ca33c735808037cc7300edad5c9"}, - {file = "simsimd-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:81c052de76ccc31df39ee6a2929495fa386fcc2f8bd96512de50f10365c1434a"}, - {file = "simsimd-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:b2dd417556d22be66a1f8bb8fe2a8222655c97382d2736802100ec2b658bf179"}, - {file = "simsimd-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:309a6a29e8213d7af603cdd0a30e7500f3ef3f5caafa17d1cb131f9a45faafb6"}, - {file = "simsimd-5.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1500bf3e6728c98e01efd4e8b03ac27d5451a92c8cd00cd2c80314e0fef37f12"}, - {file = "simsimd-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2124f8928be3e63e253d349e0063d2e2e9c2959143425f383f7302d46e3588c"}, - {file = "simsimd-5.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:614828d03eca528cf0aebaa7aec24e774256f806c1feb4353bdeedaad8eb8b12"}, - {file = "simsimd-5.2.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a983fef4c490c547babff1b99dbcc7ffac604157b5948b84532bbaf27e5359e"}, - {file = "simsimd-5.2.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70eb039199b9c360ac7f081a1cccc34a1ef849653ea3dabe0c2a51cf014ae36e"}, - {file = "simsimd-5.2.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e77360121c0d3522d937c43a93ed5bc359ab05826c6b1443980536bf31966b90"}, - {file = "simsimd-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:72e7d2c04d8b66642558eaa09e36bbdcb2c818ad0b8116f318122635c0512493"}, - {file = "simsimd-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:510aa97c25ddae310a3ea6e818f161c5a9a178624a75f4d1c62d1898dba9537d"}, - {file = "simsimd-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:cf9d37d1dbd26e6e2c30d4410d007ecdb4a588ef316a50e257ada67fc1d7512b"}, - {file = "simsimd-5.2.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9426ee74d6898f8cbd4ef6735216428c445367c2042a1573da9e0b327cbc0d7e"}, - {file = "simsimd-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ce298323cf4b35cf652a11a45889df277a1e4ef58bc298baf6cccec938de4827"}, - {file = "simsimd-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:beb76cdb6a5442be351a4dcbaf35bc51e6e815e37b7cda3c27886c9de0112ed8"}, - {file = "simsimd-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d9ba0b406a658053b9e4cc989881e055dbe419bfd0ef626a2f2d2d48ff9db879"}, - {file = "simsimd-5.2.1-cp38-cp38-win32.whl", hash = "sha256:7d465e56848ff733725dbc6e2f4c79ee7073f695006013c9d0aff6daa6a750cf"}, - {file = "simsimd-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:c0f37b3c5963792925795f22ab90405df243e2738ec5b857ec5114a29facab38"}, - {file = "simsimd-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:095b143ff85fe57beec75783d48878a2c821fa249dd26c5f98521ecf6edfc77c"}, - {file = "simsimd-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b576df0679f5d92299f7b33ff28342cae154d46f3bfb0171253ad4cdcf8fc07a"}, - {file = "simsimd-5.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9ba17ad2fdf6543f5b4091b4d94413d60760e44b1ebbff9c661d44c6ce642296"}, - {file = "simsimd-5.2.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53cbb3b5202a06a5ffaef5d2a006b0a4f345f630951b9b2b9abada3cc279a532"}, - {file = "simsimd-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fb49bb7cab159a625f9c2c1b0a236ce2d0c0bb217a63e36d46d6122c44d1b2f"}, - {file = "simsimd-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8056abac0fd86e7d864bc59e75bd750e796e67aa55cb9a2f58b3f8ec3a71c6b"}, - {file = "simsimd-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:d02be0a65bbe5ead9fdfefd18f0babb27b4856ad02d3ff4b8b0126223288588a"}, - {file = "simsimd-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2f1afeeedb6639628a94dcc4f7d01d670f43f4b10909c96876837c311b8f11d7"}, - {file = "simsimd-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6f9ed03113216707f74381324b57105afad8fbd12323f474830c0929750631d1"}, - {file = "simsimd-5.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:818f3bd2893be61a5484a981ec262162ef480f06bfffd9686ddeab4b59d75d3f"}, - {file = "simsimd-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2cab5afce104f35cdb1b82c20b3c29e04f19d3ac73961316e6f065b7ef072e9"}, - {file = "simsimd-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:d20a5c7343e86daeb869ea5e2c9d5ca8c358bc7370288176ef04157fea5bad27"}, - {file = "simsimd-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b23ffe97bb938803bf367f2de25ca971033be00774fbbf09426147a89fcc5dc4"}, - {file = "simsimd-5.2.1-cp39-cp39-win32.whl", hash = "sha256:8e942cc946b813937ae99ca3ea3d20ec68aaddc173904c298d65eee75d7d08a3"}, - {file = "simsimd-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:8d290c7361d9c8a87f6408d4ff7799c7df8278ac28d41e9ed68d252040854ca4"}, - {file = "simsimd-5.2.1-cp39-cp39-win_arm64.whl", hash = "sha256:6159540ba7ed5b9e8e34d340943e31f7791b2c49436d299969014be9869da350"}, - {file = "simsimd-5.2.1.tar.gz", hash = "sha256:716f607e06c9570288db42f2bb9661dadd79188874dba1c7df71d8efec4ecbb8"}, -] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.34" -description = "Database Abstraction Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d0b2cf8791ab5fb9e3aa3d9a79a0d5d51f55b6357eecf532a120ba3b5524db"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:243f92596f4fd4c8bd30ab8e8dd5965afe226363d75cab2468f2c707f64cd83b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:173f5f122d2e1bff8fbd9f7811b7942bead1f5e9f371cdf9e670b327e6703ebd"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd90c221ed4e60ac9d476db967f436cfcecbd4ef744537c0f2d5291439848768"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win32.whl", hash = "sha256:3166dfff2d16fe9be3241ee60ece6fcb01cf8e74dd7c5e0b64f8e19fab44911b"}, - {file = "SQLAlchemy-2.0.34-cp310-cp310-win_amd64.whl", hash = "sha256:6831a78bbd3c40f909b3e5233f87341f12d0b34a58f14115c9e94b4cdaf726d3"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7db3db284a0edaebe87f8f6642c2b2c27ed85c3e70064b84d1c9e4ec06d5d84"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:430093fce0efc7941d911d34f75a70084f12f6ca5c15d19595c18753edb7c33b"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79cb400c360c7c210097b147c16a9e4c14688a6402445ac848f296ade6283bbc"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1b30f31a36c7f3fee848391ff77eebdd3af5750bf95fbf9b8b5323edfdb4ec"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fddde2368e777ea2a4891a3fb4341e910a056be0bb15303bf1b92f073b80c02"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80bd73ea335203b125cf1d8e50fef06be709619eb6ab9e7b891ea34b5baa2287"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win32.whl", hash = "sha256:6daeb8382d0df526372abd9cb795c992e18eed25ef2c43afe518c73f8cccb721"}, - {file = "SQLAlchemy-2.0.34-cp311-cp311-win_amd64.whl", hash = "sha256:5bc08e75ed11693ecb648b7a0a4ed80da6d10845e44be0c98c03f2f880b68ff4"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:53e68b091492c8ed2bd0141e00ad3089bcc6bf0e6ec4142ad6505b4afe64163e"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bcd18441a49499bf5528deaa9dee1f5c01ca491fc2791b13604e8f972877f812"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165bbe0b376541092bf49542bd9827b048357f4623486096fc9aaa6d4e7c59a2"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3330415cd387d2b88600e8e26b510d0370db9b7eaf984354a43e19c40df2e2b"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97b850f73f8abbffb66ccbab6e55a195a0eb655e5dc74624d15cff4bfb35bd74"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee4c6917857fd6121ed84f56d1dc78eb1d0e87f845ab5a568aba73e78adf83"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win32.whl", hash = "sha256:fbb034f565ecbe6c530dff948239377ba859420d146d5f62f0271407ffb8c580"}, - {file = "SQLAlchemy-2.0.34-cp312-cp312-win_amd64.whl", hash = "sha256:707c8f44931a4facd4149b52b75b80544a8d824162602b8cd2fe788207307f9a"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:24af3dc43568f3780b7e1e57c49b41d98b2d940c1fd2e62d65d3928b6f95f021"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:413c85cd0177c23e32dee6898c67a5f49296640041d98fddb2c40888fe4daa2e"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:526ce723265643dbc4c7efb54f56648cc30e7abe20f387d763364b3ce7506c82"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win32.whl", hash = "sha256:13be2cc683b76977a700948411a94c67ad8faf542fa7da2a4b167f2244781cf3"}, - {file = "SQLAlchemy-2.0.34-cp37-cp37m-win_amd64.whl", hash = "sha256:e54ef33ea80d464c3dcfe881eb00ad5921b60f8115ea1a30d781653edc2fd6a2"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43f28005141165edd11fbbf1541c920bd29e167b8bbc1fb410d4fe2269c1667a"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b68094b165a9e930aedef90725a8fcfafe9ef95370cbb54abc0464062dbf808f"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:203d46bddeaa7982f9c3cc693e5bc93db476ab5de9d4b4640d5c99ff219bee8c"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9661268415f450c95f72f0ac1217cc6f10256f860eed85c2ae32e75b60278ad8"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win32.whl", hash = "sha256:895184dfef8708e15f7516bd930bda7e50ead069280d2ce09ba11781b630a434"}, - {file = "SQLAlchemy-2.0.34-cp38-cp38-win_amd64.whl", hash = "sha256:6e7cde3a2221aa89247944cafb1b26616380e30c63e37ed19ff0bba5e968688d"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbcdf987f3aceef9763b6d7b1fd3e4ee210ddd26cac421d78b3c206d07b2700b"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce119fc4ce0d64124d37f66a6f2a584fddc3c5001755f8a49f1ca0a177ef9796"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ebc11c54c6ecdd07bb4efbfa1554538982f5432dfb8456958b6d46b9f834bb7"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:220574e78ad986aea8e81ac68821e47ea9202b7e44f251b7ed8c66d9ae3f4278"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win32.whl", hash = "sha256:b75b00083e7fe6621ce13cfce9d4469c4774e55e8e9d38c305b37f13cf1e874c"}, - {file = "SQLAlchemy-2.0.34-cp39-cp39-win_amd64.whl", hash = "sha256:c29d03e0adf3cc1a8c3ec62d176824972ae29b67a66cbb18daff3062acc6faa8"}, - {file = "SQLAlchemy-2.0.34-py3-none-any.whl", hash = "sha256:7286c353ee6475613d8beff83167374006c6b3e3f0e6491bfe8ca610eb1dec0f"}, - {file = "sqlalchemy-2.0.34.tar.gz", hash = "sha256:10d8f36990dd929690666679b0f42235c159a7051534adb135728ee52828dd22"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} -typing-extensions = ">=4.6.0" - -[package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=8)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3_binary"] - -[[package]] -name = "syrupy" -version = "4.7.1" -description = "Pytest Snapshot Test Utility" -optional = false -python-versions = ">=3.8.1" -files = [ - {file = "syrupy-4.7.1-py3-none-any.whl", hash = "sha256:be002267a512a4bedddfae2e026c93df1ea928ae10baadc09640516923376d41"}, - {file = "syrupy-4.7.1.tar.gz", hash = "sha256:f9d4485f3f27d0e5df6ed299cac6fa32eb40a441915d988e82be5a4bdda335c8"}, -] - -[package.dependencies] -pytest = ">=7.0.0,<9.0.0" - -[[package]] -name = "tenacity" -version = "8.5.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, - {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - -[[package]] -name = "tiktoken" -version = "0.7.0" -description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, - {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, - {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, - {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, - {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, - {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, - {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, - {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, -] - -[package.dependencies] -regex = ">=2022.1.18" -requests = ">=2.26.0" - -[package.extras] -blobfile = ["blobfile (>=2)"] - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - -[[package]] -name = "tqdm" -version = "4.66.5" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "urllib3" -version = "2.2.3" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.8" -files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "watchdog" -version = "5.0.2" -description = "Filesystem events monitoring" -optional = false -python-versions = ">=3.9" -files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - -[[package]] -name = "yarl" -version = "1.11.1" -description = "Yet another URL library" -optional = false -python-versions = ">=3.8" -files = [ - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, - {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, - {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, - {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, - {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, - {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, - {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, - {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, - {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, - {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, - {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, - {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, - {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, - {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, - {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9,<4.0" -content-hash = "681e0e1234215ead5420ff8c770d424c7f4d65079fde4709deafd183f786f29a" diff --git a/libs/partners/mongodb/pyproject.toml b/libs/partners/mongodb/pyproject.toml deleted file mode 100644 index a6faef2fd9c2a..0000000000000 --- a/libs/partners/mongodb/pyproject.toml +++ /dev/null @@ -1,103 +0,0 @@ -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" - -[tool.poetry] -name = "langchain-mongodb" -version = "0.2.0" -description = "An integration package connecting MongoDB and LangChain" -authors = [] -readme = "README.md" -repository = "https://github.com/langchain-ai/langchain" -license = "MIT" - -[tool.mypy] -disallow_untyped_defs = "True" - -[tool.poetry.urls] -"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/mongodb" -"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-mongodb%3D%3D0%22&expanded=true" - -[tool.poetry.dependencies] -python = ">=3.9,<4.0" -pymongo = ">=4.6.1,<5.0" -langchain-core = "^0.3" - -[[tool.poetry.dependencies.numpy]] -version = "^1" -python = "<3.12" - -[[tool.poetry.dependencies.numpy]] -version = "^1.26.0" -python = ">=3.12" - -[tool.ruff.lint] -select = ["E", "F", "I"] - -[tool.coverage.run] -omit = ["tests/*"] - -[tool.pytest.ini_options] -addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5" -markers = [ - "requires: mark tests as requiring a specific library", - "compile: mark placeholder test used to compile integration tests without running them", -] -asyncio_mode = "auto" - -[tool.poetry.group.test] -optional = true - -[tool.poetry.group.codespell] -optional = true - -[tool.poetry.group.test_integration] -optional = true - -[tool.poetry.group.lint] -optional = true - -[tool.poetry.group.dev] -optional = true - -[tool.poetry.group.test.dependencies] -pytest = "^7.3.0" -freezegun = "^1.2.2" -pytest-mock = "^3.10.0" -syrupy = "^4.0.2" -pytest-watcher = "^0.3.4" -pytest-asyncio = "^0.21.1" - -[tool.poetry.group.codespell.dependencies] -codespell = "^2.2.0" - -[tool.poetry.group.test_integration.dependencies.langchain-openai] -path = "../openai" -develop = true - -[tool.poetry.group.lint.dependencies] -ruff = "^0.5" - -[tool.poetry.group.typing.dependencies] -mypy = "^1.10" -simsimd = "^5.0.0" - -[tool.poetry.group.test.dependencies.langchain] -path = "../../langchain" -develop = true - -[tool.poetry.group.test.dependencies.langchain-core] -path = "../../core" -develop = true - -[tool.poetry.group.test.dependencies.langchain-text-splitters] -path = "../../text-splitters" -develop = true - -[tool.poetry.group.dev.dependencies.langchain-core] -path = "../../core" -develop = true - -[tool.poetry.group.typing.dependencies.langchain-core] -path = "../../core" -develop = true diff --git a/libs/partners/mongodb/scripts/check_imports.py b/libs/partners/mongodb/scripts/check_imports.py deleted file mode 100644 index ba8de50118c4e..0000000000000 --- a/libs/partners/mongodb/scripts/check_imports.py +++ /dev/null @@ -1,17 +0,0 @@ -import sys -import traceback -from importlib.machinery import SourceFileLoader - -if __name__ == "__main__": - files = sys.argv[1:] - has_failure = False - for file in files: - try: - SourceFileLoader("x", file).load_module() - except Exception: - has_failure = True - print(file) - traceback.print_exc() - print() - - sys.exit(1 if has_failure else 0) diff --git a/libs/partners/mongodb/scripts/lint_imports.sh b/libs/partners/mongodb/scripts/lint_imports.sh deleted file mode 100755 index 695613c7ba8fd..0000000000000 --- a/libs/partners/mongodb/scripts/lint_imports.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -eu - -# Initialize a variable to keep track of errors -errors=0 - -# make sure not importing from langchain or langchain_experimental -git --no-pager grep '^from langchain\.' . && errors=$((errors+1)) -git --no-pager grep '^from langchain_experimental\.' . && errors=$((errors+1)) - -# Decide on an exit status based on the errors -if [ "$errors" -gt 0 ]; then - exit 1 -else - exit 0 -fi diff --git a/libs/partners/mongodb/tests/__init__.py b/libs/partners/mongodb/tests/__init__.py deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/mongodb/tests/integration_tests/__init__.py b/libs/partners/mongodb/tests/integration_tests/__init__.py deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/mongodb/tests/integration_tests/test_cache.py b/libs/partners/mongodb/tests/integration_tests/test_cache.py deleted file mode 100644 index c0fe736700410..0000000000000 --- a/libs/partners/mongodb/tests/integration_tests/test_cache.py +++ /dev/null @@ -1,161 +0,0 @@ -import os -import uuid -from typing import Any, List, Union - -import pytest # type: ignore[import-not-found] -from langchain_core.caches import BaseCache -from langchain_core.globals import get_llm_cache, set_llm_cache -from langchain_core.load.dump import dumps -from langchain_core.messages import AIMessage, BaseMessage, HumanMessage -from langchain_core.outputs import ChatGeneration, Generation, LLMResult - -from langchain_mongodb.cache import MongoDBAtlasSemanticCache, MongoDBCache - -from ..utils import ConsistentFakeEmbeddings, FakeChatModel, FakeLLM - -CONN_STRING = os.environ.get("MONGODB_ATLAS_URI") -INDEX_NAME = "langchain-test-index-semantic-cache" -DATABASE = "langchain_test_db" -COLLECTION = "langchain_test_cache" - - -def random_string() -> str: - return str(uuid.uuid4()) - - -def llm_cache(cls: Any) -> BaseCache: - set_llm_cache( - cls( - embedding=ConsistentFakeEmbeddings(dimensionality=1536), - connection_string=CONN_STRING, - collection_name=COLLECTION, - database_name=DATABASE, - index_name=INDEX_NAME, - score_threshold=0.5, - wait_until_ready=15.0, - ) - ) - assert get_llm_cache() - return get_llm_cache() - - -def _execute_test( - prompt: Union[str, List[BaseMessage]], - llm: Union[str, FakeLLM, FakeChatModel], - response: List[Generation], -) -> None: - # Fabricate an LLM String - - if not isinstance(llm, str): - params = llm.dict() - params["stop"] = None - llm_string = str(sorted([(k, v) for k, v in params.items()])) - else: - llm_string = llm - - # If the prompt is a str then we should pass just the string - dumped_prompt: str = prompt if isinstance(prompt, str) else dumps(prompt) - - # Update the cache - get_llm_cache().update(dumped_prompt, llm_string, response) - - # Retrieve the cached result through 'generate' call - output: Union[List[Generation], LLMResult, None] - expected_output: Union[List[Generation], LLMResult] - - if isinstance(llm, str): - output = get_llm_cache().lookup(dumped_prompt, llm) # type: ignore - expected_output = response - else: - output = llm.generate([prompt]) # type: ignore - expected_output = LLMResult( - generations=[response], - llm_output={}, - ) - - assert output == expected_output # type: ignore - - -@pytest.mark.parametrize( - "prompt, llm, response", - [ - ("foo", "bar", [Generation(text="fizz")]), - ("foo", FakeLLM(), [Generation(text="fizz")]), - ( - [HumanMessage(content="foo")], - FakeChatModel(), - [ChatGeneration(message=AIMessage(content="foo"))], - ), - ], - ids=[ - "plain_cache", - "cache_with_llm", - "cache_with_chat", - ], -) -@pytest.mark.parametrize("cacher", [MongoDBCache, MongoDBAtlasSemanticCache]) -@pytest.mark.parametrize("remove_score", [True, False]) -def test_mongodb_cache( - remove_score: bool, - cacher: Union[MongoDBCache, MongoDBAtlasSemanticCache], - prompt: Union[str, List[BaseMessage]], - llm: Union[str, FakeLLM, FakeChatModel], - response: List[Generation], -) -> None: - llm_cache(cacher) - if remove_score: - get_llm_cache().score_threshold = None # type: ignore - try: - _execute_test(prompt, llm, response) - finally: - get_llm_cache().clear() - - -@pytest.mark.parametrize( - "prompts, generations", - [ - # Single prompt, single generation - ([random_string()], [[random_string()]]), - # Single prompt, multiple generations - ([random_string()], [[random_string(), random_string()]]), - # Single prompt, multiple generations - ([random_string()], [[random_string(), random_string(), random_string()]]), - # Multiple prompts, multiple generations - ( - [random_string(), random_string()], - [[random_string()], [random_string(), random_string()]], - ), - ], - ids=[ - "single_prompt_single_generation", - "single_prompt_two_generations", - "single_prompt_three_generations", - "multiple_prompts_multiple_generations", - ], -) -def test_mongodb_atlas_cache_matrix( - prompts: List[str], - generations: List[List[str]], -) -> None: - llm_cache(MongoDBAtlasSemanticCache) - llm = FakeLLM() - - # Fabricate an LLM String - params = llm.dict() - params["stop"] = None - llm_string = str(sorted([(k, v) for k, v in params.items()])) - - llm_generations = [ - [ - Generation(text=generation, generation_info=params) - for generation in prompt_i_generations - ] - for prompt_i_generations in generations - ] - - for prompt_i, llm_generations_i in zip(prompts, llm_generations): - _execute_test(prompt_i, llm_string, llm_generations_i) - assert llm.generate(prompts) == LLMResult( - generations=llm_generations, llm_output={} - ) - get_llm_cache().clear() diff --git a/libs/partners/mongodb/tests/integration_tests/test_chain_example.py b/libs/partners/mongodb/tests/integration_tests/test_chain_example.py deleted file mode 100644 index d54fa6cb01cc3..0000000000000 --- a/libs/partners/mongodb/tests/integration_tests/test_chain_example.py +++ /dev/null @@ -1,144 +0,0 @@ -"Demonstrates MongoDBAtlasVectorSearch.as_retriever() invoked in a chain" "" - -from __future__ import annotations - -import os -from time import sleep - -import pytest # type: ignore[import-not-found] -from langchain_core.documents import Document -from langchain_core.output_parsers.string import StrOutputParser -from langchain_core.prompts.chat import ChatPromptTemplate -from langchain_core.runnables import RunnablePassthrough -from pymongo import MongoClient -from pymongo.collection import Collection - -from langchain_mongodb import index - -from ..utils import PatchedMongoDBAtlasVectorSearch - -CONNECTION_STRING = os.environ.get("MONGODB_ATLAS_URI") -DB_NAME = "langchain_test_db" -COLLECTION_NAME = "langchain_test_chain_example" -INDEX_NAME = "vector_index" -DIMENSIONS = 1536 -TIMEOUT = 60.0 -INTERVAL = 0.5 - - -@pytest.fixture -def collection() -> Collection: - """A Collection with both a Vector and a Full-text Search Index""" - client: MongoClient = MongoClient(CONNECTION_STRING) - if COLLECTION_NAME not in client[DB_NAME].list_collection_names(): - clxn = client[DB_NAME].create_collection(COLLECTION_NAME) - else: - clxn = client[DB_NAME][COLLECTION_NAME] - - clxn.delete_many({}) - - if all([INDEX_NAME != ix["name"] for ix in clxn.list_search_indexes()]): - index.create_vector_search_index( - collection=clxn, - index_name=INDEX_NAME, - dimensions=DIMENSIONS, - path="embedding", - similarity="cosine", - filters=None, - wait_until_complete=TIMEOUT, - ) - - return clxn - - -@pytest.mark.skipif( - "OPENAI_API_KEY" not in os.environ, reason="Requires OpenAI for chat responses." -) -def test_chain( - collection: Collection, -) -> None: - """Demonstrate usage of MongoDBAtlasVectorSearch in a realistic chain - - Follows example in the docs: https://python.langchain.com/docs/how_to/hybrid/ - - Requires OpenAI_API_KEY for embedding and chat model. - Requires INDEX_NAME to have been set up on MONGODB_ATLAS_URI - """ - - from langchain_openai import ChatOpenAI, OpenAIEmbeddings - - embedding_openai = OpenAIEmbeddings( - openai_api_key=os.environ["OPENAI_API_KEY"], # type: ignore # noqa - model="text-embedding-3-small", - ) - - vectorstore = PatchedMongoDBAtlasVectorSearch( - collection=collection, - embedding=embedding_openai, - index_name=INDEX_NAME, - text_key="page_content", - ) - - texts = [ - "In 2023, I visited Paris", - "In 2022, I visited New York", - "In 2021, I visited New Orleans", - "In 2019, I visited San Francisco", - "In 2020, I visited Vancouver", - ] - vectorstore.add_texts(texts) - - # Give the index time to build (For CI) - sleep(TIMEOUT) - - query = "In the United States, what city did I visit last?" - # One can do vector search on the vector store, using its various search types. - k = len(texts) - - store_output = list(vectorstore.similarity_search(query=query, k=k)) - assert len(store_output) == k - assert isinstance(store_output[0], Document) - - # Unfortunately, the VectorStore output cannot be given to a Chat Model - # If we wish Chat Model to answer based on our own data, - # we have to give it the right things to work with. - # The way that Langchain does this is by piping results along in - # a Chain: https://python.langchain.com/v0.1/docs/modules/chains/ - - # Now, we can turn our VectorStore into something Runnable in a Chain - # by turning it into a Retriever. - # For the simple VectorSearch Retriever, we can do this like so. - - retriever = vectorstore.as_retriever(search_kwargs=dict(k=k)) - - # This does not do much other than expose our search function - # as an invoke() method with a a certain API, a Runnable. - retriever_output = retriever.invoke(query) - assert len(retriever_output) == len(texts) - assert retriever_output[0].page_content == store_output[0].page_content - - # To get a natural language response to our question, - # we need ChatOpenAI, a template to better frame the question as a prompt, - # and a parser to send the output to a string. - # Together, these become our Chain! - # Here goes: - - template = """Answer the question based only on the following context. - Answer in as few words as possible. - {context} - Question: {question} - """ - prompt = ChatPromptTemplate.from_template(template) - - model = ChatOpenAI() - - chain = ( - {"context": retriever, "question": RunnablePassthrough()} # type: ignore - | prompt - | model - | StrOutputParser() - ) - - answer = chain.invoke("What city did I visit last?") - - assert "Paris" in answer diff --git a/libs/partners/mongodb/tests/integration_tests/test_chat_message_histories.py b/libs/partners/mongodb/tests/integration_tests/test_chat_message_histories.py deleted file mode 100644 index 5b0a7b493e875..0000000000000 --- a/libs/partners/mongodb/tests/integration_tests/test_chat_message_histories.py +++ /dev/null @@ -1,43 +0,0 @@ -import json -import os - -from langchain.memory import ConversationBufferMemory # type: ignore[import-not-found] -from langchain_core.messages import message_to_dict - -from langchain_mongodb.chat_message_histories import MongoDBChatMessageHistory - -DATABASE = "langchain_test_db" -COLLECTION = "langchain_test_chat" - -# Replace these with your mongodb connection string -connection_string = os.environ.get("MONGODB_ATLAS_URI", "") - - -def test_memory_with_message_store() -> None: - """Test the memory with a message store.""" - # setup MongoDB as a message store - message_history = MongoDBChatMessageHistory( - connection_string=connection_string, - session_id="test-session", - database_name=DATABASE, - collection_name=COLLECTION, - ) - memory = ConversationBufferMemory( - memory_key="baz", chat_memory=message_history, return_messages=True - ) - - # add some messages - memory.chat_memory.add_ai_message("This is me, the AI") - memory.chat_memory.add_user_message("This is me, the human") - - # get the message history from the memory store and turn it into a json - messages = memory.chat_memory.messages - messages_json = json.dumps([message_to_dict(msg) for msg in messages]) - - assert "This is me, the AI" in messages_json - assert "This is me, the human" in messages_json - - # remove the record from MongoDB, so the next test run won't pick it up - memory.chat_memory.clear() - - assert memory.chat_memory.messages == [] diff --git a/libs/partners/mongodb/tests/integration_tests/test_compile.py b/libs/partners/mongodb/tests/integration_tests/test_compile.py deleted file mode 100644 index 5196f4c0f8c51..0000000000000 --- a/libs/partners/mongodb/tests/integration_tests/test_compile.py +++ /dev/null @@ -1,7 +0,0 @@ -import pytest # type: ignore[import-not-found] - - -@pytest.mark.compile -def test_placeholder() -> None: - """Used for compiling integration tests without running any real tests.""" - pass diff --git a/libs/partners/mongodb/tests/integration_tests/test_index.py b/libs/partners/mongodb/tests/integration_tests/test_index.py deleted file mode 100644 index 000cbed484d89..0000000000000 --- a/libs/partners/mongodb/tests/integration_tests/test_index.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Search index commands are only supported on Atlas Clusters >=M10""" - -import os -from typing import Generator, List, Optional - -import pytest -from pymongo import MongoClient -from pymongo.collection import Collection - -from langchain_mongodb import index - -DB_NAME = "langchain_test_index_db" -COLLECTION_NAME = "test_index" -VECTOR_INDEX_NAME = "vector_index" - -TIMEOUT = 120 -DIMENSIONS = 10 - - -@pytest.fixture -def collection() -> Generator: - """Depending on uri, this could point to any type of cluster.""" - uri = os.environ.get("MONGODB_ATLAS_URI") - client: MongoClient = MongoClient(uri) - clxn = client[DB_NAME][COLLECTION_NAME] - clxn.insert_one({"foo": "bar"}) - yield clxn - clxn.drop() - - -def test_search_index_commands(collection: Collection) -> None: - index_name = VECTOR_INDEX_NAME - dimensions = DIMENSIONS - path = "embedding" - similarity = "cosine" - filters: Optional[List[str]] = None - wait_until_complete = TIMEOUT - - for index_info in collection.list_search_indexes(): - index.drop_vector_search_index( - collection, index_info["name"], wait_until_complete=wait_until_complete - ) - - assert len(list(collection.list_search_indexes())) == 0 - - index.create_vector_search_index( - collection=collection, - index_name=index_name, - dimensions=dimensions, - path=path, - similarity=similarity, - filters=filters, - wait_until_complete=wait_until_complete, - ) - - assert index._is_index_ready(collection, index_name) - indexes = list(collection.list_search_indexes()) - assert len(indexes) == 1 - assert indexes[0]["name"] == index_name - - new_similarity = "euclidean" - index.update_vector_search_index( - collection, - index_name, - DIMENSIONS, - "embedding", - new_similarity, - filters=[], - wait_until_complete=wait_until_complete, - ) - - assert index._is_index_ready(collection, index_name) - indexes = list(collection.list_search_indexes()) - assert len(indexes) == 1 - assert indexes[0]["name"] == index_name - assert indexes[0]["latestDefinition"]["fields"][0]["similarity"] == new_similarity - - index.drop_vector_search_index( - collection, index_name, wait_until_complete=wait_until_complete - ) - - indexes = list(collection.list_search_indexes()) - assert len(indexes) == 0 diff --git a/libs/partners/mongodb/tests/integration_tests/test_retrievers.py b/libs/partners/mongodb/tests/integration_tests/test_retrievers.py deleted file mode 100644 index 8a0cf34c85c1d..0000000000000 --- a/libs/partners/mongodb/tests/integration_tests/test_retrievers.py +++ /dev/null @@ -1,176 +0,0 @@ -import os -from time import sleep -from typing import List - -import pytest -from langchain_core.documents import Document -from langchain_core.embeddings import Embeddings -from pymongo import MongoClient -from pymongo.collection import Collection - -from langchain_mongodb import index -from langchain_mongodb.retrievers import ( - MongoDBAtlasFullTextSearchRetriever, - MongoDBAtlasHybridSearchRetriever, -) - -from ..utils import ConsistentFakeEmbeddings, PatchedMongoDBAtlasVectorSearch - -CONNECTION_STRING = os.environ.get("MONGODB_ATLAS_URI") -DB_NAME = "langchain_test_db" -COLLECTION_NAME = "langchain_test_retrievers" -VECTOR_INDEX_NAME = "vector_index" -EMBEDDING_FIELD = "embedding" -PAGE_CONTENT_FIELD = "text" -SEARCH_INDEX_NAME = "text_index" - -DIMENSIONS = 1536 -TIMEOUT = 60.0 -INTERVAL = 0.5 - - -@pytest.fixture -def example_documents() -> List[Document]: - return [ - Document(page_content="In 2023, I visited Paris"), - Document(page_content="In 2022, I visited New York"), - Document(page_content="In 2021, I visited New Orleans"), - Document(page_content="Sandwiches are beautiful. Sandwiches are fine."), - ] - - -@pytest.fixture -def embedding_openai() -> Embeddings: - from langchain_openai import OpenAIEmbeddings - - try: - return OpenAIEmbeddings( - openai_api_key=os.environ["OPENAI_API_KEY"], # type: ignore # noqa - model="text-embedding-3-small", - ) - except Exception: - return ConsistentFakeEmbeddings(DIMENSIONS) - - -@pytest.fixture -def collection() -> Collection: - """A Collection with both a Vector and a Full-text Search Index""" - client: MongoClient = MongoClient(CONNECTION_STRING) - if COLLECTION_NAME not in client[DB_NAME].list_collection_names(): - clxn = client[DB_NAME].create_collection(COLLECTION_NAME) - else: - clxn = client[DB_NAME][COLLECTION_NAME] - - clxn.delete_many({}) - - if not any([VECTOR_INDEX_NAME == ix["name"] for ix in clxn.list_search_indexes()]): - index.create_vector_search_index( - collection=clxn, - index_name=VECTOR_INDEX_NAME, - dimensions=DIMENSIONS, - path="embedding", - similarity="cosine", - wait_until_complete=TIMEOUT, - ) - - if not any([SEARCH_INDEX_NAME == ix["name"] for ix in clxn.list_search_indexes()]): - index.create_fulltext_search_index( - collection=clxn, - index_name=SEARCH_INDEX_NAME, - field=PAGE_CONTENT_FIELD, - wait_until_complete=TIMEOUT, - ) - - return clxn - - -def test_hybrid_retriever( - embedding_openai: Embeddings, - collection: Collection, - example_documents: List[Document], -) -> None: - """Test basic usage of MongoDBAtlasHybridSearchRetriever""" - - vectorstore = PatchedMongoDBAtlasVectorSearch( - collection=collection, - embedding=embedding_openai, - index_name=VECTOR_INDEX_NAME, - text_key=PAGE_CONTENT_FIELD, - ) - - vectorstore.add_documents(example_documents) - - sleep(TIMEOUT) # Wait for documents to be sync'd - - retriever = MongoDBAtlasHybridSearchRetriever( - vectorstore=vectorstore, - search_index_name=SEARCH_INDEX_NAME, - top_k=3, - ) - - query1 = "What was the latest city that I visited?" - results = retriever.invoke(query1) - assert len(results) == 3 - assert "Paris" in results[0].page_content - - query2 = "When was the last time I visited new orleans?" - results = retriever.invoke(query2) - assert "New Orleans" in results[0].page_content - - -def test_fulltext_retriever( - collection: Collection, - example_documents: List[Document], -) -> None: - """Test result of performing fulltext search - - Independent of the VectorStore, one adds documents - via MongoDB's Collection API - """ - # - - collection.insert_many( - [{PAGE_CONTENT_FIELD: doc.page_content} for doc in example_documents] - ) - sleep(TIMEOUT) # Wait for documents to be sync'd - - retriever = MongoDBAtlasFullTextSearchRetriever( - collection=collection, - search_index_name=SEARCH_INDEX_NAME, - search_field=PAGE_CONTENT_FIELD, - ) - - query = "When was the last time I visited new orleans?" - results = retriever.invoke(query) - assert "New Orleans" in results[0].page_content - assert "score" in results[0].metadata - - -def test_vector_retriever( - embedding_openai: Embeddings, - collection: Collection, - example_documents: List[Document], -) -> None: - """Test VectorStoreRetriever""" - - vectorstore = PatchedMongoDBAtlasVectorSearch( - collection=collection, - embedding=embedding_openai, - index_name=VECTOR_INDEX_NAME, - text_key=PAGE_CONTENT_FIELD, - ) - - vectorstore.add_documents(example_documents) - - sleep(TIMEOUT) # Wait for documents to be sync'd - - retriever = vectorstore.as_retriever() - - query1 = "What was the latest city that I visited?" - results = retriever.invoke(query1) - assert len(results) == 4 - assert "Paris" in results[0].page_content - - query2 = "When was the last time I visited new orleans?" - results = retriever.invoke(query2) - assert "New Orleans" in results[0].page_content diff --git a/libs/partners/mongodb/tests/integration_tests/test_vectorstores.py b/libs/partners/mongodb/tests/integration_tests/test_vectorstores.py deleted file mode 100644 index 3033b20f4909c..0000000000000 --- a/libs/partners/mongodb/tests/integration_tests/test_vectorstores.py +++ /dev/null @@ -1,473 +0,0 @@ -"""Test MongoDB Atlas Vector Search functionality.""" - -from __future__ import annotations - -import os -from time import monotonic, sleep -from typing import Any, Dict, List - -import pytest # type: ignore[import-not-found] -from bson import ObjectId -from langchain_core.documents import Document -from langchain_core.embeddings import Embeddings -from pymongo import MongoClient -from pymongo.collection import Collection -from pymongo.errors import OperationFailure - -from langchain_mongodb.index import drop_vector_search_index -from langchain_mongodb.utils import oid_to_str - -from ..utils import ConsistentFakeEmbeddings, PatchedMongoDBAtlasVectorSearch - -INDEX_NAME = "langchain-test-index-vectorstores" -INDEX_CREATION_NAME = "langchain-test-index-vectorstores-create-test" -NAMESPACE = "langchain_test_db.langchain_test_vectorstores" -CONNECTION_STRING = os.environ.get("MONGODB_ATLAS_URI") -DB_NAME, COLLECTION_NAME = NAMESPACE.split(".") -INDEX_COLLECTION_NAME = "langchain_test_vectorstores_index" -INDEX_DB_NAME = "langchain_test_index_db" -DIMENSIONS = 1536 -TIMEOUT = 120.0 -INTERVAL = 0.5 - - -@pytest.fixture -def example_documents() -> List[Document]: - return [ - Document(page_content="Dogs are tough.", metadata={"a": 1}), - Document(page_content="Cats have fluff.", metadata={"b": 1}), - Document(page_content="What is a sandwich?", metadata={"c": 1}), - Document(page_content="That fence is purple.", metadata={"d": 1, "e": 2}), - ] - - -def _await_index_deletion(coll: Collection, index_name: str) -> None: - start = monotonic() - try: - drop_vector_search_index(coll, index_name) - except OperationFailure: - # This most likely means an ongoing drop request was made so skip - pass - - while list(coll.list_search_indexes(name=index_name)): - if monotonic() - start > TIMEOUT: - raise TimeoutError(f"Index Name: {index_name} never dropped") - sleep(INTERVAL) - - -def get_collection( - database_name: str = DB_NAME, collection_name: str = COLLECTION_NAME -) -> Collection: - test_client: MongoClient = MongoClient(CONNECTION_STRING) - return test_client[database_name][collection_name] - - -@pytest.fixture() -def collection() -> Collection: - return get_collection() - - -@pytest.fixture -def texts() -> List[str]: - return [ - "Dogs are tough.", - "Cats have fluff.", - "What is a sandwich?", - "That fence is purple.", - ] - - -@pytest.fixture() -def index_collection() -> Collection: - return get_collection(INDEX_DB_NAME, INDEX_COLLECTION_NAME) - - -class TestMongoDBAtlasVectorSearch: - @classmethod - def setup_class(cls) -> None: - # insure the test collection is empty - collection = get_collection() - if collection.count_documents({}): - collection.delete_many({}) # type: ignore[index] - - @classmethod - def teardown_class(cls) -> None: - collection = get_collection() - # delete all the documents in the collection - collection.delete_many({}) # type: ignore[index] - - @pytest.fixture(autouse=True) - def setup(self) -> None: - collection = get_collection() - # delete all the documents in the collection - collection.delete_many({}) # type: ignore[index] - - # delete all indexes on index collection name - _await_index_deletion( - get_collection(INDEX_DB_NAME, INDEX_COLLECTION_NAME), INDEX_CREATION_NAME - ) - - @pytest.fixture - def embeddings(self) -> Embeddings: - try: - from langchain_openai import OpenAIEmbeddings - - return OpenAIEmbeddings( - openai_api_key=os.environ["OPENAI_API_KEY"], # type: ignore # noqa - model="text-embedding-3-small", - ) - except Exception: - return ConsistentFakeEmbeddings(DIMENSIONS) - - def test_from_documents( - self, - embeddings: Embeddings, - collection: Any, - example_documents: List[Document], - ) -> None: - """Test end to end construction and search.""" - vectorstore = PatchedMongoDBAtlasVectorSearch.from_documents( - example_documents, - embedding=embeddings, - collection=collection, - index_name=INDEX_NAME, - ) - output = vectorstore.similarity_search("Sandwich", k=1) - assert len(output) == 1 - # Check for the presence of the metadata key - assert any( - [key.page_content == output[0].page_content for key in example_documents] - ) - - def test_from_documents_no_embedding_return( - self, - embeddings: Embeddings, - collection: Any, - example_documents: List[Document], - ) -> None: - """Test end to end construction and search.""" - vectorstore = PatchedMongoDBAtlasVectorSearch.from_documents( - example_documents, - embedding=embeddings, - collection=collection, - index_name=INDEX_NAME, - ) - output = vectorstore.similarity_search("Sandwich", k=1) - assert len(output) == 1 - # Check for presence of embedding in each document - assert all(["embedding" not in key.metadata for key in output]) - # Check for the presence of the metadata key - assert any( - [key.page_content == output[0].page_content for key in example_documents] - ) - - def test_from_documents_embedding_return( - self, - embeddings: Embeddings, - collection: Any, - example_documents: List[Document], - ) -> None: - """Test end to end construction and search.""" - vectorstore = PatchedMongoDBAtlasVectorSearch.from_documents( - example_documents, - embedding=embeddings, - collection=collection, - index_name=INDEX_NAME, - ) - output = vectorstore.similarity_search("Sandwich", k=1, include_embeddings=True) - assert len(output) == 1 - # Check for presence of embedding in each document - assert all([key.metadata.get("embedding") for key in output]) - # Check for the presence of the metadata key - assert any( - [key.page_content == output[0].page_content for key in example_documents] - ) - - def test_from_texts( - self, embeddings: Embeddings, collection: Collection, texts: List[str] - ) -> None: - vectorstore = PatchedMongoDBAtlasVectorSearch.from_texts( - texts, - embedding=embeddings, - collection=collection, - index_name=INDEX_NAME, - ) - output = vectorstore.similarity_search("Sandwich", k=1) - assert len(output) == 1 - - def test_from_texts_with_metadatas( - self, - embeddings: Embeddings, - collection: Collection, - texts: List[str], - ) -> None: - metadatas = [{"a": 1}, {"b": 1}, {"c": 1}, {"d": 1, "e": 2}] - metakeys = ["a", "b", "c", "d", "e"] - vectorstore = PatchedMongoDBAtlasVectorSearch.from_texts( - texts, - embedding=embeddings, - metadatas=metadatas, - collection=collection, - index_name=INDEX_NAME, - ) - output = vectorstore.similarity_search("Sandwich", k=1) - assert len(output) == 1 - # Check for the presence of the metadata key - assert any([key in output[0].metadata for key in metakeys]) - - def test_from_texts_with_metadatas_and_pre_filter( - self, embeddings: Embeddings, collection: Any, texts: List[str] - ) -> None: - metadatas = [{"a": 1}, {"b": 1}, {"c": 1}, {"d": 1, "e": 2}] - vectorstore = PatchedMongoDBAtlasVectorSearch.from_texts( - texts, - embedding=embeddings, - metadatas=metadatas, - collection=collection, - index_name=INDEX_NAME, - ) - does_not_match_filter = vectorstore.similarity_search( - "Sandwich", k=1, pre_filter={"c": {"$lte": 0}} - ) - assert does_not_match_filter == [] - - matches_filter = vectorstore.similarity_search( - "Sandwich", k=3, pre_filter={"c": {"$gt": 0}} - ) - assert len(matches_filter) == 1 - - def test_mmr(self, embeddings: Embeddings, collection: Any) -> None: - texts = ["foo", "foo", "fou", "foy"] - vectorstore = PatchedMongoDBAtlasVectorSearch.from_texts( - texts, - embedding=embeddings, - collection=collection, - index_name=INDEX_NAME, - ) - query = "foo" - output = vectorstore.max_marginal_relevance_search(query, k=10, lambda_mult=0.1) - assert len(output) == len(texts) - assert output[0].page_content == "foo" - assert output[1].page_content != "foo" - - def test_retriever( - self, - embeddings: Embeddings, - collection: Any, - example_documents: List[Document], - ) -> None: - """Demonstrate usage and parity of VectorStore similarity_search - with Retriever.invoke.""" - vectorstore = PatchedMongoDBAtlasVectorSearch.from_documents( - example_documents, - embedding=embeddings, - collection=collection, - index_name=INDEX_NAME, - ) - query = "sandwich" - - retriever_default_kwargs = vectorstore.as_retriever() - result_retriever = retriever_default_kwargs.invoke(query) - result_vectorstore = vectorstore.similarity_search(query) - assert all( - [ - result_retriever[i].page_content == result_vectorstore[i].page_content - for i in range(len(result_retriever)) - ] - ) - - def test_include_embeddings( - self, - embeddings: Embeddings, - collection: Any, - example_documents: List[Document], - ) -> None: - """Test explicitly passing vector kwarg matches default.""" - vectorstore = PatchedMongoDBAtlasVectorSearch.from_documents( - documents=example_documents, - embedding=embeddings, - collection=collection, - index_name=INDEX_NAME, - ) - - output_with = vectorstore.similarity_search( - "Sandwich", include_embeddings=True, k=1 - ) - assert vectorstore._embedding_key in output_with[0].metadata - output_without = vectorstore.similarity_search("Sandwich", k=1) - assert vectorstore._embedding_key not in output_without[0].metadata - - def test_delete( - self, embeddings: Embeddings, collection: Any, texts: List[str] - ) -> None: - vectorstore = PatchedMongoDBAtlasVectorSearch( - collection=collection, - embedding=embeddings, - index_name=INDEX_NAME, - ) - clxn: Collection = vectorstore._collection - assert clxn.count_documents({}) == 0 - ids = vectorstore.add_texts(texts) - assert clxn.count_documents({}) == len(texts) - - deleted = vectorstore.delete(ids[-2:]) - assert deleted - assert clxn.count_documents({}) == len(texts) - 2 - - new_ids = vectorstore.add_texts(["Pigs eat stuff", "Pigs eat sandwiches"]) - assert set(new_ids).intersection(set(ids)) == set() # new ids will be unique. - assert isinstance(new_ids, list) - assert all(isinstance(i, str) for i in new_ids) - assert len(new_ids) == 2 - assert clxn.count_documents({}) == 4 - - def test_add_texts( - self, - embeddings: Embeddings, - collection: Collection, - texts: List[str], - ) -> None: - """Tests API of add_texts, focussing on id treatment - - Warning: This is slow because of the number of cases - """ - metadatas: List[Dict[str, Any]] = [ - {"a": 1}, - {"b": 1}, - {"c": 1}, - {"d": 1, "e": 2}, - ] - - vectorstore = PatchedMongoDBAtlasVectorSearch( - collection=collection, embedding=embeddings, index_name=INDEX_NAME - ) - - # Case 1. Add texts without ids - provided_ids = vectorstore.add_texts(texts=texts, metadatas=metadatas) - all_docs = list(vectorstore._collection.find({})) - assert all("_id" in doc for doc in all_docs) - docids = set(doc["_id"] for doc in all_docs) - assert all(isinstance(_id, ObjectId) for _id in docids) # - assert set(provided_ids) == set(oid_to_str(oid) for oid in docids) - - # Case 2: Test Document.metadata looks right. i.e. contains _id - search_res = vectorstore.similarity_search_with_score("sandwich", k=1) - doc, score = search_res[0] - assert "_id" in doc.metadata - - # Case 3: Add new ids that are 24-char hex strings - hex_ids = [oid_to_str(ObjectId()) for _ in range(2)] - hex_texts = ["Text for hex_id"] * len(hex_ids) - out_ids = vectorstore.add_texts(texts=hex_texts, ids=hex_ids) - assert set(out_ids) == set(hex_ids) - assert collection.count_documents({}) == len(texts) + len(hex_texts) - assert all( - isinstance(doc["_id"], ObjectId) for doc in vectorstore._collection.find({}) - ) - - # Case 4: Add new ids that cannot be cast to ObjectId - # - We can still index and search on them - str_ids = ["Sandwiches are beautiful,", "..sandwiches are fine."] - str_texts = str_ids # No reason for them to differ - out_ids = vectorstore.add_texts(texts=str_texts, ids=str_ids) - assert set(out_ids) == set(str_ids) - assert collection.count_documents({}) == 8 - res = vectorstore.similarity_search("sandwich", k=8) - assert any(str_ids[0] in doc.metadata["_id"] for doc in res) - - # Case 5: Test adding in multiple batches - batch_size = 2 - batch_ids = [oid_to_str(ObjectId()) for _ in range(2 * batch_size)] - batch_texts = [f"Text for batch text {i}" for i in range(2 * batch_size)] - out_ids = vectorstore.add_texts( - texts=batch_texts, ids=batch_ids, batch_size=batch_size - ) - assert set(out_ids) == set(batch_ids) - assert collection.count_documents({}) == 12 - - # Case 6: _ids in metadata - collection.delete_many({}) - # 6a. Unique _id in metadata, but ids=None - # Will be added as if ids kwarg provided - i = 0 - n = len(texts) - assert len(metadatas) == n - _ids = [str(i) for i in range(n)] - for md in metadatas: - md["_id"] = _ids[i] - i += 1 - returned_ids = vectorstore.add_texts(texts=texts, metadatas=metadatas) - assert returned_ids == ["0", "1", "2", "3"] - assert set(d["_id"] for d in vectorstore._collection.find({})) == set(_ids) - - # 6b. Unique "id", not "_id", but ids=None - # New ids will be assigned - i = 1 - for md in metadatas: - md.pop("_id") - md["id"] = f"{1}" - i += 1 - returned_ids = vectorstore.add_texts(texts=texts, metadatas=metadatas) - assert len(set(returned_ids).intersection(set(_ids))) == 0 - - def test_add_documents( - self, - embeddings: Embeddings, - collection: Collection, - ) -> None: - """Tests add_documents.""" - vectorstore = PatchedMongoDBAtlasVectorSearch( - collection=collection, embedding=embeddings, index_name=INDEX_NAME - ) - - # Case 1: No ids - n_docs = 10 - batch_size = 3 - docs = [ - Document(page_content=f"document {i}", metadata={"i": i}) - for i in range(n_docs) - ] - result_ids = vectorstore.add_documents(docs, batch_size=batch_size) - assert len(result_ids) == n_docs - assert collection.count_documents({}) == n_docs - - # Case 2: ids - collection.delete_many({}) - n_docs = 10 - batch_size = 3 - docs = [ - Document(page_content=f"document {i}", metadata={"i": i}) - for i in range(n_docs) - ] - ids = [str(i) for i in range(n_docs)] - result_ids = vectorstore.add_documents(docs, ids, batch_size=batch_size) - assert len(result_ids) == n_docs - assert set(ids) == set(collection.distinct("_id")) - - # Case 3: Single batch - collection.delete_many({}) - n_docs = 3 - batch_size = 10 - docs = [ - Document(page_content=f"document {i}", metadata={"i": i}) - for i in range(n_docs) - ] - ids = [str(i) for i in range(n_docs)] - result_ids = vectorstore.add_documents(docs, ids, batch_size=batch_size) - assert len(result_ids) == n_docs - assert set(ids) == set(collection.distinct("_id")) - - def test_index_creation( - self, embeddings: Embeddings, index_collection: Any - ) -> None: - vectorstore = PatchedMongoDBAtlasVectorSearch( - index_collection, embedding=embeddings, index_name=INDEX_CREATION_NAME - ) - vectorstore.create_vector_search_index(dimensions=1536) - - def test_index_update(self, embeddings: Embeddings, index_collection: Any) -> None: - vectorstore = PatchedMongoDBAtlasVectorSearch( - index_collection, embedding=embeddings, index_name=INDEX_CREATION_NAME - ) - vectorstore.create_vector_search_index(dimensions=1536) - vectorstore.create_vector_search_index(dimensions=1536, update=True) diff --git a/libs/partners/mongodb/tests/unit_tests/__init__.py b/libs/partners/mongodb/tests/unit_tests/__init__.py deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/libs/partners/mongodb/tests/unit_tests/test_cache.py b/libs/partners/mongodb/tests/unit_tests/test_cache.py deleted file mode 100644 index 56f5b85714029..0000000000000 --- a/libs/partners/mongodb/tests/unit_tests/test_cache.py +++ /dev/null @@ -1,215 +0,0 @@ -import uuid -from typing import Any, Dict, List, Union - -import pytest # type: ignore[import-not-found] -from langchain_core.caches import BaseCache -from langchain_core.embeddings import Embeddings -from langchain_core.globals import get_llm_cache, set_llm_cache -from langchain_core.load.dump import dumps -from langchain_core.messages import AIMessage, BaseMessage, HumanMessage -from langchain_core.outputs import ChatGeneration, Generation, LLMResult -from pymongo.collection import Collection - -from langchain_mongodb.cache import MongoDBAtlasSemanticCache, MongoDBCache -from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch - -from ..utils import ConsistentFakeEmbeddings, FakeChatModel, FakeLLM, MockCollection - -CONN_STRING = "MockString" -COLLECTION = "default" -DATABASE = "default" - - -class PatchedMongoDBCache(MongoDBCache): - def __init__( - self, - connection_string: str, - collection_name: str = "default", - database_name: str = "default", - **kwargs: Dict[str, Any], - ) -> None: - self.__database_name = database_name - self.__collection_name = collection_name - self.client = {self.__database_name: {self.__collection_name: MockCollection()}} # type: ignore - - @property - def database(self) -> Any: # type: ignore - """Returns the database used to store cache values.""" - return self.client[self.__database_name] - - @property - def collection(self) -> Collection: - """Returns the collection used to store cache values.""" - return self.database[self.__collection_name] - - -class PatchedMongoDBAtlasSemanticCache(MongoDBAtlasSemanticCache): - def __init__( - self, - connection_string: str, - embedding: Embeddings, - collection_name: str = "default", - database_name: str = "default", - wait_until_ready: bool = False, - **kwargs: Dict[str, Any], - ): - self.collection = MockCollection() - self._wait_until_ready = False - self.score_threshold = None - MongoDBAtlasVectorSearch.__init__( - self, - self.collection, - embedding=embedding, - **kwargs, # type: ignore - ) - - -def random_string() -> str: - return str(uuid.uuid4()) - - -def llm_cache(cls: Any) -> BaseCache: - set_llm_cache( - cls( - embedding=ConsistentFakeEmbeddings(dimensionality=1536), - connection_string=CONN_STRING, - collection_name=COLLECTION, - database_name=DATABASE, - wait_until_ready=15.0, - ) - ) - assert get_llm_cache() - return get_llm_cache() - - -def _execute_test( - prompt: Union[str, List[BaseMessage]], - llm: Union[str, FakeLLM, FakeChatModel], - response: List[Generation], -) -> None: - # Fabricate an LLM String - - if not isinstance(llm, str): - params = llm.dict() - params["stop"] = None - llm_string = str(sorted([(k, v) for k, v in params.items()])) - else: - llm_string = llm - - # If the prompt is a str then we should pass just the string - dumped_prompt: str = prompt if isinstance(prompt, str) else dumps(prompt) - - # Update the cache - llm_cache = get_llm_cache() - llm_cache.update(dumped_prompt, llm_string, response) - - # Retrieve the cached result through 'generate' call - output: Union[List[Generation], LLMResult, None] - expected_output: Union[List[Generation], LLMResult] - if isinstance(llm_cache, PatchedMongoDBAtlasSemanticCache): - llm_cache._collection._aggregate_result = [ # type: ignore - data - for data in llm_cache._collection._data # type: ignore - if data.get("text") == dumped_prompt - and data.get("llm_string") == llm_string - ] # type: ignore - if isinstance(llm, str): - output = get_llm_cache().lookup(dumped_prompt, llm) # type: ignore - expected_output = response - else: - output = llm.generate([prompt]) # type: ignore - expected_output = LLMResult( - generations=[response], - llm_output={}, - ) - - assert output == expected_output # type: ignore - - -@pytest.mark.parametrize( - "prompt, llm, response", - [ - ("foo", "bar", [Generation(text="fizz")]), - ("foo", FakeLLM(), [Generation(text="fizz")]), - ( - [HumanMessage(content="foo")], - FakeChatModel(), - [ChatGeneration(message=AIMessage(content="foo"))], - ), - ], - ids=[ - "plain_cache", - "cache_with_llm", - "cache_with_chat", - ], -) -@pytest.mark.parametrize( - "cacher", [PatchedMongoDBCache, PatchedMongoDBAtlasSemanticCache] -) -@pytest.mark.parametrize("remove_score", [True, False]) -def test_mongodb_cache( - remove_score: bool, - cacher: Union[MongoDBCache, MongoDBAtlasSemanticCache], - prompt: Union[str, List[BaseMessage]], - llm: Union[str, FakeLLM, FakeChatModel], - response: List[Generation], -) -> None: - llm_cache(cacher) - if remove_score: - get_llm_cache().score_threshold = None # type: ignore - try: - _execute_test(prompt, llm, response) - finally: - get_llm_cache().clear() - - -@pytest.mark.parametrize( - "prompts, generations", - [ - # Single prompt, single generation - ([random_string()], [[random_string()]]), - # Single prompt, multiple generations - ([random_string()], [[random_string(), random_string()]]), - # Single prompt, multiple generations - ([random_string()], [[random_string(), random_string(), random_string()]]), - # Multiple prompts, multiple generations - ( - [random_string(), random_string()], - [[random_string()], [random_string(), random_string()]], - ), - ], - ids=[ - "single_prompt_single_generation", - "single_prompt_two_generations", - "single_prompt_three_generations", - "multiple_prompts_multiple_generations", - ], -) -def test_mongodb_atlas_cache_matrix( - prompts: List[str], - generations: List[List[str]], -) -> None: - llm_cache(PatchedMongoDBAtlasSemanticCache) - llm = FakeLLM() - - # Fabricate an LLM String - params = llm.dict() - params["stop"] = None - llm_string = str(sorted([(k, v) for k, v in params.items()])) - - llm_generations = [ - [ - Generation(text=generation, generation_info=params) - for generation in prompt_i_generations - ] - for prompt_i_generations in generations - ] - - for prompt_i, llm_generations_i in zip(prompts, llm_generations): - _execute_test(prompt_i, llm_string, llm_generations_i) - - get_llm_cache()._collection._simulate_cache_aggregation_query = True # type: ignore - assert llm.generate(prompts) == LLMResult( - generations=llm_generations, llm_output={} - ) - get_llm_cache().clear() diff --git a/libs/partners/mongodb/tests/unit_tests/test_chat_message_histories.py b/libs/partners/mongodb/tests/unit_tests/test_chat_message_histories.py deleted file mode 100644 index 2031602c2b281..0000000000000 --- a/libs/partners/mongodb/tests/unit_tests/test_chat_message_histories.py +++ /dev/null @@ -1,44 +0,0 @@ -import json - -from langchain.memory import ConversationBufferMemory # type: ignore[import-not-found] -from langchain_core.messages import message_to_dict - -from langchain_mongodb.chat_message_histories import MongoDBChatMessageHistory - -from ..utils import MockCollection - - -class PatchedMongoDBChatMessageHistory(MongoDBChatMessageHistory): - def __init__(self) -> None: - self.session_id = "test-session" - self.database_name = "test-database" - self.collection_name = "test-collection" - self.collection = MockCollection() - self.session_id_key = "SessionId" - self.history_key = "History" - self.history_size = None - - -def test_memory_with_message_store() -> None: - """Test the memory with a message store.""" - # setup MongoDB as a message store - message_history = PatchedMongoDBChatMessageHistory() - memory = ConversationBufferMemory( - memory_key="baz", chat_memory=message_history, return_messages=True - ) - - # add some messages - memory.chat_memory.add_ai_message("This is me, the AI") - memory.chat_memory.add_user_message("This is me, the human") - - # get the message history from the memory store and turn it into a json - messages = memory.chat_memory.messages - messages_json = json.dumps([message_to_dict(msg) for msg in messages]) - - assert "This is me, the AI" in messages_json - assert "This is me, the human" in messages_json - - # remove the record from MongoDB, so the next test run won't pick it up - memory.chat_memory.clear() - - assert memory.chat_memory.messages == [] diff --git a/libs/partners/mongodb/tests/unit_tests/test_imports.py b/libs/partners/mongodb/tests/unit_tests/test_imports.py deleted file mode 100644 index e0bb498a7dfd7..0000000000000 --- a/libs/partners/mongodb/tests/unit_tests/test_imports.py +++ /dev/null @@ -1,12 +0,0 @@ -from langchain_mongodb import __all__ - -EXPECTED_ALL = [ - "MongoDBAtlasVectorSearch", - "MongoDBChatMessageHistory", - "MongoDBCache", - "MongoDBAtlasSemanticCache", -] - - -def test_all_imports() -> None: - assert sorted(EXPECTED_ALL) == sorted(__all__) diff --git a/libs/partners/mongodb/tests/unit_tests/test_index.py b/libs/partners/mongodb/tests/unit_tests/test_index.py deleted file mode 100644 index acb6cb5b18926..0000000000000 --- a/libs/partners/mongodb/tests/unit_tests/test_index.py +++ /dev/null @@ -1,72 +0,0 @@ -"""Search index commands are only supported on Atlas Clusters >=M10""" - -import os -from time import sleep - -import pytest -from pymongo import MongoClient -from pymongo.collection import Collection -from pymongo.errors import OperationFailure, ServerSelectionTimeoutError - -from langchain_mongodb import index - -DIMENSION = 10 -TIMEOUT = 10 - - -@pytest.fixture -def collection() -> Collection: - """Depending on uri, this could point to any type of cluster. - - For unit tests, MONGODB_URI should be localhost, None, or Atlas cluster None: - with pytest.raises((OperationFailure, ServerSelectionTimeoutError)): - index.create_vector_search_index( - collection, - "index_name", - DIMENSION, - "embedding", - "cosine", - [], - wait_until_complete=TIMEOUT, - ) - - -def test_drop_vector_search_index(collection: Collection) -> None: - with pytest.raises((OperationFailure, ServerSelectionTimeoutError)): - index.drop_vector_search_index( - collection, "index_name", wait_until_complete=TIMEOUT - ) - - -def test_update_vector_search_index(collection: Collection) -> None: - with pytest.raises((OperationFailure, ServerSelectionTimeoutError)): - index.update_vector_search_index( - collection, - "index_name", - DIMENSION, - "embedding", - "cosine", - [], - wait_until_complete=TIMEOUT, - ) - - -def test___is_index_ready(collection: Collection) -> None: - with pytest.raises((OperationFailure, ServerSelectionTimeoutError)): - index._is_index_ready(collection, "index_name") - - -def test__wait_for_predicate() -> None: - err = "error string" - with pytest.raises(TimeoutError) as e: - index._wait_for_predicate(lambda: sleep(5), err=err, timeout=0.5, interval=0.1) - assert err in str(e) - - index._wait_for_predicate(lambda: True, err=err, timeout=1.0, interval=0.5) diff --git a/libs/partners/mongodb/tests/unit_tests/test_vectorstores.py b/libs/partners/mongodb/tests/unit_tests/test_vectorstores.py deleted file mode 100644 index 5ed936ab7e487..0000000000000 --- a/libs/partners/mongodb/tests/unit_tests/test_vectorstores.py +++ /dev/null @@ -1,191 +0,0 @@ -from json import dumps, loads -from typing import Any, Optional - -import pytest # type: ignore[import-not-found] -from langchain_core.documents import Document -from langchain_core.embeddings import Embeddings -from pymongo.collection import Collection - -from langchain_mongodb import MongoDBAtlasVectorSearch - -from ..utils import ConsistentFakeEmbeddings, MockCollection - -INDEX_NAME = "langchain-test-index" -NAMESPACE = "langchain_test_db.langchain_test_collection" -DB_NAME, COLLECTION_NAME = NAMESPACE.split(".") - - -def get_collection() -> MockCollection: - return MockCollection() - - -@pytest.fixture() -def collection() -> MockCollection: - return get_collection() - - -@pytest.fixture(scope="module") -def embedding_openai() -> Embeddings: - return ConsistentFakeEmbeddings() - - -def test_initialization(collection: Collection, embedding_openai: Embeddings) -> None: - """Test initialization of vector store class""" - assert MongoDBAtlasVectorSearch(collection, embedding_openai) - - -def test_init_from_texts(collection: Collection, embedding_openai: Embeddings) -> None: - """Test from_texts operation on an empty list""" - assert MongoDBAtlasVectorSearch.from_texts( - [], embedding_openai, collection=collection - ) - - -class TestMongoDBAtlasVectorSearch: - @classmethod - def setup_class(cls) -> None: - # ensure the test collection is empty - collection = get_collection() - assert collection.count_documents({}) == 0 # type: ignore[index] - - @classmethod - def teardown_class(cls) -> None: - collection = get_collection() - # delete all the documents in the collection - collection.delete_many({}) # type: ignore[index] - - @pytest.fixture(autouse=True) - def setup(self) -> None: - collection = get_collection() - # delete all the documents in the collection - collection.delete_many({}) # type: ignore[index] - - def _validate_search( - self, - vectorstore: MongoDBAtlasVectorSearch, - collection: MockCollection, - search_term: str = "sandwich", - page_content: str = "What is a sandwich?", - metadata: Optional[Any] = 1, - ) -> None: - collection._aggregate_result = list( - filter( - lambda x: search_term.lower() in x[vectorstore._text_key].lower(), - collection._data, - ) - ) - output = vectorstore.similarity_search("", k=1) - assert output[0].page_content == page_content - assert output[0].metadata.get("c") == metadata - # Validate the ObjectId provided is json serializable - assert loads(dumps(output[0].page_content)) == output[0].page_content - assert loads(dumps(output[0].metadata)) == output[0].metadata - assert isinstance(output[0].metadata["_id"], str) - - def test_from_documents( - self, embedding_openai: Embeddings, collection: MockCollection - ) -> None: - """Test end to end construction and search.""" - documents = [ - Document(page_content="Dogs are tough.", metadata={"a": 1}), - Document(page_content="Cats have fluff.", metadata={"b": 1}), - Document(page_content="What is a sandwich?", metadata={"c": 1}), - Document(page_content="That fence is purple.", metadata={"d": 1, "e": 2}), - ] - vectorstore = MongoDBAtlasVectorSearch.from_documents( - documents, - embedding_openai, - collection=collection, - vector_index_name=INDEX_NAME, - ) - self._validate_search( - vectorstore, collection, metadata=documents[2].metadata["c"] - ) - - def test_from_texts( - self, embedding_openai: Embeddings, collection: MockCollection - ) -> None: - texts = [ - "Dogs are tough.", - "Cats have fluff.", - "What is a sandwich?", - "That fence is purple.", - ] - vectorstore = MongoDBAtlasVectorSearch.from_texts( - texts, - embedding_openai, - collection=collection, - vector_index_name=INDEX_NAME, - ) - self._validate_search(vectorstore, collection, metadata=None) - - def test_from_texts_with_metadatas( - self, embedding_openai: Embeddings, collection: MockCollection - ) -> None: - texts = [ - "Dogs are tough.", - "Cats have fluff.", - "What is a sandwich?", - "The fence is purple.", - ] - metadatas = [{"a": 1}, {"b": 1}, {"c": 1}, {"d": 1, "e": 2}] - vectorstore = MongoDBAtlasVectorSearch.from_texts( - texts, - embedding_openai, - metadatas=metadatas, - collection=collection, - vector_index_name=INDEX_NAME, - ) - self._validate_search(vectorstore, collection, metadata=metadatas[2]["c"]) - - def test_from_texts_with_metadatas_and_pre_filter( - self, embedding_openai: Embeddings, collection: MockCollection - ) -> None: - texts = [ - "Dogs are tough.", - "Cats have fluff.", - "What is a sandwich?", - "The fence is purple.", - ] - metadatas = [{"a": 1}, {"b": 1}, {"c": 1}, {"d": 1, "e": 2}] - vectorstore = MongoDBAtlasVectorSearch.from_texts( - texts, - embedding_openai, - metadatas=metadatas, - collection=collection, - vector_index_name=INDEX_NAME, - ) - collection._aggregate_result = list( - filter( - lambda x: "sandwich" in x[vectorstore._text_key].lower() - and x.get("c") < 0, - collection._data, - ) - ) - output = vectorstore.similarity_search( - "Sandwich", k=1, pre_filter={"range": {"lte": 0, "path": "c"}} - ) - assert output == [] - - def test_mmr( - self, embedding_openai: Embeddings, collection: MockCollection - ) -> None: - texts = ["foo", "foo", "fou", "foy"] - vectorstore = MongoDBAtlasVectorSearch.from_texts( - texts, - embedding=embedding_openai, - collection=collection, - vector_index_name=INDEX_NAME, - ) - query = "foo" - self._validate_search( - vectorstore, - collection, - search_term=query[0:2], - page_content=query, - metadata=None, - ) - output = vectorstore.max_marginal_relevance_search(query, k=10, lambda_mult=0.1) - assert len(output) == len(texts) - assert output[0].page_content == "foo" - assert output[1].page_content != "foo" diff --git a/libs/partners/mongodb/tests/utils.py b/libs/partners/mongodb/tests/utils.py deleted file mode 100644 index d62b2025f48ea..0000000000000 --- a/libs/partners/mongodb/tests/utils.py +++ /dev/null @@ -1,273 +0,0 @@ -from __future__ import annotations - -from copy import deepcopy -from time import monotonic, sleep -from typing import Any, Dict, Generator, Iterable, List, Mapping, Optional, Union, cast - -from bson import ObjectId -from langchain_core.callbacks.manager import ( - AsyncCallbackManagerForLLMRun, - CallbackManagerForLLMRun, -) -from langchain_core.embeddings import Embeddings -from langchain_core.language_models.chat_models import SimpleChatModel -from langchain_core.language_models.llms import LLM -from langchain_core.messages import ( - AIMessage, - BaseMessage, -) -from langchain_core.outputs import ChatGeneration, ChatResult -from pydantic import model_validator -from pymongo.collection import Collection -from pymongo.results import DeleteResult, InsertManyResult - -from langchain_mongodb import MongoDBAtlasVectorSearch -from langchain_mongodb.cache import MongoDBAtlasSemanticCache - -TIMEOUT = 120 -INTERVAL = 0.5 - - -class PatchedMongoDBAtlasVectorSearch(MongoDBAtlasVectorSearch): - def bulk_embed_and_insert_texts( - self, - texts: Union[List[str], Iterable[str]], - metadatas: Union[List[dict], Generator[dict, Any, Any]], - ids: Optional[List[str]] = None, - ) -> List: - """Patched insert_texts that waits for data to be indexed before returning""" - ids_inserted = super().bulk_embed_and_insert_texts(texts, metadatas, ids) - start = monotonic() - while len(ids_inserted) != len(self.similarity_search("sandwich")) and ( - monotonic() - start <= TIMEOUT - ): - sleep(INTERVAL) - return ids_inserted - - def create_vector_search_index( - self, - dimensions: int, - filters: Optional[List[str]] = None, - update: bool = False, - ) -> None: - result = super().create_vector_search_index( - dimensions=dimensions, filters=filters, update=update - ) - start = monotonic() - while monotonic() - start <= TIMEOUT: - if indexes := list( - self._collection.list_search_indexes(name=self._index_name) - ): - if indexes[0].get("status") == "READY": - return result - sleep(INTERVAL) - - -class ConsistentFakeEmbeddings(Embeddings): - """Fake embeddings functionality for testing.""" - - def __init__(self, dimensionality: int = 10) -> None: - self.known_texts: List[str] = [] - self.dimensionality = dimensionality - - def embed_documents(self, texts: List[str]) -> List[List[float]]: - """Return consistent embeddings for each text seen so far.""" - out_vectors = [] - for text in texts: - if text not in self.known_texts: - self.known_texts.append(text) - vector = [float(1.0)] * (self.dimensionality - 1) + [ - float(self.known_texts.index(text)) - ] - out_vectors.append(vector) - return out_vectors - - def embed_query(self, text: str) -> List[float]: - """Return consistent embeddings for the text, if seen before, or a constant - one if the text is unknown.""" - return self.embed_documents([text])[0] - - async def aembed_documents(self, texts: List[str]) -> List[List[float]]: - return self.embed_documents(texts) - - async def aembed_query(self, text: str) -> List[float]: - return self.embed_query(text) - - -class FakeChatModel(SimpleChatModel): - """Fake Chat Model wrapper for testing purposes.""" - - def _call( - self, - messages: List[BaseMessage], - stop: Optional[List[str]] = None, - run_manager: Optional[CallbackManagerForLLMRun] = None, - **kwargs: Any, - ) -> str: - return "fake response" - - async def _agenerate( - self, - messages: List[BaseMessage], - stop: Optional[List[str]] = None, - run_manager: Optional[AsyncCallbackManagerForLLMRun] = None, - **kwargs: Any, - ) -> ChatResult: - output_str = "fake response" - message = AIMessage(content=output_str) - generation = ChatGeneration(message=message) - return ChatResult(generations=[generation]) - - @property - def _llm_type(self) -> str: - return "fake-chat-model" - - @property - def _identifying_params(self) -> Dict[str, Any]: - return {"key": "fake"} - - -class FakeLLM(LLM): - """Fake LLM wrapper for testing purposes.""" - - queries: Optional[Mapping] = None - sequential_responses: Optional[bool] = False - response_index: int = 0 - - @model_validator(mode="before") - @classmethod - def check_queries_required(cls, values: dict) -> dict: - if values.get("sequential_response") and not values.get("queries"): - raise ValueError( - "queries is required when sequential_response is set to True" - ) - return values - - def get_num_tokens(self, text: str) -> int: - """Return number of tokens.""" - return len(text.split()) - - @property - def _llm_type(self) -> str: - """Return type of llm.""" - return "fake" - - def _call( - self, - prompt: str, - stop: Optional[List[str]] = None, - run_manager: Optional[CallbackManagerForLLMRun] = None, - **kwargs: Any, - ) -> str: - if self.sequential_responses: - return self._get_next_response_in_sequence - if self.queries is not None: - return self.queries[prompt] - if stop is None: - return "foo" - else: - return "bar" - - @property - def _identifying_params(self) -> Dict[str, Any]: - return {} - - @property - def _get_next_response_in_sequence(self) -> str: - queries = cast(Mapping, self.queries) - response = queries[list(queries.keys())[self.response_index]] - self.response_index = self.response_index + 1 - return response - - -class MockCollection(Collection): - """Mocked Mongo Collection""" - - _aggregate_result: List[Any] - _insert_result: Optional[InsertManyResult] - _data: List[Any] - _simulate_cache_aggregation_query: bool - - def __init__(self) -> None: - self._data = [] - self._aggregate_result = [] - self._insert_result = None - self._simulate_cache_aggregation_query = False - - def delete_many(self, *args, **kwargs) -> DeleteResult: # type: ignore - old_len = len(self._data) - self._data = [] - return DeleteResult({"n": old_len}, acknowledged=True) - - def insert_many(self, to_insert: List[Any], *args, **kwargs) -> InsertManyResult: # type: ignore - mongodb_inserts = [ - {"_id": ObjectId(), "score": 1, **insert} for insert in to_insert - ] - self._data.extend(mongodb_inserts) - return self._insert_result or InsertManyResult( - [k["_id"] for k in mongodb_inserts], acknowledged=True - ) - - def insert_one(self, to_insert: Any, *args, **kwargs) -> Any: # type: ignore - return self.insert_many([to_insert]) - - def find_one(self, find_query: Dict[str, Any]) -> Optional[Dict[str, Any]]: # type: ignore - find = self.find(find_query) or [None] # type: ignore - return find[0] - - def find(self, find_query: Dict[str, Any]) -> Optional[List[Dict[str, Any]]]: # type: ignore - def _is_match(item: Dict[str, Any]) -> bool: - for key, match_val in find_query.items(): - if item.get(key) != match_val: - return False - return True - - return [document for document in self._data if _is_match(document)] - - def update_one( # type: ignore - self, - find_query: Dict[str, Any], - options: Dict[str, Any], - *args: Any, - upsert=True, - **kwargs: Any, - ) -> None: # type: ignore - result = self.find_one(find_query) - set_options = options.get("$set", {}) - - if result: - result.update(set_options) - elif upsert: - self._data.append({**find_query, **set_options}) - - def _execute_cache_aggregation_query(self, *args, **kwargs) -> List[Dict[str, Any]]: # type: ignore - """Helper function only to be used for MongoDBAtlasSemanticCache Testing - - Returns: - List[Dict[str, Any]]: Aggregation query result - """ - pipeline: List[Dict[str, Any]] = args[0] - params = pipeline[0]["$vectorSearch"] - embedding = params["queryVector"] - # Assumes MongoDBAtlasSemanticCache.LLM == "llm_string" - llm_string = params["filter"][MongoDBAtlasSemanticCache.LLM]["$eq"] - - acc = [] - for document in self._data: - if ( - document.get("embedding") == embedding - and document.get(MongoDBAtlasSemanticCache.LLM) == llm_string - ): - acc.append(document) - return acc - - def aggregate(self, *args, **kwargs) -> List[Any]: # type: ignore - if self._simulate_cache_aggregation_query: - return deepcopy(self._execute_cache_aggregation_query(*args, **kwargs)) - return deepcopy(self._aggregate_result) - - def count_documents(self, *args, **kwargs) -> int: # type: ignore - return len(self._data) - - def __repr__(self) -> str: - return "MockCollection"