Sfoglia il codice sorgente

Use VectorStoreModel

Shun Miyazawa 1 anno fa
parent
commit
53b8b2668f

+ 1 - 1
apps/app/src/server/routes/apiv3/openai/thread.ts

@@ -36,7 +36,7 @@ export const createThreadHandlersFactory: CreateThreadFactory = (crowi) => {
       }
       }
 
 
       try {
       try {
-        const vectorStoreId = await openaiService.getOrCreateVectorStoreId();
+        const vectorStoreId = await openaiService.getOrCreateVectorStoreIdForPublicScope();
         const threadId = req.body.threadId;
         const threadId = req.body.threadId;
         const thread = threadId == null
         const thread = threadId == null
           ? await openaiClient.beta.threads.create({
           ? await openaiClient.beta.threads.create({

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

@@ -3,6 +3,8 @@ import type OpenAI from 'openai';
 import { AzureOpenAI } from 'openai';
 import { AzureOpenAI } from 'openai';
 import { type Uploadable } from 'openai/uploads';
 import { type Uploadable } from 'openai/uploads';
 
 
+import type { VectorStoreScopeType } from '~/features/openai/server/models/vector-store';
+
 import type { IOpenaiClientDelegator } from './interfaces';
 import type { IOpenaiClientDelegator } from './interfaces';
 
 
 
 
@@ -20,8 +22,8 @@ export class AzureOpenaiClientDelegator implements IOpenaiClientDelegator {
     // TODO: initialize openaiVectorStoreId property
     // TODO: initialize openaiVectorStoreId property
   }
   }
 
 
-  async createVectorStore(): Promise<OpenAI.Beta.VectorStores.VectorStore> {
-    return this.client.beta.vectorStores.create({ name: 'growi-vector-store' });
+  async createVectorStore(scopeType:VectorStoreScopeType): Promise<OpenAI.Beta.VectorStores.VectorStore> {
+    return this.client.beta.vectorStores.create({ name: `growi-vector-store-{${scopeType}` });
   }
   }
 
 
   async uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject> {
   async uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject> {

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

@@ -1,8 +1,10 @@
 import type OpenAI from 'openai';
 import type OpenAI from 'openai';
 import type { Uploadable } from 'openai/uploads';
 import type { Uploadable } from 'openai/uploads';
 
 
+import type { VectorStoreScopeType } from '~/features/openai/server/models/vector-store';
+
 export interface IOpenaiClientDelegator {
 export interface IOpenaiClientDelegator {
-  createVectorStore(): Promise<OpenAI.Beta.VectorStores.VectorStore>
+  createVectorStore(scopeType:VectorStoreScopeType): Promise<OpenAI.Beta.VectorStores.VectorStore>
   uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject>
   uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject>
   createVectorStoreFileBatch(vectorStoreId: string, fileIds: string[]): Promise<OpenAI.Beta.VectorStores.FileBatches.VectorStoreFileBatch>
   createVectorStoreFileBatch(vectorStoreId: string, fileIds: string[]): Promise<OpenAI.Beta.VectorStores.FileBatches.VectorStoreFileBatch>
   deleteFile(fileId: string): Promise<OpenAI.Files.FileDeleted>;
   deleteFile(fileId: string): Promise<OpenAI.Files.FileDeleted>;

+ 3 - 2
apps/app/src/server/service/openai/client-delegator/openai-client-delegator.ts

@@ -1,6 +1,7 @@
 import OpenAI from 'openai';
 import OpenAI from 'openai';
 import { type Uploadable } from 'openai/uploads';
 import { type Uploadable } from 'openai/uploads';
 
 
+import type { VectorStoreScopeType } from '~/features/openai/server/models/vector-store';
 import { configManager } from '~/server/service/config-manager';
 import { configManager } from '~/server/service/config-manager';
 
 
 import type { IOpenaiClientDelegator } from './interfaces';
 import type { IOpenaiClientDelegator } from './interfaces';
@@ -23,8 +24,8 @@ export class OpenaiClientDelegator implements IOpenaiClientDelegator {
     this.client = new OpenAI({ apiKey });
     this.client = new OpenAI({ apiKey });
   }
   }
 
 
-  async createVectorStore(): Promise<OpenAI.Beta.VectorStores.VectorStore> {
-    return this.client.beta.vectorStores.create({ name: 'growi-vector-store' });
+  async createVectorStore(scopeType:VectorStoreScopeType): Promise<OpenAI.Beta.VectorStores.VectorStore> {
+    return this.client.beta.vectorStores.create({ name: `growi-vector-store-${scopeType}` });
   }
   }
 
 
   async uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject> {
   async uploadFile(file: Uploadable): Promise<OpenAI.Files.FileObject> {

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

@@ -7,6 +7,7 @@ import mongoose from 'mongoose';
 import type OpenAI from 'openai';
 import type OpenAI from 'openai';
 import { toFile } from 'openai';
 import { toFile } from 'openai';
 
 
+import VectorStoreModel, { VectorStoreScopeType } from '~/features/openai/server/models/vector-store';
 import VectorStoreFileRelationModel, {
 import VectorStoreFileRelationModel, {
   type VectorStoreFileRelation,
   type VectorStoreFileRelation,
   prepareVectorStoreFileRelations,
   prepareVectorStoreFileRelations,
@@ -26,7 +27,7 @@ const logger = loggerFactory('growi:service:openai');
 
 
 
 
 export interface IOpenaiService {
 export interface IOpenaiService {
-  getOrCreateVectorStoreId(): Promise<string>;
+  getOrCreateVectorStoreIdForPublicScope(): Promise<string>
   createVectorStoreFile(pages: PageDocument[]): Promise<void>;
   createVectorStoreFile(pages: PageDocument[]): Promise<void>;
   deleteVectorStoreFile(pageId: Types.ObjectId): Promise<void>;
   deleteVectorStoreFile(pageId: Types.ObjectId): Promise<void>;
   rebuildVectorStoreAll(): Promise<void>;
   rebuildVectorStoreAll(): Promise<void>;
@@ -39,17 +40,20 @@ class OpenaiService implements IOpenaiService {
     return getClient({ openaiServiceType });
     return getClient({ openaiServiceType });
   }
   }
 
 
-  public async getOrCreateVectorStoreId(): Promise<string> {
-    const configKey = 'openai:vectorStoreId';
-
-    const vectorStoreId = configManager.getConfig('crowi', configKey);
-    if (vectorStoreId != null) {
-      return vectorStoreId;
+  public async getOrCreateVectorStoreIdForPublicScope(): Promise<string> {
+    const vectorStore = await VectorStoreModel.findOne({ scorpeType: VectorStoreScopeType.PUBLIC });
+    if (vectorStore != null) {
+      return vectorStore.vectorStoreId;
     }
     }
 
 
-    const newVectorStore = await this.client.createVectorStore();
+    const newVectorStore = await this.client.createVectorStore(VectorStoreScopeType.PUBLIC);
     const newVectorStoreId = newVectorStore.id;
     const newVectorStoreId = newVectorStore.id;
-    configManager.updateConfigsInTheSameNamespace('crowi', { [configKey]: newVectorStoreId });
+
+    VectorStoreModel.create({
+      vectorStoreId: newVectorStoreId,
+      scorpeType: VectorStoreScopeType.PUBLIC,
+    });
+
     return newVectorStoreId;
     return newVectorStoreId;
   }
   }
 
 
@@ -93,7 +97,7 @@ class OpenaiService implements IOpenaiService {
     const uploadedFileIds = vectorStoreFileRelations.map(data => data.fileIds).flat();
     const uploadedFileIds = vectorStoreFileRelations.map(data => data.fileIds).flat();
     try {
     try {
       // Create vector store file
       // Create vector store file
-      const vectorStoreId = await this.getOrCreateVectorStoreId();
+      const vectorStoreId = await this.getOrCreateVectorStoreIdForPublicScope();
       const createVectorStoreFileBatchResponse = await this.client.createVectorStoreFileBatch(vectorStoreId, uploadedFileIds);
       const createVectorStoreFileBatchResponse = await this.client.createVectorStoreFileBatch(vectorStoreId, uploadedFileIds);
       logger.debug('Create vector store file', createVectorStoreFileBatchResponse);
       logger.debug('Create vector store file', createVectorStoreFileBatchResponse);