From 27c6ac6c8d365b00470f4e53977d0c080ca02e59 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Wed, 2 Oct 2024 15:08:59 +0700 Subject: [PATCH 1/2] fix: overlap text model selector and loading (#3756) --- web/containers/Loader/ModelStart.tsx | 2 +- web/containers/ModelDropdown/index.tsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/web/containers/Loader/ModelStart.tsx b/web/containers/Loader/ModelStart.tsx index 420d803c8..1eb22f25e 100644 --- a/web/containers/Loader/ModelStart.tsx +++ b/web/containers/Loader/ModelStart.tsx @@ -42,7 +42,7 @@ export default function ModelStart() { style={{ width: `${loader}%` }} data-testid="model-loader" /> - + {stateModel.state === 'start' ? 'Starting' : 'Stopping'}  model  {stateModel.model?.id} diff --git a/web/containers/ModelDropdown/index.tsx b/web/containers/ModelDropdown/index.tsx index 192c18131..aa9dab236 100644 --- a/web/containers/ModelDropdown/index.tsx +++ b/web/containers/ModelDropdown/index.tsx @@ -318,7 +318,9 @@ const ModelDropdown = ({ )} onClick={() => setOpen(!open)} > - {selectedModel?.name} + + {selectedModel?.name} + ) : ( Date: Thu, 3 Oct 2024 19:44:52 +0700 Subject: [PATCH 2/2] fix: error handling for model imports should be handled gracefully --- extensions/model-extension/src/index.test.ts | 58 ++++++++++++++++++++ extensions/model-extension/src/index.ts | 9 ++- extensions/model-extension/src/node/index.ts | 7 +-- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/extensions/model-extension/src/index.test.ts b/extensions/model-extension/src/index.test.ts index 5b126d4cc..3f804b6d6 100644 --- a/extensions/model-extension/src/index.test.ts +++ b/extensions/model-extension/src/index.test.ts @@ -784,5 +784,63 @@ describe('JanModelExtension', () => { expect.anything() ) }) + + it('should handle model with valid chat_template', async () => { + executeMock.mockResolvedValue('{prompt}') + ;(gguf as jest.Mock).mockResolvedValue({ + metadata: {}, + }) + // @ts-ignore + global.NODE = 'node' + // @ts-ignore + global.DEFAULT_MODEL = { + parameters: { stop: [] }, + settings: { + prompt_template: '<|im-start|>{prompt}<|im-end|>', + }, + } + + const result = await sut.retrieveGGUFMetadata({}) + + expect(result).toEqual({ + parameters: { + stop: [], + }, + settings: { + ctx_len: 4096, + ngl: 33, + prompt_template: '{prompt}', + }, + }) + }) + + it('should handle model without chat_template', async () => { + executeMock.mockRejectedValue({}) + ;(gguf as jest.Mock).mockResolvedValue({ + metadata: {}, + }) + // @ts-ignore + global.NODE = 'node' + // @ts-ignore + global.DEFAULT_MODEL = { + parameters: { stop: [] }, + settings: { + prompt_template: '<|im-start|>{prompt}<|im-end|>', + }, + } + + const result = await sut.retrieveGGUFMetadata({}) + + expect(result).toEqual({ + parameters: { + stop: [], + }, + settings: { + ctx_len: 4096, + ngl: 33, + prompt_template: '<|im-start|>{prompt}<|im-end|>', + }, + }) + }) }) }) diff --git a/extensions/model-extension/src/index.ts b/extensions/model-extension/src/index.ts index 20d23b747..6d26d576c 100644 --- a/extensions/model-extension/src/index.ts +++ b/extensions/model-extension/src/index.ts @@ -577,7 +577,7 @@ export default class JanModelExtension extends ModelExtension { dirName, binaryFileName, ]) - ) + ).catch(() => undefined) const updatedModel = await this.retrieveGGUFMetadata(metadata) @@ -877,8 +877,13 @@ export default class JanModelExtension extends ModelExtension { * @returns */ async retrieveGGUFMetadata(metadata: any): Promise> { - const template = await executeOnMain(NODE, 'renderJinjaTemplate', metadata) const defaultModel = DEFAULT_MODEL as Model + var template = await executeOnMain( + NODE, + 'renderJinjaTemplate', + metadata + ).catch(() => undefined) + const eos_id = metadata['tokenizer.ggml.eos_token_id'] const architecture = metadata['general.architecture'] diff --git a/extensions/model-extension/src/node/index.ts b/extensions/model-extension/src/node/index.ts index 6323d7f97..2acf6ec4a 100644 --- a/extensions/model-extension/src/node/index.ts +++ b/extensions/model-extension/src/node/index.ts @@ -16,12 +16,7 @@ export const retrieveGGUFMetadata = async (ggufPath: string) => { // Parse metadata and tensor info const { metadata } = ggufMetadata(buffer.buffer) - // Parse jinja template - const renderedTemplate = renderJinjaTemplate(metadata) - return { - ...metadata, - parsed_chat_template: renderedTemplate, - } + return metadata } catch (e) { console.log('[MODEL_EXT]', e) }