refactor: remplacer les proxies Jean par un unique llm-proxy + WOL
- llm-proxy: 1 service, 4 routes (3011 Ollama, 3012 llama.cpp, 3015 STT, 3016 TTS) - Wake-on-LAN integre avec anti-spam (3 paquets magic, timeout 300s) - suppression de jean-router, jean-proxy, wol-proxy, litellm - OpenWebUI repointe vers le proxy (OpenAI 3012 + Ollama 3011 + STT 3015) - docs a jour (README, WOL)
This commit is contained in:
@@ -1,256 +0,0 @@
|
||||
# Session 2026-07-20 : jean-router et gestion VRAM dynamique
|
||||
|
||||
## Résumé
|
||||
|
||||
Création de **jean-router**, un proxy dynamique qui remplace LiteLLM pour router intelligemment entre Jean (llama.cpp) et Ollama, avec gestion automatique de la VRAM partagée.
|
||||
|
||||
## Contexte
|
||||
|
||||
### Problème initial
|
||||
- OpenWebUI ne voyait pas les modèles Jean (Ornith) car configuré uniquement pour Ollama
|
||||
- LiteLLM avait une configuration statique des modèles (codée en dur dans `litellm/config.yaml`)
|
||||
- Nouveaux presets Jean nécessitaient de modifier manuellement la config LiteLLM
|
||||
- Jean et Ollama partagent la même VRAM (RX 7800 XT, 16GB) → contention mémoire
|
||||
|
||||
### Architecture avant
|
||||
```
|
||||
OpenWebUI → LiteLLM:4000 (config statique)
|
||||
├→ jean-proxy:3012 → Jean (.11:8080)
|
||||
└→ wol-proxy:3011 → Ollama (.11:11434)
|
||||
```
|
||||
|
||||
**Problèmes :**
|
||||
- LiteLLM ne faisait pas de pass-through de `/v1/models`
|
||||
- Configuration statique : `qwen3.6-reason`, `qwen3.6-27b`, etc. codés en dur
|
||||
- Jean faisait tourner **Ornith** mais LiteLLM attendait Qwen3.6
|
||||
- Pas de gestion VRAM : Jean et Ollama pouvaient charger simultanément → OOM
|
||||
|
||||
## Solution : jean-router
|
||||
|
||||
### Architecture après
|
||||
```
|
||||
OpenWebUI → jean-router:3014 (routing dynamique)
|
||||
├→ jean-proxy:3012 → Jean (.11:8080)
|
||||
└→ wol-proxy:3011 → Ollama (.11:11434)
|
||||
```
|
||||
|
||||
### Fonctionnalités
|
||||
|
||||
**1. Découverte dynamique des modèles**
|
||||
- Interroge `/api/presets` de Jean (port 8090) pour lister les presets disponibles
|
||||
- Interroge `/api/tags` d'Ollama (port 11434) pour lister les modèles
|
||||
- Expose tout via `/v1/models` (API OpenAI-compatible)
|
||||
- **Nouveaux presets Jean automatiquement visibles dans OpenWebUI**
|
||||
|
||||
**2. Routing intelligent**
|
||||
- Si le modèle demandé est un preset Jean → switch automatique + route vers Jean
|
||||
- Si c'est un modèle Ollama → route vers Ollama
|
||||
- Sinon → erreur 404
|
||||
|
||||
**3. Gestion VRAM (RX 7800 XT, 16GB partagés)**
|
||||
|
||||
| Backend | Modèle typique | VRAM utilisée |
|
||||
|---------|---------------|---------------|
|
||||
| Jean | Ornith 35B Q6_K | ~28.5GB (déborde en RAM) |
|
||||
| Ollama | mistral/qwen3.5 | ~4-6GB |
|
||||
|
||||
**Logique de gestion :**
|
||||
|
||||
**Switch Jean → Ollama :**
|
||||
1. `stop_jean()` arrête Jean via son API web (port 8090)
|
||||
2. Attend confirmation que Jean est arrêté (max 30s)
|
||||
3. Route la requête vers Ollama
|
||||
|
||||
**Switch Ollama → Jean :**
|
||||
1. Programme le déchargement d'Ollama dans 5 minutes (timer)
|
||||
2. `start_jean()` redémarre Jean
|
||||
3. Attend que le modèle soit chargé (max 90s)
|
||||
4. Route la requête vers Jean
|
||||
|
||||
**Timer Ollama :**
|
||||
- Ollama reste en mémoire pendant **5 minutes** après le dernier usage
|
||||
- Chaque requête vers Ollama annule le timer
|
||||
- Si retour sur Ollama avant expiration → déchargement annulé
|
||||
- Après 5 min d'inactivité → déchargement automatique pour libérer VRAM
|
||||
|
||||
## Fichiers créés/modifiés
|
||||
|
||||
### Nouveau : `jean-router/`
|
||||
- `app.py` (320 lignes) : Service Flask avec routing dynamique + gestion VRAM
|
||||
- `Dockerfile` : Container Python 3.12-slim
|
||||
|
||||
### Modifiés :
|
||||
- `docker-compose.litellm.yml` :
|
||||
- Ajout service jean-router
|
||||
- Suppression service litellm
|
||||
- OpenWebUI pointe directement vers jean-router:3014
|
||||
- `litellm/config.yaml` : Supprimé (plus nécessaire)
|
||||
|
||||
### Configuration jean-router
|
||||
```yaml
|
||||
environment:
|
||||
- JEAN_WEB_HOST=${OLLAMA_HOST}
|
||||
- JEAN_WEB_PORT=8090
|
||||
- JEAN_PROXY_HOST=localhost
|
||||
- JEAN_PROXY_PORT=3012
|
||||
- OLLAMA_PROXY_HOST=localhost
|
||||
- OLLAMA_PROXY_PORT=3011
|
||||
- OLLAMA_DIRECT_HOST=${OLLAMA_HOST}
|
||||
- OLLAMA_DIRECT_PORT=11434
|
||||
- ENABLE_OLLAMA=true
|
||||
- ENABLE_VRAM_MANAGEMENT=true
|
||||
- OLLAMA_KEEP_ALIVE_MINUTES=5
|
||||
- LISTEN_PORT=3014
|
||||
- SWITCH_TIMEOUT=90
|
||||
- CHECK_INTERVAL=2
|
||||
- JEAN_STOP_TIMEOUT=30
|
||||
- OLLAMA_UNLOAD_TIMEOUT=15
|
||||
```
|
||||
|
||||
## Déploiement sur effi-server
|
||||
|
||||
### Initialisation du repo git
|
||||
Le dossier `/home/effi/effi` n'était pas un repo git. Initialisation :
|
||||
```bash
|
||||
cd /home/effi/effi
|
||||
git init
|
||||
git remote add origin https://gitea.folzocorp.fr/Folzo/Effi.git
|
||||
git fetch origin
|
||||
git checkout -b main origin/main
|
||||
```
|
||||
|
||||
**Note :** Conflits avec fichiers existants (docker-compose.yml, jean-proxy/, etc.) résolus en les déplaçant temporairement dans `/tmp/effi-backup/`.
|
||||
|
||||
### Commandes de déploiement
|
||||
```bash
|
||||
cd /home/effi/effi
|
||||
git pull
|
||||
docker compose -f docker-compose.yml -f docker-compose.litellm.yml up -d --build jean-router
|
||||
docker compose -f docker-compose.yml -f docker-compose.litellm.yml up -d --force-recreate open-webui
|
||||
docker stop litellm && docker rm litellm # Suppression LiteLLM
|
||||
```
|
||||
|
||||
## Tests et validation
|
||||
|
||||
### Modèles visibles dans OpenWebUI
|
||||
|
||||
**Jean (5 presets) :**
|
||||
- ornith-35b-q6 (actif, Q6_K, reasoning)
|
||||
- qwen3.6-27b-mtp (IQ4_XS, reasoning)
|
||||
- qwen3.6-35b-moe-compact
|
||||
- qwen3.6-35b-moe-compact-reason (reasoning)
|
||||
- qwen3.6-35b-moe-nano
|
||||
|
||||
**Ollama :**
|
||||
- mistral (7.2B, Q4_K_M, tools)
|
||||
- qwen3.5:9b (9.7B, Q4_K_M, vision, thinking)
|
||||
|
||||
### Logs observés
|
||||
|
||||
**Switch Jean → Ollama :**
|
||||
```
|
||||
[VRAM] Switch Jean → Ollama
|
||||
[VRAM] Arrêt de Jean pour libérer la VRAM...
|
||||
[VRAM] Jean arrêté via API web
|
||||
[VRAM] Jean confirmé arrêté
|
||||
[Router] → Ollama (gemma4:e4b)
|
||||
```
|
||||
|
||||
**Switch Ollama → Jean :**
|
||||
```
|
||||
[VRAM] Switch Ollama → Jean
|
||||
[VRAM] Déchargement Ollama programmé dans 5 minutes
|
||||
[VRAM] Démarrage de Jean...
|
||||
[VRAM] Jean prêt après 45s
|
||||
[Router] → Jean (ornith-35b-q6)
|
||||
```
|
||||
|
||||
**Timer Ollama :**
|
||||
```
|
||||
[VRAM] Timer écoulé (5min), déchargement Ollama...
|
||||
[VRAM] Ollama déchargé via API
|
||||
```
|
||||
|
||||
## Avantages
|
||||
|
||||
1. **Dynamique** : Nouveaux presets Jean automatiquement visibles sans modifier de config
|
||||
2. **Simplifié** : Une couche de moins (LiteLLM supprimé)
|
||||
3. **VRAM-safe** : Pas de contention mémoire entre Jean et Ollama
|
||||
4. **Intelligent** : Ollama reste en mémoire 5 min pour les usages répétés
|
||||
5. **Transparent** : OpenWebUI voit tous les modèles via un seul endpoint
|
||||
|
||||
## Limitations et points d'attention
|
||||
|
||||
### 1. Jean n'a pas d'auto-unload natif
|
||||
- Ollama décharge automatiquement après `OLLAMA_KEEP_ALIVE` (défaut 5min)
|
||||
- Jean garde son modèle chargé tant que le service tourne
|
||||
- **Solution actuelle** : Arrêt complet de Jean via API web
|
||||
|
||||
### 2. Latence de switch
|
||||
- Jean → Ollama : ~3s (arrêt Jean)
|
||||
- Ollama → Jean : ~45-90s (démarrage + chargement modèle)
|
||||
- **Impact** : Première requête après switch plus lente
|
||||
|
||||
### 3. Timer Ollama non-persistant
|
||||
- Si jean-router redémarre, le timer est perdu
|
||||
- Ollama restera en mémoire indéfiniment (jusqu'à son propre timeout)
|
||||
- **Acceptable** : Ollama gère son propre `keep_alive`
|
||||
|
||||
### 4. Pas de failover
|
||||
- Si Jean échoue (timeout, erreur), pas de fallback automatique vers Ollama
|
||||
- **À considérer** : Ajouter un fallback dans jean-router si besoin
|
||||
|
||||
## Commits Gitea
|
||||
|
||||
```
|
||||
8b7c4fb feat: add VRAM management for Jean/Ollama switching
|
||||
20767c2 feat: keep Ollama models in memory for 5 minutes
|
||||
babe4ee chore: add OLLAMA_KEEP_ALIVE_MINUTES=5 to docker-compose
|
||||
43aacc0 refactor: OpenWebUI points directly to jean-router (no LiteLLM needed)
|
||||
856ba4a refactor: remove LiteLLM, jean-router handles all routing
|
||||
fcad415 feat: jean-router — routing dynamique Jean + Ollama
|
||||
b441f34 fix: jean-router syntax error (missing except block)
|
||||
```
|
||||
|
||||
## Réflexions et décisions
|
||||
|
||||
### Pourquoi supprimer LiteLLM ?
|
||||
- LiteLLM ne faisait pas de pass-through de `/v1/models`
|
||||
- Configuration statique incompatible avec les presets dynamiques de Jean
|
||||
- Couche supplémentaire inutile : jean-router fait le même travail
|
||||
- **Décision** : OpenWebUI pointe directement vers jean-router:3014
|
||||
|
||||
### Pourquoi garder Ollama en mémoire 5 min ?
|
||||
- Ollama sert principalement pour la vision (modèles que Jean ne supporte pas)
|
||||
- Usage typique : quelques requêtes vision consécutives, puis retour à Jean
|
||||
- 5 min = bon compromis entre réactivité et libération VRAM
|
||||
- **Configurable** : `OLLAMA_KEEP_ALIVE_MINUTES` dans docker-compose
|
||||
|
||||
### Pourquoi arrêter Jean complètement ?
|
||||
- Jean n'a pas d'API pour décharger le modèle sans arrêter le service
|
||||
- Le modèle reste en VRAM tant que llama-server tourne
|
||||
- **Alternative envisagée** : `systemctl stop jean` (mais nécessite sudo)
|
||||
- **Solution retenue** : API web de Jean (`/api/stop`) plus simple
|
||||
|
||||
### Architecture future possible
|
||||
- **JeanOrchestrator** : Jean pourrait gérer lui-même le switch entre presets
|
||||
- **VRAM monitoring** : jean-router pourrait vérifier la VRAM disponible avant de router
|
||||
- **Fallback automatique** : Si Jean échoue, router vers Ollama
|
||||
- **Metrics** : Exposer des statistiques (temps de switch, VRAM utilisée, etc.)
|
||||
|
||||
## Prochaines étapes
|
||||
|
||||
1. **Monitorer** : Vérifier que la gestion VRAM fonctionne bien en production
|
||||
2. **Ajuster** : Modifier `OLLAMA_KEEP_ALIVE_MINUTES` selon l'usage réel
|
||||
3. **Documenter** : Mettre à jour `docs/ARCHITECTURE-LITELLM.md` (à renommer `ARCHITECTURE-JEAN-ROUTER.md`)
|
||||
4. **Tester** : Valider que les nouveaux presets Jean apparaissent bien automatiquement
|
||||
|
||||
## Conclusion
|
||||
|
||||
**jean-router** remplace avantageusement LiteLLM avec :
|
||||
- Routing dynamique basé sur les presets Jean
|
||||
- Gestion automatique de la VRAM partagée
|
||||
- Architecture simplifiée (une couche de moins)
|
||||
- Nouveaux modèles automatiquement disponibles
|
||||
|
||||
L'architecture est maintenant prête pour Effi : quand un nouveau preset Jean est créé, il apparaît immédiatement dans OpenWebUI sans aucune configuration supplémentaire.
|
||||
@@ -1,313 +0,0 @@
|
||||
# Architecture LLM — jean-router (routing dynamique + gestion VRAM)
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ OpenWebUI (:3000) │
|
||||
│ http://192.168.1.27:3000 │
|
||||
└────────────────────────┬────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ jean-router (:3014) │
|
||||
│ Routing dynamique + Gestion VRAM automatique │
|
||||
│ │
|
||||
│ • Interroge Jean /api/presets (découverte dynamique) │
|
||||
│ • Interroge Ollama /api/tags (modèles vision) │
|
||||
│ • Switch automatique de preset Jean │
|
||||
│ • Arrête Jean quand on passe sur Ollama (libère VRAM) │
|
||||
│ • Garde Ollama 5 min en mémoire avant déchargement │
|
||||
└────────┬──────────────────────────────────────┬────────────────┘
|
||||
│ │
|
||||
▼ ▼
|
||||
┌────────────────────────┐ ┌────────────────────────┐
|
||||
│ jean-proxy (:3012) │ │ wol-proxy (:3011) │
|
||||
│ + WOL si PC éteint │ │ + WOL si PC éteint │
|
||||
└────────┬───────────────┘ └────────┬───────────────┘
|
||||
│ │
|
||||
▼ ▼
|
||||
┌────────────────────────┐ ┌────────────────────────┐
|
||||
│ Jean (.11:8080) │ │ Ollama (.11:11434) │
|
||||
│ llama.cpp server │ │ Modèles vision │
|
||||
│ Presets dynamiques │ │ mistral, qwen3.5 │
|
||||
│ Ornith, Qwen3.6... │ │ │
|
||||
└────────────────────────┘ └────────────────────────┘
|
||||
```
|
||||
|
||||
## Composants
|
||||
|
||||
### jean-router (`/jean-router/`) — Proxy dynamique
|
||||
|
||||
**Rôle :** Router intelligemment entre Jean et Ollama avec gestion VRAM
|
||||
|
||||
**Fonctionnalités :**
|
||||
1. **Découverte dynamique** : Interroge `/api/presets` (Jean) et `/api/tags` (Ollama)
|
||||
2. **Routing intelligent** : Route vers Jean ou Ollama selon le modèle demandé
|
||||
3. **Switch automatique** : Change de preset Jean si nécessaire
|
||||
4. **Gestion VRAM** : Évite la contention mémoire entre Jean et Ollama
|
||||
|
||||
**Endpoints :**
|
||||
- `GET /v1/models` : Liste tous les modèles (Jean + Ollama)
|
||||
- `POST /v1/chat/completions` : Route vers le bon backend
|
||||
|
||||
**Configuration :**
|
||||
```bash
|
||||
JEAN_WEB_HOST=192.168.1.11 # Jean Web UI (API presets)
|
||||
JEAN_WEB_PORT=8090
|
||||
JEAN_PROXY_HOST=localhost # jean-proxy (backend Jean)
|
||||
JEAN_PROXY_PORT=3012
|
||||
OLLAMA_PROXY_HOST=localhost # wol-proxy (backend Ollama)
|
||||
OLLAMA_PROXY_PORT=3011
|
||||
OLLAMA_DIRECT_HOST=192.168.1.11 # Ollama direct (pour unload)
|
||||
OLLAMA_DIRECT_PORT=11434
|
||||
ENABLE_OLLAMA=true
|
||||
ENABLE_VRAM_MANAGEMENT=true
|
||||
OLLAMA_KEEP_ALIVE_MINUTES=5 # Ollama reste 5 min en mémoire
|
||||
SWITCH_TIMEOUT=90 # Timeout chargement Jean (s)
|
||||
JEAN_STOP_TIMEOUT=30 # Timeout arrêt Jean (s)
|
||||
LISTEN_PORT=3014
|
||||
```
|
||||
|
||||
### jean-proxy (`/jean-proxy/`) — Reverse-proxy Jean + WOL
|
||||
|
||||
**Rôle :** Proxy vers Jean avec Wake-on-LAN si le PC gaming est éteint
|
||||
|
||||
**Fonctionnalités :**
|
||||
- Écoute `:3012` sur le host (`network_mode: host`)
|
||||
- Health-check : `GET /health` sur Jean
|
||||
- Si cible DOWN → envoi paquets WOL vers `TARGET_MAC`
|
||||
- Attente jusqu'à `WAKE_TIMEOUT` (60s)
|
||||
- Route toutes les requêtes vers `http://${OLLAMA_HOST}:8080`
|
||||
|
||||
**Configuration :**
|
||||
```bash
|
||||
TARGET_HOST=192.168.1.11
|
||||
TARGET_PORT=8080
|
||||
TARGET_MAC=04:D9:F5:D1:EC:DF
|
||||
LISTEN_PORT=3012
|
||||
WAKE_TIMEOUT=60
|
||||
CHECK_INTERVAL=5
|
||||
BROADCAST_IP=192.168.1.255
|
||||
HEALTH_PATH=/health
|
||||
```
|
||||
|
||||
### wol-proxy (`/wol-proxy/`) — Reverse-proxy Ollama + WOL
|
||||
|
||||
**Rôle :** Proxy vers Ollama avec Wake-on-LAN
|
||||
|
||||
**Fonctionnalités :**
|
||||
- Écoute `:3011` sur le host
|
||||
- Health-check : `GET /api/version` sur Ollama
|
||||
- Si cible DOWN → envoi paquets WOL
|
||||
- Route toutes les requêtes vers `http://${OLLAMA_HOST}:11434`
|
||||
|
||||
**Configuration :**
|
||||
```bash
|
||||
TARGET_HOST=192.168.1.11
|
||||
TARGET_PORT=11434
|
||||
TARGET_MAC=04:D9:F5:D1:EC:DF
|
||||
LISTEN_PORT=3011
|
||||
WAKE_TIMEOUT=180
|
||||
CHECK_INTERVAL=5
|
||||
BROADCAST_IP=192.168.1.255
|
||||
```
|
||||
|
||||
## Gestion VRAM
|
||||
|
||||
### Problème
|
||||
Jean et Ollama partagent la même carte graphique (RX 7800 XT, 16GB VRAM). Charger les deux simultanément cause une contention mémoire.
|
||||
|
||||
| Backend | Modèle typique | VRAM utilisée |
|
||||
|---------|---------------|---------------|
|
||||
| Jean | Ornith 35B Q6_K | ~28.5GB (déborde en RAM) |
|
||||
| Ollama | mistral 7B Q4_K_M | ~4GB |
|
||||
| Ollama | qwen3.5:9b Q4_K_M | ~6GB |
|
||||
|
||||
### Solution : Switch automatique
|
||||
|
||||
**Switch Jean → Ollama :**
|
||||
```
|
||||
1. Arrêt de Jean via API web (/api/stop)
|
||||
2. Attente confirmation (max 30s)
|
||||
3. Route requête vers Ollama
|
||||
```
|
||||
|
||||
**Switch Ollama → Jean :**
|
||||
```
|
||||
1. Programme déchargement Ollama dans 5 min (timer)
|
||||
2. Démarrage de Jean via API web (/api/start)
|
||||
3. Attente chargement modèle (max 90s)
|
||||
4. Route requête vers Jean
|
||||
```
|
||||
|
||||
**Timer Ollama :**
|
||||
- Ollama reste en mémoire pendant **5 minutes** après le dernier usage
|
||||
- Chaque requête vers Ollama annule le timer
|
||||
- Si retour sur Ollama avant expiration → déchargement annulé
|
||||
- Après 5 min d'inactivité → déchargement automatique
|
||||
|
||||
### Logs observés
|
||||
|
||||
**Switch Jean → Ollama :**
|
||||
```
|
||||
[VRAM] Switch Jean → Ollama
|
||||
[VRAM] Arrêt de Jean pour libérer la VRAM...
|
||||
[VRAM] Jean arrêté via API web
|
||||
[VRAM] Jean confirmé arrêté
|
||||
[Router] → Ollama (gemma4:e4b)
|
||||
```
|
||||
|
||||
**Switch Ollama → Jean :**
|
||||
```
|
||||
[VRAM] Switch Ollama → Jean
|
||||
[VRAM] Déchargement Ollama programmé dans 5 minutes
|
||||
[VRAM] Démarrage de Jean...
|
||||
[VRAM] Jean prêt après 45s
|
||||
[Router] → Jean (ornith-35b-q6)
|
||||
```
|
||||
|
||||
**Timer Ollama :**
|
||||
```
|
||||
[VRAM] Timer écoulé (5min), déchargement Ollama...
|
||||
[VRAM] Ollama déchargé via API
|
||||
```
|
||||
|
||||
## Modèles disponibles
|
||||
|
||||
### Jean (presets dynamiques)
|
||||
Les presets sont découverts automatiquement via `/api/presets` :
|
||||
- **ornith-35b-q6** (actif, Q6_K, reasoning)
|
||||
- **qwen3.6-27b-mtp** (IQ4_XS, reasoning)
|
||||
- **qwen3.6-35b-moe-compact**
|
||||
- **qwen3.6-35b-moe-compact-reason** (reasoning)
|
||||
- **qwen3.6-35b-moe-nano**
|
||||
|
||||
**Note :** Nouveaux presets Jean apparaissent automatiquement dans OpenWebUI sans configuration.
|
||||
|
||||
### Ollama (modèles vision)
|
||||
- **mistral** (7.2B, Q4_K_M, tools)
|
||||
- **qwen3.5:9b** (9.7B, Q4_K_M, vision, thinking)
|
||||
|
||||
**Note :** Ollama sert principalement pour les modèles avec vision que Jean ne supporte pas.
|
||||
|
||||
## Déploiement
|
||||
|
||||
### Commandes (sur effi-server .27)
|
||||
|
||||
```bash
|
||||
cd /home/effi/effi
|
||||
git pull
|
||||
|
||||
# Build et démarrage jean-router
|
||||
docker compose -f docker-compose.yml -f docker-compose.litellm.yml up -d --build jean-router
|
||||
|
||||
# Recréer open-webui avec nouvelle config
|
||||
docker compose -f docker-compose.yml -f docker-compose.litellm.yml up -d --force-recreate open-webui
|
||||
|
||||
# Vérifier
|
||||
docker logs jean-router --tail 20
|
||||
curl -s http://localhost:3014/v1/models | jq
|
||||
```
|
||||
|
||||
### Tests
|
||||
|
||||
**1. Liste des modèles :**
|
||||
```bash
|
||||
curl -s http://localhost:3014/v1/models | python3 -m json.tool
|
||||
```
|
||||
|
||||
**2. Requête Jean :**
|
||||
```bash
|
||||
curl -X POST http://localhost:3014/v1/chat/completions \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "ornith-35b-q6",
|
||||
"messages": [{"role": "user", "content": "Bonjour"}],
|
||||
"max_tokens": 50
|
||||
}'
|
||||
```
|
||||
|
||||
**3. Requête Ollama :**
|
||||
```bash
|
||||
curl -X POST http://localhost:3014/v1/chat/completions \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "mistral",
|
||||
"messages": [{"role": "user", "content": "Hello"}],
|
||||
"max_tokens": 30
|
||||
}'
|
||||
```
|
||||
|
||||
**4. Vérifier logs VRAM :**
|
||||
```bash
|
||||
docker logs jean-router -f | grep -E "VRAM|Router"
|
||||
```
|
||||
|
||||
## Avantages vs LiteLLM
|
||||
|
||||
| Aspect | LiteLLM | jean-router |
|
||||
|--------|---------|-------------|
|
||||
| Configuration | Statique (config.yaml) | Dynamique (API Jean) |
|
||||
| Nouveaux presets | Modifier config + restart | Automatique |
|
||||
| Pass-through /v1/models | Non | Oui |
|
||||
| Gestion VRAM | Aucune | Automatique |
|
||||
| Couches | 2 (LiteLLM + jean-proxy) | 1 (jean-router) |
|
||||
| Complexité | Élevée | Faible |
|
||||
|
||||
## Limitations
|
||||
|
||||
### 1. Latence de switch
|
||||
- Jean → Ollama : ~3s (arrêt Jean)
|
||||
- Ollama → Jean : ~45-90s (démarrage + chargement modèle)
|
||||
- **Impact** : Première requête après switch plus lente
|
||||
|
||||
### 2. Timer Ollama non-persistant
|
||||
- Si jean-router redémarre, le timer est perdu
|
||||
- Ollama restera en mémoire indéfiniment (jusqu'à son propre timeout)
|
||||
- **Acceptable** : Ollama gère son propre `keep_alive`
|
||||
|
||||
### 3. Pas de failover
|
||||
- Si Jean échoue (timeout, erreur), pas de fallback automatique vers Ollama
|
||||
- **À considérer** : Ajouter un fallback dans jean-router si besoin
|
||||
|
||||
### 4. Jean n'a pas d'auto-unload natif
|
||||
- Ollama décharge automatiquement après `OLLAMA_KEEP_ALIVE` (défaut 5min)
|
||||
- Jean garde son modèle chargé tant que le service tourne
|
||||
- **Solution actuelle** : Arrêt complet de Jean via API web
|
||||
|
||||
## Évolution possible
|
||||
|
||||
### Court terme
|
||||
- **Monitorer** : Vérifier que la gestion VRAM fonctionne bien en production
|
||||
- **Ajuster** : Modifier `OLLAMA_KEEP_ALIVE_MINUTES` selon l'usage réel
|
||||
- **Tester** : Valider que les nouveaux presets Jean apparaissent bien automatiquement
|
||||
|
||||
### Moyen terme
|
||||
- **VRAM monitoring** : jean-router pourrait vérifier la VRAM disponible avant de router
|
||||
- **Fallback automatique** : Si Jean échoue, router vers Ollama
|
||||
- **Metrics** : Exposer des statistiques (temps de switch, VRAM utilisée, etc.)
|
||||
|
||||
### Long terme
|
||||
- **JeanOrchestrator** : Jean pourrait gérer lui-même le switch entre presets
|
||||
- **Multi-GPU** : Si plusieurs GPU, router vers celui avec le plus de VRAM libre
|
||||
- **Load balancing** : Si plusieurs instances Jean/Ollama, répartir la charge
|
||||
|
||||
## Historique
|
||||
|
||||
**2026-06-27** : Architecture initiale avec LiteLLM
|
||||
- Routing statique par nom de modèle
|
||||
- Configuration codée en dur dans `litellm/config.yaml`
|
||||
|
||||
**2026-07-20** : Migration vers jean-router
|
||||
- Routing dynamique basé sur les presets Jean
|
||||
- Gestion automatique de la VRAM
|
||||
- Suppression de LiteLLM (une couche de moins)
|
||||
- Nouveaux modèles automatiquement disponibles
|
||||
|
||||
## Références
|
||||
|
||||
- **Code jean-router** : `/jean-router/app.py`
|
||||
- **Docker compose** : `/docker-compose.litellm.yml`
|
||||
- **Journal de session** : `/docs/05-journal/SESSION-2026-07-20-JEAN-ROUTER.md`
|
||||
- **Repo Gitea** : https://gitea.folzocorp.fr/Folzo/Effi
|
||||
@@ -8,11 +8,18 @@ Guide pour s'assurer que tous les services Effi démarrent automatiquement aprè
|
||||
|
||||
| Service | Port | Docker | Dépendance WOL |
|
||||
|---------|------|--------|----------------|
|
||||
| **llama.cpp** | 8080 | Native (systemd) | Oui |
|
||||
| **Ollama** | 11434 | ✅ | Oui |
|
||||
| **Effi-STT** | 8200 | ✅ | Oui |
|
||||
| **openedai-speech** | 8100 | ✅ | Oui |
|
||||
| **ComfyUI** | 8188 | ✅ | Oui |
|
||||
|
||||
> **Note :** le TTS (openedai-speech, port 8100) tourne désormais sur l'effi-server,
|
||||
> pas sur folzo-Corp. Il n'a donc pas besoin de WOL.
|
||||
|
||||
Le réveil est géré automatiquement par **`llm-proxy`** (effi-server) : au premier appel
|
||||
vers une cible éteinte, il envoie 3 paquets magic (MAC du PC) puis attend que le service
|
||||
soit prêt. Aucun script manuel nécessaire.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Configuration du démarrage automatique
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
# Roadmap : wol-proxy → Orchestrateur Ollama
|
||||
|
||||
## Vision
|
||||
|
||||
Transformer le wol-proxy en point d'entree central pour TOUS les appels a Ollama,
|
||||
avec des fonctions d'orchestration.
|
||||
|
||||
## Fonctionnalites futures
|
||||
|
||||
### 1. Logs centralises
|
||||
- Enregistrer chaque requete : modele, prompt (taille), duree, status
|
||||
- Detecter les erreurs recurrentes (timeout, 502, VRAM full)
|
||||
- Tableau de bord des performances par modele
|
||||
|
||||
### 2. Temporisation / File d attente
|
||||
- Si Open WebUI utilise deja Ollama (GPU occupe), mettre en file d attente
|
||||
- Empecher les conflits VRAM entre services
|
||||
- File FIFO avec timeout max
|
||||
|
||||
### 3. Orchestration multi-services
|
||||
- Open WebUI (port 3000)
|
||||
- Hermes Agent (profil local)
|
||||
- Scripts de test automatises
|
||||
- Futurs outils (n8n, pipelines RAG...)
|
||||
|
||||
### 4. Cache intelligent
|
||||
- Mettre en cache les reponses identiques (system prompt identique)
|
||||
- Cache-hit pricing comme DeepSeek
|
||||
- Invalidation par duree ou par modele
|
||||
|
||||
### 5. Mode degraded
|
||||
- Si PC gaming en veille : renvoyer une reponse "PC en veille, reessayez"
|
||||
- Planifier un reveil automatique (cron)
|
||||
- Fallback vers un petit modele local sur le J5040 si PC indisponible
|
||||
|
||||
### 6. Healthcheck / Monitoring
|
||||
- Ping regulier du PC pour savoir s'il est eveille
|
||||
- Statistiques : temps de reveil moyen, duree des requetes
|
||||
- Alertes si PC injoignable depuis plus de X minutes
|
||||
|
||||
## Stack technique envisagee
|
||||
|
||||
```yaml
|
||||
# Proposition d evolution du docker-compose
|
||||
wol-orchestrator:
|
||||
build: ./wol-orchestrator
|
||||
volumes:
|
||||
- ./logs:/var/log/orchestrator
|
||||
- ./cache:/var/cache/orchestrator
|
||||
environment:
|
||||
- REDIS_URL=redis://redis:6379 # File d attente
|
||||
- LOG_LEVEL=info
|
||||
- WAKE_TIMEOUT=180
|
||||
- REQUEST_TIMEOUT=300
|
||||
- MAX_QUEUE=10
|
||||
```
|
||||
|
||||
## Priorite
|
||||
|
||||
| Fonction | Priorite | Effort | Impact |
|
||||
|----------|----------|--------|--------|
|
||||
| Logs | Haute | Faible | Utile tout de suite |
|
||||
| File attente | Haute | Moyen | Evite conflits VRAM |
|
||||
| Cache | Moyenne | Moyen | Economise tokens |
|
||||
| Orchestration | Moyenne | Important | Architecture propre |
|
||||
| Mode degrade | Basse | Moyen | Securite |
|
||||
| Monitoring | Basse | Faible | Visibilite |
|
||||
|
||||
## Note
|
||||
|
||||
Idee originale de Folzo (juin 2026) — a implementer avec OpenCode Go ou un
|
||||
langage adapte (Go, Rust ou Python selon les besoins de performance).
|
||||
Reference in New Issue
Block a user