mem0ai-azure-mysql 0.1.116.5__tar.gz → 0.1.116.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/PKG-INFO +1 -1
  2. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/graph_memory.py +42 -52
  3. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/main.py +7 -6
  4. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/utils.py +2 -2
  5. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/pyproject.toml +1 -1
  6. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/.gitignore +0 -0
  7. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/README.md +0 -0
  8. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/__init__.py +0 -0
  9. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/client/__init__.py +0 -0
  10. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/client/main.py +0 -0
  11. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/client/project.py +0 -0
  12. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/client/utils.py +0 -0
  13. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/__init__.py +0 -0
  14. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/base.py +0 -0
  15. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/dbs/__init__.py +0 -0
  16. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/dbs/base.py +0 -0
  17. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/dbs/mysql.py +0 -0
  18. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/embeddings/__init__.py +0 -0
  19. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/embeddings/base.py +0 -0
  20. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/enums.py +0 -0
  21. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/__init__.py +0 -0
  22. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/anthropic.py +0 -0
  23. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/aws_bedrock.py +0 -0
  24. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/azure.py +0 -0
  25. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/base.py +0 -0
  26. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/deepseek.py +0 -0
  27. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/lmstudio.py +0 -0
  28. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/ollama.py +0 -0
  29. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/openai.py +0 -0
  30. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/llms/vllm.py +0 -0
  31. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/prompts.py +0 -0
  32. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/__init__.py +0 -0
  33. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/azure_ai_search.py +0 -0
  34. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/baidu.py +0 -0
  35. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/chroma.py +0 -0
  36. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/databricks.py +0 -0
  37. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/elasticsearch.py +0 -0
  38. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/faiss.py +0 -0
  39. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/langchain.py +0 -0
  40. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/milvus.py +0 -0
  41. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/mongodb.py +0 -0
  42. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/opensearch.py +0 -0
  43. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/pgvector.py +0 -0
  44. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/pinecone.py +0 -0
  45. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/qdrant.py +0 -0
  46. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/redis.py +0 -0
  47. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/supabase.py +0 -0
  48. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/upstash_vector.py +0 -0
  49. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/vertex_ai_vector_search.py +0 -0
  50. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/configs/vector_stores/weaviate.py +0 -0
  51. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/dbs/__init__.py +0 -0
  52. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/dbs/base.py +0 -0
  53. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/dbs/configs.py +0 -0
  54. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/dbs/mysql.py +0 -0
  55. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/__init__.py +0 -0
  56. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/aws_bedrock.py +0 -0
  57. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/azure_openai.py +0 -0
  58. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/base.py +0 -0
  59. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/configs.py +0 -0
  60. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/gemini.py +0 -0
  61. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/huggingface.py +0 -0
  62. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/langchain.py +0 -0
  63. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/lmstudio.py +0 -0
  64. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/mock.py +0 -0
  65. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/ollama.py +0 -0
  66. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/openai.py +0 -0
  67. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/together.py +0 -0
  68. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/embeddings/vertexai.py +0 -0
  69. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/graphs/__init__.py +0 -0
  70. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/graphs/configs.py +0 -0
  71. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/graphs/neptune/__init__.py +0 -0
  72. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/graphs/neptune/base.py +0 -0
  73. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/graphs/neptune/main.py +0 -0
  74. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/graphs/tools.py +0 -0
  75. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/graphs/utils.py +0 -0
  76. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/__init__.py +0 -0
  77. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/anthropic.py +0 -0
  78. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/aws_bedrock.py +0 -0
  79. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/azure_openai.py +0 -0
  80. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/azure_openai_structured.py +0 -0
  81. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/base.py +0 -0
  82. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/configs.py +0 -0
  83. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/deepseek.py +0 -0
  84. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/gemini.py +0 -0
  85. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/groq.py +0 -0
  86. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/langchain.py +0 -0
  87. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/litellm.py +0 -0
  88. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/lmstudio.py +0 -0
  89. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/ollama.py +0 -0
  90. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/openai.py +0 -0
  91. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/openai_structured.py +0 -0
  92. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/sarvam.py +0 -0
  93. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/together.py +0 -0
  94. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/vllm.py +0 -0
  95. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/llms/xai.py +0 -0
  96. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/__init__.py +0 -0
  97. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/base.py +0 -0
  98. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/kuzu_memory.py +0 -0
  99. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/memgraph_memory.py +0 -0
  100. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/setup.py +0 -0
  101. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/storage.py +0 -0
  102. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/memory/telemetry.py +0 -0
  103. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/proxy/__init__.py +0 -0
  104. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/proxy/main.py +0 -0
  105. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/utils/factory.py +0 -0
  106. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/__init__.py +0 -0
  107. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/azure_ai_search.py +0 -0
  108. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/baidu.py +0 -0
  109. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/base.py +0 -0
  110. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/chroma.py +0 -0
  111. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/configs.py +0 -0
  112. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/databricks.py +0 -0
  113. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/elasticsearch.py +0 -0
  114. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/faiss.py +0 -0
  115. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/langchain.py +0 -0
  116. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/milvus.py +0 -0
  117. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/mongodb.py +0 -0
  118. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/opensearch.py +0 -0
  119. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/pgvector.py +0 -0
  120. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/pinecone.py +0 -0
  121. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/qdrant.py +0 -0
  122. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/redis.py +0 -0
  123. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/supabase.py +0 -0
  124. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/upstash_vector.py +0 -0
  125. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/vertex_ai_vector_search.py +0 -0
  126. {mem0ai_azure_mysql-0.1.116.5 → mem0ai_azure_mysql-0.1.116.7}/mem0/vector_stores/weaviate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mem0ai-azure-mysql
