Просмотр исходного кода

Implement express middleware to determine if AI services are available

Shun Miyazawa 1 год назад
Родитель
Сommit
c7ebe3cefd

+ 5 - 0
apps/app/src/interfaces/ai.ts

@@ -0,0 +1,5 @@
+const AiServiceType = {
+  OPEN_AI: 'openai',
+} as const;
+
+export const aiServiceTypes = Object.values(AiServiceType);

+ 26 - 0
apps/app/src/server/middlewares/certify-ai-service.ts

@@ -0,0 +1,26 @@
+import type { NextFunction, Request, Response } from 'express';
+
+import { aiServiceTypes } from '~/interfaces/ai';
+import { configManager } from '~/server/service/config-manager';
+import loggerFactory from '~/utils/logger';
+
+const logger = loggerFactory('growi:middlewares:certify-ai-service');
+
+export const certifyAiService = (req: Request, res: Response & { apiv3Err }, next: NextFunction): void => {
+  const aiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
+  const aiServiceType = configManager.getConfig('crowi', 'app:aiServiceType');
+
+  if (!aiEnabled) {
+    const message = 'AI_ENABLED is not true';
+    logger.error(message);
+    return res.apiv3Err(message, 400);
+  }
+
+  if (aiServiceType == null || !aiServiceTypes.includes(aiServiceType)) {
+    const message = 'AI_SERVICE_TYPE is missing or contains an invalid value';
+    logger.error(message);
+    return res.apiv3Err(message, 400);
+  }
+
+  next();
+};

+ 4 - 2
apps/app/src/server/routes/apiv3/ai-integration/chat.ts

@@ -3,12 +3,14 @@ import type { ValidationChain } from 'express-validator';
 import { body } from 'express-validator';
 
 import type Crowi from '~/server/crowi';
+import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
+import { certifyAiService } from '~/server/middlewares/certify-ai-service';
 import { configManager } from '~/server/service/config-manager';
 import { openaiClient } from '~/server/service/openai';
 import { getOrCreateChatAssistant } from '~/server/service/openai/assistant';
 import loggerFactory from '~/utils/logger';
 
-import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
+
 import type { ApiV3Response } from '../interfaces/apiv3-response';
 
 const logger = loggerFactory('growi:routes:apiv3:ai-integration:chat');
@@ -32,7 +34,7 @@ export const chatHandlersFactory: ChatHandlersFactory = (crowi) => {
   ];
 
   return [
-    accessTokenParser, loginRequiredStrictly, validator, apiV3FormValidator,
+    accessTokenParser, loginRequiredStrictly, certifyAiService, validator, apiV3FormValidator,
     async(req: Req, res: ApiV3Response) => {
       const vectorStoreId = configManager.getConfig('crowi', 'app:openaiVectorStoreId');
       if (vectorStoreId == null) {

+ 2 - 1
apps/app/src/server/routes/apiv3/ai-integration/rebuild-vector-store.ts

@@ -2,6 +2,7 @@ import type { Request, RequestHandler } from 'express';
 import type { ValidationChain } from 'express-validator';
 
 import type Crowi from '~/server/crowi';
+import { certifyAiService } from '~/server/middlewares/certify-ai-service';
 import loggerFactory from '~/utils/logger';
 
 import { apiV3FormValidator } from '../../../middlewares/apiv3-form-validator';
@@ -21,7 +22,7 @@ export const rebuildVectorStoreHandlersFactory: RebuildVectorStoreFactory = (cro
   ];
 
   return [
-    accessTokenParser, loginRequiredStrictly, adminRequired, validator, apiV3FormValidator,
+    accessTokenParser, loginRequiredStrictly, adminRequired, certifyAiService, validator, apiV3FormValidator,
     async(req: Request, res: ApiV3Response) => {
       return res.apiv3({});
     },