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

impl getOrCreateVectorStoreId()

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

+ 4 - 0
apps/app/src/server/service/openai/client-delegator/azure-openai-client-delegator.ts

@@ -22,6 +22,10 @@ export class AzureOpenaiClientDelegator implements IOpenaiClientDelegator {
     // TODO: initialize openaiVectorStoreId property
   }
 
+  async createVectorStore(): Promise<OpenAI.Beta.VectorStores.VectorStore> {
+    return this.client.beta.vectorStores.create({ name: 'growi-vector-store' });
+  }
+
   async uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject> {
     return this.client.files.create({ file, purpose: 'assistants' });
   }

+ 1 - 0
apps/app/src/server/service/openai/client-delegator/interfaces.ts

@@ -2,6 +2,7 @@ import type OpenAI from 'openai';
 import type { Uploadable } from 'openai/uploads';
 
 export interface IOpenaiClientDelegator {
+  createVectorStore(): Promise<OpenAI.Beta.VectorStores.VectorStore>
   uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject>
   createVectorStoreFileBatch(fileIds: string[]): Promise<OpenAI.Beta.VectorStores.FileBatches.VectorStoreFileBatch>
   getVectorStoreFiles(): Promise<OpenAI.Beta.VectorStores.Files.VectorStoreFilesPage>;

+ 4 - 0
apps/app/src/server/service/openai/client-delegator/openai-client-delegator.ts

@@ -28,6 +28,10 @@ export class OpenaiClientDelegator implements IOpenaiClientDelegator {
     this.client = new OpenAI({ apiKey });
   }
 
+  async createVectorStore(): Promise<OpenAI.Beta.VectorStores.VectorStore> {
+    return this.client.beta.vectorStores.create({});
+  }
+
   async uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject> {
     return this.client.files.create({ file, purpose: 'assistants' });
   }

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

@@ -36,6 +36,20 @@ class OpenaiService implements IOpenaiService {
     return getClient({ openaiServiceType });
   }
 
+  private async getOrCreateVectorStoreId(): Promise<string> {
+    const configKey = 'app:openaiVectorStoreId';
+
+    const vectorStoreId = configManager.getConfig('crowi', configKey);
+    if (vectorStoreId != null) {
+      return vectorStoreId;
+    }
+
+    const newVectorStore = await this.client.createVectorStore();
+    const newVectorStoreId = newVectorStore.id;
+    configManager.updateConfigsInTheSameNamespace('crowi', { [configKey]: newVectorStoreId });
+    return newVectorStoreId;
+  }
+
   private async uploadFile(pageId: Types.ObjectId, body: string): Promise<OpenAI.Files.FileObject> {
     const file = await toFile(Readable.from(body), `${pageId}.md`);
     const uploadedFile = await this.client.uploadFile(file);