isage-middleware 0.2.4.3__cp311-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 (94) hide show
  1. isage_middleware-0.2.4.3.dist-info/METADATA +266 -0
  2. isage_middleware-0.2.4.3.dist-info/RECORD +94 -0
  3. isage_middleware-0.2.4.3.dist-info/WHEEL +5 -0
  4. isage_middleware-0.2.4.3.dist-info/top_level.txt +1 -0
  5. sage/middleware/__init__.py +59 -0
  6. sage/middleware/_version.py +6 -0
  7. sage/middleware/components/__init__.py +30 -0
  8. sage/middleware/components/extensions_compat.py +141 -0
  9. sage/middleware/components/sage_db/__init__.py +116 -0
  10. sage/middleware/components/sage_db/backend.py +136 -0
  11. sage/middleware/components/sage_db/service.py +15 -0
  12. sage/middleware/components/sage_flow/__init__.py +76 -0
  13. sage/middleware/components/sage_flow/python/__init__.py +14 -0
  14. sage/middleware/components/sage_flow/python/micro_service/__init__.py +4 -0
  15. sage/middleware/components/sage_flow/python/micro_service/sage_flow_service.py +88 -0
  16. sage/middleware/components/sage_flow/python/sage_flow.py +30 -0
  17. sage/middleware/components/sage_flow/service.py +14 -0
  18. sage/middleware/components/sage_mem/__init__.py +83 -0
  19. sage/middleware/components/sage_sias/__init__.py +59 -0
  20. sage/middleware/components/sage_sias/continual_learner.py +184 -0
  21. sage/middleware/components/sage_sias/coreset_selector.py +302 -0
  22. sage/middleware/components/sage_sias/types.py +94 -0
  23. sage/middleware/components/sage_tsdb/__init__.py +81 -0
  24. sage/middleware/components/sage_tsdb/python/__init__.py +21 -0
  25. sage/middleware/components/sage_tsdb/python/_sage_tsdb.pyi +17 -0
  26. sage/middleware/components/sage_tsdb/python/algorithms/__init__.py +17 -0
  27. sage/middleware/components/sage_tsdb/python/algorithms/base.py +51 -0
  28. sage/middleware/components/sage_tsdb/python/algorithms/out_of_order_join.py +248 -0
  29. sage/middleware/components/sage_tsdb/python/algorithms/window_aggregator.py +296 -0
  30. sage/middleware/components/sage_tsdb/python/micro_service/__init__.py +7 -0
  31. sage/middleware/components/sage_tsdb/python/micro_service/sage_tsdb_service.py +365 -0
  32. sage/middleware/components/sage_tsdb/python/sage_tsdb.py +523 -0
  33. sage/middleware/components/sage_tsdb/service.py +17 -0
  34. sage/middleware/components/vector_stores/__init__.py +25 -0
  35. sage/middleware/components/vector_stores/chroma.py +483 -0
  36. sage/middleware/components/vector_stores/chroma_adapter.py +185 -0
  37. sage/middleware/components/vector_stores/milvus.py +677 -0
  38. sage/middleware/operators/__init__.py +56 -0
  39. sage/middleware/operators/agent/__init__.py +24 -0
  40. sage/middleware/operators/agent/planning/__init__.py +5 -0
  41. sage/middleware/operators/agent/planning/llm_adapter.py +41 -0
  42. sage/middleware/operators/agent/planning/planner_adapter.py +98 -0
  43. sage/middleware/operators/agent/planning/router.py +107 -0
  44. sage/middleware/operators/agent/runtime.py +296 -0
  45. sage/middleware/operators/agentic/__init__.py +41 -0
  46. sage/middleware/operators/agentic/config.py +254 -0
  47. sage/middleware/operators/agentic/planning_operator.py +125 -0
  48. sage/middleware/operators/agentic/refined_searcher.py +132 -0
  49. sage/middleware/operators/agentic/runtime.py +241 -0
  50. sage/middleware/operators/agentic/timing_operator.py +125 -0
  51. sage/middleware/operators/agentic/tool_selection_operator.py +127 -0
  52. sage/middleware/operators/context/__init__.py +17 -0
  53. sage/middleware/operators/context/critic_evaluation.py +16 -0
  54. sage/middleware/operators/context/model_context.py +565 -0
  55. sage/middleware/operators/context/quality_label.py +12 -0
  56. sage/middleware/operators/context/search_query_results.py +61 -0
  57. sage/middleware/operators/context/search_result.py +42 -0
  58. sage/middleware/operators/context/search_session.py +79 -0
  59. sage/middleware/operators/filters/__init__.py +26 -0
  60. sage/middleware/operators/filters/context_sink.py +387 -0
  61. sage/middleware/operators/filters/context_source.py +376 -0
  62. sage/middleware/operators/filters/evaluate_filter.py +83 -0
  63. sage/middleware/operators/filters/tool_filter.py +74 -0
  64. sage/middleware/operators/llm/__init__.py +18 -0
  65. sage/middleware/operators/llm/sagellm_generator.py +432 -0
  66. sage/middleware/operators/rag/__init__.py +147 -0
  67. sage/middleware/operators/rag/arxiv.py +331 -0
  68. sage/middleware/operators/rag/chunk.py +13 -0
  69. sage/middleware/operators/rag/document_loaders.py +23 -0
  70. sage/middleware/operators/rag/evaluate.py +658 -0
  71. sage/middleware/operators/rag/generator.py +340 -0
  72. sage/middleware/operators/rag/index_builder/__init__.py +48 -0
  73. sage/middleware/operators/rag/index_builder/builder.py +363 -0
  74. sage/middleware/operators/rag/index_builder/manifest.py +101 -0
  75. sage/middleware/operators/rag/index_builder/storage.py +131 -0
  76. sage/middleware/operators/rag/pipeline.py +46 -0
  77. sage/middleware/operators/rag/profiler.py +59 -0
  78. sage/middleware/operators/rag/promptor.py +400 -0
  79. sage/middleware/operators/rag/refiner.py +231 -0
  80. sage/middleware/operators/rag/reranker.py +364 -0
  81. sage/middleware/operators/rag/retriever.py +1308 -0
  82. sage/middleware/operators/rag/searcher.py +37 -0
  83. sage/middleware/operators/rag/types.py +28 -0
  84. sage/middleware/operators/rag/writer.py +80 -0
  85. sage/middleware/operators/tools/__init__.py +71 -0
  86. sage/middleware/operators/tools/arxiv_paper_searcher.py +175 -0
  87. sage/middleware/operators/tools/arxiv_searcher.py +102 -0
  88. sage/middleware/operators/tools/duckduckgo_searcher.py +105 -0
  89. sage/middleware/operators/tools/image_captioner.py +104 -0
  90. sage/middleware/operators/tools/nature_news_fetcher.py +224 -0
  91. sage/middleware/operators/tools/searcher_tool.py +514 -0
  92. sage/middleware/operators/tools/text_detector.py +185 -0
  93. sage/middleware/operators/tools/url_text_extractor.py +104 -0
  94. sage/middleware/py.typed +2 -0