3
- Version: 0.1.116.5
3
+ Version: 0.1.116.7
4
4
  Summary: Long-term memory for AI Agents with Azure DefaultAzureCredential authentication and MySQL history database support
5
5
  Requires-Python: <4.0,>=3.9
6
6
  Requires-Dist: azure-identity>=1.23.1
@@ -76,7 +76,7 @@ class MemoryGraph:
76
76
  self.threshold = self.config.graph_store.config.similarity_threshold
77
77
  self.top_k = self.config.graph_store.config.top_k
78
78
 
79
- def add(self, data, filters):
79
+ def add(self, data, metadata, filters):
80
80
  """
81
81
  Adds data to the graph.
82
82
 
@@ -92,10 +92,11 @@ class MemoryGraph:
92
92
  # TODO: Batch queries with APOC plugin
93
93
  # TODO: Add more filter support
94
94
  deleted_entities = self._delete_entities(to_be_deleted, filters)
95
- added_entities = self._add_entities(to_be_added, filters, entity_type_map)
95
+ added_entities = self._add_entities(to_be_added, metadata, filters, entity_type_map)
96
96
 
97
97
  return {"deleted_entities": deleted_entities, "added_entities": added_entities}
98
98
 
99
+ @time_perf
99
100
  def search(self, query, filters, limit=100):
100
101
  """
101
102
  Search for memories and related graph data.
@@ -128,6 +129,7 @@ class MemoryGraph:
128
129
  "relationship": item[1],
129
130
  "destination": item[2],
130
131
  "score": item[3] if len(item) > 3 else 0.0,
132
+ "metadata": item[4] if len(item) > 4 else {},
131
133
  }
132
134
  )
133
135
 
@@ -139,15 +141,12 @@ class MemoryGraph:
139
141
 
140
142
  return search_results
141
143
 
144
+ @time_perf
142
145
  def rerank(self, search_output, query):
143
146
  if not self.config.graph_store.config.rerank:
144
- search_outputs_sequence = [
145
- [item["source"], item["relationship"], item["destination"]] for item in search_output
147
+ return [
148
+ [item["source"], item["relationship"], item["destination"], 0.0, item.get("metadata", {})] for item in search_output
146
149
  ]
147
- bm25 = BM25Okapi(search_outputs_sequence)
148
-
149
- tokenized_query = query.split(" ")
150
- return bm25.get_top_n(tokenized_query, search_outputs_sequence, n=5)
151
150
 
152
151
  # Only cohere is supported for now
153
152
  rerank_config = self.config.graph_store.config.rerank.config
@@ -170,7 +169,8 @@ class MemoryGraph:
170
169
  original_output["source"],
171
170
  original_output["relationship"],
172
171
  original_output["destination"],
173
- result.relevance_score
172
+ result.relevance_score,
173
+ original_output["metadata"],
174
174
  ])
175
175
  return reranked_results
176
176
 
@@ -336,14 +336,14 @@ class MemoryGraph:
336
336
  CALL {{
337
337
  WITH n, row
338
338
  MATCH (n)-[r]->(m {self.node_label} {{{node_props_str}}})
339
- RETURN n.name AS source, elementId(n) AS source_id, type(r) AS relationship, elementId(r) AS relation_id, m.name AS destination, elementId(m) AS destination_id
339
+ RETURN n.name AS source, elementId(n) AS source_id, n.note_ids AS source_note_ids, type(r) AS relationship, elementId(r) AS relation_id, m.name AS destination, elementId(m) AS destination_id, m.note_ids AS destination_note_ids
340
340
  UNION
341
341
  WITH n, row
342
342
  MATCH (n)<-[r]-(m {self.node_label} {{{node_props_str}}})
343
- RETURN m.name AS source, elementId(m) AS source_id, type(r) AS relationship, elementId(r) AS relation_id, n.name AS destination, elementId(n) AS destination_id
343
+ RETURN m.name AS source, elementId(m) AS source_id, m.note_ids AS source_note_ids, type(r) AS relationship, elementId(r) AS relation_id, n.name AS destination, elementId(n) AS destination_id, n.note_ids AS destination_note_ids
344
344
  }}
