From dd93658b44f8515063d451c87be06d1d23cfecba Mon Sep 17 00:00:00 2001 From: Ayrat Hudaygulov Date: Sat, 10 Oct 2026 20:11:04 +0100 Subject: [PATCH 1/3] Improve Vahter triage policy and supply bounded message context --- src/VahterBanBot/DB.fs | 29 ++++++ src/VahterBanBot/LlmTriage.fs | 99 +++++++++---------- .../V56__refresh_message_triage_verdicts.sql | 1 + tests/VahterBanBot.Tests/LlmTriageTests.fs | 41 +++++++- 4 files changed, 117 insertions(+), 53 deletions(-) create mode 100644 src/vahter-bot/migrations/V56__refresh_message_triage_verdicts.sql diff --git a/src/VahterBanBot/DB.fs b/src/VahterBanBot/DB.fs index 2db0839..b4ae332 100644 --- a/src/VahterBanBot/DB.fs +++ b/src/VahterBanBot/DB.fs @@ -18,6 +18,12 @@ type UserMessage = { chat_id: int64 message_id: int64 } +[] +type TriageHistoryMessage = + { chat_id: int64 + text: string | null + created_at: DateTime } + /// Lightweight DTO for TryGetMessageTextAndSender (D2 cache invalidation on the admin-command /// correction paths, which only have a chat/message reference, not the original TgMessage). [] @@ -361,6 +367,29 @@ ON CONFLICT DO NOTHING (Option.ofObj msg.Text) (utcNow()) + member _.GetTriageHistory(userId: int64, chatId: int64, messageId: int64, ct: System.Threading.CancellationToken) : Task = task { + use conn = new NpgsqlConnection(connString) + let sql = """ +SELECT COUNT(*) FROM snapshot_message +WHERE user_id = @userId + AND (chat_id, message_id) <> (@chatId, @messageId) + AND created_at < @now; +SELECT chat_id, LEFT(text, 1001) AS text, created_at +FROM snapshot_message +WHERE user_id = @userId + AND (chat_id, message_id) <> (@chatId, @messageId) + AND created_at < @now +ORDER BY created_at DESC, chat_id DESC, message_id DESC +LIMIT 4 +""" + use! results = conn.QueryMultipleAsync(CommandDefinition( + sql, {| userId = userId; chatId = chatId; messageId = messageId; now = utcNow() |}, + cancellationToken = ct, commandTimeout = 2)) + let! count = results.ReadSingleAsync() + let! rows = results.ReadAsync() + return count, Array.ofSeq rows + } + member _.GetUserMessages(userId: int64) : Task = task { use conn = new NpgsqlConnection(connString) diff --git a/src/VahterBanBot/LlmTriage.fs b/src/VahterBanBot/LlmTriage.fs index a0f74fe..45fd551 100644 --- a/src/VahterBanBot/LlmTriage.fs +++ b/src/VahterBanBot/LlmTriage.fs @@ -380,63 +380,38 @@ type AzureLlmTriage(botConf: IOptions, logger: ILogger