@@ -0,0 +1,266 @@
1
+ Metadata-Version: 2.1
2
+ Name: isage-middleware
3
+ Version: 0.2.4.3
4
+ Summary: SAGE Middleware - Streaming-Augmented Generative Execution
5
+ Author-email: IntelliStream Team <shuhao_zhang@hust.edu.cn>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/intellistream/SAGE
8
+ Project-URL: Repository, https://github.com/intellistream/SAGE.git
9
+ Project-URL: Documentation, https://intellistream.github.io/SAGE-Pub/
10
+ Project-URL: Issues, https://github.com/intellistream/SAGE/issues
11
+ Keywords: data,api,reasoning,dataflow,llm,ml,middleware,framework,rag,intellistream,ai,sage
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
17
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Classifier: Topic :: System :: Distributed Computing
19
+ Requires-Python: >=3.10
20
+ Description-Content-Type: text/markdown
21
+ Requires-Dist: openai<1.91.0,>=1.52.0
22
+ Requires-Dist: httpx<1.0.0,>=0.28.0
23
+ Requires-Dist: aiohttp<4.0.0,>=3.12.0
24
+ Requires-Dist: beautifulsoup4<5.0.0,>=4.12.0
25
+ Requires-Dist: feedparser<7.0.0,>=6.0.11
26
+ Requires-Dist: json-repair<1.0.0,>=0.30.0
27
+ Requires-Dist: bm25s<1.0.0,>=0.2.13
28
+ Requires-Dist: rank-bm25<1.0.0,>=0.2.0
29
+ Requires-Dist: PyStemmer<4.0.0,>=3.0.0
30
+ Provides-Extra: all
31
+ Requires-Dist: isage-middleware[auth,compression,libs,llm-providers,ml,neuromem,queue,streaming,vdb]; extra == "all"
32
+ Provides-Extra: auth
33
+ Requires-Dist: python-jose[cryptography]<4.0.0,>=3.5.0; extra == "auth"
34
+ Requires-Dist: passlib[argon2]<2.0.0,>=1.7.4; extra == "auth"
35
+ Provides-Extra: compression
36
+ Requires-Dist: llmlingua<1.0.0,>=0.2.0; extra == "compression"
37
+ Provides-Extra: dev
38
+ Requires-Dist: pytest>=7.4.0; extra == "dev"
39
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
40
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
41
+ Requires-Dist: ruff==0.14.6; extra == "dev"
42
+ Requires-Dist: mypy>=1.7.0; extra == "dev"
43
+ Requires-Dist: pybind11>=2.10.0; extra == "dev"
44
+ Provides-Extra: libs
45
+ Requires-Dist: isage-libs; extra == "libs"
46
+ Requires-Dist: isage-agentic>=0.1.0.0; extra == "libs"
47
+ Requires-Dist: isage-eval>=0.1.0.0; extra == "libs"
48
+ Requires-Dist: isage-finetune>=0.1.0.0; extra == "libs"
49
+ Requires-Dist: isage-privacy>=0.1.0.0; extra == "libs"
50
+ Requires-Dist: isage-rag>=0.1.0.0; extra == "libs"
51
+ Requires-Dist: isage-safety>=0.1.0.0; extra == "libs"
52
+ Requires-Dist: isage-refiner>=0.1.0.0; extra == "libs"
53
+ Provides-Extra: llm-providers
54
+ Requires-Dist: ollama<1.0.0,>=0.5.0; extra == "llm-providers"
55
+ Requires-Dist: zhipuai<3.0.0,>=2.1.0; extra == "llm-providers"
56
+ Requires-Dist: cohere<6.0.0,>=5.16.0; extra == "llm-providers"
57
+ Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "llm-providers"
58
+ Provides-Extra: ml
59
+ Requires-Dist: transformers<4.54.0,>=4.52.0; extra == "ml"
60
+ Requires-Dist: tokenizers<0.24.0,>=0.21.0; extra == "ml"
61
+ Requires-Dist: sentence-transformers<4.0.0,>=3.1.0; extra == "ml"
62
+ Requires-Dist: InstructorEmbedding<2.0.0,>=1.0.0; extra == "ml"
63
+ Requires-Dist: accelerate<2.0.0,>=1.9.0; extra == "ml"
64
+ Requires-Dist: huggingface-hub<1.0.0,>=0.34.0; extra == "ml"
65
+ Requires-Dist: peft<1.0.0,>=0.18.0; extra == "ml"
66
+ Requires-Dist: scipy<2.0.0,>=1.15.0; extra == "ml"
67
+ Provides-Extra: neuromem
68
+ Requires-Dist: isage-neuromem>=0.2.1.1; extra == "neuromem"
69
+ Provides-Extra: queue
70
+ Requires-Dist: celery<6.0.0,>=5.5.0; extra == "queue"
71
+ Requires-Dist: flower<3.0.0,>=2.0.0; extra == "queue"
72
+ Provides-Extra: streaming
73
+ Requires-Dist: isage-flow>=0.1.1; extra == "streaming"
74
+ Requires-Dist: isage-tsdb>=0.1.5; extra == "streaming"
75
+ Provides-Extra: vdb
76
+ Requires-Dist: isage-vdb>=0.1.5; extra == "vdb"
77
+ Requires-Dist: faiss-cpu<2.0.0,>=1.7.0; extra == "vdb"
78
+
79
+ # SAGE Middleware(中间件)
80
+
81
+ ## 📋 Overview
82
+
83
+ 用于构建带有 AI 能力的流式数据应用的中间件层,集成了多家大模型提供商、异步任务、鉴权以及高性能的数据处理组件。
84
+
85
+ ## 🧭 Governance / 团队协作制度
86
+
87
+ - `docs/governance/TEAM.md`
88
+ - `docs/governance/MAINTAINERS.md`
89
+ - `docs/governance/DEVELOPER_GUIDE.md`
90
+ - `docs/governance/PR_CHECKLIST.md`
91
+ - `docs/governance/SELF_HOSTED_RUNNER.md`
92
+ - `docs/governance/TODO.md`
93
+
94
+ ## ✨ Key Features
95
+
96
+ - 🤖 **LLM 推理**:
97
+ - **sageLLM** ✅ 推荐:统一 LLM 推理引擎,支持 CUDA/Ascend/Mock 后端
98
+ - vLLM ⚠️ 已弃用:将在 v0.4.0 移除,请迁移至 sageLLM
99
+ - 🔎 检索与向量:RAG、BM25、FAISS 等
100
+ - 📋 任务调度:Celery 异步任务
101
+ - 🔐 安全鉴权:JWT、密码学工具
102
+ - ⚙️ 核心组件:
103
+ - `sage_db`:数据库/向量存储相关组件(含 C/C++ 扩展)
104
+ - `sage_flow`:高性能向量流处理(可能包含扩展或独立子模块)
105
+
106
+ ## 🚀 Installation
107
+
108
+ ```bash
109
+ pip install isage-middleware
110
+
111
+ # 可选:VLLM 支持(需要 CUDA)
112
+ pip install isage-common[vllm]
113
+
114
+ # 可选:与完整 SAGE 框架集成
115
+ pip install isage-middleware[sage]
116
+ ```
117
+
118
+ ## 📖 Quick Start
119
+
120
+ ### LLM 推理(推荐:sageLLM)
121
+
122
+ ```python
123
+ from sage.middleware.operators.llm import SageLLMGenerator
124
+
125
+ # 自动选择最佳后端
126
+ generator = SageLLMGenerator(
127
+ model_path="Qwen/Qwen2.5-7B-Instruct",
128
+ backend_type="auto", # auto/cuda/ascend/mock
129
+ temperature=0.7,
130
+ max_tokens=2048,
131
+ )
132
+
133
+ result = generator.execute("你好,世界!")
134
+ print(result)
135
+ ```
136
+
137
+ ### API 客户端
138
+
139
+ ```python
140
+ from sage.middleware.api.client import APIClient
141
+ from sage.middleware.auth.jwt import JWTManager
142
+
143
+ client = APIClient()
144
+ jwt_manager = JWTManager()
145
+
146
+ resp = client.chat_completion(
147
+ provider="openai",
148
+ messages=[{"role": "user", "content": "Hello!"}],
149
+ )
150
+ print(resp)
151
+ ```
152
+
153
+ > 📖 **迁移指南**:如果您正在使用 `VLLMGenerator`,请参阅
154
+ > [vLLM to sageLLM Migration Guide](../../docs-public/docs_src/dev-notes/migration/VLLM_TO_SAGELLM_MIGRATION.md)
155
+
156
+ ## 配置示例
157
+
158
+ ```yaml
159
+ # config.yaml
160
+ middleware:
161
+ auth:
162
+ secret_key: "your-secret-key" # pragma: allowlist secret
163
+ algorithm: "HS256"
164
+ providers:
165
+ openai:
166
+ api_key: "sk-..." # pragma: allowlist secret
167
+ base_url: "https://api.openai.com/v1"
168
+ ```
169
+
170
+ ## 开发与本地安装
171
+
172
+ ```bash
173
+ git clone https://github.com/intellistream/SAGE.git
174
+ cd SAGE/packages/sage-middleware
175
+ pip install -e .
176
+ ```
177
+
178
+ > 说明:中间件组件(sage_db/sage_flow/sage_tsdb 等)现已随源码直接提供或通过 pip 依赖分发,无需初始化任何子模块。
179
+
180
+ ## 新增中间件组件的规范(重要)
181
+
182
+ 当你添加新的中间件组件(例如 `sage_foo`)时,请务必在 `setup.py` 中接入其构建逻辑,这样在安装 `isage-middleware` 时会自动构建/准备该组件。
183
+
184
+ 建议遵循以下约定:
185
+
186
+ ### 1. 目录结构
187
+
188
+ - `src/sage/middleware/components/sage_foo/`
189
+ - `__init__.py`(Python 包)
190
+ - (如包含 C/C++ 部分)`cmake/`、`build.sh`、`CMakeLists.txt`
191
+ - 其他源码/资源文件
192
+
193
+ ### 2. C++ 扩展与依赖要求
194
+
195
+ 如果组件包含 C/C++ 扩展,**必须**遵守以下依赖约束,以与现有 `sage_db`、`sage_flow` 保持一致:
196
+
197
+ > **注意**: 以下代码示例中的 `SAGE_COMMON_DEPS_FILE` 等变量是 CMake 环境变量,非占位符。
198
+
199
+ 1. **共享依赖入口:**
200
+
201
+ - 在 `CMakeLists.txt` 中优先加载共享依赖脚本(通过环境变量):
202
+ ```cmake
203
+ set(_sage_foo_shared_deps FALSE)
204
+ # Check if shared deps file is defined
205
+ if(DEFINED SAGE_COMMON_DEPS_FILE AND EXISTS "$ENV(SAGE_COMMON_DEPS_FILE)")
206
+ include("$ENV(SAGE_COMMON_DEPS_FILE)")
207
+ set(_sage_foo_shared_deps TRUE)
208
+ endif()
209
+ ```
210
+ - 共享脚本会提供 `pybind11::module`、统一的可见性编译选项、以及全部 gperftools 配置变量。
211
+
212
+ 1. **本地回退脚本:**
213
+
214
+ - 请在组件目录的 `cmake/` 下提供 `pybind11_dependency.cmake` 和(如需要)`gperftools.cmake`,用于在独立构建或共享脚本缺失时下载依赖。
215
+ - 在 `CMakeLists.txt` 中检测 `_sage_foo_shared_deps`,若为 `FALSE` 再加载本地脚本:
216
+ ```cmake
217
+ if(NOT _sage_foo_shared_deps)
218
+ include(cmake/pybind11_dependency.cmake)
219
+ endif()
220
+ ```
221
+
222
+ 1. **gperftools 约定:**
223
+
224
+ - 新增扩展应暴露 `ENABLE_GPERFTOOLS` 选项,并默认遵循 `SAGE_ENABLE_GPERFTOOLS` 环境变量。
225
+ - 只有在确认找到 `SAGE_GPERFTOOLS_LIBS`(或本地回退脚本成功解析)时才链接 gperftools;否则务必禁用该选项并给出清晰日志。
226
+
227
+ 1. **环境变量约定:**
228
+
229
+ - 共享脚本会设置 `SAGE_COMMON_COMPILE_OPTIONS`、`SAGE_COMMON_COMPILE_DEFINITIONS` 等变量,请在目标上引用,避免重复配置。
230
+ - 新扩展若需要自定义变量,务必提供合理的默认值,并允许通过环境变量覆写。
231
+
232
+ 1. **打包要求:**
233
+
234
+ - `pyproject.toml` 中需包含 `"sage.middleware.components.sage_foo" = ["cmake/*.cmake"]` 等条目,保证 CMake
235
+ 脚本在发布包内。
236
+ - 如扩展存在 Python 侧绑定(`python/` 目录),确保 `pyproject.toml` 中的 `package-data` 同步更新。
237
+
238
+ ### 3. 构建脚本
239
+
240
+ - 如果组件需要编译或额外准备工作,请提供标准的 `build.sh`,支持无交互执行:
241
+ - `bash build.sh --install-deps`
242
+ - `build.sh` 应读取相关环境变量(如依赖文件路径、gperftools 开关等),并在调用 `cmake` 时透传(参考 `sage_db`、`sage_flow`)。
243
+
244
+ ### 4. 在 `setup.py` 中接入
245
+
246
+ - 在自定义的 `build_ext` 流程中:
247
+ - 新增 `build_sage_foo()` 方法(参照现有 `build_sage_db()` / `build_sage_flow()`)。
248
+ - 使用统一的 `_shared_env()` 帮助函数为子进程注入共享依赖环境。
249
+ - 在 `run()` 中调用 `self.build_sage_foo()`,并保证失败不阻断安装(打印清晰日志即可)。
250
+
251
+ ### 5. 环境变量开关(可选)
252
+
253
+ - 通过设置 `SAGE_SKIP_C_EXTENSIONS=1` 可以跳过所有扩展构建(调试纯 Python 逻辑时常用)。
254
+
255
+ ### 6. CI 与子模块提示
256
+
257
+ - CI 会递归检出子模块并按 `setup.py` 的逻辑尝试构建。
258
+ - 中间件组件不再通过 Git submodule 分发;请不要在 CI 或本地执行子模块初始化命令。
259
+
260
+ ## 贡献
261
+
262
+ 欢迎提交 PR!请先阅读仓库根目录的 [CONTRIBUTING.md](../../CONTRIBUTING.md)。
263
+
264
+ ## 📄 License
265
+
266
+ MIT License - see [LICENSE](../../LICENSE) for details.
@@ -0,0 +1,94 @@
1
+ sage/middleware/__init__.py,sha256=0VLtoshNFWRzLHvE_wVq3DuYXwQrzyBJ9yfMa3Vaj-A,1972
2
+ sage/middleware/_version.py,sha256=kilIikRCA21kF-bP0fRc6XmTREV9gA8bIyf_HD5GJUk,177
3
+ sage/middleware/py.typed,sha256=42WLrVlzpn7jMsIIEdXWWE5YOGnCHXrlnm5sbY6TFmQ,96
4
+ sage/middleware/components/__init__.py,sha256=KwVxO1BJzE7vvrAEQRX9ZESizZyrfdy921cch9qmHUU,821
5
+ sage/middleware/components/extensions_compat.py,sha256=s84uXImqyM72VMp6Q3JoeR8ud6LjzlQKvnorPv5fObY,4706
6
+ sage/middleware/components/sage_db/__init__.py,sha256=rA1z9DGqYgxCY9UiRyRDrMLQxaGCHJTN0ySr7GEWMr0,3130
7
+ sage/middleware/components/sage_db/backend.py,sha256=0de4XsgALCEjS_WEGGz9BtD50ly8af5mHIdMLuAdiJM,3915
8
+ sage/middleware/components/sage_db/service.py,sha256=oQNveAXhiCcBXR5tusk3G67D3ON0RUXhpZxvLjvnYBI,463
9
+ sage/middleware/components/sage_flow/__init__.py,sha256=vs6wj9g5I5OArMgwnlFW_E4GXMshY0p54HL3r8lsmTY,2016
10
+ sage/middleware/components/sage_flow/service.py,sha256=jvsnap0QnznIHAHfYeucvfeW_O3Rrop-BFRZb6wai0c,361
11
+ sage/middleware/components/sage_flow/python/__init__.py,sha256=5hEJGXJSj9Dpo9n2VX5egr-e7dxgzgnMAUkVwtELde0,457
12
+ sage/middleware/components/sage_flow/python/sage_flow.py,sha256=DOvFJ5nvqgzBFwf1Xk-qNTQIXyqDEucySqW6JNvCT4M,571
13
+ sage/middleware/components/sage_flow/python/micro_service/__init__.py,sha256=gMNyW3GRLBIrP3qiAaKjAX_yLfBpcrFbW9rDVtqs-9Q,118
14
+ sage/middleware/components/sage_flow/python/micro_service/sage_flow_service.py,sha256=hwcnlPIbbsrnkl8g9XNdyDTKZXPtVOqFkrHymEWP6a0,2884
15
+ sage/middleware/components/sage_mem/__init__.py,sha256=0Vb2ZKzRo82danMZJl2Nxh7krj5mKZUCcLrY_UEk4MM,2903
16
+ sage/middleware/components/sage_sias/__init__.py,sha256=Ia1jCniFokDnKvCS6LFp1S1jh3E1VpDMMGHMeQGqrLk,1899
17
+ sage/middleware/components/sage_sias/continual_learner.py,sha256=LA_o2k81VO287jLvt7HmFvAhNtpJv-Zz7xjXqi0YPAo,6240
18
+ sage/middleware/components/sage_sias/coreset_selector.py,sha256=L8JJfUvFwQl0GQOSWVZ2bl9uxSB7q-WCuoQpiawU9TU,10756
19
+ sage/middleware/components/sage_sias/types.py,sha256=iAlEU2Obxp5F0iTxpwGXLoOA3LyiOKqY-Oqm133tfQw,2418
20
+ sage/middleware/components/sage_tsdb/__init__.py,sha256=BaY8TthTdkQ7oMWD6flAu_6cqw0CiErDU6t6A8P_2Rc,2081
21
+ sage/middleware/components/sage_tsdb/service.py,sha256=iPz2D4Lc6NPQhuLzL2mZmzTqOEKxlBVr4AZNd8C-tAA,428
22
+ sage/middleware/components/sage_tsdb/python/__init__.py,sha256=umH2E_KItHaRMG0pLzUhuEWhIWZYaLmYe1K3al3qKIY,553
23
+ sage/middleware/components/sage_tsdb/python/_sage_tsdb.pyi,sha256=jatBiI4eInV5z_g8aaqlKyXcz37-NV5dfTLtLsTSmXU,502
24
+ sage/middleware/components/sage_tsdb/python/sage_tsdb.py,sha256=CGbv9e9MNoQlCF37RCP4hdMswqdVqjfp3HlcBlRfjg8,16133
25
+ sage/middleware/components/sage_tsdb/python/algorithms/__init__.py,sha256=miozMiOag6xpJ0-g3zSMgnyAV9vXSqwtWAPNhdjh2K4,443
26
+ sage/middleware/components/sage_tsdb/python/algorithms/base.py,sha256=kNQmzmYjcCIQW7xDNqMlRReTkDzGFoy3P5aQjMS8gzs,1199
27
+ sage/middleware/components/sage_tsdb/python/algorithms/out_of_order_join.py,sha256=UV1l_B_oqdEYIb2njjjK8CcIir7Od-gB5RlCB7MYs3Y,8295
28
+ sage/middleware/components/sage_tsdb/python/algorithms/window_aggregator.py,sha256=hy8QIJVe8oI5_PCfVP1DOWvE_SIFvJvJ0qG_tb-U88w,10120
29
+ sage/middleware/components/sage_tsdb/python/micro_service/__init__.py,sha256=NPeT85nf9EHX4Feb2ITuAPRwp4NfcBOhbl0xiCekul4,169
30
+ sage/middleware/components/sage_tsdb/python/micro_service/sage_tsdb_service.py,sha256=w0jTnQkZzbpmBe9CywI9MGyexmIWguNa6x2euutl85Y,11356
31
+ sage/middleware/components/vector_stores/__init__.py,sha256=T97vJljRHvFjdEkU0vSUJyYF4VYLseoRBNVI5QR1wpE,809
32
+ sage/middleware/components/vector_stores/chroma.py,sha256=Xu5q3eMIup0CmexR1QnLV0amnQq6gcoMDgU3ucUKGZk,16298
33
+ sage/middleware/components/vector_stores/chroma_adapter.py,sha256=1VWf4jIksWsrBuscMZn6M8idMJUZ05DLlu0-4dIF3g8,5893
34
+ sage/middleware/components/vector_stores/milvus.py,sha256=vosZkNJVFerouv4mJm7I7_Kj0OVjVTjnXvpfTLgKfYo,26260
35
+ sage/middleware/operators/__init__.py,sha256=GrbDf99fsYzzaCQRaydi86g5pkPvvv697u1I3RCOGI4,1806
36
+ sage/middleware/operators/agent/__init__.py,sha256=F_2sQJNfCff6HhObi8WVjSwjzjNVAg1xIK4EZjYZFS0,607
37
+ sage/middleware/operators/agent/runtime.py,sha256=QLY2gu7eeTaBeXPOPFpljKSe-Y2U8mqXQeo41-0SLr8,11276
38
+ sage/middleware/operators/agent/planning/__init__.py,sha256=-b6-ti_HI8wfHvSTAurwMXXX8ARG0RL0_AfIPnizrJE,219
39
+ sage/middleware/operators/agent/planning/llm_adapter.py,sha256=sWLqglPfZSa9awXBopDJpYNNKiGeWupk6C78ZtwtqXY,1445
40
+ sage/middleware/operators/agent/planning/planner_adapter.py,sha256=ga_5K8et_1c5aOvhgpt2eirBMxKOrkzeBCf-klwMphE,3557
41
+ sage/middleware/operators/agent/planning/router.py,sha256=mW6Um0tk4-t9QnDSY-daObUHGK9Iyt8a5VCAzKyP41U,4220
42
+ sage/middleware/operators/agentic/__init__.py,sha256=LCUGAMu4pNtoH9PcpvgCpS4kzngj1xFdxitTsFlZEho,1303
43
+ sage/middleware/operators/agentic/config.py,sha256=Bj8NmW8pHOp3r4SaFdq8AkLJJ2zQY9CGTeXlwmZXLOc,7804
44
+ sage/middleware/operators/agentic/planning_operator.py,sha256=RZLoCGq9d1WjerH3Xty2MmVciiSHbPW5rDCY2jZHAVw,4068
45
+ sage/middleware/operators/agentic/refined_searcher.py,sha256=8VZGqDo83GqqBT_p3HdhDPYpweKG4WmWAxAbQY7zOEg,4961
46
+ sage/middleware/operators/agentic/runtime.py,sha256=9DjQGEqsEYZhaz3uLYCAfrsJSBHBkMlcCEg6qFmTxkc,8590
47
+ sage/middleware/operators/agentic/timing_operator.py,sha256=fmoMee8WI547dvmukwpceQKXYSETS9ILonRtW4dhKME,4138
48
+ sage/middleware/operators/agentic/tool_selection_operator.py,sha256=GlyqGc59zpDk7fw3TIVZN9bM4LYPUBFfVmvjQdCxW7A,4298
49
+ sage/middleware/operators/context/__init__.py,sha256=QReFA5qvVeKv3nRsoj8xyJHtvNQVSaAvnqTaXE0Ax4A,660
50
+ sage/middleware/operators/context/critic_evaluation.py,sha256=t6d4Kb_WpOIK8ADf-eIT5ocL-aOHcNLN3J0A-kGdBU4,419
51
+ sage/middleware/operators/context/model_context.py,sha256=gjKykFuy5Gnh9CiYc21ezv3ymVxQ36TeiLC8vJuJKis,23241
52
+ sage/middleware/operators/context/quality_label.py,sha256=tJlkK-LwTP5GbhpE_T-2ufM82kwuymd-TyY-Xj9iNHk,362
53
+ sage/middleware/operators/context/search_query_results.py,sha256=EZkhBoCwHj_7yvRhALnSG0U9h2y52LP4fBL52MNWyoc,2316
54
+ sage/middleware/operators/context/search_result.py,sha256=nOl3KpvnFx7wdJUxooTNEU-x3XWE3kPe1_0-B2ZAjGc,1326
55
+ sage/middleware/operators/context/search_session.py,sha256=cElX3KpwXs58CnQImuxxA8XgzCPPtd1HUFSoSXeqvm4,3138
56
+ sage/middleware/operators/filters/__init__.py,sha256=k5V5EMjWNXxi7XkKfnuv6IK9MTOZRM3QOnPHulGbzfI,689
57
+ sage/middleware/operators/filters/context_sink.py,sha256=mdnrExkaW1aTu-oMYivm6U1pF6hECgZiy7hUVWoGcR4,15274
58
+ sage/middleware/operators/filters/context_source.py,sha256=GgqnBCorU-_NqKl7s8tOY264SCiM00BLqr_5o1ENGTk,13238
59
+ sage/middleware/operators/filters/evaluate_filter.py,sha256=EntVTZ7RYXCPL-vXpMZrUGcZxA37jJvq3gYOMHzpHj4,2693
60
+ sage/middleware/operators/filters/tool_filter.py,sha256=wgODlItxK8RFPqIr6mnzGUL_WWw0CX6Y5mvIeMCjhq0,2354
61
+ sage/middleware/operators/llm/__init__.py,sha256=SuL-rKzWyElGjeQiz_C2xaD2gb1F90hyL1ko4BgUiEw,543
62
+ sage/middleware/operators/llm/sagellm_generator.py,sha256=PpEitNvVsIvKs9iS-QHPGImg85HHg9ELWlRn7gJRePo,15719
63
+ sage/middleware/operators/rag/__init__.py,sha256=MbkM0FOt1EUG12vs6mMueFGna9DfDjYhAZKpNCxdkoQ,5762
64
+ sage/middleware/operators/rag/arxiv.py,sha256=G3a74WWFxrsZmUT-wkWt4NXFxIa3-KELJr0HrS8eyU0,14404
65
+ sage/middleware/operators/rag/chunk.py,sha256=dh3Feu52H1pGa0xYzurBLXC9PRf8osZ6ehUh5rnNjeY,435
66
+ sage/middleware/operators/rag/document_loaders.py,sha256=ahfpEHMeiZmAjShizoiBCIFo6DhUHnAv8VPJzOI4pIA,496
67
+ sage/middleware/operators/rag/evaluate.py,sha256=pnToHK3T5OK6lug4CuMrCIkrr9pPIB6cPW3jEcg21lw,22319
68
+ sage/middleware/operators/rag/generator.py,sha256=hqaSD_SpLBb3v2zpKGRNsxHAUWUb5jc8RjreaTw8j_k,11887
69
+ sage/middleware/operators/rag/pipeline.py,sha256=sX_GPuY9AZbuetU62k8LAaD-ZZqThZZS0cBequHg32Q,1441
70
+ sage/middleware/operators/rag/profiler.py,sha256=iQGVoZS7aA3pSV7wuTH3qLggREnUQvadSYqpx6YPaxc,2138
71
+ sage/middleware/operators/rag/promptor.py,sha256=m38jRBUwkF7cYqwWu09B9c63e3Ho2QRlhGDNnkZFa74,15695
72
+ sage/middleware/operators/rag/refiner.py,sha256=Gd85_TS6HxXp6ENPQTzeLKeO-w0TBsYg0ytDOOE_fOY,8270
73
+ sage/middleware/operators/rag/reranker.py,sha256=m5wTeOZTs_PFTjgSPdVsYP-YBIYvBlZXRaFNpG-4ImQ,14501
74
+ sage/middleware/operators/rag/retriever.py,sha256=gwFwXUfVtMnBzzVLT6rrdvzolFmo0SrUVT-EHJHXCeg,49856
75
+ sage/middleware/operators/rag/searcher.py,sha256=ahdA8lUp0sThtR55-6gNwD4o-ukCMz6EyLMFGEEhkM4,1261
76
+ sage/middleware/operators/rag/types.py,sha256=11jfviVUWddDW0rVaaGXk2Fe5bnmv2k2kzIzS5oB-Lo,530
77
+ sage/middleware/operators/rag/writer.py,sha256=rq9j0_Fb6693xWDhZCyRhex-mme_Mu5hgWj7ZXE15k0,3374
78
+ sage/middleware/operators/rag/index_builder/__init__.py,sha256=b2RHIM-ob4ufhEwlaJ8qTjABRKrLn_vikZLwIb5Q7Sg,1617
79
+ sage/middleware/operators/rag/index_builder/builder.py,sha256=btE1u_-9DHjf6h0XzzAfbeNHCRBuFGFw86FIsEnxBxM,13058
80
+ sage/middleware/operators/rag/index_builder/manifest.py,sha256=Fur4n5rLy11mn1cb2NOvxVUdWb0k-F0qwsrgmD3MF3g,3476
81
+ sage/middleware/operators/rag/index_builder/storage.py,sha256=x0LRyRXkYpVi86U2gJ9LDAjnPf79Jx0C-NaBRr3Dzvk,4044
82
+ sage/middleware/operators/tools/__init__.py,sha256=t_UD661nXFUuKOeOFP-fn7AxTR7wBbu4FGyg-NFUbkA,2320
83
+ sage/middleware/operators/tools/arxiv_paper_searcher.py,sha256=PKhUfko1r_56n2kAjfUPw7jMiF9bcg5hRxgxjawyrnY,6339
84
+ sage/middleware/operators/tools/arxiv_searcher.py,sha256=U-yujbcXCAsJ1QZhozidYrsb5AJszGlUYQKs8ww8pZM,3422
85
+ sage/middleware/operators/tools/duckduckgo_searcher.py,sha256=j0vtY_T8xtg6usC9hcRf5cyrZYMRH-HLjt1I9nZ_ZmM,3499
86
+ sage/middleware/operators/tools/image_captioner.py,sha256=ql44Lmvr88lmXgkR9vO-Gh1GAmtU_fEYXQC26-B7KSM,4586
87
+ sage/middleware/operators/tools/nature_news_fetcher.py,sha256=_muGIZnPBeSpboWQM8xKt1bi8r2SyPIdWD7-1sqE2Xc,8369
88
+ sage/middleware/operators/tools/searcher_tool.py,sha256=fqWgJ_YnfO6F6vXEm-F0JgmaXwHDjyQT0zYwFfytRao,19534
89
+ sage/middleware/operators/tools/text_detector.py,sha256=xmpePKVxjU66y9WWM78eheJMyY9pDBh3xMRW11t4sPc,6643
90
+ sage/middleware/operators/tools/url_text_extractor.py,sha256=OAmkTbLUt2vFDuNEGwOKhtjpRwtk6hwm8n2SiNpyDR4,3281
91
+ isage_middleware-0.2.4.3.dist-info/METADATA,sha256=6d5i6ovLU6ZH3VTVR_XRqH90HqWG94Ay0uYz7mQtLbw,10225
92
+ isage_middleware-0.2.4.3.dist-info/WHEEL,sha256=ZJeWpR6hcCRGwxVKXlDk-HsGwijNyTq4fszaDj4Ycyo,93
93
+ isage_middleware-0.2.4.3.dist-info/top_level.txt,sha256=hibFyzQHiLOMK68qL1OWsNKaXOmSXqZjeLTBem6Yy7I,5
94
+ isage_middleware-0.2.4.3.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (73.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: cp311-none-any
5
+
@@ -0,0 +1 @@
1
+ sage
@@ -0,0 +1,59 @@
1
+ """
2
+ SAGE Middleware - 中间件和领域算子层
3
+
4
+ Layer: L4 (Domain Components)
5
+ Dependencies: sage.libs (L3), sage.kernel (L3), sage.platform (L2), sage.common (L1)
6
+
7
+ 提供:
8
+ - 领域算子:
9
+ * RAG operators: 检索增强生成 (pipeline, retriever, generator, profiler, document_loaders)
10
+ * RAG backends: 向量数据库集成 (Milvus, Chroma)
11
+ * LLM operators: 大语言模型算子
12
+ * LLM clients: LLM服务客户端 (OpenAI, HuggingFace)
13
+ * Tool operators: 领域工具 (arxiv_searcher, image_captioner, nature_news等)
14
+ * Filters: 业务过滤器 (tool_filter, evaluate_filter, context_source/sink)
15
+ - 业务上下文:Agent/RAG workflow 上下文管理 (ModelContext, SearchSession等)
16
+ - 中间件组件:
17
+ * sage_db: 数据库抽象
18
+ * sage_mem: 内存管理和缓存
19
+ * sage_refiner: 数据精炼工具 (仅保留service层,算法已下移到sage.libs.context.compression)
20
+ * sage_flow: 工作流编排
21
+ * sage_tsdb: 时序数据库
22
+
23
+ Architecture:
24
+ - L4 层提供领域特定的功能组件
25
+ - 依赖 L1-L3 的基础设施、核心引擎和通用算法
26
+ - 为 L5 (应用层) 提供可复用的领域组件
27
+ - 包含各种中间件和高级算子实现
28
+
29
+ 子模块:
30
+ - operators/: 领域算子
31
+ * rag/: RAG operators + backends (Milvus, Chroma)
32
+ * llm/: LLM operators + clients (OpenAI, HuggingFace)
33
+ * tools/: 领域特定工具
34
+ * filters/: 业务过滤器
35
+ - context/: Agent/RAG业务上下文 (从sage.libs迁移)
36
+ - components/: 中间件组件(DB, Memory, Refiner等)
37
+ """
38
+
39
+ # 直接从本包的_version模块加载版本信息
40
+ try:
41
+ from sage.middleware._version import __author__, __email__, __version__
42
+ except ImportError:
43
+ # 备用硬编码版本
44
+ __version__ = "0.1.4"
45
+ __author__ = "IntelliStream Team"
46
+ __email__ = "shuhao_zhang@hust.edu.cn"
47
+
48
+ # 导出子模块
49
+ __layer__ = "L4"
50
+
51
+ from . import components, operators
52
+
53
+ __all__ = [
54
+ "__version__",
55
+ "__author__",
56
+ "__email__",
57
+ "operators",
58
+ "components",
59
+ ]
@@ -0,0 +1,6 @@
1
+ """Version information for sage-middleware package."""
2
+
3
+ # 独立硬编码版本
4
+ __version__ = "0.2.4.3"
5
+ __author__ = "IntelliStream Team"
6
+ __email__ = "shuhao_zhang@hust.edu.cn"
@@ -0,0 +1,30 @@
1
+ """
2
+ SAGE Middleware Components
3
+
4
+ Core middleware components including databases, flow engines, and other services.
5
+
6
+ Note: sage_refiner has been migrated to the independent isage-refiner package.
7
+ Install with: pip install isage-refiner
8
+ Use: from sage_refiner import LongRefinerCompressor
9
+ """
10
+
11
+ # Lazy imports to avoid loading heavy dependencies (FAISS, etc.) at module load time
12
+ from . import sage_db, sage_flow, sage_sias, sage_tsdb
13
+ from .extensions_compat import * # noqa: F403
14
+
15
+ # Import sage_mem - it's a namespace package that handles its own lazy loading
16
+ try:
17
+ from . import sage_mem
18
+ except ImportError:
19
+ # sage_mem namespace package might not be available
20
+ sage_mem = None
21
+
22
+
23
+ __all__ = [
24
+ "sage_db",
25
+ "sage_flow",
26
+ "sage_mem",
27
+ "sage_sias",
28
+ "sage_tsdb",
29
+ "extensions_compat",
30
+ ]
@@ -0,0 +1,141 @@
1
+ """
2
+ SAGE Middleware Components - 运行时兼容性检测
3
+
4
+ 此模块处理C++扩展的可选导入,提供优雅的降级机制。
5
+ C++扩展模块(_sage_flow)在未编译时可能不存在,
6
+ 此模块确保在扩展不可用时也能正常导入和运行。
7
+
8
+ 注意:
9
+ - SageVDB 已独立为 PyPI 包 (PyPI: isage-vdb, Python: sagevdb),不再作为 SAGE C++ 扩展。
10
+ - SageTSDB 已独立为 PyPI 包 (isage-tsdb),不再作为 SAGE C++ 扩展。
11
+ """
12
+
13
+ from typing import TYPE_CHECKING, Any
14
+
15
+ # 类型检查时导入,运行时通过try/except处理
16
+ if TYPE_CHECKING:
17
+ # 当扩展编译可用时,这些导入会成功
18
+ # stub文件(.pyi)提供类型提示
19
+ from sage.middleware.components.sage_flow.python import sage_flow as _sage_flow
20
+ else:
21
+ # 运行时动态导入,优雅处理缺失的扩展
22
+ _sage_flow: Any = None
23
+
24
+ # 尝试导入C++扩展,失败时使用纯Python实现
25
+ _SAGE_DB_AVAILABLE = False # 通过 isage-vdb 包检测 (Python: sagevdb)
26
+ _SAGE_FLOW_AVAILABLE = False
27
+ _SAGE_TSDB_AVAILABLE = False # 通过 isage-tsdb 包检测
28
+
29
+ if not TYPE_CHECKING:
30
+ # SageVDB 现在是独立的 PyPI 包 (PyPI: isage-vdb, Python: sagevdb)
31
+ try:
32
+ import sagevdb # noqa: F401
33
+
34
+ _SAGE_DB_AVAILABLE = True
35
+ except ImportError:
36
+ # Don't warn on import - only when trying to use the feature
37
+ pass
38
+
39
+ try:
40
+ # 只导入 Python wrapper 模块,避免重复加载 C++ 扩展
41
+ from sage.middleware.components.sage_flow.python import sage_flow as _sage_flow
42
+
43
+ _SAGE_FLOW_AVAILABLE = True
44
+ except ImportError:
45
+ _sage_flow = None
46
+ # Don't warn on import - only when trying to use the feature
47
+ pass
48
+
49
+ # SageTSDB 现在是独立的 PyPI 包
50
+ try:
51
+ import sage_tsdb # noqa: F401
52
+
53
+ _SAGE_TSDB_AVAILABLE = True
54
+ except ImportError:
55
+ # Don't warn on import - only when trying to use the feature
56
+ pass
57
+
58
+
59
+ def is_sage_db_available() -> bool:
60
+ """检查SAGE DB扩展是否可用"""
61
+ return _SAGE_DB_AVAILABLE
62
+
63
+
64
+ def is_sage_flow_available() -> bool:
65
+ """检查SAGE Flow扩展是否可用"""
66
+ return _SAGE_FLOW_AVAILABLE
67
+
68
+
69
+ def is_sage_tsdb_available() -> bool:
70
+ """检查SAGE TSDB扩展是否可用"""
71
+ return _SAGE_TSDB_AVAILABLE
72
+
73
+
74
+ def get_extension_status() -> dict:
75
+ """获取所有扩展的状态"""
76
+ return {
77
+ "sage_db": _SAGE_DB_AVAILABLE,
78
+ "sage_flow": _SAGE_FLOW_AVAILABLE,
79
+ "sage_tsdb": _SAGE_TSDB_AVAILABLE,
80
+ "total_available": sum([_SAGE_DB_AVAILABLE, _SAGE_FLOW_AVAILABLE, _SAGE_TSDB_AVAILABLE]),
81
+ "total_extensions": 3,
82
+ }
83
+
84
+
85
+ def check_extensions_availability() -> dict:
86
+ """检查扩展可用性,返回兼容格式用于CI"""
87
+ return {
88
+ "sage_db": _SAGE_DB_AVAILABLE,
89
+ "sage_flow": _SAGE_FLOW_AVAILABLE,
90
+ "sage_tsdb": _SAGE_TSDB_AVAILABLE,
91
+ }
92
+
93
+
94
+ def require_sage_db():
95
+ """要求SageVDB可用,否则抛出异常"""
96
+ if not _SAGE_DB_AVAILABLE:
97
+ raise ImportError(
98
+ "此功能需要 SageVDB。请安装:\n"
99
+ " pip install isage-vdb\n"
100
+ "注意: PyPI 包名是 'isage-vdb',Python 导入名是 'sagevdb'"
101
+ )
102
+ import sagevdb
103
+
104
+ return sagevdb
105
+
106
+
107
+ def require_sage_flow():
108
+ """要求SAGE Flow扩展可用,否则抛出异常"""
109
+ if not _SAGE_FLOW_AVAILABLE:
110
+ raise ImportError(
111
+ "此功能需要SAGE Flow C++扩展。请安装完整版本:\n"
112
+ "pip install --force-reinstall isage-middleware\n"
113
+ "或安装构建依赖后重新安装:\n"
114
+ "Ubuntu/Debian: sudo apt-get install build-essential cmake\n"
115
+ "macOS: brew install cmake"
116
+ )
117
+ return _sage_flow
118
+
119
+
120
+ def require_sage_tsdb():
121
+ """要求SAGE TSDB可用,否则抛出异常"""
122
+ if not _SAGE_TSDB_AVAILABLE:
123
+ raise ImportError("此功能需要 SAGE TSDB。请安装: pip install isage-tsdb")
124
+ import sage_tsdb
125
+
126
+ return sage_tsdb
127
+
128
+
129
+ # 在模块导入时显示状态(仅在明确导入时)
130
+ # 避免在用户导入其他模块时显示无关警告
131
+ if __name__ == "__main__":
132
+ status = get_extension_status()
133
+ if status["total_available"] < status["total_extensions"]:
134
+ print(f"ℹ️ SAGE扩展状态: {status['total_available']}/{status['total_extensions']} 可用")
135
+ if not _SAGE_DB_AVAILABLE:
136
+ print(" ❌ SageVDB: 未安装 (pip install isage-vdb)")
137
+ if not _SAGE_FLOW_AVAILABLE:
138
+ print(" ❌ SAGE Flow: C++扩展不可用")
139
+ if not _SAGE_TSDB_AVAILABLE:
140
+ print(" ❌ SAGE TSDB: 未安装 (pip install isage-tsdb)")
141
+ print(" 💡 提示: 安装相应依赖可启用完整功能")