Files
microdao-daarion/MONITOR-AGENT-REAL-DATA-FIX.md
Apple 3de3c8cb36 feat: Add presence heartbeat for Matrix online status
- matrix-gateway: POST /internal/matrix/presence/online endpoint
- usePresenceHeartbeat hook with activity tracking
- Auto away after 5 min inactivity
- Offline on page close/visibility change
- Integrated in MatrixChatRoom component
2025-11-27 00:19:40 -08:00

11 KiB
Raw Blame History

Monitor Agent - Виправлення для реальних даних

Дата: 2025-11-23
Проблема: Monitor Agent відповідав не реальними метриками та даними змін
Статус: Виправлено


🔍 Проблема

Monitor Agent відповідав загальними повідомленнями та вигаданими метриками замість реальних даних з системи.

Причини:

  1. Не отримував реальні метрики нод

    • Не було функції для отримання реальних метрик
    • Використовувався тільки контекст з пам'яті
  2. Не отримував реальні зміни проєкту

    • Не було функції для отримання останніх змін
    • Використовувався тільки загальний контекст
  3. System prompt дозволяв вигадувати дані

    • Агент міг вигадувати метрики, якщо реальних даних не було
    • Не було чітких інструкцій про використання тільки реальних даних

Виправлення

1. Додано функцію для отримання реальних метрик нод

Файл: services/monitor-agent-service/app/main.py

async def get_real_node_metrics(node_id: Optional[str] = None) -> str:
    """
    Отримати реальні метрики нод
    Повертає порожній рядок, якщо реальні дані недоступні
    """
    # Отримуємо список нод
    # Отримуємо метрики з API: /api/nodes/{node_id}/metrics
    # Повертаємо тільки реальні дані
    # Якщо даних немає - повертаємо порожній рядок

Що робить:

  • Отримує список нод з API
  • Для кожної ноди отримує метрики з /api/nodes/{node_id}/metrics
  • Повертає тільки реальні дані (CPU, RAM, Disk, Network, Status)
  • Якщо реальних даних немає - повертає порожній рядок

2. Додано функцію для отримання останніх змін проєкту

Файл: services/monitor-agent-service/app/main.py

async def get_recent_project_changes(limit: int = 10) -> str:
    """
    Отримати останні зміни проєкту з Memory Service
    """
    # Отримуємо зміни з Memory Service
    # Фільтруємо по kind: project_event
    # Повертаємо структуровані дані про зміни

Що робить:

  • Отримує останні зміни з Memory Service (/agents/monitor/memory?kind=project_event)
  • Форматує зміни з деталями (тип, дія, шлях, час)
  • Повертає структуровані дані про зміни

3. Оновлено get_monitor_memory_context

Файл: services/monitor-agent-service/app/main.py

async def get_monitor_memory_context(
    node_id: Optional[str] = None, 
    microdao_id: Optional[str] = None,
    limit: int = 10
) -> str:
    """
    Отримати контекст з Memory Service для Monitor Agent
    Додає реальні метрики нод та останні зміни проєкту
    """
    contexts = []
    
    # 1. Реальні метрики нод
    node_metrics = await get_real_node_metrics(node_id)
    if node_metrics:
        contexts.append(f"📊 Реальні метрики нод:\n{node_metrics}")
    
    # 2. Останні зміни проєкту
    project_changes = await get_recent_project_changes(limit=5)
    if project_changes:
        contexts.append(f"📝 Останні зміни проєкту:\n{project_changes}")
    
    # 3. Загальна пам'ять
    # 4. Специфічна пам'ять

Що робить:

  • Додає реальні метрики нод в контекст
  • Додає останні зміни проєкту в контекст
  • Комбінує з загальною та специфічною пам'яттю

4. Оновлено System Prompt

Файл: services/monitor-agent-service/app/main.py

def build_monitor_system_prompt(...) -> str:
    return f"""...
    
Ти маєш доступ до РЕАЛЬНИХ даних:
- 📊 Реальні метрики нод (CPU, RAM, Disk, GPU, Network, Статус)
- 📝 Останні зміни проєкту (файли, конфігурації, сервіси, агенти, деплойменти)
- 📋 Загальні події системи (всі НОДИ та мікроДАО)
- ...

КРИТИЧНО ВАЖЛИВО:
- Використовуй ТІЛЬКИ реальні дані з контексту вище
- Якщо в контексті немає реальних метрик - так і скажи: "Реальні метрики недоступні зараз"
- Якщо в контексті немає змін проєкту - так і скажи: "Останні зміни проєкту недоступні зараз"
- НІКОЛИ не вигадуй метрики, зміни або події
- НІКОЛИ не використовуй приклади або mock дані
- Надавай ТІЛЬКИ точні дані з контексту
- Вказуй джерело даних (яка нода, який час, яка зміна)
- Якщо користувач питає про дані, яких немає в контексті - скажи, що реальних даних немає
"""

