Remove tool_choice agent option - auto-detect based on workspace/skills/memory

- Remove tool_choice from AgentEndpoint (create, update, list responses)
- ChatService: automatically set tool_choice='any' when workspace, memory
  or skills present, null otherwise. Same for preparer/review/finalizer
- SystemPromptBuilder: remove 3 toolAny-conditional prompt blocks
  (KRITISCH, Verhalten, ERINNERUNG)
- Frontend: remove checkbox, badge and JS references
- Agent.ToolChoice DB field preserved for backward compat, no longer read
This commit is contained in:
Meleki committed 2026-03-09 05:39:09 +01:00
1 parent 677b227200
commit 83945689a6
6 files changed
+10 -55

No files matched your search

+10 -6
View File
@@ -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<object>();
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
};
}
-37
View File
@@ -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)