Jelajahi Sumber

imprv OpenaiService

Shun Miyazawa 1 tahun lalu
induk
melakukan
176c504d2b

+ 3 - 2
apps/app/src/server/routes/apiv3/openai/rebuild-vector-store.ts

@@ -4,7 +4,7 @@ import type { ValidationChain } from 'express-validator';
 
 
 import type Crowi from '~/server/crowi';
 import type Crowi from '~/server/crowi';
 import { certifyAiService } from '~/server/middlewares/certify-ai-service';
 import { certifyAiService } from '~/server/middlewares/certify-ai-service';
-import { openaiService } from '~/server/service/openai/openai';
+import { getOpenaiService } from '~/server/service/openai/openai';
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
 import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
 import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
@@ -28,7 +28,8 @@ export const rebuildVectorStoreHandlersFactory: RebuildVectorStoreFactory = (cro
     async(req: Request, res: ApiV3Response) => {
     async(req: Request, res: ApiV3Response) => {
 
 
       try {
       try {
-        await openaiService.rebuildVectorStoreAll();
+        const openaiService = getOpenaiService();
+        await openaiService?.rebuildVectorStoreAll();
         return res.apiv3({});
         return res.apiv3({});
 
 
       }
       }

+ 3 - 2
apps/app/src/server/routes/apiv3/page/update-page.ts

@@ -19,7 +19,7 @@ import { GlobalNotificationSettingEvent } from '~/server/models/GlobalNotificati
 import type { PageDocument, PageModel } from '~/server/models/page';
 import type { PageDocument, PageModel } from '~/server/models/page';
 import { serializePageSecurely, serializeRevisionSecurely } from '~/server/models/serializers';
 import { serializePageSecurely, serializeRevisionSecurely } from '~/server/models/serializers';
 import { configManager } from '~/server/service/config-manager';
 import { configManager } from '~/server/service/config-manager';
-import { openaiService } from '~/server/service/openai/openai';
+import { getOpenaiService } from '~/server/service/openai/openai';
 import { preNotifyService } from '~/server/service/pre-notify';
 import { preNotifyService } from '~/server/service/pre-notify';
 import { normalizeLatestRevisionIfBroken } from '~/server/service/revision/normalize-latest-revision-if-broken';
 import { normalizeLatestRevisionIfBroken } from '~/server/service/revision/normalize-latest-revision-if-broken';
 import { getYjsService } from '~/server/service/yjs';
 import { getYjsService } from '~/server/service/yjs';
@@ -121,7 +121,8 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => {
     const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
     const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
     if (aiEnabled) {
     if (aiEnabled) {
       try {
       try {
-        await openaiService.rebuildVectorStore(updatedPage);
+        const openaiService = getOpenaiService();
+        await openaiService?.rebuildVectorStore(updatedPage);
       }
       }
       catch (err) {
       catch (err) {
         logger.error('Rebuild vector store failed', err);
         logger.error('Rebuild vector store failed', err);

+ 13 - 1
apps/app/src/server/service/openai/openai.ts

@@ -72,4 +72,16 @@ class OpenaiService implements IOpenaiService {
 
 
 }
 }
 
 
-export const openaiService = new OpenaiService();
+let instance: OpenaiService;
+export const getOpenaiService = (): IOpenaiService | undefined => {
+  if (instance != null) {
+    return instance;
+  }
+
+  if (configManager.getConfig('crowi', 'app:aiEnabled')) {
+    instance = new OpenaiService();
+    return instance;
+  }
+
+  return;
+};

+ 5 - 3
apps/app/src/server/service/page/index.ts

@@ -43,7 +43,7 @@ import {
 import type { PageTagRelationDocument } from '~/server/models/page-tag-relation';
 import type { PageTagRelationDocument } from '~/server/models/page-tag-relation';
 import PageTagRelation from '~/server/models/page-tag-relation';
 import PageTagRelation from '~/server/models/page-tag-relation';
 import type { UserGroupDocument } from '~/server/models/user-group';
 import type { UserGroupDocument } from '~/server/models/user-group';
-import { openaiService } from '~/server/service/openai/openai';
+import { getOpenaiService } from '~/server/service/openai/openai';
 import { createBatchStream } from '~/server/util/batch-stream';
 import { createBatchStream } from '~/server/util/batch-stream';
 import { collectAncestorPaths } from '~/server/util/collect-ancestor-paths';
 import { collectAncestorPaths } from '~/server/util/collect-ancestor-paths';
 import { generalXssFilter } from '~/services/general-xss-filter';
 import { generalXssFilter } from '~/services/general-xss-filter';
@@ -1180,7 +1180,8 @@ class PageService implements IPageService {
       );
       );
 
 
       // Do not await because communication with OpenAI takes time
       // Do not await because communication with OpenAI takes time
-      openaiService.createVectorStoreFile([duplicatedTarget]);
+      const openaiService = getOpenaiService();
+      openaiService?.createVectorStoreFile([duplicatedTarget]);
     }
     }
     this.pageEvent.emit('duplicate', page, user);
     this.pageEvent.emit('duplicate', page, user);
 
 
@@ -1416,7 +1417,8 @@ class PageService implements IPageService {
       .find({ _id: { $in: duplicatedPageIds }, grant: PageGrant.GRANT_PUBLIC }).populate('revision') as PageDocument[];
       .find({ _id: { $in: duplicatedPageIds }, grant: PageGrant.GRANT_PUBLIC }).populate('revision') as PageDocument[];
 
 
     // Do not await because communication with OpenAI takes time
     // Do not await because communication with OpenAI takes time
-    openaiService.createVectorStoreFile(duplicatedPagesWithPopulatedToShowRevison);
+    const openaiService = getOpenaiService();
+    openaiService?.createVectorStoreFile(duplicatedPagesWithPopulatedToShowRevison);
   }
   }
 
 
   private async duplicateDescendantsV4(pages, user, oldPagePathPrefix, newPagePathPrefix) {
   private async duplicateDescendantsV4(pages, user, oldPagePathPrefix, newPagePathPrefix) {