From 315a55dd88ea205f757843b9679c78160c21ccb6 Mon Sep 17 00:00:00 2001 From: marknguyen1302 Date: Mon, 15 Jul 2024 11:12:05 +0700 Subject: [PATCH 1/4] add custom model id, fix wrong format --- .../controllers/models.controller.ts | 8 ++++---- .../assistants/assistants.usecases.ts | 11 +++++++---- .../usecases/messages/messages.usecases.ts | 14 +++++++++----- .../src/usecases/models/models.usecases.ts | 10 +++++----- .../src/usecases/threads/threads.usecases.ts | 19 +++++++++++-------- 5 files changed, 36 insertions(+), 26 deletions(-) diff --git a/cortex-js/src/infrastructure/controllers/models.controller.ts b/cortex-js/src/infrastructure/controllers/models.controller.ts index c9b1e4ca5..729a61460 100644 --- a/cortex-js/src/infrastructure/controllers/models.controller.ts +++ b/cortex-js/src/infrastructure/controllers/models.controller.ts @@ -120,7 +120,7 @@ export class ModelsController { }) @Get('download/:modelId(*)') - downloadModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string) { + downloadModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string, @Query('customModelId') customModelId: string) { this.modelsUsecases.pullModel(modelId, false, (files) => { return new Promise(async (resolve, reject) => { const file = files @@ -130,7 +130,7 @@ export class ModelsController { } return resolve(file); }); - }).then(() => this.telemetryUsecases.addEventToQueue({ + }, customModelId).then(() => this.telemetryUsecases.addEventToQueue({ name: EventName.DOWNLOAD_MODEL, modelId, }) @@ -174,7 +174,7 @@ export class ModelsController { description: 'The unique identifier of the model.', }) @Get('pull/:modelId(*)') - pullModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string) { + pullModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string, @Query('customModelId') customModelId: string) { this.modelsUsecases.pullModel(modelId, false, (files) => { return new Promise(async (resolve, reject) => { const file = files @@ -184,7 +184,7 @@ export class ModelsController { } return resolve(file); }); - }).then(() => this.telemetryUsecases.addEventToQueue({ + }, customModelId).then(() => this.telemetryUsecases.addEventToQueue({ name: EventName.DOWNLOAD_MODEL, modelId, }) diff --git a/cortex-js/src/usecases/assistants/assistants.usecases.ts b/cortex-js/src/usecases/assistants/assistants.usecases.ts index b3b425468..25cde5241 100644 --- a/cortex-js/src/usecases/assistants/assistants.usecases.ts +++ b/cortex-js/src/usecases/assistants/assistants.usecases.ts @@ -41,7 +41,8 @@ export class AssistantsUsecases { throw err; } - return this.findOne(id); + const result = await this.findOne(id); + return result?.toJSON(); } async listAssistants( @@ -75,17 +76,19 @@ export class AssistantsUsecases { const firstId = assistants[0]?.id ?? undefined; const lastId = assistants[assistants.length - 1]?.id ?? undefined; - return new PageDto(assistants, hasMore, firstId, lastId); + return new PageDto(assistants.map(assistant => assistant.toJSON()), hasMore, firstId, lastId); } async findAll(): Promise { - return this.assistantRepository.findAll(); + const assistants = await this.assistantRepository.findAll(); + return assistants.map((assistant) => assistant.toJSON()); } async findOne(id: string) { - return this.assistantRepository.findOne({ + const assistant = await this.assistantRepository.findOne({ where: { id }, }); + return assistant?.toJSON(); } async remove(id: string) { diff --git a/cortex-js/src/usecases/messages/messages.usecases.ts b/cortex-js/src/usecases/messages/messages.usecases.ts index 13eaac7c4..333966bf1 100644 --- a/cortex-js/src/usecases/messages/messages.usecases.ts +++ b/cortex-js/src/usecases/messages/messages.usecases.ts @@ -28,19 +28,22 @@ export class MessagesUsecases { metadata: undefined, assistant_id: assistant_id ?? null, }; - return this.messageRepository.create(message); + const messsage = await this.messageRepository.create(message) + return messsage.toJSON(); } async findAll() { - return this.messageRepository.findAll(); + const messages = await this.messageRepository.findAll(); + return messages.map((message) => message.toJSON()); } async findOne(id: string) { - return this.messageRepository.findOne({ + const message = await this.messageRepository.findOne({ where: { id, }, }); + return message?.toJSON(); } async update(id: string, updateMessageDto: UpdateMessageDto) { @@ -48,7 +51,7 @@ export class MessagesUsecases { where: { id }, returning: true, }); - return { numberOfAffectedRows, updatedMessage }; + return { numberOfAffectedRows, updatedMessage: updatedMessage.toJSON() }; } async remove(id: string) { @@ -58,12 +61,13 @@ export class MessagesUsecases { } async getLastMessagesByThread(threadId: string, limit: number) { - return this.messageRepository.findAll({ + const messages = await this.messageRepository.findAll({ where: { thread_id: threadId, }, order: [['created_at', 'DESC']], limit: limit, }); + return messages.map((message) => message.toJSON()); } } diff --git a/cortex-js/src/usecases/models/models.usecases.ts b/cortex-js/src/usecases/models/models.usecases.ts index ab900cc02..23443eaf6 100644 --- a/cortex-js/src/usecases/models/models.usecases.ts +++ b/cortex-js/src/usecases/models/models.usecases.ts @@ -321,12 +321,14 @@ export class ModelsUsecases { * @param modelId */ async pullModel( - modelId: string, + hfModelId: string, inSequence: boolean = true, selection?: ( siblings: HuggingFaceRepoSibling[], ) => Promise, + customModelId?: string, ) { + const modelId = customModelId ?? hfModelId; const existingModel = await this.findOne(modelId); if (isLocalModel(existingModel?.files)) { throw new BadRequestException('Model already exists'); @@ -341,10 +343,10 @@ export class ModelsUsecases { const modelFolder = join(modelsContainerDir, normalizeModelId(modelId)); await promises.mkdir(modelFolder, { recursive: true }).catch(() => {}); - let files = (await fetchJanRepoData(modelId)).siblings; + let files = (await fetchJanRepoData(hfModelId)).siblings; // HuggingFace GGUF Repo - Only one file is downloaded - if (modelId.includes('/') && selection && files.length) { + if (hfModelId.includes('/') && selection && files.length) { try { files = [await selection(files)]; } catch (e) { @@ -409,8 +411,6 @@ export class ModelsUsecases { model.model = modelId; if (!(await this.findOne(modelId))) await this.create(model); } else { - // Fallback if model.yml is not found & is a GGUF file - const data = await this.fetchModelMetadata(modelId); await this.populateHuggingFaceModel(modelId, files[0]); const model = await this.findOne(modelId); if (model) { diff --git a/cortex-js/src/usecases/threads/threads.usecases.ts b/cortex-js/src/usecases/threads/threads.usecases.ts index 0ffcfa522..abfc1aa8a 100644 --- a/cortex-js/src/usecases/threads/threads.usecases.ts +++ b/cortex-js/src/usecases/threads/threads.usecases.ts @@ -48,14 +48,16 @@ export class ThreadsUsecases { metadata: null, }; - return this.threadRepository.create(thread); + const thead = await this.threadRepository.create(thread); + return thead.toJSON(); } async findAll(): Promise { - return this.threadRepository.findAll({ + const threads = await this.threadRepository.findAll({ include: [{ all: true }], order: [['created_at', 'DESC']], }); + return threads.map((thread) => thread.toJSON()); } async getMessagesOfThread( @@ -86,7 +88,7 @@ export class ThreadsUsecases { const firstId = messages[0]?.id ?? undefined; const lastId = messages[messages.length - 1]?.id ?? undefined; - return new PageDto(messages, hasMore, firstId, lastId); + return new PageDto(messages.map(message => message.toJSON()), hasMore, firstId, lastId); } async createMessageInThread( @@ -121,8 +123,8 @@ export class ThreadsUsecases { incomplete_at: null, }; - await this.messageRepository.create(message); - return message; + const createdMessage = await this.messageRepository.create(message); + return createdMessage.toJSON(); } async updateMessage( @@ -132,7 +134,8 @@ export class ThreadsUsecases { ) { await this.getThreadOrThrow(threadId); await this.messageRepository.update(updateMessageDto, { where: { id: messageId } }); - return this.messageRepository.findOne({ where: { id: messageId } }); + const updatedMessage = await this.messageRepository.findOne({ where: { id: messageId } }); + return updatedMessage?.toJSON(); } private async getThreadOrThrow(threadId: string): Promise { @@ -140,7 +143,7 @@ export class ThreadsUsecases { if (!thread) { throw new NotFoundException(`Thread with id ${threadId} not found`); } - return thread; + return thread.toJSON(); } private async getMessageOrThrow(messageId: string): Promise { @@ -150,7 +153,7 @@ export class ThreadsUsecases { if (!message) { throw new NotFoundException(`Message with id ${messageId} not found`); } - return message; + return message.toJSON(); } findOne(id: string) { From 2918bf9153106c1d259573bfaeb957a27227b321 Mon Sep 17 00:00:00 2001 From: marknguyen1302 Date: Mon, 15 Jul 2024 11:29:27 +0700 Subject: [PATCH 2/4] revert toJSON --- .../assistants/assistants.usecases.ts | 11 ++++------- .../usecases/messages/messages.usecases.ts | 14 +++++--------- .../src/usecases/threads/threads.usecases.ts | 19 ++++++++----------- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/cortex-js/src/usecases/assistants/assistants.usecases.ts b/cortex-js/src/usecases/assistants/assistants.usecases.ts index 25cde5241..b3b425468 100644 --- a/cortex-js/src/usecases/assistants/assistants.usecases.ts +++ b/cortex-js/src/usecases/assistants/assistants.usecases.ts @@ -41,8 +41,7 @@ export class AssistantsUsecases { throw err; } - const result = await this.findOne(id); - return result?.toJSON(); + return this.findOne(id); } async listAssistants( @@ -76,19 +75,17 @@ export class AssistantsUsecases { const firstId = assistants[0]?.id ?? undefined; const lastId = assistants[assistants.length - 1]?.id ?? undefined; - return new PageDto(assistants.map(assistant => assistant.toJSON()), hasMore, firstId, lastId); + return new PageDto(assistants, hasMore, firstId, lastId); } async findAll(): Promise { - const assistants = await this.assistantRepository.findAll(); - return assistants.map((assistant) => assistant.toJSON()); + return this.assistantRepository.findAll(); } async findOne(id: string) { - const assistant = await this.assistantRepository.findOne({ + return this.assistantRepository.findOne({ where: { id }, }); - return assistant?.toJSON(); } async remove(id: string) { diff --git a/cortex-js/src/usecases/messages/messages.usecases.ts b/cortex-js/src/usecases/messages/messages.usecases.ts index 333966bf1..13eaac7c4 100644 --- a/cortex-js/src/usecases/messages/messages.usecases.ts +++ b/cortex-js/src/usecases/messages/messages.usecases.ts @@ -28,22 +28,19 @@ export class MessagesUsecases { metadata: undefined, assistant_id: assistant_id ?? null, }; - const messsage = await this.messageRepository.create(message) - return messsage.toJSON(); + return this.messageRepository.create(message); } async findAll() { - const messages = await this.messageRepository.findAll(); - return messages.map((message) => message.toJSON()); + return this.messageRepository.findAll(); } async findOne(id: string) { - const message = await this.messageRepository.findOne({ + return this.messageRepository.findOne({ where: { id, }, }); - return message?.toJSON(); } async update(id: string, updateMessageDto: UpdateMessageDto) { @@ -51,7 +48,7 @@ export class MessagesUsecases { where: { id }, returning: true, }); - return { numberOfAffectedRows, updatedMessage: updatedMessage.toJSON() }; + return { numberOfAffectedRows, updatedMessage }; } async remove(id: string) { @@ -61,13 +58,12 @@ export class MessagesUsecases { } async getLastMessagesByThread(threadId: string, limit: number) { - const messages = await this.messageRepository.findAll({ + return this.messageRepository.findAll({ where: { thread_id: threadId, }, order: [['created_at', 'DESC']], limit: limit, }); - return messages.map((message) => message.toJSON()); } } diff --git a/cortex-js/src/usecases/threads/threads.usecases.ts b/cortex-js/src/usecases/threads/threads.usecases.ts index abfc1aa8a..0ffcfa522 100644 --- a/cortex-js/src/usecases/threads/threads.usecases.ts +++ b/cortex-js/src/usecases/threads/threads.usecases.ts @@ -48,16 +48,14 @@ export class ThreadsUsecases { metadata: null, }; - const thead = await this.threadRepository.create(thread); - return thead.toJSON(); + return this.threadRepository.create(thread); } async findAll(): Promise { - const threads = await this.threadRepository.findAll({ + return this.threadRepository.findAll({ include: [{ all: true }], order: [['created_at', 'DESC']], }); - return threads.map((thread) => thread.toJSON()); } async getMessagesOfThread( @@ -88,7 +86,7 @@ export class ThreadsUsecases { const firstId = messages[0]?.id ?? undefined; const lastId = messages[messages.length - 1]?.id ?? undefined; - return new PageDto(messages.map(message => message.toJSON()), hasMore, firstId, lastId); + return new PageDto(messages, hasMore, firstId, lastId); } async createMessageInThread( @@ -123,8 +121,8 @@ export class ThreadsUsecases { incomplete_at: null, }; - const createdMessage = await this.messageRepository.create(message); - return createdMessage.toJSON(); + await this.messageRepository.create(message); + return message; } async updateMessage( @@ -134,8 +132,7 @@ export class ThreadsUsecases { ) { await this.getThreadOrThrow(threadId); await this.messageRepository.update(updateMessageDto, { where: { id: messageId } }); - const updatedMessage = await this.messageRepository.findOne({ where: { id: messageId } }); - return updatedMessage?.toJSON(); + return this.messageRepository.findOne({ where: { id: messageId } }); } private async getThreadOrThrow(threadId: string): Promise { @@ -143,7 +140,7 @@ export class ThreadsUsecases { if (!thread) { throw new NotFoundException(`Thread with id ${threadId} not found`); } - return thread.toJSON(); + return thread; } private async getMessageOrThrow(messageId: string): Promise { @@ -153,7 +150,7 @@ export class ThreadsUsecases { if (!message) { throw new NotFoundException(`Message with id ${messageId} not found`); } - return message.toJSON(); + return message; } findOne(id: string) { From 02584170f2da99ab963ce5bde2be0bb365990615 Mon Sep 17 00:00:00 2001 From: marknguyen1302 Date: Mon, 15 Jul 2024 11:30:31 +0700 Subject: [PATCH 3/4] change naming --- .../src/infrastructure/controllers/models.controller.ts | 8 ++++---- cortex-js/src/usecases/models/models.usecases.ts | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cortex-js/src/infrastructure/controllers/models.controller.ts b/cortex-js/src/infrastructure/controllers/models.controller.ts index 729a61460..851a9f91a 100644 --- a/cortex-js/src/infrastructure/controllers/models.controller.ts +++ b/cortex-js/src/infrastructure/controllers/models.controller.ts @@ -120,7 +120,7 @@ export class ModelsController { }) @Get('download/:modelId(*)') - downloadModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string, @Query('customModelId') customModelId: string) { + downloadModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string, @Query('persistedModelId') persistedModelId?: string) { this.modelsUsecases.pullModel(modelId, false, (files) => { return new Promise(async (resolve, reject) => { const file = files @@ -130,7 +130,7 @@ export class ModelsController { } return resolve(file); }); - }, customModelId).then(() => this.telemetryUsecases.addEventToQueue({ + }, persistedModelId).then(() => this.telemetryUsecases.addEventToQueue({ name: EventName.DOWNLOAD_MODEL, modelId, }) @@ -174,7 +174,7 @@ export class ModelsController { description: 'The unique identifier of the model.', }) @Get('pull/:modelId(*)') - pullModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string, @Query('customModelId') customModelId: string) { + pullModel(@Param('modelId') modelId: string, @Query('fileName') fileName: string, @Query('persistedModelId') persistedModelId?: string) { this.modelsUsecases.pullModel(modelId, false, (files) => { return new Promise(async (resolve, reject) => { const file = files @@ -184,7 +184,7 @@ export class ModelsController { } return resolve(file); }); - }, customModelId).then(() => this.telemetryUsecases.addEventToQueue({ + }, persistedModelId).then(() => this.telemetryUsecases.addEventToQueue({ name: EventName.DOWNLOAD_MODEL, modelId, }) diff --git a/cortex-js/src/usecases/models/models.usecases.ts b/cortex-js/src/usecases/models/models.usecases.ts index 23443eaf6..5d2f7fc06 100644 --- a/cortex-js/src/usecases/models/models.usecases.ts +++ b/cortex-js/src/usecases/models/models.usecases.ts @@ -326,9 +326,9 @@ export class ModelsUsecases { selection?: ( siblings: HuggingFaceRepoSibling[], ) => Promise, - customModelId?: string, + persistedModelId?: string, ) { - const modelId = customModelId ?? hfModelId; + const modelId = persistedModelId ?? hfModelId; const existingModel = await this.findOne(modelId); if (isLocalModel(existingModel?.files)) { throw new BadRequestException('Model already exists'); From 53d629858aee410f7c65b7f52d60aee273834127 Mon Sep 17 00:00:00 2001 From: marknguyen1302 Date: Mon, 15 Jul 2024 15:51:07 +0700 Subject: [PATCH 4/4] change naming --- cortex-js/src/usecases/models/models.usecases.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cortex-js/src/usecases/models/models.usecases.ts b/cortex-js/src/usecases/models/models.usecases.ts index 5d2f7fc06..9c3824a17 100644 --- a/cortex-js/src/usecases/models/models.usecases.ts +++ b/cortex-js/src/usecases/models/models.usecases.ts @@ -321,14 +321,14 @@ export class ModelsUsecases { * @param modelId */ async pullModel( - hfModelId: string, + originModelId: string, inSequence: boolean = true, selection?: ( siblings: HuggingFaceRepoSibling[], ) => Promise, persistedModelId?: string, ) { - const modelId = persistedModelId ?? hfModelId; + const modelId = persistedModelId ?? originModelId; const existingModel = await this.findOne(modelId); if (isLocalModel(existingModel?.files)) { throw new BadRequestException('Model already exists'); @@ -343,10 +343,10 @@ export class ModelsUsecases { const modelFolder = join(modelsContainerDir, normalizeModelId(modelId)); await promises.mkdir(modelFolder, { recursive: true }).catch(() => {}); - let files = (await fetchJanRepoData(hfModelId)).siblings; + let files = (await fetchJanRepoData(originModelId)).siblings; // HuggingFace GGUF Repo - Only one file is downloaded - if (hfModelId.includes('/') && selection && files.length) { + if (originModelId.includes('/') && selection && files.length) { try { files = [await selection(files)]; } catch (e) {