diff --git a/apps/app/src/features/openai/server/services/thread-deletion-cron.ts b/apps/app/src/features/openai/server/services/thread-deletion-cron.ts index 8158fdcf3b0..b2dc8fbbaad 100644 --- a/apps/app/src/features/openai/server/services/thread-deletion-cron.ts +++ b/apps/app/src/features/openai/server/services/thread-deletion-cron.ts @@ -16,6 +16,8 @@ class ThreadDeletionCronService { threadDeletionCronExpression: string; + threadDeletionCronMaxMinutesUntilRequest: number; + threadDeletionBarchSize: number; threadDeletionApiCallInterval: number; @@ -35,6 +37,7 @@ class ThreadDeletionCronService { this.openaiService = openaiService; this.threadDeletionCronExpression = configManager.getConfig('crowi', 'openai:threadDeletionCronExpression'); + this.threadDeletionCronMaxMinutesUntilRequest = configManager.getConfig('crowi', 'app:openaiThreadDeletionCronMaxMinutesUntilRequest'); this.threadDeletionBarchSize = configManager.getConfig('crowi', 'openai:threadDeletionBarchSize'); this.threadDeletionApiCallInterval = configManager.getConfig('crowi', 'openai:threadDeletionApiCallInterval'); @@ -51,8 +54,8 @@ class ThreadDeletionCronService { private generateCronJob() { return nodeCron.schedule(this.threadDeletionCronExpression, async() => { try { - // Sleep for a random number of minutes between 0 and 60 to distribute request load - const randomMilliseconds = getRandomIntInRange(0, 60) * 60 * 1000; + // Random fractional sleep to distribute request timing among GROWI apps + const randomMilliseconds = getRandomIntInRange(0, this.threadDeletionCronMaxMinutesUntilRequest) * 60 * 1000; this.sleep(randomMilliseconds); await this.executeJob(); diff --git a/apps/app/src/features/openai/server/services/vector-store-file-deletion-cron.ts b/apps/app/src/features/openai/server/services/vector-store-file-deletion-cron.ts index 3df8f75764a..25f8ddc644f 100644 --- a/apps/app/src/features/openai/server/services/vector-store-file-deletion-cron.ts +++ b/apps/app/src/features/openai/server/services/vector-store-file-deletion-cron.ts @@ -16,6 +16,8 @@ class VectorStoreFileDeletionCronService { vectorStoreFileDeletionCronExpression: string; + vectorStoreFileDeletionCronMaxMinutesUntilRequest: number; + vectorStoreFileDeletionBarchSize: number; vectorStoreFileDeletionApiCallInterval: number; @@ -35,6 +37,7 @@ class VectorStoreFileDeletionCronService { this.openaiService = openaiService; this.vectorStoreFileDeletionCronExpression = configManager.getConfig('crowi', 'openai:vectorStoreFileDeletionCronExpression'); + this.vectorStoreFileDeletionCronMaxMinutesUntilRequest = configManager.getConfig('crowi', 'app:openaiVectorStoreFileDeletionCronMaxMinutesUntilRequest'); this.vectorStoreFileDeletionBarchSize = configManager.getConfig('crowi', 'openai:vectorStoreFileDeletionBarchSize'); this.vectorStoreFileDeletionApiCallInterval = configManager.getConfig('crowi', 'openai:vectorStoreFileDeletionApiCallInterval'); @@ -51,8 +54,8 @@ class VectorStoreFileDeletionCronService { private generateCronJob() { return nodeCron.schedule(this.vectorStoreFileDeletionCronExpression, async() => { try { - // Sleep for a random number of minutes between 0 and 60 to distribute request load - const randomMilliseconds = getRandomIntInRange(0, 60) * 60 * 1000; + // Random fractional sleep to distribute request timing among GROWI apps + const randomMilliseconds = getRandomIntInRange(0, this.vectorStoreFileDeletionCronMaxMinutesUntilRequest) * 60 * 1000; this.sleep(randomMilliseconds); await this.executeJob(); diff --git a/apps/app/src/server/service/config-loader.ts b/apps/app/src/server/service/config-loader.ts index 5a7816f5561..6b7b86549db 100644 --- a/apps/app/src/server/service/config-loader.ts +++ b/apps/app/src/server/service/config-loader.ts @@ -814,6 +814,12 @@ As this system is a Retrieval Augmented Generation (RAG), focus on answering que type: ValueType.STRING, default: '0 * * * *', // every hour }, + OPENAI_THREAD_DELETION_CRON_MAX_MINUTES_UNTIL_REQUEST: { + ns: 'crowi', + key: 'app:openaiThreadDeletionCronMaxMinutesUntilRequest', + type: ValueType.NUMBER, + default: 60, + }, OPENAI_THREAD_DELETION_BARCH_SIZE: { ns: 'crowi', key: 'openai:threadDeletionBarchSize', @@ -832,6 +838,12 @@ As this system is a Retrieval Augmented Generation (RAG), focus on answering que type: ValueType.STRING, default: '0 * * * *', // every hour }, + OPENAI_VECTOR_STORE_FILE_DELETION_CRON_MAX_MINUTES_UNTIL_REQUEST: { + ns: 'crowi', + key: 'app:openaiVectorStoreFileDeletionCronMaxMinutesUntilRequest', + type: ValueType.NUMBER, + default: 60, + }, OPENAI_VECTOR_STORE_FILE_DELETION_BARCH_SIZE: { ns: 'crowi', key: 'openai:vectorStoreFileDeletionBarchSize',