ποΈ Traylinx Cortex - Database Schema & Data Flow¶
Version: 2.1.0
Last Updated: December 3, 2025
π Navigation: Main README | Docs Index | Quick Reference | Integration Guide
This document provides visual diagrams of the database structure and data flows in Traylinx Cortex.
π Entity Relationship Diagram (ERD)¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TRAYLINX CORTEX DATABASE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β sessions β β langgraph_ β β
β βββββββββββββββββββββββ€ β checkpoints β β
β β PK id (UUID) ββββββββββΊβββββββββββββββββββββββ€ β
β β user_id β 1:1 β PK thread_id ββββ Maps to session_id β
β β app_id β β checkpoint (JSONB)β β
β β agent_id β β created_at β β
β β title β β updated_at β β
β β created_at β βββββββββββββββββββββββ β
β β updated_at β β
β β metadata (JSONB) β β
β ββββββββββββ¬βββββββββββ β
β β β
β β 1:N β
β βΌ β
β βββββββββββββββββββββββ βββββββββββββββββββββββ β
β β messages β β memories β β
β βββββββββββββββββββββββ€ βββββββββββββββββββββββ€ β
β β PK id (UUID) βββββββββββββββββββΊβ PK id (UUID) β β
β β FK session_id β N:1 β user_id β β
β β role β β app_id β β
β β content β β content β β
β β content_sanitizedβ β embedding (1024) ββββ pgvector β
β β token_count β β FK source_message_idβ β
β β created_at β β importance_score β β
β ββββββββββββ¬βββββββββββ β valid_at β β
β β β tags[] β β
β β N:1 β created_at β β
β βΌ βββββββββββββββββββββββ β
β βββββββββββββββββββββββ β
β β usage_logs β β
β βββββββββββββββββββββββ€ β
β β PK id (UUID) β β
β β FK session_id β β
β β user_id β β
β β model β β
β β tokens_in β β
β β tokens_out β β
β β cost_usd β β
β β created_at β β
β βββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π΄ Redis Short-Term Memory (STM)¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β REDIS (STM Cache) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Key Pattern: session:{session_id}:messages β
β Data Type: LIST β
β TTL: 24 hours (auto-expire) β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Example Data: β β
β β β β
β β [ β β
β β { β β
β β "role": "user", β β
β β "content": "Hello, my name is Sebastian", β β
β β "tokens": 7 β β
β β }, β β
β β { β β
β β "role": "assistant", β β
β β "content": "Hi Sebastian! How can I help?", β β
β β "tokens": 9 β β
β β }, β β
β β { β β
β β "role": "user", β β
β β "content": "I'm planning a trip to Tokyo", β β
β β "tokens": 8 β β
β β } β β
β β ] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Operations: β
β β’ RPUSH - Append new message β
β β’ LRANGE - Get recent messages (token-bounded) β
β β’ DEL - Clear session STM β
β β’ EXPIRE - Set 24h TTL β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Data Flow Diagram¶
Chat Request Flow¶
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CHAT REQUEST FLOW β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββ
β Client β
ββββββ¬ββββββ
β
β POST /v1/chat
β {session_id, message, user_id}
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CORTEX API (FastAPI) β
β β
β 1. Validate Sentinel token β
β 2. Check session exists β
β 3. Scrub PII from message β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LANGGRAPH ORCHESTRATOR β
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β RETRIEVE βββββΊβ AUGMENT βββββΊβ CALL βββββΊβ SAVE β β
β β MEMORY β β PROMPT β β MODEL β β STATE β β
β ββββββββ¬βββββββ βββββββββββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β
β β β β β
β β β β β
β βΌ βΌ βΌ β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Redis (STM) β β LiteLLM β β PostgreSQL β β
β β PostgreSQL β β βββββββββ β β (messages) β β
β β (LTM) β β βGPT-4o β β β β β
β βββββββββββββββ β βClaude β β β Redis (STM) β β
β β βLlama β β βββββββββββββββ β
β β βββββββββ β β
β βββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ENQUEUE β β
β βCONSOLIDATIONβββββΊ Celery Task Queue β
β βββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββ
β RESPONSE TO CLIENT β
β β
β Streaming (SSE): β
β event: message β
β data: {"chunk": "Sure", "id": "..."}β
β β
β event: done β
β data: {"status": "completed", ...} β
βββββββββββββββββββββββββββββββββββββββββ
Background Consolidation Flow¶
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BACKGROUND CONSOLIDATION FLOW β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββ
β Celery Worker β
ββββββββββ¬βββββββββ
β
β consolidate_memory task
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Step 1: CHECK TOKEN BUDGET β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SELECT SUM(token_count) FROM messages WHERE session_id = ? β β
β β β β
β β if total_tokens > 4000: β β
β β β Summarize oldest 50% of messages β β
β β β Archive summary to LTM β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Step 2: EXTRACT FACTS β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Prompt to GPT-4o-mini: β β
β β "Extract facts about the user from this conversation..." β β
β β β β
β β Output: ["User's name is Sebastian", "Planning trip to Tokyo"] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Step 3: GENERATE EMBEDDINGS β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β For each fact: β β
β β embedding = embed(fact, model=EMBEDDING_MODEL) β β
β β β Vector dimensions based on model (default: 1024) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Step 4: STORE IN MEMORIES TABLE β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β INSERT INTO memories (user_id, app_id, content, embedding, ...) β β
β β VALUES (?, ?, ?, ?, ...) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Step 5: GENERATE SESSION TITLE (if missing) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β if session.title IS NULL: β β
β β title = GPT-4o-mini("Generate 3-5 word title...") β β
β β UPDATE sessions SET title = ? WHERE id = ? β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Table Relationships¶
| From | To | Relationship | Foreign Key | Description |
|---|---|---|---|---|
sessions |
messages |
1:N | messages.session_id |
One session has many messages |
sessions |
usage_logs |
1:N | usage_logs.session_id |
One session has many usage records |
sessions |
langgraph_checkpoints |
1:1 | thread_id = session_id |
LangGraph state persistence |
messages |
memories |
1:N | memories.source_message_id |
One message can generate multiple facts |
π Key Design Decisions¶
1. Multi-Tenancy¶
Both sessions and memories include app_id to isolate data between different applications using Cortex.
-- All queries must filter by app_id
SELECT * FROM memories
WHERE user_id = ? AND app_id = ?
ORDER BY embedding <=> query_embedding
LIMIT 10;
2. Dual Content Storage¶
Messages store both original and sanitized content:
- content - Original message (encrypted at rest)
- content_sanitized - PII-redacted version (used for LLM and search)
3. User-Scoped Long-Term Memory¶
Memories are tied to user_id, NOT session_id:
- Facts persist across multiple conversations
- User can start new session but AI still remembers them
Session 1: "My name is Sebastian" β Memory created for user_123
Session 2: "What is my name?" β Memory retrieved β "Sebastian"
4. Vector Search with pgvector¶
The memories.embedding column uses:
- Dimension: Configurable via EMBEDDING_DIMENSIONS env var (default: 1024 for mistral-embed)
- Index: HNSW (Hierarchical Navigable Small World)
- Distance: Cosine similarity
Common embedding dimensions by model:
- mistral-embed: 1024 (default)
- text-embedding-004 (Gemini): 768
- text-embedding-3-small (OpenAI): 1536
- text-embedding-3-large (OpenAI): 3072
-- Fast approximate nearest neighbor search
SELECT content, 1 - (embedding <=> query_embedding) AS similarity
FROM memories
WHERE user_id = ? AND app_id = ?
ORDER BY embedding <=> query_embedding
LIMIT 10;
5. Redis for Hot Data¶
Short-Term Memory uses Redis LIST: - Speed: Sub-millisecond read/write - TTL: 24 hours auto-expire for inactive sessions - Token Budgeting: Load messages until 4,000 token limit reached
π Index Summary¶
| Table | Index | Type | Purpose |
|---|---|---|---|
sessions |
idx_sessions_user |
B-tree | Fast user lookup |
messages |
idx_messages_session |
B-tree | Fast message retrieval |
memories |
idx_memories_embedding |
HNSW | Vector similarity search |
memories |
idx_memories_user |
B-tree | Fast user lookup |
usage_logs |
idx_usage_user_date |
B-tree | Cost reporting queries |
π Data Lifecycle¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA LIFECYCLE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Redis STM βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΊ β
β β Expires after 24h β
β β β
β β PostgreSQL messages ββββββββββββββββββββββββββββββββββββββββββββββββββββββΊ β
β β β Deleted when session expires β
β β β (30 days inactive) β
β β β β
β β β PostgreSQL memories βββββββββββββββββββββββββββββββββββββββββββββββββββΊ β
β β β Persists forever (user facts) β
β β β β
β β β PostgreSQL usage_logs βββββββββββββββββββββββββββββββββββββββββββββββββΊ β
β β β Retained for billing/analytics β
β β β β
β ββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Timeline: β
β ββ 0h: Message received, stored in Redis + PostgreSQL β
β ββ 0h: Background job extracts facts β memories table β
β ββ 24h: Redis STM expires (PostgreSQL backup remains) β
β ββ 30d: Session deleted (messages + usage_logs cascade deleted) β
β ββ β: Memories persist (user knowledge base) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
See Also: - specs_v2_final.md - Complete SQL DDL statements - implementation_plan_v2_final.md - Migration scripts - ./QUICK_REFERENCE.md - Schema summary table