fix: CleanOrphanedWebSearchBlocks bidirektional – entfernt auch verwaiste web_search_tool_result ohne server_tool_use

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.
This commit is contained in:
Meleki committed 2026-03-10 11:49:08 +01:00
1 parent 3153cb6c6b
commit 8dd962ac49
1 file changed
+23 -9
+23 -9
View File
@@ -601,8 +601,9 @@ Für welche Plattform soll die App entwickelt werden? Web, Mobile oder Desktop?
}
/// <summary>
/// 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)
/// </summary>
private static void CleanOrphanedWebSearchBlocks(List<object> 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;
});
}
}