Moteur : drapeaux de chargement à jour, -ngl auto ; dictée qui dit pourquoi

Les llama-server récents ont fusionné --mlock, --mmap et --no-mmap dans un
seul --load-mode, et refusent désormais d'ajuster les couches GPU dès qu'on
leur impose un nombre : « n_gpu_layers already set by user to 999, abort ».
Le moteur pousse alors tout sur le GPU et meurt en cudaMalloc, ou se replie
à moitié sur le CPU — débit effondré, GPU à 100 %.

- Traduction des drapeaux dépréciés AU LANCEMENT, pas dans le preset :
  --mlock → --load-mode mlock, --no-mmap → --load-mode none, --mmap →
  --load-mode mmap. Les interrupteurs de l'interface continuent d'écrire
  l'ancienne forme, et un moteur antérieur la reçoit telle quelle. Un
  --load-mode écrit à la main dans EXTRA_ARGS gagne sur tout.
- -ngl auto par défaut quand le moteur propose la valeur, 999 sinon (l'omettre
  sur un moteur ancien le ferait tourner 100 % CPU). NGL=<nombre> dans le
  preset reste souverain.
- --parallel et -ngl ne sont plus ajoutés en double quand EXTRA_ARGS les porte
  déjà : le moteur râlait (« specified multiple times ») et, pire, c'est la
  dernière occurrence qui gagne — le réglage explicite du preset était donc
  silencieusement écrasé par le défaut de Loki.
- Les capacités se lisent dans « <bin> --help », une seule fois par binaire
  (binHelp met en cache) au lieu d'un lancement par question.

Dictée : quand le téléchargement du modèle whisper échoue (conteneur sans
réseau, Hugging Face injoignable), le serveur renvoyait bien la raison mais
l'interface affichait quand même « téléchargement (0 %) ». L'erreur cachée
laissait cliquer indéfiniment sur un micro qui n'écrira jamais rien.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5 committed 2026-08-21 09:26:22 +02:00
1 parent 69bf8d985d
commit cbf8635c61
4 files changed
+232 -25

No files matched your search

+6 -1
View File
@@ -9241,7 +9241,12 @@ async function dictateStop(){
const r = await jfetch('/api/transcribe', {method:'POST', headers:{'Content-Type':'audio/wav'}, body:wav});
const j = await r.json().catch(()=>({}));
if(r.status === 503 && j.downloading){
toast('modèle de dictée en téléchargement ('+(j.pct||0)+' %) — réessaie dans un instant');
// Le serveur relance le téléchargement à chaque tentative ; s'il a déjà
// échoué (conteneur sans accès réseau, Hugging Face injoignable), il nous
// renvoie la raison. La cacher derrière « 0 % » laissait l'utilisateur
// cliquer indéfiniment sur un micro qui n'écrira jamais rien.
toast(j.error ? 'modèle de dictée : échec du téléchargement — ' + j.error
: 'modèle de dictée en téléchargement (' + (j.pct||0) + ' %) — réessaie dans un instant');
return;
}
if(!r.ok){ toast(j.error || 'échec de la transcription'); return; }
+6 -1
View File
@@ -48,7 +48,12 @@ async function dictateStop(){
const r = await jfetch('/api/transcribe', {method:'POST', headers:{'Content-Type':'audio/wav'}, body:wav});
const j = await r.json().catch(()=>({}));
if(r.status === 503 && j.downloading){
toast('modèle de dictée en téléchargement ('+(j.pct||0)+' %) — réessaie dans un instant');
// Le serveur relance le téléchargement à chaque tentative ; s'il a déjà
// échoué (conteneur sans accès réseau, Hugging Face injoignable), il nous
// renvoie la raison. La cacher derrière « 0 % » laissait l'utilisateur
// cliquer indéfiniment sur un micro qui n'écrira jamais rien.
toast(j.error ? 'modèle de dictée : échec du téléchargement — ' + j.error
: 'modèle de dictée en téléchargement (' + (j.pct||0) + ' %) — réessaie dans un instant');
return;
}
if(!r.ok){ toast(j.error || 'échec de la transcription'); return; }