Browse Source

impl OpenaiService

Shun Miyazawa 1 năm trước cách đây
mục cha
commit
d3559be60a

+ 4 - 0
apps/app/src/server/crowi/index.js

@@ -14,6 +14,7 @@ import { KeycloakUserGroupSyncService } from '~/features/external-user-group/ser
 import { LdapUserGroupSyncService } from '~/features/external-user-group/server/service/ldap-user-group-sync';
 import QuestionnaireService from '~/features/questionnaire/server/service/questionnaire';
 import QuestionnaireCronService from '~/features/questionnaire/server/service/questionnaire-cron';
+import { initializeOpenaiService } from '~/server/service/openai/openai';
 import loggerFactory from '~/utils/logger';
 import { projectRoot } from '~/utils/project-dir-utils';
 
@@ -486,6 +487,9 @@ Crowi.prototype.start = async function() {
   // Execute this asynchronously after the express server is ready so it does not block the ongoing process
   this.asyncAfterExpressServerReady();
 
+  // initialize OpenAI service
+  initializeOpenaiService();
+
   return serverListening;
 };
 

+ 4 - 15
apps/app/src/server/routes/apiv3/openai/rebuild-vector-store.ts

@@ -4,9 +4,10 @@ import type { ValidationChain } from 'express-validator';
 
 import type Crowi from '~/server/crowi';
 import { certifyAiService } from '~/server/middlewares/certify-ai-service';
-import OpenaiClient from '~/server/service/openai-client-delegator';
 import loggerFactory from '~/utils/logger';
 
+import { getOpenaiService } from '~/server/service/openai/openai';
+
 import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
 import type { ApiV3Response } from '../interfaces/apiv3-response';
 
@@ -28,20 +29,8 @@ export const rebuildVectorStoreHandlersFactory: RebuildVectorStoreFactory = (cro
     async(req: Request, res: ApiV3Response) => {
 
       try {
-        const client = new OpenaiClient();
-
-        // Delete an existing VectorStoreFile
-        const vectorStoreFileData = await client.getVectorStoreFiles();
-        const vectorStoreFiles = vectorStoreFileData?.data;
-        if (vectorStoreFiles != null && vectorStoreFiles.length > 0) {
-          vectorStoreFiles.forEach(async(vectorStoreFile) => {
-            await client.deleteVectorStoreFiles(vectorStoreFile.id);
-          });
-        }
-
-        // Create all public pages VectorStoreFile
-        // TODO: https://redmine.weseek.co.jp/issues/153988
-
+        const openaiService = getOpenaiService();
+        await openaiService.rebuildVectorStore();
         return res.apiv3({});
 
       }

+ 55 - 0
apps/app/src/server/service/openai/openai.ts

@@ -0,0 +1,55 @@
+import { configManager } from '~/server/service/config-manager';
+
+import OpenaiClient from './openai-client-delegator';
+
+export interface IOpenaiService {
+  rebuildVectorStore(): Promise<void>;
+}
+class OpenaiService implements IOpenaiService {
+
+  private client: OpenaiClient;
+
+  constructor() {
+    this.client = new OpenaiClient();
+  }
+
+  async rebuildVectorStore() {
+    // Delete an existing VectorStoreFile
+    const vectorStoreFileData = await this.client.getVectorStoreFiles();
+    const vectorStoreFiles = vectorStoreFileData?.data;
+    if (vectorStoreFiles != null && vectorStoreFiles.length > 0) {
+      vectorStoreFiles.forEach(async(vectorStoreFile) => {
+        await this.client.deleteVectorStoreFiles(vectorStoreFile.id);
+      });
+    }
+
+    // Create all public pages VectorStoreFile
+    // TODO: https://redmine.weseek.co.jp/issues/153988
+
+  }
+
+}
+
+let _instance: OpenaiService;
+
+export const initializeOpenaiService = (): void => {
+  const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
+
+  if (!aiEnabled) {
+    return;
+  }
+
+  if (_instance != null) {
+    throw new Error('OpenaiService is already initialized');
+  }
+
+  _instance = new OpenaiService();
+};
+
+export const getOpenaiService = (): OpenaiService => {
+  if (_instance == null) {
+    throw new Error('OpenaiService is not initialized yet');
+  }
+
+  return _instance;
+};