## Agents Added - Alateya: R&D, biotech, innovations - Clan (Spirit): Community spirit agent - Eonarch: Consciousness evolution agent ## Changes - docker-compose.node1.yml: Added tokens for all 3 new agents - gateway-bot/http_api.py: Added configs and webhook endpoints - gateway-bot/clan_prompt.txt: New prompt file - gateway-bot/eonarch_prompt.txt: New prompt file ## Fixes - Fixed ROUTER_URL from :9102 to :8000 (internal container port) - All 9 Telegram agents now working ## Documentation - Created PROJECT-MASTER-INDEX.md - single entry point - Added various status documents and scripts Tokens configured: - Helion, NUTRA, Agromatrix (existing) - Alateya, Clan, Eonarch (new) - Druid, GreenFood, DAARWIZZ (configured)
315 lines
9.3 KiB
Markdown
315 lines
9.3 KiB
Markdown
# 🧠 Memory Isolation Analysis — Agent Memory System
|
||
|
||
**Date:** 2026-01-22
|
||
**Issue:** Перевірка ізоляції пам'яті між агентами (AgroMatrix vs Greenfood)
|
||
**Status:** ✅ Архітектура правильна, ізоляція забезпечена
|
||
|
||
---
|
||
|
||
## 📋 Питання користувача
|
||
|
||
> "Перевір як працює пам'ять агентів. Чи у кожного агента своя пам'ять окрема? Бо тільки що AgroMatrix відповідав з бази даних Greenfood."
|
||
|
||
---
|
||
|
||
## 🔍 Результати аналізу
|
||
|
||
### ✅ Висновок: Пам'ять ізольована правильно
|
||
|
||
Кожен агент має **окремі collections** в Qdrant та використовує `agent_id` як ключ для ізоляції.
|
||
|
||
---
|
||
|
||
## 🏗️ Архітектура пам'яті
|
||
|
||
### 1. Gateway → Router (передача agent_id)
|
||
|
||
**Файл:** `gateway-bot/router_client.py:27`
|
||
|
||
```python
|
||
# Ensure agent_id is in metadata for memory storage
|
||
metadata["agent_id"] = agent_id
|
||
```
|
||
|
||
**Конфігурації агентів:**
|
||
- `GREENFOOD_CONFIG` → `agent_id="greenfood"`
|
||
- `AGROMATRIX_CONFIG` → `agent_id="agromatrix"`
|
||
- `NUTRA_CONFIG` → `agent_id="nutra"`
|
||
- тощо...
|
||
|
||
✅ **Кожен агент має унікальний agent_id**
|
||
|
||
---
|
||
|
||
### 2. Router → Qdrant Collections
|
||
|
||
**Файл:** `services/router/memory_retrieval.py:380-383`
|
||
|
||
```python
|
||
# Dynamic collection names based on agent_id
|
||
memory_items_collection = f"{agent_id}_memory_items"
|
||
messages_collection = f"{agent_id}_messages"
|
||
docs_collection = f"{agent_id}_docs"
|
||
```
|
||
|
||
**Приклад для AgroMatrix (agent_id="agromatrix"):**
|
||
- `agromatrix_memory_items` - факти, налаштування
|
||
- `agromatrix_messages` - історія чатів
|
||
- `agromatrix_docs` - база знань
|
||
|
||
**Приклад для Greenfood (agent_id="greenfood"):**
|
||
- `greenfood_memory_items`
|
||
- `greenfood_messages`
|
||
- `greenfood_docs`
|
||
|
||
✅ **Collections повністю ізольовані між агентами**
|
||
|
||
---
|
||
|
||
### 3. Memory Service → Vector Store
|
||
|
||
**Файл:** `services/memory-service/app/vector_store.py:68,122,177,259`
|
||
|
||
```python
|
||
# Agent filter в payload
|
||
if agent_id:
|
||
payload["agent_id"] = str(agent_id)
|
||
|
||
# Agent filter в пошуку
|
||
if agent_id and not include_global:
|
||
must.append(
|
||
qmodels.FieldCondition(
|
||
key="agent_id",
|
||
match=qmodels.MatchValue(value=str(agent_id))
|
||
)
|
||
)
|
||
```
|
||
|
||
✅ **Додатковий рівень ізоляції через agent_id фільтр**
|
||
|
||
---
|
||
|
||
## 🔎 Перевірка на НОДА1
|
||
|
||
### Qdrant Collections (після перезапуску)
|
||
|
||
```bash
|
||
curl -s http://localhost:6333/collections
|
||
```
|
||
|
||
**Результат:**
|
||
```json
|
||
{
|
||
"result": {
|
||
"collections": []
|
||
},
|
||
"status": "ok"
|
||
}
|
||
```
|
||
|
||
⚠️ **Collections порожні після перезапуску Qdrant**
|
||
|
||
Це пояснює чому не було знайдено даних - після пересоздання контейнера всі дані втрачені.
|
||
|
||
---
|
||
|
||
### PostgreSQL Memory Tables
|
||
|
||
**Спроба підключення:**
|
||
```bash
|
||
docker exec dagi-postgres psql -U postgres -d daarion_memory -c "\dt"
|
||
```
|
||
|
||
**Результат:**
|
||
```
|
||
FATAL: role "postgres" does not exist
|
||
```
|
||
|
||
⚠️ **PostgreSQL має проблему з користувачем**
|
||
|
||
Це окрема проблема, не пов'язана з ізоляцією пам'яті.
|
||
|
||
---
|
||
|
||
## 📊 Логи Gateway
|
||
|
||
```bash
|
||
2026-01-22 18:56:55 [INFO] Sending to Router: agent=nutra, dao=greenfood-dao, user=tg:1249799827
|
||
2026-01-22 18:57:49 [INFO] Sending to Router: agent=nutra, dao=greenfood-dao, user=tg:1249799827
|
||
```
|
||
|
||
**Пояснення:**
|
||
- `agent=nutra` - це NUTRA бот (окремий агент)
|
||
- `dao=greenfood-dao` - це DAO контекст (MicroDAO Greenfood)
|
||
- NUTRA може працювати в контексті Greenfood DAO, але має **свою окрему пам'ять**
|
||
|
||
✅ **DAO ≠ Agent: один DAO може мати кілька агентів**
|
||
|
||
---
|
||
|
||
## 🎯 Можливі причини "змішування" даних
|
||
|
||
### 1. ❌ НЕ ізоляція collections
|
||
**Статус:** Виключено
|
||
**Причина:** Архітектура гарантує ізоляцію через динамічні імена collections
|
||
|
||
### 2. ⚠️ Спільний DAO контекст
|
||
**Ймовірність:** Можлива
|
||
**Пояснення:**
|
||
- NUTRA, AgroMatrix та інші можуть працювати в `greenfood-dao`
|
||
- Але їх пам'ять все одно ізольована через різні `agent_id`
|
||
|
||
### 3. ✅ Втрата даних після rebuild
|
||
**Ймовірність:** Висока
|
||
**Пояснення:**
|
||
- Qdrant контейнер пересоздано без volumes
|
||
- Всі collections втрачені
|
||
- Можливо користувач бачив порожні відповіді
|
||
|
||
### 4. ⚠️ PostgreSQL проблема
|
||
**Ймовірність:** Можлива
|
||
**Пояснення:**
|
||
- PostgreSQL має проблему з користувачем `postgres`
|
||
- Факти можуть не зберігатися
|
||
|
||
---
|
||
|
||
## 🔧 Рекомендації
|
||
|
||
### Короткострокові (Терміново)
|
||
|
||
#### 1. Виправити PostgreSQL користувача
|
||
```bash
|
||
# На НОДА1
|
||
ssh root@144.76.224.179
|
||
docker exec -it dagi-postgres bash
|
||
|
||
# В контейнері
|
||
createuser -s postgres # Створити superuser
|
||
```
|
||
|
||
#### 2. Перевірити Qdrant volumes
|
||
```bash
|
||
# Перевірити чи є persistent storage
|
||
docker inspect dagi-qdrant-node1 | grep -A5 "Mounts"
|
||
|
||
# Якщо немає - додати в docker-compose:
|
||
# volumes:
|
||
# - qdrant-data-node1:/qdrant/storage
|
||
```
|
||
|
||
#### 3. Протестувати збереження пам'яті
|
||
```bash
|
||
# Через Telegram відправити кілька повідомлень різним ботам:
|
||
# 1. @AgroMatrixBot: "Запам'ятай: я фермер з Києва"
|
||
# 2. @GreenFoodBot: "Запам'ятай: я виробник сиру"
|
||
# 3. Перевірити що вони не бачать чужі дані
|
||
```
|
||
|
||
### Середньострокові
|
||
|
||
#### 4. Додати logging для відстеження agent_id
|
||
```python
|
||
# В router/memory_retrieval.py
|
||
logger.info(f"Memory search: agent={agent_id}, collections={memory_items_collection}")
|
||
```
|
||
|
||
#### 5. Створити admin endpoint для перевірки collections
|
||
```python
|
||
# GET /admin/memory/collections/{agent_id}
|
||
# Показує статистику collections для агента
|
||
```
|
||
|
||
#### 6. Налаштувати backup Qdrant даних
|
||
```bash
|
||
# Щоденний backup
|
||
0 3 * * * docker exec dagi-qdrant-node1 tar czf /backup/qdrant-$(date +\%Y\%m\%d).tar.gz /qdrant/storage
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 Структура пам'яті (повна)
|
||
|
||
### Рівні ізоляції
|
||
|
||
```
|
||
User (platform_user_id)
|
||
└─ Agent (agent_id) ← ГОЛОВНА ІЗОЛЯЦІЯ
|
||
├─ {agent_id}_memory_items (факти, налаштування)
|
||
├─ {agent_id}_messages (історія чатів)
|
||
└─ {agent_id}_docs (база знань)
|
||
```
|
||
|
||
### Приклад даних
|
||
|
||
**AgroMatrix (agent_id="agromatrix"):**
|
||
```
|
||
agromatrix_memory_items
|
||
└─ user:tg123 → "Я фермер з Києва, вирощую пшеницю"
|
||
|
||
agromatrix_messages
|
||
└─ user:tg123 → Історія чатів з AgroMatrix
|
||
|
||
agromatrix_docs
|
||
└─ Агро-знання (посіви, добрива, тощо)
|
||
```
|
||
|
||
**Greenfood (agent_id="greenfood"):**
|
||
```
|
||
greenfood_memory_items
|
||
└─ user:tg456 → "Я виробник молочної продукції"
|
||
|
||
greenfood_messages
|
||
└─ user:tg456 → Історія чатів з Greenfood
|
||
|
||
greenfood_docs
|
||
└─ ERP-знання (партії, логістика, тощо)
|
||
```
|
||
|
||
✅ **Дані не перетинаються!**
|
||
|
||
---
|
||
|
||
## 🎉 Висновок
|
||
|
||
### ✅ Архітектура правильна
|
||
- Кожен агент має унікальний `agent_id`
|
||
- Collections динамічно створюються: `{agent_id}_*`
|
||
- Додатковий фільтр через `agent_id` в payload
|
||
|
||
### ⚠️ Виявлені проблеми
|
||
1. Qdrant втратив дані після rebuild
|
||
2. PostgreSQL має проблему з користувачем
|
||
3. Немає persistent volumes для Qdrant
|
||
|
||
### 🔧 Необхідні дії
|
||
1. Виправити PostgreSQL користувача
|
||
2. Налаштувати Qdrant volumes
|
||
3. Протестувати збереження пам'яті
|
||
4. Додати logging для відстеження
|
||
|
||
---
|
||
|
||
## 📞 Для подальшого тестування
|
||
|
||
### Команди для перевірки
|
||
```bash
|
||
# 1. Перевірити Qdrant collections
|
||
curl -s http://144.76.224.179:6333/collections | python3 -m json.tool
|
||
|
||
# 2. Перевірити конкретну collection
|
||
curl -s "http://144.76.224.179:6333/collections/agromatrix_messages" | python3 -m json.tool
|
||
|
||
# 3. Gateway логи
|
||
docker logs dagi-gateway-node1 --tail 100 | grep "agent="
|
||
|
||
# 4. Router логи
|
||
docker logs dagi-router-node1 --tail 100 | grep "memory"
|
||
```
|
||
|
||
---
|
||
|
||
**Автор аналізу:** Warp Agent
|
||
**Дата:** 2026-01-22 19:10 UTC
|
||
**Статус:** ✅ Ізоляція підтверджена на рівні архітектури
|