345
- WITH distinct source, source_id, relationship, relation_id, destination, destination_id, similarity
346
- RETURN source, source_id, relationship, relation_id, destination, destination_id, similarity
345
+ WITH distinct source, source_id, relationship, relation_id, destination, destination_id, similarity, source_note_ids, destination_note_ids
346
+ RETURN source, source_id, relationship, relation_id, destination, destination_id, similarity, {{note_ids: source_note_ids + destination_note_ids}} AS metadata
347
347
  ORDER BY similarity DESC
348
348
  LIMIT {limit}
349
349
  """
@@ -371,6 +371,12 @@ class MemoryGraph:
371
371
  key = (rel["source"], rel["relationship"], rel["destination"])
372
372
  if key not in seen:
373
373
  seen.add(key)
374
+
375
+ original_metadata = rel.get("metadata", {})
376
+ rel["metadata"] = {
377
+ "note_ids": list(set(original_metadata.get("note_ids", []))),
378
+ }
379
+
374
380
  unique_relations.append(rel)
375
381
 
376
382
  return unique_relations
@@ -469,7 +475,7 @@ class MemoryGraph:
469
475
  return results
470
476
 
471
477
  @time_perf
472
- def _add_entities(self, to_be_added, filters, entity_type_map):
478
+ def _add_entities(self, to_be_added, metadata, filters, entity_type_map):
473
479
  """Add the new entities to the graph. Merge the nodes if they already exist."""
474
480
  user_id = filters["user_id"]
475
481
  agent_id = filters.get("agent_id", None)
@@ -484,29 +490,9 @@ class MemoryGraph:
484
490
  entities_to_embed = list(entities_to_embed)
485
491
  embeddings = self.embedding_model.embed_in_batch(entities_to_embed)
486
492
  embedding_map = {entity: embedding for entity, embedding in zip(entities_to_embed, embeddings)}
487
-
488
- query_stats = {
489
- 1: 0, 2: 0, 3: 0, 4: 0
490
- }
491
493
 
492
- queries = {
493
- "only_source_found": {
494
- "template": "",
495
- "rows": []
496
- },
497
- "only_destination_found": {
498
- "template": "",
499
- "rows": []
500
- },
501
- "both_found": {
502
- "template": "",
503
- "rows": []
504
- },
505
- "none_found": {
506
- "template": "",
507
- "rows": []
508
- },
509
- }
494
+ # metadata
495
+ note_ids = metadata.pop("note_ids", [])
510
496
 
511
497
  for item in to_be_added:
512
498
  # entities
@@ -544,14 +530,17 @@ class MemoryGraph:
544
530
  MATCH (source)
545
531
  WHERE elementId(source) = $source_id
546
532
  SET source.mentions = coalesce(source.mentions, 0) + 1
533
+ SET source.note_ids = coalesce(source.note_ids, []) + $note_ids
547
534
  WITH source
548
535
  MERGE (destination {destination_label} {{{merge_props_str}}})
549
536
  ON CREATE SET
550
537
  destination.created = timestamp(),
551
- destination.mentions = 1
538
+ destination.mentions = 1,
539
+ destination.note_ids = $note_ids
552
540
  {destination_extra_set}
553
541
  ON MATCH SET
554
- destination.mentions = coalesce(destination.mentions, 0) + 1
542
+ destination.mentions = coalesce(destination.mentions, 0) + 1,
543
+ destination.note_ids = coalesce(destination.note_ids, []) + $note_ids
555
544
  WITH source, destination
556
545
  CALL db.create.setNodeVectorProperty(destination, 'embedding', $destination_embedding)
557
546
  WITH source, destination
@@ -569,13 +558,12 @@ class MemoryGraph:
569
558
  "destination_name": destination,
570
559
  "destination_embedding": dest_embedding,
571
560
  "user_id": user_id,
561
+ "note_ids": note_ids,
572
562
  }
573
563
  if agent_id:
574
564
  params["agent_id"] = agent_id
575
565
  if run_id:
576
566
  params["run_id"] = run_id
577
-
578
- query_stats[1] += 1
579
567
 
580
568
  elif destination_node_search_result and not source_node_search_result:
581
569
  # Build source MERGE properties
@@ -590,14 +578,17 @@ class MemoryGraph:
590
578
  MATCH (destination)
591
579
  WHERE elementId(destination) = $destination_id
592
580
  SET destination.mentions = coalesce(destination.mentions, 0) + 1
581
+ SET destination.note_ids = coalesce(destination.note_ids, []) + $note_ids
593
582
  WITH destination
594
583
  MERGE (source {source_label} {{{merge_props_str}}})
595
584
  ON CREATE SET
596
585
  source.created = timestamp(),
597
- source.mentions = 1
586
+ source.mentions = 1,
587
+ source.note_ids = $note_ids
598
588
  {source_extra_set}
599
589
  ON MATCH SET
600
- source.mentions = coalesce(source.mentions, 0) + 1
590
+ source.mentions = coalesce(source.mentions, 0) + 1,
591
+ source.note_ids = coalesce(source.note_ids, []) + $note_ids
601
592
  WITH source, destination
602
593
  CALL db.create.setNodeVectorProperty(source, 'embedding', $source_embedding)
603
594
  WITH source, destination
@@ -615,23 +606,24 @@ class MemoryGraph:
615
606
  "source_name": source,
616
607
  "source_embedding": source_embedding,
617
608
  "user_id": user_id,
609
+ "note_ids": note_ids,
618
610
  }
619
611
  if agent_id:
620
612
  params["agent_id"] = agent_id
621
613
  if run_id:
622
614
  params["run_id"] = run_id
623
-
624
- query_stats[2] += 1
625
615
 
626
616
  elif source_node_search_result and destination_node_search_result:
627
617
  cypher = f"""
