Presets externes : vision, compactage, bench et badge pour une API distante

La reprise faite en parallèle sur l'autre branche (b667fd4, jamais poussée)
couvrait des trous de celle-ci. Ses ajouts, posés sur la version en place :

- chat_template_kwargs, propre à llama.cpp, ne part plus vers une API
  distante — ni au chat ni au résumé de compactage. Une API stricte
  (OpenAI) répond 400 à un argument inconnu : toute compaction échouait.
- Vision : case « le modèle accepte les images » (EXTERNAL_VISION) dans la
  fenêtre API externe. Elle remplace, en externe, MMPROJ et la sonde
  /props : un modèle distant multimodal ne pouvait jamais recevoir d'image.
- Le benchmark refuse de tourner sur un preset externe : healthCheck le dit
  prêt sans moteur, et la mesure tapait un port arrêté ou un moteur resté
  en vie, attribuée à tort à ce preset.
- Le badge de modèle des réponses porte le nom du modèle distant.
- Éditer le preset en service l'applique aussitôt (SavePresetApplying).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-02 23:13:56 +02:00
1 parent 48b8193dca
commit 2db0ecd431
12 files changed
+124 -17

No files matched your search

+7 -3
View File
@@ -49,6 +49,7 @@ func handlePresetExternal(w http.ResponseWriter, r *http.Request) {
"model": strings.TrimSpace(cfg[extKeyModel]),
"ctx": strings.TrimSpace(cfg["CTX"]),
"hasKey": strings.TrimSpace(cfg[extKeyToken]) != "",
"vision": strings.TrimSpace(cfg[extKeyVision]) == "1",
})
}
@@ -63,6 +64,7 @@ type externalSaveReq struct {
Key string `json:"key"`
Ctx string `json:"ctx"` // taille de contexte (clé CTX), optionnelle
KeyTouched bool `json:"keyTouched"` // l'utilisateur a modifié le champ clé
Vision bool `json:"vision"` // le modèle distant accepte les images
}
func handlePresetExternalSave(w http.ResponseWriter, r *http.Request) {
@@ -94,13 +96,15 @@ func handlePresetExternalSave(w http.ResponseWriter, r *http.Request) {
key = strings.TrimSpace(parseEnv(content)[extKeyToken])
}
}
content := externalPresetContent(req.URL, req.Model, key, req.Ctx)
newID, err := SavePreset(req.ID, req.Name, content)
content := externalPresetContent(req.URL, req.Model, key, req.Ctx, req.Vision)
// Éditer le preset EN SERVICE l'applique tout de suite : sans ça, une URL ou
// une clé corrigée ne servait qu'après une bascule aller-retour.
newID, applied, err := SavePresetApplying(req.ID, req.Name, content)
if err != nil {
sendJSON(w, 400, map[string]any{"ok": false, "error": err.Error()})
return
}
sendJSON(w, 200, map[string]any{"ok": true, "id": newID, "name": req.Name})
sendJSON(w, 200, map[string]any{"ok": true, "id": newID, "name": req.Name, "applied": applied})
}
// handlePresetExternalTest tente un appel de complétion minimal vers l'endpoint