fix(python): huggingface TEI auth, procedural-memory content handling, and proxy pip auto-install (#6947)

This commit is contained in:
Kartik
2026-08-20 15:56:55 +05:30
committed by GitHub
parent 530d802b55
commit ed38ddf873
11 changed files with 264 additions and 18 deletions
+93 -2
View File
@@ -1235,9 +1235,10 @@ class TestHybridSearchWarning:
def test_warning_for_store_without_keyword_search(
self, mock_vs_factory, mock_emb, mock_llm, mock_sqlite, _cap, caplog
):
from mem0.vector_stores.base import VectorStoreBase
import logging
from mem0.vector_stores.base import VectorStoreBase
class StoreWithoutKeywordSearch(VectorStoreBase):
def create_col(self, *a, **kw): pass
def insert(self, *a, **kw): pass
@@ -1271,9 +1272,10 @@ class TestHybridSearchWarning:
def test_no_warning_for_store_with_keyword_search(
self, mock_vs_factory, mock_emb, mock_llm, mock_sqlite, _cap, caplog
):
from mem0.vector_stores.base import VectorStoreBase
import logging
from mem0.vector_stores.base import VectorStoreBase
class StoreWithKeywordSearch(VectorStoreBase):
def keyword_search(self, query, top_k=5, filters=None):
return []
@@ -1574,3 +1576,92 @@ async def test_async_procedural_memory_default_path_without_langchain(mock_llm_f
assert result["results"][0]["event"] == "ADD"
memory.llm.generate_response.assert_called_once()
@pytest.mark.asyncio
@patch("mem0.memory.main.VectorStoreFactory")
@patch("mem0.memory.main.EmbedderFactory")
@patch("mem0.memory.main.LlmFactory")
async def test_async_procedural_memory_langchain_list_content(mock_llm_factory, mock_emb, mock_vs):
"""Regression #6150: a LangChain block list must be extracted, not dropped."""
mock_vs.return_value = MagicMock()
mock_emb.return_value = MagicMock()
mock_emb.return_value.embed.return_value = [0.1] * 1536
mock_llm_factory.return_value = MagicMock()
from mem0.memory.main import AsyncMemory
memory = AsyncMemory(MemoryConfig())
memory.vector_store = MagicMock()
memory.vector_store.insert = MagicMock()
mock_langchain_llm = MagicMock()
mock_response = MagicMock()
mock_response.content = [{"type": "text", "text": "- deploy with the release script"}]
mock_langchain_llm.invoke.return_value = mock_response
await memory._create_procedural_memory(
[{"role": "user", "content": "how do we deploy"}],
metadata={"user_id": "test_user"},
llm=mock_langchain_llm,
)
stored_data = memory.vector_store.insert.call_args[1]["payloads"][0]["data"]
assert stored_data == "- deploy with the release script"
@pytest.mark.asyncio
@patch("mem0.memory.main.VectorStoreFactory")
@patch("mem0.memory.main.EmbedderFactory")
@patch("mem0.memory.main.LlmFactory")
async def test_async_procedural_memory_empty_content_raises(mock_llm_factory, mock_emb, mock_vs):
"""Regression #6150: a refusal (content=None) must raise, not store an empty memory."""
mock_vs.return_value = MagicMock()
mock_emb.return_value = MagicMock()
mock_llm_factory.return_value = MagicMock()
from mem0.memory.main import AsyncMemory
memory = AsyncMemory(MemoryConfig())
memory.vector_store = MagicMock()
memory.vector_store.insert = MagicMock()
mock_langchain_llm = MagicMock()
mock_response = MagicMock()
mock_response.content = None
mock_langchain_llm.invoke.return_value = mock_response
with pytest.raises(ValueError, match="no content for the procedural memory summary"):
await memory._create_procedural_memory(
[{"role": "user", "content": "how do we deploy"}],
metadata={"user_id": "test_user"},
llm=mock_langchain_llm,
)
memory.vector_store.insert.assert_not_called()
@patch("mem0.utils.factory.EmbedderFactory.create")
@patch("mem0.utils.factory.VectorStoreFactory.create")
@patch("mem0.utils.factory.LlmFactory.create")
@patch("mem0.memory.storage.SQLiteManager")
def test_sync_procedural_memory_empty_content_raises(
mock_sqlite, mock_llm_factory, mock_vector_factory, mock_embedder_factory
):
"""Regression #6150: the sync path must raise on empty LLM content too."""
mock_embedder_factory.return_value = MagicMock()
mock_vector_store = MagicMock()
mock_vector_factory.return_value = mock_vector_store
mock_llm_factory.return_value = MagicMock()
mock_sqlite.return_value = MagicMock()
memory = Memory(MemoryConfig())
memory.llm.generate_response = Mock(return_value=None)
with pytest.raises(ValueError, match="no content for the procedural memory summary"):
memory._create_procedural_memory(
[{"role": "user", "content": "how do we deploy"}],
metadata={"user_id": "test_user"},
)
mock_vector_store.insert.assert_not_called()