thread-deletion-cron.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import nodeCron from 'node-cron';
  2. import { configManager } from '~/server/service/config-manager';
  3. import loggerFactory from '~/utils/logger';
  4. import { getOpenaiService, type IOpenaiService } from './openai';
  5. const logger = loggerFactory('growi:service:thread-deletion-cron');
  6. class ThreadDeletionCronService {
  7. cronJob: nodeCron.ScheduledTask;
  8. openaiService: IOpenaiService;
  9. threadDeletionCronExpression: string;
  10. threadDeletionBarchSize: number;
  11. threadDeletionApiCallInterval: number;
  12. startCron(): void {
  13. const isAiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
  14. if (!isAiEnabled) {
  15. return;
  16. }
  17. const openaiService = getOpenaiService();
  18. if (openaiService == null) {
  19. throw new Error('OpenAI service is not initialized');
  20. }
  21. this.openaiService = openaiService;
  22. this.threadDeletionCronExpression = configManager.getConfig('crowi', 'openai:threadDeletionCronExpression');
  23. this.threadDeletionBarchSize = configManager.getConfig('crowi', 'openai:threadDeletionBarchSize');
  24. this.threadDeletionApiCallInterval = configManager.getConfig('crowi', 'openai:threadDeletionApiCallInterval');
  25. this.cronJob?.stop();
  26. this.cronJob = this.generateCronJob();
  27. this.cronJob.start();
  28. }
  29. private async executeJob(): Promise<void> {
  30. // Must be careful of OpenAI's rate limit
  31. await this.openaiService.deleteExpiredThreads(this.threadDeletionBarchSize, this.threadDeletionApiCallInterval);
  32. }
  33. private generateCronJob() {
  34. return nodeCron.schedule(this.threadDeletionCronExpression, async() => {
  35. try {
  36. await this.executeJob();
  37. }
  38. catch (e) {
  39. logger.error(e);
  40. }
  41. });
  42. }
  43. }
  44. export default ThreadDeletionCronService;