diff --git a/internal/jean/chat_conversation.go b/internal/jean/chat_conversation.go index 65d94a0..71a90d9 100644 --- a/internal/jean/chat_conversation.go +++ b/internal/jean/chat_conversation.go @@ -177,8 +177,16 @@ func (c *Conversation) generate(ctx context.Context, caps Caps, temperature floa c.appendDelta(map[string]any{"compacted": true}) } + // Prompt système personnalisé (UI → /api/sysprompt, fichier côté serveur). + // Injecté seulement dans la vue envoyée au modèle, jamais persisté dans + // c.Messages : modifiable à chaud, effet dès le tour suivant. + final := msgs + if sp := readSysPrompt(); sp != "" { + final = append([]Message{{Role: "system", Content: sp}}, msgs...) + } + var content strings.Builder - extra, _ := runChat(ctx, InjectSkills(msgs, caps), temperature, caps, func(ev StreamEvent) bool { + extra, _ := runChat(ctx, InjectSkills(final, caps), temperature, caps, func(ev StreamEvent) bool { switch { case ev.Err != nil: c.appendDelta(map[string]any{"error": ev.Err.Error()}) diff --git a/internal/jean/ui/index.html b/internal/jean/ui/index.html index b36bb6a..0d42bf0 100644 --- a/internal/jean/ui/index.html +++ b/internal/jean/ui/index.html @@ -508,7 +508,22 @@ function md(src){ return src ? marked.parse(fixMd(src)) : ''; } let msgs = []; let busy = false; function toggleSide(){ document.getElementById('side').classList.toggle('open'); document.getElementById('backdrop').classList.toggle('open'); document.body.classList.toggle('drawer-open'); } -function saveSys(){ localStorage.setItem('jean.sys', document.getElementById('sysprompt').value); } +// Prompt système : persisté CÔTÉ SERVEUR (/api/sysprompt, partagé entre +// appareils, utilisé par la génération serveur). localStorage = simple cache +// d'affichage hors-ligne. Debounce : on n'écrit qu'après une pause de frappe. +let _sysT = null; +function saveSys(){ + const v = document.getElementById('sysprompt').value; + localStorage.setItem('jean.sys', v); + clearTimeout(_sysT); + _sysT = setTimeout(()=>{ jpost('/api/sysprompt', {text:v}).catch(()=>{}); }, 600); +} +async function loadSys(){ + try{ + const d = await jget('/api/sysprompt'); + if(d && d.ok){ document.getElementById('sysprompt').value = d.text || ''; localStorage.setItem('jean.sys', d.text || ''); } + }catch(e){} +} // ===== Thèmes ================================================================ // Registre des thèmes disponibles. Pour en AJOUTER un : ajouter un bloc // [data-theme="…"] dans le