memory_factory.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from mem0 import Memory
  2. from .config import COLLECTION_CONVERSATIONAL, COLLECTION_KNOWLEDGE
  3. from .prompts import PROMPTS
  4. NOOP_WHERE = {"$and": [{"user_id": {"$ne": ""}}, {"user_id": {"$ne": ""}}]}
  5. def make_config(collection_name: str, prompt_key: str) -> dict:
  6. """Build a mem0 config with selected prompts and shared model/vector settings."""
  7. prompts = PROMPTS[prompt_key]
  8. return {
  9. "llm": {
  10. "provider": "groq",
  11. "config": {
  12. "model": "meta-llama/llama-4-scout-17b-16e-instruct",
  13. "temperature": 0.025,
  14. "max_tokens": 1500,
  15. },
  16. },
  17. "vector_store": {
  18. "provider": "chroma",
  19. "config": {
  20. "host": "192.168.0.200",
  21. "port": 8001,
  22. "collection_name": collection_name,
  23. },
  24. },
  25. "embedder": {
  26. "provider": "ollama",
  27. "config": {
  28. "model": "nomic-embed-text",
  29. "ollama_base_url": "http://192.168.0.200:11434",
  30. },
  31. },
  32. "custom_fact_extraction_prompt": prompts["fact_extraction"],
  33. "custom_update_memory_prompt": prompts["update_memory"],
  34. }
  35. def is_effectively_empty(filters) -> bool:
  36. """Treat missing and known-empty filter shapes as empty filters."""
  37. if not filters:
  38. return True
  39. if filters in ({"AND": []}, {"OR": []}):
  40. return True
  41. return False
  42. def make_safe_search(mem_instance: Memory):
  43. """Patch mem0 search to survive Chroma errors on empty filters."""
  44. original = mem_instance.vector_store.search
  45. def safe_search(query, vectors, limit=10, filters=None):
  46. if is_effectively_empty(filters):
  47. return mem_instance.vector_store.collection.query(
  48. query_embeddings=vectors,
  49. n_results=limit,
  50. where=NOOP_WHERE,
  51. )
  52. try:
  53. return original(query=query, vectors=vectors, limit=limit, filters=filters)
  54. except Exception as exc:
  55. if "Expected where" in str(exc):
  56. return mem_instance.vector_store.collection.query(
  57. query_embeddings=vectors,
  58. n_results=limit,
  59. where=NOOP_WHERE,
  60. )
  61. raise
  62. return safe_search
  63. def build_memories() -> tuple[Memory, Memory]:
  64. """Create and patch conversational + knowledge Memory instances."""
  65. memory_conv = Memory.from_config(make_config(COLLECTION_CONVERSATIONAL, "conversational"))
  66. memory_know = Memory.from_config(make_config(COLLECTION_KNOWLEDGE, "knowledge"))
  67. memory_conv.vector_store.search = make_safe_search(memory_conv)
  68. memory_know.vector_store.search = make_safe_search(memory_know)
  69. return memory_conv, memory_know