isage-middleware 0.1.1__py3-none-any.whl → 0.1.3__py3-none-any.whl

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.

Potentially problematic release.


This version of isage-middleware might be problematic. Click here for more details.

Files changed (379) hide show
  1. isage_middleware-0.1.3.dist-info/METADATA +115 -0
  2. isage_middleware-0.1.3.dist-info/RECORD +291 -0
  3. sage/__init__.py +56 -2
  4. sage/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  5. sage/__pycache__/__init__.cpython-311.pyc +0 -0
  6. sage/middleware/__init__.py +52 -79
  7. sage/middleware/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  8. sage/middleware/__pycache__/__init__.cpython-311.pyc +0 -0
  9. sage/middleware/__pycache__/_version.cpython-311.opt-2.pyc +0 -0
  10. sage/middleware/__pycache__/_version.cpython-311.pyc +0 -0
  11. sage/middleware/_version.py +35 -0
  12. sage/middleware/api/__init__.py +52 -18
  13. sage/middleware/api/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  14. sage/middleware/api/__pycache__/__init__.cpython-311.pyc +0 -0
  15. sage/middleware/api/__pycache__/graph_api.cpython-311.opt-2.pyc +0 -0
  16. sage/middleware/api/__pycache__/graph_api.cpython-311.pyc +0 -0
  17. sage/middleware/api/__pycache__/kv_api.cpython-311.opt-2.pyc +0 -0
  18. sage/middleware/api/__pycache__/kv_api.cpython-311.pyc +0 -0
  19. sage/middleware/api/__pycache__/memory_api.cpython-311.opt-2.pyc +0 -0
  20. sage/middleware/api/__pycache__/memory_api.cpython-311.pyc +0 -0
  21. sage/middleware/api/__pycache__/vdb_api.cpython-311.opt-2.pyc +0 -0
  22. sage/middleware/api/__pycache__/vdb_api.cpython-311.pyc +0 -0
  23. sage/middleware/components/enterprise/__init__.py +56 -0
  24. sage/middleware/components/enterprise/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  25. sage/middleware/components/enterprise/__pycache__/__init__.cpython-311.pyc +0 -0
  26. sage/middleware/components/neuromem/__init__.py +56 -0
  27. sage/middleware/components/neuromem/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  28. sage/middleware/components/neuromem/__pycache__/__init__.cpython-311.pyc +0 -0
  29. sage/middleware/components/neuromem/__pycache__/memory_manager.cpython-311.opt-2.pyc +0 -0
  30. sage/middleware/components/neuromem/__pycache__/memory_manager.cpython-311.pyc +0 -0
  31. sage/middleware/components/neuromem/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  32. sage/middleware/components/neuromem/__pycache__/memory_service.cpython-311.pyc +0 -0
  33. sage/middleware/components/neuromem/memory_collection/__init__.py +56 -0
  34. sage/middleware/components/neuromem/memory_collection/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  35. sage/middleware/components/neuromem/memory_collection/__pycache__/__init__.cpython-311.pyc +0 -0
  36. sage/middleware/components/neuromem/memory_collection/__pycache__/base_collection.cpython-311.opt-2.pyc +0 -0
  37. sage/middleware/components/neuromem/memory_collection/__pycache__/base_collection.cpython-311.pyc +0 -0
  38. sage/middleware/components/neuromem/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  39. sage/middleware/components/neuromem/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  40. sage/middleware/components/neuromem/memory_collection/__pycache__/kv_collection.cpython-311.opt-2.pyc +0 -0
  41. sage/middleware/components/neuromem/memory_collection/__pycache__/kv_collection.cpython-311.pyc +0 -0
  42. sage/middleware/components/neuromem/memory_collection/__pycache__/vdb_collection.cpython-311.opt-2.pyc +0 -0
  43. sage/middleware/components/neuromem/memory_collection/__pycache__/vdb_collection.cpython-311.pyc +0 -0
  44. sage/middleware/components/neuromem/memory_collection/base_collection.py +167 -0
  45. sage/middleware/components/neuromem/memory_collection/graph_collection.py +11 -0
  46. sage/middleware/components/neuromem/memory_collection/kv_collection.py +709 -0
  47. sage/middleware/components/neuromem/memory_collection/vdb_collection.py +922 -0
  48. sage/middleware/components/neuromem/memory_manager.py +401 -0
  49. sage/middleware/components/neuromem/memory_service.py +324 -0
  50. sage/middleware/components/neuromem/micro_service/__init__.py +56 -0
  51. sage/middleware/components/neuromem/micro_service/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  52. sage/middleware/components/neuromem/micro_service/__pycache__/__init__.cpython-311.pyc +0 -0
  53. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb.cpython-311.opt-2.pyc +0 -0
  54. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb.cpython-311.pyc +0 -0
  55. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb_service.cpython-311.opt-2.pyc +0 -0
  56. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb_service.cpython-311.pyc +0 -0
  57. sage/middleware/components/neuromem/micro_service/neuromem_vdb.py +198 -0
  58. sage/middleware/components/neuromem/micro_service/neuromem_vdb_service.py +118 -0
  59. sage/middleware/components/neuromem/search_engine/__init__.py +56 -0
  60. sage/middleware/components/neuromem/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  61. sage/middleware/components/neuromem/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  62. sage/middleware/components/neuromem/search_engine/graph_index/__init__.py +56 -0
  63. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  64. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/__init__.cpython-311.pyc +0 -0
  65. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  66. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  67. sage/middleware/components/neuromem/search_engine/graph_index/base_graph_index.py +40 -0
  68. sage/middleware/components/neuromem/search_engine/hybird_index/__init__.py +56 -0
  69. sage/middleware/components/neuromem/search_engine/hybird_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  70. sage/middleware/components/neuromem/search_engine/hybird_index/__pycache__/__init__.cpython-311.pyc +0 -0
  71. sage/middleware/components/neuromem/search_engine/kv_index/__init__.py +56 -0
  72. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  73. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/__init__.cpython-311.pyc +0 -0
  74. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  75. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  76. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  77. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  78. sage/middleware/components/neuromem/search_engine/kv_index/base_kv_index.py +76 -0
  79. sage/middleware/components/neuromem/search_engine/kv_index/bm25s_index.py +320 -0
  80. sage/middleware/components/neuromem/search_engine/vdb_index/__init__.py +56 -0
  81. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  82. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/__init__.cpython-311.pyc +0 -0
  83. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  84. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  85. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  86. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/faiss_index.cpython-311.pyc +0 -0
  87. sage/middleware/components/neuromem/search_engine/vdb_index/base_vdb_index.py +53 -0
  88. sage/middleware/components/neuromem/search_engine/vdb_index/faiss_index.py +700 -0
  89. sage/middleware/components/neuromem/storage_engine/__init__.py +56 -0
  90. sage/middleware/components/neuromem/storage_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  91. sage/middleware/components/neuromem/storage_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  92. sage/middleware/components/neuromem/storage_engine/__pycache__/metadata_storage.cpython-311.opt-2.pyc +0 -0
  93. sage/middleware/components/neuromem/storage_engine/__pycache__/metadata_storage.cpython-311.pyc +0 -0
  94. sage/middleware/components/neuromem/storage_engine/__pycache__/text_storage.cpython-311.opt-2.pyc +0 -0
  95. sage/middleware/components/neuromem/storage_engine/__pycache__/text_storage.cpython-311.pyc +0 -0
  96. sage/middleware/components/neuromem/storage_engine/__pycache__/vector_storage.cpython-311.opt-2.pyc +0 -0
  97. sage/middleware/components/neuromem/storage_engine/__pycache__/vector_storage.cpython-311.pyc +0 -0
  98. sage/middleware/components/neuromem/storage_engine/kv_backend/__init__.py +56 -0
  99. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  100. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/__init__.cpython-311.pyc +0 -0
  101. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/base_kv_backend.cpython-311.opt-2.pyc +0 -0
  102. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/base_kv_backend.cpython-311.pyc +0 -0
  103. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/dict_kv_backend.cpython-311.opt-2.pyc +0 -0
  104. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/dict_kv_backend.cpython-311.pyc +0 -0
  105. sage/middleware/components/neuromem/storage_engine/kv_backend/base_kv_backend.py +65 -0
  106. sage/middleware/components/neuromem/storage_engine/kv_backend/dict_kv_backend.py +54 -0
  107. sage/middleware/components/neuromem/storage_engine/metadata_storage.py +260 -0
  108. sage/middleware/components/neuromem/storage_engine/text_storage.py +106 -0
  109. sage/middleware/components/neuromem/storage_engine/vector_storage.py +85 -0
  110. sage/middleware/components/neuromem/tests/__init__.py +56 -0
  111. sage/middleware/components/neuromem/tests/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  112. sage/middleware/components/neuromem/tests/__pycache__/__init__.cpython-311.pyc +0 -0
  113. sage/middleware/components/neuromem/tests/__pycache__/test_memory_service.cpython-311.opt-2.pyc +0 -0
  114. sage/middleware/components/neuromem/tests/__pycache__/test_memory_service.cpython-311.pyc +0 -0
  115. sage/middleware/components/neuromem/tests/core_test/__init__.py +56 -0
  116. sage/middleware/components/neuromem/tests/core_test/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  117. sage/middleware/components/neuromem/tests/core_test/__pycache__/__init__.cpython-311.pyc +0 -0
  118. sage/middleware/components/neuromem/tests/core_test/collection_test/__init__.py +56 -0
  119. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  120. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/__init__.cpython-311.pyc +0 -0
  121. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/kv_collection_test.cpython-311.opt-2.pyc +0 -0
  122. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/kv_collection_test.cpython-311.pyc +0 -0
  123. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/vdb_collection_test.cpython-311.opt-2.pyc +0 -0
  124. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/vdb_collection_test.cpython-311.pyc +0 -0
  125. sage/middleware/components/neuromem/tests/core_test/collection_test/kv_collection_test.py +60 -0
  126. sage/middleware/components/neuromem/tests/core_test/collection_test/vdb_collection_test.py +88 -0
  127. sage/middleware/components/neuromem/tests/core_test/manager_test.py +154 -0
  128. sage/middleware/components/neuromem/tests/test_memory_service.py +293 -0
  129. sage/middleware/components/neuromem/utils/__init__.py +56 -0
  130. sage/middleware/components/neuromem/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  131. sage/middleware/components/neuromem/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  132. sage/middleware/components/neuromem/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  133. sage/middleware/components/neuromem/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  134. sage/middleware/components/neuromem/utils/path_utils.py +25 -0
  135. sage/middleware/components/sage_db/__init__.py +56 -0
  136. sage/middleware/components/sage_db/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  137. sage/middleware/components/sage_db/__pycache__/__init__.cpython-311.pyc +0 -0
  138. sage/middleware/components/sage_db/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  139. sage/middleware/components/sage_db/__pycache__/sage_db.cpython-311.pyc +0 -0
  140. sage/middleware/components/sage_db/python/__init__.py +56 -0
  141. sage/middleware/components/sage_db/python/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  142. sage/middleware/components/sage_db/python/__pycache__/__init__.cpython-311.pyc +0 -0
  143. sage/middleware/components/sage_db/python/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  144. sage/middleware/components/sage_db/python/__pycache__/sage_db.cpython-311.pyc +0 -0
  145. sage/middleware/components/sage_db/tests/__pycache__/test_python.cpython-311.opt-2.pyc +0 -0
  146. sage/middleware/components/sage_db/tests/__pycache__/test_python.cpython-311.pyc +0 -0
  147. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.opt-2.pyc +0 -0
  148. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.pyc +0 -0
  149. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.opt-2.pyc +0 -0
  150. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.pyc +0 -0
  151. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.opt-2.pyc +0 -0
  152. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.pyc +0 -0
  153. sage/middleware/examples/api_usage_tutorial.py +3 -3
  154. sage/middleware/examples/dag_microservices_demo.py +7 -8
  155. sage/middleware/examples/microservices_integration_demo.py +8 -11
  156. sage/middleware/examples/microservices_registration_demo.py +8 -12
  157. sage/middleware/services/__init__.py +56 -0
  158. sage/middleware/services/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  159. sage/middleware/services/__pycache__/__init__.cpython-311.pyc +0 -0
  160. sage/middleware/services/graph/__init__.py +52 -4
  161. sage/middleware/services/graph/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  162. sage/middleware/services/graph/__pycache__/__init__.cpython-311.pyc +0 -0
  163. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.opt-2.pyc +0 -0
  164. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.pyc +0 -0
  165. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.opt-2.pyc +0 -0
  166. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.pyc +0 -0
  167. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.opt-2.pyc +0 -0
  168. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.pyc +0 -0
  169. sage/middleware/services/graph/examples/graph_demo.py +3 -2
  170. sage/middleware/services/graph/graph_service.py +68 -0
  171. sage/middleware/services/graph/search_engine/__init__.py +56 -0
  172. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  173. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  174. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  175. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  176. sage/middleware/services/kv/__init__.py +52 -4
  177. sage/middleware/services/kv/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  178. sage/middleware/services/kv/__pycache__/__init__.cpython-311.pyc +0 -0
  179. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.opt-2.pyc +0 -0
  180. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.pyc +0 -0
  181. sage/middleware/services/kv/examples/__pycache__/{kv_demo.cpython-313.opt-2.pyc → kv_demo.cpython-311.opt-2.pyc} +0 -0
  182. sage/middleware/services/kv/examples/__pycache__/{kv_demo.cpython-313.pyc → kv_demo.cpython-311.pyc} +0 -0
  183. sage/middleware/services/kv/examples/kv_demo.py +1 -1
  184. sage/middleware/services/kv/search_engine/__init__.py +56 -0
  185. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  186. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  187. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  188. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  189. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  190. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  191. sage/middleware/services/memory/__init__.py +52 -8
  192. sage/middleware/services/memory/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  193. sage/middleware/services/memory/__pycache__/__init__.cpython-311.pyc +0 -0
  194. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  195. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.pyc +0 -0
  196. sage/middleware/services/memory/examples/__pycache__/{memory_demo.cpython-313.opt-2.pyc → memory_demo.cpython-311.opt-2.pyc} +0 -0
  197. sage/middleware/services/memory/examples/__pycache__/{memory_demo.cpython-313.pyc → memory_demo.cpython-311.pyc} +0 -0
  198. sage/middleware/services/memory/examples/dag_microservices_demo.py +8 -9
  199. sage/middleware/services/memory/examples/memory_demo.py +4 -4
  200. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  201. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  202. sage/middleware/services/memory/memory_service.py +14 -11
  203. sage/middleware/services/memory/utils/__init__.py +56 -0
  204. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  205. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  206. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  207. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  208. sage/middleware/services/vdb/__init__.py +52 -4
  209. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  210. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.pyc +0 -0
  211. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.opt-2.pyc +0 -0
  212. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.pyc +0 -0
  213. sage/middleware/services/vdb/examples/__pycache__/{vdb_demo.cpython-313.opt-2.pyc → vdb_demo.cpython-311.opt-2.pyc} +0 -0
  214. sage/middleware/services/vdb/examples/__pycache__/{vdb_demo.cpython-313.pyc → vdb_demo.cpython-311.pyc} +0 -0
  215. sage/middleware/services/vdb/examples/vdb_demo.py +2 -2
  216. sage/middleware/services/vdb/search_engine/__init__.py +56 -0
  217. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  218. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  219. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  220. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  221. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  222. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.pyc +0 -0
  223. sage/middleware/services/vdb/vdb_service.py +44 -41
  224. sage/middleware/utils/__init__.py +53 -2
  225. sage/middleware/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  226. sage/middleware/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  227. sage/middleware/utils/embedding/__init__.py +52 -31
  228. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  229. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.pyc +0 -0
  230. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.opt-2.pyc +0 -0
  231. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.pyc +0 -0
  232. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.opt-2.pyc +0 -0
  233. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.pyc +0 -0
  234. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.opt-2.pyc +0 -0
  235. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.pyc +0 -0
  236. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.opt-2.pyc +0 -0
  237. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.pyc +0 -0
  238. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.opt-2.pyc +0 -0
  239. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.pyc +0 -0
  240. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.opt-2.pyc +0 -0
  241. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.pyc +0 -0
  242. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.opt-2.pyc +0 -0
  243. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.pyc +0 -0
  244. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.opt-2.pyc +0 -0
  245. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.pyc +0 -0
  246. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.opt-2.pyc +0 -0
  247. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.pyc +0 -0
  248. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.opt-2.pyc +0 -0
  249. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.pyc +0 -0
  250. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.opt-2.pyc +0 -0
  251. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.pyc +0 -0
  252. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.opt-2.pyc +0 -0
  253. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.pyc +0 -0
  254. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.opt-2.pyc +0 -0
  255. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.pyc +0 -0
  256. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.opt-2.pyc +0 -0
  257. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.pyc +0 -0
  258. isage_middleware-0.1.1.dist-info/METADATA +0 -424
  259. isage_middleware-0.1.1.dist-info/RECORD +0 -182
  260. sage/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  261. sage/__pycache__/__init__.cpython-313.pyc +0 -0
  262. sage/middleware/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  263. sage/middleware/__pycache__/__init__.cpython-313.pyc +0 -0
  264. sage/middleware/api/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  265. sage/middleware/api/__pycache__/__init__.cpython-313.pyc +0 -0
  266. sage/middleware/api/__pycache__/graph_api.cpython-313.opt-2.pyc +0 -0
  267. sage/middleware/api/__pycache__/graph_api.cpython-313.pyc +0 -0
  268. sage/middleware/api/__pycache__/kv_api.cpython-313.opt-2.pyc +0 -0
  269. sage/middleware/api/__pycache__/kv_api.cpython-313.pyc +0 -0
  270. sage/middleware/api/__pycache__/memory_api.cpython-313.opt-2.pyc +0 -0
  271. sage/middleware/api/__pycache__/memory_api.cpython-313.pyc +0 -0
  272. sage/middleware/api/__pycache__/vdb_api.cpython-313.opt-2.pyc +0 -0
  273. sage/middleware/api/__pycache__/vdb_api.cpython-313.pyc +0 -0
  274. sage/middleware/enterprise/__init__.py +0 -75
  275. sage/middleware/enterprise/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  276. sage/middleware/enterprise/__pycache__/__init__.cpython-313.pyc +0 -0
  277. sage/middleware/enterprise/sage_db/__init__.py +0 -132
  278. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  279. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-313.pyc +0 -0
  280. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-313.opt-2.pyc +0 -0
  281. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-313.pyc +0 -0
  282. sage/middleware/enterprise/sage_db/python/__init__.py +0 -7
  283. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  284. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-313.pyc +0 -0
  285. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-313.opt-2.pyc +0 -0
  286. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-313.pyc +0 -0
  287. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-313.opt-2.pyc +0 -0
  288. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-313.pyc +0 -0
  289. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-313.opt-2.pyc +0 -0
  290. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-313.pyc +0 -0
  291. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-313.opt-2.pyc +0 -0
  292. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-313.pyc +0 -0
  293. sage/middleware/examples/__pycache__/microservices_demo.cpython-313.opt-2.pyc +0 -0
  294. sage/middleware/examples/__pycache__/microservices_demo.cpython-313.pyc +0 -0
  295. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-313.opt-2.pyc +0 -0
  296. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-313.pyc +0 -0
  297. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-313.opt-2.pyc +0 -0
  298. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-313.pyc +0 -0
  299. sage/middleware/services/graph/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  300. sage/middleware/services/graph/__pycache__/__init__.cpython-313.pyc +0 -0
  301. sage/middleware/services/graph/__pycache__/graph_index.cpython-313.opt-2.pyc +0 -0
  302. sage/middleware/services/graph/__pycache__/graph_index.cpython-313.pyc +0 -0
  303. sage/middleware/services/graph/__pycache__/graph_service.cpython-313.opt-2.pyc +0 -0
  304. sage/middleware/services/graph/__pycache__/graph_service.cpython-313.pyc +0 -0
  305. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-313.opt-2.pyc +0 -0
  306. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-313.pyc +0 -0
  307. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  308. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  309. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-313.opt-2.pyc +0 -0
  310. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-313.pyc +0 -0
  311. sage/middleware/services/kv/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  312. sage/middleware/services/kv/__pycache__/__init__.cpython-313.pyc +0 -0
  313. sage/middleware/services/kv/__pycache__/kv_service.cpython-313.opt-2.pyc +0 -0
  314. sage/middleware/services/kv/__pycache__/kv_service.cpython-313.pyc +0 -0
  315. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  316. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  317. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-313.opt-2.pyc +0 -0
  318. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-313.pyc +0 -0
  319. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-313.opt-2.pyc +0 -0
  320. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-313.pyc +0 -0
  321. sage/middleware/services/memory/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  322. sage/middleware/services/memory/__pycache__/__init__.cpython-313.pyc +0 -0
  323. sage/middleware/services/memory/__pycache__/memory_service.cpython-313.opt-2.pyc +0 -0
  324. sage/middleware/services/memory/__pycache__/memory_service.cpython-313.pyc +0 -0
  325. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-313.opt-2.pyc +0 -0
  326. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-313.pyc +0 -0
  327. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-313.opt-2.pyc +0 -0
  328. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-313.pyc +0 -0
  329. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  330. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-313.pyc +0 -0
  331. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-313.opt-2.pyc +0 -0
  332. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-313.pyc +0 -0
  333. sage/middleware/services/vdb/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  334. sage/middleware/services/vdb/__pycache__/__init__.cpython-313.pyc +0 -0
  335. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-313.opt-2.pyc +0 -0
  336. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-313.pyc +0 -0
  337. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  338. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  339. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-313.opt-2.pyc +0 -0
  340. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-313.pyc +0 -0
  341. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-313.opt-2.pyc +0 -0
  342. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-313.pyc +0 -0
  343. sage/middleware/utils/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  344. sage/middleware/utils/__pycache__/__init__.cpython-313.pyc +0 -0
  345. sage/middleware/utils/embedding/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  346. sage/middleware/utils/embedding/__pycache__/__init__.cpython-313.pyc +0 -0
  347. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-313.opt-2.pyc +0 -0
  348. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-313.pyc +0 -0
  349. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-313.opt-2.pyc +0 -0
  350. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-313.pyc +0 -0
  351. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-313.opt-2.pyc +0 -0
  352. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-313.pyc +0 -0
  353. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-313.opt-2.pyc +0 -0
  354. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-313.pyc +0 -0
  355. sage/middleware/utils/embedding/__pycache__/hf.cpython-313.opt-2.pyc +0 -0
  356. sage/middleware/utils/embedding/__pycache__/hf.cpython-313.pyc +0 -0
  357. sage/middleware/utils/embedding/__pycache__/instructor.cpython-313.opt-2.pyc +0 -0
  358. sage/middleware/utils/embedding/__pycache__/instructor.cpython-313.pyc +0 -0
  359. sage/middleware/utils/embedding/__pycache__/jina.cpython-313.opt-2.pyc +0 -0
  360. sage/middleware/utils/embedding/__pycache__/jina.cpython-313.pyc +0 -0
  361. sage/middleware/utils/embedding/__pycache__/lollms.cpython-313.opt-2.pyc +0 -0
  362. sage/middleware/utils/embedding/__pycache__/lollms.cpython-313.pyc +0 -0
  363. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-313.opt-2.pyc +0 -0
  364. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-313.pyc +0 -0
  365. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-313.opt-2.pyc +0 -0
  366. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-313.pyc +0 -0
  367. sage/middleware/utils/embedding/__pycache__/ollama.cpython-313.opt-2.pyc +0 -0
  368. sage/middleware/utils/embedding/__pycache__/ollama.cpython-313.pyc +0 -0
  369. sage/middleware/utils/embedding/__pycache__/openai.cpython-313.opt-2.pyc +0 -0
  370. sage/middleware/utils/embedding/__pycache__/openai.cpython-313.pyc +0 -0
  371. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-313.opt-2.pyc +0 -0
  372. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-313.pyc +0 -0
  373. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-313.opt-2.pyc +0 -0
  374. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-313.pyc +0 -0
  375. {isage_middleware-0.1.1.dist-info → isage_middleware-0.1.3.dist-info}/WHEEL +0 -0
  376. {isage_middleware-0.1.1.dist-info → isage_middleware-0.1.3.dist-info}/top_level.txt +0 -0
  377. /sage/middleware/{enterprise → components}/sage_db/python/sage_db.py +0 -0
  378. /sage/middleware/{enterprise → components}/sage_db/sage_db.py +0 -0
  379. /sage/middleware/{enterprise → components}/sage_db/tests/test_python.py +0 -0
