Fix: ask_user_choice Dauerschleife bei mehreren aufeinanderfolgenden Choice-Runden
Bug: Bei 2+ aufeinanderfolgenden ask_user_choice-Runden wurden ältere Choice-Chains nur als Text geladen. Claude sah die früheren tool_use/ tool_result-Paare nicht → kein Kontext über bereits beantwortete Fragen → Agent stellte dieselben Fragen erneut (Dauerschleife). Fix: fullChainStartIndex-Logik traversiert jetzt rückwärts durch alle zusammenhängenden Choice-Chains (erkannt an tool_result mit Iteration 999). Alle werden vollständig geladen, damit die gesamte Frage-Antwort-Historie für Claude sichtbar bleibt.
This commit is contained in:
1 parent
fa947c82ed
commit
1e7b68fb09
3 files changed
+20
-11
No files matched your search
+18
-9
@@ -222,18 +222,27 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop?
|
||||
var isLastChain = false;
|
||||
long? lastUserMsgId = null;
|
||||
|
||||
// Bestimme welche Chain als "vollständige letzte Chain" gilt.
|
||||
// Wenn die letzte Chain leer oder nur tool_result enthält (z.B. nach ask_user_choice),
|
||||
// dann muss die vorletzte Chain vollständig rekonstruiert werden.
|
||||
// Bestimme ab welcher Chain vollständig geladen werden muss (mit Tool-Calls).
|
||||
// Bei aufeinanderfolgenden ask_user_choice-Runden entstehen mehrere Chains,
|
||||
// die alle vollständig geladen werden müssen (tool_use + tool_result Paare).
|
||||
// Eine Chain braucht die vorherige vollständig, wenn sie:
|
||||
// - leer ist (gerade erst erstellt für Choice-Antwort)
|
||||
// - mit einem tool_result beginnt (Antwort auf ask_user_choice der vorherigen Chain)
|
||||
int fullChainStartIndex = chainsList.Count - 1;
|
||||
if (chainsList.Count >= 2)
|
||||
for (int ci = chainsList.Count - 1; ci >= 1; ci--)
|
||||
{
|
||||
var lastChainMsgs = (await _db.GetChainMessages(chainsList[chainsList.Count - 1].ChainId)).ToList();
|
||||
if (lastChainMsgs.Count == 0 ||
|
||||
(lastChainMsgs.All(m => m.Type == "tool_result") && lastChainMsgs.Count <= 2))
|
||||
var chainMsgs = (await _db.GetChainMessages(chainsList[ci].ChainId)).ToList();
|
||||
bool needsPrevious = chainMsgs.Count == 0 ||
|
||||
chainMsgs.Any(m => m.Type == "tool_result" && m.Iteration == 999);
|
||||
if (needsPrevious)
|
||||
{
|
||||
// Vorletzte Chain hatte einen ask_user_choice → beide Chains vollständig laden
|
||||
fullChainStartIndex = chainsList.Count - 2;
|
||||
// Diese Chain enthält eine Choice-Antwort oder ist leer →
|
||||
// vorherige Chain enthält den zugehörigen tool_use und muss vollständig geladen werden
|
||||
fullChainStartIndex = ci - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user