diff --git a/Endpoints/AgentEndpoint.cs b/Endpoints/AgentEndpoint.cs index 9201370..e8aecaa 100644 --- a/Endpoints/AgentEndpoint.cs +++ b/Endpoints/AgentEndpoint.cs @@ -46,7 +46,6 @@ public static class AgentEndpoint Avatar = a.AvatarSmall ?? a.Avatar, a.Description, a.Model, - a.ToolChoice, a.CustomCommands, a.AutoCommit, a.UseSoul, @@ -94,7 +93,6 @@ public static class AgentEndpoint Avatar = a.AvatarSmall ?? a.Avatar, a.Description, a.Model, - a.ToolChoice, a.CustomCommands, a.AutoCommit, a.UseSoul, @@ -150,7 +148,6 @@ public static class AgentEndpoint AvatarSmall = imageService.ResizeDataUrlSmall(avatarRaw), Description = body.TryGetProperty("description", out var d) ? d.GetString() : null, 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.GetString() ?? "" : "", UseSoul = !body.TryGetProperty("useSoul", out var us) || us.GetBoolean(), @@ -191,7 +188,6 @@ public static class AgentEndpoint } if (body.TryGetProperty("description", out var d)) agent.Description = d.GetString(); if (body.TryGetProperty("model", out var m)) agent.Model = m.GetString(); - 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.GetString() ?? ""; diff --git a/Services/ChatService.cs b/Services/ChatService.cs index 6020f29..134b9f2 100644 --- a/Services/ChatService.cs +++ b/Services/ChatService.cs @@ -68,11 +68,12 @@ public class ChatService agentSkills, _skillService, userPersona: user?.GetEffectivePersona(), resolvedWorkspace: workspace, planMode: planMode); - var toolChoice = agent.ToolChoice ?? "any"; var hasWorkspace = !string.IsNullOrEmpty(workspace); var includeMemory = agent.UseMemory && !string.IsNullOrEmpty(agent.AgentId); + var hasTools = hasWorkspace || includeMemory; + var toolChoice = hasTools ? "any" : null; - var toolDefs = (hasWorkspace || includeMemory) + var toolDefs = hasTools ? _toolService.GetToolDefinitions(includeFileTools: hasWorkspace, includeMemory: includeMemory, includeUserChoice: agent.AllowUserChoice) : Array.Empty(); var toolNames = toolDefs.Length > 0 @@ -93,7 +94,7 @@ public class ChatService AgentId = agent.AgentId, Model = modelId, SystemPrompt = systemPromptText, - ToolChoice = (hasWorkspace || includeMemory) ? toolChoice : null, + ToolChoice = toolChoice, ToolNames = toolNames, PlanMode = planMode }); @@ -159,6 +160,7 @@ Rückfrage (NUR mit [QUESTION] – stoppt die Weiterleitung): Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? ```" }); + var preparerHasTools = !string.IsNullOrEmpty(preparerWorkspace) || preparerAgent.UseMemory; preparerContext = new PreparerContext { ModelId = preparerModelId, @@ -167,7 +169,7 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? Workspace = preparerWorkspace, UseMemory = preparerAgent.UseMemory, WebSearchVersion = preparerAgent.WebSearchVersion, - ToolChoice = preparerAgent.ToolChoice ?? "any", + ToolChoice = preparerHasTools ? "any" : "auto", AllowUserChoice = preparerAgent.AllowUserChoice, Agent = preparerAgent }; @@ -195,6 +197,7 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? if (!string.IsNullOrWhiteSpace(reviewSystemText)) reviewPrompt.Add(new { type = "text", text = reviewSystemText }); + var reviewHasTools = !string.IsNullOrEmpty(reviewWorkspace) || reviewAgent.UseMemory; reviewContext = new ReviewContext { ModelId = reviewModelId, @@ -203,7 +206,7 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? Workspace = reviewWorkspace, UseMemory = reviewAgent.UseMemory, WebSearchVersion = reviewAgent.WebSearchVersion, - ToolChoice = reviewAgent.ToolChoice ?? "any", + ToolChoice = reviewHasTools ? "any" : "auto", MaxReviewIterations = session.MaxReviewIterations > 0 ? session.MaxReviewIterations : 3, Agent = reviewAgent }; @@ -231,6 +234,7 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? if (!string.IsNullOrWhiteSpace(finalizerSystemText)) finalizerPrompt.Add(new { type = "text", text = finalizerSystemText }); + var finalizerHasTools = !string.IsNullOrEmpty(finalizerWorkspace) || finalizerAgent.UseMemory; finalizerContext = new FinalizerContext { ModelId = finalizerModelId, @@ -239,7 +243,7 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? Workspace = finalizerWorkspace, UseMemory = finalizerAgent.UseMemory, WebSearchVersion = finalizerAgent.WebSearchVersion, - ToolChoice = finalizerAgent.ToolChoice ?? "any", + ToolChoice = finalizerHasTools ? "any" : "auto", Agent = finalizerAgent }; } diff --git a/Services/SystemPromptBuilder.cs b/Services/SystemPromptBuilder.cs index 1f8550d..529382b 100644 --- a/Services/SystemPromptBuilder.cs +++ b/Services/SystemPromptBuilder.cs @@ -51,22 +51,9 @@ public static class SystemPromptBuilder blocks.Add(new PromptBlock { Icon = "fa-user", Label = "User · Persona (UseUserInfo)", Content = $"## Dein Gegenüber\nDie folgende Beschreibung stammt von der Person, die dir gerade schreibt:\n\n{userPersona}" }); } - bool toolAny = string.Equals(agent.ToolChoice, "any", System.StringComparison.OrdinalIgnoreCase); - var effectiveWorkspace = resolvedWorkspace ?? session.Workspace; if (!string.IsNullOrWhiteSpace(effectiveWorkspace)) { - if (toolAny && !planMode) - { - blocks.Add(new PromptBlock - { - Icon = "fa-exclamation-triangle", - Label = "System · Workspace + ToolChoice: any", - Content = @$"## 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." - }); - } - if (planMode) { blocks.Add(new PromptBlock @@ -207,31 +194,7 @@ Alle Dateipfade in Tool-Aufrufen müssen relativ zu diesem Workspace sein oder a // autoCommit == "" → kein Block, Thema wird nicht erwähnt } - if (toolAny && !string.IsNullOrWhiteSpace(effectiveWorkspace) && !planMode) - { - blocks.Add(new PromptBlock - { - Icon = "fa-cog", - Label = "Agent · Verhalten (Workspace + ToolChoice: any)", - Content = string.Join("\n", new[] - { - "## 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." - }) - }); - blocks.Add(new PromptBlock - { - Icon = "fa-exclamation-circle", - Label = "System · Erinnerung (Workspace + ToolChoice: any)", - Content = @"## 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." - }); - } - // kein extra Erinnerungsblock ohne toolAny – Zeilenreferenz-Hinweise kommen direkt über die Nachricht // Plan-Modus-Block if (planMode) diff --git a/wwwroot/index.html b/wwwroot/index.html index 111fada..14f9551 100644 --- a/wwwroot/index.html +++ b/wwwroot/index.html @@ -198,10 +198,6 @@