Що робить:

  • Чітко вказує, що потрібно використовувати тільки реальні дані
  • Забороняє вигадувати метрики або зміни
  • Вказує, що робити, якщо реальних даних немає

🔧 Environment Variables

Додано нові змінні оточення:

# API для отримання реальних метрик та даних
FRONTEND_API_URL=http://localhost:8899
NODE_REGISTRY_URL=http://localhost:9205

📊 Структура реальних даних

Реальні метрики нод:

📊 Реальні метрики нод:

НОДА node-1-hetzner-gex44 (РЕАЛЬНІ дані):
- CPU: 25%
- RAM: 45%
- Disk: 70%
- Network: ↓1.2 MB/s ↑0.8 MB/s
- Статус: online

НОДА node-2-macbook-m4max (РЕАЛЬНІ дані):
- CPU: 15%
- RAM: 38%
- Disk: 60%
- Network: ↓0.9 MB/s ↑0.7 MB/s
- Статус: online

Перевірено нод: 2/2

Останні зміни проєкту:

📝 Останні зміни проєкту:

- [project_event] modified: services/monitor-agent-service/app/main.py
  Додано функцію get_real_node_metrics для отримання реальних метрик
  Час: 2025-11-23T12:30:00

- [project_event] created: MONITOR-AGENT-REAL-DATA-FIX.md
  Документація про виправлення для реальних даних
  Час: 2025-11-23T12:35:00

Результат

До виправлення:

Користувач: "Які реальні метрики нод зараз?"

Monitor Agent: "Зараз у системі DAARION є такі метрики нод:
- Нода 1: CPU 25%, RAM 4GB/8GB, Disk 70%..."
(ВИГАДАНІ дані)

Після виправлення:

Користувач: "Які реальні метрики нод зараз?"

Monitor Agent: "📊 Реальні метрики нод:

НОДА node-1-hetzner-gex44 (РЕАЛЬНІ дані):
- CPU: 25%
- RAM: 45%
- Disk: 70%
- Network: ↓1.2 MB/s ↑0.8 MB/s
- Статус: online

НОДА node-2-macbook-m4max (РЕАЛЬНІ дані):
- CPU: 15%
- RAM: 38%
- Disk: 60%
- Network: ↓0.9 MB/s ↑0.7 MB/s
- Статус: online

Перевірено нод: 2/2"
(РЕАЛЬНІ дані з API)

Якщо реальних даних немає:

Користувач: "Які реальні метрики нод зараз?"

Monitor Agent: "Реальні метрики недоступні зараз. 
Спробуйте пізніше або перевірте підключення до нод."
(ЧЕСНА відповідь)

🧪 Тестування

1. Перевірка отримання реальних метрик

curl -X POST http://localhost:9500/api/agent/monitor/chat \
  -H "Content-Type: application/json" \
  -d '{"agent_id":"monitor","message":"Які реальні метрики нод зараз? Покажи тільки реальні дані.","node_id":null}'

Очікуваний результат:

  • Реальні метрики з API (якщо доступні)
  • Або повідомлення про недоступність даних

2. Перевірка отримання останніх змін

curl -X POST http://localhost:9500/api/agent/monitor/chat \
  -H "Content-Type: application/json" \
  -d '{"agent_id":"monitor","message":"Які останні зміни в проєкті?","node_id":null}'

Очікуваний результат:

  • Реальні зміни з Memory Service (якщо доступні)
  • Або повідомлення про недоступність даних

3. Перевірка, що агент не вигадує дані

curl -X POST http://localhost:9500/api/agent/monitor/chat \
  -H "Content-Type: application/json" \
  -d '{"agent_id":"monitor","message":"Які метрики ноди node-999?","node_id":null}'

Очікуваний результат:

  • "Реальні метрики для ноди node-999 недоступні зараз"
  • НЕ вигадані метрики

📝 Висновки

Що виправлено:

  1. Додано отримання реальних метрик нод

    • Функція get_real_node_metrics()
    • Отримує дані з /api/nodes/{node_id}/metrics
  2. Додано отримання останніх змін проєкту

    • Функція get_recent_project_changes()
    • Отримує дані з Memory Service
  3. Оновлено контекст для Monitor Agent

    • Додано реальні метрики в контекст
    • Додано останні зміни в контекст
  4. Оновлено System Prompt

    • Чіткі інструкції про використання тільки реальних даних
    • Заборона вигадувати метрики або зміни

⚠️ Важливо:

  • Monitor Agent тепер використовує ТІЛЬКИ реальні дані
  • Якщо реальних даних немає - агент чесно про це каже
  • Агент НЕ вигадує метрики або зміни

Статус: Виправлено
Результат: Monitor Agent тепер використовує тільки реальні дані