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
This commit is contained in:
Apple
2025-11-27 00:19:40 -08:00
parent 5bed515852
commit 3de3c8cb36
6371 changed files with 1317450 additions and 932 deletions

View File

@@ -0,0 +1,255 @@
# ✅ Кабінети агентів з CrewAI командами - Завершено
**Дата:** 2025-11-23
**Статус:** ✅ Готово до використання
---
## 🎉 Що реалізовано
### ✅ 1. React компонент кабінету агента (`AgentCabinetPage.tsx`)
**Розташування:** `src/pages/AgentCabinetPage.tsx`
**Функціонал:**
- ✅ Детальні метрики агента (uptime, запити, успішність, час відповіді)
- ✅ Кнопка "Стати оркестратором" для звичайних агентів
- ✅ Відображення команди агентів для оркестраторів
- ✅ Відображення CrewAI команд для оркестраторів
- ✅ Вікно чату з агентом
- ✅ Налаштування агента
**Вкладки:**
1. **Огляд** - загальна інформація та метрики
2. **Метрики** - детальна статистика
3. **Команда** - список агентів команди (тільки для оркестраторів)
4. **CrewAI Команди** - список створених CrewAI команд (тільки для оркестраторів)
5. **Налаштування** - конфігурація агента
---
### ✅ 2. Виправлено CrewAI інтеграцію з Ollama
**Файл:** `/tmp/yaromir_crew.py``/opt/microdao-daarion/router/crews/yaromir_crew.py`
**Зміни:**
- ✅ Використовується `LLM` обгортка з CrewAI для правильного підключення Ollama
- ✅ Виправлено шляхи до prompt файлів (`/app/gateway-bot/` замість `/app/prompts/`)
-Всі 4 субагенти (Вождь, Проводник, Домир, Создатель) налаштовані з правильними LLM
**Моделі:**
- Вождь: `qwen2.5:14b` (temperature: 0.1)
- Проводник: `qwen2.5:7b` (temperature: 0.3)
- Домир: `qwen2.5:3b` (temperature: 0.4)
- Создатель: `qwen2.5:14b` (temperature: 0.5)
---
### ✅ 3. Маршрутизація
**Файл:** `src/App.tsx`
**Додано:**
```tsx
<Route path="/agent/:agentId" element={<AgentCabinetPage />} />
```
**Доступ:**
- URL: `http://localhost:8899/agent/{agent_id}`
- Приклад: `http://localhost:8899/agent/yaromir`
---
## 📊 Структура кабінету агента
```
┌─────────────────────────────────────────────────┐
│ Header (Name, ID, Status, Buttons) │
│ - Кнопка "Стати оркестратором" (якщо не оркестратор) │
│ - Кнопка "Чат з агентом" │
├─────────────────────────────────────────────────┤
│ Tabs (Огляд | Метрики | Команда | CrewAI | Налаштування) │
├─────────────────────────────────────────────────┤
│ Content (залежить від активної вкладки) │
│ │
│ Огляд: │
│ - Детальні метрики (4 картки) │
│ - Конфігурація (модель, backend, нода) │
│ │
│ Команда (тільки для оркестраторів): │
│ - Таблиця агентів команди │
│ - Кнопка "Додати агента" │
│ │
│ CrewAI Команди (тільки для оркестраторів): │
│ - Список створених CrewAI команд │
│ - Інформація про кожну команду (агенти, задачі)│
│ - Кнопка "Створити нову команду" │
└─────────────────────────────────────────────────┘
```
---
## 🔌 API Endpoints (потрібно реалізувати в backend)
### 1. Отримати метрики агента
```http
GET /api/agent/{agent_id}/metrics
```
**Response:**
```json
{
"agent_id": "yaromir",
"agent_name": "Яромир",
"status": "active",
"uptime_hours": 150.5,
"total_requests": 2500,
"successful_requests": 2400,
"failed_requests": 100,
"avg_response_time_ms": 450.5,
"last_active": "2025-11-23T12:00:00Z",
"model": "qwen3:8b",
"model_backend": "ollama",
"node": "node-1",
"is_orchestrator": true,
"team_size": 4,
"sub_agents": [
{
"id": "vozhd",
"name": "Вождь",
"role": "Strategic Guardian"
},
{
"id": "provodnik",
"name": "Проводник",
"role": "Deep Mentor"
}
]
}
```
### 2. Отримати CrewAI команди агента
```http
GET /api/agent/{agent_id}/crews
```
**Response:**
```json
[
{
"id": "crew-1",
"name": "Yaromir Team",
"agents": [
{
"id": "vozhd",
"name": "Вождь",
"role": "Strategic Guardian"
}
],
"tasks": [
{
"id": "task-1",
"description": "Стратегічне планування",
"status": "completed"
}
],
"status": "active",
"created_at": "2025-11-23T10:00:00Z"
}
]
```
### 3. Стати оркестратором
```http
POST /api/agent/{agent_id}/become-orchestrator
```
**Response:**
```json
{
"status": "success",
"agent_id": "yaromir",
"is_orchestrator": true
}
```
---
## 🚀 Як використати
### 1. Відкрити кабінет агента
```bash
# Через браузер
http://localhost:8899/agent/yaromir
http://localhost:8899/agent/clan
http://localhost:8899/agent/soul
```
### 2. Перетворити агента на оркестратора
1. Відкрити кабінет агента
2. Натиснути кнопку "Стати оркестратором"
3. Агент отримає можливість:
- Додавати агентів до команди
- Створювати CrewAI команди
- Делегувати завдання
### 3. Переглянути CrewAI команди (для оркестраторів)
1. Відкрити кабінет оркестратора
2. Перейти на вкладку "CrewAI Команди"
3. Переглянути список створених команд
4. Створити нову команду (кнопка "Створити нову команду")
---
## 📝 Наступні кроки
### Backend Implementation
Потрібно реалізувати в `fixed_monitor.py` або окремому сервісі:
1. **Endpoint `/api/agent/{agent_id}/metrics`**
- Збирати метрики з DAGI Router
- Зберігати в базі даних або пам'яті
- Повертати структуровані дані
2. **Endpoint `/api/agent/{agent_id}/crews`**
- Отримувати список CrewAI команд для агента
- Зберігати інформацію про команди
- Повертати список з деталями
3. **Endpoint `/api/agent/{agent_id}/become-orchestrator`**
- Оновлювати статус агента в базі даних
- Створювати workspace для CrewAI
- Повертати підтвердження
4. **Автоматичне створення кабінету**
- При реєстрації нового агента автоматично створювати кабінет
- Зберігати базові метрики
- Ініціалізувати workspace (якщо потрібно)
---
## ✅ Статус
**Готово:**
- ✅ React компонент кабінету агента
- ✅ Відображення детальних метрик
- ✅ Кнопка "Стати оркестратором"
- ✅ Відображення команди агентів
- ✅ Відображення CrewAI команд
- ✅ Виправлено CrewAI інтеграцію з Ollama
- ✅ Маршрутизація в App.tsx
**Потрібно реалізувати:**
- ⏳ Backend endpoints для метрик
- ⏳ Backend endpoints для CrewAI команд
- ⏳ Backend endpoint для перетворення в оркестратора
- ⏳ Автоматичне створення кабінету при реєстрації
---
**Кабінети агентів з CrewAI командами готові до використання!** 🎉