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

Impl createVectorStoreFileOnUploadAttachment()

Shun Miyazawa 11 месяцев назад
Родитель
Сommit
ee4dd55464
1 измененных файлов с 22 добавлено и 0 удалено
  1. 22 0
      apps/app/src/features/openai/server/services/openai.ts

+ 22 - 0
apps/app/src/features/openai/server/services/openai.ts

@@ -1,3 +1,4 @@
+import fs from 'fs';
 import assert from 'node:assert';
 import { Readable, Transform } from 'stream';
 import { pipeline } from 'stream/promises';
@@ -77,6 +78,7 @@ export interface IOpenaiService {
   createVectorStoreFile(vectorStoreRelation: VectorStoreDocument, pages: PageDocument[]): Promise<void>;
   createVectorStoreFileOnPageCreate(pages: PageDocument[]): Promise<void>;
   updateVectorStoreFileOnPageUpdate(page: HydratedDocument<PageDocument>): Promise<void>;
+  createVectorStoreFileOnUploadAttachment(page: HydratedDocument<PageDocument>, file: Express.Multer.File): Promise<void>;
   deleteVectorStoreFile(vectorStoreRelationId: Types.ObjectId, pageId: Types.ObjectId): Promise<void>;
   deleteVectorStoreFilesByPageIds(pageIds: Types.ObjectId[]): Promise<void>;
   deleteObsoleteVectorStoreFile(limit: number, apiCallInterval: number): Promise<void>; // for CronJob
@@ -580,6 +582,26 @@ class OpenaiService implements IOpenaiService {
     }
   }
 
+  async createVectorStoreFileOnUploadAttachment(page: HydratedDocument<PageDocument>, file: Express.Multer.File): Promise<void> {
+    const aiAssistants = await this.findAiAssistantByPagePath([page.path], { shouldPopulateVectorStore: true });
+    if (aiAssistants.length === 0) {
+      return;
+    }
+
+    const fileStream = fs.createReadStream(file.path, { flags: 'r', autoClose: true });
+    const file_ = await toFile(fileStream, file.originalname);
+    const uploadedFile = await this.client.uploadFile(file_);
+
+    for await (const aiAssistant of aiAssistants) {
+      const vectorStoreRelation = aiAssistant.vectorStore;
+      if (vectorStoreRelation == null || !isPopulated(vectorStoreRelation)) {
+        continue;
+      }
+
+      await this.client.createVectorStoreFile(vectorStoreRelation.vectorStoreId, uploadedFile.id);
+    }
+  }
+
   private async createVectorStoreFileWithStream(vectorStoreRelation: VectorStoreDocument, conditions: mongoose.FilterQuery<PageDocument>): Promise<void> {
     const Page = mongoose.model<HydratedDocument<PageDocument>, PageModel>('Page');