From e0d6049d6691e872fd1457226ce797814bad973f Mon Sep 17 00:00:00 2001 From: NamH Date: Fri, 5 Apr 2024 14:18:58 +0700 Subject: [PATCH] chore: extension should register its own models (#2601) * chore: extension should register its own models Signed-off-by: James --------- Signed-off-by: James Co-authored-by: James --- Dockerfile | 1 - Dockerfile.gpu | 1 - core/rollup.config.ts | 1 + .../browser/extensions/engines/AIEngine.ts | 90 ++++++++-------- core/src/types/model/modelEntity.ts | 2 +- electron/package.json | 2 - .../assistant-extension/rollup.config.ts | 2 +- .../src/@types/global.d.ts | 1 - extensions/assistant-extension/src/index.ts | 4 +- .../huggingface-extension/rollup.config.ts | 2 +- .../src/@types/global.d.ts | 1 - extensions/huggingface-extension/src/index.ts | 2 +- .../resources/models.json | 58 +++++++++++ .../inference-groq-extension/src/index.ts | 3 + .../webpack.config.js | 2 + .../resources/models}/bakllava-1/model.json | 0 .../models}/codeninja-1.0-7b/model.json | 0 .../models}/command-r-34b/model.json | 0 .../models}/deepseek-coder-1.3b/model.json | 0 .../models}/deepseek-coder-34b/model.json | 0 .../models}/dolphin-phi-2/model.json | 0 .../resources/models}/gemma-2b/model.json | 0 .../resources/models}/gemma-7b/model.json | 0 .../models}/hermes-pro-7b/model.json | 0 .../models}/llama2-chat-70b/model.json | 0 .../models}/llama2-chat-7b/model.json | 0 .../models}/llamacorn-1.1b/model.json | 0 .../resources/models}/llava-13b/model.json | 0 .../resources/models}/llava-7b/model.json | 0 .../resources/models}/miqu-70b/model.json | 0 .../models}/mistral-ins-7b-q4/model.json | 0 .../models}/mixtral-8x7b-instruct/model.json | 0 .../resources/models}/noromaid-7b/model.json | 0 .../models}/openchat-3.5-7b/model.json | 0 .../models}/openhermes-neural-7b/model.json | 0 .../resources/models}/phind-34b/model.json | 0 .../resources/models}/qwen-7b/model.json | 0 .../models}/stable-zephyr-3b/model.json | 0 .../models}/stealth-v1.2-7b/model.json | 0 .../models}/tinyllama-1.1b/model.json | 0 .../models}/trinity-v1.2-7b/model.json | 0 .../resources/models}/vistral-7b/model.json | 0 .../models}/wizardcoder-13b/model.json | 0 .../resources/models}/yi-34b/model.json | 0 .../rollup.config.ts | 63 +++++++++++- .../src/@types/global.d.ts | 2 +- .../inference-nitro-extension/src/index.ts | 7 +- .../resources/models.json | 97 ++++++++++++++++++ .../inference-openai-extension/src/index.ts | 4 + .../webpack.config.js | 2 + .../resources}/default-model.json | 2 +- extensions/model-extension/rollup.config.ts | 4 +- .../model-extension/src/@types/global.d.ts | 2 +- extensions/model-extension/src/index.ts | 53 +--------- .../monitoring-extension/rollup.config.ts | 1 + .../{ => resources}/models.json | 0 .../tensorrt-llm-extension/rollup.config.ts | 6 +- .../src/@types/global.d.ts | 2 +- .../tensorrt-llm-extension/src/index.ts | 25 ++--- models/gpt-3.5-turbo-16k-0613/model.json | 23 ----- models/gpt-3.5-turbo/model.json | 23 ----- models/gpt-4-vision-preview/model.json | 26 ----- models/gpt-4/model.json | 23 ----- models/groq-llama2-70b/model.json | 28 ----- models/groq-mixtral-8x7b-instruct/model.json | 28 ----- models/mistral-ins-7b-q4/cover.png | Bin 234495 -> 0 bytes models/openhermes-neural-7b/cover.png | Bin 365073 -> 0 bytes models/trinity-v1.2-7b/cover.png | Bin 360002 -> 0 bytes package.json | 2 +- 69 files changed, 311 insertions(+), 284 deletions(-) create mode 100644 extensions/inference-groq-extension/resources/models.json rename {models => extensions/inference-nitro-extension/resources/models}/bakllava-1/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/codeninja-1.0-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/command-r-34b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/deepseek-coder-1.3b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/deepseek-coder-34b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/dolphin-phi-2/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/gemma-2b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/gemma-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/hermes-pro-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/llama2-chat-70b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/llama2-chat-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/llamacorn-1.1b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/llava-13b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/llava-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/miqu-70b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/mistral-ins-7b-q4/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/mixtral-8x7b-instruct/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/noromaid-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/openchat-3.5-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/openhermes-neural-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/phind-34b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/qwen-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/stable-zephyr-3b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/stealth-v1.2-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/tinyllama-1.1b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/trinity-v1.2-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/vistral-7b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/wizardcoder-13b/model.json (100%) rename {models => extensions/inference-nitro-extension/resources/models}/yi-34b/model.json (100%) create mode 100644 extensions/inference-openai-extension/resources/models.json rename {models/config => extensions/model-extension/resources}/default-model.json (97%) rename extensions/tensorrt-llm-extension/{ => resources}/models.json (100%) delete mode 100644 models/gpt-3.5-turbo-16k-0613/model.json delete mode 100644 models/gpt-3.5-turbo/model.json delete mode 100644 models/gpt-4-vision-preview/model.json delete mode 100644 models/gpt-4/model.json delete mode 100644 models/groq-llama2-70b/model.json delete mode 100644 models/groq-mixtral-8x7b-instruct/model.json delete mode 100644 models/mistral-ins-7b-q4/cover.png delete mode 100644 models/openhermes-neural-7b/cover.png delete mode 100644 models/trinity-v1.2-7b/cover.png diff --git a/Dockerfile b/Dockerfile index e205a3f4f..dee423170 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,6 @@ COPY --from=builder /app/pre-install ./pre-install/ # Copy the package.json, yarn.lock, and output of web yarn space to leverage Docker cache COPY --from=builder /app/uikit ./uikit/ COPY --from=builder /app/web ./web/ -COPY --from=builder /app/models ./models/ RUN yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit build RUN yarn workspace @janhq/web install diff --git a/Dockerfile.gpu b/Dockerfile.gpu index d703b8b43..7adc1e02a 100644 --- a/Dockerfile.gpu +++ b/Dockerfile.gpu @@ -65,7 +65,6 @@ COPY --from=builder /app/pre-install ./pre-install/ # Copy the package.json, yarn.lock, and output of web yarn space to leverage Docker cache COPY --from=builder /app/uikit ./uikit/ COPY --from=builder /app/web ./web/ -COPY --from=builder /app/models ./models/ RUN yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit build RUN yarn workspace @janhq/web install diff --git a/core/rollup.config.ts b/core/rollup.config.ts index 865e86d5c..e3336bfad 100644 --- a/core/rollup.config.ts +++ b/core/rollup.config.ts @@ -30,6 +30,7 @@ export default [ // which external modules to include in the bundle // https://github.com/rollup/rollup-plugin-node-resolve#usage replace({ + 'preventAssignment': true, 'node:crypto': 'crypto', 'delimiters': ['"', '"'], }), diff --git a/core/src/browser/extensions/engines/AIEngine.ts b/core/src/browser/extensions/engines/AIEngine.ts index c4f816829..7cd9f513e 100644 --- a/core/src/browser/extensions/engines/AIEngine.ts +++ b/core/src/browser/extensions/engines/AIEngine.ts @@ -10,6 +10,8 @@ import { EngineManager } from './EngineManager' * Applicable to all AI Engines */ export abstract class AIEngine extends BaseExtension { + private static modelsFolder = 'models' + // The inference engine abstract provider: string @@ -21,15 +23,6 @@ export abstract class AIEngine extends BaseExtension { events.on(ModelEvent.OnModelInit, (model: Model) => this.loadModel(model)) events.on(ModelEvent.OnModelStop, (model: Model) => this.unloadModel(model)) - - this.prePopulateModels() - } - - /** - * Defines models - */ - models(): Promise { - return Promise.resolve([]) } /** @@ -39,6 +32,49 @@ export abstract class AIEngine extends BaseExtension { EngineManager.instance().register(this) } + async registerModels(models: Model[]): Promise { + const modelFolderPath = await joinPath([await getJanDataFolderPath(), AIEngine.modelsFolder]) + + let shouldNotifyModelUpdate = false + for (const model of models) { + const modelPath = await joinPath([modelFolderPath, model.id]) + const isExist = await fs.existsSync(modelPath) + + if (isExist) { + await this.migrateModelIfNeeded(model, modelPath) + continue + } + + await fs.mkdir(modelPath) + await fs.writeFileSync( + await joinPath([modelPath, 'model.json']), + JSON.stringify(model, null, 2) + ) + shouldNotifyModelUpdate = true + } + + if (shouldNotifyModelUpdate) { + events.emit(ModelEvent.OnModelsUpdate, {}) + } + } + + async migrateModelIfNeeded(model: Model, modelPath: string): Promise { + try { + const modelJson = await fs.readFileSync(await joinPath([modelPath, 'model.json']), 'utf-8') + const currentModel: Model = JSON.parse(modelJson) + if (currentModel.version !== model.version) { + await fs.writeFileSync( + await joinPath([modelPath, 'model.json']), + JSON.stringify(model, null, 2) + ) + + events.emit(ModelEvent.OnModelsUpdate, {}) + } + } catch (error) { + console.warn('Error while try to migrating model', error) + } + } + /** * Loads the model. */ @@ -65,40 +101,4 @@ export abstract class AIEngine extends BaseExtension { * Stop inference */ stopInference() {} - - /** - * Pre-populate models to App Data Folder - */ - prePopulateModels(): Promise { - const modelFolder = 'models' - return this.models().then((models) => { - const prePoluateOperations = models.map((model) => - getJanDataFolderPath() - .then((janDataFolder) => - // Attempt to create the model folder - joinPath([janDataFolder, modelFolder, model.id]).then((path) => - fs - .mkdir(path) - .catch() - .then(() => path) - ) - ) - .then((path) => joinPath([path, 'model.json'])) - .then((path) => { - // Do not overwite existing model.json - return fs.existsSync(path).then((exist: any) => { - if (!exist) return fs.writeFileSync(path, JSON.stringify(model, null, 2)) - }) - }) - .catch((e: Error) => { - console.error('Error', e) - }) - ) - Promise.all(prePoluateOperations).then(() => - // Emit event to update models - // So the UI can update the models list - events.emit(ModelEvent.OnModelsUpdate, {}) - ) - }) - } } diff --git a/core/src/types/model/modelEntity.ts b/core/src/types/model/modelEntity.ts index a313847b6..7b2828b46 100644 --- a/core/src/types/model/modelEntity.ts +++ b/core/src/types/model/modelEntity.ts @@ -41,7 +41,7 @@ export type Model = { /** * The version of the model. */ - version: number + version: string /** * The format of the model. diff --git a/electron/package.json b/electron/package.json index 49cbadf7a..2210fb0cf 100644 --- a/electron/package.json +++ b/electron/package.json @@ -14,14 +14,12 @@ "renderer/**/*", "build/**/*.{js,map}", "pre-install", - "models/**/*", "docs/**/*", "scripts/**/*", "icons/**/*" ], "asarUnpack": [ "pre-install", - "models", "docs", "scripts", "icons" diff --git a/extensions/assistant-extension/rollup.config.ts b/extensions/assistant-extension/rollup.config.ts index 744ef2b97..263f6cc60 100644 --- a/extensions/assistant-extension/rollup.config.ts +++ b/extensions/assistant-extension/rollup.config.ts @@ -18,8 +18,8 @@ export default [ }, plugins: [ replace({ + preventAssignment: true, NODE: JSON.stringify(`${packageJson.name}/${packageJson.node}`), - EXTENSION_NAME: JSON.stringify(packageJson.name), VERSION: JSON.stringify(packageJson.version), }), // Allow json resolution diff --git a/extensions/assistant-extension/src/@types/global.d.ts b/extensions/assistant-extension/src/@types/global.d.ts index bc97157cd..2ca4a4080 100644 --- a/extensions/assistant-extension/src/@types/global.d.ts +++ b/extensions/assistant-extension/src/@types/global.d.ts @@ -1,3 +1,2 @@ declare const NODE: string -declare const EXTENSION_NAME: string declare const VERSION: string diff --git a/extensions/assistant-extension/src/index.ts b/extensions/assistant-extension/src/index.ts index f4e098947..53d3ed0d5 100644 --- a/extensions/assistant-extension/src/index.ts +++ b/extensions/assistant-extension/src/index.ts @@ -21,7 +21,7 @@ export default class JanAssistantExtension extends AssistantExtension { JanAssistantExtension._homeDir ) if ( - localStorage.getItem(`${EXTENSION_NAME}-version`) !== VERSION || + localStorage.getItem(`${this.name}-version`) !== VERSION || !assistantDirExist ) { if (!assistantDirExist) await fs.mkdir(JanAssistantExtension._homeDir) @@ -29,7 +29,7 @@ export default class JanAssistantExtension extends AssistantExtension { // Write assistant metadata await this.createJanAssistant() // Finished migration - localStorage.setItem(`${EXTENSION_NAME}-version`, VERSION) + localStorage.setItem(`${this.name}-version`, VERSION) // Update the assistant list events.emit(AssistantEvent.OnAssistantsUpdate, {}) } diff --git a/extensions/huggingface-extension/rollup.config.ts b/extensions/huggingface-extension/rollup.config.ts index 7ae2c5781..16cf3c46d 100644 --- a/extensions/huggingface-extension/rollup.config.ts +++ b/extensions/huggingface-extension/rollup.config.ts @@ -18,7 +18,7 @@ export default [ }, plugins: [ replace({ - EXTENSION_NAME: JSON.stringify(packageJson.name), + preventAssignment: true, NODE_MODULE_PATH: JSON.stringify( `${packageJson.name}/${packageJson.node}` ), diff --git a/extensions/huggingface-extension/src/@types/global.d.ts b/extensions/huggingface-extension/src/@types/global.d.ts index 495ecf00e..b30fe9d69 100644 --- a/extensions/huggingface-extension/src/@types/global.d.ts +++ b/extensions/huggingface-extension/src/@types/global.d.ts @@ -1,2 +1 @@ -declare const EXTENSION_NAME: string declare const NODE_MODULE_PATH: string diff --git a/extensions/huggingface-extension/src/index.ts b/extensions/huggingface-extension/src/index.ts index b703a3e33..0425b9f88 100644 --- a/extensions/huggingface-extension/src/index.ts +++ b/extensions/huggingface-extension/src/index.ts @@ -338,7 +338,7 @@ export default class JanHuggingFaceExtension extends HuggingFaceExtension { const metadata: Model = { object: 'model', - version: 1, + version: '1.0', format: 'gguf', sources: [ { diff --git a/extensions/inference-groq-extension/resources/models.json b/extensions/inference-groq-extension/resources/models.json new file mode 100644 index 000000000..b2775e2be --- /dev/null +++ b/extensions/inference-groq-extension/resources/models.json @@ -0,0 +1,58 @@ +[ + { + "sources": [ + { + "url": "https://groq.com" + } + ], + "id": "llama2-70b-4096", + "object": "model", + "name": "Groq Llama 2 70b", + "version": "1.0", + "description": "Groq Llama 2 70b with supercharged speed!", + "format": "api", + "settings": { + "text_model": false + }, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7, + "top_p": 1, + "stop": null, + "stream": true + }, + "metadata": { + "author": "Meta", + "tags": ["General", "Big Context Length"] + }, + "engine": "groq" + }, + { + "sources": [ + { + "url": "https://groq.com" + } + ], + "id": "mixtral-8x7b-32768", + "object": "model", + "name": "Groq Mixtral 8x7b Instruct", + "version": "1.0", + "description": "Groq Mixtral 8x7b Instruct is Mixtral with supercharged speed!", + "format": "api", + "settings": { + "text_model": false + }, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7, + "top_p": 1, + "stop": null, + "stream": true + }, + "metadata": { + "author": "Mistral", + "tags": ["General", "Big Context Length"] + }, + "engine": "groq" + } +] diff --git a/extensions/inference-groq-extension/src/index.ts b/extensions/inference-groq-extension/src/index.ts index ea62aa14a..d0c88c7a2 100644 --- a/extensions/inference-groq-extension/src/index.ts +++ b/extensions/inference-groq-extension/src/index.ts @@ -9,6 +9,8 @@ import { RemoteOAIEngine } from '@janhq/core' declare const SETTINGS: Array +declare const MODELS: Array + enum Settings { apiKey = 'groq-api-key', chatCompletionsEndPoint = 'chat-completions-endpoint', @@ -27,6 +29,7 @@ export default class JanInferenceGroqExtension extends RemoteOAIEngine { // Register Settings this.registerSettings(SETTINGS) + this.registerModels(MODELS) // Retrieve API Key Setting this.apiKey = await this.getSetting(Settings.apiKey, '') diff --git a/extensions/inference-groq-extension/webpack.config.js b/extensions/inference-groq-extension/webpack.config.js index 13d32c52d..58ade764b 100644 --- a/extensions/inference-groq-extension/webpack.config.js +++ b/extensions/inference-groq-extension/webpack.config.js @@ -2,6 +2,7 @@ const path = require('path') const webpack = require('webpack') const packageJson = require('./package.json') const settingJson = require('./resources/settings.json') +const modelsJson = require('./resources/models.json') module.exports = { experiments: { outputModule: true }, @@ -18,6 +19,7 @@ module.exports = { }, plugins: [ new webpack.DefinePlugin({ + MODELS: JSON.stringify(modelsJson), SETTINGS: JSON.stringify(settingJson), MODULE: JSON.stringify(`${packageJson.name}/${packageJson.module}`), }), diff --git a/models/bakllava-1/model.json b/extensions/inference-nitro-extension/resources/models/bakllava-1/model.json similarity index 100% rename from models/bakllava-1/model.json rename to extensions/inference-nitro-extension/resources/models/bakllava-1/model.json diff --git a/models/codeninja-1.0-7b/model.json b/extensions/inference-nitro-extension/resources/models/codeninja-1.0-7b/model.json similarity index 100% rename from models/codeninja-1.0-7b/model.json rename to extensions/inference-nitro-extension/resources/models/codeninja-1.0-7b/model.json diff --git a/models/command-r-34b/model.json b/extensions/inference-nitro-extension/resources/models/command-r-34b/model.json similarity index 100% rename from models/command-r-34b/model.json rename to extensions/inference-nitro-extension/resources/models/command-r-34b/model.json diff --git a/models/deepseek-coder-1.3b/model.json b/extensions/inference-nitro-extension/resources/models/deepseek-coder-1.3b/model.json similarity index 100% rename from models/deepseek-coder-1.3b/model.json rename to extensions/inference-nitro-extension/resources/models/deepseek-coder-1.3b/model.json diff --git a/models/deepseek-coder-34b/model.json b/extensions/inference-nitro-extension/resources/models/deepseek-coder-34b/model.json similarity index 100% rename from models/deepseek-coder-34b/model.json rename to extensions/inference-nitro-extension/resources/models/deepseek-coder-34b/model.json diff --git a/models/dolphin-phi-2/model.json b/extensions/inference-nitro-extension/resources/models/dolphin-phi-2/model.json similarity index 100% rename from models/dolphin-phi-2/model.json rename to extensions/inference-nitro-extension/resources/models/dolphin-phi-2/model.json diff --git a/models/gemma-2b/model.json b/extensions/inference-nitro-extension/resources/models/gemma-2b/model.json similarity index 100% rename from models/gemma-2b/model.json rename to extensions/inference-nitro-extension/resources/models/gemma-2b/model.json diff --git a/models/gemma-7b/model.json b/extensions/inference-nitro-extension/resources/models/gemma-7b/model.json similarity index 100% rename from models/gemma-7b/model.json rename to extensions/inference-nitro-extension/resources/models/gemma-7b/model.json diff --git a/models/hermes-pro-7b/model.json b/extensions/inference-nitro-extension/resources/models/hermes-pro-7b/model.json similarity index 100% rename from models/hermes-pro-7b/model.json rename to extensions/inference-nitro-extension/resources/models/hermes-pro-7b/model.json diff --git a/models/llama2-chat-70b/model.json b/extensions/inference-nitro-extension/resources/models/llama2-chat-70b/model.json similarity index 100% rename from models/llama2-chat-70b/model.json rename to extensions/inference-nitro-extension/resources/models/llama2-chat-70b/model.json diff --git a/models/llama2-chat-7b/model.json b/extensions/inference-nitro-extension/resources/models/llama2-chat-7b/model.json similarity index 100% rename from models/llama2-chat-7b/model.json rename to extensions/inference-nitro-extension/resources/models/llama2-chat-7b/model.json diff --git a/models/llamacorn-1.1b/model.json b/extensions/inference-nitro-extension/resources/models/llamacorn-1.1b/model.json similarity index 100% rename from models/llamacorn-1.1b/model.json rename to extensions/inference-nitro-extension/resources/models/llamacorn-1.1b/model.json diff --git a/models/llava-13b/model.json b/extensions/inference-nitro-extension/resources/models/llava-13b/model.json similarity index 100% rename from models/llava-13b/model.json rename to extensions/inference-nitro-extension/resources/models/llava-13b/model.json diff --git a/models/llava-7b/model.json b/extensions/inference-nitro-extension/resources/models/llava-7b/model.json similarity index 100% rename from models/llava-7b/model.json rename to extensions/inference-nitro-extension/resources/models/llava-7b/model.json diff --git a/models/miqu-70b/model.json b/extensions/inference-nitro-extension/resources/models/miqu-70b/model.json similarity index 100% rename from models/miqu-70b/model.json rename to extensions/inference-nitro-extension/resources/models/miqu-70b/model.json diff --git a/models/mistral-ins-7b-q4/model.json b/extensions/inference-nitro-extension/resources/models/mistral-ins-7b-q4/model.json similarity index 100% rename from models/mistral-ins-7b-q4/model.json rename to extensions/inference-nitro-extension/resources/models/mistral-ins-7b-q4/model.json diff --git a/models/mixtral-8x7b-instruct/model.json b/extensions/inference-nitro-extension/resources/models/mixtral-8x7b-instruct/model.json similarity index 100% rename from models/mixtral-8x7b-instruct/model.json rename to extensions/inference-nitro-extension/resources/models/mixtral-8x7b-instruct/model.json diff --git a/models/noromaid-7b/model.json b/extensions/inference-nitro-extension/resources/models/noromaid-7b/model.json similarity index 100% rename from models/noromaid-7b/model.json rename to extensions/inference-nitro-extension/resources/models/noromaid-7b/model.json diff --git a/models/openchat-3.5-7b/model.json b/extensions/inference-nitro-extension/resources/models/openchat-3.5-7b/model.json similarity index 100% rename from models/openchat-3.5-7b/model.json rename to extensions/inference-nitro-extension/resources/models/openchat-3.5-7b/model.json diff --git a/models/openhermes-neural-7b/model.json b/extensions/inference-nitro-extension/resources/models/openhermes-neural-7b/model.json similarity index 100% rename from models/openhermes-neural-7b/model.json rename to extensions/inference-nitro-extension/resources/models/openhermes-neural-7b/model.json diff --git a/models/phind-34b/model.json b/extensions/inference-nitro-extension/resources/models/phind-34b/model.json similarity index 100% rename from models/phind-34b/model.json rename to extensions/inference-nitro-extension/resources/models/phind-34b/model.json diff --git a/models/qwen-7b/model.json b/extensions/inference-nitro-extension/resources/models/qwen-7b/model.json similarity index 100% rename from models/qwen-7b/model.json rename to extensions/inference-nitro-extension/resources/models/qwen-7b/model.json diff --git a/models/stable-zephyr-3b/model.json b/extensions/inference-nitro-extension/resources/models/stable-zephyr-3b/model.json similarity index 100% rename from models/stable-zephyr-3b/model.json rename to extensions/inference-nitro-extension/resources/models/stable-zephyr-3b/model.json diff --git a/models/stealth-v1.2-7b/model.json b/extensions/inference-nitro-extension/resources/models/stealth-v1.2-7b/model.json similarity index 100% rename from models/stealth-v1.2-7b/model.json rename to extensions/inference-nitro-extension/resources/models/stealth-v1.2-7b/model.json diff --git a/models/tinyllama-1.1b/model.json b/extensions/inference-nitro-extension/resources/models/tinyllama-1.1b/model.json similarity index 100% rename from models/tinyllama-1.1b/model.json rename to extensions/inference-nitro-extension/resources/models/tinyllama-1.1b/model.json diff --git a/models/trinity-v1.2-7b/model.json b/extensions/inference-nitro-extension/resources/models/trinity-v1.2-7b/model.json similarity index 100% rename from models/trinity-v1.2-7b/model.json rename to extensions/inference-nitro-extension/resources/models/trinity-v1.2-7b/model.json diff --git a/models/vistral-7b/model.json b/extensions/inference-nitro-extension/resources/models/vistral-7b/model.json similarity index 100% rename from models/vistral-7b/model.json rename to extensions/inference-nitro-extension/resources/models/vistral-7b/model.json diff --git a/models/wizardcoder-13b/model.json b/extensions/inference-nitro-extension/resources/models/wizardcoder-13b/model.json similarity index 100% rename from models/wizardcoder-13b/model.json rename to extensions/inference-nitro-extension/resources/models/wizardcoder-13b/model.json diff --git a/models/yi-34b/model.json b/extensions/inference-nitro-extension/resources/models/yi-34b/model.json similarity index 100% rename from models/yi-34b/model.json rename to extensions/inference-nitro-extension/resources/models/yi-34b/model.json diff --git a/extensions/inference-nitro-extension/rollup.config.ts b/extensions/inference-nitro-extension/rollup.config.ts index ea7f1b14d..5af1f0c51 100644 --- a/extensions/inference-nitro-extension/rollup.config.ts +++ b/extensions/inference-nitro-extension/rollup.config.ts @@ -7,6 +7,36 @@ import replace from '@rollup/plugin-replace' const packageJson = require('./package.json') const defaultSettingJson = require('./resources/default_settings.json') +const bakllavaJson = require('./resources/models/bakllava-1/model.json') +const codeninja7bJson = require('./resources/models/codeninja-1.0-7b/model.json') +const commandr34bJson = require('./resources/models/command-r-34b/model.json') +const deepseekCoder13bJson = require('./resources/models/deepseek-coder-1.3b/model.json') +const deepseekCoder34bJson = require('./resources/models/deepseek-coder-34b/model.json') +const dolphinPhi2Json = require('./resources/models/dolphin-phi-2/model.json') +const gemma2bJson = require('./resources/models/gemma-2b/model.json') +const gemma7bJson = require('./resources/models/gemma-7b/model.json') +const hermesPro7bJson = require('./resources/models/hermes-pro-7b/model.json') +const llama2Chat70bJson = require('./resources/models/llama2-chat-70b/model.json') +const llama2Chat7bJson = require('./resources/models/llama2-chat-7b/model.json') +const llamacorn1bJson = require('./resources/models/llamacorn-1.1b/model.json') +const llava13bJson = require('./resources/models/llava-13b/model.json') +const llava7bJson = require('./resources/models/llava-7b/model.json') +const miqu70bJson = require('./resources/models/miqu-70b/model.json') +const mistralIns7bq4Json = require('./resources/models/mistral-ins-7b-q4/model.json') +const mixtral8x7bInstructJson = require('./resources/models/mixtral-8x7b-instruct/model.json') +const noromaid7bJson = require('./resources/models/noromaid-7b/model.json') +const openchat357bJson = require('./resources/models/openchat-3.5-7b/model.json') +const openhermesNeural7bJson = require('./resources/models/openhermes-neural-7b/model.json') +const phind34bJson = require('./resources/models/phind-34b/model.json') +const qwen7bJson = require('./resources/models/qwen-7b/model.json') +const stableZephyr3bJson = require('./resources/models/stable-zephyr-3b/model.json') +const stealthv127bJson = require('./resources/models/stealth-v1.2-7b/model.json') +const tinyllama11bJson = require('./resources/models/tinyllama-1.1b/model.json') +const trinityv127bJson = require('./resources/models/trinity-v1.2-7b/model.json') +const vistral7bJson = require('./resources/models/vistral-7b/model.json') +const wizardcoder13bJson = require('./resources/models/wizardcoder-13b/model.json') +const yi34bJson = require('./resources/models/yi-34b/model.json') + export default [ { input: `src/index.ts`, @@ -18,7 +48,38 @@ export default [ }, plugins: [ replace({ - EXTENSION_NAME: JSON.stringify(packageJson.name), + preventAssignment: true, + MODELS: JSON.stringify([ + bakllavaJson, + codeninja7bJson, + commandr34bJson, + deepseekCoder13bJson, + deepseekCoder34bJson, + dolphinPhi2Json, + gemma2bJson, + gemma7bJson, + hermesPro7bJson, + llama2Chat70bJson, + llama2Chat7bJson, + llamacorn1bJson, + llava13bJson, + llava7bJson, + miqu70bJson, + mistralIns7bq4Json, + mixtral8x7bInstructJson, + noromaid7bJson, + openchat357bJson, + openhermesNeural7bJson, + phind34bJson, + qwen7bJson, + stableZephyr3bJson, + stealthv127bJson, + tinyllama11bJson, + trinityv127bJson, + vistral7bJson, + wizardcoder13bJson, + yi34bJson, + ]), NODE: JSON.stringify(`${packageJson.name}/${packageJson.node}`), DEFAULT_SETTINGS: JSON.stringify(defaultSettingJson), INFERENCE_URL: JSON.stringify( diff --git a/extensions/inference-nitro-extension/src/@types/global.d.ts b/extensions/inference-nitro-extension/src/@types/global.d.ts index e16f77b31..85c9b939f 100644 --- a/extensions/inference-nitro-extension/src/@types/global.d.ts +++ b/extensions/inference-nitro-extension/src/@types/global.d.ts @@ -2,8 +2,8 @@ declare const NODE: string declare const INFERENCE_URL: string declare const TROUBLESHOOTING_URL: string declare const JAN_SERVER_INFERENCE_URL: string -declare const EXTENSION_NAME: string declare const DEFAULT_SETTINGS: Array +declare const MODELS: Array /** * The response from the initModel function. diff --git a/extensions/inference-nitro-extension/src/index.ts b/extensions/inference-nitro-extension/src/index.ts index 3d08efdfa..7603269ed 100644 --- a/extensions/inference-nitro-extension/src/index.ts +++ b/extensions/inference-nitro-extension/src/index.ts @@ -23,10 +23,6 @@ export default class JanInferenceNitroExtension extends LocalOAIEngine { nodeModule: string = NODE provider: string = 'nitro' - models(): Promise { - return Promise.resolve([]) - } - /** * Checking the health for Nitro's process each 5 secs. */ @@ -62,7 +58,8 @@ export default class JanInferenceNitroExtension extends LocalOAIEngine { () => this.periodicallyGetNitroHealth(), JanInferenceNitroExtension._intervalHealthCheck ) - + const models = MODELS as unknown as Model[] + this.registerModels(models) super.onLoad() } diff --git a/extensions/inference-openai-extension/resources/models.json b/extensions/inference-openai-extension/resources/models.json new file mode 100644 index 000000000..b7c5885c6 --- /dev/null +++ b/extensions/inference-openai-extension/resources/models.json @@ -0,0 +1,97 @@ +[ + { + "sources": [ + { + "url": "https://openai.com" + } + ], + "id": "gpt-4", + "object": "model", + "name": "OpenAI GPT 4", + "version": "1.0", + "description": "OpenAI GPT 4 model is extremely good", + "format": "api", + "settings": {}, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length"] + }, + "engine": "openai" + }, + { + "sources": [ + { + "url": "https://openai.com" + } + ], + "id": "gpt-4-vision-preview", + "object": "model", + "name": "OpenAI GPT 4 with Vision (Preview)", + "version": "1.0", + "description": "OpenAI GPT 4 with Vision model is extremely good in preview", + "format": "api", + "settings": { + "vision_model": true, + "textModel": false + }, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length", "Vision"] + }, + "engine": "openai" + }, + { + "sources": [ + { + "url": "https://openai.com" + } + ], + "id": "gpt-3.5-turbo-16k-0613", + "object": "model", + "name": "OpenAI GPT 3.5 Turbo 16k 0613", + "version": "1.0", + "description": "OpenAI GPT 3.5 Turbo 16k 0613 model is extremely good", + "format": "api", + "settings": {}, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length"] + }, + "engine": "openai" + }, + { + "sources": [ + { + "url": "https://openai.com" + } + ], + "id": "gpt-3.5-turbo", + "object": "model", + "name": "OpenAI GPT 3.5 Turbo", + "version": "1.0", + "description": "OpenAI GPT 3.5 Turbo model is extremely good", + "format": "api", + "settings": {}, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length"] + }, + "engine": "openai" + } +] diff --git a/extensions/inference-openai-extension/src/index.ts b/extensions/inference-openai-extension/src/index.ts index 0853fe0f6..27b144d12 100644 --- a/extensions/inference-openai-extension/src/index.ts +++ b/extensions/inference-openai-extension/src/index.ts @@ -9,10 +9,13 @@ import { RemoteOAIEngine } from '@janhq/core' declare const SETTINGS: Array +declare const MODELS: Array + enum Settings { apiKey = 'openai-api-key', chatCompletionsEndPoint = 'chat-completions-endpoint', } + /** * A class that implements the InferenceExtension interface from the @janhq/core package. * The class provides methods for initializing and stopping a model, and for making inference requests. @@ -27,6 +30,7 @@ export default class JanInferenceOpenAIExtension extends RemoteOAIEngine { // Register Settings this.registerSettings(SETTINGS) + this.registerModels(MODELS) this.apiKey = await this.getSetting(Settings.apiKey, '') this.inferenceUrl = await this.getSetting( diff --git a/extensions/inference-openai-extension/webpack.config.js b/extensions/inference-openai-extension/webpack.config.js index 3954d031d..f3d0db183 100644 --- a/extensions/inference-openai-extension/webpack.config.js +++ b/extensions/inference-openai-extension/webpack.config.js @@ -2,6 +2,7 @@ const path = require('path') const webpack = require('webpack') const packageJson = require('./package.json') const settingJson = require('./resources/settings.json') +const modelsJson = require('./resources/models.json') module.exports = { experiments: { outputModule: true }, @@ -18,6 +19,7 @@ module.exports = { }, plugins: [ new webpack.DefinePlugin({ + MODELS: JSON.stringify(modelsJson), SETTINGS: JSON.stringify(settingJson), ENGINE: JSON.stringify(packageJson.engine), }), diff --git a/models/config/default-model.json b/extensions/model-extension/resources/default-model.json similarity index 97% rename from models/config/default-model.json rename to extensions/model-extension/resources/default-model.json index 2fa2df2ee..f887a2b7a 100644 --- a/models/config/default-model.json +++ b/extensions/model-extension/resources/default-model.json @@ -1,6 +1,6 @@ { "object": "model", - "version": 1, + "version": "1.0", "format": "gguf", "sources": [ { diff --git a/extensions/model-extension/rollup.config.ts b/extensions/model-extension/rollup.config.ts index 0f5ad04df..256b33add 100644 --- a/extensions/model-extension/rollup.config.ts +++ b/extensions/model-extension/rollup.config.ts @@ -5,6 +5,7 @@ import json from '@rollup/plugin-json' import replace from '@rollup/plugin-replace' const packageJson = require('./package.json') +const defaultModelJson = require('./resources/default-model.json') export default [ { @@ -17,7 +18,8 @@ export default [ }, plugins: [ replace({ - EXTENSION_NAME: JSON.stringify(packageJson.name), + preventAssignment: true, + DEFAULT_MODEL: JSON.stringify(defaultModelJson), MODULE_PATH: JSON.stringify( `${packageJson.name}/${packageJson.module}` ), diff --git a/extensions/model-extension/src/@types/global.d.ts b/extensions/model-extension/src/@types/global.d.ts index 7a9202a62..a72b5188e 100644 --- a/extensions/model-extension/src/@types/global.d.ts +++ b/extensions/model-extension/src/@types/global.d.ts @@ -1,6 +1,6 @@ export {} declare global { - declare const EXTENSION_NAME: string + declare const DEFAULT_MODEL: object declare const MODULE_PATH: string declare const VERSION: string diff --git a/extensions/model-extension/src/index.ts b/extensions/model-extension/src/index.ts index d56e2e824..9749e6a53 100644 --- a/extensions/model-extension/src/index.ts +++ b/extensions/model-extension/src/index.ts @@ -2,7 +2,6 @@ import { fs, downloadFile, abortDownload, - getResourcePath, InferenceEngine, joinPath, ModelExtension, @@ -11,7 +10,6 @@ import { events, DownloadEvent, DownloadRoute, - ModelEvent, DownloadState, OptionType, ImportingModel, @@ -36,8 +34,6 @@ export default class JanModelExtension extends ModelExtension { InferenceEngine.nitro_tensorrt_llm, ] private static readonly _tensorRtEngineFormat = '.engine' - private static readonly _configDirName = 'config' - private static readonly _defaultModelFileName = 'default-model.json' private static readonly _supportedGpuArch = ['ampere', 'ada'] /** @@ -45,7 +41,6 @@ export default class JanModelExtension extends ModelExtension { * @override */ async onLoad() { - this.copyModelsToHomeDir() // Handle Desktop Events this.handleDesktopEvents() } @@ -56,37 +51,6 @@ export default class JanModelExtension extends ModelExtension { */ onUnload(): void {} - private async copyModelsToHomeDir() { - try { - // Check for migration conditions - if ( - localStorage.getItem(`${EXTENSION_NAME}-version`) === VERSION && - (await fs.existsSync(JanModelExtension._homeDir)) - ) { - // ignore if the there is no need to migrate - console.debug('Models already persisted.') - return - } - // copy models folder from resources to home directory - const resourePath = await getResourcePath() - const srcPath = await joinPath([resourePath, 'models']) - - const janDataFolderPath = await getJanDataFolderPath() - const destPath = await joinPath([janDataFolderPath, 'models']) - - await fs.syncFile(srcPath, destPath) - - console.debug('Finished syncing models') - - // Finished migration - localStorage.setItem(`${EXTENSION_NAME}-version`, VERSION) - - events.emit(ModelEvent.OnModelsUpdate, {}) - } catch (err) { - console.error(err) - } - } - /** * Downloads a machine learning model. * @param model - The model to download. @@ -489,20 +453,9 @@ export default class JanModelExtension extends ModelExtension { return model } - private async getDefaultModel(): Promise { - const defaultModelPath = await joinPath([ - JanModelExtension._homeDir, - JanModelExtension._configDirName, - JanModelExtension._defaultModelFileName, - ]) - - if (!(await fs.existsSync(defaultModelPath))) { - return undefined - } - - const model = await this.readModelMetadata(defaultModelPath) - - return typeof model === 'object' ? model : JSON.parse(model) + private async getDefaultModel(): Promise { + const defaultModel = DEFAULT_MODEL as Model + return defaultModel } /** diff --git a/extensions/monitoring-extension/rollup.config.ts b/extensions/monitoring-extension/rollup.config.ts index 1b7a40bad..c5e649af4 100644 --- a/extensions/monitoring-extension/rollup.config.ts +++ b/extensions/monitoring-extension/rollup.config.ts @@ -17,6 +17,7 @@ export default [ }, plugins: [ replace({ + preventAssignment: true, NODE: JSON.stringify(`${packageJson.name}/${packageJson.node}`), }), // Allow json resolution diff --git a/extensions/tensorrt-llm-extension/models.json b/extensions/tensorrt-llm-extension/resources/models.json similarity index 100% rename from extensions/tensorrt-llm-extension/models.json rename to extensions/tensorrt-llm-extension/resources/models.json diff --git a/extensions/tensorrt-llm-extension/rollup.config.ts b/extensions/tensorrt-llm-extension/rollup.config.ts index e602bc720..1fad0e711 100644 --- a/extensions/tensorrt-llm-extension/rollup.config.ts +++ b/extensions/tensorrt-llm-extension/rollup.config.ts @@ -5,6 +5,7 @@ import typescript from 'rollup-plugin-typescript2' import json from '@rollup/plugin-json' import replace from '@rollup/plugin-replace' const packageJson = require('./package.json') +const modelsJson = require('./resources/models.json') export default [ { @@ -15,7 +16,8 @@ export default [ }, plugins: [ replace({ - EXTENSION_NAME: JSON.stringify(packageJson.name), + preventAssignment: true, + MODELS: JSON.stringify(modelsJson), TENSORRT_VERSION: JSON.stringify(packageJson.tensorrtVersion), PROVIDER: JSON.stringify(packageJson.provider), DOWNLOAD_RUNNER_URL: @@ -53,7 +55,7 @@ export default [ }, plugins: [ replace({ - EXTENSION_NAME: JSON.stringify(packageJson.name), + preventAssignment: true, TENSORRT_VERSION: JSON.stringify(packageJson.tensorrtVersion), PROVIDER: JSON.stringify(packageJson.provider), LOAD_MODEL_URL: JSON.stringify( diff --git a/extensions/tensorrt-llm-extension/src/@types/global.d.ts b/extensions/tensorrt-llm-extension/src/@types/global.d.ts index 9cf5b6090..b550080f7 100644 --- a/extensions/tensorrt-llm-extension/src/@types/global.d.ts +++ b/extensions/tensorrt-llm-extension/src/@types/global.d.ts @@ -7,5 +7,5 @@ declare const ENGINE_PORT: string declare const DOWNLOAD_RUNNER_URL: string declare const TENSORRT_VERSION: string declare const COMPATIBILITY: object -declare const EXTENSION_NAME: string declare const PROVIDER: string +declare const MODELS: Array diff --git a/extensions/tensorrt-llm-extension/src/index.ts b/extensions/tensorrt-llm-extension/src/index.ts index d099edfe9..a02f30dc2 100644 --- a/extensions/tensorrt-llm-extension/src/index.ts +++ b/extensions/tensorrt-llm-extension/src/index.ts @@ -23,7 +23,6 @@ import { ModelEvent, getJanDataFolderPath, } from '@janhq/core' -import models from '../models.json' /** * TensorRTLLMExtension - Implementation of LocalOAIEngine @@ -46,14 +45,14 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { override compatibility() { return COMPATIBILITY as unknown as Compatibility } - /** - * models implemented by the extension - * define pre-populated models - */ - override async models(): Promise { - if ((await this.installationState()) === 'Installed') - return models as unknown as Model[] - return [] + + override async onLoad(): Promise { + super.onLoad() + + if ((await this.installationState()) === 'Installed') { + const models = MODELS as unknown as Model[] + this.registerModels(models) + } } override async install(): Promise { @@ -116,7 +115,7 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { const downloadRequest: DownloadRequest = { url, localPath: tarballFullPath, - extensionId: EXTENSION_NAME, + extensionId: this.name, downloadType: 'extension', } downloadFile(downloadRequest) @@ -134,7 +133,8 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { events.emit(DownloadEvent.onFileUnzipSuccess, state) // Prepopulate models as soon as it's ready - this.prePopulateModels().then(() => { + const models = MODELS as unknown as Model[] + this.registerModels(models).then(() => { showToast( 'Extension installed successfully.', 'New models are added to Model Hub.' @@ -144,7 +144,8 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { events.on(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) } - async removePopulatedModels(): Promise { + private async removePopulatedModels(): Promise { + const models = MODELS as unknown as Model[] console.debug(`removePopulatedModels`, JSON.stringify(models)) const janDataFolderPath = await getJanDataFolderPath() const modelFolderPath = await joinPath([janDataFolderPath, 'models']) diff --git a/models/gpt-3.5-turbo-16k-0613/model.json b/models/gpt-3.5-turbo-16k-0613/model.json deleted file mode 100644 index ba4aed14d..000000000 --- a/models/gpt-3.5-turbo-16k-0613/model.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "sources": [ - { - "url": "https://openai.com" - } - ], - "id": "gpt-3.5-turbo-16k-0613", - "object": "model", - "name": "OpenAI GPT 3.5 Turbo 16k 0613", - "version": "1.0", - "description": "OpenAI GPT 3.5 Turbo 16k 0613 model is extremely good", - "format": "api", - "settings": {}, - "parameters": { - "max_tokens": 4096, - "temperature": 0.7 - }, - "metadata": { - "author": "OpenAI", - "tags": ["General", "Big Context Length"] - }, - "engine": "openai" -} diff --git a/models/gpt-3.5-turbo/model.json b/models/gpt-3.5-turbo/model.json deleted file mode 100644 index 0359f1950..000000000 --- a/models/gpt-3.5-turbo/model.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "sources": [ - { - "url": "https://openai.com" - } - ], - "id": "gpt-3.5-turbo", - "object": "model", - "name": "OpenAI GPT 3.5 Turbo", - "version": "1.0", - "description": "OpenAI GPT 3.5 Turbo model is extremely good", - "format": "api", - "settings": {}, - "parameters": { - "max_tokens": 4096, - "temperature": 0.7 - }, - "metadata": { - "author": "OpenAI", - "tags": ["General", "Big Context Length"] - }, - "engine": "openai" -} diff --git a/models/gpt-4-vision-preview/model.json b/models/gpt-4-vision-preview/model.json deleted file mode 100644 index a5febf207..000000000 --- a/models/gpt-4-vision-preview/model.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "sources": [ - { - "url": "https://openai.com" - } - ], - "id": "gpt-4-vision-preview", - "object": "model", - "name": "OpenAI GPT 4 with Vision (Preview)", - "version": "1.0", - "description": "OpenAI GPT 4 with Vision model is extremely good in preview", - "format": "api", - "settings": { - "vision_model": true, - "textModel": false - }, - "parameters": { - "max_tokens": 4096, - "temperature": 0.7 - }, - "metadata": { - "author": "OpenAI", - "tags": ["General", "Big Context Length", "Vision"] - }, - "engine": "openai" -} diff --git a/models/gpt-4/model.json b/models/gpt-4/model.json deleted file mode 100644 index 1d99374ef..000000000 --- a/models/gpt-4/model.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "sources": [ - { - "url": "https://openai.com" - } - ], - "id": "gpt-4", - "object": "model", - "name": "OpenAI GPT 4", - "version": "1.0", - "description": "OpenAI GPT 4 model is extremely good", - "format": "api", - "settings": {}, - "parameters": { - "max_tokens": 4096, - "temperature": 0.7 - }, - "metadata": { - "author": "OpenAI", - "tags": ["General", "Big Context Length"] - }, - "engine": "openai" -} diff --git a/models/groq-llama2-70b/model.json b/models/groq-llama2-70b/model.json deleted file mode 100644 index 3f62aa4da..000000000 --- a/models/groq-llama2-70b/model.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "sources": [ - { - "url": "https://groq.com" - } - ], - "id": "llama2-70b-4096", - "object": "model", - "name": "Groq Llama 2 70b", - "version": "1.0", - "description": "Groq Llama 2 70b with supercharged speed!", - "format": "api", - "settings": { - "text_model": false - }, - "parameters": { - "max_tokens": 4096, - "temperature": 0.7, - "top_p": 1, - "stop": null, - "stream": true - }, - "metadata": { - "author": "Meta", - "tags": ["General", "Big Context Length"] - }, - "engine": "groq" -} diff --git a/models/groq-mixtral-8x7b-instruct/model.json b/models/groq-mixtral-8x7b-instruct/model.json deleted file mode 100644 index bd43fde07..000000000 --- a/models/groq-mixtral-8x7b-instruct/model.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "sources": [ - { - "url": "https://groq.com" - } - ], - "id": "mixtral-8x7b-32768", - "object": "model", - "name": "Groq Mixtral 8x7b Instruct", - "version": "1.0", - "description": "Groq Mixtral 8x7b Instruct is Mixtral with supercharged speed!", - "format": "api", - "settings": { - "text_model": false - }, - "parameters": { - "max_tokens": 4096, - "temperature": 0.7, - "top_p": 1, - "stop": null, - "stream": true - }, - "metadata": { - "author": "Mistral", - "tags": ["General", "Big Context Length"] - }, - "engine": "groq" -} diff --git a/models/mistral-ins-7b-q4/cover.png b/models/mistral-ins-7b-q4/cover.png deleted file mode 100644 index 73b82e5996fa709762b5dc85d5ed83a3b29900ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234495 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