Config policies (16 files): alert_routing, architecture_pressure, backlog, cost_weights, data_governance, incident_escalation, incident_intelligence, network_allowlist, nodes_registry, observability_sources, rbac_tools_matrix, release_gate, risk_attribution, risk_policy, slo_policy, tool_limits, tools_rollout Ops (22 files): Caddyfile, calendar compose, grafana voice dashboard, deployments/incidents logs, runbooks for alerts/audit/backlog/incidents/sofiia/voice, cron jobs, scripts (alert_triage, audit_cleanup, migrate_*, governance, schedule), task_registry, voice alerts/ha/latency/policy Docs (30+ files): HUMANIZED_STEPAN v2.7-v3 changelogs and runbooks, NODA1/NODA2 status and setup, audit index and traces, backlog, incident, supervisor, tools, voice, opencode, release, risk, aistalk, spacebot Made-with: Cursor
11 KiB
11 KiB
🧠 Модуль Пам'яті для Агента Sofiia на NODA2
📊 Архітектура Пам'яті DAARION
Трирівнева система пам'яті:
┌─────────────────────────────────────────────────────────────┐
│ SOFIIA MEMORY STACK │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Qdrant │ │ PostgreSQL │ │ Neo4j │ │
│ │ (Vector) │ │ (Relational) │ │ (Graph) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Memory Service │ │
│ │ (:8000) │ │
│ └─────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Sofiia Agent │ │
│ │ (OpenClaw) │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
1. Векторна Пам'ять (Qdrant)
Колекції для Sofiia:
| Колекція | Призначення | Dimension |
|---|---|---|
sofiia_messages |
Історія повідомлень діалогів | 1024 |
sofiia_docs |
Документи та knowledge base | 1024 |
sofiia_memory_items |
Long-term memory items | 1024 |
sofiia_user_context |
Контекст користувачів | 1024 |
Embedding model: Cohere embed-multilingual-v3.0 (1024 dimensions)
Що зберігається:
- Повідомлення користувачів та відповіді Sofiia
- Документація проектів
- Контекстні дані про користувачів
- Long-term memories (важливі факти, рішення)
2. Реляційна Пам'ять (PostgreSQL)
Таблиця user_facts:
| Поле | Тип | Опис |
|---|---|---|
fact_id |
UUID | Унікальний ID |
user_id |
String | ID користувача |
team_id |
String | ID команди/DAO |
agent_id |
String | "sofiia" |
fact_key |
String | Ключ факту |
fact_value |
Text | Текстове значення |
fact_value_json |
JSONB | Структуровані дані |
Приклади фактів:
name: "Олександр"preferences: {"language": "uk", "style": "formal"}chat_event:2026-02-22: "Обговорювали архітектуру DAARION"
3. Графова Пам'ять (Neo4j)
Node types:
Agent- SofiiaUser- КористувачіChannel- Telegram, Slack, etc.Message- ПовідомленняTopic- Теми розмовProject- Проєкти (DAARION, NODA2, etc.)
Relationships:
(User)-[:SENT]->(Message)
(Sofiia)-[:RESPONDED]->(Message)
(Message)-[:IN_CHANNEL]->(Telegram)
(Message)-[:ABOUT]->(Architecture)
(Message)-[:REFERENCES]->(Project:DAARION)
Що дає:
- Зв'язки між користувачами та темами
- Історія розмов по проектах
- Виявлення залежностей
🎯 Варіанти налаштування на NODA2:
Варіант A: Локальна пам'ять (ПОВНА НЕЗАЛЕЖНІСТЬ) ✨
Переваги:
- ✅ Повна ізоляція від NODA1
- ✅ Швидкий доступ (локально)
- ✅ Можна тестувати без впливу на прод
- ✅ Dev-середовище
Недоліки:
- ❌ Не бачить пам'ять з NODA1
- ❌ Потрібно більше ресурсів
- ❌ Окремі дані для dev
Що потрібно:
services:
# Qdrant для векторної пам'яті
qdrant-node2:
image: qdrant/qdrant:latest
container_name: dagi-qdrant-node2
ports:
- "6333:6333"
- "6334:6334"
volumes:
- ./data/qdrant-node2:/qdrant/storage
environment:
- QDRANT__SERVICE__HOST=0.0.0.0
# PostgreSQL для реляційної пам'яті
postgres-node2:
image: postgres:16
container_name: dagi-postgres-node2
ports:
- "5433:5432"
environment:
- POSTGRES_DB=daarion_memory
- POSTGRES_USER=daarion
- POSTGRES_PASSWORD=daarion_secret
volumes:
- ./data/postgres-node2:/var/lib/postgresql/data
# Neo4j для графової пам'яті (опціонально)
neo4j-node2:
image: neo4j:5.15
container_name: dagi-neo4j-node2
ports:
- "7474:7474"
- "7687:7687"
environment:
- NEO4J_AUTH=neo4j/daarion_secret
volumes:
- ./data/neo4j-node2:/data
# Memory Service
memory-service-node2:
build: ./services/memory-service
container_name: dagi-memory-service-node2
ports:
- "8000:8000"
environment:
- QDRANT_HOST=qdrant-node2
- QDRANT_PORT=6333
- DATABASE_URL=postgresql://daarion:daarion_secret@postgres-node2:5432/daarion_memory
- NEO4J_URI=bolt://neo4j-node2:7687
- COHERE_API_KEY=${COHERE_API_KEY}
depends_on:
- qdrant-node2
- postgres-node2
Варіант B: Підключення до NODA1 (РЕПЛІКА) 🔄
Переваги:
- ✅ Бачить пам'ять з NODA1
- ✅ Економія ресурсів
- ✅ Read-replica для аналітики
- ✅ Реальний прод-контекст
Недоліки:
- ❌ Залежність від NODA1
- ❌ Мережева затримка
- ❌ Не можна писати (read-only)
Що потрібно:
services:
# Memory Service підключається до NODA1
memory-service-node2:
build: ./services/memory-service
container_name: dagi-memory-service-node2
ports:
- "8000:8000"
environment:
# Підключення до NODA1 Qdrant
- QDRANT_HOST=144.76.224.179
- QDRANT_PORT=6333
# Підключення до NODA1 PostgreSQL (read replica)
- DATABASE_URL=postgresql://daarion_reader:***@144.76.224.179:5432/daarion_memory
# Підключення до NODA1 Neo4j (read replica)
- NEO4J_URI=bolt://144.76.224.179:7687
- READ_ONLY_MODE=true
- COHERE_API_KEY=${COHERE_API_KEY}
Варіант C: Гібридний (РЕКОМЕНДОВАНО) ⭐
Переваги:
- ✅ Локальна пам'ять для dev/test
- ✅ Можливість підключитись до NODA1 за потреби
- ✅ Гнучкість
- ✅ Повна ізоляція для експериментів
Архітектура:
NODA2 (Development)
├── Local Memory Stack
│ ├── Qdrant (:6333)
│ ├── PostgreSQL (:5433)
│ └── Memory Service (:8000)
│
└── Optional: Remote NODA1 Access
└── Environment variable switch
🚀 Рекомендація: Почати з Варіанту C
Крок 1: Створити docker-compose.memory-node2.yml
cd /Users/apple/github-projects/microdao-daarion
Файл: docker-compose.memory-node2.yml
Крок 2: Отримати Cohere API Key
Для embedding моделі потрібен ключ:
- Зайти на https://cohere.ai
- Зареєструватись
- Отримати API Key
Крок 3: Запустити Memory Stack
# Додати Cohere API Key в .env
echo "COHERE_API_KEY=your_cohere_key_here" >> .env
# Запустити
docker-compose -f docker-compose.memory-node2.yml up -d
# Перевірити
docker ps | grep -E "memory|qdrant|postgres"
Крок 4: Налаштувати Sofiia для використання пам'яті
В OpenClaw конфігурації додати:
{
"agents": {
"list": [
{
"id": "sofiia",
"model": {
"primary": "xai/grok-4-1-fast-reasoning"
},
"memory": {
"enabled": true,
"serviceUrl": "http://localhost:8000",
"collections": {
"messages": "sofiia_messages",
"docs": "sofiia_docs",
"memory": "sofiia_memory_items",
"context": "sofiia_user_context"
}
}
}
]
}
}
📝 Приклад використання пам'яті Sofiia:
Збереження повідомлення:
await memory_client.save_memory(
agent_id="sofiia",
user_id="telegram:123456",
channel_id="telegram:sofiia",
content="User asked about DAARION architecture",
role="user",
metadata={
"topic": "architecture",
"intent": "question",
"project": "DAARION"
}
)
Отримання контексту:
context = await memory_client.get_context(
agent_id="sofiia",
user_id="telegram:123456",
query="архітектура",
limit=10
)
Збереження факту:
await memory_client.save_fact(
agent_id="sofiia",
user_id="telegram:123456",
fact_key="preferences",
fact_value_json={
"language": "uk",
"style": "technical",
"projects": ["DAARION", "NODA2"]
}
)
📊 Статистика пам'яті (для моніторингу):
-- Кількість фактів для Sofiia
SELECT COUNT(*) FROM user_facts WHERE agent_id = 'sofiia';
-- Останні повідомлення
SELECT * FROM user_facts
WHERE agent_id = 'sofiia'
ORDER BY created_at DESC
LIMIT 10;
🎯 Наступні кроки:
- ✅ Ознайомитись з архітектурою пам'яті (готово!)
- ⏳ Отримати Cohere API Key
- ⏳ Створити docker-compose.memory-node2.yml
- ⏳ Запустити Memory Stack
- ⏳ Налаштувати OpenClaw для підключення
- ⏳ Протестувати збереження та пошук
Який варіант цікавить вас більше? Можу допомогти з реалізацією! 🚀