Interface : « n-grammes (mod) » brut rejoint SPEC=ngram, migration proposée pour les anciens presets

L'éditeur de preset offrait deux fois les n-grammes du contexte : l'option
« n-grammes du contexte » (SPEC=ngram, bornes explicites et garde-fous de
Loki) et l'ancienne « n-grammes (mod) », qui écrivait --spec-type ngram-mod
tel quel dans EXTRA_ARGS. Le sélecteur n'écrit plus que SPEC.

- Option brute ngram-mod retirée de la liste.
- Un preset qui porte encore --spec-type ngram-mod l'affiche sous son nom
  (« réglé à la main dans EXTRA_ARGS »), et une ligne propose de passer à
  SPEC=ngram en disant ce qu'elle retirerait (--spec-type, --spec-ngram-*,
  --spec-draft-* : laissés, ils feraient ignorer SPEC ou refuser les
  n-grammes au lancement).
- Rien n'est réécrit à l'ouverture ni sans clic, et le moteur lit toujours le
  drapeau brut : les presets existants tournent comme avant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 14:16:36 +02:00
1 parent 432308c5b2
commit d50c8a56c6
3 files changed
+98 -6

No files matched your search

+49 -3
View File
@@ -3500,7 +3500,11 @@ html[data-files="1"] #files-btn{color:var(--accent)}
« MTP + n-grammes » écrivent la clé SPEC,
que Loki traduit au lancement (tête MTP détectée dans le fichier,
garde-fous VRAM) ; les autres types vont tels quels dans
--spec-type. « non » écrit SPEC=off. Le nombre de jetons anticipés
--spec-type. « non » écrit SPEC=off. ngram-mod n'y est plus en
type brut : c'est « n-grammes du contexte » (SPEC=ngram). Un
preset qui le porte encore dans EXTRA_ARGS l'affiche tel quel
(setSpecType) avec une migration proposée, jamais faite
d'office. Le nombre de jetons anticipés
(--spec-draft-n-max) n'a de sens qu'une fois un type choisi, donc
sa ligne n'apparaît qu'à ce moment. -->
<div class="pe-row">
@@ -3519,13 +3523,16 @@ html[data-files="1"] #files-btn{color:var(--accent)}
</optgroup>
<optgroup label="N-grammes (sans modèle brouillon)">
<option value="ngram-simple">n-grammes</option>
<option value="ngram-mod">n-grammes (mod)</option>
<option value="ngram-cache">n-grammes (cache)</option>
<option value="ngram-map-k">n-grammes (map-k)</option>
<option value="ngram-map-k4v">n-grammes (map-k4v)</option>
</optgroup>
</select></span></span>
</div>
<div class="pe-row" id="s-spec-migrate-row" style="display:none">
<span class="pe-row-l">N-grammes réglés à la main<span class="pe-sub" id="s-spec-migrate-sub"></span></span>
<span class="pe-row-c"><button class="pe-link" onclick="migrateSpecNgram()">Passer à SPEC=ngram</button></span>
</div>
<div class="pe-row" id="s-spec-n-row" style="display:none">
<span class="pe-row-l">Jetons anticipés<span class="pe-sub">par étape — défaut 3</span></span>
<span class="pe-row-c"><input id="s-spec-n" class="pe-val" type="number" min="1" step="1" placeholder="3" oninput="eaSetValued('--spec-draft-n-max', this.value)"></span>
@@ -6277,7 +6284,9 @@ function setSpecType(v){
v = String(v || '').trim();
if(v && ![...sel.options].some(o => o.value === v)){
const opt = document.createElement('option');
opt.value = v; opt.textContent = v + ' (dans la configuration)';
// ngram-mod n'est plus une option : un ancien preset qui le porte en
// drapeau brut le montre sous son nom, et syncSpecRow propose SPEC=ngram.
opt.value = v; opt.textContent = v === 'ngram-mod' ? 'n-grammes (mod) · réglé à la main dans EXTRA_ARGS' : v + ' (dans la configuration)';
sel.appendChild(opt);
}
sel.value = v;
@@ -6296,8 +6305,45 @@ function syncSpecRow(){
// visible pour qu'on puisse le retirer.
const dr = document.getElementById('s-draft-row');
if(dr) dr.style.display = (sel.value === 'auto' || sel.value === 'draft-mtp' || sel.value === 'mtp+ngram' || cfgReadKey('MODEL_DRAFT')) ? '' : 'none';
// Ancien --spec-type ngram-mod brut : migration proposée, ce qu'elle retire
// affiché avant le clic.
const mr = document.getElementById('s-spec-migrate-row');
if(mr){
const legacy = sel.value === 'ngram-mod';
mr.style.display = legacy ? '' : 'none';
const sub = document.getElementById('s-spec-migrate-sub');
if(legacy && sub) sub.textContent = '« n-grammes du contexte » (SPEC=ngram) fait la même chose, bornes explicites et garde-fous de Loki en plus (refus si des poids restent en RAM). Retirerait : ' + specManualSplit().removed.join(', ');
}
return on;
}
// Drapeaux d'un réglage spéculatif à la main que SPEC=ngram remplace. Restés
// dans EXTRA_ARGS, ils feraient ignorer SPEC (--spec-type, --spec-ngram-*) ou
// refuser les n-grammes (--spec-draft-*) au lancement.
function specManualSplit(){
const t = eaTokens(), keep = [], removed = [];
for(let i = 0; i < t.length; i++){
const f = t[i];
if(f === '--spec-type' || f.startsWith('--spec-ngram-') || f.startsWith('--spec-draft-')){
const hasVal = i+1 < t.length && !t[i+1].startsWith('-');
removed.push(hasVal ? f + ' ' + t[i+1] : f);
if(hasVal) i++;
continue;
}
keep.push(f);
}
return {keep, removed};
}
// Migration d'un ancien --spec-type ngram-mod vers SPEC=ngram, sur clic
// seulement : rien n'est écrit à l'ouverture du preset, qui tourne comme avant
// tant qu'on ne l'a pas enregistré après ce clic.
function migrateSpecNgram(){
eaSetTokens(specManualSplit().keep);
const n = document.getElementById('s-spec-n');
if(n) n.value = '';
cfgWriteKey('SPEC', 'ngram');
setSpecType('ngram');
toast("n-grammes : SPEC=ngram — enregistre le preset pour l'appliquer");
}
function onSpecType(){
const v = document.getElementById('s-spec').value;
const viaKey = v in SPEC_KEY_VALUES;
+9 -2
View File
@@ -1274,7 +1274,11 @@ document.documentElement.setAttribute('data-side',localStorage.getItem('loki-sid
« MTP + n-grammes » écrivent la clé SPEC,
que Loki traduit au lancement (tête MTP détectée dans le fichier,
garde-fous VRAM) ; les autres types vont tels quels dans
--spec-type. « non » écrit SPEC=off. Le nombre de jetons anticipés
--spec-type. « non » écrit SPEC=off. ngram-mod n'y est plus en
type brut : c'est « n-grammes du contexte » (SPEC=ngram). Un
preset qui le porte encore dans EXTRA_ARGS l'affiche tel quel
(setSpecType) avec une migration proposée, jamais faite
d'office. Le nombre de jetons anticipés
(--spec-draft-n-max) n'a de sens qu'une fois un type choisi, donc
sa ligne n'apparaît qu'à ce moment. -->
<div class="pe-row">
@@ -1293,13 +1297,16 @@ document.documentElement.setAttribute('data-side',localStorage.getItem('loki-sid
</optgroup>
<optgroup label="N-grammes (sans modèle brouillon)">
<option value="ngram-simple">n-grammes</option>
<option value="ngram-mod">n-grammes (mod)</option>
<option value="ngram-cache">n-grammes (cache)</option>
<option value="ngram-map-k">n-grammes (map-k)</option>
<option value="ngram-map-k4v">n-grammes (map-k4v)</option>
</optgroup>
</select></span></span>
</div>
<div class="pe-row" id="s-spec-migrate-row" style="display:none">
<span class="pe-row-l">N-grammes réglés à la main<span class="pe-sub" id="s-spec-migrate-sub"></span></span>
<span class="pe-row-c"><button class="pe-link" onclick="migrateSpecNgram()">Passer à SPEC=ngram</button></span>
</div>
<div class="pe-row" id="s-spec-n-row" style="display:none">
<span class="pe-row-l">Jetons anticipés<span class="pe-sub">par étape — défaut 3</span></span>
<span class="pe-row-c"><input id="s-spec-n" class="pe-val" type="number" min="1" step="1" placeholder="3" oninput="eaSetValued('--spec-draft-n-max', this.value)"></span>
+40 -1
View File
@@ -1263,7 +1263,9 @@ function setSpecType(v){
v = String(v || '').trim();
if(v && ![...sel.options].some(o => o.value === v)){
const opt = document.createElement('option');
opt.value = v; opt.textContent = v + ' (dans la configuration)';
// ngram-mod n'est plus une option : un ancien preset qui le porte en
// drapeau brut le montre sous son nom, et syncSpecRow propose SPEC=ngram.
opt.value = v; opt.textContent = v === 'ngram-mod' ? 'n-grammes (mod) · réglé à la main dans EXTRA_ARGS' : v + ' (dans la configuration)';
sel.appendChild(opt);
}
sel.value = v;
@@ -1282,8 +1284,45 @@ function syncSpecRow(){
// visible pour qu'on puisse le retirer.
const dr = document.getElementById('s-draft-row');
if(dr) dr.style.display = (sel.value === 'auto' || sel.value === 'draft-mtp' || sel.value === 'mtp+ngram' || cfgReadKey('MODEL_DRAFT')) ? '' : 'none';
// Ancien --spec-type ngram-mod brut : migration proposée, ce qu'elle retire
// affiché avant le clic.
const mr = document.getElementById('s-spec-migrate-row');
if(mr){
const legacy = sel.value === 'ngram-mod';
mr.style.display = legacy ? '' : 'none';
const sub = document.getElementById('s-spec-migrate-sub');
if(legacy && sub) sub.textContent = '« n-grammes du contexte » (SPEC=ngram) fait la même chose, bornes explicites et garde-fous de Loki en plus (refus si des poids restent en RAM). Retirerait : ' + specManualSplit().removed.join(', ');
}
return on;
}
// Drapeaux d'un réglage spéculatif à la main que SPEC=ngram remplace. Restés
// dans EXTRA_ARGS, ils feraient ignorer SPEC (--spec-type, --spec-ngram-*) ou
// refuser les n-grammes (--spec-draft-*) au lancement.
function specManualSplit(){
const t = eaTokens(), keep = [], removed = [];
for(let i = 0; i < t.length; i++){
const f = t[i];
if(f === '--spec-type' || f.startsWith('--spec-ngram-') || f.startsWith('--spec-draft-')){
const hasVal = i+1 < t.length && !t[i+1].startsWith('-');
removed.push(hasVal ? f + ' ' + t[i+1] : f);
if(hasVal) i++;
continue;
}
keep.push(f);
}
return {keep, removed};
}
// Migration d'un ancien --spec-type ngram-mod vers SPEC=ngram, sur clic
// seulement : rien n'est écrit à l'ouverture du preset, qui tourne comme avant
// tant qu'on ne l'a pas enregistré après ce clic.
function migrateSpecNgram(){
eaSetTokens(specManualSplit().keep);
const n = document.getElementById('s-spec-n');
if(n) n.value = '';
cfgWriteKey('SPEC', 'ngram');
setSpecType('ngram');
toast("n-grammes : SPEC=ngram — enregistre le preset pour l'appliquer");
}
function onSpecType(){
const v = document.getElementById('s-spec').value;
const viaKey = v in SPEC_KEY_VALUES;