- 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
11 KiB
11 KiB
✅ 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 (рекомендовано)
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: Локально (для розробки)
cd /Users/apple/github-projects/microdao-daarion/services/swapper-service
# Запустити скрипт (створює venv та встановлює залежності)
./start.sh
Варіант 3: Вручну
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
curl http://localhost:8890/health
Очікуваний результат:
{
"status": "healthy",
"service": "swapper-service",
"active_model": null,
"mode": "single-active"
}
2. Status для кабінету
curl http://localhost:8890/api/cabinet/swapper/status | python3 -m json.tool
Очікуваний результат:
{
"service": "swapper-service",
"status": "healthy",
"mode": "single-active",
"active_model": null,
"total_models": 8,
"available_models": [...],
"loaded_models": [],
"models": [...]
}
3. Список моделей
curl http://localhost:8890/models | python3 -m json.tool
4. Завантажити модель
curl -X POST http://localhost:8890/models/deepseek-r1-70b/load
5. Метрики
curl http://localhost:8890/api/cabinet/swapper/metrics/summary | python3 -m json.tool
📊 Інтеграція в кабінети
Node #1 (Production Server)
-
Додати Swapper секцію в адмін-консоль:
- Імпортувати компоненти з
cabinet-integration.tsx - Додати маршрут
/admin/swapper - Налаштувати API URL:
http://swapper-service:8890
- Імпортувати компоненти з
-
Додати в sidebar:
{ id: 'swapper', label: 'Swapper Service', icon: 'swap' } -
Використати компонент:
import { SwapperPage } from '@/services/swapper-service/cabinet-integration'; <Route path="/admin/swapper" element={<SwapperPage />} />
Node #2 (MacBook Development)
-
Те саме що для Node #1, але:
- API URL:
http://localhost:8890(локальний розробка)
- API URL:
-
Або через Docker:
- API URL:
http://swapper-service:8890(якщо через docker-compose)
- API URL:
📁 Структура файлів
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 |
Підсумкові метрики |
📚 Документація
- README.md — повний опис API та використання
- SWAPPER-CABINET-INTEGRATION.md — детальна інтеграція в кабінети
- VLLM-VS-SWAPPER-ANALYSIS.md — аналіз vLLM vs Swapper
- SWAPPER-SERVICE-SETUP.md — інструкції з налаштування
✅ Чеклист готовності
- Swapper Service код створено
- Dockerfile та requirements.txt
- Конфігураційний файл
- Додано в docker-compose.yml
- Cabinet API endpoints
- React компоненти для кабінетів
- CSS стилі
- Документація
- Скрипт запуску
- Аналіз vLLM vs Swapper
- Запуск на Node #2 (потрібно виконати вручну)
- Інтеграція в кабінет Node #2 (потрібно виконати вручну)
- Інтеграція в кабінет Node #1 (потрібно виконати вручну)
🎯 Наступні кроки
Для Node #2 (MacBook)
-
Запустити Swapper Service:
cd /Users/apple/github-projects/microdao-daarion docker-compose up -d swapper-service # або локально: ./services/swapper-service/start.sh -
Перевірити роботу:
curl http://localhost:8890/health curl http://localhost:8890/api/cabinet/swapper/status -
Інтегрувати в кабінет:
- Додати компоненти з
cabinet-integration.tsx - Додати стилі з
cabinet-integration.css - Налаштувати API URL
- Додати компоненти з
Для Node #1 (Production Server)
-
Додати Swapper Service в docker-compose.yml на сервері
-
Запустити:
ssh root@144.76.224.179 cd /opt/microdao-daarion git pull origin main docker-compose up -d swapper-service -
Інтегрувати в кабінет (як для Node #2)
🐛 Troubleshooting
Swapper Service не запускається
# Перевірити логи
docker logs swapper-service
# або
cat /tmp/swapper.log
# Перевірити чи Ollama доступний
curl http://localhost:11434/api/tags
# Перевірити конфігурацію
cat services/swapper-service/config/swapper_config.yaml
API не відповідає
# Перевірити чи сервіс запущений
docker ps | grep swapper-service
# або
lsof -i :8890
# Перевірити health
curl http://localhost:8890/health
Модель не завантажується
# Перевірити чи модель є в 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