跳到主要内容

Configuration

YAML Configuration

All memory and session settings go in config/default.yaml:

# Memory system
MEMORY_ENABLED: true
MARKDOWN_MEMORY_ENABLED: true # Dual-write to /shared/memory/ markdown files
EXTRACTION_MODEL: gpt-4o-mini # LLM for fact extraction
USER_ID: default-user

# Embedding
EMBEDDING_MODEL: text-embedding-3-large
EMBEDDING_DIMENSION: 3072 # 0 = auto-detect

# Session lifecycle
SESSION_DAILY_RESET_HOUR: 0 # UTC hour for daily reset (0 = disabled)
SESSION_IDLE_TIMEOUT_MINUTES: 0 # 0 = disabled
JSONL_TRANSCRIPTS_ENABLED: true # Write per-session JSONL transcripts
TRANSCRIPT_INDEXING_ENABLED: false # Index transcripts into LanceDB for search

# Context management
MAX_HISTORY_STEPS: 20 # Steps before compression triggers
MAX_CONTEXT_TOKENS: 800000 # Token threshold for compression

Environment Variables

API Keys

OPENAI_API_KEY=sk-xxx

LanceDB Storage

# Path to LanceDB storage (default: .suzent/memory)
LANCEDB_URI=.suzent/memory

Manager Initialization

from suzent.memory import MemoryManager, LanceDBMemoryStore
from suzent.memory.markdown_store import MarkdownMemoryStore

# Initialize stores
store = LanceDBMemoryStore(uri=".suzent/memory", embedding_dim=3072)
await store.connect()

markdown_store = MarkdownMemoryStore("/shared/memory")

manager = MemoryManager(
store=store,
embedding_model="text-embedding-3-large",
embedding_dimension=3072,
llm_for_extraction="gpt-4o-mini",
markdown_store=markdown_store,
)

System Constants

Defined in manager.py:

DEFAULT_MEMORY_RETRIEVAL_LIMIT = 5
DEFAULT_MEMORY_SEARCH_LIMIT = 10
IMPORTANT_MEMORY_THRESHOLD = 0.7
DEDUPLICATION_SIMILARITY_THRESHOLD = 0.85
DEFAULT_IMPORTANCE = 0.5

Tuning

More Aggressive Storage

DEDUPLICATION_SIMILARITY_THRESHOLD = 0.75
DEFAULT_IMPORTANCE = 0.6

Cleaner Memory

DEDUPLICATION_SIMILARITY_THRESHOLD = 0.90
DEFAULT_IMPORTANCE = 0.3

Hybrid Search Weights

results = await store.hybrid_search(
...,
semantic_weight=0.7, # Vector similarity
fts_weight=0.3, # Full-text
importance_boost=0.2, # Importance
recency_boost=0.1 # Recency
)

Session Lifecycle

# Reset sessions daily at 4am UTC
SESSION_DAILY_RESET_HOUR: 4

# Reset after 60 minutes of inactivity
SESSION_IDLE_TIMEOUT_MINUTES: 60

Transcript Indexing

# Enable to allow searching across past session transcripts
TRANSCRIPT_INDEXING_ENABLED: true

This chunks transcripts into ~400-token segments with 80-token overlap and stores them in LanceDB. Increases storage but enables cross-session semantic search.

Embedding Models

ModelDimensionCost/1M tokensUse Case
text-embedding-3-large3072$0.13Production
text-embedding-3-small1536$0.02Development
text-embedding-ada-0021536$0.10Legacy

Storage Layout

data/sandbox-data/shared/memory/    # Markdown source of truth (agent-accessible)
MEMORY.md # Curated long-term memory
2026-02-08.md # Daily logs

.suzent/
memory/ # LanceDB search index
transcripts/{session_id}.jsonl # Session transcripts
state/{session_id}.json # Agent state snapshots
chats.db # SQLite metadata

Recovery

Rebuild LanceDB from Markdown

If the LanceDB index is corrupted or lost:

from suzent.memory import MarkdownIndexer

indexer = MarkdownIndexer()
stats = await indexer.reindex_from_markdown(
markdown_store=manager.markdown_store,
lancedb_store=manager.store,
embedding_gen=manager.embedding_gen,
user_id="default-user",
clear_existing=True,
)
print(f"Indexed {stats['indexed']} facts from {stats['total_files']} files")

Or via the API:

curl -X POST http://localhost:25314/memory/reindex \
-H "Content-Type: application/json" \
-d '{"clear_existing": true}'

Debug Logging

LOG_LEVEL=DEBUG uv run suzent