feat: payload logging (on/off + gzip) via appsettings + fix destroy messages ref
This commit is contained in:
1 parent
d482f5dca3
commit
f552b44b05
4 files changed
+29
-7
No files matched your search
+4
-1
@@ -35,10 +35,13 @@ builder.Services.AddSingleton(chatService);
|
|||||||
|
|
||||||
// AnthropicService (Singleton – shared zwischen ChatEndpoint und TelegramService)
|
// AnthropicService (Singleton – shared zwischen ChatEndpoint und TelegramService)
|
||||||
var anthropicToken = builder.Configuration["AnthropicToken"] ?? "";
|
var anthropicToken = builder.Configuration["AnthropicToken"] ?? "";
|
||||||
|
var payloadLogging = builder.Configuration.GetValue<bool>("PayloadLogging", false);
|
||||||
|
var payloadLoggingGzip = builder.Configuration.GetValue<bool>("PayloadLoggingGzip", false);
|
||||||
builder.Services.AddSingleton<AnthropicService>(sp =>
|
builder.Services.AddSingleton<AnthropicService>(sp =>
|
||||||
new AnthropicService(
|
new AnthropicService(
|
||||||
sp.GetRequiredService<IHttpClientFactory>(),
|
sp.GetRequiredService<IHttpClientFactory>(),
|
||||||
anthropicToken, toolService, dbService, memoryService));
|
anthropicToken, toolService, dbService, memoryService,
|
||||||
|
payloadLogging, payloadLoggingGzip));
|
||||||
|
|
||||||
// Telegram Bot (pro Session – Token aus Session-Config)
|
// Telegram Bot (pro Session – Token aus Session-Config)
|
||||||
var maxIterations = builder.Configuration.GetValue<int>("MaxIterations", 100);
|
var maxIterations = builder.Configuration.GetValue<int>("MaxIterations", 100);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.IO.Compression;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Net.Http.Headers;
|
using System.Net.Http.Headers;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -19,14 +20,18 @@ public class AnthropicService
|
|||||||
private readonly ToolService _toolService;
|
private readonly ToolService _toolService;
|
||||||
private readonly DatabaseService _db;
|
private readonly DatabaseService _db;
|
||||||
private readonly MemoryService _memoryService;
|
private readonly MemoryService _memoryService;
|
||||||
|
private readonly bool _payloadLogging;
|
||||||
|
private readonly bool _payloadLoggingGzip;
|
||||||
|
|
||||||
public AnthropicService(IHttpClientFactory httpFactory, string token, ToolService toolService, DatabaseService db, MemoryService memoryService = null)
|
public AnthropicService(IHttpClientFactory httpFactory, string token, ToolService toolService, DatabaseService db, MemoryService memoryService = null, bool payloadLogging = false, bool payloadLoggingGzip = false)
|
||||||
{
|
{
|
||||||
_httpFactory = httpFactory;
|
_httpFactory = httpFactory;
|
||||||
_token = token;
|
_token = token;
|
||||||
_toolService = toolService;
|
_toolService = toolService;
|
||||||
_db = db;
|
_db = db;
|
||||||
_memoryService = memoryService;
|
_memoryService = memoryService;
|
||||||
|
_payloadLogging = payloadLogging;
|
||||||
|
_payloadLoggingGzip = payloadLoggingGzip;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task StreamChat(
|
public async Task StreamChat(
|
||||||
@@ -416,15 +421,28 @@ public class AnthropicService
|
|||||||
return finalText.Length > 0 ? finalText.ToString() : "(Keine Textantwort)";
|
return finalText.Length > 0 ? finalText.ToString() : "(Keine Textantwort)";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void LogPayload(string json, string sessionId, string chainId, int iteration)
|
private void LogPayload(string json, string sessionId, string chainId, int iteration)
|
||||||
{
|
{
|
||||||
|
if (!_payloadLogging) return;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var logsDir = Path.Combine(AppContext.BaseDirectory, "data", "logs");
|
var logsDir = Path.Combine(AppContext.BaseDirectory, "data", "logs");
|
||||||
Directory.CreateDirectory(logsDir);
|
Directory.CreateDirectory(logsDir);
|
||||||
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||||
var fileName = $"{timestamp}-{sessionId}-{chainId}-iter{iteration}-payload.json";
|
var baseName = $"{timestamp}-{sessionId}-{chainId}-iter{iteration}-payload";
|
||||||
File.WriteAllText(Path.Combine(logsDir, fileName), json);
|
|
||||||
|
if (_payloadLoggingGzip)
|
||||||
|
{
|
||||||
|
var filePath = Path.Combine(logsDir, baseName + ".json.gz");
|
||||||
|
using var fs = File.Create(filePath);
|
||||||
|
using var gz = new GZipStream(fs, CompressionLevel.Fastest);
|
||||||
|
using var writer = new StreamWriter(gz, Encoding.UTF8);
|
||||||
|
writer.Write(json);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
File.WriteAllText(Path.Combine(logsDir, baseName + ".json"), json);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch { /* Logging darf nie die App crashen */ }
|
catch { /* Logging darf nie die App crashen */ }
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -7,5 +7,7 @@
|
|||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"AnthropicToken": "",
|
"AnthropicToken": "",
|
||||||
"MaxIterations": 100
|
"MaxIterations": 100,
|
||||||
|
"PayloadLogging": false,
|
||||||
|
"PayloadLoggingGzip": false
|
||||||
}
|
}
|
||||||
@@ -384,7 +384,6 @@ registerPage('chat', {
|
|||||||
_streamingPollInterval = null;
|
_streamingPollInterval = null;
|
||||||
}
|
}
|
||||||
stopHistoryPolling();
|
stopHistoryPolling();
|
||||||
messages.length = 0;
|
|
||||||
lastKnownMessageId = 0;
|
lastKnownMessageId = 0;
|
||||||
loadedArchiveCount = 0;
|
loadedArchiveCount = 0;
|
||||||
isStreaming = false;
|
isStreaming = false;
|
||||||
|
|||||||
Reference in new issue
Block a user