from openai import AsyncOpenAI
from maximem_synap import MaximemSynapSDK, ContextType
sdk = MaximemSynapSDK(api_key=...)
openai = AsyncOpenAI()
await sdk.initialize()
async def search_user_history(user_id: str, customer_id: str, query: str, top_k: int = 8):
"""Pure RAG: return raw memory chunks ranked by relevance to `query`."""
ctx = await sdk.user.context.fetch(
user_id=user_id,
customer_id=customer_id,
search_query=[query],
max_results=top_k,
types=[ContextType.FACTS, ContextType.EPISODES],
mode="accurate", # graph-aware ranking
)
# Sort facts and episodes by relevance using their respective scores
hits = (
[(f.confidence, "fact", f.content) for f in ctx.facts] +
[(e.significance, "episode", e.summary) for e in ctx.episodes]
)
hits.sort(key=lambda h: h[0], reverse=True)
return hits[:top_k]
async def rag_chat(user_id: str, customer_id: str, user_message: str) -> str:
hits = await search_user_history(user_id, customer_id, user_message)
citations = "\n".join(f"[{i+1}] ({kind}) {text}" for i, (score, kind, text) in enumerate(hits))
system_prompt = (
"Answer the user's question using ONLY the citations below. "
"Cite by number. If the answer isn't in the citations, say you don't know.\n\n"
f"Citations:\n{citations}"
)
completion = await openai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_message},
],
)
return completion.choices[0].message.content