isage-middleware 0.1.3.1__py3-none-any.whl → 0.2.0.0__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 (464) hide show
  1. isage_middleware-0.2.0.0.dist-info/METADATA +258 -0
  2. isage_middleware-0.2.0.0.dist-info/RECORD +186 -0
  3. sage/middleware/__init__.py +56 -53
  4. sage/middleware/__init__.pyc +0 -0
  5. sage/middleware/__pycache__/__init__.cpython-311.pyc +0 -0
  6. sage/middleware/__pycache__/_version.cpython-311.pyc +0 -0
  7. sage/middleware/_version.py +4 -36
  8. sage/middleware/_version.pyc +0 -0
  9. sage/middleware/components/__init__.py +26 -0
  10. sage/middleware/components/__init__.pyc +0 -0
  11. sage/middleware/components/__pycache__/__init__.cpython-311.pyc +0 -0
  12. sage/middleware/components/__pycache__/extensions_compat.cpython-311.pyc +0 -0
  13. sage/middleware/components/extensions_compat.pyc +0 -0
  14. sage/middleware/components/sage_db/__init__.py +114 -54
  15. sage/middleware/components/sage_db/__init__.pyc +0 -0
  16. sage/middleware/components/sage_db/__pycache__/__init__.cpython-311.pyc +0 -0
  17. sage/middleware/components/sage_db/__pycache__/backend.cpython-311.pyc +0 -0
  18. sage/middleware/components/sage_db/backend.pyc +0 -0
  19. sage/middleware/components/sage_db/service.pyc +0 -0
  20. sage/middleware/components/sage_flow/__init__.py +76 -0
  21. sage/middleware/components/sage_flow/__init__.pyc +0 -0
  22. sage/middleware/components/sage_flow/__pycache__/__init__.cpython-311.pyc +0 -0
  23. sage/middleware/components/sage_flow/examples/basic_service.pyc +0 -0
  24. sage/middleware/components/sage_flow/python/__init__.py +14 -0
  25. sage/middleware/components/sage_flow/python/__init__.pyc +0 -0
  26. sage/middleware/components/sage_flow/python/__pycache__/__init__.cpython-311.pyc +0 -0
  27. sage/middleware/components/sage_flow/python/__pycache__/sage_flow.cpython-311.pyc +0 -0
  28. sage/middleware/components/sage_flow/python/micro_service/__init__.py +4 -0
  29. sage/middleware/components/sage_flow/python/micro_service/__init__.pyc +0 -0
  30. sage/middleware/components/sage_flow/python/micro_service/__pycache__/__init__.cpython-311.pyc +0 -0
  31. sage/middleware/components/sage_flow/python/micro_service/__pycache__/sage_flow_service.cpython-311.pyc +0 -0
  32. sage/middleware/components/sage_flow/python/micro_service/sage_flow_service.pyc +0 -0
  33. sage/middleware/components/sage_flow/python/sage_flow.pyc +0 -0
  34. sage/middleware/components/sage_flow/service.pyc +0 -0
  35. sage/middleware/components/sage_mem/__init__.py +83 -0
  36. sage/middleware/components/sage_mem/__init__.pyc +0 -0
  37. sage/middleware/components/sage_mem/__pycache__/__init__.cpython-311.pyc +0 -0
  38. sage/middleware/components/sage_refiner/__init__.py +103 -0
  39. sage/middleware/components/sage_refiner/__init__.pyc +0 -0
  40. sage/middleware/components/sage_refiner/__pycache__/__init__.cpython-311.pyc +0 -0
  41. sage/middleware/components/sage_refiner/examples/basic_usage.pyc +0 -0
  42. sage/middleware/components/sage_refiner/examples/context_service_demo.pyc +0 -0
  43. sage/middleware/components/sage_refiner/examples/rag_integration.pyc +0 -0
  44. sage/middleware/components/sage_refiner/python/__init__.py +38 -0
  45. sage/middleware/components/sage_refiner/python/__init__.pyc +0 -0
  46. sage/middleware/components/sage_refiner/python/__pycache__/__init__.cpython-311.pyc +0 -0
  47. sage/middleware/components/sage_refiner/python/__pycache__/context_service.cpython-311.pyc +0 -0
  48. sage/middleware/components/sage_refiner/python/__pycache__/service.cpython-311.pyc +0 -0
  49. sage/middleware/components/sage_refiner/python/adapter.pyc +0 -0
  50. sage/middleware/components/sage_refiner/python/context_service.pyc +0 -0
  51. sage/middleware/components/sage_refiner/python/service.pyc +0 -0
  52. sage/middleware/components/sage_tsdb/__init__.py +81 -0
  53. sage/middleware/components/sage_tsdb/__init__.pyc +0 -0
  54. sage/middleware/components/sage_tsdb/__pycache__/__init__.cpython-311.pyc +0 -0
  55. sage/middleware/components/sage_tsdb/examples/basic_usage.pyc +0 -0
  56. sage/middleware/components/sage_tsdb/examples/service_demo.pyc +0 -0
  57. sage/middleware/components/sage_tsdb/examples/stream_join_demo.pyc +0 -0
  58. sage/middleware/components/sage_tsdb/python/__init__.py +21 -0
  59. sage/middleware/components/sage_tsdb/python/__init__.pyc +0 -0
  60. sage/middleware/components/sage_tsdb/python/__pycache__/__init__.cpython-311.pyc +0 -0
  61. sage/middleware/components/sage_tsdb/python/__pycache__/sage_tsdb.cpython-311.pyc +0 -0
  62. sage/middleware/components/sage_tsdb/python/_sage_tsdb.cpython-311-x86_64-linux-gnu.so +0 -0
  63. sage/middleware/components/sage_tsdb/python/_sage_tsdb.pyi +17 -0
  64. sage/middleware/components/sage_tsdb/python/algorithms/__init__.py +17 -0
  65. sage/middleware/components/sage_tsdb/python/algorithms/__init__.pyc +0 -0
  66. sage/middleware/components/sage_tsdb/python/algorithms/__pycache__/__init__.cpython-311.pyc +0 -0
  67. sage/middleware/components/sage_tsdb/python/algorithms/__pycache__/base.cpython-311.pyc +0 -0
  68. sage/middleware/components/sage_tsdb/python/algorithms/__pycache__/out_of_order_join.cpython-311.pyc +0 -0
  69. sage/middleware/components/sage_tsdb/python/algorithms/__pycache__/window_aggregator.cpython-311.pyc +0 -0
  70. sage/middleware/components/sage_tsdb/python/algorithms/base.pyc +0 -0
  71. sage/middleware/components/sage_tsdb/python/algorithms/out_of_order_join.pyc +0 -0
  72. sage/middleware/components/sage_tsdb/python/algorithms/window_aggregator.pyc +0 -0
  73. sage/middleware/components/sage_tsdb/python/libsage_tsdb_algorithms.so +0 -0
  74. sage/middleware/components/sage_tsdb/python/libsage_tsdb_core.so +0 -0
  75. sage/middleware/components/sage_tsdb/python/micro_service/__init__.py +7 -0
  76. sage/middleware/components/sage_tsdb/python/micro_service/__init__.pyc +0 -0
  77. sage/middleware/components/sage_tsdb/python/micro_service/__pycache__/__init__.cpython-311.pyc +0 -0
  78. sage/middleware/components/sage_tsdb/python/micro_service/__pycache__/sage_tsdb_service.cpython-311.pyc +0 -0
  79. sage/middleware/components/sage_tsdb/python/micro_service/sage_tsdb_service.pyc +0 -0
  80. sage/middleware/components/sage_tsdb/python/sage_tsdb.pyc +0 -0
  81. sage/middleware/components/sage_tsdb/service.pyc +0 -0
  82. sage/middleware/operators/__init__.py +32 -0
  83. sage/middleware/operators/__init__.pyc +0 -0
  84. sage/middleware/operators/__pycache__/__init__.cpython-311.pyc +0 -0
  85. sage/middleware/operators/agent/__init__.py +9 -0
  86. sage/middleware/operators/agent/__init__.pyc +0 -0
  87. sage/middleware/operators/agent/__pycache__/__init__.cpython-311.pyc +0 -0
  88. sage/middleware/operators/agent/__pycache__/runtime.cpython-311.pyc +0 -0
  89. sage/middleware/operators/agent/planning/__init__.py +5 -0
  90. sage/middleware/operators/agent/planning/__init__.pyc +0 -0
  91. sage/middleware/operators/agent/planning/__pycache__/__init__.cpython-311.pyc +0 -0
  92. sage/middleware/operators/agent/planning/__pycache__/llm_adapter.cpython-311.pyc +0 -0
  93. sage/middleware/operators/agent/planning/__pycache__/planner_adapter.cpython-311.pyc +0 -0
  94. sage/middleware/operators/agent/planning/__pycache__/router.cpython-311.pyc +0 -0
  95. sage/middleware/operators/agent/planning/llm_adapter.pyc +0 -0
  96. sage/middleware/operators/agent/planning/planner_adapter.pyc +0 -0
  97. sage/middleware/operators/agent/planning/router.pyc +0 -0
  98. sage/middleware/operators/agent/runtime.pyc +0 -0
  99. sage/middleware/operators/agentic/__init__.py +20 -0
  100. sage/middleware/operators/agentic/__init__.pyc +0 -0
  101. sage/middleware/operators/agentic/__pycache__/__init__.cpython-311.pyc +0 -0
  102. sage/middleware/operators/agentic/__pycache__/planning_operator.cpython-311.pyc +0 -0
  103. sage/middleware/operators/agentic/__pycache__/refined_searcher.cpython-311.pyc +0 -0
  104. sage/middleware/operators/agentic/__pycache__/runtime.cpython-311.pyc +0 -0
  105. sage/middleware/operators/agentic/__pycache__/timing_operator.cpython-311.pyc +0 -0
  106. sage/middleware/operators/agentic/__pycache__/tool_selection_operator.cpython-311.pyc +0 -0
  107. sage/middleware/operators/agentic/planning_operator.pyc +0 -0
  108. sage/middleware/operators/agentic/refined_searcher.pyc +0 -0
  109. sage/middleware/operators/agentic/runtime.pyc +0 -0
  110. sage/middleware/operators/agentic/timing_operator.pyc +0 -0
  111. sage/middleware/operators/agentic/tool_selection_operator.pyc +0 -0
  112. sage/middleware/operators/context/__init__.py +17 -0
  113. sage/middleware/operators/context/__init__.pyc +0 -0
  114. sage/middleware/operators/context/__pycache__/__init__.cpython-311.pyc +0 -0
  115. sage/middleware/operators/context/__pycache__/critic_evaluation.cpython-311.pyc +0 -0
  116. sage/middleware/operators/context/__pycache__/model_context.cpython-311.pyc +0 -0
  117. sage/middleware/operators/context/__pycache__/quality_label.cpython-311.pyc +0 -0
  118. sage/middleware/operators/context/__pycache__/search_query_results.cpython-311.pyc +0 -0
  119. sage/middleware/operators/context/__pycache__/search_result.cpython-311.pyc +0 -0
  120. sage/middleware/operators/context/__pycache__/search_session.cpython-311.pyc +0 -0
  121. sage/middleware/operators/context/critic_evaluation.pyc +0 -0
  122. sage/middleware/operators/context/model_context.pyc +0 -0
  123. sage/middleware/operators/context/quality_label.pyc +0 -0
  124. sage/middleware/operators/context/search_query_results.pyc +0 -0
  125. sage/middleware/operators/context/search_result.pyc +0 -0
  126. sage/middleware/operators/context/search_session.pyc +0 -0
  127. sage/middleware/operators/filters/__init__.py +26 -0
  128. sage/middleware/operators/filters/__init__.pyc +0 -0
  129. sage/middleware/operators/filters/__pycache__/__init__.cpython-311.pyc +0 -0
  130. sage/middleware/operators/filters/__pycache__/context_sink.cpython-311.pyc +0 -0
  131. sage/middleware/operators/filters/__pycache__/context_source.cpython-311.pyc +0 -0
  132. sage/middleware/operators/filters/__pycache__/evaluate_filter.cpython-311.pyc +0 -0
  133. sage/middleware/operators/filters/__pycache__/tool_filter.cpython-311.pyc +0 -0
  134. sage/middleware/operators/filters/context_sink.pyc +0 -0
  135. sage/middleware/operators/filters/context_source.pyc +0 -0
  136. sage/middleware/operators/filters/evaluate_filter.pyc +0 -0
  137. sage/middleware/operators/filters/tool_filter.pyc +0 -0
  138. sage/middleware/operators/llm/__init__.py +9 -0
  139. sage/middleware/operators/llm/__init__.pyc +0 -0
  140. sage/middleware/operators/llm/__pycache__/__init__.cpython-311.pyc +0 -0
  141. sage/middleware/operators/llm/__pycache__/vllm_generator.cpython-311.pyc +0 -0
  142. sage/middleware/operators/llm/vllm_generator.pyc +0 -0
  143. sage/middleware/operators/rag/__init__.py +146 -0
  144. sage/middleware/operators/rag/__init__.pyc +0 -0
  145. sage/middleware/operators/rag/__pycache__/__init__.cpython-311.pyc +0 -0
  146. sage/middleware/operators/rag/__pycache__/generator.cpython-311.pyc +0 -0
  147. sage/middleware/operators/rag/arxiv.pyc +0 -0
  148. sage/middleware/operators/rag/chunk.pyc +0 -0
  149. sage/middleware/operators/rag/document_loaders.pyc +0 -0
  150. sage/middleware/operators/rag/evaluate.pyc +0 -0
  151. sage/middleware/operators/rag/generator.pyc +0 -0
  152. sage/middleware/operators/rag/index_builder/__init__.py +48 -0
  153. sage/middleware/operators/rag/index_builder/__init__.pyc +0 -0
  154. sage/middleware/operators/rag/index_builder/builder.pyc +0 -0
  155. sage/middleware/operators/rag/index_builder/manifest.pyc +0 -0
  156. sage/middleware/operators/rag/index_builder/storage.pyc +0 -0
  157. sage/middleware/operators/rag/pipeline.pyc +0 -0
  158. sage/middleware/operators/rag/profiler.pyc +0 -0
  159. sage/middleware/operators/rag/promptor.pyc +0 -0
  160. sage/middleware/operators/rag/refiner.pyc +0 -0
  161. sage/middleware/operators/rag/reranker.pyc +0 -0
  162. sage/middleware/operators/rag/retriever.pyc +0 -0
  163. sage/middleware/operators/rag/searcher.pyc +0 -0
  164. sage/middleware/operators/rag/types.pyc +0 -0
  165. sage/middleware/operators/rag/writer.pyc +0 -0
  166. sage/middleware/operators/tools/__init__.py +28 -0
  167. sage/middleware/operators/tools/__init__.pyc +0 -0
  168. sage/middleware/operators/tools/__pycache__/__init__.cpython-311.pyc +0 -0
  169. sage/middleware/operators/tools/__pycache__/arxiv_paper_searcher.cpython-311.pyc +0 -0
  170. sage/middleware/operators/tools/__pycache__/arxiv_searcher.cpython-311.pyc +0 -0
  171. sage/middleware/operators/tools/__pycache__/image_captioner.cpython-311.pyc +0 -0
  172. sage/middleware/operators/tools/__pycache__/nature_news_fetcher.cpython-311.pyc +0 -0
  173. sage/middleware/operators/tools/__pycache__/searcher_tool.cpython-311.pyc +0 -0
  174. sage/middleware/operators/tools/__pycache__/text_detector.cpython-311.pyc +0 -0
  175. sage/middleware/operators/tools/__pycache__/url_text_extractor.cpython-311.pyc +0 -0
  176. sage/middleware/operators/tools/arxiv_paper_searcher.pyc +0 -0
  177. sage/middleware/operators/tools/arxiv_searcher.pyc +0 -0
  178. sage/middleware/operators/tools/duckduckgo_searcher.pyc +0 -0
  179. sage/middleware/operators/tools/image_captioner.pyc +0 -0
  180. sage/middleware/operators/tools/nature_news_fetcher.pyc +0 -0
  181. sage/middleware/operators/tools/searcher_tool.pyc +0 -0
  182. sage/middleware/operators/tools/text_detector.pyc +0 -0
  183. sage/middleware/operators/tools/url_text_extractor.pyc +0 -0
  184. isage_middleware-0.1.3.1.dist-info/METADATA +0 -115
  185. isage_middleware-0.1.3.1.dist-info/RECORD +0 -288
  186. sage/middleware/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  187. sage/middleware/__pycache__/_version.cpython-311.opt-2.pyc +0 -0
  188. sage/middleware/api/__init__.py +0 -56
  189. sage/middleware/api/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  190. sage/middleware/api/__pycache__/__init__.cpython-311.pyc +0 -0
  191. sage/middleware/api/__pycache__/graph_api.cpython-311.opt-2.pyc +0 -0
  192. sage/middleware/api/__pycache__/graph_api.cpython-311.pyc +0 -0
  193. sage/middleware/api/__pycache__/kv_api.cpython-311.opt-2.pyc +0 -0
  194. sage/middleware/api/__pycache__/kv_api.cpython-311.pyc +0 -0
  195. sage/middleware/api/__pycache__/memory_api.cpython-311.opt-2.pyc +0 -0
  196. sage/middleware/api/__pycache__/memory_api.cpython-311.pyc +0 -0
  197. sage/middleware/api/__pycache__/vdb_api.cpython-311.opt-2.pyc +0 -0
  198. sage/middleware/api/__pycache__/vdb_api.cpython-311.pyc +0 -0
  199. sage/middleware/api/graph_api.py +0 -74
  200. sage/middleware/api/kv_api.py +0 -45
  201. sage/middleware/api/memory_api.py +0 -64
  202. sage/middleware/api/vdb_api.py +0 -60
  203. sage/middleware/components/enterprise/__init__.py +0 -56
  204. sage/middleware/components/enterprise/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  205. sage/middleware/components/enterprise/__pycache__/__init__.cpython-311.pyc +0 -0
  206. sage/middleware/components/neuromem/__init__.py +0 -56
  207. sage/middleware/components/neuromem/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  208. sage/middleware/components/neuromem/__pycache__/__init__.cpython-311.pyc +0 -0
  209. sage/middleware/components/neuromem/__pycache__/memory_manager.cpython-311.opt-2.pyc +0 -0
  210. sage/middleware/components/neuromem/__pycache__/memory_manager.cpython-311.pyc +0 -0
  211. sage/middleware/components/neuromem/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  212. sage/middleware/components/neuromem/__pycache__/memory_service.cpython-311.pyc +0 -0
  213. sage/middleware/components/neuromem/memory_collection/__init__.py +0 -56
  214. sage/middleware/components/neuromem/memory_collection/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  215. sage/middleware/components/neuromem/memory_collection/__pycache__/__init__.cpython-311.pyc +0 -0
  216. sage/middleware/components/neuromem/memory_collection/__pycache__/base_collection.cpython-311.opt-2.pyc +0 -0
  217. sage/middleware/components/neuromem/memory_collection/__pycache__/base_collection.cpython-311.pyc +0 -0
  218. sage/middleware/components/neuromem/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  219. sage/middleware/components/neuromem/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  220. sage/middleware/components/neuromem/memory_collection/__pycache__/kv_collection.cpython-311.opt-2.pyc +0 -0
  221. sage/middleware/components/neuromem/memory_collection/__pycache__/kv_collection.cpython-311.pyc +0 -0
  222. sage/middleware/components/neuromem/memory_collection/__pycache__/vdb_collection.cpython-311.opt-2.pyc +0 -0
  223. sage/middleware/components/neuromem/memory_collection/__pycache__/vdb_collection.cpython-311.pyc +0 -0
  224. sage/middleware/components/neuromem/memory_collection/base_collection.py +0 -167
  225. sage/middleware/components/neuromem/memory_collection/graph_collection.py +0 -11
  226. sage/middleware/components/neuromem/memory_collection/kv_collection.py +0 -709
  227. sage/middleware/components/neuromem/memory_collection/vdb_collection.py +0 -922
  228. sage/middleware/components/neuromem/memory_manager.py +0 -401
  229. sage/middleware/components/neuromem/memory_service.py +0 -324
  230. sage/middleware/components/neuromem/micro_service/__init__.py +0 -56
  231. sage/middleware/components/neuromem/micro_service/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  232. sage/middleware/components/neuromem/micro_service/__pycache__/__init__.cpython-311.pyc +0 -0
  233. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb.cpython-311.opt-2.pyc +0 -0
  234. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb.cpython-311.pyc +0 -0
  235. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb_service.cpython-311.opt-2.pyc +0 -0
  236. sage/middleware/components/neuromem/micro_service/__pycache__/neuromem_vdb_service.cpython-311.pyc +0 -0
  237. sage/middleware/components/neuromem/micro_service/neuromem_vdb.py +0 -198
  238. sage/middleware/components/neuromem/micro_service/neuromem_vdb_service.py +0 -118
  239. sage/middleware/components/neuromem/search_engine/__init__.py +0 -56
  240. sage/middleware/components/neuromem/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  241. sage/middleware/components/neuromem/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  242. sage/middleware/components/neuromem/search_engine/graph_index/__init__.py +0 -56
  243. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  244. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/__init__.cpython-311.pyc +0 -0
  245. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  246. sage/middleware/components/neuromem/search_engine/graph_index/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  247. sage/middleware/components/neuromem/search_engine/graph_index/base_graph_index.py +0 -40
  248. sage/middleware/components/neuromem/search_engine/hybird_index/__init__.py +0 -56
  249. sage/middleware/components/neuromem/search_engine/hybird_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  250. sage/middleware/components/neuromem/search_engine/hybird_index/__pycache__/__init__.cpython-311.pyc +0 -0
  251. sage/middleware/components/neuromem/search_engine/kv_index/__init__.py +0 -56
  252. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  253. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/__init__.cpython-311.pyc +0 -0
  254. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  255. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  256. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  257. sage/middleware/components/neuromem/search_engine/kv_index/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  258. sage/middleware/components/neuromem/search_engine/kv_index/base_kv_index.py +0 -76
  259. sage/middleware/components/neuromem/search_engine/kv_index/bm25s_index.py +0 -320
  260. sage/middleware/components/neuromem/search_engine/vdb_index/__init__.py +0 -56
  261. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  262. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/__init__.cpython-311.pyc +0 -0
  263. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  264. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  265. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  266. sage/middleware/components/neuromem/search_engine/vdb_index/__pycache__/faiss_index.cpython-311.pyc +0 -0
  267. sage/middleware/components/neuromem/search_engine/vdb_index/base_vdb_index.py +0 -53
  268. sage/middleware/components/neuromem/search_engine/vdb_index/faiss_index.py +0 -700
  269. sage/middleware/components/neuromem/storage_engine/__init__.py +0 -56
  270. sage/middleware/components/neuromem/storage_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  271. sage/middleware/components/neuromem/storage_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  272. sage/middleware/components/neuromem/storage_engine/__pycache__/metadata_storage.cpython-311.opt-2.pyc +0 -0
  273. sage/middleware/components/neuromem/storage_engine/__pycache__/metadata_storage.cpython-311.pyc +0 -0
  274. sage/middleware/components/neuromem/storage_engine/__pycache__/text_storage.cpython-311.opt-2.pyc +0 -0
  275. sage/middleware/components/neuromem/storage_engine/__pycache__/text_storage.cpython-311.pyc +0 -0
  276. sage/middleware/components/neuromem/storage_engine/__pycache__/vector_storage.cpython-311.opt-2.pyc +0 -0
  277. sage/middleware/components/neuromem/storage_engine/__pycache__/vector_storage.cpython-311.pyc +0 -0
  278. sage/middleware/components/neuromem/storage_engine/kv_backend/__init__.py +0 -56
  279. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  280. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/__init__.cpython-311.pyc +0 -0
  281. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/base_kv_backend.cpython-311.opt-2.pyc +0 -0
  282. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/base_kv_backend.cpython-311.pyc +0 -0
  283. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/dict_kv_backend.cpython-311.opt-2.pyc +0 -0
  284. sage/middleware/components/neuromem/storage_engine/kv_backend/__pycache__/dict_kv_backend.cpython-311.pyc +0 -0
  285. sage/middleware/components/neuromem/storage_engine/kv_backend/base_kv_backend.py +0 -65
  286. sage/middleware/components/neuromem/storage_engine/kv_backend/dict_kv_backend.py +0 -54
  287. sage/middleware/components/neuromem/storage_engine/metadata_storage.py +0 -260
  288. sage/middleware/components/neuromem/storage_engine/text_storage.py +0 -106
  289. sage/middleware/components/neuromem/storage_engine/vector_storage.py +0 -85
  290. sage/middleware/components/neuromem/tests/__init__.py +0 -56
  291. sage/middleware/components/neuromem/tests/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  292. sage/middleware/components/neuromem/tests/__pycache__/__init__.cpython-311.pyc +0 -0
  293. sage/middleware/components/neuromem/tests/__pycache__/test_memory_service.cpython-311.opt-2.pyc +0 -0
  294. sage/middleware/components/neuromem/tests/__pycache__/test_memory_service.cpython-311.pyc +0 -0
  295. sage/middleware/components/neuromem/tests/core_test/__init__.py +0 -56
  296. sage/middleware/components/neuromem/tests/core_test/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  297. sage/middleware/components/neuromem/tests/core_test/__pycache__/__init__.cpython-311.pyc +0 -0
  298. sage/middleware/components/neuromem/tests/core_test/collection_test/__init__.py +0 -56
  299. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  300. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/__init__.cpython-311.pyc +0 -0
  301. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/kv_collection_test.cpython-311.opt-2.pyc +0 -0
  302. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/kv_collection_test.cpython-311.pyc +0 -0
  303. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/vdb_collection_test.cpython-311.opt-2.pyc +0 -0
  304. sage/middleware/components/neuromem/tests/core_test/collection_test/__pycache__/vdb_collection_test.cpython-311.pyc +0 -0
  305. sage/middleware/components/neuromem/tests/core_test/collection_test/kv_collection_test.py +0 -60
  306. sage/middleware/components/neuromem/tests/core_test/collection_test/vdb_collection_test.py +0 -88
  307. sage/middleware/components/neuromem/tests/core_test/manager_test.py +0 -154
  308. sage/middleware/components/neuromem/tests/test_memory_service.py +0 -293
  309. sage/middleware/components/neuromem/utils/__init__.py +0 -56
  310. sage/middleware/components/neuromem/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  311. sage/middleware/components/neuromem/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  312. sage/middleware/components/neuromem/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  313. sage/middleware/components/neuromem/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  314. sage/middleware/components/neuromem/utils/path_utils.py +0 -25
  315. sage/middleware/components/sage_db/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  316. sage/middleware/components/sage_db/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  317. sage/middleware/components/sage_db/__pycache__/sage_db.cpython-311.pyc +0 -0
  318. sage/middleware/components/sage_db/python/__init__.py +0 -56
  319. sage/middleware/components/sage_db/python/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  320. sage/middleware/components/sage_db/python/__pycache__/__init__.cpython-311.pyc +0 -0
  321. sage/middleware/components/sage_db/python/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  322. sage/middleware/components/sage_db/python/__pycache__/sage_db.cpython-311.pyc +0 -0
  323. sage/middleware/components/sage_db/python/sage_db.py +0 -44
  324. sage/middleware/components/sage_db/sage_db.py +0 -187
  325. sage/middleware/components/sage_db/tests/__pycache__/test_python.cpython-311.opt-2.pyc +0 -0
  326. sage/middleware/components/sage_db/tests/__pycache__/test_python.cpython-311.pyc +0 -0
  327. sage/middleware/components/sage_db/tests/test_python.py +0 -144
  328. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.opt-2.pyc +0 -0
  329. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.pyc +0 -0
  330. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.opt-2.pyc +0 -0
  331. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.pyc +0 -0
  332. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.opt-2.pyc +0 -0
  333. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.pyc +0 -0
  334. sage/middleware/examples/api_usage_tutorial.py +0 -339
  335. sage/middleware/examples/dag_microservices_demo.py +0 -219
  336. sage/middleware/examples/microservices_demo.py +0 -0
  337. sage/middleware/examples/microservices_integration_demo.py +0 -370
  338. sage/middleware/examples/microservices_registration_demo.py +0 -140
  339. sage/middleware/services/__init__.py +0 -56
  340. sage/middleware/services/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  341. sage/middleware/services/__pycache__/__init__.cpython-311.pyc +0 -0
  342. sage/middleware/services/graph/__init__.py +0 -56
  343. sage/middleware/services/graph/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  344. sage/middleware/services/graph/__pycache__/__init__.cpython-311.pyc +0 -0
  345. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.opt-2.pyc +0 -0
  346. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.pyc +0 -0
  347. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.opt-2.pyc +0 -0
  348. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.pyc +0 -0
  349. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.opt-2.pyc +0 -0
  350. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.pyc +0 -0
  351. sage/middleware/services/graph/examples/graph_demo.py +0 -178
  352. sage/middleware/services/graph/graph_index.py +0 -194
  353. sage/middleware/services/graph/graph_service.py +0 -609
  354. sage/middleware/services/graph/search_engine/__init__.py +0 -56
  355. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  356. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  357. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  358. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  359. sage/middleware/services/graph/search_engine/base_graph_index.py +0 -0
  360. sage/middleware/services/kv/__init__.py +0 -56
  361. sage/middleware/services/kv/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  362. sage/middleware/services/kv/__pycache__/__init__.cpython-311.pyc +0 -0
  363. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.opt-2.pyc +0 -0
  364. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.pyc +0 -0
  365. sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.opt-2.pyc +0 -0
  366. sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.pyc +0 -0
  367. sage/middleware/services/kv/examples/kv_demo.py +0 -213
  368. sage/middleware/services/kv/kv_service.py +0 -306
  369. sage/middleware/services/kv/search_engine/__init__.py +0 -56
  370. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  371. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  372. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  373. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  374. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  375. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  376. sage/middleware/services/kv/search_engine/base_kv_index.py +0 -75
  377. sage/middleware/services/kv/search_engine/bm25s_index.py +0 -238
  378. sage/middleware/services/memory/__init__.py +0 -56
  379. sage/middleware/services/memory/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  380. sage/middleware/services/memory/__pycache__/__init__.cpython-311.pyc +0 -0
  381. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  382. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.pyc +0 -0
  383. sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.opt-2.pyc +0 -0
  384. sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.pyc +0 -0
  385. sage/middleware/services/memory/examples/dag_microservices_demo.py +0 -219
  386. sage/middleware/services/memory/examples/memory_demo.py +0 -490
  387. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  388. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  389. sage/middleware/services/memory/memory_collection/graph_collection.py +0 -0
  390. sage/middleware/services/memory/memory_service.py +0 -477
  391. sage/middleware/services/memory/utils/__init__.py +0 -56
  392. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  393. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  394. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  395. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  396. sage/middleware/services/memory/utils/path_utils.py +0 -0
  397. sage/middleware/services/vdb/__init__.py +0 -56
  398. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  399. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.pyc +0 -0
  400. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.opt-2.pyc +0 -0
  401. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.pyc +0 -0
  402. sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.opt-2.pyc +0 -0
  403. sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.pyc +0 -0
  404. sage/middleware/services/vdb/examples/vdb_demo.py +0 -447
  405. sage/middleware/services/vdb/search_engine/__init__.py +0 -56
  406. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  407. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  408. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  409. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  410. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  411. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.pyc +0 -0
  412. sage/middleware/services/vdb/search_engine/base_vdb_index.py +0 -58
  413. sage/middleware/services/vdb/search_engine/faiss_index.py +0 -461
  414. sage/middleware/services/vdb/vdb_service.py +0 -436
  415. sage/middleware/utils/__init__.py +0 -56
  416. sage/middleware/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  417. sage/middleware/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  418. sage/middleware/utils/embedding/__init__.py +0 -56
  419. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  420. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.pyc +0 -0
  421. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.opt-2.pyc +0 -0
  422. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.pyc +0 -0
  423. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.opt-2.pyc +0 -0
  424. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.pyc +0 -0
  425. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.opt-2.pyc +0 -0
  426. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.pyc +0 -0
  427. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.opt-2.pyc +0 -0
  428. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.pyc +0 -0
  429. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.opt-2.pyc +0 -0
  430. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.pyc +0 -0
  431. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.opt-2.pyc +0 -0
  432. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.pyc +0 -0
  433. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.opt-2.pyc +0 -0
  434. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.pyc +0 -0
  435. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.opt-2.pyc +0 -0
  436. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.pyc +0 -0
  437. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.opt-2.pyc +0 -0
  438. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.pyc +0 -0
  439. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.opt-2.pyc +0 -0
  440. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.pyc +0 -0
  441. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.opt-2.pyc +0 -0
  442. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.pyc +0 -0
  443. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.opt-2.pyc +0 -0
  444. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.pyc +0 -0
  445. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.opt-2.pyc +0 -0
  446. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.pyc +0 -0
  447. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.opt-2.pyc +0 -0
  448. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.pyc +0 -0
  449. sage/middleware/utils/embedding/_cohere.py +0 -68
  450. sage/middleware/utils/embedding/bedrock.py +0 -174
  451. sage/middleware/utils/embedding/embedding_api.py +0 -12
  452. sage/middleware/utils/embedding/embedding_model.py +0 -150
  453. sage/middleware/utils/embedding/hf.py +0 -90
  454. sage/middleware/utils/embedding/instructor.py +0 -10
  455. sage/middleware/utils/embedding/jina.py +0 -115
  456. sage/middleware/utils/embedding/lollms.py +0 -100
  457. sage/middleware/utils/embedding/mockembedder.py +0 -46
  458. sage/middleware/utils/embedding/nvidia_openai.py +0 -97
  459. sage/middleware/utils/embedding/ollama.py +0 -97
  460. sage/middleware/utils/embedding/openai.py +0 -112
  461. sage/middleware/utils/embedding/siliconcloud.py +0 -133
  462. sage/middleware/utils/embedding/zhipu.py +0 -85
  463. {isage_middleware-0.1.3.1.dist-info → isage_middleware-0.2.0.0.dist-info}/WHEEL +0 -0
  464. {isage_middleware-0.1.3.1.dist-info → isage_middleware-0.2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,609 +0,0 @@
1
- """
2
- Graph Service - 图数据库微服务
3
- 提供图存储、知识图谱和图查询功能的服务任务,集成到SAGE DAG中
4
- 支持Neo4j和内存图后端
5
- """
6
- from typing import Dict, Any, Optional, List, Union, Tuple, TYPE_CHECKING
7
- from dataclasses import dataclass
8
- import logging
9
- import time
10
- import uuid
11
-
12
- from sage.core.api.service.base_service import BaseService
13
-
14
- if TYPE_CHECKING:
15
- from sage.core.factory.service_factory import ServiceFactory
16
- from sage.kernel import ServiceContext
17
-
18
-
19
- @dataclass
20
- class GraphConfig:
21
- """Graph服务配置"""
22
- backend_type: str = "memory" # "memory" 或 "neo4j"
23
- neo4j_uri: Optional[str] = None
24
- neo4j_user: Optional[str] = None
25
- neo4j_password: Optional[str] = None
26
- max_nodes: int = 100000
27
- max_relationships: int = 500000
28
-
29
-
30
- @dataclass
31
- class GraphNode:
32
- """图节点"""
33
- id: str
34
- labels: List[str]
35
- properties: Dict[str, Any]
36
- created_at: float = None
37
-
38
- def __post_init__(self):
39
- if self.created_at is None:
40
- self.created_at = time.time()
41
-
42
-
43
- @dataclass
44
- class GraphRelationship:
45
- """图关系"""
46
- id: str
47
- from_node: str
48
- to_node: str
49
- rel_type: str
50
- properties: Dict[str, Any]
51
- created_at: float = None
52
-
53
- def __post_init__(self):
54
- if self.created_at is None:
55
- self.created_at = time.time()
56
-
57
-
58
- class MemoryGraphBackend:
59
- """内存图数据库后端"""
60
-
61
- def __init__(self, max_nodes: int = 100000, max_relationships: int = 500000):
62
- self.nodes: Dict[str, GraphNode] = {}
63
- self.relationships: Dict[str, GraphRelationship] = {}
64
- self.node_relationships: Dict[str, List[str]] = {} # node_id -> [rel_ids]
65
- self.max_nodes = max_nodes
66
- self.max_relationships = max_relationships
67
- self.logger = logging.getLogger(__name__)
68
-
69
- def create_node(self, node: GraphNode) -> str:
70
- """创建节点"""
71
- if len(self.nodes) >= self.max_nodes:
72
- raise RuntimeError(f"Maximum nodes limit reached: {self.max_nodes}")
73
-
74
- if not node.id:
75
- node.id = f"node_{uuid.uuid4()}"
76
-
77
- self.nodes[node.id] = node
78
- if node.id not in self.node_relationships:
79
- self.node_relationships[node.id] = []
80
-
81
- self.logger.debug(f"Created node: {node.id}")
82
- return node.id
83
-
84
- def create_relationship(self, rel: GraphRelationship) -> str:
85
- """创建关系"""
86
- if len(self.relationships) >= self.max_relationships:
87
- raise RuntimeError(f"Maximum relationships limit reached: {self.max_relationships}")
88
-
89
- if rel.from_node not in self.nodes or rel.to_node not in self.nodes:
90
- raise ValueError("Both nodes must exist before creating relationship")
91
-
92
- if not rel.id:
93
- rel.id = f"rel_{uuid.uuid4()}"
94
-
95
- self.relationships[rel.id] = rel
96
-
97
- # 更新节点关系索引
98
- if rel.from_node not in self.node_relationships:
99
- self.node_relationships[rel.from_node] = []
100
- if rel.to_node not in self.node_relationships:
101
- self.node_relationships[rel.to_node] = []
102
-
103
- self.node_relationships[rel.from_node].append(rel.id)
104
- self.node_relationships[rel.to_node].append(rel.id)
105
-
106
- self.logger.debug(f"Created relationship: {rel.id}")
107
- return rel.id
108
-
109
- def get_node(self, node_id: str) -> Optional[GraphNode]:
110
- """获取节点"""
111
- return self.nodes.get(node_id)
112
-
113
- def get_relationship(self, rel_id: str) -> Optional[GraphRelationship]:
114
- """获取关系"""
115
- return self.relationships.get(rel_id)
116
-
117
- def find_nodes(self, labels: Optional[List[str]] = None,
118
- properties: Optional[Dict[str, Any]] = None) -> List[GraphNode]:
119
- """查找节点"""
120
- results = []
121
- for node in self.nodes.values():
122
- # 检查标签
123
- if labels and not any(label in node.labels for label in labels):
124
- continue
125
-
126
- # 检查属性
127
- if properties:
128
- if not all(node.properties.get(k) == v for k, v in properties.items()):
129
- continue
130
-
131
- results.append(node)
132
-
133
- return results
134
-
135
- def get_node_relationships(self, node_id: str, direction: str = "both") -> List[GraphRelationship]:
136
- """获取节点的关系"""
137
- if node_id not in self.node_relationships:
138
- return []
139
-
140
- rel_ids = self.node_relationships[node_id]
141
- relationships = []
142
-
143
- for rel_id in rel_ids:
144
- rel = self.relationships.get(rel_id)
145
- if not rel:
146
- continue
147
-
148
- if direction == "outgoing" and rel.from_node != node_id:
149
- continue
150
- elif direction == "incoming" and rel.to_node != node_id:
151
- continue
152
-
153
- relationships.append(rel)
154
-
155
- return relationships
156
-
157
- def delete_node(self, node_id: str) -> bool:
158
- """删除节点及其关系"""
159
- if node_id not in self.nodes:
160
- return False
161
-
162
- # 删除相关的关系
163
- if node_id in self.node_relationships:
164
- rel_ids = list(self.node_relationships[node_id])
165
- for rel_id in rel_ids:
166
- self.delete_relationship(rel_id)
167
-
168
- # 删除节点
169
- del self.nodes[node_id]
170
- if node_id in self.node_relationships:
171
- del self.node_relationships[node_id]
172
-
173
- return True
174
-
175
- def delete_relationship(self, rel_id: str) -> bool:
176
- """删除关系"""
177
- if rel_id not in self.relationships:
178
- return False
179
-
180
- rel = self.relationships[rel_id]
181
-
182
- # 从节点关系索引中移除
183
- if rel.from_node in self.node_relationships:
184
- self.node_relationships[rel.from_node] = [
185
- r for r in self.node_relationships[rel.from_node] if r != rel_id
186
- ]
187
-
188
- if rel.to_node in self.node_relationships:
189
- self.node_relationships[rel.to_node] = [
190
- r for r in self.node_relationships[rel.to_node] if r != rel_id
191
- ]
192
-
193
- del self.relationships[rel_id]
194
- return True
195
-
196
- def count_nodes(self) -> int:
197
- """获取节点数量"""
198
- return len(self.nodes)
199
-
200
- def count_relationships(self) -> int:
201
- """获取关系数量"""
202
- return len(self.relationships)
203
-
204
- def clear(self) -> None:
205
- """清空图数据"""
206
- self.nodes.clear()
207
- self.relationships.clear()
208
- self.node_relationships.clear()
209
-
210
-
211
- class Neo4jGraphBackend:
212
- """Neo4j图数据库后端"""
213
-
214
- def __init__(self, uri: str, user: str, password: str):
215
- try:
216
- from neo4j import GraphDatabase
217
- self.driver = GraphDatabase.driver(uri, auth=(user, password))
218
- self.logger = logging.getLogger(__name__)
219
-
220
- # 测试连接
221
- with self.driver.session() as session:
222
- session.run("RETURN 1")
223
-
224
- self.logger.info(f"Connected to Neo4j: {uri}")
225
- except ImportError:
226
- raise ImportError("Neo4j package not installed. Run: pip install neo4j")
227
- except Exception as e:
228
- raise ConnectionError(f"Failed to connect to Neo4j: {e}")
229
-
230
- def create_node(self, node: GraphNode) -> str:
231
- """创建节点"""
232
- with self.driver.session() as session:
233
- labels_str = ":".join(node.labels) if node.labels else ""
234
- query = f"CREATE (n:{labels_str} $properties) RETURN n"
235
-
236
- if not node.id:
237
- node.id = f"node_{uuid.uuid4()}"
238
-
239
- properties = {**node.properties, "id": node.id, "created_at": node.created_at}
240
- result = session.run(query, properties=properties)
241
-
242
- self.logger.debug(f"Created Neo4j node: {node.id}")
243
- return node.id
244
-
245
- def create_relationship(self, rel: GraphRelationship) -> str:
246
- """创建关系"""
247
- with self.driver.session() as session:
248
- if not rel.id:
249
- rel.id = f"rel_{uuid.uuid4()}"
250
-
251
- query = """
252
- MATCH (a {id: $from_node}), (b {id: $to_node})
253
- CREATE (a)-[r:%s $properties]->(b)
254
- RETURN r
255
- """ % rel.rel_type
256
-
257
- properties = {**rel.properties, "id": rel.id, "created_at": rel.created_at}
258
- session.run(query,
259
- from_node=rel.from_node,
260
- to_node=rel.to_node,
261
- properties=properties)
262
-
263
- self.logger.debug(f"Created Neo4j relationship: {rel.id}")
264
- return rel.id
265
-
266
- def get_node(self, node_id: str) -> Optional[GraphNode]:
267
- """获取节点"""
268
- with self.driver.session() as session:
269
- query = "MATCH (n {id: $node_id}) RETURN n, labels(n) as labels"
270
- result = session.run(query, node_id=node_id)
271
-
272
- record = result.single()
273
- if not record:
274
- return None
275
-
276
- node_data = dict(record["n"])
277
- labels = record["labels"]
278
-
279
- return GraphNode(
280
- id=node_data.pop("id"),
281
- labels=labels,
282
- properties=node_data,
283
- created_at=node_data.get("created_at", time.time())
284
- )
285
-
286
- def find_nodes(self, labels: Optional[List[str]] = None,
287
- properties: Optional[Dict[str, Any]] = None) -> List[GraphNode]:
288
- """查找节点"""
289
- with self.driver.session() as session:
290
- where_clauses = []
291
- params = {}
292
-
293
- if labels:
294
- label_str = ":".join(labels)
295
- query = f"MATCH (n:{label_str})"
296
- else:
297
- query = "MATCH (n)"
298
-
299
- if properties:
300
- for i, (k, v) in enumerate(properties.items()):
301
- param_name = f"prop_{i}"
302
- where_clauses.append(f"n.{k} = ${param_name}")
303
- params[param_name] = v
304
-
305
- if where_clauses:
306
- query += " WHERE " + " AND ".join(where_clauses)
307
-
308
- query += " RETURN n, labels(n) as labels"
309
-
310
- result = session.run(query, **params)
311
- nodes = []
312
-
313
- for record in result:
314
- node_data = dict(record["n"])
315
- labels = record["labels"]
316
-
317
- nodes.append(GraphNode(
318
- id=node_data.pop("id"),
319
- labels=labels,
320
- properties=node_data,
321
- created_at=node_data.get("created_at", time.time())
322
- ))
323
-
324
- return nodes
325
-
326
- def clear(self) -> None:
327
- """清空数据库"""
328
- with self.driver.session() as session:
329
- session.run("MATCH (n) DETACH DELETE n")
330
- self.logger.debug("Cleared Neo4j database")
331
-
332
-
333
- class GraphService(BaseService):
334
- """
335
- Graph服务任务
336
-
337
- 提供图存储、知识图谱和图查询功能,可以在SAGE DAG中作为服务节点使用
338
- 支持内存和Neo4j后端
339
- """
340
-
341
- def __init__(self, service_factory: 'ServiceFactory', ctx: 'ServiceContext' = None):
342
- super().__init__(service_factory, ctx)
343
-
344
- # 从service_factory获取配置
345
- self.config: GraphConfig = getattr(service_factory, 'config', GraphConfig())
346
-
347
- # 初始化后端
348
- if self.config.backend_type == "neo4j":
349
- if not all([self.config.neo4j_uri, self.config.neo4j_user, self.config.neo4j_password]):
350
- raise ValueError("Neo4j URI, user and password required for Neo4j backend")
351
- self.backend = Neo4jGraphBackend(
352
- self.config.neo4j_uri,
353
- self.config.neo4j_user,
354
- self.config.neo4j_password
355
- )
356
- self.logger.info(f"Graph Service '{self.service_name}' initialized with Neo4j backend")
357
- else:
358
- self.backend = MemoryGraphBackend(
359
- self.config.max_nodes,
360
- self.config.max_relationships
361
- )
362
- self.logger.info(f"Graph Service '{self.service_name}' initialized with memory backend")
363
-
364
- def _start_service_instance(self):
365
- """启动Graph服务实例"""
366
- self.logger.info(f"Graph Service '{self.service_name}' started")
367
-
368
- def _stop_service_instance(self):
369
- """停止Graph服务实例"""
370
- self.logger.info(f"Graph Service '{self.service_name}' stopped")
371
-
372
- # Graph操作方法 - 这些方法可以通过服务调用机制被调用
373
-
374
- # 兼容API:add_node(dict) 与 create_node(labels, properties, node_id)
375
- def add_node(self, node: Dict[str, Any]) -> str:
376
- """兼容 MemoryService 的 add_node 接口: {'id','labels','properties'}"""
377
- labels = node.get("labels", []) or []
378
- properties = node.get("properties", {}) or {}
379
- node_id = node.get("id")
380
- return self.create_node(labels=labels, properties=properties, node_id=node_id)
381
-
382
- def create_node(self, labels: List[str], properties: Dict[str, Any],
383
- node_id: Optional[str] = None) -> str:
384
- """创建节点"""
385
- self.logger.debug(f"Creating node with labels: {labels}")
386
-
387
- node = GraphNode(
388
- id=node_id or "",
389
- labels=labels,
390
- properties=properties
391
- )
392
-
393
- result = self.backend.create_node(node)
394
- self.logger.debug(f"Created node: {result}")
395
- return result
396
-
397
- # 兼容API:add_relationship(dict) 与 create_relationship(from,to,type,...)
398
- def add_relationship(self, rel: Dict[str, Any]) -> str:
399
- """兼容 MemoryService 的 add_relationship 接口: {'from_node','to_node','rel_type','properties','id'}"""
400
- return self.create_relationship(
401
- from_node=rel.get("from_node"),
402
- to_node=rel.get("to_node"),
403
- rel_type=rel.get("rel_type"),
404
- properties=rel.get("properties"),
405
- rel_id=rel.get("id")
406
- )
407
-
408
- def create_relationship(self, from_node: str, to_node: str, rel_type: str,
409
- properties: Optional[Dict[str, Any]] = None,
410
- rel_id: Optional[str] = None) -> str:
411
- """创建关系"""
412
- self.logger.debug(f"Creating relationship: {from_node} -[{rel_type}]-> {to_node}")
413
-
414
- rel = GraphRelationship(
415
- id=rel_id or "",
416
- from_node=from_node,
417
- to_node=to_node,
418
- rel_type=rel_type,
419
- properties=properties or {}
420
- )
421
-
422
- result = self.backend.create_relationship(rel)
423
- self.logger.debug(f"Created relationship: {result}")
424
- return result
425
-
426
- def get_node(self, node_id: str) -> Optional[Dict[str, Any]]:
427
- """获取节点"""
428
- self.logger.debug(f"Getting node: {node_id}")
429
-
430
- node = self.backend.get_node(node_id)
431
- if node:
432
- return {
433
- "id": node.id,
434
- "labels": node.labels,
435
- "properties": node.properties,
436
- "created_at": node.created_at
437
- }
438
- return None
439
-
440
- # 兼容 MemoryService 查询使用的便捷方法
441
- def get_node_context(self, node_id: str, depth: int = 1) -> Dict[str, Any]:
442
- """获取节点的邻域上下文(简单一层或多层展开)"""
443
- context = {"node": self.get_node(node_id), "neighbors": [], "relationships": []}
444
- if not context["node"]:
445
- return context
446
- rels = self.get_node_relationships(node_id, direction="both") if hasattr(self.backend, 'get_node_relationships') else []
447
- context["relationships"] = rels
448
- neighbor_ids = set()
449
- for r in rels:
450
- neighbor_ids.add(r.get("from_node") if isinstance(r, dict) else r.from_node)
451
- neighbor_ids.add(r.get("to_node") if isinstance(r, dict) else r.to_node)
452
- neighbor_ids.discard(node_id)
453
- for nid in neighbor_ids:
454
- n = self.get_node(nid)
455
- if n:
456
- context["neighbors"].append(n)
457
- return context
458
-
459
- def get_session_graph(self, session_id: str) -> Dict[str, Any]:
460
- """根据会话ID返回简单的图统计(基于节点属性 session_id)"""
461
- # 简单按属性筛选
462
- try:
463
- nodes = self.find_nodes(properties={"session_id": session_id})
464
- except Exception:
465
- nodes = []
466
- node_ids = {n["id"] if isinstance(n, dict) else n.id for n in nodes}
467
- # 关系筛选
468
- relationships = []
469
- if hasattr(self.backend, 'relationships'):
470
- for rel in getattr(self.backend, 'relationships', {}).values():
471
- src = rel.get("from_node") if isinstance(rel, dict) else rel.from_node
472
- dst = rel.get("to_node") if isinstance(rel, dict) else rel.to_node
473
- if src in node_ids or dst in node_ids:
474
- relationships.append({
475
- "id": rel.get("id") if isinstance(rel, dict) else rel.id,
476
- "from_node": src,
477
- "to_node": dst,
478
- "rel_type": rel.get("rel_type") if isinstance(rel, dict) else rel.rel_type,
479
- "properties": rel.get("properties") if isinstance(rel, dict) else rel.properties,
480
- })
481
- return {
482
- "session_id": session_id,
483
- "node_count": len(nodes),
484
- "relationship_count": len(relationships),
485
- "nodes": nodes,
486
- "relationships": relationships,
487
- }
488
-
489
- def find_nodes(self, labels: Optional[List[str]] = None,
490
- properties: Optional[Dict[str, Any]] = None) -> List[Dict[str, Any]]:
491
- """查找节点"""
492
- self.logger.debug(f"Finding nodes with labels: {labels}, properties: {properties}")
493
-
494
- nodes = self.backend.find_nodes(labels, properties)
495
- results = []
496
- for node in nodes:
497
- results.append({
498
- "id": node.id,
499
- "labels": node.labels,
500
- "properties": node.properties,
501
- "created_at": node.created_at
502
- })
503
-
504
- self.logger.debug(f"Found {len(results)} nodes")
505
- return results
506
-
507
- def get_node_relationships(self, node_id: str, direction: str = "both") -> List[Dict[str, Any]]:
508
- """获取节点的关系"""
509
- self.logger.debug(f"Getting relationships for node: {node_id}, direction: {direction}")
510
-
511
- if hasattr(self.backend, 'get_node_relationships'):
512
- relationships = self.backend.get_node_relationships(node_id, direction)
513
- results = []
514
- for rel in relationships:
515
- results.append({
516
- "id": rel.id,
517
- "from_node": rel.from_node,
518
- "to_node": rel.to_node,
519
- "rel_type": rel.rel_type,
520
- "properties": rel.properties,
521
- "created_at": rel.created_at
522
- })
523
- return results
524
- return []
525
-
526
- def delete_node(self, node_id: str) -> bool:
527
- """删除节点"""
528
- self.logger.debug(f"Deleting node: {node_id}")
529
- result = self.backend.delete_node(node_id)
530
- self.logger.debug(f"Delete node result: {result}")
531
- return result
532
-
533
- def delete_relationship(self, rel_id: str) -> bool:
534
- """删除关系"""
535
- self.logger.debug(f"Deleting relationship: {rel_id}")
536
- result = self.backend.delete_relationship(rel_id)
537
- self.logger.debug(f"Delete relationship result: {result}")
538
- return result
539
-
540
- def count_nodes(self) -> int:
541
- """获取节点数量"""
542
- result = self.backend.count_nodes()
543
- self.logger.debug(f"Node count: {result}")
544
- return result
545
-
546
- def count_relationships(self) -> int:
547
- """获取关系数量"""
548
- result = self.backend.count_relationships()
549
- self.logger.debug(f"Relationship count: {result}")
550
- return result
551
-
552
- def clear(self) -> None:
553
- """清空图数据"""
554
- self.logger.debug("Clearing graph data")
555
- self.backend.clear()
556
-
557
- def stats(self) -> Dict[str, Any]:
558
- """获取服务统计信息"""
559
- base_stats = self.get_statistics()
560
- graph_stats = {
561
- "backend_type": self.config.backend_type,
562
- "node_count": self.backend.count_nodes(),
563
- "relationship_count": self.backend.count_relationships(),
564
- "max_nodes": getattr(self.config, 'max_nodes', None),
565
- "max_relationships": getattr(self.config, 'max_relationships', None)
566
- }
567
- base_stats.update(graph_stats)
568
- return base_stats
569
-
570
-
571
- # 工厂函数,用于在DAG中创建Graph服务
572
- def create_graph_service_factory(
573
- service_name: str = "graph_service",
574
- backend_type: str = "memory",
575
- neo4j_uri: Optional[str] = None,
576
- neo4j_user: Optional[str] = None,
577
- neo4j_password: Optional[str] = None,
578
- max_nodes: int = 100000,
579
- max_relationships: int = 500000
580
- ):
581
- """
582
- 创建Graph服务工厂
583
-
584
- Args:
585
- service_name: 服务名称
586
- backend_type: 后端类型 ("memory" 或 "neo4j")
587
- neo4j_uri: Neo4j连接URI
588
- neo4j_user: Neo4j用户名
589
- neo4j_password: Neo4j密码
590
- max_nodes: 最大节点数 (仅内存后端)
591
- max_relationships: 最大关系数 (仅内存后端)
592
-
593
- Returns:
594
- ServiceFactory: 可以用于注册到环境的服务工厂
595
- """
596
- from sage.core.factory.service_factory import ServiceFactory
597
-
598
- config = GraphConfig(
599
- backend_type=backend_type,
600
- neo4j_uri=neo4j_uri,
601
- neo4j_user=neo4j_user,
602
- neo4j_password=neo4j_password,
603
- max_nodes=max_nodes,
604
- max_relationships=max_relationships
605
- )
606
-
607
- factory = ServiceFactory(service_name, GraphService)
608
- factory.config = config
609
- return factory
@@ -1,56 +0,0 @@
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']