diff --git a/Endpoints/AgentEndpoint.cs b/Endpoints/AgentEndpoint.cs index 5ce40de..301046c 100644 --- a/Endpoints/AgentEndpoint.cs +++ b/Endpoints/AgentEndpoint.cs @@ -54,7 +54,7 @@ public static class AgentEndpoint Model = body.TryGetProperty("model", out var m) ? m.GetString() ?? "sonnet" : "sonnet", ToolChoice = body.TryGetProperty("toolChoice", out var tc) ? tc.GetString() ?? "any" : "any", CustomCommands = customCommands, - AutoCommit = body.TryGetProperty("autoCommit", out var ac) && ac.GetBoolean(), + AutoCommit = body.TryGetProperty("autoCommit", out var ac) ? ac.GetString() ?? "" : "", UseSoul = !body.TryGetProperty("useSoul", out var us) || us.GetBoolean(), UseIdentity = !body.TryGetProperty("useIdentity", out var ui) || ui.GetBoolean(), UseUserInfo = !body.TryGetProperty("useUserInfo", out var uu) || uu.GetBoolean(), @@ -83,7 +83,7 @@ public static class AgentEndpoint if (body.TryGetProperty("toolChoice", out var tc)) agent.ToolChoice = tc.GetString(); if (body.TryGetProperty("customCommands", out var cc)) agent.CustomCommands = cc.ValueKind == JsonValueKind.Null ? null : cc.GetRawText(); - if (body.TryGetProperty("autoCommit", out var ac)) agent.AutoCommit = ac.GetBoolean(); + if (body.TryGetProperty("autoCommit", out var ac)) agent.AutoCommit = ac.GetString() ?? ""; if (body.TryGetProperty("useSoul", out var us)) agent.UseSoul = us.GetBoolean(); if (body.TryGetProperty("useIdentity", out var ui)) agent.UseIdentity = ui.GetBoolean(); if (body.TryGetProperty("useUserInfo", out var uu)) agent.UseUserInfo = uu.GetBoolean(); diff --git a/Endpoints/ChatEndpoint.cs b/Endpoints/ChatEndpoint.cs index b4007a1..6e0997c 100644 --- a/Endpoints/ChatEndpoint.cs +++ b/Endpoints/ChatEndpoint.cs @@ -146,10 +146,9 @@ public static class ChatEndpoint }, attachmentRecords); } - var systemPrompt = new List - { - new { type = "text", text = systemPromptText } - }; + var systemPrompt = string.IsNullOrWhiteSpace(systemPromptText) + ? new List() + : new List { new { type = "text", text = systemPromptText } }; var workspace = session.Workspace; if (!string.IsNullOrEmpty(workspace)) diff --git a/Models/AgentRecord.cs b/Models/AgentRecord.cs index e292877..17467ff 100644 --- a/Models/AgentRecord.cs +++ b/Models/AgentRecord.cs @@ -10,7 +10,7 @@ public class AgentRecord public string Model { get; set; } // sonnet, opus public string ToolChoice { get; set; } // "any" oder "auto" public string CustomCommands { get; set; } - public bool AutoCommit { get; set; } + public string AutoCommit { get; set; } = ""; // "", "mention", "forbid" public bool UseSoul { get; set; } = true; public bool UseIdentity { get; set; } = true; public bool UseUserInfo { get; set; } = true; diff --git a/Services/AnthropicService.cs b/Services/AnthropicService.cs index f52c4e8..29772c5 100644 --- a/Services/AnthropicService.cs +++ b/Services/AnthropicService.cs @@ -66,11 +66,13 @@ public class AnthropicService ["model"] = modelId, ["max_tokens"] = 16384, ["cache_control"] = new { type = "ephemeral" }, - ["system"] = systemPrompt, ["messages"] = messages, ["stream"] = true }; + if (systemPrompt != null && systemPrompt.Count > 0) + payload["system"] = systemPrompt; + var hasWorkspace = !string.IsNullOrEmpty(workspace); var includeMemory = useMemory && _memoryService != null && !string.IsNullOrEmpty(agentId); diff --git a/Services/DatabaseService.cs b/Services/DatabaseService.cs index 2fa8cde..178d9fe 100644 --- a/Services/DatabaseService.cs +++ b/Services/DatabaseService.cs @@ -130,6 +130,14 @@ public class DatabaseService TryAddColumn(conn, "agents", "custom_commands", "TEXT"); TryAddColumn(conn, "messages", "is_marked", "INTEGER NOT NULL DEFAULT 0"); TryAddColumn(conn, "agents", "auto_commit", "INTEGER NOT NULL DEFAULT 0"); + + // Migration: auto_commit von INTEGER (0/1) zu TEXT ("", "mention", "forbid") + try + { + conn.Execute("UPDATE agents SET auto_commit = '' WHERE auto_commit = '0' OR auto_commit = 0"); + conn.Execute("UPDATE agents SET auto_commit = 'enforce' WHERE auto_commit = '1' OR auto_commit = 1"); + } + catch { /* already migrated */ } TryAddColumn(conn, "agents", "use_soul", "INTEGER NOT NULL DEFAULT 1"); TryAddColumn(conn, "agents", "use_identity", "INTEGER NOT NULL DEFAULT 1"); TryAddColumn(conn, "agents", "use_user_info", "INTEGER NOT NULL DEFAULT 1"); diff --git a/Services/SystemPromptBuilder.cs b/Services/SystemPromptBuilder.cs index 5b67546..0137b13 100644 --- a/Services/SystemPromptBuilder.cs +++ b/Services/SystemPromptBuilder.cs @@ -150,24 +150,35 @@ Wenn der User auf eine bestimmte Zeile in einer Datei verweist (z.B. `[Datei: fo // Git-Commit-Verhalten: relevant sobald Workspace vorhanden (unabhängig von ToolChoice) if (!string.IsNullOrWhiteSpace(session.Workspace)) { - if (agent.AutoCommit) + var autoCommit = (agent.AutoCommit ?? "").ToLowerInvariant(); + if (autoCommit == "mention") { blocks.Add(new PromptBlock { Icon = "fa-code-branch", - Label = "Agent · Git-Verhalten (Workspace + AutoCommit)", - Content = "## Git-Commits\n- Nach jeder abgeschlossenen Änderung MUSS ein Git-Commit erstellt werden. Prüfe Änderungen mit `git diff`, erstelle einen passenden Commit mit einer aussagekräftigen Message. Mehrere zusammenhängende Änderungen dürfen in einem Commit zusammengefasst werden." - }); - } - else - { - blocks.Add(new PromptBlock - { - Icon = "fa-code-branch", - Label = "Agent · Git-Verhalten (Workspace)", + Label = "Agent · Git-Verhalten (Workspace, Anmerken)", Content = "## Git-Commits\n- Git-Commits NIEMALS eigenständig erstellen. Commits werden NUR durchgeführt wenn der User es EXPLIZIT anfordert (z.B. \"erstelle einen Commit\", \"commit\"). Auch nach abgeschlossenen Aufgaben NICHT automatisch committen." }); } + else if (autoCommit == "enforce") + { + blocks.Add(new PromptBlock + { + Icon = "fa-code-branch", + Label = "Agent · Git-Verhalten (Workspace, Erzwungen)", + Content = "## Git-Commits\n- Nach JEDER abgeschlossenen Änderung MUSS ein Git-Commit erstellt werden. Erstelle aussagekräftige Commit-Messages die beschreiben was geändert wurde." + }); + } + else if (autoCommit == "forbid") + { + blocks.Add(new PromptBlock + { + Icon = "fa-code-branch", + Label = "Agent · Git-Verhalten (Workspace, Verboten)", + Content = "## Git-Commits\n- Git-Commits sind STRIKT VERBOTEN. Du darfst unter KEINEN Umständen eigenständig Git-Commits erstellen, auch nicht wenn der User danach fragt. Verweise stattdessen darauf, dass der User den Commit selbst durchführen soll." + }); + } + // autoCommit == "" → kein Block, Thema wird nicht erwähnt } if (toolAny && !string.IsNullOrWhiteSpace(session.Workspace)) diff --git a/TODO.md b/TODO.md index 59c998a..4b0d31c 100644 --- a/TODO.md +++ b/TODO.md @@ -11,7 +11,7 @@ - [ ] Websearch Tool? - [x] Anfrage/Stream abbrechen - [ ] Telegram-Intergration -- [ ] Refactoring: Agent/Session-Einstellungen, die den System-Prompt bzw. das Tool Use bearbeiten +- [x] Refactoring: Agent/Session-Einstellungen, die den System-Prompt bzw. das Tool Use bearbeiten ## Bugs - [x] Wenn gerade gestreamt wird und man refreshed die Seite, dann verliert das Frontend den Status "Streaming..." und ich kann eine Nachricht schreiben, obwohl das nicht möglich sein sollte diff --git a/wwwroot/index.html b/wwwroot/index.html index 747cb67..0c35fa0 100644 --- a/wwwroot/index.html +++ b/wwwroot/index.html @@ -121,10 +121,13 @@ Tool-Nutzung erzwingen (tool_choice: any) - + +