fix: ask_user_choice Short-Poll, Freitext-Option, Stop-Kontext-Fix
- Long-Poll durch Short-Poll ersetzt (MCP-Server pollt jede Sekunde statt einer blockierenden HTTP-Anfrage)
- Expliziter Lambda-Rückgabetyp Task<IResult> für ASP.NET Minimal API Endpoints (behebt 200 empty body Bug)
- Freitext-Option bei Choice-Buttons ("Eigene Antwort…") für freie User-Eingabe
- Stop während ask_user_choice markiert Chain als awaiting_user_choice statt stopped (Kontext bleibt erhalten)
- ask_user_choice System-Prompt-Instruktion breiter formuliert (Quiz, Multiple-Choice etc.)
- Text wird jetzt immer in DB gespeichert, auch bei ask_user_choice
- Key-Check Model auf claude-haiku-4-5 geändert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
3e0a69e7a4
commit
92ecaf9dac
8 files changed
+184
-66
No files matched your search
@@ -25,7 +25,7 @@ namespace Gott.Services
|
||||
|
||||
public static class AnthropicKeyChecker
|
||||
{
|
||||
private const string CheckModel = "claude-sonnet-4-20250514";
|
||||
private const string CheckModel = "claude-haiku-4-5"; //"claude-sonnet-4-20250514";
|
||||
|
||||
public static async Task<KeyCheckResult> CheckKeyAsync(IHttpClientFactory httpFactory, string apiKey)
|
||||
{
|
||||
|
||||
@@ -1950,6 +1950,7 @@ public class AnthropicService
|
||||
var fullText = new StringBuilder();
|
||||
var tempImagePaths = new List<string>();
|
||||
string mcpConfigPath = null;
|
||||
bool isUserChoice = false;
|
||||
|
||||
var chain = new ChainRecord
|
||||
{
|
||||
@@ -1996,7 +1997,6 @@ public class AnthropicService
|
||||
prompt = $"<conversation_history>\n{historyContext}\n</conversation_history>\n\n<current_request>\n{prompt}\n</current_request>";
|
||||
}
|
||||
|
||||
bool isUserChoice = false;
|
||||
string choiceToolCallId = null;
|
||||
|
||||
var result = await _cliService.ChatStreamingAsync(
|
||||
@@ -2063,8 +2063,8 @@ public class AnthropicService
|
||||
foreach (var cOpt in cc.EnumerateArray())
|
||||
cChoices.Add(cOpt.GetString() ?? "");
|
||||
|
||||
// TCS erstellen bevor der MCP-Server den Endpoint aufruft
|
||||
InternalEndpoint.PendingChoices[sessionId] = new TaskCompletionSource<string>(TaskCreationOptions.RunContinuationsAsynchronously);
|
||||
// Alte Antwort entfernen (falls vorhanden)
|
||||
InternalEndpoint.ChoiceAnswers.TryRemove(sessionId, out _);
|
||||
|
||||
// SSE Event mit viaCli-Flag → Frontend zeigt Buttons + nutzt choice-respond Endpoint
|
||||
choiceToolCallId = evt.ToolId;
|
||||
@@ -2133,8 +2133,8 @@ public class AnthropicService
|
||||
await SseHelper.TryWriteSse(response, "error", new { error = $"CLI-Fehler: {errorMsg}" }, sseCt);
|
||||
}
|
||||
|
||||
// Antwort in DB speichern (nur wenn nicht schon im UserChoice-Handler gespeichert)
|
||||
if (!isUserChoice && fullText.Length > 0)
|
||||
// Antwort in DB speichern
|
||||
if (fullText.Length > 0)
|
||||
{
|
||||
await _db.SaveMessage(new MessageRecord
|
||||
{
|
||||
@@ -2173,13 +2173,16 @@ public class AnthropicService
|
||||
catch (OperationCanceledException) when (workCt.IsCancellationRequested)
|
||||
{
|
||||
// Stop-Button gedrückt → CLI-Prozess wurde gestoppt
|
||||
await FinalizeChain(chain, usage, 1, "stopped", sw);
|
||||
// Wenn ask_user_choice aktiv war: als awaiting_user_choice markieren,
|
||||
// damit die nächste Chain den Kontext (Frage + Optionen) behält.
|
||||
var stoppedReason = isUserChoice ? "awaiting_user_choice" : "stopped";
|
||||
await FinalizeChain(chain, usage, 1, stoppedReason, sw);
|
||||
await SseHelper.TryWriteSse(response, "done", new
|
||||
{
|
||||
model = modelId,
|
||||
chainId,
|
||||
durationMs = sw.ElapsedMilliseconds,
|
||||
stopReason = "stopped",
|
||||
stopReason = stoppedReason,
|
||||
viaCli = true
|
||||
}, CancellationToken.None);
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ Alle Dateipfade in Tool-Aufrufen müssen relativ zu diesem Workspace sein oder a
|
||||
{
|
||||
Icon = "fa-question-circle",
|
||||
Label = "Agent · Rückfragen (AllowUserChoice)",
|
||||
Content = "## Rückfragen\nWenn du dir bei einer Aufgabe unsicher bist oder es mehrere sinnvolle Wege gibt, nutze das `ask_user_choice`-Tool um dem User eine Auswahlliste zu präsentieren. Nutze es immer, wenn eine Entscheidung vom User getroffen werden soll."
|
||||
Content = "## Rückfragen\nWenn du dem User Optionen, Auswahlmöglichkeiten oder Fragen mit mehreren Antwortmöglichkeiten präsentierst, nutze IMMER das `ask_user_choice`-Tool (bzw. `mcp__gott-remote__ask_user_choice`). Das gilt für:\n- Rückfragen bei Unsicherheit oder mehreren sinnvollen Wegen\n- Quiz-Fragen, Multiple-Choice-Fragen\n- Jede Situation in der der User zwischen Optionen wählen soll\n\nNutze NIEMALS A/B/C/D-Aufzählungen oder nummerierte Listen als Ersatz – IMMER das Tool verwenden."
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user