diff --git a/internal/loki/ui/index.html b/internal/loki/ui/index.html
index 84080ab..984fc47 100644
--- a/internal/loki/ui/index.html
+++ b/internal/loki/ui/index.html
@@ -4420,8 +4420,12 @@ let pendingPreset = 0;
// redessin et la puce semblait clignoter en boucle. On ne les rejoue que quand la
// sélection CHANGE vraiment.
let paintedSel = '';
+// Dernière liste lue : l'éditeur y voit si le preset ouvert est celui en
+// service (ligne « Optimiser », qui ne mesure que lui).
+let presetsLast = [];
async function loadPresets(){
const p=await jget('/api/presets');
+ presetsLast = Array.isArray(p) ? p : [];
// Bascule terminée : le preset visé est devenu l'actif, on éteint l'attente.
if(pendingPreset && p[pendingPreset-1] && p[pendingPreset-1].active) pendingPreset = 0;
const act = p.find(x=>x.active);
@@ -6029,6 +6033,13 @@ function populateSettings(){
set('s-cram', cfgReadKey('CACHE_RAM'));
refreshCacheRAM();
refreshMoe();
+ // L'optimiseur mesure le preset EN SERVICE (local) : sa ligne n'apparaît que
+ // dans l'éditeur de celui-ci, pas d'un autre preset ni d'un preset neuf.
+ const tuneRow = document.getElementById('m-tune-row');
+ if(tuneRow){
+ const act = (typeof presetsLast !== 'undefined' ? presetsLast : []).find(x => x.active);
+ tuneRow.style.display = (act && !act.external && editingKey && act.id === editingKey) ? '' : 'none';
+ }
set('s-tbatch', cfgReadKey('THREADS_BATCH'));
set('s-kv', cfgReadKey('KV_TYPE'));
syncKVSub();
diff --git a/internal/loki/ui/src/js/06-settings.js b/internal/loki/ui/src/js/06-settings.js
index 7586771..467d8b0 100644
--- a/internal/loki/ui/src/js/06-settings.js
+++ b/internal/loki/ui/src/js/06-settings.js
@@ -34,8 +34,12 @@ let pendingPreset = 0;
// redessin et la puce semblait clignoter en boucle. On ne les rejoue que quand la
// sélection CHANGE vraiment.
let paintedSel = '';
+// Dernière liste lue : l'éditeur y voit si le preset ouvert est celui en
+// service (ligne « Optimiser », qui ne mesure que lui).
+let presetsLast = [];
async function loadPresets(){
const p=await jget('/api/presets');
+ presetsLast = Array.isArray(p) ? p : [];
// Bascule terminée : le preset visé est devenu l'actif, on éteint l'attente.
if(pendingPreset && p[pendingPreset-1] && p[pendingPreset-1].active) pendingPreset = 0;
const act = p.find(x=>x.active);
diff --git a/internal/loki/ui/src/js/07-models.js b/internal/loki/ui/src/js/07-models.js
index c5f78e3..49ad2d3 100644
--- a/internal/loki/ui/src/js/07-models.js
+++ b/internal/loki/ui/src/js/07-models.js
@@ -1019,6 +1019,13 @@ function populateSettings(){
set('s-cram', cfgReadKey('CACHE_RAM'));
refreshCacheRAM();
refreshMoe();
+ // L'optimiseur mesure le preset EN SERVICE (local) : sa ligne n'apparaît que
+ // dans l'éditeur de celui-ci, pas d'un autre preset ni d'un preset neuf.
+ const tuneRow = document.getElementById('m-tune-row');
+ if(tuneRow){
+ const act = (typeof presetsLast !== 'undefined' ? presetsLast : []).find(x => x.active);
+ tuneRow.style.display = (act && !act.external && editingKey && act.id === editingKey) ? '' : 'none';
+ }
set('s-tbatch', cfgReadKey('THREADS_BATCH'));
set('s-kv', cfgReadKey('KV_TYPE'));
syncKVSub();