@@ -0,0 +1,401 @@
1
+ # sage/service/memory/memory_manager.py
2
+ # python -m sage.middleware.services.neuromem.memory_manager
3
+ import os
4
+ import json
5
+ import shutil
6
+ from typing import Any, Dict, List, Optional, Union
7
+
8
+ from sage.common.utils.logging.custom_logger import CustomLogger
9
+ from sage.middleware.components.neuromem.utils.path_utils import get_default_data_dir
10
+ from sage.middleware.components.neuromem.memory_collection.base_collection import BaseMemoryCollection
11
+ from sage.middleware.components.neuromem.memory_collection.graph_collection import GraphMemoryCollection
12
+ from sage.middleware.components.neuromem.memory_collection.kv_collection import KVMemoryCollection
13
+ from sage.middleware.components.neuromem.memory_collection.vdb_collection import VDBMemoryCollection
14
+ from sage.middleware.utils.embedding.embedding_api import apply_embedding_model
15
+
16
+ class MemoryManager:
17
+ """
18
+ 内存管理器,管理不同类型的 MemoryCollection 实例
19
+ """
20
+
21
+ def __init__(self, data_dir: Optional[str] = None):
22
+ self.logger = CustomLogger()
23
+
24
+ self.collections: Dict[str, BaseMemoryCollection] = {}
25
+ self.collection_metadata: Dict[str, Dict[str, Any]] = {}
26
+ self.collection_status: Dict[str, str] = {} # 状态表: "loaded" or "on_disk"
27
+
28
+ # 从默认目录data/sage_memory获取disk中的manager(如果有)
29
+ self.data_dir = data_dir or get_default_data_dir()
30
+ self.manager_path = os.path.join(self.data_dir, "manager.json")
31
+ self._load_manager()
32
+
33
+ def create_collection(
34
+ self,
35
+ name: str,
36
+ backend_type: str,
37
+ description: str = "",
38
+ embedding_model: Optional[Any] = None,
39
+ dim: Optional[int] = None,
40
+ ) -> BaseMemoryCollection:
41
+ """
42
+ 创建新的集合
43
+ 直接返回collection
44
+ """
45
+
46
+ if name in self.collection_metadata:
47
+ self.logger.warning(f"Collection with name '{name}' already exists.")
48
+ return None
49
+
50
+ metadata = {
51
+ "description": description,
52
+ "backend_type": backend_type
53
+ }
54
+
55
+ # 创建基础集合
56
+ if backend_type == "VDB":
57
+ if embedding_model is None or dim is None:
58
+ self.logger.warning(f"VDB requires parameter 'embedding_model' and 'dim', use default values.")
59
+ embedding_model = apply_embedding_model("default")
60
+ dim = embedding_model.get_dim()
61
+
62
+ # 使用新的config字典方式创建VDB集合
63
+ vdb_config = {
64
+ "name": name,
65
+ "default_embedding_model": embedding_model.method_name,
66
+ "default_dim": dim
67
+ }
68
+ new_collection = VDBMemoryCollection(vdb_config)
69
+ metadata.update({
70
+ "embedding_model_method": embedding_model.method_name,
71
+ "embedding_dim": dim
72
+ })
73
+ elif backend_type == "KV":
74
+ # 使用新的config字典方式创建KV集合
75
+ kv_config = {
76
+ "name": name
77
+ }
78
+ new_collection = KVMemoryCollection(kv_config)
79
+ elif backend_type == "GRAPH":
80
+ new_collection = GraphMemoryCollection(name)
81
+ else:
82
+ self.logger.error(f"Unsupported backend_type: {backend_type}")
83
+
84
+ # 存储到 collections
85
+ self.collections[name] = new_collection
86
+ self.collection_metadata[name] = metadata
87
+ self.collection_status[name] = "loaded"
88
+ return new_collection
89
+
90
+ def get_collection(self, name: str) -> Optional[BaseMemoryCollection]:
91
+ """优先返回内存collection,不在内存则尝试磁盘懒加载并发警告"""
92
+ if name in self.collections:
93
+ return self.collections[name]
94
+ elif name in self.collection_metadata:
95
+ self.logger.warning(f"Collection '{name}' not in memory, loading from disk.")
96
+ return self._load_collection(name)
97
+ else:
98
+ self.logger.warning(f"Collection '{name}' not found.")
99
+ return None
100
+
101
+ def delete_collection(self, name: str):
102
+ """删除collection:内存、元数据、磁盘三处都要删"""
103
+ existed = False
104
+ # 内存
105
+ if name in self.collections:
106
+ del self.collections[name]
107
+ existed = True
108
+ # 元信息
109
+ if name in self.collection_metadata:
110
+ backend_type = self.collection_metadata[name].get("backend_type")
111
+ del self.collection_metadata[name]
112
+ self.collection_status.pop(name, None)
113
+ existed = True
114
+ # 磁盘
115
+ if backend_type == "VDB":
116
+ path = os.path.join(self.data_dir, "vdb_collection", name)
117
+ elif backend_type == "KV":
118
+ path = os.path.join(self.data_dir, "kv_collection", name)
119
+ elif backend_type == "GRAPH":
120
+ path = os.path.join(self.data_dir, "graph_collection", name)
121
+ else:
122
+ path = None
123
+ if path and os.path.exists(path):
124
+ try:
125
+ if os.path.isdir(path):
126
+ shutil.rmtree(path)
127
+ else:
128
+ os.remove(path)
129
+ except Exception as e:
130
+ self.logger.warning(f"Failed to delete disk collection '{name}': {e}")
131
+ if not existed:
132
+ self.logger.warning(f"Collection '{name}' not found.")
133
+ self._save_manager()
134
+
135
+ def connect_collection(self, name: str, embedding_model=None) -> Optional[BaseMemoryCollection]:
136
+ """类似get_collection,但支持外部embedding_model"""
137
+ if name in self.collections:
138
+ return self.collections[name]
139
+ if name not in self.collection_metadata:
140
+ self.logger.warning(f"Collection '{name}' not found in metadata.")
141
+ return None
142
+ meta = self.collection_metadata[name]
143
+ backend_type = meta.get("backend_type")
144
+ if backend_type == "VDB":
145
+ vdb_path = os.path.join(self.data_dir, "vdb_collection", name)
146
+ if embedding_model is None:
147
+ method_name = meta.get("embedding_model_method", "default")
148
+ embedding_model = apply_embedding_model(method_name)
149
+ # 使用新的load方法,只传入name和路径
150
+ collection = VDBMemoryCollection.load(name, vdb_path)
151
+ elif backend_type == "KV":
152
+ kv_path = os.path.join(self.data_dir, "kv_collection", name)
153
+ # 使用新的load方法,只传入name和路径
154
+ collection = KVMemoryCollection.load(name, kv_path)
155
+ elif backend_type == "GRAPH":
156
+ graph_path = os.path.join(self.data_dir, "graph_collection", name)
157
+ collection = GraphMemoryCollection.load(name, graph_path)
158
+ else:
159
+ self.logger.warning(f"Unknown backend_type: {backend_type}")
160
+ return None
161
+ self.collections[name] = collection
162
+ self.collection_status[name] = "loaded"
163
+ return collection
164
+
165
+ def store_collection(self, name: Optional[str] = None):
166
+ """
167
+ 只保存已加载(即被用过的)的collection及manager信息
168
+ """
169
+ # 指定name只存一个,否则只存所有已加载collection
170
+ collections_to_save = [name] if name else [
171
+ n for n, status in self.collection_status.items() if status == "loaded"
172
+ ]
173
+ for cname in collections_to_save:
174
+ if cname not in self.collections:
175
+ continue
176
+ collection = self.collections[cname]
177
+ if hasattr(collection, "store"):
178
+ # 传递MemoryManager的数据目录,让collection使用统一的目录结构
179
+ collection.store(self.data_dir)
180
+ self._save_manager()
181
+
182
+ def _save_manager(self):
183
+ with open(self.manager_path, "w", encoding="utf-8") as f:
184
+ json.dump(self.collection_metadata, f, ensure_ascii=False, indent=2)
185
+ self.logger.info(f"Manager info saved to {self.manager_path}")
186
+
187
+ def _load_manager(self):
188
+ """只加载collection_metadata和状态,不加载任何collection本体"""
189
+ if not os.path.exists(self.manager_path):
190
+ return
191
+ with open(self.manager_path, "r", encoding="utf-8") as f:
192
+ self.collection_metadata = json.load(f)
193
+ for name in self.collection_metadata:
194
+ self.collection_status[name] = "on_disk"
195
+
196
+ def _load_collection(self, name: str) -> Optional[BaseMemoryCollection]:
197
+ """懒加载collection进内存"""
198
+ if name not in self.collection_metadata:
199
+ self.logger.warning(f"Collection '{name}' metadata not found in manager.")
200
+ return None
201
+
202
+ meta = self.collection_metadata[name]
203
+ backend_type = meta.get("backend_type")
204
+ if backend_type == "VDB":
205
+ vdb_path = os.path.join(self.data_dir, "vdb_collection", name)
206
+ method_name = meta.get("embedding_model_method", "default")
207
+ embedding_model = apply_embedding_model(method_name)
208
+ # 使用新的load方法,只传入name和路径
209
+ collection = VDBMemoryCollection.load(name, vdb_path)
210
+ elif backend_type == "KV":
211
+ kv_path = os.path.join(self.data_dir, "kv_collection", name)
212
+ # 使用新的load方法,只传入name和路径
213
+ collection = KVMemoryCollection.load(name, kv_path)
214
+ elif backend_type == "GRAPH":
215
+ graph_path = os.path.join(self.data_dir, "graph_collection", name)
216
+ collection = GraphMemoryCollection.load(name, graph_path)
217
+ else:
218
+ self.logger.warning(f"Unknown backend_type: {backend_type}")
219
+ return None
220
+
221
+ self.collections[name] = collection
222
+ self.collection_status[name] = "loaded"
223
+ return collection
224
+
225
+
226
+ def list_collection(self, name: Optional[str] = None) -> Union[Dict[str, Any], List[Dict[str, Any]]]:
227
+ """
228
+ 列出一个或所有 collection 的基本信息。
229
+ List basic info of one or all collections.
230
+ """
231
+ if name:
232
+ if name not in self.collection_metadata:
233
+ self.logger.warning(f"Collection '{name}' not found.")
234
+ return None
235
+ return {"name": name, "status": self.collection_status.get(name, "unknown"), **self.collection_metadata[name]}
236
+ else:
237
+ return [
238
+ {"name": n, "status": self.collection_status.get(n, "unknown"), **meta}
239
+ for n, meta in self.collection_metadata.items()
240
+ ]
241
+
242
+ def rename(self, former_name: str, new_name: str, new_description: Optional[str] = None):
243
+ """重命名 collection 并更新描述"""
244
+ if former_name not in self.collection_metadata:
245
+ self.logger.warning(f"Collection '{former_name}' not found.")
246
+ return False
247
+ if new_name in self.collection_metadata:
248
+ self.logger.warning(f"Collection '{new_name}' already exists.")
249
+ return False
250
+
251
+ # 重命名内存对象
252
+ if former_name in self.collections:
253
+ collection = self.collections.pop(former_name)
254
+ collection.name = new_name
255
+ self.collections[new_name] = collection
256
+
257
+ # 重命名状态表
258
+ if former_name in self.collection_status:
259
+ self.collection_status[new_name] = self.collection_status.pop(former_name)
260
+
261
+ # 更新元信息
262
+ metadata = self.collection_metadata.pop(former_name)
263
+ metadata["description"] = new_description or metadata.get("description", "")
264
+ self.collection_metadata[new_name] = metadata
265
+
266
+ # 重命名磁盘目录/文件
267
+ backend_type = metadata.get("backend_type")
268
+ def get_path(n):
269
+ if backend_type == "VDB":
270
+ return os.path.join(self.data_dir, "vdb_collection", n)
271
+ elif backend_type == "KV":
272
+ return os.path.join(self.data_dir, "kv_collection", n)
273
+ elif backend_type == "GRAPH":
274
+ return os.path.join(self.data_dir, "graph_collection", n)
275
+ old_path = get_path(former_name)
276
+ new_path = get_path(new_name)
277
+ if os.path.exists(old_path):
278
+ os.rename(old_path, new_path)
279
+ self._save_manager()
280
+ return True
281
+
282
+
283
+
284
+ if __name__ == "__main__":
285
+ import os
286
+ import shutil
287
+
288
+ def print_result(expect, actual, passed):
289
+ green = '\033[92m'
290
+ red = '\033[91m'
291
+ endc = '\033[0m'
292
+ print(f"预期结果:{expect}")
293
+ print(f"实际结果:{actual}")
294
+ print("是否通过测试:", end="")
295
+ print(f"{green}是{endc}" if passed else f"{red}否{endc}")
296
+ print("="*50)
297
+
298
+ def clear_all_data(manager):
299
+ # 删除data_dir下所有collection目录和manager.json
300
+ base = manager.data_dir
301
+ for subdir in ["vdb_collection"]:
302
+ path = os.path.join(base, subdir)
303
+ if os.path.exists(path):
304
+ shutil.rmtree(path)
305
+ if os.path.exists(manager.manager_path):
306
+ os.remove(manager.manager_path)
307
+
308
+ # 测试1: 创建新VDB collection
309
+ manager = MemoryManager()
310
+ c1 = manager.create_collection(name="test_vdb", backend_type="VDB")
311
+ passed = c1 is not None and "test_vdb" in manager.collections
312
+ print_result("新建test_vdb后能在collections中查到", str("test_vdb" in manager.collections), passed)
313
+
314
+ # 测试2: 再次新建同名collection应警告并返回None
315
+ c2 = manager.create_collection(name="test_vdb", backend_type="VDB")
316
+ passed = c2 is None
317
+ print_result("新建已存在collection应返回None", str(c2 is None), passed)
318
+
319
+ # 测试3: list_collection返回正确,状态为loaded
320
+ info = manager.list_collection("test_vdb")
321
+ passed = info is not None and info['status'] == "loaded"
322
+ print_result("list_collection显示状态为loaded", f"{info}", passed)
323
+
324
+ # 测试4: get_collection取已存在的
325
+ c3 = manager.get_collection("test_vdb")
326
+ passed = c3 is c1
327
+ print_result("get_collection能返回内存已加载对象", f"id相同: {c3 is c1}", passed)
328
+
329
+ # 测试5: store_collection只保存已加载collection
330
+ manager.store_collection()
331
+ path = os.path.join(manager.data_dir, "vdb_collection", "test_vdb")
332
+ passed = os.path.exists(path)
333
+ print_result("store_collection后磁盘应有数据目录", str(os.path.exists(path)), passed)
334
+
335
+ # 测试6: 模拟“只在磁盘不在内存”的懒加载
336
+ del manager.collections["test_vdb"]
337
+ manager.collection_status["test_vdb"] = "on_disk"
338
+ passed = "test_vdb" not in manager.collections and os.path.exists(os.path.join(manager.data_dir, "vdb_collection", "test_vdb"))
339
+ print_result("未加载collection不会在collections", str(passed), passed)
340
+
341
+ # 测试7: get_collection能从磁盘懒加载
342
+ c4 = manager.get_collection("test_vdb")
343
+ passed = c4 is not None and "test_vdb" in manager.collections and manager.collection_status["test_vdb"] == "loaded"
344
+ print_result("get_collection能懒加载on_disk collection", str(passed), passed)
345
+
346
+ # 测试8: rename
347
+ r = manager.rename("test_vdb", "renamed_vdb", "renamed desc")
348
+ passed = r and "renamed_vdb" in manager.collections
349
+ print_result("rename操作成功", str(r), passed)
350
+
351
+ # store 一下,保证磁盘有数据
352
+ manager.store_collection("renamed_vdb")
353
+
354
+ print("\n==中间测试==")
355
+ print("请确认manager.json、collection磁盘文件已经存在。")
356
+ print("输入yes继续从磁盘加载测试,否则中止(将自动清理):")
357
+ ans = input().strip().lower()
358
+ if ans != "yes":
359
+ print("用户中止,已清理所有测试数据。")
360
+ clear_all_data(manager)
361
+ exit(0)
362
+
363
+ # 测试9: 用新manager对象从磁盘懒加载
364
+ manager2 = MemoryManager(manager.data_dir)
365
+ loaded = "renamed_vdb" in manager2.collection_metadata and manager2.collection_status.get("renamed_vdb") == "on_disk"
366
+ print_result("新manager能从磁盘加载管理信息(collection未自动加载)", str(loaded), loaded)
367
+
368
+ # 测试10: list_collection(全部)
369
+ all_info = manager.list_collection()
370
+ passed = isinstance(all_info, list)
371
+ print_result("list_collection()能返回所有collection列表", str(passed), passed)
372
+
373
+ print("\n==中间测试==")
374
+ print("请确认manager.json、collection磁盘文件已经存在。")
375
+ print("输入yes继续从磁盘加载测试,否则中止(将自动清理):")
376
+ ans = input().strip().lower()
377
+ if ans != "yes":
378
+ print("用户中止,已清理所有测试数据。")
379
+ clear_all_data(manager)
380
+ exit(0)
381
+
382
+ # 测试11: 用新manager对象从磁盘懒加载
383
+ manager2 = MemoryManager(manager.data_dir)
384
+ loaded = "test_vdb" in manager2.collection_metadata or "renamed_vdb" in manager2.collection_metadata
385
+ print_result("新manager能从磁盘加载管理信息(collection未自动加载)", str(loaded), loaded)
386
+
387
+ # 如果上面已重命名并删除,理论上只有空的或剩余collection
388
+ # 为了测试懒加载,再新建并保存一次
389
+ cnew = manager2.create_collection("lazy_test", backend_type="VDB")
390
+ manager2.store_collection()
391
+ del manager2.collections["lazy_test"]
392
+ manager2.collection_status["lazy_test"] = "on_disk"
393
+ c5 = manager2.get_collection("lazy_test")
394
+ passed = c5 is not None and manager2.collection_status["lazy_test"] == "loaded"
395
+ print_result("新manager懒加载on_disk collection后状态变为loaded", str(passed), passed)
396
+
397
+ # 清理所有
398
+ clear_all_data(manager)
399
+ print("\n所有测试完成,已清理测试数据!")
400
+
401
+