isage-middleware 0.1.1__py3-none-any.whl → 0.1.3.1__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.
Files changed (377) hide show
  1. isage_middleware-0.1.3.1.dist-info/METADATA +115 -0
  2. isage_middleware-0.1.3.1.dist-info/RECORD +288 -0
  3. sage/middleware/__init__.py +52 -79
  4. sage/middleware/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  5. sage/middleware/__pycache__/__init__.cpython-311.pyc +0 -0
  6. sage/middleware/__pycache__/_version.cpython-311.opt-2.pyc +0 -0
  7. sage/middleware/__pycache__/_version.cpython-311.pyc +0 -0
  8. sage/middleware/_version.py +38 -0
  9. sage/middleware/api/__init__.py +52 -18
  10. sage/middleware/api/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  11. sage/middleware/api/__pycache__/__init__.cpython-311.pyc +0 -0
  12. sage/middleware/api/__pycache__/graph_api.cpython-311.opt-2.pyc +0 -0
  13. sage/middleware/api/__pycache__/graph_api.cpython-311.pyc +0 -0
  14. sage/middleware/api/__pycache__/kv_api.cpython-311.opt-2.pyc +0 -0
  15. sage/middleware/api/__pycache__/kv_api.cpython-311.pyc +0 -0
  16. sage/middleware/api/__pycache__/memory_api.cpython-311.opt-2.pyc +0 -0
  17. sage/middleware/api/__pycache__/memory_api.cpython-311.pyc +0 -0
  18. sage/middleware/api/__pycache__/vdb_api.cpython-311.opt-2.pyc +0 -0
  19. sage/middleware/api/__pycache__/vdb_api.cpython-311.pyc +0 -0
  20. sage/middleware/components/enterprise/__init__.py +56 -0
  21. sage/middleware/components/enterprise/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  22. sage/middleware/components/enterprise/__pycache__/__init__.cpython-311.pyc +0 -0
  23. sage/middleware/components/neuromem/__init__.py +56 -0
  24. sage/middleware/components/neuromem/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  25. sage/middleware/components/neuromem/__pycache__/__init__.cpython-311.pyc +0 -0
  26. sage/middleware/components/neuromem/__pycache__/memory_manager.cpython-311.opt-2.pyc +0 -0
  27. sage/middleware/components/neuromem/__pycache__/memory_manager.cpython-311.pyc +0 -0
  28. sage/middleware/components/neuromem/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  29. sage/middleware/components/neuromem/__pycache__/memory_service.cpython-311.pyc +0 -0
  30. sage/middleware/components/neuromem/memory_collection/__init__.py +56 -0
  31. sage/middleware/components/neuromem/memory_collection/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  32. sage/middleware/components/neuromem/memory_collection/__pycache__/__init__.cpython-311.pyc +0 -0
  33. sage/middleware/components/neuromem/memory_collection/__pycache__/base_collection.cpython-311.opt-2.pyc +0 -0
  34. sage/middleware/components/neuromem/memory_collection/__pycache__/base_collection.cpython-311.pyc +0 -0
  35. sage/middleware/components/neuromem/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  36. sage/middleware/components/neuromem/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  37. sage/middleware/components/neuromem/memory_collection/__pycache__/kv_collection.cpython-311.opt-2.pyc +0 -0
  38. sage/middleware/components/neuromem/memory_collection/__pycache__/kv_collection.cpython-311.pyc +0 -0
  39. sage/middleware/components/neuromem/memory_collection/__pycache__/vdb_collection.cpython-311.opt-2.pyc +0 -0
  40. sage/middleware/components/neuromem/memory_collection/__pycache__/vdb_collection.cpython-311.pyc +0 -0
  41. sage/middleware/components/neuromem/memory_collection/base_collection.py +167 -0
  42. sage/middleware/components/neuromem/memory_collection/graph_collection.py +11 -0
  43. sage/middleware/components/neuromem/memory_collection/kv_collection.py +709 -0
  44. sage/middleware/components/neuromem/memory_collection/vdb_collection.py +922 -0
  45. sage/middleware/components/neuromem/memory_manager.py +401 -0
  46. sage/middleware/components/neuromem/memory_service.py +324 -0
  47. sage/middleware/components/neuromem/micro_service/__init__.py +56 -0
  48. sage/middleware/components/neuromem/micro_service/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  49. sage/middleware/components/neuromem/micro_service/__pycache__/__init__.cpython-311.pyc +0 -0
  50. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb.cpython-311.opt-2.pyc +0 -0
  51. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb.cpython-311.pyc +0 -0
  52. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb_service.cpython-311.opt-2.pyc +0 -0
  53. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb_service.cpython-311.pyc +0 -0
  54. sage/middleware/components/neuromem/micro_service/neuromem_vdb.py +198 -0
  55. sage/middleware/components/neuromem/micro_service/neuromem_vdb_service.py +118 -0
  56. sage/middleware/components/neuromem/search_engine/__init__.py +56 -0
  57. sage/middleware/components/neuromem/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  58. sage/middleware/components/neuromem/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  59. sage/middleware/components/neuromem/search_engine/graph_index/__init__.py +56 -0
  60. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  61. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/__init__.cpython-311.pyc +0 -0
  62. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  63. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  64. sage/middleware/components/neuromem/search_engine/graph_index/base_graph_index.py +40 -0
  65. sage/middleware/components/neuromem/search_engine/hybird_index/__init__.py +56 -0
  66. sage/middleware/components/neuromem/search_engine/hybird_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  67. sage/middleware/components/neuromem/search_engine/hybird_index/__pycache__/__init__.cpython-311.pyc +0 -0
  68. sage/middleware/components/neuromem/search_engine/kv_index/__init__.py +56 -0
  69. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  70. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/__init__.cpython-311.pyc +0 -0
  71. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  72. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  73. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  74. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  75. sage/middleware/components/neuromem/search_engine/kv_index/base_kv_index.py +76 -0
  76. sage/middleware/components/neuromem/search_engine/kv_index/bm25s_index.py +320 -0
  77. sage/middleware/components/neuromem/search_engine/vdb_index/__init__.py +56 -0
  78. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  79. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/__init__.cpython-311.pyc +0 -0
  80. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  81. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  82. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  83. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/faiss_index.cpython-311.pyc +0 -0
  84. sage/middleware/components/neuromem/search_engine/vdb_index/base_vdb_index.py +53 -0
  85. sage/middleware/components/neuromem/search_engine/vdb_index/faiss_index.py +700 -0
  86. sage/middleware/components/neuromem/storage_engine/__init__.py +56 -0
  87. sage/middleware/components/neuromem/storage_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  88. sage/middleware/components/neuromem/storage_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  89. sage/middleware/components/neuromem/storage_engine/__pycache__/metadata_storage.cpython-311.opt-2.pyc +0 -0
  90. sage/middleware/components/neuromem/storage_engine/__pycache__/metadata_storage.cpython-311.pyc +0 -0
  91. sage/middleware/components/neuromem/storage_engine/__pycache__/text_storage.cpython-311.opt-2.pyc +0 -0
  92. sage/middleware/components/neuromem/storage_engine/__pycache__/text_storage.cpython-311.pyc +0 -0
  93. sage/middleware/components/neuromem/storage_engine/__pycache__/vector_storage.cpython-311.opt-2.pyc +0 -0
  94. sage/middleware/components/neuromem/storage_engine/__pycache__/vector_storage.cpython-311.pyc +0 -0
  95. sage/middleware/components/neuromem/storage_engine/kv_backend/__init__.py +56 -0
  96. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  97. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/__init__.cpython-311.pyc +0 -0
  98. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/base_kv_backend.cpython-311.opt-2.pyc +0 -0
  99. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/base_kv_backend.cpython-311.pyc +0 -0
  100. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/dict_kv_backend.cpython-311.opt-2.pyc +0 -0
  101. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/dict_kv_backend.cpython-311.pyc +0 -0
  102. sage/middleware/components/neuromem/storage_engine/kv_backend/base_kv_backend.py +65 -0
  103. sage/middleware/components/neuromem/storage_engine/kv_backend/dict_kv_backend.py +54 -0
  104. sage/middleware/components/neuromem/storage_engine/metadata_storage.py +260 -0
  105. sage/middleware/components/neuromem/storage_engine/text_storage.py +106 -0
  106. sage/middleware/components/neuromem/storage_engine/vector_storage.py +85 -0
  107. sage/middleware/components/neuromem/tests/__init__.py +56 -0
  108. sage/middleware/components/neuromem/tests/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  109. sage/middleware/components/neuromem/tests/__pycache__/__init__.cpython-311.pyc +0 -0
  110. sage/middleware/components/neuromem/tests/__pycache__/test_memory_service.cpython-311.opt-2.pyc +0 -0
  111. sage/middleware/components/neuromem/tests/__pycache__/test_memory_service.cpython-311.pyc +0 -0
  112. sage/middleware/components/neuromem/tests/core_test/__init__.py +56 -0
  113. sage/middleware/components/neuromem/tests/core_test/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  114. sage/middleware/components/neuromem/tests/core_test/__pycache__/__init__.cpython-311.pyc +0 -0
  115. sage/middleware/components/neuromem/tests/core_test/collection_test/__init__.py +56 -0
  116. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  117. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/__init__.cpython-311.pyc +0 -0
  118. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/kv_collection_test.cpython-311.opt-2.pyc +0 -0
  119. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/kv_collection_test.cpython-311.pyc +0 -0
  120. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/vdb_collection_test.cpython-311.opt-2.pyc +0 -0
  121. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/vdb_collection_test.cpython-311.pyc +0 -0
  122. sage/middleware/components/neuromem/tests/core_test/collection_test/kv_collection_test.py +60 -0
  123. sage/middleware/components/neuromem/tests/core_test/collection_test/vdb_collection_test.py +88 -0
  124. sage/middleware/components/neuromem/tests/core_test/manager_test.py +154 -0
  125. sage/middleware/components/neuromem/tests/test_memory_service.py +293 -0
  126. sage/middleware/components/neuromem/utils/__init__.py +56 -0
  127. sage/middleware/components/neuromem/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  128. sage/middleware/components/neuromem/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  129. sage/middleware/components/neuromem/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  130. sage/middleware/components/neuromem/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  131. sage/middleware/components/neuromem/utils/path_utils.py +25 -0
  132. sage/middleware/components/sage_db/__init__.py +56 -0
  133. sage/middleware/components/sage_db/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  134. sage/middleware/components/sage_db/__pycache__/__init__.cpython-311.pyc +0 -0
  135. sage/middleware/components/sage_db/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  136. sage/middleware/components/sage_db/__pycache__/sage_db.cpython-311.pyc +0 -0
  137. sage/middleware/components/sage_db/python/__init__.py +56 -0
  138. sage/middleware/components/sage_db/python/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  139. sage/middleware/components/sage_db/python/__pycache__/__init__.cpython-311.pyc +0 -0
  140. sage/middleware/components/sage_db/python/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  141. sage/middleware/components/sage_db/python/__pycache__/sage_db.cpython-311.pyc +0 -0
  142. sage/middleware/{enterprise → components}/sage_db/sage_db.py +3 -211
  143. sage/middleware/components/sage_db/tests/__pycache__/test_python.cpython-311.opt-2.pyc +0 -0
  144. sage/middleware/components/sage_db/tests/__pycache__/test_python.cpython-311.pyc +0 -0
  145. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.opt-2.pyc +0 -0
  146. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.pyc +0 -0
  147. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.opt-2.pyc +0 -0
  148. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.pyc +0 -0
  149. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.opt-2.pyc +0 -0
  150. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.pyc +0 -0
  151. sage/middleware/examples/api_usage_tutorial.py +3 -3
  152. sage/middleware/examples/dag_microservices_demo.py +7 -8
  153. sage/middleware/examples/microservices_integration_demo.py +8 -11
  154. sage/middleware/examples/microservices_registration_demo.py +8 -12
  155. sage/middleware/services/__init__.py +56 -0
  156. sage/middleware/services/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  157. sage/middleware/services/__pycache__/__init__.cpython-311.pyc +0 -0
  158. sage/middleware/services/graph/__init__.py +52 -4
  159. sage/middleware/services/graph/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  160. sage/middleware/services/graph/__pycache__/__init__.cpython-311.pyc +0 -0
  161. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.opt-2.pyc +0 -0
  162. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.pyc +0 -0
  163. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.opt-2.pyc +0 -0
  164. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.pyc +0 -0
  165. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.opt-2.pyc +0 -0
  166. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.pyc +0 -0
  167. sage/middleware/services/graph/examples/graph_demo.py +3 -2
  168. sage/middleware/services/graph/graph_service.py +68 -0
  169. sage/middleware/services/graph/search_engine/__init__.py +56 -0
  170. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  171. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  172. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  173. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  174. sage/middleware/services/kv/__init__.py +52 -4
  175. sage/middleware/services/kv/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  176. sage/middleware/services/kv/__pycache__/__init__.cpython-311.pyc +0 -0
  177. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.opt-2.pyc +0 -0
  178. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.pyc +0 -0
  179. sage/middleware/services/kv/examples/__pycache__/{kv_demo.cpython-313.opt-2.pyc → kv_demo.cpython-311.opt-2.pyc} +0 -0
  180. sage/middleware/services/kv/examples/__pycache__/{kv_demo.cpython-313.pyc → kv_demo.cpython-311.pyc} +0 -0
  181. sage/middleware/services/kv/examples/kv_demo.py +1 -1
  182. sage/middleware/services/kv/search_engine/__init__.py +56 -0
  183. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  184. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  185. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  186. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  187. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  188. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  189. sage/middleware/services/memory/__init__.py +52 -8
  190. sage/middleware/services/memory/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  191. sage/middleware/services/memory/__pycache__/__init__.cpython-311.pyc +0 -0
  192. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  193. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.pyc +0 -0
  194. sage/middleware/services/memory/examples/__pycache__/{memory_demo.cpython-313.opt-2.pyc → memory_demo.cpython-311.opt-2.pyc} +0 -0
  195. sage/middleware/services/memory/examples/__pycache__/{memory_demo.cpython-313.pyc → memory_demo.cpython-311.pyc} +0 -0
  196. sage/middleware/services/memory/examples/dag_microservices_demo.py +8 -9
  197. sage/middleware/services/memory/examples/memory_demo.py +4 -4
  198. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  199. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  200. sage/middleware/services/memory/memory_service.py +14 -11
  201. sage/middleware/services/memory/utils/__init__.py +56 -0
  202. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  203. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  204. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  205. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  206. sage/middleware/services/vdb/__init__.py +52 -4
  207. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  208. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.pyc +0 -0
  209. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.opt-2.pyc +0 -0
  210. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.pyc +0 -0
  211. sage/middleware/services/vdb/examples/__pycache__/{vdb_demo.cpython-313.opt-2.pyc → vdb_demo.cpython-311.opt-2.pyc} +0 -0
  212. sage/middleware/services/vdb/examples/__pycache__/{vdb_demo.cpython-313.pyc → vdb_demo.cpython-311.pyc} +0 -0
  213. sage/middleware/services/vdb/examples/vdb_demo.py +2 -2
  214. sage/middleware/services/vdb/search_engine/__init__.py +56 -0
  215. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  216. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  217. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  218. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  219. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  220. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.pyc +0 -0
  221. sage/middleware/services/vdb/vdb_service.py +44 -41
  222. sage/middleware/utils/__init__.py +53 -2
  223. sage/middleware/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  224. sage/middleware/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  225. sage/middleware/utils/embedding/__init__.py +52 -31
  226. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  227. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.pyc +0 -0
  228. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.opt-2.pyc +0 -0
  229. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.pyc +0 -0
  230. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.opt-2.pyc +0 -0
  231. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.pyc +0 -0
  232. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.opt-2.pyc +0 -0
  233. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.pyc +0 -0
  234. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.opt-2.pyc +0 -0
  235. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.pyc +0 -0
  236. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.opt-2.pyc +0 -0
  237. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.pyc +0 -0
  238. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.opt-2.pyc +0 -0
  239. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.pyc +0 -0
  240. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.opt-2.pyc +0 -0
  241. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.pyc +0 -0
  242. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.opt-2.pyc +0 -0
  243. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.pyc +0 -0
  244. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.opt-2.pyc +0 -0
  245. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.pyc +0 -0
  246. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.opt-2.pyc +0 -0
  247. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.pyc +0 -0
  248. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.opt-2.pyc +0 -0
  249. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.pyc +0 -0
  250. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.opt-2.pyc +0 -0
  251. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.pyc +0 -0
  252. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.opt-2.pyc +0 -0
  253. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.pyc +0 -0
  254. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.opt-2.pyc +0 -0
  255. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.pyc +0 -0
  256. isage_middleware-0.1.1.dist-info/METADATA +0 -424
  257. isage_middleware-0.1.1.dist-info/RECORD +0 -182
  258. sage/__init__.py +0 -2
  259. sage/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  260. sage/__pycache__/__init__.cpython-313.pyc +0 -0
  261. sage/middleware/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  262. sage/middleware/__pycache__/__init__.cpython-313.pyc +0 -0
  263. sage/middleware/api/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  264. sage/middleware/api/__pycache__/__init__.cpython-313.pyc +0 -0
  265. sage/middleware/api/__pycache__/graph_api.cpython-313.opt-2.pyc +0 -0
  266. sage/middleware/api/__pycache__/graph_api.cpython-313.pyc +0 -0
  267. sage/middleware/api/__pycache__/kv_api.cpython-313.opt-2.pyc +0 -0
  268. sage/middleware/api/__pycache__/kv_api.cpython-313.pyc +0 -0
  269. sage/middleware/api/__pycache__/memory_api.cpython-313.opt-2.pyc +0 -0
  270. sage/middleware/api/__pycache__/memory_api.cpython-313.pyc +0 -0
  271. sage/middleware/api/__pycache__/vdb_api.cpython-313.opt-2.pyc +0 -0
  272. sage/middleware/api/__pycache__/vdb_api.cpython-313.pyc +0 -0
  273. sage/middleware/enterprise/__init__.py +0 -75
  274. sage/middleware/enterprise/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  275. sage/middleware/enterprise/__pycache__/__init__.cpython-313.pyc +0 -0
  276. sage/middleware/enterprise/sage_db/__init__.py +0 -132
  277. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  278. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-313.pyc +0 -0
  279. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-313.opt-2.pyc +0 -0
  280. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-313.pyc +0 -0
  281. sage/middleware/enterprise/sage_db/python/__init__.py +0 -7
  282. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  283. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-313.pyc +0 -0
  284. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-313.opt-2.pyc +0 -0
  285. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-313.pyc +0 -0
  286. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-313.opt-2.pyc +0 -0
  287. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-313.pyc +0 -0
  288. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-313.opt-2.pyc +0 -0
  289. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-313.pyc +0 -0
  290. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-313.opt-2.pyc +0 -0
  291. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-313.pyc +0 -0
  292. sage/middleware/examples/__pycache__/microservices_demo.cpython-313.opt-2.pyc +0 -0
  293. sage/middleware/examples/__pycache__/microservices_demo.cpython-313.pyc +0 -0
  294. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-313.opt-2.pyc +0 -0
  295. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-313.pyc +0 -0
  296. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-313.opt-2.pyc +0 -0
  297. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-313.pyc +0 -0
  298. sage/middleware/services/graph/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  299. sage/middleware/services/graph/__pycache__/__init__.cpython-313.pyc +0 -0
  300. sage/middleware/services/graph/__pycache__/graph_index.cpython-313.opt-2.pyc +0 -0
  301. sage/middleware/services/graph/__pycache__/graph_index.cpython-313.pyc +0 -0
  302. sage/middleware/services/graph/__pycache__/graph_service.cpython-313.opt-2.pyc +0 -0
  303. sage/middleware/services/graph/__pycache__/graph_service.cpython-313.pyc +0 -0
  304. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-313.opt-2.pyc +0 -0
  305. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-313.pyc +0 -0
  306. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  307. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  308. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-313.opt-2.pyc +0 -0
  309. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-313.pyc +0 -0
  310. sage/middleware/services/kv/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  311. sage/middleware/services/kv/__pycache__/__init__.cpython-313.pyc +0 -0
  312. sage/middleware/services/kv/__pycache__/kv_service.cpython-313.opt-2.pyc +0 -0
  313. sage/middleware/services/kv/__pycache__/kv_service.cpython-313.pyc +0 -0
  314. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  315. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  316. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-313.opt-2.pyc +0 -0
  317. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-313.pyc +0 -0
  318. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-313.opt-2.pyc +0 -0
  319. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-313.pyc +0 -0
  320. sage/middleware/services/memory/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  321. sage/middleware/services/memory/__pycache__/__init__.cpython-313.pyc +0 -0
  322. sage/middleware/services/memory/__pycache__/memory_service.cpython-313.opt-2.pyc +0 -0
  323. sage/middleware/services/memory/__pycache__/memory_service.cpython-313.pyc +0 -0
  324. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-313.opt-2.pyc +0 -0
  325. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-313.pyc +0 -0
  326. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-313.opt-2.pyc +0 -0
  327. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-313.pyc +0 -0
  328. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  329. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-313.pyc +0 -0
  330. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-313.opt-2.pyc +0 -0
  331. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-313.pyc +0 -0
  332. sage/middleware/services/vdb/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  333. sage/middleware/services/vdb/__pycache__/__init__.cpython-313.pyc +0 -0
  334. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-313.opt-2.pyc +0 -0
  335. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-313.pyc +0 -0
  336. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  337. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  338. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-313.opt-2.pyc +0 -0
  339. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-313.pyc +0 -0
  340. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-313.opt-2.pyc +0 -0
  341. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-313.pyc +0 -0
  342. sage/middleware/utils/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  343. sage/middleware/utils/__pycache__/__init__.cpython-313.pyc +0 -0
  344. sage/middleware/utils/embedding/__pycache__/__init__.cpython-313.opt-2.pyc +0 -0
  345. sage/middleware/utils/embedding/__pycache__/__init__.cpython-313.pyc +0 -0
  346. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-313.opt-2.pyc +0 -0
  347. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-313.pyc +0 -0
  348. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-313.opt-2.pyc +0 -0
  349. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-313.pyc +0 -0
  350. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-313.opt-2.pyc +0 -0
  351. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-313.pyc +0 -0
  352. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-313.opt-2.pyc +0 -0
  353. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-313.pyc +0 -0
  354. sage/middleware/utils/embedding/__pycache__/hf.cpython-313.opt-2.pyc +0 -0
  355. sage/middleware/utils/embedding/__pycache__/hf.cpython-313.pyc +0 -0
  356. sage/middleware/utils/embedding/__pycache__/instructor.cpython-313.opt-2.pyc +0 -0
  357. sage/middleware/utils/embedding/__pycache__/instructor.cpython-313.pyc +0 -0
  358. sage/middleware/utils/embedding/__pycache__/jina.cpython-313.opt-2.pyc +0 -0
  359. sage/middleware/utils/embedding/__pycache__/jina.cpython-313.pyc +0 -0
  360. sage/middleware/utils/embedding/__pycache__/lollms.cpython-313.opt-2.pyc +0 -0
  361. sage/middleware/utils/embedding/__pycache__/lollms.cpython-313.pyc +0 -0
  362. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-313.opt-2.pyc +0 -0
  363. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-313.pyc +0 -0
  364. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-313.opt-2.pyc +0 -0
  365. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-313.pyc +0 -0
  366. sage/middleware/utils/embedding/__pycache__/ollama.cpython-313.opt-2.pyc +0 -0
  367. sage/middleware/utils/embedding/__pycache__/ollama.cpython-313.pyc +0 -0
  368. sage/middleware/utils/embedding/__pycache__/openai.cpython-313.opt-2.pyc +0 -0
  369. sage/middleware/utils/embedding/__pycache__/openai.cpython-313.pyc +0 -0
  370. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-313.opt-2.pyc +0 -0
  371. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-313.pyc +0 -0
  372. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-313.opt-2.pyc +0 -0
  373. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-313.pyc +0 -0
  374. {isage_middleware-0.1.1.dist-info → isage_middleware-0.1.3.1.dist-info}/WHEEL +0 -0
  375. {isage_middleware-0.1.1.dist-info → isage_middleware-0.1.3.1.dist-info}/top_level.txt +0 -0
  376. /sage/middleware/{enterprise → components}/sage_db/python/sage_db.py +0 -0
  377. /sage/middleware/{enterprise → components}/sage_db/tests/test_python.py +0 -0
