Skip to content

Commit c5d4e48

Browse files
author
Ismael Marchi
committed
feat: llamaindex integration — sovereign retrieval and chat store
- SynapseRetriever implements BaseRetriever (sync + async) - SynapseChatStore implements BaseChatStore with full CRUD - trust_quotient maps to LlamaIndex NodeWithScore.score - All messages route through Cognitive Security pipeline - 39 tests (395 total), 92% coverage - Optional dep: pip install synapse-layer[llamaindex] - CI updated: installs [dev,langchain,crewai,autogen,llamaindex]
1 parent 12a344b commit c5d4e48

7 files changed

Lines changed: 852 additions & 3 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
- name: Install dependencies
2525
run: |
2626
python -m pip install --upgrade pip
27-
pip install -e ".[dev,langchain,crewai,autogen]"
27+
pip install -e ".[dev,langchain,crewai,autogen,llamaindex]"
2828
2929
- name: Run tests with coverage
3030
run: |

README.md

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,42 @@ invocation — relevant memories are injected as system context, no glue code ne
309309
> strategies, and PRO heuristics are available under separate license.
310310
> See [synapselayer.org/docs](https://synapselayer.org/docs).
311311
312+
## 🔍 Using Synapse Layer with LlamaIndex
313+
314+
Synapse Layer enables LlamaIndex agents to have a sovereign, encrypted
315+
memory that survives across indexes and query engines. Two adapters
316+
are provided: **SynapseRetriever** (RAG) and **SynapseChatStore** (chat history).
317+
318+
```bash
319+
pip install synapse-layer[llamaindex]
320+
```
321+
322+
**Retriever** — plug into any query engine:
323+
324+
```python
325+
from synapse_memory.integrations.llamaindex import SynapseRetriever
326+
327+
retriever = SynapseRetriever(agent_id="researcher-01", top_k=5)
328+
nodes = retriever.retrieve("What is our deployment strategy?")
329+
```
330+
331+
**Chat Store** — persistent, encrypted chat history:
332+
333+
```python
334+
from synapse_memory.integrations.llamaindex import SynapseChatStore
335+
from llama_index.core.memory import ChatMemoryBuffer
336+
337+
store = SynapseChatStore(agent_id="assistant-01")
338+
memory = ChatMemoryBuffer.from_defaults(chat_store=store, chat_store_key="session-1")
339+
```
340+
341+
Every message passes through the Cognitive Security pipeline — PII
342+
redaction, intent validation, and AES-256 encryption — automatically.
343+
344+
> **Note:** This is the OSS adapter. Advanced scoring, enterprise retrieval
345+
> strategies, and PRO heuristics are available under separate license.
346+
> See [synapselayer.org/docs](https://synapselayer.org/docs).
347+
312348
## Competitive Comparison
313349

314350
| Capability | Synapse Layer | Mem0 | Zep | pgvector (raw) |
@@ -362,7 +398,7 @@ Synapse Layer is not just a library you call — it's **infrastructure your agen
362398
| Version | Status | Highlights |
363399
|---|---|---|
364400
| **v1.0.7** |**Stable** | Auto-Save Engine, Plugin Architecture, MCP Bridge, Smithery listing |
365-
| **v1.1.0** | 🚧 In Progress | ✅ LangChain native adapter, ✅ CrewAI integration, ✅ AutoGen integration, embedding model selection |
401+
| **v1.1.0** | 🚧 In Progress | ✅ LangChain native adapter, ✅ CrewAI integration, ✅ AutoGen integration, ✅ LlamaIndex integration, embedding model selection |
366402
| **v1.2.0** | 📋 Planned | Synapse Forge visual debugger, real-time memory inspector |
367403
| **v2.0.0** | 📋 Planned | Multi-tenant vault, team memory spaces, RBAC |
368404

examples/llamaindex_rag_agent.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
"""
2+
Synapse Layer — LlamaIndex Integration Example
3+
4+
Demonstrates how to use Synapse Layer as:
5+
1. A retriever for RAG pipelines (SynapseRetriever)
6+
2. A persistent chat store (SynapseChatStore)
7+
8+
Requirements:
9+
pip install synapse-layer[llamaindex]
10+
11+
Author : Security & Architecture Team @ Synapse Layer
12+
License: Apache 2.0
13+
"""
14+
15+
import asyncio
16+
17+
from synapse_memory.integrations.llamaindex import (
18+
SynapseRetriever,
19+
SynapseChatStore,
20+
)
21+
from llama_index.core.base.llms.types import ChatMessage, MessageRole
22+
23+
24+
async def retriever_demo():
25+
"""Demonstrate the SynapseRetriever."""
26+
print("=" * 60)
27+
print("SynapseRetriever Demo")
28+
print("=" * 60)
29+
30+
retriever = SynapseRetriever(agent_id="demo-retriever", top_k=3)
31+
print(f"Initialized: {retriever}")
32+
33+
# Populate the memory store
34+
await retriever.astore("Our deployment strategy uses blue-green on Kubernetes.")
35+
await retriever.astore("The primary database is PostgreSQL 16 on AWS RDS.")
36+
await retriever.astore("API rate limit is 1000 requests per minute per client.")
37+
print("Stored 3 knowledge entries.\n")
38+
39+
# Retrieve relevant nodes
40+
from llama_index.core.schema import QueryBundle
41+
query = QueryBundle(query_str="What is our deployment strategy?")
42+
nodes = await retriever._aretrieve(query)
43+
44+
print(f"Query: '{query.query_str}'")
45+
for nws in nodes:
46+
tq = nws.score
47+
print(f" [{tq:.2f}] {nws.node.text}")
48+
49+
# In a real LlamaIndex application:
50+
#
51+
# from llama_index.core import VectorStoreIndex
52+
# index = VectorStoreIndex.from_documents(documents)
53+
# query_engine = index.as_query_engine(retriever=retriever)
54+
# response = query_engine.query("What is our deployment strategy?")
55+
56+
57+
async def chat_store_demo():
58+
"""Demonstrate the SynapseChatStore."""
59+
print("\n" + "=" * 60)
60+
print("SynapseChatStore Demo")
61+
print("=" * 60)
62+
63+
store = SynapseChatStore(agent_id="demo-chat")
64+
print(f"Initialized: {store}")
65+
66+
# Add messages to a conversation
67+
store.add_message("session-1", ChatMessage(
68+
role=MessageRole.USER,
69+
content="What databases do we support?",
70+
))
71+
store.add_message("session-1", ChatMessage(
72+
role=MessageRole.ASSISTANT,
73+
content="We support PostgreSQL, MySQL, and SQLite.",
74+
))
75+
store.add_message("session-1", ChatMessage(
76+
role=MessageRole.USER,
77+
content="Which one is recommended for production?",
78+
))
79+
print("Added 3 messages to session-1.\n")
80+
81+
# Retrieve conversation
82+
messages = store.get_messages("session-1")
83+
for msg in messages:
84+
print(f" [{msg.role.value}] {msg.content}")
85+
86+
# List keys
87+
print(f"\nActive sessions: {store.get_keys()}")
88+
89+
# In a real LlamaIndex application:
90+
#
91+
# from llama_index.core.memory import ChatMemoryBuffer
92+
# memory = ChatMemoryBuffer.from_defaults(
93+
# chat_store=store,
94+
# chat_store_key="session-1",
95+
# )
96+
97+
98+
async def main():
99+
await retriever_demo()
100+
await chat_store_demo()
101+
print("\nDone.")
102+
103+
104+
if __name__ == "__main__":
105+
asyncio.run(main())

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ crewai = [
5454
autogen = [
5555
"autogen-core>=0.7.0",
5656
]
57+
llamaindex = [
58+
"llama-index-core>=0.11.0",
59+
]
5760
dev = [
5861
"pytest>=7.4.0",
5962
"pytest-cov>=4.1.0",

synapse_memory/integrations/__init__.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,15 @@
1212
# from synapse_memory.integrations.langchain_memory import SynapseChatMessageHistory
1313
# from synapse_memory.integrations.crewai_memory import SynapseCrewStorage
1414
# from synapse_memory.integrations.autogen_memory import SynapseAutoGenMemory
15+
# from synapse_memory.integrations.llamaindex import SynapseRetriever, SynapseChatStore
1516

16-
__all__ = ["SynapseChatMessageHistory", "SynapseCrewStorage", "SynapseAutoGenMemory"]
17+
__all__ = [
18+
"SynapseChatMessageHistory",
19+
"SynapseCrewStorage",
20+
"SynapseAutoGenMemory",
21+
"SynapseRetriever",
22+
"SynapseChatStore",
23+
]
1724

1825

1926
def __getattr__(name: str):
@@ -26,4 +33,10 @@ def __getattr__(name: str):
2633
if name == "SynapseAutoGenMemory":
2734
from .autogen_memory import SynapseAutoGenMemory
2835
return SynapseAutoGenMemory
36+
if name == "SynapseRetriever":
37+
from .llamaindex import SynapseRetriever
38+
return SynapseRetriever
39+
if name == "SynapseChatStore":
40+
from .llamaindex import SynapseChatStore
41+
return SynapseChatStore
2942
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

0 commit comments

Comments
 (0)