KI-Prompts unter Vorlagen editierbar statt hardcoded

Rolle, Tonfall und Regeln der KI (Unterlagen, Chat, E-Mail-Antwort,
E-Mail-Absage, gemeinsame Stilregeln) lagen fest im Code. Sie liegen jetzt
als Defaults in lib/prompts.js und lassen sich auf der Vorlagen-Seite je
Prompt anpassen und wieder zuruecksetzen.

Nur die System-Prompts sind editierbar. Die User-Prompts tragen das
JSON-Skeleton, gegen das die Antwort geparst wird - ein Tippfehler dort
wuerde die Generierung lahmlegen, also bleiben sie im Code.

Gespeichert wird nur, was abweicht: ein Override ist eine Zeile in der neuen
Tabelle `prompts`, "Zuruecksetzen" loescht sie. Damit bleiben die Defaults im
Code die Wahrheit und wandern bei Updates automatisch mit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 00:09:03 +02:00
co-authored by Claude Opus 4.8
parent 0a0b0b4724
commit 65a5943993
5 changed files with 286 additions and 49 deletions
+57
View File
@@ -251,6 +251,63 @@
</button>
</form>
</section>
<!-- Editable KI prompts -->
<h2 id="prompts" class="text-xl font-bold text-gray-800 dark:text-white mt-10 mb-2 scroll-mt-4">KI-Prompts</h2>
<p class="text-sm text-gray-500 dark:text-gray-400 mb-6">
Hier steht, <em>wie</em> die KI schreibt: Rolle, Tonfall und Regeln für Unterlagen, Chat und E-Mails.
Du kannst jeden Text anpassen etwa um zu duzen, Formulierungen zu verbieten oder eine andere
Sprache zu verlangen. Der technische Aufbau (Aufbau des Lebenslaufs, Felder der E-Mail) ist fest
verdrahtet und wird davon nicht berührt, damit nichts kaputtgehen kann.
Mit <strong>Zurücksetzen</strong> holst du jederzeit den Standardtext zurück.
</p>
<section class="space-y-4 mb-8">
<% prompts.forEach(p => { %>
<details class="bg-white dark:bg-gray-800 rounded-lg shadow-md overflow-hidden" <%= p.angepasst ? 'open' : '' %>>
<summary class="cursor-pointer select-none px-6 py-4 flex items-center gap-3">
<span class="font-semibold text-gray-800 dark:text-white"><%= p.titel %></span>
<% if (p.angepasst) { %>
<span class="text-xs px-2 py-0.5 rounded-full bg-blue-100 text-blue-800 dark:bg-blue-900/50 dark:text-blue-300">angepasst</span>
<% } else { %>
<span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-500 dark:bg-gray-700 dark:text-gray-400">Standard</span>
<% } %>
</summary>
<div class="px-6 pb-6 border-t border-gray-200 dark:border-gray-700 pt-4">
<p class="text-sm text-gray-500 dark:text-gray-400 mb-3"><%= p.beschreibung %></p>
<% if (p.platzhalter && p.platzhalter.length) { %>
<p class="text-xs text-gray-500 dark:text-gray-400 mb-3">
Platzhalter:
<% p.platzhalter.forEach(ph => { %>
<code class="px-1 rounded bg-gray-100 dark:bg-gray-700">{{<%= ph %>}}</code>
<% }) %>
wird beim Generieren automatisch ersetzt (Name aus den Einstellungen).
</p>
<% } %>
<form action="/vorlagen/prompts/<%= p.key %>" method="POST" class="space-y-3">
<textarea name="inhalt" rows="9"
class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-white font-mono text-xs leading-relaxed"><%= p.inhalt %></textarea>
<div class="flex items-center gap-3">
<button type="submit" class="px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-md transition-colors">
Speichern
</button>
<% if (p.angepasst) { %>
<button type="submit" formaction="/vorlagen/prompts/<%= p.key %>/reset"
formnovalidate
onclick="return confirm('Diesen Prompt auf den Standardtext zurücksetzen? Deine Änderungen gehen verloren.');"
class="text-sm text-gray-600 dark:text-gray-400 hover:underline">
Auf Standard zurücksetzen
</button>
<% } %>
</div>
</form>
</div>
</details>
<% }) %>
</section>
</main>
<%- include('partials/footer') %>