- 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
385 lines
11 KiB
Markdown
385 lines
11 KiB
Markdown
# ✅ Swapper Service - Повна реалізація завершена
|
||
|
||
**Дата:** 2025-11-22
|
||
**Статус:** ✅ Готово до використання
|
||
|
||
---
|
||
|
||
## 📋 Виконані завдання
|
||
|
||
### 1. ✅ Відповідь про vLLM vs Swapper
|
||
|
||
**Рекомендація:** Swapper Service — оптимальний вибір для DAARION Stack
|
||
|
||
**Чому:**
|
||
- ✅ Підходить для обмежених ресурсів (Node #2 MacBook з 64GB RAM)
|
||
- ✅ Економія пам'яті (важливо з 8 моделями ~118GB)
|
||
- ✅ Легка інтеграція з існуючим Ollama
|
||
- ✅ Підтримка Apple Silicon (Metal)
|
||
- ✅ Гнучкість перемикання між моделями
|
||
|
||
**Детальний аналіз:** `docs/VLLM-VS-SWAPPER-ANALYSIS.md`
|
||
|
||
---
|
||
|
||
### 2. ✅ Створено Swapper Service
|
||
|
||
**Створені файли:**
|
||
- ✅ `services/swapper-service/app/main.py` — основний сервіс
|
||
- ✅ `services/swapper-service/app/cabinet_api.py` — API для кабінетів
|
||
- ✅ `services/swapper-service/app/__init__.py`
|
||
- ✅ `services/swapper-service/requirements.txt`
|
||
- ✅ `services/swapper-service/Dockerfile`
|
||
- ✅ `services/swapper-service/config/swapper_config.yaml`
|
||
- ✅ `services/swapper-service/start.sh` — скрипт запуску
|
||
- ✅ `services/swapper-service/README.md` — повна документація
|
||
- ✅ Додано в `docker-compose.yml`
|
||
|
||
**Функціональність:**
|
||
- ✅ Динамічне завантаження/вивантаження моделей
|
||
- ✅ Single-active mode (одна модель за раз)
|
||
- ✅ Відстеження uptime моделей (в годинах)
|
||
- ✅ Метрики (request count, uptime, load/unload times)
|
||
- ✅ Інтеграція з Ollama
|
||
- ✅ REST API для керування моделями
|
||
|
||
---
|
||
|
||
### 3. ✅ API Endpoints для кабінетів
|
||
|
||
**Створені endpoints:**
|
||
- ✅ `GET /api/cabinet/swapper/status` — повний статус для кабінету
|
||
- ✅ `GET /api/cabinet/swapper/models` — список моделей з деталями
|
||
- ✅ `GET /api/cabinet/swapper/metrics/summary` — підсумкові метрики
|
||
|
||
**Що відображається:**
|
||
- ✅ Активна модель (назва, uptime, request count)
|
||
- ✅ Список всіх моделей зі статусом
|
||
- ✅ Час роботи кожної моделі (uptime в годинах)
|
||
- ✅ Можливість завантажити/вивантажити моделі
|
||
- ✅ Підсумкові метрики (total uptime, most used model)
|
||
|
||
---
|
||
|
||
### 4. ✅ Інтеграція в кабінети
|
||
|
||
**Створені компоненти:**
|
||
- ✅ `services/swapper-service/cabinet-integration.tsx` — React/TypeScript компоненти
|
||
- ✅ `services/swapper-service/cabinet-integration.css` — стилі для кабінетів
|
||
|
||
**Компоненти:**
|
||
- ✅ `SwapperStatusCard` — головна картка зі статусом
|
||
- ✅ `SwapperMetricsSummary` — підсумкові метрики
|
||
- ✅ `SwapperPage` — повна сторінка Swapper Service
|
||
|
||
**Документація:**
|
||
- ✅ `docs/SWAPPER-CABINET-INTEGRATION.md` — детальна інтеграція
|
||
- ✅ Приклади для React та Vue
|
||
- ✅ API клієнт сервіс
|
||
- ✅ Приклади використання
|
||
|
||
---
|
||
|
||
## 🚀 Як запустити
|
||
|
||
### Варіант 1: Docker (рекомендовано)
|
||
|
||
```bash
|
||
cd /Users/apple/github-projects/microdao-daarion
|
||
|
||
# Запустити Swapper Service
|
||
docker-compose up -d swapper-service
|
||
|
||
# Перевірити статус
|
||
docker-compose ps swapper-service
|
||
|
||
# Перевірити логи
|
||
docker-compose logs -f swapper-service
|
||
```
|
||
|
||
### Варіант 2: Локально (для розробки)
|
||
|
||
```bash
|
||
cd /Users/apple/github-projects/microdao-daarion/services/swapper-service
|
||
|
||
# Запустити скрипт (створює venv та встановлює залежності)
|
||
./start.sh
|
||
```
|
||
|
||
### Варіант 3: Вручну
|
||
|
||
```bash
|
||
cd /Users/apple/github-projects/microdao-daarion/services/swapper-service
|
||
|
||
# Створити venv
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
|
||
# Встановити залежності
|
||
pip install -r requirements.txt
|
||
|
||
# Налаштувати змінні оточення
|
||
export OLLAMA_BASE_URL=http://localhost:11434
|
||
export SWAPPER_CONFIG_PATH=./config/swapper_config.yaml
|
||
|
||
# Запустити
|
||
python3 -m uvicorn app.main:app --host 0.0.0.0 --port 8890
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 Тестування
|
||
|
||
### 1. Health Check
|
||
|
||
```bash
|
||
curl http://localhost:8890/health
|
||
```
|
||
|
||
**Очікуваний результат:**
|
||
```json
|
||
{
|
||
"status": "healthy",
|
||
"service": "swapper-service",
|
||
"active_model": null,
|
||
"mode": "single-active"
|
||
}
|
||
```
|
||
|
||
### 2. Status для кабінету
|
||
|
||
```bash
|
||
curl http://localhost:8890/api/cabinet/swapper/status | python3 -m json.tool
|
||
```
|
||
|
||
**Очікуваний результат:**
|
||
```json
|
||
{
|
||
"service": "swapper-service",
|
||
"status": "healthy",
|
||
"mode": "single-active",
|
||
"active_model": null,
|
||
"total_models": 8,
|
||
"available_models": [...],
|
||
"loaded_models": [],
|
||
"models": [...]
|
||
}
|
||
```
|
||
|
||
### 3. Список моделей
|
||
|
||
```bash
|
||
curl http://localhost:8890/models | python3 -m json.tool
|
||
```
|
||
|
||
### 4. Завантажити модель
|
||
|
||
```bash
|
||
curl -X POST http://localhost:8890/models/deepseek-r1-70b/load
|
||
```
|
||
|
||
### 5. Метрики
|
||
|
||
```bash
|
||
curl http://localhost:8890/api/cabinet/swapper/metrics/summary | python3 -m json.tool
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Інтеграція в кабінети
|
||
|
||
### Node #1 (Production Server)
|
||
|
||
1. **Додати Swapper секцію в адмін-консоль:**
|
||
- Імпортувати компоненти з `cabinet-integration.tsx`
|
||
- Додати маршрут `/admin/swapper`
|
||
- Налаштувати API URL: `http://swapper-service:8890`
|
||
|
||
2. **Додати в sidebar:**
|
||
```typescript
|
||
{ id: 'swapper', label: 'Swapper Service', icon: 'swap' }
|
||
```
|
||
|
||
3. **Використати компонент:**
|
||
```tsx
|
||
import { SwapperPage } from '@/services/swapper-service/cabinet-integration';
|
||
|
||
<Route path="/admin/swapper" element={<SwapperPage />} />
|
||
```
|
||
|
||
### Node #2 (MacBook Development)
|
||
|
||
1. **Те саме що для Node #1, але:**
|
||
- API URL: `http://localhost:8890` (локальний розробка)
|
||
|
||
2. **Або через Docker:**
|
||
- API URL: `http://swapper-service:8890` (якщо через docker-compose)
|
||
|
||
---
|
||
|
||
## 📁 Структура файлів
|
||
|
||
```
|
||
services/swapper-service/
|
||
├── app/
|
||
│ ├── __init__.py
|
||
│ ├── main.py # Основний сервіс
|
||
│ └── cabinet_api.py # API для кабінетів
|
||
├── config/
|
||
│ └── swapper_config.yaml # Конфігурація моделей
|
||
├── Dockerfile
|
||
├── requirements.txt
|
||
├── start.sh # Скрипт запуску
|
||
├── README.md # Документація
|
||
├── cabinet-integration.tsx # React компоненти
|
||
└── cabinet-integration.css # Стилі
|
||
```
|
||
|
||
---
|
||
|
||
## 🔗 API Endpoints
|
||
|
||
### Основні endpoints
|
||
|
||
| Method | Endpoint | Опис |
|
||
|--------|----------|------|
|
||
| GET | `/health` | Health check |
|
||
| GET | `/status` | Статус сервісу |
|
||
| GET | `/models` | Список моделей |
|
||
| GET | `/models/{name}` | Інформація про модель |
|
||
| POST | `/models/{name}/load` | Завантажити модель |
|
||
| POST | `/models/{name}/unload` | Вивантажити модель |
|
||
| GET | `/metrics` | Метрики всіх моделей |
|
||
| GET | `/metrics/{name}` | Метрики моделі |
|
||
|
||
### Cabinet API endpoints
|
||
|
||
| Method | Endpoint | Опис |
|
||
|--------|----------|------|
|
||
| GET | `/api/cabinet/swapper/status` | Статус для кабінету |
|
||
| GET | `/api/cabinet/swapper/models` | Моделі для кабінету |
|
||
| GET | `/api/cabinet/swapper/metrics/summary` | Підсумкові метрики |
|
||
|
||
---
|
||
|
||
## 📚 Документація
|
||
|
||
1. **README.md** — повний опис API та використання
|
||
2. **SWAPPER-CABINET-INTEGRATION.md** — детальна інтеграція в кабінети
|
||
3. **VLLM-VS-SWAPPER-ANALYSIS.md** — аналіз vLLM vs Swapper
|
||
4. **SWAPPER-SERVICE-SETUP.md** — інструкції з налаштування
|
||
|
||
---
|
||
|
||
## ✅ Чеклист готовності
|
||
|
||
- [x] Swapper Service код створено
|
||
- [x] Dockerfile та requirements.txt
|
||
- [x] Конфігураційний файл
|
||
- [x] Додано в docker-compose.yml
|
||
- [x] Cabinet API endpoints
|
||
- [x] React компоненти для кабінетів
|
||
- [x] CSS стилі
|
||
- [x] Документація
|
||
- [x] Скрипт запуску
|
||
- [x] Аналіз vLLM vs Swapper
|
||
- [ ] Запуск на Node #2 (потрібно виконати вручну)
|
||
- [ ] Інтеграція в кабінет Node #2 (потрібно виконати вручну)
|
||
- [ ] Інтеграція в кабінет Node #1 (потрібно виконати вручну)
|
||
|
||
---
|
||
|
||
## 🎯 Наступні кроки
|
||
|
||
### Для Node #2 (MacBook)
|
||
|
||
1. **Запустити Swapper Service:**
|
||
```bash
|
||
cd /Users/apple/github-projects/microdao-daarion
|
||
docker-compose up -d swapper-service
|
||
# або локально: ./services/swapper-service/start.sh
|
||
```
|
||
|
||
2. **Перевірити роботу:**
|
||
```bash
|
||
curl http://localhost:8890/health
|
||
curl http://localhost:8890/api/cabinet/swapper/status
|
||
```
|
||
|
||
3. **Інтегрувати в кабінет:**
|
||
- Додати компоненти з `cabinet-integration.tsx`
|
||
- Додати стилі з `cabinet-integration.css`
|
||
- Налаштувати API URL
|
||
|
||
### Для Node #1 (Production Server)
|
||
|
||
1. **Додати Swapper Service в docker-compose.yml на сервері**
|
||
2. **Запустити:**
|
||
```bash
|
||
ssh root@144.76.224.179
|
||
cd /opt/microdao-daarion
|
||
git pull origin main
|
||
docker-compose up -d swapper-service
|
||
```
|
||
|
||
3. **Інтегрувати в кабінет** (як для Node #2)
|
||
|
||
---
|
||
|
||
## 🐛 Troubleshooting
|
||
|
||
### Swapper Service не запускається
|
||
|
||
```bash
|
||
# Перевірити логи
|
||
docker logs swapper-service
|
||
# або
|
||
cat /tmp/swapper.log
|
||
|
||
# Перевірити чи Ollama доступний
|
||
curl http://localhost:11434/api/tags
|
||
|
||
# Перевірити конфігурацію
|
||
cat services/swapper-service/config/swapper_config.yaml
|
||
```
|
||
|
||
### API не відповідає
|
||
|
||
```bash
|
||
# Перевірити чи сервіс запущений
|
||
docker ps | grep swapper-service
|
||
# або
|
||
lsof -i :8890
|
||
|
||
# Перевірити health
|
||
curl http://localhost:8890/health
|
||
```
|
||
|
||
### Модель не завантажується
|
||
|
||
```bash
|
||
# Перевірити чи модель є в Ollama
|
||
curl http://localhost:11434/api/tags | grep "model_name"
|
||
|
||
# Перевірити статус Swapper
|
||
curl http://localhost:8890/status
|
||
|
||
# Спробувати завантажити вручну
|
||
curl -X POST http://localhost:8890/models/model_name/load
|
||
```
|
||
|
||
---
|
||
|
||
## 📞 Підтримка
|
||
|
||
- **Документація:** `services/swapper-service/README.md`
|
||
- **Інтеграція:** `docs/SWAPPER-CABINET-INTEGRATION.md`
|
||
- **Аналіз:** `docs/VLLM-VS-SWAPPER-ANALYSIS.md`
|
||
|
||
---
|
||
|
||
**Last Updated:** 2025-11-22
|
||
**Status:** ✅ Готово до використання
|
||
**Next:** Запустити та протестувати на Node #2
|
||
|