fix: Windows-Kompatibilität - Streaming, Execute-Deadlock, Plan-Modus bei Choice
- HttpResponseMessage mit using disposen (3 Stellen in AnthropicService) verhindert Socket-Exhaustion unter Windows (2 Connections/Host Limit) - SSE DisableBuffering() in ChatEndpoint für sofortigen Flush unter Windows - Execute: stdout/stderr vor WaitForExitAsync lesen statt danach verhindert Pipe-Deadlock bei vollem Buffer (Windows: 4KB) - Plan-Modus: Frontend sendet planMode bei Choice-Response mit Backend-Fallback auf vorherigen Chain entfernt - User-Entscheidung gilt
This commit is contained in:
1 parent
b40a872c29
commit
3e590a6d03
5 files changed
+19
-21
No files matched your search
@@ -388,6 +388,10 @@ public class ToolService
|
||||
// Timeout (180s) UND externen CancellationToken verknüpfen
|
||||
using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
|
||||
cts.CancelAfter(TimeSpan.FromSeconds(180));
|
||||
// stdout/stderr VOR WaitForExit lesen – verhindert Deadlock
|
||||
// wenn Pipe-Buffer volllaufen (Windows: nur 4KB!)
|
||||
var stdoutTask = proc.StandardOutput.ReadToEndAsync();
|
||||
var stderrTask = proc.StandardError.ReadToEndAsync();
|
||||
try
|
||||
{
|
||||
await proc.WaitForExitAsync(cts.Token);
|
||||
@@ -399,8 +403,8 @@ public class ToolService
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
return "Fehler: Timeout nach 180 Sekunden - Prozess abgebrochen";
|
||||
}
|
||||
var stdout = await proc.StandardOutput.ReadToEndAsync();
|
||||
var stderr = await proc.StandardError.ReadToEndAsync();
|
||||
var stdout = await stdoutTask;
|
||||
var stderr = await stderrTask;
|
||||
var result = new StringBuilder();
|
||||
if (!string.IsNullOrEmpty(stdout)) result.Append(stdout);
|
||||
if (!string.IsNullOrEmpty(stderr))
|
||||
|
||||
Reference in new issue
Block a user