diff --git a/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts b/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts index 207f46a..9670d02 100644 --- a/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts +++ b/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts @@ -41,15 +41,17 @@ function getModerationBroadcaster(): ModerationBroadcaster | undefined { function scheduleAutoDelete(row: MessageRecord): void { if (row.ai_status !== "flagged" && row.ai_status !== "warn") return; const run = () => { - attemptAutoDeleteFlaggedMessage(moderationClient, row).catch((error: unknown) => { - logger.error( - { - messageId: row.id, - error: error instanceof Error ? error.message : String(error), - }, - "Unexpected auto-delete error", - ); - }); + attemptAutoDeleteFlaggedMessage(moderationClient, row).catch( + (error: unknown) => { + logger.error( + { + messageId: row.id, + error: error instanceof Error ? error.message : String(error), + }, + "Unexpected auto-delete error", + ); + }, + ); }; if (config.AUTO_DELETE_FLAGGED_DELAY_MS > 0) { @@ -349,9 +351,9 @@ async function processIndividualFallback( } }, { - retries: 2, - minTimeout: 2000, - maxTimeout: 15000, + retries: 0, + minTimeout: 0, + maxTimeout: 0, logger, }, ); diff --git a/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts b/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts index db6a2e9..3cb6b39 100644 --- a/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts +++ b/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts @@ -74,9 +74,9 @@ const BADWORD_CACHE_TTL_MS = 10 * 60 * 1000; */ const DB_CACHE_TTL_MS = 24 * 60 * 60 * 1000; -const NEMOTRON_RATE_LIMIT_COOLDOWN_MS = 60 * 1000; -const PRIMARY_AI_RATE_LIMIT_COOLDOWN_MS = 30_000; -const GROQ_RATE_LIMIT_COOLDOWN_MS = 60 * 1000; +const NEMOTRON_RATE_LIMIT_COOLDOWN_MS = 0; +const PRIMARY_AI_RATE_LIMIT_COOLDOWN_MS = 0; +const GROQ_RATE_LIMIT_COOLDOWN_MS = 0; interface BadwordCacheEntry { value: string[]; @@ -275,9 +275,9 @@ async function callPrimaryAiModeration(text: string): Promise { } as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming); }, { - retries: 1, - minTimeout: 500, - maxTimeout: 2000, + retries: 0, + minTimeout: 0, + maxTimeout: 0, factor: 2, logger: log, }, diff --git a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts index 42c4dcd..a7a912f 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts @@ -748,9 +748,7 @@ async function callModerationLLM( } }, { - retries: 3, - minTimeout: 1000, - maxTimeout: 10000, + retries: 0, logger: log, }, ); diff --git a/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts b/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts index 39d7048..ab38c8f 100644 --- a/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts +++ b/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts @@ -44,7 +44,7 @@ export async function uploadAttachmentToTele( contentType, uploadUrl: config.TELE_UPLOAD_URL, timeoutMs: config.ATTACHMENT_UPLOAD_TIMEOUT_MS, - retries: config.ATTACHMENT_RETRY_ATTEMPTS, + retries: 0, logger, }); diff --git a/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts b/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts index 11b9a0f..a40721a 100644 --- a/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts +++ b/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts @@ -75,8 +75,8 @@ export async function uploadToTele(input: { }, { retries, - minTimeout: 1000, - maxTimeout: 5000, + minTimeout: 0, + maxTimeout: 0, logger, }, ); diff --git a/services/discord-gateway/src/modules/voice-recording/recorder.ts b/services/discord-gateway/src/modules/voice-recording/recorder.ts index 4d8da27..150400e 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder.ts @@ -92,9 +92,9 @@ export async function startRecording( config.VOICE_CONNECTION_TIMEOUT_MS, ), { - retries: 3, - minTimeout: 1000, - maxTimeout: 5000, + retries: 0, + minTimeout: 0, + maxTimeout: 0, logger, }, ); diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts b/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts index 8348cdf..167d579 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts @@ -60,7 +60,7 @@ export async function uploadRecordingSegment(input: { filename: fileName, contentType: "audio/ogg", uploadUrl: config.TELE_UPLOAD_URL, - retries: 3, + retries: 0, logger, }); const downloadUrl = uploadResult.url; diff --git a/services/discord-gateway/src/modules/voice-recording/teleUpload.ts b/services/discord-gateway/src/modules/voice-recording/teleUpload.ts index 11b9a0f..a40721a 100644 --- a/services/discord-gateway/src/modules/voice-recording/teleUpload.ts +++ b/services/discord-gateway/src/modules/voice-recording/teleUpload.ts @@ -75,8 +75,8 @@ export async function uploadToTele(input: { }, { retries, - minTimeout: 1000, - maxTimeout: 5000, + minTimeout: 0, + maxTimeout: 0, logger, }, ); diff --git a/services/discord-gateway/src/shared/config/config.ts b/services/discord-gateway/src/shared/config/config.ts index 5992354..ba0405e 100644 --- a/services/discord-gateway/src/shared/config/config.ts +++ b/services/discord-gateway/src/shared/config/config.ts @@ -21,7 +21,7 @@ const configSchema = z RECORDINGS_DIR: z.string().default("./recordings"), RECORDING_SEGMENT_MS: z.coerce.number().positive().default(5000), DECODER_ROTATE_MS: z.coerce.number().positive().default(5000), - DECODER_COOLDOWN_MS: z.coerce.number().positive().default(30000), + DECODER_COOLDOWN_MS: z.coerce.number().positive().default(0), WEBSERVER_PORT: z.coerce.number().positive().default(3000), VOICE_CONNECTION_TIMEOUT_MS: z.coerce.number().positive().default(15000), RECONNECT_TIMEOUT_MS: z.coerce.number().positive().default(5000), @@ -96,7 +96,7 @@ const configSchema = z .number() .positive() .default(15000), - AI_ANALYSIS_ERROR_COOLDOWN_MS: z.coerce.number().positive().default(30000), + AI_ANALYSIS_ERROR_COOLDOWN_MS: z.coerce.number().positive().default(0), /** Max messages fetched per conversation batch (token budget is the real constraint). */ AI_ANALYSIS_MAX_BATCH_SIZE: z.coerce.number().int().positive().default(200), AI_ANALYSIS_MAX_CONTEXT_TOKENS: z.coerce.number().positive().default(8000), diff --git a/services/discord-gateway/src/shared/utils/retry.ts b/services/discord-gateway/src/shared/utils/retry.ts index d2ac96b..fe0b60c 100644 --- a/services/discord-gateway/src/shared/utils/retry.ts +++ b/services/discord-gateway/src/shared/utils/retry.ts @@ -15,9 +15,9 @@ export async function retryWithBackoff( ): Promise { const { retries = 3, - minTimeout = 1000, - maxTimeout = 30000, - factor = 2, + minTimeout = 0, + maxTimeout = 0, + factor = 1, logger, } = options; diff --git a/src/config.ts b/src/config.ts index f5a4076..48422be 100644 --- a/src/config.ts +++ b/src/config.ts @@ -21,7 +21,7 @@ const configSchema = z RECORDINGS_DIR: z.string().default("./recordings"), RECORDING_SEGMENT_MS: z.coerce.number().positive().default(5000), DECODER_ROTATE_MS: z.coerce.number().positive().default(5000), - DECODER_COOLDOWN_MS: z.coerce.number().positive().default(30000), + DECODER_COOLDOWN_MS: z.coerce.number().positive().default(0), WEBSERVER_PORT: z.coerce.number().positive().default(3000), VOICE_CONNECTION_TIMEOUT_MS: z.coerce.number().positive().default(15000), RECONNECT_TIMEOUT_MS: z.coerce.number().positive().default(5000), @@ -96,7 +96,7 @@ const configSchema = z .number() .positive() .default(15000), - AI_ANALYSIS_ERROR_COOLDOWN_MS: z.coerce.number().positive().default(30000), + AI_ANALYSIS_ERROR_COOLDOWN_MS: z.coerce.number().positive().default(0), /** Max messages fetched per conversation batch (token budget is the real constraint). */ AI_ANALYSIS_MAX_BATCH_SIZE: z.coerce.number().int().positive().default(200), AI_ANALYSIS_MAX_CONTEXT_TOKENS: z.coerce.number().positive().default(8000), diff --git a/src/moderation/aiAnalyzer.ts b/src/moderation/aiAnalyzer.ts index a76e957..ceae1ab 100644 --- a/src/moderation/aiAnalyzer.ts +++ b/src/moderation/aiAnalyzer.ts @@ -349,9 +349,9 @@ async function processIndividualFallback( } }, { - retries: 2, - minTimeout: 2000, - maxTimeout: 15000, + retries: 0, + minTimeout: 0, + maxTimeout: 0, logger, }, ); diff --git a/src/moderation/attachmentUploader.ts b/src/moderation/attachmentUploader.ts index 8007fb3..db4c603 100644 --- a/src/moderation/attachmentUploader.ts +++ b/src/moderation/attachmentUploader.ts @@ -44,7 +44,7 @@ export async function uploadAttachmentToTele( contentType, uploadUrl: config.TELE_UPLOAD_URL, timeoutMs: config.ATTACHMENT_UPLOAD_TIMEOUT_MS, - retries: config.ATTACHMENT_RETRY_ATTEMPTS, + retries: 0, logger, }); diff --git a/src/moderation/indonesianTextNormalizer.ts b/src/moderation/indonesianTextNormalizer.ts index bde4fcf..3749d02 100644 --- a/src/moderation/indonesianTextNormalizer.ts +++ b/src/moderation/indonesianTextNormalizer.ts @@ -74,9 +74,9 @@ const BADWORD_CACHE_TTL_MS = 10 * 60 * 1000; */ const DB_CACHE_TTL_MS = 24 * 60 * 60 * 1000; -const NEMOTRON_RATE_LIMIT_COOLDOWN_MS = 60 * 1000; -const PRIMARY_AI_RATE_LIMIT_COOLDOWN_MS = 30_000; -const GROQ_RATE_LIMIT_COOLDOWN_MS = 60 * 1000; +const NEMOTRON_RATE_LIMIT_COOLDOWN_MS = 0; +const PRIMARY_AI_RATE_LIMIT_COOLDOWN_MS = 0; +const GROQ_RATE_LIMIT_COOLDOWN_MS = 0; interface BadwordCacheEntry { value: string[]; @@ -275,9 +275,9 @@ async function callPrimaryAiModeration(text: string): Promise { } as OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming); }, { - retries: 1, - minTimeout: 500, - maxTimeout: 2000, + retries: 0, + minTimeout: 0, + maxTimeout: 0, factor: 2, logger: log, }, @@ -526,10 +526,7 @@ export async function detectIndonesianBadwords( if (status === 429) { groqUnavailableUntil = Date.now() + GROQ_RATE_LIMIT_COOLDOWN_MS; } - log.warn( - { error }, - "Groq Llama Prompt Guard moderation failed", - ); + log.warn({ error }, "Groq Llama Prompt Guard moderation failed"); } } } diff --git a/src/moderation/llmModerationClient.ts b/src/moderation/llmModerationClient.ts index 4add9da..857f0c3 100644 --- a/src/moderation/llmModerationClient.ts +++ b/src/moderation/llmModerationClient.ts @@ -748,9 +748,7 @@ async function callModerationLLM( } }, { - retries: 3, - minTimeout: 1000, - maxTimeout: 10000, + retries: 0, logger: log, }, ); diff --git a/src/recorder.ts b/src/recorder.ts index abf5fca..1cc58ef 100644 --- a/src/recorder.ts +++ b/src/recorder.ts @@ -92,9 +92,9 @@ export async function startRecording( config.VOICE_CONNECTION_TIMEOUT_MS, ), { - retries: 3, - minTimeout: 1000, - maxTimeout: 5000, + retries: 0, + minTimeout: 0, + maxTimeout: 0, logger, }, ); diff --git a/src/recorder/uploader.ts b/src/recorder/uploader.ts index ba5e2de..2f59323 100644 --- a/src/recorder/uploader.ts +++ b/src/recorder/uploader.ts @@ -60,7 +60,7 @@ export async function uploadRecordingSegment(input: { filename: fileName, contentType: "audio/ogg", uploadUrl: config.TELE_UPLOAD_URL, - retries: 3, + retries: 0, logger, }); const downloadUrl = uploadResult.url; diff --git a/src/retry.ts b/src/retry.ts index 1b4ca8a..0c44b6c 100644 --- a/src/retry.ts +++ b/src/retry.ts @@ -15,9 +15,9 @@ export async function retryWithBackoff( ): Promise { const { retries = 3, - minTimeout = 1000, - maxTimeout = 30000, - factor = 2, + minTimeout = 0, + maxTimeout = 0, + factor = 1, logger, } = options; diff --git a/src/routes/syncRoutes.ts b/src/routes/syncRoutes.ts index a48585a..7a5c40e 100644 --- a/src/routes/syncRoutes.ts +++ b/src/routes/syncRoutes.ts @@ -6,7 +6,7 @@ import { createChildLogger } from "../logger.js"; import { syncSelectedChannelBacklog } from "../moderation/backlogSync.js"; const logger = createChildLogger("sync-routes"); -const BACKLOG_SYNC_COOLDOWN_MS = 5 * 60 * 1000; +const BACKLOG_SYNC_COOLDOWN_MS = 0; const MAX_CONCURRENT_SYNCS = 3; // P3: cap concurrent backlogs const recentBacklogSyncs = new Map(); diff --git a/src/uploader/teleUpload.ts b/src/uploader/teleUpload.ts index 16839be..51f013d 100644 --- a/src/uploader/teleUpload.ts +++ b/src/uploader/teleUpload.ts @@ -75,8 +75,8 @@ export async function uploadToTele(input: { }, { retries, - minTimeout: 1000, - maxTimeout: 5000, + minTimeout: 0, + maxTimeout: 0, logger, }, );