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
369 lines
11 KiB
Markdown
369 lines
11 KiB
Markdown
# 🧠 Модуль Пам'яті для Агента 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` - Sofiia
|
||
- `User` - Користувачі
|
||
- `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
|
||
|
||
**Що потрібно:**
|
||
```yaml
|
||
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)
|
||
|
||
**Що потрібно:**
|
||
```yaml
|
||
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
|
||
|
||
```bash
|
||
cd /Users/apple/github-projects/microdao-daarion
|
||
```
|
||
|
||
Файл: `docker-compose.memory-node2.yml`
|
||
|
||
### Крок 2: Отримати Cohere API Key
|
||
|
||
Для embedding моделі потрібен ключ:
|
||
1. Зайти на https://cohere.ai
|
||
2. Зареєструватись
|
||
3. Отримати API Key
|
||
|
||
### Крок 3: Запустити Memory Stack
|
||
|
||
```bash
|
||
# Додати 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 конфігурації додати:
|
||
|
||
```json
|
||
{
|
||
"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:
|
||
|
||
### Збереження повідомлення:
|
||
```python
|
||
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"
|
||
}
|
||
)
|
||
```
|
||
|
||
### Отримання контексту:
|
||
```python
|
||
context = await memory_client.get_context(
|
||
agent_id="sofiia",
|
||
user_id="telegram:123456",
|
||
query="архітектура",
|
||
limit=10
|
||
)
|
||
```
|
||
|
||
### Збереження факту:
|
||
```python
|
||
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"]
|
||
}
|
||
)
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Статистика пам'яті (для моніторингу):
|
||
|
||
```sql
|
||
-- Кількість фактів для 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;
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 Наступні кроки:
|
||
|
||
1. ✅ Ознайомитись з архітектурою пам'яті (готово!)
|
||
2. ⏳ Отримати Cohere API Key
|
||
3. ⏳ Створити docker-compose.memory-node2.yml
|
||
4. ⏳ Запустити Memory Stack
|
||
5. ⏳ Налаштувати OpenClaw для підключення
|
||
6. ⏳ Протестувати збереження та пошук
|
||
|
||
---
|
||
|
||
**Який варіант цікавить вас більше? Можу допомогти з реалізацією! 🚀**
|