@@ -0,0 +1,320 @@
1
+ # file sage/core/sage.middleware.services.neuromem./search_engine/kv_index/bm25s_index.py
2
+ # python -m sage.core.sage.middleware.services.neuromem..search_engine.kv_index.bm25s_index
3
+
4
+ import os
5
+ import bm25s
6
+ import shutil
7
+ import Stemmer
8
+ from typing import List, Optional, Dict, Any
9
+
10
+ from sage.middleware.components.neuromem.search_engine.kv_index.base_kv_index import BaseKVIndex
11
+
12
+
13
+ class BM25sIndex(BaseKVIndex):
14
+ def __init__(
15
+ self,
16
+ config: Optional[dict] = None,
17
+ ):
18
+ """
19
+ Initialize BM25sIndex.
20
+ 支持两种初始化方式:
21
+ 1. 直接通过声明来创建:传入 config,然后使用 build_index() 方法来构建索引
22
+ 2. 通过 BM25sIndex.load() 来加载:调用load方法
23
+
24
+ Initialize the BM25sIndex instance with two initialization methods:
25
+ 1. Direct creation: pass config, then use build_index() method to build the index
26
+ 2. Load from disk: use load method
27
+ """
28
+ self.config = config or {}
29
+
30
+ # 从config中获取必要参数,否则使用默认值
31
+ self.name = self.config.get("name", None)
32
+ if self.name is None:
33
+ raise ValueError("索引名称(name)未在config中指定")
34
+
35
+ # 初始化基本属性
36
+ self.ids: List[str] = []
37
+ self.texts: List[str] = []
38
+ self.tokens: List[List[str]] = []
39
+ self.tokenizer = None
40
+ self.bm25 = None
41
+
42
+ # BM25s 特定配置参数
43
+ self.backend = self.config.get("backend", "numba")
44
+ self.language = self.config.get("language", "auto") # auto, zh, en
45
+ self.custom_stopwords = self.config.get("custom_stopwords", None)
46
+
47
+ def _get_tokenizer(self, texts: List[str]):
48
+ """
49
+ 根据文本内容和配置选择合适的分词器(中文或英文)。
50
+ Select appropriate tokenizer (Chinese or English) according to the content of texts and config.
51
+ """
52
+ # 优先使用配置中指定的语言
53
+ if self.language == "zh":
54
+ zh_flag = True
55
+ elif self.language == "en":
56
+ zh_flag = False
57
+ else: # auto
58
+ zh_flag = self._is_chinese(texts[0]) if texts else False
59
+
60
+ if zh_flag:
61
+ return bm25s.tokenization.Tokenizer(
62
+ stopwords=self.custom_stopwords or 'zh'
63
+ )
64
+ else:
65
+ stemmer = Stemmer.Stemmer("english")
66
+ return bm25s.tokenization.Tokenizer(
67
+ stopwords=self.custom_stopwords or 'en',
68
+ stemmer=stemmer
69
+ )
70
+
71
+ def _build_index(self, texts: List[str], ids: List[str]):
72
+ """
73
+ 构建BM25索引
74
+ Build BM25 index
75
+ """
76
+ self.ids = list(ids)
77
+ self.texts = list(texts)
78
+ self.tokenizer = self._get_tokenizer(self.texts)
79
+ self.tokens = self.tokenizer.tokenize(self.texts) # type: ignore
80
+ self.bm25 = bm25s.BM25(corpus=self.texts, backend=self.backend)
81
+ self.bm25.index(self.tokens)
82
+
83
+ def build_index(self, texts: List[str], ids: List[str]):
84
+ """
85
+ 构建BM25索引的公共方法。
86
+ Public method to build BM25 index.
87
+ """
88
+ if len(texts) != len(ids):
89
+ raise ValueError("texts and ids must have the same length.")
90
+ self._build_index(texts, ids)
91
+
92
+ def _rebuild(self):
93
+ """
94
+ 重新构建分词器、分词结果和BM25索引。
95
+ Rebuild the tokenizer, tokens, and BM25 index.
96
+ """
97
+ if not self.texts:
98
+ return
99
+ self.tokenizer = self._get_tokenizer(self.texts)
100
+ self.tokens = self.tokenizer.tokenize(self.texts) # type: ignore
101
+ self.bm25 = bm25s.BM25(corpus=self.texts, backend=self.backend)
102
+ self.bm25.index(self.tokens)
103
+
104
+ def _is_chinese(self, text: str):
105
+ """
106
+ 判断字符串中是否包含中文字符。
107
+ Detect whether the text contains Chinese characters.
108
+ """
109
+ return any('\u4e00' <= ch <= '\u9fff' for ch in text)
110
+
111
+ def insert(self, text, doc_id):
112
+ """
113
+ 插入新的文本和id,并重建索引。
114
+ Insert a new text and doc_id, then rebuild the index.
115
+ """
116
+ self.texts.append(text)
117
+ self.ids.append(doc_id)
118
+ self._rebuild()
119
+
120
+ def delete(self, id: str) -> None:
121
+ """
122
+ 根据id删除对应的文本,并重建索引。
123
+ Delete the text corresponding to the given id, then rebuild the index.
124
+ """
125
+ if id not in self.ids:
126
+ return
127
+ idx = self.ids.index(id)
128
+ self.ids.pop(idx)
129
+ self.texts.pop(idx)
130
+ self._rebuild()
131
+
132
+ def update(self, id: str, new_text: str) -> None:
133
+ """
134
+ 更新指定id的文本内容,并重建索引。
135
+ Update the text of the given id, then rebuild the index.
136
+ """
137
+ if id not in self.ids:
138
+ return
139
+ idx = self.ids.index(id)
140
+ self.texts[idx] = new_text
141
+ self._rebuild()
142
+
143
+ def search(self, text: str, topk: int = 5) -> List[str]:
144
+ """
145
+ 对输入文本进行检索,返回最相关的topk个id。
146
+ Search for the most relevant texts and return the top-k ids.
147
+ """
148
+ if self.bm25 is None or len(self.ids) == 0:
149
+ return []
150
+ query_token = self.tokenizer.tokenize([text])[0] # type: ignore
151
+ scores = self.bm25.get_scores(query_token) # type: ignore
152
+ topk_idx = sorted(range(len(scores)), key=lambda i: -scores[i])[:topk]
153
+ return [self.ids[i] for i in topk_idx]
154
+
155
+
156
+ def store(self, dir_path: str) -> Dict[str, Any]:
157
+ """
158
+ 将索引信息存储到指定目录,包含bm25模型、分词器、ids和texts。
159
+ Store the index info into the specified directory, including bm25 model, tokenizer, ids, and texts.
160
+ """
161
+ os.makedirs(dir_path, exist_ok=True)
162
+
163
+ # 保存BM25模型
164
+ if self.bm25 is not None:
165
+ self.bm25.vocab_dict = {str(k): v for k, v in self.bm25.vocab_dict.items()} # type: ignore
166
+ self.bm25.save(dir_path, corpus=None)# type: ignore
167
+
168
+ # 保存分词器
169
+ if self.tokenizer is not None:
170
+ self.tokenizer.save_vocab(dir_path) # type: ignore
171
+ self.tokenizer.save_stopwords(dir_path) # type: ignore
172
+
173
+ # 保存配置信息
174
+ meta = {
175
+ "name": self.name,
176
+ "backend": self.backend,
177
+ "language": self.language,
178
+ "custom_stopwords": self.custom_stopwords,
179
+ "config": self.config
180
+ }
181
+ with open(os.path.join(dir_path, "meta.json"), "w", encoding="utf-8") as f:
182
+ import json
183
+ json.dump(meta, f, ensure_ascii=False, indent=2)
184
+
185
+ # 保存ids和texts
186
+ with open(os.path.join(dir_path, "ids.txt"), "w", encoding="utf-8") as f:
187
+ for i in self.ids:
188
+ f.write(i + "\n")
189
+ with open(os.path.join(dir_path, "texts.txt"), "w", encoding="utf-8") as f:
190
+ for t in self.texts:
191
+ f.write(t.replace("\n", " ") + "\n")
192
+ return {"index_path": dir_path}
193
+
194
+ def _load_data(self, dir_path: str):
195
+ """
196
+ 从目录加载索引及相关内容,包括bm25模型、分词器、ids和texts。
197
+ Load index and related data from directory, including bm25 model, tokenizer, ids, and texts.
198
+ """
199
+ # 加载配置信息
200
+ meta_path = os.path.join(dir_path, "meta.json")
201
+ if os.path.exists(meta_path):
202
+ import json
203
+ with open(meta_path, "r", encoding="utf-8") as f:
204
+ meta = json.load(f)
205
+ self.config = meta.get("config", {})
206
+ self.backend = meta.get("backend", "numba")
207
+ self.language = meta.get("language", "auto")
208
+ self.custom_stopwords = meta.get("custom_stopwords", None)
209
+
210
+ # 加载BM25模型
211
+ self.bm25 = bm25s.BM25.load(dir_path)
212
+
213
+ # 加载分词器
214
+ self.tokenizer = bm25s.tokenization.Tokenizer()
215
+ self.tokenizer.load_vocab(dir_path)
216
+ self.tokenizer.load_stopwords(dir_path)
217
+
218
+ # 加载ids和texts
219
+ with open(os.path.join(dir_path, "ids.txt"), "r", encoding="utf-8") as f:
220
+ self.ids = [line.strip() for line in f.readlines()]
221
+ with open(os.path.join(dir_path, "texts.txt"), "r", encoding="utf-8") as f:
222
+ self.texts = [line.strip() for line in f.readlines()]
223
+
224
+ # 重建tokens
225
+ self.tokens = [self.tokenizer.tokenize([t], return_as="tuple")[0][0] for t in self.texts] # type: ignore
226
+ self.bm25.index(self.tokens)
227
+
228
+ @classmethod
229
+ def load(cls, name: str, dir_path: str) -> "BM25sIndex":
230
+ """
231
+ 通过名称和根路径加载一个BM25sIndex实例。
232
+ Load a BM25sIndex instance by name and root path.
233
+ """
234
+ # 创建一个空的实例,然后加载数据
235
+ config = {"name": name}
236
+ instance = cls(config=config)
237
+ instance._load_data(dir_path)
238
+ return instance
239
+
240
+ @staticmethod
241
+ def clear(dir_path: str):
242
+ """
243
+ 删除指定名称下的所有索引数据。
244
+ Remove all index data under the specified name.
245
+ """
246
+ try:
247
+ shutil.rmtree(dir_path)
248
+ print(f"Cleared: {dir_path}")
249
+ except FileNotFoundError:
250
+ print(f"Directory does not exist, nothing to clear: {dir_path}")
251
+ except Exception as e:
252
+ print(f"Failed to clear: {e}")
253
+
254
+
255
+ if __name__ == "__main__":
256
+ # 简单数据
257
+ ids = ["a", "b", "c"]
258
+ texts = [
259
+ "The quick brown fox jumps over the lazy dog.",
260
+ "Hello world! This is a operator_test document.",
261
+ "Python is a great programming language."
262
+ ]
263
+ root_path = "./tmp_bm25_test" # 用临时目录避免误删业务数据
264
+ index_dir = root_path
265
+ index_name = "demo"
266
+
267
+ # 1. 初始化索引 - 使用新的config方式
268
+ print("\n== 初始化并首检 ==")
269
+ config = {
270
+ "name": index_name,
271
+ "backend": "numba",
272
+ "language": "auto", # 可以指定 "zh", "en" 或 "auto"
273
+ "custom_stopwords": None
274
+ }
275
+ index = BM25sIndex(config=config)
276
+ index.build_index(texts, ids)
277
+ print("初始检索 'Python':", index.search("Python"))
278
+ print("初始检索 'hello':", index.search("hello"))
279
+ print("初始检索 'fox':", index.search("fox"))
280
+
281
+ # 2. 插入新文档后检索
282
+ print("\n== 插入新文档 ==")
283
+ index.insert("This document mentions python and fox together.", "d")
284
+ print("插入后检索 'python':", index.search("python"))
285
+ print("插入后检索 'fox':", index.search("fox"))
286
+
287
+ # 3. 删除文档后检索
288
+ print("\n== 删除文档 ==")
289
+ index.delete("b")
290
+ print("删除 'b' 后检索 'hello':", index.search("hello"))
291
+ print("删除 'b' 后检索 'operator_test':", index.search("operator_test"))
292
+ print("删除 'b' 后检索 'python':", index.search("python"))
293
+
294
+ # 4. 更新文档后检索
295
+ print("\n== 更新文档 ==")
296
+ index.update("c", "Hello world! Now c document talks about foxes.")
297
+ print("更新 'c' 后检索 'fox':", index.search("fox"))
298
+ print("更新 'c' 后检索 'python':", index.search("python"))
299
+
300
+ # 5. 保存索引
301
+ print("\n== 保存索引到磁盘 ==")
302
+ store_info = index.store(index_dir)
303
+ print("索引保存路径:", store_info["index_path"])
304
+
305
+ # 6. 等待用户输入 'yes' 后加载索引并检索
306
+ print("\n== 测试持久化(请手动输入 yes 继续)==")
307
+ user_input = input("输入 'yes' 以继续测试 load 并检索:")
308
+ if user_input.strip().lower() == "yes":
309
+ index_loaded = BM25sIndex.load(name=index_name, dir_path=index_dir)
310
+ print("持久化load后检索 'fox':", index_loaded.search("fox"))
311
+ print("持久化load后检索 'python':", index_loaded.search("python"))
312
+ print("持久化load后检索 'hello':", index_loaded.search("hello"))
313
+ print("ids序列:", index_loaded.ids)
314
+ else:
315
+ print("用户未输入 'yes',测试提前结束。")
316
+
317
+ # 7. 清理测试目录
318
+ print("\n== 清理测试目录 ==")
319
+ BM25sIndex.clear(index_dir)
320
+
@@ -0,0 +1,56 @@
1
+ """
2
+ SAGE - Streaming-Augmented Generative Execution
3
+ """
4
+
5
+ # 动态版本加载
6
+ def _load_version():
7
+ """从 sage-common 包加载版本信息"""
8
+ try:
9
+ # 优先从 sage-common 包加载版本
10
+ from sage.common._version import __version__
11
+ return {
12
+ 'version': __version__,
13
+ 'author': 'SAGE Team',
14
+ 'email': 'shuhao_zhang@hust.edu.cn'
15
+ }
16
+ except ImportError:
17
+ # 如果 sage-common 不可用,从项目根目录加载(开发环境)
18
+ try:
19
+ from pathlib import Path
20
+ current_file = Path(__file__).resolve()
21
+ # 根据当前文件位置计算到项目根目录的层数
22
+ parts = current_file.parts
23
+ sage_index = -1
24
+ for i, part in enumerate(parts):
25
+ if part == 'SAGE':
26
+ sage_index = i
27
+ break
28
+
29
+ if sage_index >= 0:
30
+ root_dir = Path(*parts[:sage_index+1])
31
+ version_file = root_dir / "_version.py"
32
+
33
+ if version_file.exists():
34
+ version_globals = {}
35
+ with open(version_file, 'r', encoding='utf-8') as f:
36
+ exec(f.read(), version_globals)
37
+ return {
38
+ 'version': version_globals.get('__version__', '0.1.3'),
39
+ 'author': version_globals.get('__author__', 'SAGE Team'),
40
+ 'email': version_globals.get('__email__', 'shuhao_zhang@hust.edu.cn')
41
+ }
42
+ except Exception:
43
+ pass
44
+
45
+ # 最后的默认值
46
+ return {
47
+ 'version': '0.1.3',
48
+ 'author': 'SAGE Team',
49
+ 'email': 'shuhao_zhang@hust.edu.cn'
50
+ }
51
+
52
+ # 加载信息
53
+ _info = _load_version()
54
+ __version__ = _info['version']
55
+ __author__ = _info['author']
56
+ __email__ = _info['email']
@@ -0,0 +1,53 @@
1
+ # file sage/core/sage.middleware.services.neuromem./search_engine/vdb_index/base_vdb_index.py
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import List, Tuple, Dict, Any
5
+ import numpy as np
6
+
7
+ class BaseVDBIndex(ABC):
8
+ def __init__(self):
9
+ """
10
+ """
11
+
12
+ @abstractmethod
13
+ def insert(self, vector: np.ndarray, string_id: str) -> None:
14
+ """插入单个向量"""
15
+ pass
16
+
17
+ @abstractmethod
18
+ def batch_insert(self, vectors: List[np.ndarray], string_ids: List[str]) -> None:
19
+ """批量插入向量"""
20
+ pass
21
+
22
+ @abstractmethod
23
+ def delete(self, string_id: str) -> None:
24
+ """删除一个向量(物理或逻辑)"""
25
+ pass
26
+
27
+ @abstractmethod
28
+ def update(self, string_id: str, new_vector: np.ndarray) -> None:
29
+ """更新向量内容"""
30
+ pass
31
+
32
+ @abstractmethod
33
+ def search(self, query_vector: np.ndarray, topk: int = 10) -> Tuple[List[str], List[float]]:
34
+ """向量检索,返回 (string_id, 距离) 列表"""
35
+ pass
36
+
37
+ @classmethod
38
+ @abstractmethod
39
+ def load(cls, name: str, root_path: str) -> "BaseVDBIndex":
40
+ """
41
+ 加载索引实例。
42
+ Load the index instance.
43
+ """
44
+ pass
45
+
46
+ @abstractmethod
47
+ def store(self, root_path: str) -> Dict[str, Any]:
48
+ """
49
+ 存储索引数据到指定目录。
50
+ Store the index data to the specified directory.
51
+ """
52
+ pass
53
+