perf: fix model reload thrash and cut time-to-first-token

Ollama reloaded the chat model mid-message because plan/summary/router
calls sent divergent runner options (no num_ctx/num_batch) and omitted
keep_alive — the main cause of perceived slowness.

- share one keep-alive httpx.AsyncClient for all Ollama calls
- unify runner options (runner_options) + keep_alive on every model
  call, embeddings included
- drop the blocking LLM routing fallback (pure lexical heuristic)
- run RAG recall + plan + code-model pick in parallel inside the SSE
  stream, after the start event
- RAG cosine scoring off the event loop; cache /api/tags 30s and
  nvidia-smi 5s; frontend polls 2s->5s, warm poll backoff, dedup
  config fetch

feat: working session menu in TopBar (switch/create/rename/delete)
feat: workspace file deletion (DELETE /api/files + UI trash buttons)
docs: recommended Ollama env vars (KEEP_ALIVE, MAX_LOADED_MODELS...)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 4.8 committed 2026-07-18 13:58:18 +02:00
1 parent 552548e4b4
commit cb2872c78a
23 files changed
+672 -224

No files matched your search

+35 -3
View File
@@ -129,6 +129,38 @@ message suivant paie alors un rechargement complet (lent). Loki évite ça :
- **Indicateur d'état** : la pastille du sélecteur de modèle est verte quand le
modèle est chargé sur GPU, orange sur CPU, blanche s'il reste à charger.
## Performance Ollama (recommandé)
Réglages **côté serveur Ollama** qui rendent Loki nettement plus fluide
(variables d'environnement du service/conteneur Ollama, redémarrage requis) :
| Variable | Valeur conseillée | Effet |
| -------- | ----------------- | ----- |
| `OLLAMA_KEEP_ALIVE` | `30m` (ou `-1`) | Durée de rétention par défaut d'un modèle en VRAM. `-1` = jamais déchargé (machine dédiée). Doit être ≥ au `keep_alive` configuré dans Loki. |
| `OLLAMA_MAX_LOADED_MODELS` | `2` | Autorise le modèle de chat **et** le modèle d'embedding (RAG) à résider ensemble en VRAM — supprime les allers-retours de chargement à chaque message. |
| `OLLAMA_NUM_PARALLEL` | `1` | Loki est mono-utilisateur ; chaque slot parallèle multiplie la VRAM du cache KV. |
| `OLLAMA_FLASH_ATTENTION` | `1` | Attention plus rapide et plus sobre en VRAM. |
| `OLLAMA_KV_CACHE_TYPE` | `q8_0` | Cache KV quantifié : ~moitié de VRAM en moins, marge pour un 12B sur 12 Go. |
Exemple pour un Ollama en Docker (service `ollama` du compose) :
```yaml
ollama:
image: ollama/ollama
environment:
- OLLAMA_KEEP_ALIVE=30m
- OLLAMA_MAX_LOADED_MODELS=2
- OLLAMA_NUM_PARALLEL=1
- OLLAMA_FLASH_ATTENTION=1
- OLLAMA_KV_CACHE_TYPE=q8_0
```
Côté Loki, tout est déjà optimisé : pool HTTP keep-alive partagé vers Ollama,
options runner identiques sur tous les appels (pas de rechargement du modèle en
plein message), `keep_alive` systématique (chat **et** embeddings), préparation
du contexte (RAG + plan) en parallèle après l'ouverture du flux, et caches
courts (`/api/tags`, stats GPU).
## Modes d'exécution (Plan / Build / Yolo)
Un sélecteur dans le composer contrôle le niveau d'autonomie de l'agent :
@@ -188,9 +220,9 @@ efficaces même avec de petits modèles), repo map, et **commits git
automatiques** dans le workspace.
**C'est invisible** : un routeur classe chaque message.
- Tâche de code détectée (heuristique + micro-classification LLM sur les cas
ambigus) → le message part au **moteur code** ; le fil affiche la carte
`code_task`, les fichiers modifiés et le commit.
- Tâche de code détectée (heuristique lexicale instantanée) → le message part
au **moteur code** ; le fil affiche la carte `code_task`, les fichiers
modifiés et le commit.
- Sinon → **boucle agent** classique ; et l'agent peut lui-même déléguer au
moteur via l'outil `code_task` quand il juge qu'il faut coder.