- TTS: xtts-v2 integration with voice cloning support
- Document: docling integration for PDF/DOCX/PPTX processing
- Memory Service: added /facts/upsert, /facts/{key}, /facts endpoints
- Added required dependencies (TTS, docling)
245 lines
7.6 KiB
Markdown
245 lines
7.6 KiB
Markdown
# 🔗 Детальна інтеграція Router ↔ Swapper на НОДА2
|
||
|
||
**Дата:** 2026-01-12
|
||
**Статус:** ✅ Повний аналіз інтеграції
|
||
|
||
---
|
||
|
||
## 🔄 Як працює Router на НОДА2
|
||
|
||
### Конфігурація Router
|
||
|
||
**Змінні середовища:**
|
||
- `SWAPPER_URL=http://192.168.1.33:8890` (IP адреса хоста)
|
||
- `NATS_URL=nats://nats:4222`
|
||
- `STT_URL=http://192.168.1.33:8895`
|
||
- `VISION_URL=http://192.168.1.33:11434`
|
||
- `OCR_URL=http://192.168.1.33:8896`
|
||
|
||
**Конфігураційні файли:**
|
||
- `router_config.yaml` - базова конфігурація messaging
|
||
- `router-config.yml` - конфігурація агентів та LLM профілів
|
||
|
||
### Провайдери Router (17 штук)
|
||
|
||
**LLM Провайдери:**
|
||
- `llm_local_qwen3_8b` - Локальний Qwen3 8B
|
||
- `llm_cloud_deepseek` - Cloud DeepSeek
|
||
- `llm_qwen3_vl` - Vision Qwen3
|
||
- `llm_specialist_vision_8b` - Vision спеціаліст
|
||
- `llm_specialist_math_7b` - Math спеціаліст
|
||
- `llm_specialist_reasoning_3b` - Reasoning спеціаліст
|
||
- `llm_specialist_rag_4b` - RAG спеціаліст
|
||
- `llm_specialist_lang_gateway_4b` - Language Gateway
|
||
- `llm_specialist_security_guard_7b` - Security Guard
|
||
|
||
**DevTools Провайдери:**
|
||
- `devtools_devtools` - DevTools
|
||
- `devtools_helion` - Helion
|
||
- `devtools_cto` - CTO
|
||
- `devtools_monitor` - Monitor
|
||
- `devtools_greenfood` - GreenFood
|
||
|
||
**Інші провайдери:**
|
||
- `tools` - ToolProvider
|
||
- `orchestrator_crewai` - CrewAIProvider
|
||
- `parser` - OCRProvider
|
||
|
||
---
|
||
|
||
## 🔄 Як працює Swapper на НОДА2
|
||
|
||
### Конфігурація Swapper
|
||
|
||
**Файл:** `services/swapper-service/config/swapper_config_node2.yaml`
|
||
|
||
**Налаштування:**
|
||
- **Режим:** `single-active` (одна модель за раз)
|
||
- **GPU:** Увімкнено (Apple Silicon Metal)
|
||
- **Default модель:** `gpt-oss-latest` (автоматично завантажується)
|
||
- **Ollama URL:** `http://host.docker.internal:11434`
|
||
|
||
**Моделі (8 штук):**
|
||
1. ✅ **gpt-oss-latest** (13GB) - **АКТИВНА** (19.36 год uptime)
|
||
2. phi3-latest (2.2GB) - Unloaded
|
||
3. starcoder2-3b (1.7GB) - Unloaded
|
||
4. mistral-nemo-12b (7.1GB) - Unloaded
|
||
5. gemma2-27b (15GB) - Unloaded
|
||
6. deepseek-coder-33b (18GB) - Unloaded
|
||
7. qwen2.5-coder-32b (19GB) - Unloaded
|
||
8. deepseek-r1-70b (42GB) - Unloaded
|
||
|
||
### Доступ до Ollama
|
||
|
||
**Механізм:**
|
||
- Swapper контейнер → `host.docker.internal:11434` → Ollama на хості
|
||
- Використовує `extra_hosts: host.docker.internal:host-gateway`
|
||
- Працює через Docker Desktop network
|
||
|
||
**Моделі в Ollama (9 штук):**
|
||
- llava:13b (13B)
|
||
- mistral-nemo:12b (12.2B)
|
||
- gemma2:27b (27.2B)
|
||
- deepseek-coder:33b (33B)
|
||
- qwen2.5-coder:32b (32.8B)
|
||
- deepseek-r1:70b (70.6B)
|
||
- starcoder2:3b (3B)
|
||
- phi3:latest (3.8B)
|
||
- ✅ **gpt-oss:latest (20.9B)** - активна в Swapper
|
||
|
||
---
|
||
|
||
## 🔗 Інтеграція Router ↔ Swapper
|
||
|
||
### Як Router використовує Swapper
|
||
|
||
**З коду Router (`main.py`):**
|
||
|
||
1. **Перевірка доступності Swapper:**
|
||
```python
|
||
health_resp = await http_client.get(f"{SWAPPER_URL}/health", timeout=5.0)
|
||
```
|
||
|
||
2. **Завантаження моделі через Swapper:**
|
||
```python
|
||
load_resp = await http_client.post(
|
||
f"{SWAPPER_URL}/load",
|
||
json={"model": model_name}
|
||
)
|
||
```
|
||
|
||
3. **Отримання списку моделей:**
|
||
```python
|
||
resp = await http_client.get(f"{SWAPPER_URL}/models", timeout=5.0)
|
||
```
|
||
|
||
4. **Використання Swapper для генерації:**
|
||
- Router викликає Swapper API
|
||
- Swapper перевіряє чи модель завантажена
|
||
- Якщо ні - завантажує з Ollama
|
||
- Swapper викликає Ollama для генерації
|
||
- Результат повертається через Swapper → Router
|
||
|
||
### Потік запиту
|
||
|
||
```
|
||
Клієнт
|
||
↓
|
||
Router (9102)
|
||
↓ [визначає що потрібен LLM]
|
||
Swapper (8890)
|
||
↓ [перевіряє модель]
|
||
↓ [якщо не завантажена - завантажує]
|
||
Ollama (host:11434)
|
||
↓ [генерує відповідь]
|
||
Swapper
|
||
↓
|
||
Router
|
||
↓
|
||
Клієнт
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Поточний стан інтеграції
|
||
|
||
### ✅ Що працює
|
||
|
||
1. **Router:**
|
||
- ✅ Запущений та healthy
|
||
- ✅ Підключений до NATS
|
||
- ✅ Має 17 провайдерів
|
||
- ✅ Може викликати Swapper API
|
||
|
||
2. **Swapper:**
|
||
- ✅ Запущений та healthy
|
||
- ✅ Активна модель `gpt-oss-latest`
|
||
- ✅ Доступ до Ollama працює
|
||
- ✅ API працює
|
||
|
||
3. **Ollama:**
|
||
- ✅ Працює на хості
|
||
- ✅ 9 моделей доступні
|
||
- ✅ Модель `gpt-oss:latest` завантажена
|
||
|
||
### ⚠️ Потенційні проблеми
|
||
|
||
1. **Router використовує IP адресу:**
|
||
- `SWAPPER_URL=http://192.168.1.33:8890`
|
||
- Може не працювати якщо IP зміниться
|
||
- Краще використовувати Docker service name: `http://swapper-service:8890`
|
||
|
||
2. **Swapper не використовується активно:**
|
||
- Request count: 0
|
||
- Модель завантажена, але не використовується
|
||
- Можливо Router не викликає Swapper для генерації
|
||
|
||
3. **NATS Unhealthy:**
|
||
- Може впливати на messaging між сервісами
|
||
- Потрібна перевірка
|
||
|
||
---
|
||
|
||
## 🔍 Детальний аналіз коду
|
||
|
||
### Router викликає Swapper для:
|
||
|
||
1. **Health check** - перевірка доступності
|
||
2. **Load model** - завантаження моделі
|
||
3. **Get models** - отримання списку моделей
|
||
4. **Generate** - генерація тексту (через Swapper API)
|
||
|
||
### Swapper API endpoints:
|
||
|
||
- `GET /health` - перевірка здоров'я
|
||
- `GET /models` - список моделей
|
||
- `POST /models/{name}/load` - завантажити модель
|
||
- `POST /models/{name}/unload` - вивантажити модель
|
||
- `POST /generate` - генерація тексту
|
||
|
||
---
|
||
|
||
## 📝 Рекомендації
|
||
|
||
### 1. Виправити SWAPPER_URL в Router
|
||
```yaml
|
||
# Замість:
|
||
SWAPPER_URL=http://192.168.1.33:8890
|
||
|
||
# Використати:
|
||
SWAPPER_URL=http://swapper-service:8890
|
||
```
|
||
|
||
### 2. Протестувати інтеграцію
|
||
- Надіслати тестовий запит через Router
|
||
- Перевірити чи Router викликає Swapper
|
||
- Перевірити логи обох сервісів
|
||
|
||
### 3. Налаштувати моніторинг
|
||
- Додати метрики викликів Swapper з Router
|
||
- Логувати завантаження моделей
|
||
- Відстежувати використання моделей
|
||
|
||
---
|
||
|
||
## 🎯 Висновок
|
||
|
||
**НОДА2 працює наступним чином:**
|
||
|
||
1. ✅ **Router** - центральний маршрутизатор запитів
|
||
2. ✅ **Swapper** - динамічне завантаження моделей з Ollama
|
||
3. ✅ **Ollama** - локальний LLM runtime на хості
|
||
4. ✅ **Інтеграція** - Router може викликати Swapper для LLM завдань
|
||
|
||
**Потік:**
|
||
```
|
||
Запит → Router → Swapper → Ollama → Swapper → Router → Відповідь
|
||
```
|
||
|
||
**Статус:** ✅ Інтеграція налаштована та готова до використання
|
||
|
||
---
|
||
|
||
**Оновлено:** 2026-01-12
|
||
**Статус:** ✅ Аналіз завершено
|