From 68d4e8488e933fec804b6d7f484404d85ad42cf4 Mon Sep 17 00:00:00 2001 From: Eric Hare Date: Fri, 22 May 2026 11:06:03 -0700 Subject: [PATCH] fix: update mem0 and qdrant dependencies (#13292) * fix: update mem0 and qdrant dependencies * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- src/backend/base/pyproject.toml | 4 +- src/backend/base/uv.lock | 18 ++--- .../bundles/mem0/test_mem0_component.py | 33 ++++++++- src/lfx/src/lfx/_assets/component_index.json | 10 +-- .../lfx/components/mem0/mem0_chat_memory.py | 4 +- uv.lock | 71 +++---------------- 6 files changed, 59 insertions(+), 81 deletions(-) diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index 539370a694..4a3aa8e99a 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -205,7 +205,7 @@ faiss = [ "faiss-cpu==1.9.0.post1; python_version<'3.14'", "faiss-cpu>=1.13.2; python_version>='3.14'", ] -qdrant = ["qdrant-client==1.9.2"] +qdrant = ["qdrant-client>=1.12.0,<2.0.0"] weaviate = ["weaviate-client>=4.10.2,<5.0.0"] chroma = [ "chromadb>=1.0.0,<2.0.0", @@ -312,7 +312,7 @@ composio = [ ragstack = ["ragstack-ai-knowledge-store==0.2.1; python_version < '3.13'"] opensearch = ["opensearch-py==2.8.0"] atlassian = ["atlassian-python-api==3.41.16"] -mem0 = ["mem0ai>=0.1.34"] +mem0 = ["mem0ai>=2.0.2,<3.0.0"] needle = ["needle-python>=0.4.0"] sseclient = ["sseclient-py==1.8.0"] openinference = ["openinference-instrumentation-langchain>=0.1.29"] diff --git a/src/backend/base/uv.lock b/src/backend/base/uv.lock index 5f925acf9c..6287b3cc8c 100644 --- a/src/backend/base/uv.lock +++ b/src/backend/base/uv.lock @@ -6744,7 +6744,7 @@ requires-dist = [ { name = "markupsafe", marker = "extra == 'markup'", specifier = "==3.0.2" }, { name = "mcp", specifier = ">=1.17.0,<2.0.0" }, { name = "mcp", marker = "extra == 'mcp'", specifier = ">=1.17.0,<2.0.0" }, - { name = "mem0ai", marker = "extra == 'mem0'", specifier = ">=0.1.34" }, + { name = "mem0ai", marker = "extra == 'mem0'", specifier = ">=2.0.2,<3.0.0" }, { name = "metal-sdk", marker = "extra == 'metal'", specifier = "==2.5.1" }, { name = "metaphor-python", marker = "extra == 'metaphor'", specifier = "==0.1.23" }, { name = "mlx", marker = "python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'mlx'", specifier = ">=0.29.0" }, @@ -6788,7 +6788,7 @@ requires-dist = [ { name = "python-docx", marker = "extra == 'docx'", specifier = ">=1.1.0" }, { name = "python-multipart", specifier = ">=0.0.12,<1.0.0" }, { name = "pytube", marker = "extra == 'pytube'", specifier = "==15.0.0" }, - { name = "qdrant-client", marker = "extra == 'qdrant'", specifier = "==1.9.2" }, + { name = "qdrant-client", marker = "extra == 'qdrant'", specifier = ">=1.12.0,<2.0.0" }, { name = "qianfan", marker = "extra == 'qianfan'", specifier = "==0.3.5" }, { name = "ragstack-ai-knowledge-store", marker = "extra == 'ragstack'", specifier = "==0.2.1" }, { name = "redis", marker = "extra == 'redis'", specifier = ">=7.4.0,<8.0.0" }, @@ -7720,7 +7720,7 @@ wheels = [ [[package]] name = "mem0ai" -version = "1.0.11" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openai" }, @@ -7731,9 +7731,9 @@ dependencies = [ { name = "qdrant-client" }, { name = "sqlalchemy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/1e/2f8a8cc4b8e7f6126f3367d27dc65eac5cd4ceb854888faa3a8f62a2c0a0/mem0ai-1.0.11.tar.gz", hash = "sha256:ddb803bedc22bd514606d262407782e88df929f6991b59f6972fb8a25cc06001", size = 201758, upload-time = "2026-04-06T11:31:43.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/8f/86975bdf11a0aece78b6f4d5551b8b92c38b9bdf5f5764fc879e6cb1227b/mem0ai-2.0.2.tar.gz", hash = "sha256:482d11a55c8aa00dce29a66eeecbba2fd5f5c7501c054ce8ba606baee3755f99", size = 214627, upload-time = "2026-05-07T20:03:47.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/b5/f822c94e1b901f8a700af134c2473646de9a7db26364566f6a72d527d235/mem0ai-1.0.11-py3-none-any.whl", hash = "sha256:bcf4d678dc0a4d4e8eccaebe05562eae022fcdc825a0e3095d02f28cf61a5b6d", size = 297138, upload-time = "2026-04-06T11:31:41.716Z" }, + { url = "https://files.pythonhosted.org/packages/01/f8/59902456c1950e63b6b226634463bc8b24d81697e7114f0740059fd0a270/mem0ai-2.0.2-py3-none-any.whl", hash = "sha256:6fda32549c213fb63b393f4b1920f54961ea75c51d95b6492096108609accf3b", size = 302276, upload-time = "2026-05-07T20:03:45.706Z" }, ] [[package]] @@ -11841,21 +11841,21 @@ wheels = [ [[package]] name = "qdrant-client" -version = "1.9.2" +version = "1.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, - { name = "grpcio-tools" }, { name = "httpx", extra = ["http2"] }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "portalocker" }, + { name = "protobuf" }, { name = "pydantic" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/39/5fd63d835acbad5d76c3f3e7cb366c84c9cc09b2a2d2b3a4cac3a9b6adee/qdrant_client-1.9.2.tar.gz", hash = "sha256:35ba55a8484a4b817f985749d11fe6b5d2acf617fec07dd8bc01f3e9b4e9fa79", size = 201058, upload-time = "2024-06-20T11:19:54.006Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/45/5b1bdd15a3c7730eefb9c113600829e20d689b82b5a23f9e07d107094004/qdrant_client-1.18.0.tar.gz", hash = "sha256:52e8ece1a7d40519801bf0b70713bfa0f6b7ae28c7275bbe0b0286fbed7f6db4", size = 352580, upload-time = "2026-05-11T14:12:38.702Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/32/d639a030094b9e427e27abc7ad36b26a912d403e2a1bbd5b172a766de3a6/qdrant_client-1.9.2-py3-none-any.whl", hash = "sha256:0f49a4a6a47f62bc2c9afc69f9e1fb7790e4861ffe083d2de78dda30eb477d0e", size = 230108, upload-time = "2024-06-20T11:19:51.713Z" }, + { url = "https://files.pythonhosted.org/packages/d6/10/c437bd2ac41ef30d3019063e6ce537dc111e9214473b337ee88f7fa6359a/qdrant_client-1.18.0-py3-none-any.whl", hash = "sha256:093aa8cf8a420ee3ad2a68b007e1378d7992b2600e0b53c193fc172674f659cd", size = 398126, upload-time = "2026-05-11T14:12:36.998Z" }, ] [[package]] diff --git a/src/backend/tests/unit/components/bundles/mem0/test_mem0_component.py b/src/backend/tests/unit/components/bundles/mem0/test_mem0_component.py index 1242d25413..3736831eac 100644 --- a/src/backend/tests/unit/components/bundles/mem0/test_mem0_component.py +++ b/src/backend/tests/unit/components/bundles/mem0/test_mem0_component.py @@ -1,7 +1,7 @@ """Unit tests for Mem0MemoryComponent cloud validation.""" import os -from unittest.mock import patch +from unittest.mock import Mock, patch import pytest from lfx.components.mem0.mem0_chat_memory import Mem0MemoryComponent @@ -29,3 +29,34 @@ class TestMem0CloudValidation: component = Mem0MemoryComponent(openai_api_key="test-key") component.build_mem0() mock_memory.assert_called_once() + + def test_build_search_results_uses_mem0_2_filters_for_search(self): + """Test that search uses filters for Mem0 2.x entity scoping.""" + memory = Mock() + memory.search.return_value = [{"memory": "hello"}] + component = Mem0MemoryComponent(_user_id="u").set( + existing_memory=memory, + ingest_message="hello", + search_query="x", + ) + + result = component.build_search_results() + + assert result == [{"memory": "hello"}] + memory.add.assert_called_once_with("hello", user_id="u", metadata={}) + memory.search.assert_called_once_with(query="x", filters={"user_id": "u"}) + + def test_build_search_results_uses_mem0_2_filters_for_get_all(self): + """Test that get_all uses filters for Mem0 2.x entity scoping.""" + memory = Mock() + memory.get_all.return_value = [{"memory": "hello"}] + component = Mem0MemoryComponent(_user_id="u").set( + existing_memory=memory, + ingest_message="hello", + ) + + result = component.build_search_results() + + assert result == [{"memory": "hello"}] + memory.add.assert_called_once_with("hello", user_id="u", metadata={}) + memory.get_all.assert_called_once_with(filters={"user_id": "u"}) diff --git a/src/lfx/src/lfx/_assets/component_index.json b/src/lfx/src/lfx/_assets/component_index.json index 50d7e442ae..5540cbde04 100644 --- a/src/lfx/src/lfx/_assets/component_index.json +++ b/src/lfx/src/lfx/_assets/component_index.json @@ -91934,12 +91934,12 @@ "icon": "Mem0", "legacy": false, "metadata": { - "code_hash": "309abc9375f4", + "code_hash": "f2832e1bc71f", "dependencies": { "dependencies": [ { "name": "mem0", - "version": "1.0.11" + "version": "2.0.2" }, { "name": "lfx", @@ -92001,7 +92001,7 @@ "show": true, "title_case": false, "type": "code", - "value": "import os\n\nfrom mem0 import Memory, MemoryClient\n\nfrom lfx.base.memory.model import LCChatMemoryComponent\nfrom lfx.inputs.inputs import DictInput, HandleInput, MessageTextInput, NestedDictInput, SecretStrInput\nfrom lfx.io import Output\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\nfrom lfx.utils.validate_cloud import raise_error_if_astra_cloud_disable_component\n\ndisable_component_in_astra_cloud_msg = (\n \"Mem0 chat memory is not supported in Astra cloud environment. Please use local storage mode or mem0 cloud.\"\n)\n\n\nclass Mem0MemoryComponent(LCChatMemoryComponent):\n display_name = \"Mem0 Chat Memory\"\n description = \"Retrieves and stores chat messages using Mem0 memory storage.\"\n name = \"mem0_chat_memory\"\n icon: str = \"Mem0\"\n inputs = [\n NestedDictInput(\n name=\"mem0_config\",\n display_name=\"Mem0 Configuration\",\n info=\"\"\"Configuration dictionary for initializing Mem0 memory instance.\n Example:\n {\n \"graph_store\": {\n \"provider\": \"neo4j\",\n \"config\": {\n \"url\": \"neo4j+s://your-neo4j-url\",\n \"username\": \"neo4j\",\n \"password\": \"your-password\"\n }\n },\n \"version\": \"v1.1\"\n }\"\"\",\n input_types=[\"Data\", \"JSON\"],\n ),\n MessageTextInput(\n name=\"ingest_message\",\n display_name=\"Message to Ingest\",\n info=\"The message content to be ingested into Mem0 memory.\",\n ),\n HandleInput(\n name=\"existing_memory\",\n display_name=\"Existing Memory Instance\",\n input_types=[\"Memory\"],\n info=\"Optional existing Mem0 memory instance. If not provided, a new instance will be created.\",\n ),\n MessageTextInput(\n name=\"user_id\", display_name=\"User ID\", info=\"Identifier for the user associated with the messages.\"\n ),\n MessageTextInput(\n name=\"search_query\", display_name=\"Search Query\", info=\"Input text for searching related memories in Mem0.\"\n ),\n SecretStrInput(\n name=\"mem0_api_key\",\n display_name=\"Mem0 API Key\",\n info=\"API key for Mem0 platform. Leave empty to use the local version.\",\n ),\n DictInput(\n name=\"metadata\",\n display_name=\"Metadata\",\n info=\"Additional metadata to associate with the ingested message.\",\n advanced=True,\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n required=False,\n info=\"API key for OpenAI. Required if using OpenAI Embeddings without a provided configuration.\",\n ),\n ]\n\n outputs = [\n Output(name=\"memory\", display_name=\"Mem0 Memory\", method=\"ingest_data\"),\n Output(\n name=\"search_results\",\n display_name=\"Search Results\",\n method=\"build_search_results\",\n ),\n ]\n\n def build_mem0(self) -> Memory:\n \"\"\"Initializes a Mem0 memory instance based on provided configuration and API keys.\"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n if self.openai_api_key:\n os.environ[\"OPENAI_API_KEY\"] = self.openai_api_key\n\n try:\n if not self.mem0_api_key:\n return Memory.from_config(config_dict=dict(self.mem0_config)) if self.mem0_config else Memory()\n if self.mem0_config:\n return MemoryClient.from_config(api_key=self.mem0_api_key, config_dict=dict(self.mem0_config))\n return MemoryClient(api_key=self.mem0_api_key)\n except ImportError as e:\n msg = \"Mem0 is not properly installed. Please install it with 'pip install -U mem0ai'.\"\n raise ImportError(msg) from e\n\n def ingest_data(self) -> Memory:\n \"\"\"Ingests a new message into Mem0 memory and returns the updated memory instance.\"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n mem0_memory = self.existing_memory or self.build_mem0()\n\n if not self.ingest_message or not self.user_id:\n logger.warning(\"Missing 'ingest_message' or 'user_id'; cannot ingest data.\")\n return mem0_memory\n\n metadata = self.metadata or {}\n\n logger.info(\"Ingesting message for user_id: %s\", self.user_id)\n\n try:\n mem0_memory.add(self.ingest_message, user_id=self.user_id, metadata=metadata)\n except Exception:\n logger.exception(\"Failed to add message to Mem0 memory.\")\n raise\n\n return mem0_memory\n\n def build_search_results(self) -> Data:\n \"\"\"Searches the Mem0 memory for related messages based on the search query and returns the results.\"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n mem0_memory = self.ingest_data()\n search_query = self.search_query\n user_id = self.user_id\n\n logger.info(\"Search query: %s\", search_query)\n\n try:\n if search_query:\n logger.info(\"Performing search with query.\")\n related_memories = mem0_memory.search(query=search_query, user_id=user_id)\n else:\n logger.info(\"Retrieving all memories for user_id: %s\", user_id)\n related_memories = mem0_memory.get_all(user_id=user_id)\n except Exception:\n logger.exception(\"Failed to retrieve related memories from Mem0.\")\n raise\n\n logger.info(\"Related memories retrieved: %s\", related_memories)\n return related_memories\n" + "value": "import os\n\nfrom mem0 import Memory, MemoryClient\n\nfrom lfx.base.memory.model import LCChatMemoryComponent\nfrom lfx.inputs.inputs import DictInput, HandleInput, MessageTextInput, NestedDictInput, SecretStrInput\nfrom lfx.io import Output\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\nfrom lfx.utils.validate_cloud import raise_error_if_astra_cloud_disable_component\n\ndisable_component_in_astra_cloud_msg = (\n \"Mem0 chat memory is not supported in Astra cloud environment. Please use local storage mode or mem0 cloud.\"\n)\n\n\nclass Mem0MemoryComponent(LCChatMemoryComponent):\n display_name = \"Mem0 Chat Memory\"\n description = \"Retrieves and stores chat messages using Mem0 memory storage.\"\n name = \"mem0_chat_memory\"\n icon: str = \"Mem0\"\n inputs = [\n NestedDictInput(\n name=\"mem0_config\",\n display_name=\"Mem0 Configuration\",\n info=\"\"\"Configuration dictionary for initializing Mem0 memory instance.\n Example:\n {\n \"graph_store\": {\n \"provider\": \"neo4j\",\n \"config\": {\n \"url\": \"neo4j+s://your-neo4j-url\",\n \"username\": \"neo4j\",\n \"password\": \"your-password\"\n }\n },\n \"version\": \"v1.1\"\n }\"\"\",\n input_types=[\"Data\", \"JSON\"],\n ),\n MessageTextInput(\n name=\"ingest_message\",\n display_name=\"Message to Ingest\",\n info=\"The message content to be ingested into Mem0 memory.\",\n ),\n HandleInput(\n name=\"existing_memory\",\n display_name=\"Existing Memory Instance\",\n input_types=[\"Memory\"],\n info=\"Optional existing Mem0 memory instance. If not provided, a new instance will be created.\",\n ),\n MessageTextInput(\n name=\"user_id\", display_name=\"User ID\", info=\"Identifier for the user associated with the messages.\"\n ),\n MessageTextInput(\n name=\"search_query\", display_name=\"Search Query\", info=\"Input text for searching related memories in Mem0.\"\n ),\n SecretStrInput(\n name=\"mem0_api_key\",\n display_name=\"Mem0 API Key\",\n info=\"API key for Mem0 platform. Leave empty to use the local version.\",\n ),\n DictInput(\n name=\"metadata\",\n display_name=\"Metadata\",\n info=\"Additional metadata to associate with the ingested message.\",\n advanced=True,\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n required=False,\n info=\"API key for OpenAI. Required if using OpenAI Embeddings without a provided configuration.\",\n ),\n ]\n\n outputs = [\n Output(name=\"memory\", display_name=\"Mem0 Memory\", method=\"ingest_data\"),\n Output(\n name=\"search_results\",\n display_name=\"Search Results\",\n method=\"build_search_results\",\n ),\n ]\n\n def build_mem0(self) -> Memory:\n \"\"\"Initializes a Mem0 memory instance based on provided configuration and API keys.\"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n if self.openai_api_key:\n os.environ[\"OPENAI_API_KEY\"] = self.openai_api_key\n\n try:\n if not self.mem0_api_key:\n return Memory.from_config(config_dict=dict(self.mem0_config)) if self.mem0_config else Memory()\n if self.mem0_config:\n return MemoryClient.from_config(api_key=self.mem0_api_key, config_dict=dict(self.mem0_config))\n return MemoryClient(api_key=self.mem0_api_key)\n except ImportError as e:\n msg = \"Mem0 is not properly installed. Please install it with 'pip install -U mem0ai'.\"\n raise ImportError(msg) from e\n\n def ingest_data(self) -> Memory:\n \"\"\"Ingests a new message into Mem0 memory and returns the updated memory instance.\"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n mem0_memory = self.existing_memory or self.build_mem0()\n\n if not self.ingest_message or not self.user_id:\n logger.warning(\"Missing 'ingest_message' or 'user_id'; cannot ingest data.\")\n return mem0_memory\n\n metadata = self.metadata or {}\n\n logger.info(\"Ingesting message for user_id: %s\", self.user_id)\n\n try:\n mem0_memory.add(self.ingest_message, user_id=self.user_id, metadata=metadata)\n except Exception:\n logger.exception(\"Failed to add message to Mem0 memory.\")\n raise\n\n return mem0_memory\n\n def build_search_results(self) -> Data:\n \"\"\"Searches the Mem0 memory for related messages based on the search query and returns the results.\"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n mem0_memory = self.ingest_data()\n search_query = self.search_query\n user_id = self.user_id\n\n logger.info(\"Search query: %s\", search_query)\n\n try:\n if search_query:\n logger.info(\"Performing search with query.\")\n related_memories = mem0_memory.search(query=search_query, filters={\"user_id\": user_id})\n else:\n logger.info(\"Retrieving all memories for user_id: %s\", user_id)\n related_memories = mem0_memory.get_all(filters={\"user_id\": user_id})\n except Exception:\n logger.exception(\"Failed to retrieve related memories from Mem0.\")\n raise\n\n logger.info(\"Related memories retrieved: %s\", related_memories)\n return related_memories\n" }, "existing_memory": { "_input_type": "HandleInput", @@ -107290,7 +107290,7 @@ }, { "name": "qdrant_client", - "version": "1.9.2" + "version": "1.18.0" } ], "total_dependencies": 4 @@ -120931,6 +120931,6 @@ "num_components": 362, "num_modules": 97 }, - "sha256": "53021a3ed6d8f8640a13dda5280d024f522e6f12c5f977adfb63dd2a2fb1f63e", + "sha256": "04c8291bf0431563063a3fdbd46fe368f6510750de5961114f06a51729a66bec", "version": "0.5.0" } diff --git a/src/lfx/src/lfx/components/mem0/mem0_chat_memory.py b/src/lfx/src/lfx/components/mem0/mem0_chat_memory.py index 40d31a21d3..7dcde99648 100644 --- a/src/lfx/src/lfx/components/mem0/mem0_chat_memory.py +++ b/src/lfx/src/lfx/components/mem0/mem0_chat_memory.py @@ -135,10 +135,10 @@ class Mem0MemoryComponent(LCChatMemoryComponent): try: if search_query: logger.info("Performing search with query.") - related_memories = mem0_memory.search(query=search_query, user_id=user_id) + related_memories = mem0_memory.search(query=search_query, filters={"user_id": user_id}) else: logger.info("Retrieving all memories for user_id: %s", user_id) - related_memories = mem0_memory.get_all(user_id=user_id) + related_memories = mem0_memory.get_all(filters={"user_id": user_id}) except Exception: logger.exception("Failed to retrieve related memories from Mem0.") raise diff --git a/uv.lock b/uv.lock index 06453286c1..98ad38fe3c 100644 --- a/uv.lock +++ b/uv.lock @@ -5345,59 +5345,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/67/58/317b0134129b556a93a3b0afe00ee675b5657f0155509e22fcb853bafe2d/grpcio_status-1.71.2-py3-none-any.whl", hash = "sha256:803c98cb6a8b7dc6dbb785b1111aed739f241ab5e9da0bba96888aa74704cfd3", size = 14424, upload-time = "2025-06-28T04:23:42.136Z" }, ] -[[package]] -name = "grpcio-tools" -version = "1.71.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "grpcio" }, - { name = "protobuf" }, - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ad/9a/edfefb47f11ef6b0f39eea4d8f022c5bb05ac1d14fcc7058e84a51305b73/grpcio_tools-1.71.2.tar.gz", hash = "sha256:b5304d65c7569b21270b568e404a5a843cf027c66552a6a0978b23f137679c09", size = 5330655, upload-time = "2025-06-28T04:22:00.308Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/ad/e74a4d1cffff628c2ef1ec5b9944fb098207cc4af6eb8db4bc52e6d99236/grpcio_tools-1.71.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:ab8a28c2e795520d6dc6ffd7efaef4565026dbf9b4f5270de2f3dd1ce61d2318", size = 2385557, upload-time = "2025-06-28T04:20:38.833Z" }, - { url = "https://files.pythonhosted.org/packages/63/bf/30b63418279d6fdc4fd4a3781a7976c40c7e8ee052333b9ce6bd4ce63f30/grpcio_tools-1.71.2-cp310-cp310-macosx_10_14_universal2.whl", hash = "sha256:654ecb284a592d39a85556098b8c5125163435472a20ead79b805cf91814b99e", size = 5446915, upload-time = "2025-06-28T04:20:40.947Z" }, - { url = "https://files.pythonhosted.org/packages/83/cd/2994e0a0a67714fdb00c207c4bec60b9b356fbd6b0b7a162ecaabe925155/grpcio_tools-1.71.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b49aded2b6c890ff690d960e4399a336c652315c6342232c27bd601b3705739e", size = 2348301, upload-time = "2025-06-28T04:20:42.766Z" }, - { url = "https://files.pythonhosted.org/packages/5b/8b/4f2315927af306af1b35793b332b9ca9dc5b5a2cde2d55811c9577b5f03f/grpcio_tools-1.71.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7811a6fc1c4b4e5438e5eb98dbd52c2dc4a69d1009001c13356e6636322d41a", size = 2742159, upload-time = "2025-06-28T04:20:44.206Z" }, - { url = "https://files.pythonhosted.org/packages/8d/98/d513f6c09df405c82583e7083c20718ea615ed0da69ec42c80ceae7ebdc5/grpcio_tools-1.71.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:393a9c80596aa2b3f05af854e23336ea8c295593bbb35d9adae3d8d7943672bd", size = 2473444, upload-time = "2025-06-28T04:20:45.5Z" }, - { url = "https://files.pythonhosted.org/packages/fa/fe/00af17cc841916d5e4227f11036bf443ce006629212c876937c7904b0ba3/grpcio_tools-1.71.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:823e1f23c12da00f318404c4a834bb77cd150d14387dee9789ec21b335249e46", size = 2850339, upload-time = "2025-06-28T04:20:46.758Z" }, - { url = "https://files.pythonhosted.org/packages/7d/59/745fc50dfdbed875fcfd6433883270d39d23fb1aa4ecc9587786f772dce3/grpcio_tools-1.71.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9bfbea79d6aec60f2587133ba766ede3dc3e229641d1a1e61d790d742a3d19eb", size = 3300795, upload-time = "2025-06-28T04:20:48.327Z" }, - { url = "https://files.pythonhosted.org/packages/62/3e/d9d0fb2df78e601c28d02ef0cd5d007f113c1b04fc21e72bf56e8c3df66b/grpcio_tools-1.71.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:32f3a67b10728835b5ffb63fbdbe696d00e19a27561b9cf5153e72dbb93021ba", size = 2913729, upload-time = "2025-06-28T04:20:49.641Z" }, - { url = "https://files.pythonhosted.org/packages/09/ae/ddb264b4a10c6c10336a7c177f8738b230c2c473d0c91dd5d8ce8ea1b857/grpcio_tools-1.71.2-cp310-cp310-win32.whl", hash = "sha256:7fcf9d92c710bfc93a1c0115f25e7d49a65032ff662b38b2f704668ce0a938df", size = 945997, upload-time = "2025-06-28T04:20:50.9Z" }, - { url = "https://files.pythonhosted.org/packages/ad/8d/5efd93698fe359f63719d934ebb2d9337e82d396e13d6bf00f4b06793e37/grpcio_tools-1.71.2-cp310-cp310-win_amd64.whl", hash = "sha256:914b4275be810290266e62349f2d020bb7cc6ecf9edb81da3c5cddb61a95721b", size = 1117474, upload-time = "2025-06-28T04:20:52.54Z" }, - { url = "https://files.pythonhosted.org/packages/17/e4/0568d38b8da6237ea8ea15abb960fb7ab83eb7bb51e0ea5926dab3d865b1/grpcio_tools-1.71.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:0acb8151ea866be5b35233877fbee6445c36644c0aa77e230c9d1b46bf34b18b", size = 2385557, upload-time = "2025-06-28T04:20:54.323Z" }, - { url = "https://files.pythonhosted.org/packages/76/fb/700d46f72b0f636cf0e625f3c18a4f74543ff127471377e49a071f64f1e7/grpcio_tools-1.71.2-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:b28f8606f4123edb4e6da281547465d6e449e89f0c943c376d1732dc65e6d8b3", size = 5447590, upload-time = "2025-06-28T04:20:55.836Z" }, - { url = "https://files.pythonhosted.org/packages/12/69/d9bb2aec3de305162b23c5c884b9f79b1a195d42b1e6dabcc084cc9d0804/grpcio_tools-1.71.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:cbae6f849ad2d1f5e26cd55448b9828e678cb947fa32c8729d01998238266a6a", size = 2348495, upload-time = "2025-06-28T04:20:57.33Z" }, - { url = "https://files.pythonhosted.org/packages/d5/83/f840aba1690461b65330efbca96170893ee02fae66651bcc75f28b33a46c/grpcio_tools-1.71.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4d1027615cfb1e9b1f31f2f384251c847d68c2f3e025697e5f5c72e26ed1316", size = 2742333, upload-time = "2025-06-28T04:20:59.051Z" }, - { url = "https://files.pythonhosted.org/packages/30/34/c02cd9b37de26045190ba665ee6ab8597d47f033d098968f812d253bbf8c/grpcio_tools-1.71.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bac95662dc69338edb9eb727cc3dd92342131b84b12b3e8ec6abe973d4cbf1b", size = 2473490, upload-time = "2025-06-28T04:21:00.614Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c7/375718ae091c8f5776828ce97bdcb014ca26244296f8b7f70af1a803ed2f/grpcio_tools-1.71.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c50250c7248055040f89eb29ecad39d3a260a4b6d3696af1575945f7a8d5dcdc", size = 2850333, upload-time = "2025-06-28T04:21:01.95Z" }, - { url = "https://files.pythonhosted.org/packages/19/37/efc69345bd92a73b2bc80f4f9e53d42dfdc234b2491ae58c87da20ca0ea5/grpcio_tools-1.71.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6ab1ad955e69027ef12ace4d700c5fc36341bdc2f420e87881e9d6d02af3d7b8", size = 3300748, upload-time = "2025-06-28T04:21:03.451Z" }, - { url = "https://files.pythonhosted.org/packages/d2/1f/15f787eb25ae42086f55ed3e4260e85f385921c788debf0f7583b34446e3/grpcio_tools-1.71.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dd75dde575781262b6b96cc6d0b2ac6002b2f50882bf5e06713f1bf364ee6e09", size = 2913178, upload-time = "2025-06-28T04:21:04.879Z" }, - { url = "https://files.pythonhosted.org/packages/12/aa/69cb3a9dff7d143a05e4021c3c9b5cde07aacb8eb1c892b7c5b9fb4973e3/grpcio_tools-1.71.2-cp311-cp311-win32.whl", hash = "sha256:9a3cb244d2bfe0d187f858c5408d17cb0e76ca60ec9a274c8fd94cc81457c7fc", size = 946256, upload-time = "2025-06-28T04:21:06.518Z" }, - { url = "https://files.pythonhosted.org/packages/1e/df/fb951c5c87eadb507a832243942e56e67d50d7667b0e5324616ffd51b845/grpcio_tools-1.71.2-cp311-cp311-win_amd64.whl", hash = "sha256:00eb909997fd359a39b789342b476cbe291f4dd9c01ae9887a474f35972a257e", size = 1117661, upload-time = "2025-06-28T04:21:08.18Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d3/3ed30a9c5b2424627b4b8411e2cd6a1a3f997d3812dbc6a8630a78bcfe26/grpcio_tools-1.71.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:bfc0b5d289e383bc7d317f0e64c9dfb59dc4bef078ecd23afa1a816358fb1473", size = 2385479, upload-time = "2025-06-28T04:21:10.413Z" }, - { url = "https://files.pythonhosted.org/packages/54/61/e0b7295456c7e21ef777eae60403c06835160c8d0e1e58ebfc7d024c51d3/grpcio_tools-1.71.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b4669827716355fa913b1376b1b985855d5cfdb63443f8d18faf210180199006", size = 5431521, upload-time = "2025-06-28T04:21:12.261Z" }, - { url = "https://files.pythonhosted.org/packages/75/d7/7bcad6bcc5f5b7fab53e6bce5db87041f38ef3e740b1ec2d8c49534fa286/grpcio_tools-1.71.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:d4071f9b44564e3f75cdf0f05b10b3e8c7ea0ca5220acbf4dc50b148552eef2f", size = 2350289, upload-time = "2025-06-28T04:21:13.625Z" }, - { url = "https://files.pythonhosted.org/packages/b2/8a/e4c1c4cb8c9ff7f50b7b2bba94abe8d1e98ea05f52a5db476e7f1c1a3c70/grpcio_tools-1.71.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a28eda8137d587eb30081384c256f5e5de7feda34776f89848b846da64e4be35", size = 2743321, upload-time = "2025-06-28T04:21:15.007Z" }, - { url = "https://files.pythonhosted.org/packages/fd/aa/95bc77fda5c2d56fb4a318c1b22bdba8914d5d84602525c99047114de531/grpcio_tools-1.71.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b19c083198f5eb15cc69c0a2f2c415540cbc636bfe76cea268e5894f34023b40", size = 2474005, upload-time = "2025-06-28T04:21:16.443Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ff/ca11f930fe1daa799ee0ce1ac9630d58a3a3deed3dd2f465edb9a32f299d/grpcio_tools-1.71.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:784c284acda0d925052be19053d35afbf78300f4d025836d424cf632404f676a", size = 2851559, upload-time = "2025-06-28T04:21:18.139Z" }, - { url = "https://files.pythonhosted.org/packages/64/10/c6fc97914c7e19c9bb061722e55052fa3f575165da9f6510e2038d6e8643/grpcio_tools-1.71.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:381e684d29a5d052194e095546eef067201f5af30fd99b07b5d94766f44bf1ae", size = 3300622, upload-time = "2025-06-28T04:21:20.291Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d6/965f36cfc367c276799b730d5dd1311b90a54a33726e561393b808339b04/grpcio_tools-1.71.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3e4b4801fabd0427fc61d50d09588a01b1cfab0ec5e8a5f5d515fbdd0891fd11", size = 2913863, upload-time = "2025-06-28T04:21:22.196Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f0/c05d5c3d0c1d79ac87df964e9d36f1e3a77b60d948af65bec35d3e5c75a3/grpcio_tools-1.71.2-cp312-cp312-win32.whl", hash = "sha256:84ad86332c44572305138eafa4cc30040c9a5e81826993eae8227863b700b490", size = 945744, upload-time = "2025-06-28T04:21:23.463Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e9/c84c1078f0b7af7d8a40f5214a9bdd8d2a567ad6c09975e6e2613a08d29d/grpcio_tools-1.71.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e1108d37eecc73b1c4a27350a6ed921b5dda25091700c1da17cfe30761cd462", size = 1117695, upload-time = "2025-06-28T04:21:25.22Z" }, - { url = "https://files.pythonhosted.org/packages/60/9c/bdf9c5055a1ad0a09123402d73ecad3629f75b9cf97828d547173b328891/grpcio_tools-1.71.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:b0f0a8611614949c906e25c225e3360551b488d10a366c96d89856bcef09f729", size = 2384758, upload-time = "2025-06-28T04:21:26.712Z" }, - { url = "https://files.pythonhosted.org/packages/49/d0/6aaee4940a8fb8269c13719f56d69c8d39569bee272924086aef81616d4a/grpcio_tools-1.71.2-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:7931783ea7ac42ac57f94c5047d00a504f72fbd96118bf7df911bb0e0435fc0f", size = 5443127, upload-time = "2025-06-28T04:21:28.383Z" }, - { url = "https://files.pythonhosted.org/packages/d9/11/50a471dcf301b89c0ed5ab92c533baced5bd8f796abfd133bbfadf6b60e5/grpcio_tools-1.71.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:d188dc28e069aa96bb48cb11b1338e47ebdf2e2306afa58a8162cc210172d7a8", size = 2349627, upload-time = "2025-06-28T04:21:30.254Z" }, - { url = "https://files.pythonhosted.org/packages/bb/66/e3dc58362a9c4c2fbe98a7ceb7e252385777ebb2bbc7f42d5ab138d07ace/grpcio_tools-1.71.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f36c4b3cc42ad6ef67430639174aaf4a862d236c03c4552c4521501422bfaa26", size = 2742932, upload-time = "2025-06-28T04:21:32.325Z" }, - { url = "https://files.pythonhosted.org/packages/b7/1e/1e07a07ed8651a2aa9f56095411198385a04a628beba796f36d98a5a03ec/grpcio_tools-1.71.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bd9ed12ce93b310f0cef304176049d0bc3b9f825e9c8c6a23e35867fed6affd", size = 2473627, upload-time = "2025-06-28T04:21:33.752Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f9/3b7b32e4acb419f3a0b4d381bc114fe6cd48e3b778e81273fc9e4748caad/grpcio_tools-1.71.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7ce27e76dd61011182d39abca38bae55d8a277e9b7fe30f6d5466255baccb579", size = 2850879, upload-time = "2025-06-28T04:21:35.241Z" }, - { url = "https://files.pythonhosted.org/packages/1e/99/cd9e1acd84315ce05ad1fcdfabf73b7df43807cf00c3b781db372d92b899/grpcio_tools-1.71.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:dcc17bf59b85c3676818f2219deacac0156492f32ca165e048427d2d3e6e1157", size = 3300216, upload-time = "2025-06-28T04:21:36.826Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c0/66eab57b14550c5b22404dbf60635c9e33efa003bd747211981a9859b94b/grpcio_tools-1.71.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:706360c71bdd722682927a1fb517c276ccb816f1e30cb71f33553e5817dc4031", size = 2913521, upload-time = "2025-06-28T04:21:38.347Z" }, - { url = "https://files.pythonhosted.org/packages/05/9b/7c90af8f937d77005625d705ab1160bc42a7e7b021ee5c788192763bccd6/grpcio_tools-1.71.2-cp313-cp313-win32.whl", hash = "sha256:bcf751d5a81c918c26adb2d6abcef71035c77d6eb9dd16afaf176ee096e22c1d", size = 945322, upload-time = "2025-06-28T04:21:39.864Z" }, - { url = "https://files.pythonhosted.org/packages/5f/80/6db6247f767c94fe551761772f89ceea355ff295fd4574cb8efc8b2d1199/grpcio_tools-1.71.2-cp313-cp313-win_amd64.whl", hash = "sha256:b1581a1133552aba96a730178bc44f6f1a071f0eb81c5b6bc4c0f89f5314e2b8", size = 1117234, upload-time = "2025-06-28T04:21:41.893Z" }, -] - [[package]] name = "gunicorn" version = "26.0.0" @@ -8478,7 +8425,7 @@ requires-dist = [ { name = "markupsafe", marker = "extra == 'markup'", specifier = "==3.0.2" }, { name = "mcp", specifier = ">=1.17.0,<2.0.0" }, { name = "mcp", marker = "extra == 'mcp'", specifier = ">=1.17.0,<2.0.0" }, - { name = "mem0ai", marker = "extra == 'mem0'", specifier = ">=0.1.34" }, + { name = "mem0ai", marker = "extra == 'mem0'", specifier = ">=2.0.2,<3.0.0" }, { name = "metal-sdk", marker = "extra == 'metal'", specifier = "==2.5.1" }, { name = "metaphor-python", marker = "extra == 'metaphor'", specifier = "==0.1.23" }, { name = "mlx", marker = "python_full_version >= '3.12' and platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'mlx'", specifier = ">=0.29.0" }, @@ -8526,7 +8473,7 @@ requires-dist = [ { name = "python-docx", marker = "extra == 'docx'", specifier = ">=1.1.0" }, { name = "python-multipart", specifier = ">=0.0.12,<1.0.0" }, { name = "pytube", marker = "extra == 'pytube'", specifier = "==15.0.0" }, - { name = "qdrant-client", marker = "extra == 'qdrant'", specifier = "==1.9.2" }, + { name = "qdrant-client", marker = "extra == 'qdrant'", specifier = ">=1.12.0,<2.0.0" }, { name = "qianfan", marker = "extra == 'qianfan'", specifier = "==0.3.5" }, { name = "ragstack-ai-knowledge-store", marker = "python_full_version < '3.13' and extra == 'ragstack'", specifier = "==0.2.1" }, { name = "redis", marker = "extra == 'redis'", specifier = ">=7.4.0,<8.0.0" }, @@ -9900,7 +9847,7 @@ wheels = [ [[package]] name = "mem0ai" -version = "1.0.11" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openai" }, @@ -9911,9 +9858,9 @@ dependencies = [ { name = "qdrant-client" }, { name = "sqlalchemy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/1e/2f8a8cc4b8e7f6126f3367d27dc65eac5cd4ceb854888faa3a8f62a2c0a0/mem0ai-1.0.11.tar.gz", hash = "sha256:ddb803bedc22bd514606d262407782e88df929f6991b59f6972fb8a25cc06001", size = 201758, upload-time = "2026-04-06T11:31:43.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/8f/86975bdf11a0aece78b6f4d5551b8b92c38b9bdf5f5764fc879e6cb1227b/mem0ai-2.0.2.tar.gz", hash = "sha256:482d11a55c8aa00dce29a66eeecbba2fd5f5c7501c054ce8ba606baee3755f99", size = 214627, upload-time = "2026-05-07T20:03:47.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/b5/f822c94e1b901f8a700af134c2473646de9a7db26364566f6a72d527d235/mem0ai-1.0.11-py3-none-any.whl", hash = "sha256:bcf4d678dc0a4d4e8eccaebe05562eae022fcdc825a0e3095d02f28cf61a5b6d", size = 297138, upload-time = "2026-04-06T11:31:41.716Z" }, + { url = "https://files.pythonhosted.org/packages/01/f8/59902456c1950e63b6b226634463bc8b24d81697e7114f0740059fd0a270/mem0ai-2.0.2-py3-none-any.whl", hash = "sha256:6fda32549c213fb63b393f4b1920f54961ea75c51d95b6492096108609accf3b", size = 302276, upload-time = "2026-05-07T20:03:45.706Z" }, ] [[package]] @@ -14969,21 +14916,21 @@ wheels = [ [[package]] name = "qdrant-client" -version = "1.9.2" +version = "1.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, - { name = "grpcio-tools" }, { name = "httpx", extra = ["http2"] }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "portalocker" }, + { name = "protobuf" }, { name = "pydantic" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/39/5fd63d835acbad5d76c3f3e7cb366c84c9cc09b2a2d2b3a4cac3a9b6adee/qdrant_client-1.9.2.tar.gz", hash = "sha256:35ba55a8484a4b817f985749d11fe6b5d2acf617fec07dd8bc01f3e9b4e9fa79", size = 201058, upload-time = "2024-06-20T11:19:54.006Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/45/5b1bdd15a3c7730eefb9c113600829e20d689b82b5a23f9e07d107094004/qdrant_client-1.18.0.tar.gz", hash = "sha256:52e8ece1a7d40519801bf0b70713bfa0f6b7ae28c7275bbe0b0286fbed7f6db4", size = 352580, upload-time = "2026-05-11T14:12:38.702Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/32/d639a030094b9e427e27abc7ad36b26a912d403e2a1bbd5b172a766de3a6/qdrant_client-1.9.2-py3-none-any.whl", hash = "sha256:0f49a4a6a47f62bc2c9afc69f9e1fb7790e4861ffe083d2de78dda30eb477d0e", size = 230108, upload-time = "2024-06-20T11:19:51.713Z" }, + { url = "https://files.pythonhosted.org/packages/d6/10/c437bd2ac41ef30d3019063e6ce537dc111e9214473b337ee88f7fa6359a/qdrant_client-1.18.0-py3-none-any.whl", hash = "sha256:093aa8cf8a420ee3ad2a68b007e1378d7992b2600e0b53c193fc172674f659cd", size = 398126, upload-time = "2026-05-11T14:12:36.998Z" }, ] [[package]]