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,116 @@
1
+ """SageVDB compatibility layer for SAGE.
2
+
3
+ SageVDB has been migrated to an independent PyPI package.
4
+
5
+ Installation:
6
+ pip install isage-vdb
7
+
8
+ This module re-exports SageVDB classes from the sagevdb package
9
+ for backward-compatible import paths within SAGE.
10
+
11
+ Important:
12
+ - PyPI package name: isage-vdb (with hyphen and 'i' prefix)
13
+ - Python import name: sagevdb (no 'i', no hyphen)
14
+
15
+ For detailed migration information, see:
16
+ docs-public/docs_src/dev-notes/cross-layer/sagedb-independence-migration.md
17
+ """
18
+
19
+ import warnings
20
+
21
+ # Re-export everything from sagevdb (Python import name, PyPI: isage-vdb)
22
+ _SAGE_DB_AVAILABLE = False
23
+ try:
24
+ from sagevdb import (
25
+ DatabaseConfig,
26
+ DistanceMetric,
27
+ IndexType,
28
+ MetadataStore,
29
+ QueryEngine,
30
+ QueryResult,
31
+ SageVDB,
32
+ SageVDBException,
33
+ SearchParams,
34
+ SearchStats,
35
+ VectorStore,
36
+ add_numpy,
37
+ create_database,
38
+ distance_metric_to_string,
39
+ index_type_to_string,
40
+ search_numpy,
41
+ string_to_distance_metric,
42
+ string_to_index_type,
43
+ )
44
+
45
+ _SAGE_DB_AVAILABLE = True
46
+ except ImportError as e:
47
+ # Don't warn on import - only when actually trying to use SageVDB
48
+ # Store error message for later use
49
+ _SAGE_DB_IMPORT_ERROR = str(e)
50
+ pass
51
+ # Provide stub exports to prevent ImportError
52
+ SageVDB = None
53
+ IndexType = None
54
+ DistanceMetric = None
55
+ QueryResult = None
56
+ SearchParams = None
57
+ SearchStats = None
58
+ DatabaseConfig = None
59
+ MetadataStore = None
60
+ QueryEngine = None
61
+ VectorStore = None
62
+ SageVDBException = None
63
+ create_database = None
64
+ add_numpy = None
65
+ search_numpy = None
66
+ distance_metric_to_string = None
67
+ index_type_to_string = None
68
+ string_to_distance_metric = None
69
+ string_to_index_type = None
70
+
71
+ # Import backend adapters
72
+ try:
73
+ from .backend import SageVDBBackend # noqa: F401
74
+ except ImportError:
75
+ SageVDBBackend = None
76
+
77
+ __all__ = [
78
+ # Core classes (may be None if not installed)
79
+ "SageVDB",
80
+ "IndexType",
81
+ "DistanceMetric",
82
+ "QueryResult",
83
+ "SearchParams",
84
+ "SearchStats",
85
+ "DatabaseConfig",
86
+ "MetadataStore",
87
+ "QueryEngine",
88
+ "VectorStore",
89
+ "SageVDBException",
90
+ # Factory functions
91
+ "create_database",
92
+ # Numpy utilities
93
+ "add_numpy",
94
+ "search_numpy",
95
+ # Conversion utilities
96
+ "distance_metric_to_string",
97
+ "index_type_to_string",
98
+ "string_to_distance_metric",
99
+ "string_to_index_type",
100
+ # Backend adapters
101
+ "SageVDBBackend",
102
+ # Availability flag
103
+ "_SAGE_DB_AVAILABLE",
104
+ ]
105
+
106
+
107
+ def __getattr__(name):
108
+ """Provide friendly error message when SageVDB is not installed"""
109
+ if name in __all__ and not _SAGE_DB_AVAILABLE:
110
+ raise ImportError(
111
+ f"Cannot import '{name}' from sage.middleware.components.sage_db. "
112
+ "SageVDB is not installed. Please install it using:\n"
113
+ " pip install isage-vdb\n"
114
+ "Note: PyPI package name is 'isage-vdb', Python import name is 'sagevdb'"
115
+ )
116
+ raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
@@ -0,0 +1,136 @@
1
+ """SageVDB Backend Adapter - VectorStore implementation using SageVDB
2
+
3
+ This module provides a VectorStore adapter for SageVDB, enabling it to be used
4
+ with the unified IndexBuilder interface.
5
+
6
+ Layer: L4 (sage-middleware)
7
+ Dependencies: isage-vdb (PyPI package, Python import: sagevdb)
8
+
9
+ SageVDB is now an independent PyPI package. Install with: pip install isage-vdb
10
+ """
11
+
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from sagevdb import SageVDB
16
+
17
+
18
+ class SageVDBBackend:
19
+ """VectorStore adapter for SageVDB (C++ vector database).
20
+
21
+ This class wraps SageVDB to conform to the VectorStore Protocol,
22
+ enabling it to be used with IndexBuilder via dependency injection.
23
+
24
+ Architecture:
25
+ - Implements VectorStore Protocol from L3 (sage-libs)
26
+ - Uses SageVDB from isage-vdb (PyPI package, Python: sagevdb)
27
+ - Injected into IndexBuilder by L5 (sage-cli)
28
+
29
+ Example:
30
+ >>> from sage.libs.rag.index_builder import IndexBuilder
31
+ >>> from sage.middleware.components.sage_db import SageVDBBackend
32
+ >>>
33
+ >>> def factory(path: Path, dim: int):
34
+ ... return SageVDBBackend(path, dim)
35
+ >>>
36
+ >>> builder = IndexBuilder(backend_factory=factory)
37
+ """
38
+
39
+ def __init__(self, persist_path: Path, dim: int):
40
+ """Initialize SageVDB backend.
41
+
42
+ Args:
43
+ persist_path: Path where index will be saved
44
+ dim: Vector dimension
45
+ """
46
+ self.db = SageVDB(dim)
47
+ self.persist_path = persist_path
48
+ self.dim = dim
49
+ self._count = 0
50
+
51
+ def add(self, vector: list[float], metadata: dict[str, Any]) -> None:
52
+ """Add vector with metadata to SageVDB.
53
+
54
+ Args:
55
+ vector: Dense vector embedding
56
+ metadata: Associated metadata
57
+ """
58
+ self.db.add(vector, metadata)
59
+ self._count += 1
60
+
61
+ def build_index(self) -> None:
62
+ """Build SageVDB index for efficient search."""
63
+ self.db.build_index()
64
+
65
+ def save(self, path: str) -> None:
66
+ """Persist SageVDB index to disk.
67
+
68
+ Args:
69
+ path: Absolute path to save location
70
+ """
71
+ self.db.save(path)
72
+
73
+ def load(self, path: str) -> None:
74
+ """Load SageVDB index from disk.
75
+
76
+ Args:
77
+ path: Absolute path to load from
78
+ """
79
+ self.db.load(path)
80
+
81
+ def search(
82
+ self,
83
+ query_vector: list[float],
84
+ top_k: int = 5,
85
+ filter_metadata: dict[str, Any] | None = None,
86
+ ) -> list[dict[str, Any]]:
87
+ """Search for nearest neighbors in SageVDB.
88
+
89
+ Args:
90
+ query_vector: Query embedding
91
+ top_k: Number of results to return
92
+ filter_metadata: Optional metadata filters
93
+
94
+ Returns:
95
+ List of search results with metadata and scores
96
+ """
97
+ # SageVDB search returns QueryResult objects
98
+ results = self.db.search(query_vector, top_k=top_k)
99
+
100
+ # Convert to standard format
101
+ formatted_results = []
102
+ for result in results:
103
+ formatted_results.append(
104
+ {
105
+ "vector": result.vector,
106
+ "metadata": result.metadata,
107
+ "score": result.distance, # or result.score
108
+ "id": result.id,
109
+ }
110
+ )
111
+
112
+ # Apply metadata filter if provided
113
+ if filter_metadata:
114
+ formatted_results = [
115
+ r
116
+ for r in formatted_results
117
+ if all(r["metadata"].get(k) == v for k, v in filter_metadata.items())
118
+ ]
119
+
120
+ return formatted_results
121
+
122
+ def get_dim(self) -> int:
123
+ """Get vector dimension.
124
+
125
+ Returns:
126
+ Vector dimension
127
+ """
128
+ return self.dim
129
+
130
+ def count(self) -> int:
131
+ """Get total number of vectors.
132
+
133
+ Returns:
134
+ Total vector count
135
+ """
136
+ return self._count
@@ -0,0 +1,15 @@
1
+ """
2
+ SageDB Middleware Service
3
+
4
+ This module provides the middleware service interface for SageDB,
5
+ wrapping the Python bindings from the sageDB C++ core.
6
+ """
7
+
8
+ # Micro-service wrapper
9
+ from .python.micro_service.sage_db_service import SageDBService, SageDBServiceConfig
10
+ from .python.multimodal_sage_db import MultimodalSageDB
11
+
12
+ # Core Python bindings
13
+ from .python.sage_db import SageDB
14
+
15
+ __all__ = ["SageDB", "MultimodalSageDB", "SageDBService", "SageDBServiceConfig"]
@@ -0,0 +1,76 @@
1
+ """SageFlow compatibility layer for SAGE.
2
+
3
+ SageFlow has been migrated to an independent PyPI package.
4
+
5
+ Installation:
6
+ pip install isage-flow
7
+
8
+ This module re-exports SageFlow classes from the isage-flow package
9
+ for backward-compatible import paths within SAGE, and provides
10
+ SAGE-specific services and wrappers.
11
+
12
+ For detailed migration information, see:
13
+ docs-public/docs_src/dev-notes/cross-layer/sageflow-independence-migration.md
14
+ """
15
+
16
+ import warnings
17
+
18
+ # Import from PyPI package (isage-flow)
19
+ _SAGE_FLOW_AVAILABLE = False
20
+ try:
21
+ from sage_flow import (
22
+ DataType,
23
+ SimpleStreamSource,
24
+ Stream,
25
+ StreamEnvironment,
26
+ VectorData,
27
+ VectorRecord,
28
+ __author__,
29
+ __email__,
30
+ __version__,
31
+ )
32
+
33
+ _SAGE_FLOW_AVAILABLE = True
34
+ except ImportError as e:
35
+ # Don't fail immediately - allow graceful degradation
36
+ warnings.warn(
37
+ f"SAGE Flow not available: {e}\n"
38
+ "Install with: pip install isage-flow\n"
39
+ "Some advanced streaming features will be unavailable.",
40
+ UserWarning,
41
+ stacklevel=2,
42
+ )
43
+ # Provide stub exports to prevent ImportError
44
+ DataType = None
45
+ SimpleStreamSource = None
46
+ Stream = None
47
+ StreamEnvironment = None
48
+ VectorData = None
49
+ VectorRecord = None
50
+ __version__ = "unavailable"
51
+ __author__ = "IntelliStream Team"
52
+ __email__ = "shuhao_zhang@hust.edu.cn"
53
+
54
+ # SAGE-specific services (kept in SAGE repo)
55
+ # Only import if sage_flow is available
56
+ if _SAGE_FLOW_AVAILABLE:
57
+ from .python.micro_service.sage_flow_service import SageFlowService
58
+ else:
59
+ SageFlowService = None
60
+
61
+ __all__ = [
62
+ # Core API from isage-flow (may be None if not installed)
63
+ "StreamEnvironment",
64
+ "Stream",
65
+ "SimpleStreamSource",
66
+ "VectorData",
67
+ "VectorRecord",
68
+ "DataType",
69
+ "__version__",
70
+ "__author__",
71
+ "__email__",
72
+ # SAGE-specific services (may be None if isage-flow not installed)
73
+ "SageFlowService",
74
+ # Availability flag
75
+ "_SAGE_FLOW_AVAILABLE",
76
+ ]
@@ -0,0 +1,14 @@
1
+ """Python bindings and wrappers for SAGE-Flow live here.
2
+
3
+ This package is intended to house all Python-side modules for the component.
4
+ """
5
+
6
+ # Try to import the C++ extension module
7
+ # If this fails, sage_flow.py will handle the fallback logic
8
+ try:
9
+ from . import _sage_flow # noqa: F401 # type: ignore[import-not-found]
10
+
11
+ __all__ = ["_sage_flow"]
12
+ except ImportError:
13
+ # sage_flow.py will handle finding and importing the .so file
14
+ __all__ = []
@@ -0,0 +1,4 @@
1
+ # Expose SageFlowService from submodule
2
+ from .sage_flow_service import SageFlowService
3
+
4
+ __all__ = ["SageFlowService"]
@@ -0,0 +1,88 @@
1
+ from __future__ import annotations
2
+
3
+ import queue
4
+ import threading
5
+ import time
6
+ from dataclasses import dataclass
7
+
8
+ import numpy as np
9
+
10
+ from sage.middleware.components.sage_flow.python.sage_flow import (
11
+ SimpleStreamSource,
12
+ StreamEnvironment,
13
+ )
14
+
15
+
16
+ @dataclass
17
+ class _Record:
18
+ uid: int
19
+ vec: np.ndarray
20
+
21
+
22
+ class SageFlowService:
23
+ """
24
+ A minimal micro-service wrapper for SAGE-Flow used by examples.
25
+
26
+ - push(uid, vec): enqueue vector for processing
27
+ - run(): drain queue, feed to flow, and execute once
28
+ """
29
+
30
+ def __init__(self, dim: int = 4, dtype: str = "Float32") -> None:
31
+ self.dim = dim
32
+ self.dtype = dtype
33
+ self._q: queue.Queue[_Record] = queue.Queue()
34
+ self._env = StreamEnvironment()
35
+ self._source = SimpleStreamSource("sage_flow_service_source")
36
+ self._lock = threading.Lock()
37
+ self._added_to_env = False
38
+ # Note: don't add to env yet; defer until a sink is attached
39
+
40
+ # API expected by examples
41
+ def push(self, uid: int, vec: np.ndarray) -> None:
42
+ if not isinstance(vec, np.ndarray):
43
+ vec = np.asarray(vec, dtype=np.float32)
44
+ vec = vec.astype(np.float32, copy=False)
45
+ if vec.ndim != 1 or vec.shape[0] != self.dim:
46
+ raise ValueError(f"vector shape must be ({self.dim},)")
47
+ self._q.put(_Record(uid=int(uid), vec=vec))
48
+
49
+ def run(self) -> None:
50
+ # Drain queue into source, then execute once
51
+ drained = 0
52
+ with self._lock:
53
+ while True:
54
+ try:
55
+ rec = self._q.get_nowait()
56
+ except queue.Empty:
57
+ break
58
+ ts = int(time.time() * 1000)
59
+ self._source.addRecord(rec.uid, ts, rec.vec)
60
+ drained += 1
61
+ if drained:
62
+ # If user hasn't attached sinks, add source to env once so execution proceeds
63
+ if not self._added_to_env:
64
+ # Attach a default printing sink for visibility
65
+ self._source.write_sink_py(
66
+ "default_print_sink",
67
+ lambda uid, ts: print(f"[svc sink] uid={uid}, ts={ts}", flush=True),
68
+ )
69
+ self._env.addStream(self._source)
70
+ self._added_to_env = True
71
+ self._env.execute()
72
+
73
+ def set_sink(self, callback, name: str = "py_sink") -> None:
74
+ """Attach a Python sink callback for visible outputs.
75
+
76
+ Args:
77
+ callback: Callable taking (uid: int, ts: int)
78
+ name: Sink name, defaults to 'py_sink'.
79
+ """
80
+ self._source.write_sink_py(name, callback)
81
+ if not self._added_to_env:
82
+ self._env.addStream(self._source)
83
+ self._added_to_env = True
84
+
85
+ # Optional: expose environment for advanced integrations
86
+ @property
87
+ def env(self) -> StreamEnvironment:
88
+ return self._env
@@ -0,0 +1,30 @@
1
+ """
2
+ SAGE Flow - High-performance vector stream processing engine (Python wrapper)
3
+
4
+ This module re-exports SageFlow classes from the isage-flow PyPI package.
5
+ """
6
+
7
+ # Re-export all classes from isage-flow
8
+ from sage_flow import (
9
+ DataType,
10
+ SimpleStreamSource,
11
+ Stream,
12
+ StreamEnvironment,
13
+ VectorData,
14
+ VectorRecord,
15
+ __author__,
16
+ __email__,
17
+ __version__,
18
+ )
19
+
20
+ __all__ = [
21
+ "__version__",
22
+ "__author__",
23
+ "__email__",
24
+ "StreamEnvironment",
25
+ "Stream",
26
+ "SimpleStreamSource",
27
+ "VectorData",
28
+ "VectorRecord",
29
+ "DataType",
30
+ ]
@@ -0,0 +1,14 @@
1
+ """
2
+ SageFlow Middleware Service
3
+
4
+ This module provides the middleware service interface for SageFlow,
5
+ wrapping the Python bindings from the sageFlow C++ core.
6
+ """
7
+
8
+ # Micro-service wrapper
9
+ from .python.micro_service.sage_flow_service import SageFlowService
10
+
11
+ # Core Python bindings
12
+ from .python.sage_flow import SageFlow
13
+
14
+ __all__ = ["SageFlow", "SageFlowService"]
@@ -0,0 +1,83 @@
1
+ """
2
+ SAGE-Mem: Memory Management Component for SAGE
3
+
4
+ Provides memory management capabilities for RAG applications.
5
+ This is a namespace package that can contain multiple memory implementations:
6
+ - neuromem: Brain-inspired memory system (from isage-neuromem package)
7
+ - future implementations can be added here
8
+
9
+ Usage:
10
+ # Method 1: Import from neuromem subpackage (recommended)
11
+ from sage.middleware.components.sage_mem.neuromem import MemoryManager
12
+
13
+ # Method 2: Convenience imports from sage_mem root (if neuromem is installed)
14
+ from sage.middleware.components.sage_mem import MemoryManager
15
+ """
16
+
17
+ # This is a namespace package - allow subpackages from different distributions
18
+ __path__ = __import__("pkgutil").extend_path(__path__, __name__)
19
+
20
+ # Convenience re-exports from neuromem (optional, requires isage-neuromem installed)
21
+ # These are lazy-loaded to avoid import errors if neuromem is not installed
22
+ _NEUROMEM_AVAILABLE = False
23
+
24
+ try:
25
+ # Try to import from the neuromem subpackage first (supports namespace merging)
26
+ from sage.middleware.components.sage_mem.neuromem import (
27
+ BaseMemoryCollection,
28
+ GraphMemoryCollection,
29
+ KVMemoryCollection,
30
+ MemoryManager,
31
+ VDBMemoryCollection,
32
+ )
33
+
34
+ try:
35
+ from sage.middleware.components.sage_mem.neuromem.services import (
36
+ BaseMemoryService,
37
+ MemoryServiceRegistry,
38
+ NeuromemServiceFactory,
39
+ )
40
+ except ImportError:
41
+ # Services might not be available in all neuromem versions
42
+ pass
43
+
44
+ # SimpleGraphIndex is in search_engine, not memory_collection
45
+ try:
46
+ from sage.middleware.components.sage_mem.neuromem.search_engine.graph_index import (
47
+ SimpleGraphIndex,
48
+ )
49
+ except ImportError:
50
+ SimpleGraphIndex = None
51
+
52
+ __all__ = [
53
+ # Core neuromem components
54
+ "MemoryManager",
55
+ "BaseMemoryCollection",
56
+ "VDBMemoryCollection",
57
+ "KVMemoryCollection",
58
+ "GraphMemoryCollection",
59
+ # Services (if available)
60
+ "BaseMemoryService",
61
+ "MemoryServiceRegistry",
62
+ "NeuromemServiceFactory",
63
+ ]
64
+
65
+ if SimpleGraphIndex is not None:
66
+ __all__.append("SimpleGraphIndex")
67
+
68
+ _NEUROMEM_AVAILABLE = True
69
+
70
+ except (ImportError, FileNotFoundError, ModuleNotFoundError):
71
+ # Neuromem not installed - provide helpful error message via __getattr__
72
+ def __getattr__(name):
73
+ """Provide friendly error message when neuromem is not installed"""
74
+ raise ImportError(
75
+ f"Cannot import '{name}' from sage.middleware.components.sage_mem. "
76
+ "NeuroMem is not installed. Please install it using:\n"
77
+ " pip install isage-neuromem\n"
78
+ "or install sage-middleware with neuromem support:\n"
79
+ " pip install isage-middleware[neuromem]"
80
+ )
81
+
82
+ __all__ = []
83
+ _NEUROMEM_AVAILABLE = False
@@ -0,0 +1,59 @@
1
+ """SIAS - Streaming Importance-Aware Agent System.
2
+
3
+ This middleware component provides sample importance and continual learning
4
+ capabilities for agent systems. It integrates with NeuroMem for memory-based
5
+ importance scoring and experience replay.
6
+
7
+ Core Components:
8
+ - CoresetSelector: Importance-aware sample selection (loss_topk, diversity, hybrid)
9
+ - OnlineContinualLearner: Experience replay with importance weighting
10
+ - SelectionSummary: Statistics for selection operations
11
+
12
+ Usage:
13
+ from sage.middleware.components.sage_sias import (
14
+ CoresetSelector,
15
+ OnlineContinualLearner,
16
+ SelectionSummary,
17
+ )
18
+
19
+ # Coreset selection
20
+ selector = CoresetSelector(strategy="hybrid")
21
+ selected = selector.select(samples, target_size=1000)
22
+
23
+ # Continual learning with replay
24
+ learner = OnlineContinualLearner(buffer_size=2048, replay_ratio=0.25)
25
+ batch = learner.update_buffer(new_samples)
26
+
27
+ Future Components (planned):
28
+ - StreamingImportanceScorer: I(x) = α·L_grad + β·D_ctx + γ·T_exec
29
+ - ReflectiveMemoryStore: Experience storage with pattern extraction (uses NeuroMem)
30
+ - AdaptiveExecutor: Pre/post verification and localized replanning
31
+ - MultiAgentRouter: Task decomposition and agent collaboration
32
+
33
+ Note:
34
+ SIAS is placed in sage-middleware (L4) rather than sage-libs (L3) because
35
+ it depends on NeuroMem memory system and potentially SageVDB for
36
+ importance-based retrieval.
37
+ """
38
+
39
+ from sage.middleware.components.sage_sias.continual_learner import (
40
+ OnlineContinualLearner,
41
+ )
42
+ from sage.middleware.components.sage_sias.coreset_selector import (
43
+ CoresetSelector,
44
+ SelectionSummary,
45
+ )
46
+ from sage.middleware.components.sage_sias.types import (
47
+ SampleProtocol,
48
+ SIASSample,
49
+ )
50
+
51
+ __all__ = [
52
+ # Core components
53
+ "CoresetSelector",
54
+ "OnlineContinualLearner",
55
+ "SelectionSummary",
56
+ # Types
57
+ "SIASSample",
58
+ "SampleProtocol",
59
+ ]