628
618
  MATCH (source)
629
619
  WHERE elementId(source) = $source_id
630
620
  SET source.mentions = coalesce(source.mentions, 0) + 1
621
+ SET source.note_ids = coalesce(source.note_ids, []) + $note_ids
631
622
  WITH source
632
623
  MATCH (destination)
633
624
  WHERE elementId(destination) = $destination_id
634
625
  SET destination.mentions = coalesce(destination.mentions, 0) + 1
626
+ SET destination.note_ids = coalesce(destination.note_ids, []) + $note_ids
635
627
  MERGE (source)-[r:{relationship}]->(destination)
636
628
  ON CREATE SET
637
629
  r.created_at = timestamp(),
@@ -645,13 +637,12 @@ class MemoryGraph:
645
637
  "source_id": source_node_search_result[0]["elementId(source_candidate)"],
646
638
  "destination_id": destination_node_search_result[0]["elementId(destination_candidate)"],
647
639
  "user_id": user_id,
640
+ "note_ids": note_ids,
648
641
  }
649
642
  if agent_id:
650
643
  params["agent_id"] = agent_id
651
644
  if run_id:
652
645
  params["run_id"] = run_id
653
-
654
- query_stats[3] += 1
655
646
 
656
647
  else:
657
648
  # Build dynamic MERGE props for both source and destination
