ai-assistant.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { type IUserHasId } from '@growi/core';
  2. import { ErrorV3 } from '@growi/core/dist/models';
  3. import type { Request, RequestHandler } from 'express';
  4. import type Crowi from '~/server/crowi';
  5. import { accessTokenParser } from '~/server/middlewares/access-token-parser';
  6. import { apiV3FormValidator } from '~/server/middlewares/apiv3-form-validator';
  7. import type { ApiV3Response } from '~/server/routes/apiv3/interfaces/apiv3-response';
  8. import loggerFactory from '~/utils/logger';
  9. import { type UpsertAiAssistantData } from '../../interfaces/ai-assistant';
  10. import { getOpenaiService } from '../services/openai';
  11. import { certifyAiService } from './middlewares/certify-ai-service';
  12. import { upsertAiAssistantValidator } from './middlewares/upsert-ai-assistant-validator';
  13. const logger = loggerFactory('growi:routes:apiv3:openai:create-ai-assistant');
  14. type CreateAssistantFactory = (crowi: Crowi) => RequestHandler[];
  15. type ReqBody = UpsertAiAssistantData;
  16. type Req = Request<undefined, Response, ReqBody> & {
  17. user: IUserHasId,
  18. }
  19. export const createAiAssistantFactory: CreateAssistantFactory = (crowi) => {
  20. const loginRequiredStrictly = require('~/server/middlewares/login-required')(crowi);
  21. return [
  22. accessTokenParser, loginRequiredStrictly, certifyAiService, upsertAiAssistantValidator, apiV3FormValidator,
  23. async(req: Req, res: ApiV3Response) => {
  24. const openaiService = getOpenaiService();
  25. if (openaiService == null) {
  26. return res.apiv3Err(new ErrorV3('GROWI AI is not enabled'), 501);
  27. }
  28. try {
  29. const aiAssistantData = { ...req.body, owner: req.user._id };
  30. const isLearnablePageLimitExceeded = await openaiService.isLearnablePageLimitExceeded(req.user, aiAssistantData.pagePathPatterns);
  31. if (isLearnablePageLimitExceeded) {
  32. return res.apiv3Err(new ErrorV3('The number of learnable pages exceeds the limit'), 400);
  33. }
  34. const aiAssistant = await openaiService.createAiAssistant(req.body, req.user);
  35. return res.apiv3({ aiAssistant });
  36. }
  37. catch (err) {
  38. logger.error(err);
  39. return res.apiv3Err(new ErrorV3('AiAssistant creation failed'));
  40. }
  41. },
  42. ];
  43. };