75c67150d0
build / build (3.13) (push) Waiting to run
release-please / release-please (push) Waiting to run
release-please / build wheels (macos-aarch64) (push) Blocked by required conditions
release-please / build wheels (macos-x86_64) (push) Blocked by required conditions
release-please / build wheels (windows-x86_64) (push) Blocked by required conditions
release-please / build wheels (linux-aarch64) (push) Blocked by required conditions
release-please / build wheels (linux-x86_64) (push) Blocked by required conditions
release-please / build sdist (push) Blocked by required conditions
release-please / publish release artifacts (push) Blocked by required conditions
108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
"""
|
|
Getting Started with MemU: A Robust Example.
|
|
|
|
This script demonstrates the core lifecycle of MemU:
|
|
1. **Initialization**: Setting up the client with secure API key handling.
|
|
2. **Memory Injection**: Adding a specific memory with metadata.
|
|
3. **Retrieval**: Searching for that memory using natural language.
|
|
4. **Error Handling**: Catching common configuration issues.
|
|
|
|
Usage:
|
|
export OPENAI_API_KEY=your_api_key_here
|
|
python examples/getting_started_robust.py
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
import os
|
|
import sys
|
|
|
|
# Ensure src is in the path for local usage if custom installing
|
|
sys.path.insert(0, os.path.abspath("src"))
|
|
|
|
from memu.app import MemoryService
|
|
|
|
# Configure logging to show info but suppress noisy libraries
|
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
|
logging.getLogger("httpx").setLevel(logging.WARNING)
|
|
|
|
|
|
async def main() -> None:
|
|
"""Run the MemU lifecycle demonstration."""
|
|
print(">>> MemU Getting Started Example")
|
|
print("-" * 30)
|
|
|
|
# 1. API Key Handling
|
|
# MemU relies on an LLM backend (defaulting to OpenAI).
|
|
# We ensure the API key is present before proceeding.
|
|
api_key = os.getenv("OPENAI_API_KEY")
|
|
if not api_key:
|
|
print("[!] Error: OPENAI_API_KEY environment variable is not set.")
|
|
print("Please export it: export OPENAI_API_KEY=sk-...")
|
|
return
|
|
|
|
try:
|
|
# 2. Initialization
|
|
# We initialize the MemoryService with:
|
|
# - llm_profiles: Configuration for the LLM (model, api_key).
|
|
# - memorize_config: Pre-defining a memory category ensures we can organize memories efficiently.
|
|
print("[*] Initializing MemoryService with model: gpt-4o-mini...")
|
|
service = MemoryService(
|
|
llm_profiles={
|
|
"default": {
|
|
"api_key": api_key,
|
|
"chat_model": "gpt-4o-mini",
|
|
},
|
|
},
|
|
memorize_config={
|
|
"memory_categories": [
|
|
{
|
|
"name": "User Facts",
|
|
"description": "General and specific facts known about the user preference and identity.",
|
|
}
|
|
]
|
|
},
|
|
)
|
|
print("[OK] Service initialized successfully.\n")
|
|
|
|
# 3. Memory Injection
|
|
# We manually inject a memory into the system.
|
|
# This is useful for bootstrapping a user profile or adding explicit knowledge.
|
|
print("[*] Injecting memory...")
|
|
memory_content = "The user is a senior Python architect who loves clean code and type hints."
|
|
|
|
# We use 'create_memory_item' to insert a single memory record.
|
|
# memory_type='profile' indicates this is an attribute of the user.
|
|
result = await service.create_memory_item(
|
|
memory_type="profile",
|
|
memory_content=memory_content,
|
|
memory_categories=["User Facts"],
|
|
)
|
|
print(f"[OK] Memory created! ID: {result.get('memory_item', {}).get('id')}\n")
|
|
|
|
# 4. Retrieval
|
|
# Now we query the system naturally to see if it recalls the information.
|
|
query_text = "What kind of code does the user like?"
|
|
print(f"[*] Querying: '{query_text}'")
|
|
|
|
search_results = await service.retrieve(queries=[{"role": "user", "content": query_text}])
|
|
|
|
# 5. Display Results
|
|
items = search_results.get("items", [])
|
|
if items:
|
|
print(f"[OK] Found {len(items)} relevant memory item(s):")
|
|
for idx, item in enumerate(items, 1):
|
|
print(f" {idx}. {item.get('summary')} (Type: {item.get('memory_type')})")
|
|
else:
|
|
print("[!] No relevant memories found.")
|
|
|
|
except Exception as e:
|
|
print(f"\n[!] An error occurred during execution: {e}")
|
|
logging.exception("Detailed traceback:")
|
|
finally:
|
|
print("\n[=] Example execution finished.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|