fix(ai-moderation): downgrade operational logs to debug and add missing debug logs to silent early-return paths

This commit is contained in:
MythEclipse
2026-06-04 13:13:55 +07:00
parent d568cab88f
commit e55ee342b1
3 changed files with 26 additions and 15 deletions
@@ -27,7 +27,10 @@ import type {
ModerationBroadcaster, ModerationBroadcaster,
} from "../message-capture/types.js"; } from "../message-capture/types.js";
import { attemptAutoDeleteFlaggedMessage } from "./autoDeleteManager.js"; import { attemptAutoDeleteFlaggedMessage } from "./autoDeleteManager.js";
import { buildConversationContext, estimateTokens } from "./conversationContext.js"; import {
buildConversationContext,
estimateTokens,
} from "./conversationContext.js";
import { runModerationAnalysis } from "./llmModerationClient.js"; import { runModerationAnalysis } from "./llmModerationClient.js";
import { logModerationError } from "./responseLogger.js"; import { logModerationError } from "./responseLogger.js";
@@ -449,7 +452,7 @@ async function processIndividualFallback(
// Reset individual CB on success. // Reset individual CB on success.
individualConsecutiveErrors = 0; individualConsecutiveErrors = 0;
logger.info( logger.debug(
{ messageId, status: analysisResult.results[0]?.status }, { messageId, status: analysisResult.results[0]?.status },
"Individual fallback analysis complete", "Individual fallback analysis complete",
); );
@@ -584,7 +587,7 @@ function enqueueIndividualFallbacks(messages: MessageRecord[]): void {
.slice(0, availableSlots); .slice(0, availableSlots);
if (newMessages.length === 0) return; if (newMessages.length === 0) return;
logger.info( logger.debug(
{ {
count: newMessages.length, count: newMessages.length,
messageIds: newMessages.map((m) => m.id), messageIds: newMessages.map((m) => m.id),
@@ -878,7 +881,7 @@ export async function queueMessageAnalysis(messageId: string): Promise<void> {
if (updated) { if (updated) {
broadcastAnalysisCompleted(updated); broadcastAnalysisCompleted(updated);
} }
logger.info( logger.debug(
{ messageId }, { messageId },
"Skipped AI analysis for age-restricted message", "Skipped AI analysis for age-restricted message",
); );
@@ -51,7 +51,7 @@ function isAutoDeleteEligible(message: MessageRecord): boolean {
const confidence = message.ai_confidence ?? message.ai_moderation_score ?? 0; const confidence = message.ai_confidence ?? message.ai_moderation_score ?? 0;
if (confidence < config.AUTO_DELETE_MIN_CONFIDENCE) { if (confidence < config.AUTO_DELETE_MIN_CONFIDENCE) {
logger.info( logger.debug(
{ {
messageId: message.id, messageId: message.id,
confidence, confidence,
@@ -68,7 +68,7 @@ function isAutoDeleteEligible(message: MessageRecord): boolean {
.map((s) => s.trim()) .map((s) => s.trim())
.filter(Boolean); .filter(Boolean);
if (allowedSeverities.length > 0 && !allowedSeverities.includes(severity)) { if (allowedSeverities.length > 0 && !allowedSeverities.includes(severity)) {
logger.info( logger.debug(
{ messageId: message.id, severity, allowed: allowedSeverities }, { messageId: message.id, severity, allowed: allowedSeverities },
"Auto-delete skipped: severity not in allowed list", "Auto-delete skipped: severity not in allowed list",
); );
@@ -77,7 +77,7 @@ function isAutoDeleteEligible(message: MessageRecord): boolean {
const recommendedAction = deriveRecommendedAction(message); const recommendedAction = deriveRecommendedAction(message);
if (recommendedAction !== "delete" && recommendedAction !== "escalate") { if (recommendedAction !== "delete" && recommendedAction !== "escalate") {
logger.info( logger.debug(
{ messageId: message.id, recommendedAction }, { messageId: message.id, recommendedAction },
"Auto-delete skipped: recommended action is not delete/escalate", "Auto-delete skipped: recommended action is not delete/escalate",
); );
@@ -95,7 +95,7 @@ function isAutoDeleteEligible(message: MessageRecord): boolean {
allowedCategories.includes(cat), allowedCategories.includes(cat),
); );
if (!hasAllowedCategory) { if (!hasAllowedCategory) {
logger.info( logger.debug(
{ {
messageId: message.id, messageId: message.id,
categories: messageCategories, categories: messageCategories,
@@ -113,7 +113,7 @@ function isAutoDeleteEligible(message: MessageRecord): boolean {
if (excludedChannels.length > 0) { if (excludedChannels.length > 0) {
const channelId = message.thread_id ?? message.channel_id; const channelId = message.thread_id ?? message.channel_id;
if (excludedChannels.includes(channelId)) { if (excludedChannels.includes(channelId)) {
logger.info( logger.debug(
{ messageId: message.id, channelId }, { messageId: message.id, channelId },
"Auto-delete skipped: channel excluded", "Auto-delete skipped: channel excluded",
); );
@@ -123,7 +123,7 @@ function isAutoDeleteEligible(message: MessageRecord): boolean {
const excludedUsers = parseStringList(config.AUTO_DELETE_EXCLUDED_USER_IDS); const excludedUsers = parseStringList(config.AUTO_DELETE_EXCLUDED_USER_IDS);
if (excludedUsers.length > 0 && excludedUsers.includes(message.user_id)) { if (excludedUsers.length > 0 && excludedUsers.includes(message.user_id)) {
logger.info( logger.debug(
{ messageId: message.id, userId: message.user_id }, { messageId: message.id, userId: message.user_id },
"Auto-delete skipped: user excluded", "Auto-delete skipped: user excluded",
); );
@@ -221,6 +221,10 @@ export async function attemptAutoDeleteFlaggedMessage(
} }
if (message.ai_status !== "flagged" && message.ai_status !== "warn") { if (message.ai_status !== "flagged" && message.ai_status !== "warn") {
logger.debug(
{ messageId: message.id, status: message.ai_status },
"Auto-delete skipped: message not flagged or warned",
);
const result = { const result = {
deleted: false, deleted: false,
skipped: true, skipped: true,
@@ -231,6 +235,10 @@ export async function attemptAutoDeleteFlaggedMessage(
} }
if (!isAutoDeleteEligible(message)) { if (!isAutoDeleteEligible(message)) {
logger.debug(
{ messageId: message.id },
"Auto-delete skipped: not eligible (confidence/severity/action/category filter)",
);
const result = { const result = {
deleted: false, deleted: false,
skipped: true, skipped: true,
@@ -987,7 +987,7 @@ async function runTextOnlyBatch(
} }
if (groupMapping.size > 0) { if (groupMapping.size > 0) {
log.info( log.debug(
{ {
originalCount: targets.length, originalCount: targets.length,
deduplicatedCount: deduplicatedTargets.length, deduplicatedCount: deduplicatedTargets.length,
@@ -1004,7 +1004,7 @@ async function runTextOnlyBatch(
} }
if (subBatches.length > 1) { if (subBatches.length > 1) {
log.info( log.debug(
{ {
totalTargets: targets.length, totalTargets: targets.length,
subBatchCount: subBatches.length, subBatchCount: subBatches.length,
@@ -1111,7 +1111,7 @@ async function runTextOnlyBatch(
); );
} }
log.info( log.debug(
{ {
targetCount: targets.length, targetCount: targets.length,
resultCount: allResults.length, resultCount: allResults.length,
@@ -1615,7 +1615,7 @@ export async function runModerationAnalysis(
} }
} }
log.info( log.debug(
{ {
total: targets.length, total: targets.length,
textOnly: textOnlyTargets.length, textOnly: textOnlyTargets.length,
@@ -1647,7 +1647,7 @@ export async function runModerationAnalysis(
textBatchResult.raw ?? textBatchResult.raw ??
(mediaResults.length > 0 ? mediaResults[0].raw : null); (mediaResults.length > 0 ? mediaResults[0].raw : null);
log.info( log.debug(
{ {
targetCount: targets.length, targetCount: targets.length,
resultCount: allResults.length, resultCount: allResults.length,