From 3f3a1184fe926c8608b3828c1fe0174b042bb245 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Tue, 2 Jun 2026 23:08:48 +0700 Subject: [PATCH] =?UTF-8?q?Tidak=20ada=20perubahan=20staged=20untuk=20dibu?= =?UTF-8?q?atkan=20commit=20message.=20Working=20tree=20bersih=20=E2=80=94?= =?UTF-8?q?=20`git=20status`=20menunjukkan=20tidak=20ada=20file=20yang=20d?= =?UTF-8?q?i-stage.=20Silakan=20`git=20add`=20file=20yang=20ingin=20di-com?= =?UTF-8?q?mit=20terlebih=20dahulu,=20lalu=20saya=20bisa=20bantu=20tulis?= =?UTF-8?q?=20commit=20messagenya.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai-moderation/llmModerationClient.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts index 5fc190e..ac7680f 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts @@ -71,6 +71,42 @@ const ModerationResponseSchema = z.object({ const log = createChildLogger("llmModerationClient"); +/** + * Fetches recent corrected false positives from the DB and formats them + * as additional few-shot examples for the moderation prompt. + * + * Returns an empty string if no corrections are available (so the prompt + * builder simply skips the section). + */ +async function buildCorrectedFewShotExamples(): Promise { + try { + const corrections = await getRecentCorrectedModerations(5); + if (corrections.length === 0) return ""; + + const lines = [ + "## Contoh Koreksi False Positive (dari moderasi sebelumnya)", + "Berikut adalah koreksi manual dari false positive yang pernah terjadi. Gunakan sebagai panduan tambahan:", + ]; + + for (const c of corrections) { + const origFlags = c.originalFlags.join(", ") || "(none)"; + const corrFlags = c.correctedFlags.join(", ") || "(clean)"; + const notes = c.correctionNotes ? ` — ${c.correctionNotes}` : ""; + lines.push( + `- Konten: "${c.contentSnippet.substring(0, 100)}" → sebelumnya di-flag sebagai [${origFlags}], dikoreksi menjadi [${corrFlags}]${notes}`, + ); + } + + lines.push( + "JANGAN ulangi kesalahan yang sama. Jika konten serupa dengan contoh di atas, gunakan koreksi yang sudah ditentukan.", + ); + + return lines.join("\n"); + } catch { + return ""; + } +} + /** * Enhanced deferral detection pattern (R9). *