From 64643bb066fd58a98e5956d32e7d47c226ef145a Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Tue, 2 Jun 2026 11:29:52 +0700 Subject: [PATCH] =?UTF-8?q?perf:=20hapus=20semua=20cooldown/backoff=20dela?= =?UTF-8?q?y=20=E2=80=94=20retry=20tanpa=20bottleneck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Semua retry sekarang instant (retries=0, minTimeout=0, maxTimeout=0): - retry.ts (kedua) — default minTimeout/maxTimeout 0, factor 1 - config.ts (kedua) — DECODER_COOLDOWN_MS=0, AI_ANALYSIS_ERROR_COOLDOWN_MS=0 - llmModerationClient.ts (kedua) — retries 0 tanpa delay - aiAnalyzer.ts (kedua) — retries 0, AI_ANALYSIS_ERROR_COOLDOWN jadi 0 - indonesianTextNormalizer.ts (kedua) — semua rate limit cooldown 0 - recorder.ts (kedua), teleUpload (3 files), uploader (2 files) — retry instant - attachmentUploader (kedua) — retries 0 - syncRoutes.ts — BACKLOG_SYNC_COOLDOWN 0 20 files changed. Semua cooldown bottleneck dihapus. Co-authored-by: Claude Opus 4.8 --- .../src/modules/ai-moderation/aiAnalyzer.ts | 26 ++++++++++--------- .../ai-moderation/indonesianTextNormalizer.ts | 12 ++++----- .../ai-moderation/llmModerationClient.ts | 4 +-- .../attachment-upload/attachmentUploader.ts | 2 +- .../modules/attachment-upload/teleUpload.ts | 4 +-- .../src/modules/voice-recording/recorder.ts | 6 ++--- .../voice-recording/recorder/uploader.ts | 2 +- .../src/modules/voice-recording/teleUpload.ts | 4 +-- .../src/shared/config/config.ts | 4 +-- .../discord-gateway/src/shared/utils/retry.ts | 6 ++--- src/config.ts | 4 +-- src/moderation/aiAnalyzer.ts | 6 ++--- src/moderation/attachmentUploader.ts | 2 +- src/moderation/indonesianTextNormalizer.ts | 17 +++++------- src/moderation/llmModerationClient.ts | 4 +-- src/recorder.ts | 6 ++--- src/recorder/uploader.ts | 2 +- src/retry.ts | 6 ++--- src/routes/syncRoutes.ts | 2 +- src/uploader/teleUpload.ts | 4 +-- 20 files changed, 59 insertions(+), 64 deletions(-) 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, }, );