- MessageRecord: neues Property IsMarked
- DatabaseService: Migration is_marked, ToggleMessageMark(), GetMarkedMessages()
- HistoryEndpoint: PUT /api/messages/{id}/mark (Toggle)
- SystemPromptBuilder: markierte Nachrichten als Referenz im System-Prompt
- ChatEndpoint + SessionEndpoint: markierte Nachrichten laden und an Builder übergeben
- Frontend: Stern-Button (☆/★) auf jeder Nachricht, Toggle per API
- CSS: .marked-Klasse mit gelbem Seitenrand, Button-Styling
69 lines
3.3 KiB
C#
69 lines
3.3 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Gott.Models;
|
|
|
|
namespace Gott.Services;
|
|
|
|
public static class SystemPromptBuilder
|
|
{
|
|
public static string Build(AgentRecord agent, SessionRecord session, IEnumerable<MessageRecord> markedMessages = null)
|
|
{
|
|
var parts = new List<string>();
|
|
parts.Add($"Du bist {agent.Name}.");
|
|
|
|
if (!string.IsNullOrWhiteSpace(agent.Persona))
|
|
parts.Add($"## Persona\n{agent.Persona}");
|
|
|
|
if (!string.IsNullOrWhiteSpace(agent.Instructions))
|
|
parts.Add($"## Instructions\n{agent.Instructions}");
|
|
|
|
bool toolAny = string.Equals(agent.ToolChoice, "any", System.StringComparison.OrdinalIgnoreCase);
|
|
|
|
if (!string.IsNullOrWhiteSpace(session.Workspace))
|
|
{
|
|
if (toolAny)
|
|
{
|
|
parts.Add(@$"## KRITISCH: Tool-Nutzung
|
|
JEDE Datei-Operation und JEDER Shell-Befehl MUSS über einen Tool-Aufruf erfolgen. NIEMALS eine Aktion nur beschreiben oder behaupten - IMMER das Tool tatsächlich aufrufen.");
|
|
}
|
|
|
|
parts.Add(@$"## Tools
|
|
Du hast Tools zur Verfügung (read_file, write_file, edit_file, list_files, delete_file, execute). Benutze sie um Dateien zu lesen, schreiben und bearbeiten.
|
|
|
|
Der Workspace-Pfad ist: `{session.Workspace}`
|
|
Alle Dateipfade in Tool-Aufrufen müssen relativ zu diesem Workspace sein oder absolute Pfade verwenden, die mit diesem Pfad beginnen.
|
|
|
|
Wenn der User auf eine bestimmte Zeile in einer Datei verweist (z.B. `[Datei: foo.txt:11]`), zähle Leerzeilen immer mit. Verwende `cat -n` oder ein ähnliches Tool um Zeilennummern exakt zu bestimmen - NIEMALS Leerzeilen beim Zählen überspringen.");
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(session.Context))
|
|
parts.Add($"## Kontext\n{session.Context}");
|
|
|
|
if (toolAny)
|
|
{
|
|
parts.Add(@"## Verhalten
|
|
- Wenn du Dateien lesen, schreiben, bearbeiten, erstellen oder löschen willst: IMMER das entsprechende Tool aufrufen. NIEMALS den Inhalt nur in die Antwort schreiben.
|
|
- Wenn du Shell-Befehle ausführen willst: IMMER das execute-Tool verwenden.
|
|
- Behaupte NIEMALS etwas getan zu haben (Datei geschrieben, Commit gemacht, Befehl ausgeführt) ohne das entsprechende Tool tatsächlich aufgerufen zu haben. Wenn kein Tool-Aufruf stattgefunden hat, ist nichts passiert.
|
|
- Plane nicht nur - handle sofort über Tool-Aufrufe.
|
|
|
|
## ERINNERUNG
|
|
Diese Regel hat höchste Priorität und gilt für JEDE Antwort: Wenn eine Datei gelesen, geschrieben, bearbeitet, erstellt oder gelöscht werden soll, oder ein Befehl ausgeführt werden soll, MUSS der entsprechende Tool-Aufruf erfolgen. Ohne Tool-Aufruf ist NICHTS passiert. Beschreibe keine Änderungen - führe sie durch.");
|
|
}
|
|
|
|
var marked = markedMessages?.Where(m => !string.IsNullOrWhiteSpace(m.Content)).ToList();
|
|
if (marked != null && marked.Count > 0)
|
|
{
|
|
var lines = new List<string> { "## Markierte Nachrichten\nDer User hat folgende Nachrichten als wichtig markiert:" };
|
|
foreach (var m in marked)
|
|
{
|
|
var role = m.Role == "user" ? "User" : "Assistant";
|
|
lines.Add($"- [{role}]: {m.Content.Trim()}");
|
|
}
|
|
parts.Add(string.Join("\n", lines));
|
|
}
|
|
|
|
return string.Join("\n\n", parts);
|
|
}
|
|
}
|