Fixes ollama and updates openai dependency (#3452)

This commit is contained in:
Parshva Daftari
2025-09-12 01:39:39 +05:30
committed by GitHub
parent 21d69307dc
commit d48b1832c7
5 changed files with 36 additions and 10 deletions
+8
View File
@@ -91,6 +91,14 @@ class OllamaLLM(LLMBase):
"messages": messages, "messages": messages,
} }
# Handle JSON response format by modifying the system prompt
if response_format and response_format.get("type") == "json_object":
# Add JSON format instruction to the last message or create a system message
if messages and messages[-1]["role"] == "user":
messages[-1]["content"] += "\n\nPlease respond with valid JSON only."
else:
messages.append({"role": "user", "content": "Please respond with valid JSON only."})
# Add options for Ollama (temperature, num_predict, top_p) # Add options for Ollama (temperature, num_predict, top_p)
options = { options = {
"temperature": self.config.temperature, "temperature": self.config.temperature,
+16 -4
View File
@@ -7,6 +7,7 @@ import logging
import os import os
import uuid import uuid
import warnings import warnings
from copy import deepcopy from copy import deepcopy
from datetime import datetime from datetime import datetime
from typing import Any, Dict, Optional from typing import Any, Dict, Optional
@@ -38,6 +39,9 @@ from mem0.utils.factory import (
VectorStoreFactory, VectorStoreFactory,
) )
# Suppress SWIG deprecation warnings globally
warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*SwigPy.*")
warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*swigvarlink.*")
def _build_filters_and_metadata( def _build_filters_and_metadata(
*, # Enforce keyword-only arguments *, # Enforce keyword-only arguments
@@ -386,8 +390,12 @@ class Memory(MemoryBase):
response = "" response = ""
try: try:
response = remove_code_blocks(response) if not response or not response.strip():
new_memories_with_actions = json.loads(response) logger.warning("Empty response from LLM, no memories to extract")
new_memories_with_actions = {}
else:
response = remove_code_blocks(response)
new_memories_with_actions = json.loads(response)
except Exception as e: except Exception as e:
logger.error(f"Invalid JSON response: {e}") logger.error(f"Invalid JSON response: {e}")
new_memories_with_actions = {} new_memories_with_actions = {}
@@ -1229,8 +1237,12 @@ class AsyncMemory(MemoryBase):
logger.error(f"Error in new memory actions response: {e}") logger.error(f"Error in new memory actions response: {e}")
response = "" response = ""
try: try:
response = remove_code_blocks(response) if not response or not response.strip():
new_memories_with_actions = json.loads(response) logger.warning("Empty response from LLM, no memories to extract")
new_memories_with_actions = {}
else:
response = remove_code_blocks(response)
new_memories_with_actions = json.loads(response)
except Exception as e: except Exception as e:
logger.error(f"Invalid JSON response: {e}") logger.error(f"Invalid JSON response: {e}")
new_memories_with_actions = {} new_memories_with_actions = {}
+6
View File
@@ -8,7 +8,13 @@ from typing import Dict, List, Optional
import numpy as np import numpy as np
from pydantic import BaseModel from pydantic import BaseModel
import warnings
try: try:
# Suppress SWIG deprecation warnings from FAISS
warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*SwigPy.*")
warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*swigvarlink.*")
logging.getLogger("faiss").setLevel(logging.WARNING) logging.getLogger("faiss").setLevel(logging.WARNING)
logging.getLogger("faiss.loader").setLevel(logging.WARNING) logging.getLogger("faiss.loader").setLevel(logging.WARNING)
+2 -2
View File
@@ -14,7 +14,7 @@ requires-python = ">=3.9,<4.0"
dependencies = [ dependencies = [
"qdrant-client>=1.9.1", "qdrant-client>=1.9.1",
"pydantic>=2.7.3", "pydantic>=2.7.3",
"openai>=1.90.0,<1.100.0", "openai>=1.90.0,<1.110.0",
"posthog>=3.5.0", "posthog>=3.5.0",
"pytz>=2024.1", "pytz>=2024.1",
"sqlalchemy>=2.0.31", "sqlalchemy>=2.0.31",
@@ -54,7 +54,7 @@ llms = [
"groq>=0.3.0", "groq>=0.3.0",
"together>=0.2.10", "together>=0.2.10",
"litellm>=1.74.0", "litellm>=1.74.0",
"openai>=1.90.0,<1.100.0", "openai>=1.90.0,<1.110.0",
"ollama>=0.1.0", "ollama>=0.1.0",
"vertexai>=0.1.0", "vertexai>=0.1.0",
"google-generativeai>=0.3.0", "google-generativeai>=0.3.0",
+4 -4
View File
@@ -66,7 +66,7 @@ class TestAddToVectorStoreErrors:
mock_memory.llm.generate_response.side_effect = ['{"facts": ["test fact"]}', ""] mock_memory.llm.generate_response.side_effect = ['{"facts": ["test fact"]}', ""]
# Execute # Execute
with caplog.at_level(logging.ERROR): with caplog.at_level(logging.WARNING):
result = mock_memory._add_to_vector_store( result = mock_memory._add_to_vector_store(
messages=[{"role": "user", "content": "test"}], metadata={}, filters={}, infer=True messages=[{"role": "user", "content": "test"}], metadata={}, filters={}, infer=True
) )
@@ -74,7 +74,7 @@ class TestAddToVectorStoreErrors:
# Verify # Verify
assert mock_memory.llm.generate_response.call_count == 2 assert mock_memory.llm.generate_response.call_count == 2
assert result == [] # Should return empty list when no memories processed assert result == [] # Should return empty list when no memories processed
assert "Invalid JSON response" in caplog.text assert "Empty response from LLM, no memories to extract" in caplog.text
@pytest.mark.asyncio @pytest.mark.asyncio
@@ -117,11 +117,11 @@ class TestAsyncAddToVectorStoreErrors:
mock_capture_event = mocker.MagicMock() mock_capture_event = mocker.MagicMock()
mocker.patch("mem0.memory.main.capture_event", mock_capture_event) mocker.patch("mem0.memory.main.capture_event", mock_capture_event)
with caplog.at_level(logging.ERROR): with caplog.at_level(logging.WARNING):
result = await mock_async_memory._add_to_vector_store( result = await mock_async_memory._add_to_vector_store(
messages=[{"role": "user", "content": "test"}], metadata={}, effective_filters={}, infer=True messages=[{"role": "user", "content": "test"}], metadata={}, effective_filters={}, infer=True
) )
assert result == [] assert result == []
assert "Invalid JSON response" in caplog.text assert "Empty response from LLM, no memories to extract" in caplog.text
assert mock_capture_event.call_count == 1 assert mock_capture_event.call_count == 1