@@ -669,7 +660,8 @@ class MemoryGraph:
669
660
  cypher = f"""
670
661
  MERGE (source {source_label} {{{source_props_str}}})
671
662
  ON CREATE SET source.created = timestamp(),
672
- source.mentions = 1
663
+ source.mentions = 1,
664
+ source.note_ids = $note_ids
673
665
  {source_extra_set}
674
666
  ON MATCH SET source.mentions = coalesce(source.mentions, 0) + 1
675
667
  WITH source
@@ -677,7 +669,8 @@ class MemoryGraph:
677
669
  WITH source
678
670
  MERGE (destination {destination_label} {{{dest_props_str}}})
679
671
  ON CREATE SET destination.created = timestamp(),
680
- destination.mentions = 1
672
+ destination.mentions = 1,
673
+ destination.note_ids = $note_ids
681
674
  {destination_extra_set}
682
675
  ON MATCH SET destination.mentions = coalesce(destination.mentions, 0) + 1
683
676
  WITH source, destination
@@ -695,17 +688,14 @@ class MemoryGraph:
695
688
  "source_embedding": source_embedding,
696
689
  "dest_embedding": dest_embedding,
697
690
  "user_id": user_id,
691
+ "note_ids": note_ids,
698
692
  }
699
693
  if agent_id:
700
694
  params["agent_id"] = agent_id
701
695
  if run_id:
702
696
  params["run_id"] = run_id
703
-
704
- query_stats[4] += 1
705
-
706
697
  result = self.graph.query(cypher, params=params)
707
698
  results.append(result)
708
- logger.warning(f"Add entities query stats: {query_stats}")
709
699
  return results
710
700
 
711
701
  def _remove_spaces_from_entities(self, entity_list):
@@ -258,7 +258,7 @@ class Memory(MemoryBase):
258
258
 
259
259
  with concurrent.futures.ThreadPoolExecutor() as executor:
260
260
  future1 = executor.submit(self._add_to_vector_store, messages, processed_metadata, effective_filters, infer)
261
- future2 = executor.submit(self._add_to_graph, messages, effective_filters)
261
+ future2 = executor.submit(self._add_to_graph, messages, processed_metadata, effective_filters)
262
262
 
263
263
  concurrent.futures.wait([future1, future2])
264
264
 
@@ -454,14 +454,14 @@ class Memory(MemoryBase):
454
454
  return returned_memories
455
455
 
456
456
  @time_perf
457
- def _add_to_graph(self, messages, filters):
457
+ def _add_to_graph(self, messages, metadata, filters):
458
458
  added_entities = []
459
459
  if self.enable_graph:
460
460
  if filters.get("user_id") is None:
461
461
  filters["user_id"] = "user"
462
462
 
463
463
  data = "\n".join([msg["content"] for msg in messages if "content" in msg and msg["role"] != "system"])
464
- added_entities = self.graph.add(data, filters)
464
+ added_entities = self.graph.add(data, metadata, filters)
465
465
 
466
466
  return added_entities
467
467
 
@@ -1100,7 +1100,7 @@ class AsyncMemory(MemoryBase):
1100
1100
  vector_store_task = asyncio.create_task(
1101
1101
  self._add_to_vector_store(messages, processed_metadata, effective_filters, infer)
1102
1102
  )
1103
- graph_task = asyncio.create_task(self._add_to_graph(messages, effective_filters))
1103
+ graph_task = asyncio.create_task(self._add_to_graph(messages, processed_metadata, effective_filters))
1104
1104
 
1105
1105
  vector_store_result, graph_result = await asyncio.gather(vector_store_task, graph_task)
1106
1106
 
@@ -1308,14 +1308,14 @@ class AsyncMemory(MemoryBase):
1308
1308
  return returned_memories
1309
1309
 
1310
1310
  @time_perf
1311
- async def _add_to_graph(self, messages, filters):
1311
+ async def _add_to_graph(self, messages, metadata, filters):
1312
1312
  added_entities = []
1313
1313
  if self.enable_graph:
1314
1314
  if filters.get("user_id") is None:
1315
1315
  filters["user_id"] = "user"
1316
1316
 
1317
1317
  data = "\n".join([msg["content"] for msg in messages if "content" in msg and msg["role"] != "system"])
1318
- added_entities = await asyncio.to_thread(self.graph.add, data, filters)
1318
+ added_entities = await asyncio.to_thread(self.graph.add, data, metadata, filters)
1319
1319
 
1320
1320
  return added_entities
1321
1321
 
@@ -1553,6 +1553,7 @@ class AsyncMemory(MemoryBase):
1553
1553
  else:
1554
1554
  return {"results": original_memories}
1555
1555
 
1556
+ @time_perf
1556
1557
  async def _search_vector_store(self, query, filters, limit, threshold: Optional[float] = None):
1557
1558
  embeddings = await asyncio.to_thread(self.embedding_model.embed, query, "search")
1558
1559
  memories = await asyncio.to_thread(
@@ -197,7 +197,7 @@ def time_perf(func):
197
197
  result = await func(*args, **kwargs)
198
198
  end = time.perf_counter()
199
199
  elapsed = end - start
200
- logger.warning(f"[{func.__name__}] executed in {elapsed:.6f} seconds")
200
+ logger.warning(f"[Mem0 time perf][{func.__name__}] executed in {elapsed:.6f} seconds")
201
201
  return result
202
202
  return async_wrapper
203
203
  else:
@@ -207,6 +207,6 @@ def time_perf(func):
207
207
  result = func(*args, **kwargs)
208
208
  end = time.perf_counter()
209
209
  elapsed = end - start
210
- logger.warning(f"[{func.__name__}] executed in {elapsed:.6f} seconds")
210
+ logger.warning(f"[Mem0 time perf][{func.__name__}] executed in {elapsed:.6f} seconds")
211
211
  return result
212
212
  return sync_wrapper
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mem0ai-azure-mysql"
7
- version = "0.1.116.5"
7
+ version = "0.1.116.7"
8
8
  description = "Long-term memory for AI Agents with Azure DefaultAzureCredential authentication and MySQL history database support"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9,<4.0"