import requests
from datetime import datetime
import uuid
BASE_URL = "https://api.evermind.ai"
headers = {"Content-Type": "application/json"}
class PersonalAssistant:
def __init__(self, user_id: str):
self.user_id = user_id
self.assistant_id = "assistant_001"
self.group_id = f"assistant_{user_id}"
self._setup_scene()
def _setup_scene(self):
"""Configure assistant scene for this user."""
meta = {
"group_id": self.group_id,
"scene": "assistant",
"user_details": [
{"user_id": self.user_id, "user_name": "User", "role": "user"},
{"user_id": self.assistant_id, "user_name": "Assistant", "role": "assistant"}
]
}
requests.post(f"{BASE_URL}/api/v0/memories/conversation-meta", json=meta, headers=headers)
def _store_message(self, content: str, is_assistant: bool = False):
"""Store a message in EverMemOS."""
message = {
"group_id": self.group_id,
"group_name": "Personal Assistant",
"message_id": str(uuid.uuid4()),
"create_time": datetime.now().isoformat() + "Z",
"sender": self.assistant_id if is_assistant else self.user_id,
"sender_name": "Assistant" if is_assistant else "User",
"content": content
}
requests.post(f"{BASE_URL}/api/v0/memories", json=message, headers=headers)
def _get_context(self, query: str) -> str:
"""Retrieve relevant memory context."""
search_params = {
"user_id": self.user_id,
"query": query,
"retrieve_method": "hybrid",
"top_k": 5,
"memory_types": ["profile", "episodic_memory"]
}
response = requests.get(f"{BASE_URL}/api/v0/memories/search", json=search_params, headers=headers)
memories = response.json().get("result", {}).get("memories", [])
if not memories:
return "No relevant memories found."
parts = []
for mem in memories:
mem_type = mem.get("memory_type", "").replace("_", " ").title()
content = mem.get("memory_content", "")
parts.append(f"[{mem_type}] {content}")
return "\n".join(parts)
def _generate_response(self, user_message: str, context: str) -> str:
"""Generate response using your LLM of choice."""
# Replace this with your actual LLM call (OpenAI, Anthropic, etc.)
prompt = f"""You are a helpful personal assistant. Use the following context about the user to personalize your response.
MEMORY CONTEXT:
{context}
USER MESSAGE:
{user_message}
Respond naturally, incorporating relevant context when appropriate. Don't explicitly mention that you're using memory unless asked."""
# Example: OpenAI call (replace with your LLM)
# response = openai.chat.completions.create(
# model="gpt-4",
# messages=[{"role": "user", "content": prompt}]
# )
# return response.choices[0].message.content
# Placeholder for demo
return f"[LLM would respond here with context: {context[:100]}...]"
def chat(self, user_message: str) -> str:
"""Main chat method - store, retrieve, generate, store."""
# 1. Store user message
self._store_message(user_message, is_assistant=False)
# 2. Retrieve relevant context
context = self._get_context(user_message)
# 3. Generate response with context
response = self._generate_response(user_message, context)
# 4. Store assistant response
self._store_message(response, is_assistant=True)
return response
# Usage
assistant = PersonalAssistant("user_alice")
# Simulate conversation
print(assistant.chat("I prefer meetings in the morning, before 10am."))
print(assistant.chat("What time works best for our call tomorrow?"))
# The second response will use memory of the preference!