From d482f5dca3edcdfe20bc80b1b9d0bb2cffbbab09 Mon Sep 17 00:00:00 2001 From: Meleki Date: Wed, 4 Mar 2026 14:35:15 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20API-Payload-Logging=20in=20data/logs/?= =?UTF-8?q?=20f=C3=BCr=20Debugging?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LogPayload() schreibt den kompletten Claude-API-Request als indented JSON - Dateiname: ---iter-payload.json - Beide Pfade abgedeckt: StreamChat (Web) + ChatNonStreaming (Telegram/Cronjobs) - try/catch: Logging-Fehler crashen nie die App --- Services/AnthropicService.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Services/AnthropicService.cs b/Services/AnthropicService.cs index 70427e0..b6723f1 100644 --- a/Services/AnthropicService.cs +++ b/Services/AnthropicService.cs @@ -94,7 +94,8 @@ public class AnthropicService } var client = CreateClient(); - var json = JsonSerializer.Serialize(payload); + var json = JsonSerializer.Serialize(payload, new JsonSerializerOptions { WriteIndented = true }); + LogPayload(json, sessionId, chainId, iterations); var httpContent = new StringContent(json, Encoding.UTF8, "application/json"); var httpResp = await client.SendAsync( @@ -292,7 +293,8 @@ public class AnthropicService } var client = CreateClient(); - var json = JsonSerializer.Serialize(payload); + var json = JsonSerializer.Serialize(payload, new JsonSerializerOptions { WriteIndented = true }); + LogPayload(json, ctx.SessionId, ctx.ChainId, iterations); var httpContent = new StringContent(json, Encoding.UTF8, "application/json"); var httpResp = await client.SendAsync( @@ -414,6 +416,19 @@ public class AnthropicService return finalText.Length > 0 ? finalText.ToString() : "(Keine Textantwort)"; } + private static void LogPayload(string json, string sessionId, string chainId, int iteration) + { + try + { + var logsDir = Path.Combine(AppContext.BaseDirectory, "data", "logs"); + Directory.CreateDirectory(logsDir); + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var fileName = $"{timestamp}-{sessionId}-{chainId}-iter{iteration}-payload.json"; + File.WriteAllText(Path.Combine(logsDir, fileName), json); + } + catch { /* Logging darf nie die App crashen */ } + } + private async Task FinalizeChain(ChainRecord chain, TokenUsage usage, int iterations, string stopReason, System.Diagnostics.Stopwatch sw, string streamErrorInfo = null) { chain.InputTokens = usage.InputTokens;