From 8dd962ac49db903354eb817aaea2d4b65eb1110a Mon Sep 17 00:00:00 2001 From: Meleki Date: Tue, 10 Mar 2026 11:49:08 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20CleanOrphanedWebSearchBlocks=20bidirekti?= =?UTF-8?q?onal=20=E2=80=93=20entfernt=20auch=20verwaiste=20web=5Fsearch?= =?UTF-8?q?=5Ftool=5Fresult=20ohne=20server=5Ftool=5Fuse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vorher wurden nur orphaned server_tool_use entfernt (die keinen web_search_tool_result hatten). Jetzt auch umgekehrt: web_search_tool_result Blöcke ohne zugehörigen server_tool_use werden entfernt. Mögliche Ursache für API 400 'web_search_tool_result without corresponding server_tool_use': Parse-Fehler beim Laden des server_tool_use aus der DB oder Reihenfolgeprobleme führten dazu, dass nur der Result-Block in der History landete. --- Services/ChatService.cs | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/Services/ChatService.cs b/Services/ChatService.cs index 4a994df..16e9f1e 100644 --- a/Services/ChatService.cs +++ b/Services/ChatService.cs @@ -601,8 +601,9 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? } /// - /// Entfernt server_tool_use-Blöcke vom Typ "web_search" aus assistant-Messages, - /// wenn kein zugehöriger web_search_tool_result-Block in derselben Message existiert. + /// Entfernt verwaiste web_search-Blöcke aus assistant-Messages: + /// - server_tool_use ohne zugehörigen web_search_tool_result (z.B. alte DB-Einträge) + /// - web_search_tool_result ohne zugehörigen server_tool_use (z.B. Parse-Fehler) /// private static void CleanOrphanedWebSearchBlocks(List history) { @@ -639,11 +640,14 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? } } - // Orphaned = server_tool_use IDs ohne zugehörige web_search_tool_result - var orphanedIds = webSearchToolUseIds.Except(webSearchToolResultIds).ToHashSet(); - if (orphanedIds.Count == 0) continue; + // Orphaned server_tool_use = IDs ohne zugehörige web_search_tool_result + var orphanedUseIds = webSearchToolUseIds.Except(webSearchToolResultIds).ToHashSet(); + // Orphaned web_search_tool_result = tool_use_ids ohne zugehörige server_tool_use + var orphanedResultIds = webSearchToolResultIds.Except(webSearchToolUseIds).ToHashSet(); - // Entferne orphaned server_tool_use Blöcke + if (orphanedUseIds.Count == 0 && orphanedResultIds.Count == 0) continue; + + // Entferne orphaned server_tool_use und web_search_tool_result Blöcke contentList.RemoveAll(block => { var json = JsonSerializer.Serialize(block); @@ -652,10 +656,20 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop? catch { return false; } var type = el.TryGetProperty("type", out var t) ? t.GetString() : ""; - if (type != "server_tool_use") return false; - var id = el.TryGetProperty("id", out var idProp) ? idProp.GetString() : ""; - return orphanedIds.Contains(id); + if (type == "server_tool_use") + { + var id = el.TryGetProperty("id", out var idProp) ? idProp.GetString() : ""; + return orphanedUseIds.Contains(id); + } + + if (type == "web_search_tool_result") + { + var toolUseId = el.TryGetProperty("tool_use_id", out var tid) ? tid.GetString() : ""; + return orphanedResultIds.Contains(toolUseId); + } + + return false; }); } }