diff --git a/.github/workflows/jan-docs.yml b/.github/workflows/jan-docs.yml index 8ce4e91ed..8135935bd 100644 --- a/.github/workflows/jan-docs.yml +++ b/.github/workflows/jan-docs.yml @@ -5,6 +5,7 @@ on: branches: - main - dev + - docs paths: - 'docs/**' - '.github/workflows/jan-docs.yml' @@ -12,6 +13,7 @@ on: branches: - main - dev + - docs paths: - 'docs/**' - '.github/workflows/jan-docs.yml' @@ -91,13 +93,13 @@ jobs: Preview URL: ${{ steps.deployCloudflarePages.outputs.url }} - name: Add Custome Domain file - if: github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.pull_request.head.repo.full_name != github.repository + if: github.event_name == 'push' && github.ref == 'refs/heads/docs' && github.event.pull_request.head.repo.full_name != github.repository run: echo "${{ vars.DOCUSAURUS_DOMAIN }}" > ./docs/build/CNAME # Popular action to deploy to GitHub Pages: # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus - name: Deploy to GitHub Pages - if: github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.pull_request.head.repo.full_name != github.repository + if: github.event_name == 'push' && github.ref == 'refs/heads/docs' && github.event.pull_request.head.repo.full_name != github.repository uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/jan-electron-build-nightly.yml b/.github/workflows/jan-electron-build-nightly.yml index 15390b752..f961ccd6f 100644 --- a/.github/workflows/jan-electron-build-nightly.yml +++ b/.github/workflows/jan-electron-build-nightly.yml @@ -16,7 +16,6 @@ on: jobs: set-public-provider: runs-on: ubuntu-latest - if: github.event_name == 'workflow_dispatch' outputs: public_provider: ${{ steps.set-public-provider.outputs.public_provider }} ref: ${{ steps.set-public-provider.outputs.ref }} diff --git a/README.md b/README.md index dc933eb9a..2722a2870 100644 --- a/README.md +++ b/README.md @@ -76,31 +76,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute Experimental (Nightly Build) - + jan.exe - + Intel - + M1/M2 - + jan.deb - + jan.AppImage diff --git a/core/.prettierignore b/core/.prettierignore new file mode 100644 index 000000000..02d9145c1 --- /dev/null +++ b/core/.prettierignore @@ -0,0 +1,5 @@ +.next/ +node_modules/ +dist/ +*.hbs +*.mdx \ No newline at end of file diff --git a/core/src/node/api/common/builder.ts b/core/src/node/api/common/builder.ts index 14946f415..a9819bce6 100644 --- a/core/src/node/api/common/builder.ts +++ b/core/src/node/api/common/builder.ts @@ -265,19 +265,22 @@ export const downloadModel = async ( const modelBinaryPath = join(directoryPath, modelId) const request = require('request') - const rq = request({ url: model.source_url, strictSSL, proxy }) const progress = require('request-progress') - progress(rq, {}) - .on('progress', function (state: any) { - console.log('progress', JSON.stringify(state, null, 2)) - }) - .on('error', function (err: Error) { - console.error('error', err) - }) - .on('end', function () { - console.log('end') - }) - .pipe(fs.createWriteStream(modelBinaryPath)) + + for (const source of model.sources) { + const rq = request({ url: source, strictSSL, proxy }) + progress(rq, {}) + .on('progress', function (state: any) { + console.debug('progress', JSON.stringify(state, null, 2)) + }) + .on('error', function (err: Error) { + console.error('error', err) + }) + .on('end', function () { + console.debug('end') + }) + .pipe(fs.createWriteStream(modelBinaryPath)) + } return { message: `Starting download ${modelId}`, diff --git a/core/src/types/model/modelEntity.ts b/core/src/types/model/modelEntity.ts index 80adc9e96..c60ab7650 100644 --- a/core/src/types/model/modelEntity.ts +++ b/core/src/types/model/modelEntity.ts @@ -21,6 +21,11 @@ export enum InferenceEngine { hf_endpoint = 'hf_endpoint', } +export type ModelArtifact = { + filename: string + url: string +} + /** * Model type defines the shape of a model object. * @stored @@ -45,7 +50,7 @@ export type Model = { /** * The model download source. It can be an external url or a local filepath. */ - source_url: string + sources: ModelArtifact[] /** * The model identifier, which can be referenced in the API endpoints. @@ -107,6 +112,8 @@ export type ModelSettingParams = { system_prompt?: string ai_prompt?: string user_prompt?: string + llama_model_path?: string + mmproj?: string } /** diff --git a/docs/docs/docs/03-engineering/models.md b/docs/docs/docs/03-engineering/models.md index cb0b44f41..4e4c3c604 100644 --- a/docs/docs/docs/03-engineering/models.md +++ b/docs/docs/docs/03-engineering/models.md @@ -56,7 +56,6 @@ jan/ # Jan root folder - Each `model` folder contains a `model.json` file, which is a representation of a model. - `model.json` contains metadata and default parameters used to run a model. -- The only required field is `source_url`. ### Example @@ -64,36 +63,43 @@ Here's a standard example `model.json` for a GGUF model. ```js { -"id": "zephyr-7b", // Defaults to foldername -"object": "model", // Defaults to "model" -"source_url": "https://huggingface.co/TheBloke/zephyr-7B-beta-GGUF/blob/main/zephyr-7b-beta.Q4_K_M.gguf", -"name": "Zephyr 7B", // Defaults to foldername -"owned_by": "you", // Defaults to "you" -"version": "1", // Defaults to 1 -"created": 1231231, // Defaults to file creation time -"description": null, // Defaults to null -"state": enum[null, "ready"] -"format": "ggufv3", // Defaults to "ggufv3" -"engine": "nitro", // engine_id specified in jan/engine folder -"engine_parameters": { // Engine parameters inside model.json can override - "ctx_len": 2048, // the value inside the base engine.json + "id": "zephyr-7b", // Defaults to foldername + "object": "model", // Defaults to "model" + "sources": [ + { + "filename": "zephyr-7b-beta.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/zephyr-7B-beta-GGUF/blob/main/zephyr-7b-beta.Q4_K_M.gguf" + } + ], + "name": "Zephyr 7B", // Defaults to foldername + "owned_by": "you", // Defaults to "you" + "version": "1", // Defaults to 1 + "created": 1231231, // Defaults to file creation time + "description": null, // Defaults to null + "format": "ggufv3", // Defaults to "ggufv3" + "engine": "nitro", // engine_id specified in jan/engine folder + "engine_parameters": { + // Engine parameters inside model.json can override + "ctx_len": 4096, // the value inside the base engine.json "ngl": 100, "embedding": true, - "n_parallel": 4, -}, -"model_parameters": { // Models are called parameters + "n_parallel": 4 + }, + "model_parameters": { + // Models are called parameters "stream": true, - "max_tokens": 2048, - "stop": [""], // This usually can be left blank, only used with specific need from model author + "max_tokens": 4096, + "stop": [""], // This usually can be left blank, only used with specific need from model author "frequency_penalty": 0, "presence_penalty": 0, "temperature": 0.7, "top_p": 0.95 -}, -"metadata": {}, // Defaults to {} -"assets": [ // Defaults to current dir - "file://.../zephyr-7b-q4_k_m.bin", -] + }, + "metadata": {}, // Defaults to {} + "assets": [ + // Defaults to current dir + "file://.../zephyr-7b-q4_k_m.bin" + ] } ``` diff --git a/docs/docs/guides/04-using-models/02-import-manually.mdx b/docs/docs/guides/04-using-models/02-import-manually.mdx index f5ecb5259..68142a8af 100644 --- a/docs/docs/guides/04-using-models/02-import-manually.mdx +++ b/docs/docs/guides/04-using-models/02-import-manually.mdx @@ -31,7 +31,6 @@ In this section, we will show you how to import a GGUF model from [HuggingFace]( ## Manually Importing a Downloaded Model (nightly versions and v0.4.4+) - ### 1. Create a Model Folder Navigate to the `~/jan/models` folder. You can find this folder by going to `App Settings` > `Advanced` > `Open App Directory`. @@ -92,7 +91,7 @@ Drag and drop your model binary into this folder, ensuring the `modelname.gguf` #### 3. Voila -If your model doesn't show up in the Model Selector in conversations, please restart the app. +If your model doesn't show up in the Model Selector in conversations, please restart the app. If that doesn't work, please feel free to join our [Discord community](https://discord.gg/Dt7MxDyNNZ) for support, updates, and discussions. @@ -190,14 +189,18 @@ Edit `model.json` and include the following configurations: - Ensure the filename must be `model.json`. - Ensure the `id` property matches the folder name you created. - Ensure the GGUF filename should match the `id` property exactly. -- Ensure the `source_url` property is the direct binary download link ending in `.gguf`. In HuggingFace, you can find the direct links in the `Files and versions` tab. +- Ensure the `source.url` property is the direct binary download link ending in `.gguf`. In HuggingFace, you can find the direct links in the `Files and versions` tab. - Ensure you are using the correct `prompt_template`. This is usually provided in the HuggingFace model's description page. -- Ensure the `state` property is set to `ready`. ```json title="model.json" { // highlight-start - "source_url": "https://huggingface.co/janhq/trinity-v1-GGUF/resolve/main/trinity-v1.Q4_K_M.gguf", + "sources": [ + { + "filename": "trinity-v1.Q4_K_M.gguf", + "url": "https://huggingface.co/janhq/trinity-v1-GGUF/resolve/main/trinity-v1.Q4_K_M.gguf" + } + ], "id": "trinity-v1-7b", // highlight-end "object": "model", @@ -208,7 +211,8 @@ Edit `model.json` and include the following configurations: "settings": { "ctx_len": 4096, // highlight-next-line - "prompt_template": "{system_message}\n### Instruction:\n{prompt}\n### Response:" + "prompt_template": "{system_message}\n### Instruction:\n{prompt}\n### Response:", + "llama_model_path": "trinity-v1.Q4_K_M.gguf" }, "parameters": { "max_tokens": 4096 @@ -218,9 +222,7 @@ Edit `model.json` and include the following configurations: "tags": ["7B", "Merged"], "size": 4370000000 }, - "engine": "nitro", - // highlight-next-line - "state": "ready" + "engine": "nitro" } ``` diff --git a/docs/docs/guides/04-using-models/03-integrate-with-remote-server.mdx b/docs/docs/guides/04-using-models/03-integrate-with-remote-server.mdx index 3ed15bc9f..533797fca 100644 --- a/docs/docs/guides/04-using-models/03-integrate-with-remote-server.mdx +++ b/docs/docs/guides/04-using-models/03-integrate-with-remote-server.mdx @@ -40,7 +40,12 @@ Navigate to the `~/jan/models` folder. Create a folder named `gpt-3.5-turbo-16k` ```json title="~/jan/models/gpt-3.5-turbo-16k/model.json" { - "source_url": "https://openai.com", + "sources": [ + { + "filename": "openai", + "url": "https://openai.com" + } + ], // highlight-next-line "id": "gpt-3.5-turbo-16k", "object": "model", @@ -55,8 +60,7 @@ Navigate to the `~/jan/models` folder. Create a folder named `gpt-3.5-turbo-16k` "author": "OpenAI", "tags": ["General", "Big Context Length"] }, - "engine": "openai", - "state": "ready" + "engine": "openai" // highlight-end } ``` @@ -118,7 +122,12 @@ Navigate to the `~/jan/models` folder. Create a folder named `mistral-ins-7b-q4` ```json title="~/jan/models/mistral-ins-7b-q4/model.json" { - "source_url": "https://jan.ai", + "sources": [ + { + "filename": "janai", + "url": "https://jan.ai" + } + ], // highlight-next-line "id": "mistral-ins-7b-q4", "object": "model", @@ -134,8 +143,7 @@ Navigate to the `~/jan/models` folder. Create a folder named `mistral-ins-7b-q4` "tags": ["remote", "awesome"] }, // highlight-start - "engine": "openai", - "state": "ready" + "engine": "openai" // highlight-end } ``` diff --git a/docs/docs/guides/07-integrations/02-integrate-openrouter.mdx b/docs/docs/guides/07-integrations/02-integrate-openrouter.mdx index 8623a1a4a..e0db0e336 100644 --- a/docs/docs/guides/07-integrations/02-integrate-openrouter.mdx +++ b/docs/docs/guides/07-integrations/02-integrate-openrouter.mdx @@ -49,7 +49,12 @@ Navigate to the `~/jan/models` folder. Create a folder named ` 1) { + // path to model binaries + for (const source of model.sources) { + let path = this.extractFileName(source.url) + if (source.filename) { + path = await joinPath([modelDirPath, source.filename]) + } + + downloadFile(source.url, path, network) + } + } else { + const fileName = this.extractFileName(model.sources[0]?.url) + const path = await joinPath([modelDirPath, fileName]) + downloadFile(model.sources[0]?.url, path, network) + } + } + + /** + * try to retrieve the download file name from the source url + */ + private extractFileName(url: string): string { + const extractedFileName = url.split('/').pop() const fileName = extractedFileName .toLowerCase() .endsWith(JanModelExtension._supportedModelFormat) ? extractedFileName - : model.id - const path = await joinPath([modelDirPath, fileName]) - downloadFile(model.source_url, path, network) + : extractedFileName + JanModelExtension._supportedModelFormat + return fileName } /** @@ -98,6 +116,7 @@ export default class JanModelExtension extends ModelExtension { * @returns {Promise} A promise that resolves when the download has been cancelled. */ async cancelModelDownload(modelId: string): Promise { + const model = await this.getConfiguredModels() return abortDownload( await joinPath([JanModelExtension._homeDir, modelId, modelId]) ).then(async () => { @@ -163,15 +182,16 @@ export default class JanModelExtension extends ModelExtension { .then((files: string[]) => { // or model binary exists in the directory // model binary name can match model ID or be a .gguf file and not be an incompleted model file + // TODO: Check diff between urls, filenames return ( files.includes(modelDir) || - files.some( + files.filter( (file) => file .toLowerCase() .includes(JanModelExtension._supportedModelFormat) && !file.endsWith(JanModelExtension._incompletedModelFileName) - ) + )?.length >= model.sources.length ) }) } @@ -198,7 +218,6 @@ export default class JanModelExtension extends ModelExtension { const readJsonPromises = allDirectories.map(async (dirName) => { // filter out directories that don't match the selector - // read model.json const jsonPath = await joinPath([ JanModelExtension._homeDir, @@ -226,7 +245,21 @@ export default class JanModelExtension extends ModelExtension { const modelData = results.map((result) => { if (result.status === 'fulfilled') { try { - return result.value as Model + // This to ensure backward compatibility with `model.json` with `source_url` + const tmpModel = + typeof result.value === 'object' + ? result.value + : JSON.parse(result.value) + if (tmpModel['source_url'] != null) { + tmpModel['source'] = [ + { + filename: tmpModel.id, + url: tmpModel['source_url'], + }, + ] + } + + return tmpModel as Model } catch { console.debug(`Unable to parse model metadata: ${result.value}`) return undefined diff --git a/models/bakllava-1/model.json b/models/bakllava-1/model.json new file mode 100644 index 000000000..91f6f4136 --- /dev/null +++ b/models/bakllava-1/model.json @@ -0,0 +1,33 @@ +{ + "sources": [ + { + "filename": "ggml-model-q5_k.gguf", + "url": "https://huggingface.co/mys/ggml_bakllava-1/resolve/main/ggml-model-q5_k.gguf" + }, + { + "filename": "mmproj-model-f16.gguf", + "url": "https://huggingface.co/mys/ggml_bakllava-1/resolve/main/mmproj-model-f16.gguf" + } + ], + "id": "bakllava-1", + "object": "model", + "name": "BakLlava 1", + "version": "1.0", + "description": "BakLlava 1 can bring vision understanding to Jan", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", + "llama_model_path": "ggml-model-q5_k.gguf", + "mmproj": "mmproj-model-f16.gguf" + }, + "parameters": { + "max_tokens": 4096 + }, + "metadata": { + "author": "Mys", + "tags": ["Vision"], + "size": 5750000000 + }, + "engine": "nitro" +} diff --git a/models/capybara-34b/model.json b/models/capybara-34b/model.json index ffca28c6d..af029bbb0 100644 --- a/models/capybara-34b/model.json +++ b/models/capybara-34b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/Nous-Capybara-34B-GGUF/resolve/main/nous-capybara-34b.Q5_K_M.gguf", - "id": "capybara-34b", - "object": "model", - "name": "Capybara 200k 34B Q5", - "version": "1.0", - "description": "Nous Capybara 34B is a long context length model that supports 200K tokens.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "USER:\n{prompt}\nASSISTANT:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "NousResearch, The Bloke", - "tags": ["34B", "Finetuned"], - "size": 24320000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "nous-capybara-34b.Q5_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Nous-Capybara-34B-GGUF/resolve/main/nous-capybara-34b.Q5_K_M.gguf" + } + ], + "id": "capybara-34b", + "object": "model", + "name": "Capybara 200k 34B Q5", + "version": "1.0", + "description": "Nous Capybara 34B is a long context length model that supports 200K tokens.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "USER:\n{prompt}\nASSISTANT:", + "llama_model_path": "nous-capybara-34b.Q5_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "NousResearch, The Bloke", + "tags": ["34B", "Finetuned"], + "size": 24320000000 + }, + "engine": "nitro" +} diff --git a/models/codeninja-1.0-7b/model.json b/models/codeninja-1.0-7b/model.json index 98fbac5df..4ffe355d1 100644 --- a/models/codeninja-1.0-7b/model.json +++ b/models/codeninja-1.0-7b/model.json @@ -1,29 +1,33 @@ { - "source_url": "https://huggingface.co/beowolx/CodeNinja-1.0-OpenChat-7B-GGUF/resolve/main/codeninja-1.0-openchat-7b.Q4_K_M.gguf", - "id": "codeninja-1.0-7b", - "object": "model", - "name": "CodeNinja 7B Q4", - "version": "1.0", - "description": "CodeNinja is good for coding tasks and can handle various languages including Python, C, C++, Rust, Java, JavaScript, and more.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "GPT4 Correct User: {prompt}<|end_of_turn|>GPT4 Correct Assistant:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": ["<|end_of_turn|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Beowolx", - "tags": ["7B", "Finetuned"], - "size": 4370000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "codeninja-1.0-openchat-7b.Q4_K_M.gguf", + "url": "https://huggingface.co/beowolx/CodeNinja-1.0-OpenChat-7B-GGUF/resolve/main/codeninja-1.0-openchat-7b.Q4_K_M.gguf" + } + ], + "id": "codeninja-1.0-7b", + "object": "model", + "name": "CodeNinja 7B Q4", + "version": "1.0", + "description": "CodeNinja is good for coding tasks and can handle various languages including Python, C, C++, Rust, Java, JavaScript, and more.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "GPT4 Correct User: {prompt}<|end_of_turn|>GPT4 Correct Assistant:", + "llama_model_path": "codeninja-1.0-openchat-7b.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Beowolx", + "tags": ["7B", "Finetuned"], + "size": 4370000000 + }, + "engine": "nitro" +} diff --git a/models/config/default-model.json b/models/config/default-model.json index 2263625f4..2fa2df2ee 100644 --- a/models/config/default-model.json +++ b/models/config/default-model.json @@ -2,7 +2,12 @@ "object": "model", "version": 1, "format": "gguf", - "source_url": "N/A", + "sources": [ + { + "url": "N/A", + "filename": "N/A" + } + ], "id": "N/A", "name": "N/A", "created": 0, @@ -10,7 +15,8 @@ "settings": { "ctx_len": 4096, "embedding": false, - "prompt_template": "{system_message}\n### Instruction: {prompt}\n### Response:" + "prompt_template": "{system_message}\n### Instruction: {prompt}\n### Response:", + "llama_model_path": "N/A" }, "parameters": { "temperature": 0.7, diff --git a/models/deepseek-coder-1.3b/model.json b/models/deepseek-coder-1.3b/model.json index 8c454802f..365dbfd2f 100644 --- a/models/deepseek-coder-1.3b/model.json +++ b/models/deepseek-coder-1.3b/model.json @@ -1,29 +1,34 @@ - { - "source_url": "https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-GGUF/resolve/main/deepseek-coder-1.3b-instruct.Q8_0.gguf", - "id": "deepseek-coder-1.3b", - "object": "model", - "name": "Deepseek Coder 1.3B Q8", - "version": "1.0", - "description": "Deepseek Coder excelled in project-level code completion with advanced capabilities across multiple programming languages.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "### Instruction:\n{prompt}\n### Response:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Deepseek, The Bloke", - "tags": ["Tiny", "Foundational Model"], - "size": 1430000000 - }, - "engine": "nitro" - } + "sources": [ + { + "filename": "deepseek-coder-1.3b-instruct.Q8_0.gguf", + "url": "https://huggingface.co/TheBloke/deepseek-coder-1.3b-instruct-GGUF/resolve/main/deepseek-coder-1.3b-instruct.Q8_0.gguf" + } + ], + "id": "deepseek-coder-1.3b", + "object": "model", + "name": "Deepseek Coder 1.3B Q8", + "version": "1.0", + "description": "Deepseek Coder excelled in project-level code completion with advanced capabilities across multiple programming languages.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "### Instruction:\n{prompt}\n### Response:", + "llama_model_path": "deepseek-coder-1.3b-instruct.Q8_0.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Deepseek, The Bloke", + "tags": ["Tiny", "Foundational Model"], + "size": 1430000000 + }, + "engine": "nitro" +} diff --git a/models/deepseek-coder-34b/model.json b/models/deepseek-coder-34b/model.json index 905a66033..8e17b9563 100644 --- a/models/deepseek-coder-34b/model.json +++ b/models/deepseek-coder-34b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GGUF/resolve/main/deepseek-coder-33b-instruct.Q5_K_M.gguf", - "id": "deepseek-coder-34b", - "object": "model", - "name": "Deepseek Coder 33B Q5", - "version": "1.0", - "description": "Deepseek Coder excelled in project-level code completion with advanced capabilities across multiple programming languages.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "### Instruction:\n{prompt}\n### Response:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Deepseek, The Bloke", - "tags": ["34B", "Foundational Model"], - "size": 19940000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "deepseek-coder-33b-instruct.Q5_K_M.gguf", + "url": "https://huggingface.co/TheBloke/deepseek-coder-33B-instruct-GGUF/resolve/main/deepseek-coder-33b-instruct.Q5_K_M.gguf" + } + ], + "id": "deepseek-coder-34b", + "object": "model", + "name": "Deepseek Coder 33B Q5", + "version": "1.0", + "description": "Deepseek Coder excelled in project-level code completion with advanced capabilities across multiple programming languages.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "### Instruction:\n{prompt}\n### Response:", + "llama_model_path": "deepseek-coder-33b-instruct.Q5_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Deepseek, The Bloke", + "tags": ["34B", "Foundational Model"], + "size": 19940000000 + }, + "engine": "nitro" +} diff --git a/models/dolphin-2.7-mixtral-8x7b/model.json b/models/dolphin-2.7-mixtral-8x7b/model.json index 67bc6737c..7df4fbfbd 100644 --- a/models/dolphin-2.7-mixtral-8x7b/model.json +++ b/models/dolphin-2.7-mixtral-8x7b/model.json @@ -1,28 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/dolphin-2.7-mixtral-8x7b-GGUF/resolve/main/dolphin-2.7-mixtral-8x7b.Q4_K_M.gguf", - "id": "dolphin-2.7-mixtral-8x7b", - "object": "model", - "name": "Dolphin 8x7B Q4", - "version": "1.0", - "description": "Dolphin is an uncensored model built on Mixtral-8x7b. It is good at programming tasks.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Cognitive Computations, TheBloke", - "tags": ["70B", "Finetuned"], - "size": 26440000000 - }, - "engine": "nitro" - } + "sources": [ + { + "filename": "dolphin-2.7-mixtral-8x7b.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/dolphin-2.7-mixtral-8x7b-GGUF/resolve/main/dolphin-2.7-mixtral-8x7b.Q4_K_M.gguf" + } + ], + "id": "dolphin-2.7-mixtral-8x7b", + "object": "model", + "name": "Dolphin 8x7B Q4", + "version": "1.0", + "description": "Dolphin is an uncensored model built on Mixtral-8x7b. It is good at programming tasks.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", + "llama_model_path": "dolphin-2.7-mixtral-8x7b.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Cognitive Computations, TheBloke", + "tags": ["70B", "Finetuned"], + "size": 26440000000 + }, + "engine": "nitro" +} diff --git a/models/gpt-3.5-turbo-16k-0613/model.json b/models/gpt-3.5-turbo-16k-0613/model.json index 0df4119a5..aa57e1154 100644 --- a/models/gpt-3.5-turbo-16k-0613/model.json +++ b/models/gpt-3.5-turbo-16k-0613/model.json @@ -1,18 +1,20 @@ { - "source_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": {}, - "metadata": { - "author": "OpenAI", - "tags": ["General", "Big Context Length"] - }, - "engine": "openai", - "state": "ready" + "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": {}, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length"] + }, + "engine": "openai" } - \ No newline at end of file diff --git a/models/gpt-3.5-turbo/model.json b/models/gpt-3.5-turbo/model.json index a7dbf3d4e..617f0d056 100644 --- a/models/gpt-3.5-turbo/model.json +++ b/models/gpt-3.5-turbo/model.json @@ -1,18 +1,20 @@ { - "source_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": {}, - "metadata": { - "author": "OpenAI", - "tags": ["General", "Big Context Length"] - }, - "engine": "openai", - "state": "ready" + "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": {}, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length"] + }, + "engine": "openai" } - \ No newline at end of file diff --git a/models/gpt-4/model.json b/models/gpt-4/model.json index 3f17e65cb..7aa2338e3 100644 --- a/models/gpt-4/model.json +++ b/models/gpt-4/model.json @@ -1,18 +1,20 @@ { - "source_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": {}, - "metadata": { - "author": "OpenAI", - "tags": ["General", "Big Context Length"] - }, - "engine": "openai", - "state": "ready" + "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": {}, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length"] + }, + "engine": "openai" } - \ No newline at end of file diff --git a/models/llama2-chat-70b-q4/model.json b/models/llama2-chat-70b-q4/model.json index 2595ab677..2459e426f 100644 --- a/models/llama2-chat-70b-q4/model.json +++ b/models/llama2-chat-70b-q4/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGUF/resolve/main/llama-2-70b-chat.Q4_K_M.gguf", - "id": "llama2-chat-70b-q4", - "object": "model", - "name": "Llama 2 Chat 70B Q4", - "version": "1.0", - "description": "Llama 2 Chat 7b model, specifically designed for a comprehensive understanding through training on extensive internet data.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "[INST] <>\n{system_message}<>\n{prompt}[/INST]" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI, The Bloke", - "tags": ["70B", "Foundational Model"], - "size": 43920000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "llama-2-70b-chat.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Llama-2-70B-Chat-GGUF/resolve/main/llama-2-70b-chat.Q4_K_M.gguf" + } + ], + "id": "llama2-chat-70b-q4", + "object": "model", + "name": "Llama 2 Chat 70B Q4", + "version": "1.0", + "description": "Llama 2 Chat 7b model, specifically designed for a comprehensive understanding through training on extensive internet data.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "[INST] <>\n{system_message}<>\n{prompt}[/INST]", + "llama_model_path": "llama-2-70b-chat.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "MetaAI, The Bloke", + "tags": ["70B", "Foundational Model"], + "size": 43920000000 + }, + "engine": "nitro" +} diff --git a/models/llama2-chat-7b-q4/model.json b/models/llama2-chat-7b-q4/model.json index 68eab3790..bc9847eef 100644 --- a/models/llama2-chat-7b-q4/model.json +++ b/models/llama2-chat-7b-q4/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_K_M.gguf", - "id": "llama2-chat-7b-q4", - "object": "model", - "name": "Llama 2 Chat 7B Q4", - "version": "1.0", - "description": "Llama 2 Chat 7b model, specifically designed for a comprehensive understanding through training on extensive internet data.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "[INST] <>\n{system_message}<>\n{prompt}[/INST]" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MetaAI, The Bloke", - "tags": ["7B", "Foundational Model"], - "size": 4080000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "llama-2-7b-chat.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_K_M.gguf" + } + ], + "id": "llama2-chat-7b-q4", + "object": "model", + "name": "Llama 2 Chat 7B Q4", + "version": "1.0", + "description": "Llama 2 Chat 7b model, specifically designed for a comprehensive understanding through training on extensive internet data.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "[INST] <>\n{system_message}<>\n{prompt}[/INST]", + "llama_model_path": "llama-2-7b-chat.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "MetaAI, The Bloke", + "tags": ["7B", "Foundational Model"], + "size": 4080000000 + }, + "engine": "nitro" +} diff --git a/models/llava-1.5-13b-q5/model.json b/models/llava-1.5-13b-q5/model.json new file mode 100644 index 000000000..027b8398f --- /dev/null +++ b/models/llava-1.5-13b-q5/model.json @@ -0,0 +1,33 @@ +{ + "sources": [ + { + "filename": "ggml-model-q5_k.gguf", + "url": "https://huggingface.co/mys/ggml_llava-v1.5-13b/resolve/main/ggml-model-q5_k.gguf" + }, + { + "filename": "mmproj-model-f16.gguf", + "url": "https://huggingface.co/mys/ggml_llava-v1.5-13b/resolve/main/mmproj-model-f16.gguf" + } + ], + "id": "llava-1.5-13b-q5", + "object": "model", + "name": "LlaVa 1.5 13B Q5 K", + "version": "1.0", + "description": "LlaVa 1.5 can bring vision understanding to Jan", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", + "llama_model_path": "ggml-model-q5_k.gguf", + "mmproj": "mmproj-model-f16.gguf" + }, + "parameters": { + "max_tokens": 4096 + }, + "metadata": { + "author": "Mys", + "tags": ["Vision"], + "size": 9850000000 + }, + "engine": "nitro" +} diff --git a/models/llava-1.5-7b-q5/model.json b/models/llava-1.5-7b-q5/model.json new file mode 100644 index 000000000..658b98880 --- /dev/null +++ b/models/llava-1.5-7b-q5/model.json @@ -0,0 +1,33 @@ +{ + "sources": [ + { + "filename": "ggml-model-q5_k.gguf", + "url": "https://huggingface.co/mys/ggml_llava-v1.5-7b/resolve/main/ggml-model-q5_k.gguf" + }, + { + "filename": "mmproj-model-f16.gguf", + "url": "https://huggingface.co/mys/ggml_llava-v1.5-7b/resolve/main/mmproj-model-f16.gguf" + } + ], + "id": "llava-1.5-7b-q5", + "object": "model", + "name": "LlaVa 1.5 7B Q5 K", + "version": "1.0", + "description": "LlaVa 1.5 can bring vision understanding to Jan", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", + "llama_model_path": "ggml-model-q5_k.gguf", + "mmproj": "mmproj-model-f16.gguf" + }, + "parameters": { + "max_tokens": 4096 + }, + "metadata": { + "author": "Mys", + "tags": ["Vision"], + "size": 5400000000 + }, + "engine": "nitro" +} diff --git a/models/mistral-ins-7b-q4/model.json b/models/mistral-ins-7b-q4/model.json index 6db1aa35b..bfdaffa90 100644 --- a/models/mistral-ins-7b-q4/model.json +++ b/models/mistral-ins-7b-q4/model.json @@ -1,30 +1,35 @@ { - "source_url": "https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf", - "id": "mistral-ins-7b-q4", - "object": "model", - "name": "Mistral Instruct 7B Q4", - "version": "1.0", - "description": "Mistral Instruct 7b model, specifically designed for a comprehensive understanding through training on extensive internet data.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "[INST] {prompt} [/INST]" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MistralAI, The Bloke", - "tags": ["Featured", "7B", "Foundational Model"], - "size": 4370000000, - "cover": "https://raw.githubusercontent.com/janhq/jan/main/models/mistral-ins-7b-q4/cover.png" - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "mistral-7b-instruct-v0.2.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf" + } + ], + "id": "mistral-ins-7b-q4", + "object": "model", + "name": "Mistral Instruct 7B Q4", + "version": "1.0", + "description": "Mistral Instruct 7b model, specifically designed for a comprehensive understanding through training on extensive internet data.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "[INST] {prompt} [/INST]", + "llama_model_path": "mistral-7b-instruct-v0.2.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "MistralAI, The Bloke", + "tags": ["Featured", "7B", "Foundational Model"], + "size": 4370000000, + "cover": "https://raw.githubusercontent.com/janhq/jan/main/models/mistral-ins-7b-q4/cover.png" + }, + "engine": "nitro" +} diff --git a/models/mixtral-8x7b-instruct/model.json b/models/mixtral-8x7b-instruct/model.json index 31ff2838a..e0a0ee040 100644 --- a/models/mixtral-8x7b-instruct/model.json +++ b/models/mixtral-8x7b-instruct/model.json @@ -1,28 +1,33 @@ { - "source_url": "https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-GGUF/resolve/main/mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf", - "id": "mixtral-8x7b-instruct", - "object": "model", - "name": "Mixtral 8x7B Instruct Q4", - "version": "1.0", - "description": "The Mixtral-8x7B is a pretrained generative Sparse Mixture of Experts. The Mixtral-8x7B outperforms 70B models on most benchmarks.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "[INST] {prompt} [/INST]" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "MistralAI, TheBloke", - "tags": ["70B", "Foundational Model"], - "size": 26440000000 - }, - "engine": "nitro" - } + "sources": [ + { + "filename": "mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Mixtral-8x7B-Instruct-v0.1-GGUF/resolve/main/mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf" + } + ], + "id": "mixtral-8x7b-instruct", + "object": "model", + "name": "Mixtral 8x7B Instruct Q4", + "version": "1.0", + "description": "The Mixtral-8x7B is a pretrained generative Sparse Mixture of Experts. The Mixtral-8x7B outperforms 70B models on most benchmarks.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "[INST] {prompt} [/INST]", + "llama_model_path": "mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "MistralAI, TheBloke", + "tags": ["70B", "Foundational Model"], + "size": 26440000000 + }, + "engine": "nitro" +} diff --git a/models/noromaid-7b/model.json b/models/noromaid-7b/model.json index fbb7858e1..78d579a64 100644 --- a/models/noromaid-7b/model.json +++ b/models/noromaid-7b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/NeverSleep/Noromaid-7b-v0.1.1-GGUF/resolve/main/Noromaid-7b-v0.1.1.q5_k_m.gguf", - "id": "noromaid-7b", - "object": "model", - "name": "Noromaid 7B Q5", - "version": "1.0", - "description": "The Noromaid 7b model is designed for role-playing with human-like behavior.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "### Instruction:{prompt}\n### Response:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "NeverSleep", - "tags": ["7B", "Merged"], - "size": 4370000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "Noromaid-7b-v0.1.1.q5_k_m.gguf", + "url": "https://huggingface.co/NeverSleep/Noromaid-7b-v0.1.1-GGUF/resolve/main/Noromaid-7b-v0.1.1.q5_k_m.gguf" + } + ], + "id": "noromaid-7b", + "object": "model", + "name": "Noromaid 7B Q5", + "version": "1.0", + "description": "The Noromaid 7b model is designed for role-playing with human-like behavior.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "### Instruction:{prompt}\n### Response:", + "llama_model_path": "Noromaid-7b-v0.1.1.q5_k_m.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "NeverSleep", + "tags": ["7B", "Merged"], + "size": 4370000000 + }, + "engine": "nitro" +} diff --git a/models/openchat-3.5-7b/model.json b/models/openchat-3.5-7b/model.json index e4b72f9c6..294f7d269 100644 --- a/models/openchat-3.5-7b/model.json +++ b/models/openchat-3.5-7b/model.json @@ -1,28 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/openchat-3.5-1210-GGUF/resolve/main/openchat-3.5-1210.Q4_K_M.gguf", - "id": "openchat-3.5-7b", - "object": "model", - "name": "Openchat-3.5 7B Q4", - "version": "1.0", - "description": "The performance of this open-source model surpasses that of ChatGPT-3.5 and Grok-1 across various benchmarks.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "GPT4 Correct User: {prompt}<|end_of_turn|>GPT4 Correct Assistant:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": ["<|end_of_turn|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Openchat", - "tags": ["Recommended", "7B", "Finetuned"], - "size": 4370000000 - }, - "engine": "nitro" - } + "sources": [ + { + "filename": "openchat-3.5-1210.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/openchat-3.5-1210-GGUF/resolve/main/openchat-3.5-1210.Q4_K_M.gguf" + } + ], + "id": "openchat-3.5-7b", + "object": "model", + "name": "Openchat-3.5 7B Q4", + "version": "1.0", + "description": "The performance of this open-source model surpasses that of ChatGPT-3.5 and Grok-1 across various benchmarks.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "GPT4 Correct User: {prompt}<|end_of_turn|>GPT4 Correct Assistant:", + "llama_model_path": "openchat-3.5-1210.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": ["<|end_of_turn|>"], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Openchat", + "tags": ["Recommended", "7B", "Finetuned"], + "size": 4370000000 + }, + "engine": "nitro" +} diff --git a/models/openhermes-neural-7b/model.json b/models/openhermes-neural-7b/model.json index ca3e88502..87e1df143 100644 --- a/models/openhermes-neural-7b/model.json +++ b/models/openhermes-neural-7b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/janhq/openhermes-2.5-neural-chat-v3-3-slerp-GGUF/resolve/main/openhermes-2.5-neural-chat-v3-3-slerp.Q4_K_M.gguf", - "id": "openhermes-neural-7b", - "object": "model", - "name": "OpenHermes Neural 7B Q4", - "version": "1.0", - "description": "OpenHermes Neural is a merged model using the TIES method. It performs well in various benchmarks.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Intel, Jan", - "tags": ["7B", "Merged", "Featured"], - "size": 4370000000, - "cover": "https://raw.githubusercontent.com/janhq/jan/main/models/openhermes-neural-7b/cover.png" - }, - "engine": "nitro" - } + "sources": [ + { + "filename": "openhermes-2.5-neural-chat-v3-3-slerp.Q4_K_M.gguf", + "url": "https://huggingface.co/janhq/openhermes-2.5-neural-chat-v3-3-slerp-GGUF/resolve/main/openhermes-2.5-neural-chat-v3-3-slerp.Q4_K_M.gguf" + } + ], + "id": "openhermes-neural-7b", + "object": "model", + "name": "OpenHermes Neural 7B Q4", + "version": "1.0", + "description": "OpenHermes Neural is a merged model using the TIES method. It performs well in various benchmarks.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", + "llama_model_path": "openhermes-2.5-neural-chat-v3-3-slerp.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Intel, Jan", + "tags": ["7B", "Merged", "Featured"], + "size": 4370000000, + "cover": "https://raw.githubusercontent.com/janhq/jan/main/models/openhermes-neural-7b/cover.png" + }, + "engine": "nitro" +} diff --git a/models/phi-2-3b/model.json b/models/phi-2-3b/model.json index 97ff369e7..e452fdb55 100644 --- a/models/phi-2-3b/model.json +++ b/models/phi-2-3b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/phi-2-GGUF/resolve/main/phi-2.Q8_0.gguf", - "id": "phi-2-3b", - "object": "model", - "name": "Phi-2 3B Q8", - "version": "1.0", - "description": "Phi-2 is a 2.7B model, excelling in common sense and logical reasoning benchmarks, trained with synthetic texts and filtered websites.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "Intruct:\n{prompt}\nOutput:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Microsoft", - "tags": ["3B","Foundational Model"], - "size": 2960000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "phi-2.Q8_0.gguf", + "url": "https://huggingface.co/TheBloke/phi-2-GGUF/resolve/main/phi-2.Q8_0.gguf" + } + ], + "id": "phi-2-3b", + "object": "model", + "name": "Phi-2 3B Q8", + "version": "1.0", + "description": "Phi-2 is a 2.7B model, excelling in common sense and logical reasoning benchmarks, trained with synthetic texts and filtered websites.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "Intruct:\n{prompt}\nOutput:", + "llama_model_path": "phi-2.Q8_0.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Microsoft", + "tags": ["3B", "Foundational Model"], + "size": 2960000000 + }, + "engine": "nitro" +} diff --git a/models/phind-34b/model.json b/models/phind-34b/model.json index 7fc77ed71..60309cb9b 100644 --- a/models/phind-34b/model.json +++ b/models/phind-34b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/Phind-CodeLlama-34B-v2-GGUF/resolve/main/phind-codellama-34b-v2.Q5_K_M.gguf", - "id": "phind-34b", - "object": "model", - "name": "Phind 34B Q5", - "version": "1.0", - "description": "Phind 34B is fine-tuned on 1.5B tokens of high-quality programming data. This multi-lingual model excels in various programming languages and is designed to be steerable and user-friendly.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "### System Prompt\n{system_message}\n### User Message\n{prompt}\n### Assistant" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Phind, The Bloke", - "tags": ["34B", "Finetuned"], - "size": 20220000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "phind-codellama-34b-v2.Q5_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Phind-CodeLlama-34B-v2-GGUF/resolve/main/phind-codellama-34b-v2.Q5_K_M.gguf" + } + ], + "id": "phind-34b", + "object": "model", + "name": "Phind 34B Q5", + "version": "1.0", + "description": "Phind 34B is fine-tuned on 1.5B tokens of high-quality programming data. This multi-lingual model excels in various programming languages and is designed to be steerable and user-friendly.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "### System Prompt\n{system_message}\n### User Message\n{prompt}\n### Assistant", + "llama_model_path": "phind-codellama-34b-v2.Q5_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Phind, The Bloke", + "tags": ["34B", "Finetuned"], + "size": 20220000000 + }, + "engine": "nitro" +} diff --git a/models/solar-10.7b-slerp/model.json b/models/solar-10.7b-slerp/model.json index 9177fa013..8e62fa25b 100644 --- a/models/solar-10.7b-slerp/model.json +++ b/models/solar-10.7b-slerp/model.json @@ -1,29 +1,33 @@ { - "source_url": "https://huggingface.co/janhq/Solar-10.7B-SLERP-GGUF/resolve/main/solar-10.7b-slerp.Q4_K_M.gguf", - "id": "solar-10.7b-slerp", - "object": "model", - "name": "Solar Slerp 10.7B Q4", - "version": "1.0", - "description": "This model uses the Slerp merge method from SOLAR Instruct and Pandora-v1", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "### User: {prompt}\n### Assistant:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Jan", - "tags": ["13B","Finetuned"], - "size": 6360000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "solar-10.7b-slerp.Q4_K_M.gguf", + "url": "https://huggingface.co/janhq/Solar-10.7B-SLERP-GGUF/resolve/main/solar-10.7b-slerp.Q4_K_M.gguf" + } + ], + "id": "solar-10.7b-slerp", + "object": "model", + "name": "Solar Slerp 10.7B Q4", + "version": "1.0", + "description": "This model uses the Slerp merge method from SOLAR Instruct and Pandora-v1", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "### User: {prompt}\n### Assistant:", + "llama_model_path": "solar-10.7b-slerp.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Jan", + "tags": ["13B", "Finetuned"], + "size": 6360000000 + }, + "engine": "nitro" +} diff --git a/models/starling-7b/model.json b/models/starling-7b/model.json index 1a6d7e55c..eaa540bd9 100644 --- a/models/starling-7b/model.json +++ b/models/starling-7b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/Starling-LM-7B-alpha-GGUF/resolve/main/starling-lm-7b-alpha.Q4_K_M.gguf", - "id": "starling-7b", - "object": "model", - "name": "Starling alpha 7B Q4", - "version": "1.0", - "description": "Starling 7B, an upgrade of Openchat 3.5 using RLAIF, is really good at various benchmarks, especially with GPT-4 judging its performance.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "GPT4 User: {prompt}<|end_of_turn|>GPT4 Assistant:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": ["<|end_of_turn|>"], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Berkeley-nest, The Bloke", - "tags": ["7B","Finetuned"], - "size": 4370000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "starling-lm-7b-alpha.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Starling-LM-7B-alpha-GGUF/resolve/main/starling-lm-7b-alpha.Q4_K_M.gguf" + } + ], + "id": "starling-7b", + "object": "model", + "name": "Starling alpha 7B Q4", + "version": "1.0", + "description": "Starling 7B, an upgrade of Openchat 3.5 using RLAIF, is really good at various benchmarks, especially with GPT-4 judging its performance.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "GPT4 User: {prompt}<|end_of_turn|>GPT4 Assistant:", + "llama_model_path": "starling-lm-7b-alpha.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": ["<|end_of_turn|>"], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Berkeley-nest, The Bloke", + "tags": ["7B", "Finetuned"], + "size": 4370000000 + }, + "engine": "nitro" +} diff --git a/models/stealth-v1.2-7b/model.json b/models/stealth-v1.2-7b/model.json index 92bfe46e1..235cbbb88 100644 --- a/models/stealth-v1.2-7b/model.json +++ b/models/stealth-v1.2-7b/model.json @@ -1,32 +1,33 @@ { - "source_url": "https://huggingface.co/janhq/stealth-v1.3-GGUF/resolve/main/stealth-v1.3.Q4_K_M.gguf", - "id": "stealth-v1.2-7b", - "object": "model", - "name": "Stealth 7B Q4", - "version": "1.0", - "description": "This is a new experimental family designed to enhance Mathematical and Logical abilities.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Jan", - "tags": [ - "7B", - "Finetuned", - "Featured" - ], - "size": 4370000000 - }, - "engine": "nitro" - } \ No newline at end of file + "sources": [ + { + "filename": "stealth-v1.3.Q4_K_M.gguf", + "url": "https://huggingface.co/janhq/stealth-v1.3-GGUF/resolve/main/stealth-v1.3.Q4_K_M.gguf" + } + ], + "id": "stealth-v1.2-7b", + "object": "model", + "name": "Stealth 7B Q4", + "version": "1.0", + "description": "This is a new experimental family designed to enhance Mathematical and Logical abilities.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", + "llama_model_path": "stealth-v1.3.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Jan", + "tags": ["7B", "Finetuned", "Featured"], + "size": 4370000000 + }, + "engine": "nitro" +} diff --git a/models/tinyllama-1.1b/model.json b/models/tinyllama-1.1b/model.json index 641511569..6a9187fa5 100644 --- a/models/tinyllama-1.1b/model.json +++ b/models/tinyllama-1.1b/model.json @@ -1,5 +1,10 @@ { - "source_url": "https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF/resolve/main/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf", + "sources": [ + { + "filename": "tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF/resolve/main/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf" + } + ], "id": "tinyllama-1.1b", "object": "model", "name": "TinyLlama Chat 1.1B Q4", @@ -7,8 +12,9 @@ "description": "TinyLlama is a tiny model with only 1.1B. It's a good model for less powerful computers.", "format": "gguf", "settings": { - "ctx_len": 2048, - "prompt_template": "<|system|>\n{system_message}<|user|>\n{prompt}<|assistant|>" + "ctx_len": 4096, + "prompt_template": "<|system|>\n{system_message}<|user|>\n{prompt}<|assistant|>", + "llama_model_path": "tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf" }, "parameters": { "temperature": 0.7, @@ -20,9 +26,9 @@ "presence_penalty": 0 }, "metadata": { - "author": "TinyLlama", - "tags": ["Tiny", "Foundation Model"], - "size": 669000000 + "author": "TinyLlama", + "tags": ["Tiny", "Foundation Model"], + "size": 669000000 }, "engine": "nitro" -} \ No newline at end of file +} diff --git a/models/trinity-v1.2-7b/model.json b/models/trinity-v1.2-7b/model.json index ce5e7a4cf..2dda120e6 100644 --- a/models/trinity-v1.2-7b/model.json +++ b/models/trinity-v1.2-7b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/janhq/trinity-v1.2-GGUF/resolve/main/trinity-v1.2.Q4_K_M.gguf", - "id": "trinity-v1.2-7b", - "object": "model", - "name": "Trinity-v1.2 7B Q4", - "version": "1.0", - "description": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Jan", - "tags": ["7B", "Merged", "Featured"], - "size": 4370000000, - "cover": "https://raw.githubusercontent.com/janhq/jan/main/models/trinity-v1.2-7b/cover.png" - }, - "engine": "nitro" - } \ No newline at end of file + "sources": [ + { + "filename": "trinity-v1.2.Q4_K_M.gguf", + "url": "https://huggingface.co/janhq/trinity-v1.2-GGUF/resolve/main/trinity-v1.2.Q4_K_M.gguf" + } + ], + "id": "trinity-v1.2-7b", + "object": "model", + "name": "Trinity-v1.2 7B Q4", + "version": "1.0", + "description": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", + "llama_model_path": "trinity-v1.2.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Jan", + "tags": ["7B", "Merged", "Featured"], + "size": 4370000000, + "cover": "https://raw.githubusercontent.com/janhq/jan/main/models/trinity-v1.2-7b/cover.png" + }, + "engine": "nitro" +} diff --git a/models/tulu-2-70b/model.json b/models/tulu-2-70b/model.json index ae95b870d..06b96e50d 100644 --- a/models/tulu-2-70b/model.json +++ b/models/tulu-2-70b/model.json @@ -1,28 +1,33 @@ { - "source_url": "https://huggingface.co/TheBloke/tulu-2-dpo-70B-GGUF/resolve/main/tulu-2-dpo-70b.Q4_K_M.gguf", - "id": "tulu-2-70b", - "object": "model", - "name": "Tulu 2 70B Q4", - "version": "1.0", - "description": "Tulu 70B is a strong alternative to Llama 2 70b Chat to act as helpful assistants.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|user|>\n{prompt}\n<|assistant|>" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "Lizpreciatior, The Bloke", - "tags": ["70B", "Finetuned"], - "size": 41400000000 - }, - "engine": "nitro" - } \ No newline at end of file + "sources": [ + { + "filename": "tulu-2-dpo-70b.Q4_K_M.gguf", + "url": "https://huggingface.co/TheBloke/tulu-2-dpo-70B-GGUF/resolve/main/tulu-2-dpo-70b.Q4_K_M.gguf" + } + ], + "id": "tulu-2-70b", + "object": "model", + "name": "Tulu 2 70B Q4", + "version": "1.0", + "description": "Tulu 70B is a strong alternative to Llama 2 70b Chat to act as helpful assistants.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "<|user|>\n{prompt}\n<|assistant|>", + "llama_model_path": "tulu-2-dpo-70b.Q4_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Lizpreciatior, The Bloke", + "tags": ["70B", "Finetuned"], + "size": 41400000000 + }, + "engine": "nitro" +} diff --git a/models/wizardcoder-13b/model.json b/models/wizardcoder-13b/model.json index 1605ed362..051c739a0 100644 --- a/models/wizardcoder-13b/model.json +++ b/models/wizardcoder-13b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/WizardCoder-Python-13B-V1.0-GGUF/resolve/main/wizardcoder-python-13b-v1.0.Q5_K_M.gguf", - "id": "wizardcoder-13b", - "object": "model", - "name": "Wizard Coder Python 13B Q5", - "version": "1.0", - "description": "WizardCoder 13B is a Python coding model. This model demonstrate high proficiency in specific domains like coding and mathematics.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "### Instruction:\n{prompt}\n### Response:" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "WizardLM, The Bloke", - "tags": ["Recommended", "13B", "Finetuned"], - "size": 7870000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "wizardcoder-python-13b-v1.0.Q5_K_M.gguf", + "url": "https://huggingface.co/TheBloke/WizardCoder-Python-13B-V1.0-GGUF/resolve/main/wizardcoder-python-13b-v1.0.Q5_K_M.gguf" + } + ], + "id": "wizardcoder-13b", + "object": "model", + "name": "Wizard Coder Python 13B Q5", + "version": "1.0", + "description": "WizardCoder 13B is a Python coding model. This model demonstrate high proficiency in specific domains like coding and mathematics.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "### Instruction:\n{prompt}\n### Response:", + "llama_model_path": "wizardcoder-python-13b-v1.0.Q5_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "WizardLM, The Bloke", + "tags": ["Recommended", "13B", "Finetuned"], + "size": 7870000000 + }, + "engine": "nitro" +} diff --git a/models/yarn-mistral-7b/model.json b/models/yarn-mistral-7b/model.json index 2676fbb58..ee6de1319 100644 --- a/models/yarn-mistral-7b/model.json +++ b/models/yarn-mistral-7b/model.json @@ -1,29 +1,31 @@ { - "source_url": "https://huggingface.co/TheBloke/Yarn-Mistral-7B-128k-GGUF/resolve/main/yarn-mistral-7b-128k.Q4_K_M.gguf", - "id": "yarn-mistral-7b", - "object": "model", - "name": "Yarn Mistral 7B Q4", - "version": "1.0", - "description": "Yarn Mistral 7B is a language model for long context and supports a 128k token context window.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "{prompt}" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "NousResearch, The Bloke", - "tags": ["7B","Finetuned"], - "size": 4370000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "url": "https://huggingface.co/TheBloke/Yarn-Mistral-7B-128k-GGUF/resolve/main/yarn-mistral-7b-128k.Q4_K_M.gguf" + } + ], + "id": "yarn-mistral-7b", + "object": "model", + "name": "Yarn Mistral 7B Q4", + "version": "1.0", + "description": "Yarn Mistral 7B is a language model for long context and supports a 128k token context window.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "{prompt}" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "NousResearch, The Bloke", + "tags": ["7B", "Finetuned"], + "size": 4370000000 + }, + "engine": "nitro" +} diff --git a/models/yi-34b/model.json b/models/yi-34b/model.json index 8ff23aaa0..3697a9e22 100644 --- a/models/yi-34b/model.json +++ b/models/yi-34b/model.json @@ -1,29 +1,34 @@ { - "source_url": "https://huggingface.co/TheBloke/Yi-34B-Chat-GGUF/resolve/main/yi-34b-chat.Q5_K_M.gguf", - "id": "yi-34b", - "object": "model", - "name": "Yi 34B Q5", - "version": "1.0", - "description": "Yi-34B, a specialized chat model, is known for its diverse and creative responses and excels across various NLP tasks and benchmarks.", - "format": "gguf", - "settings": { - "ctx_len": 4096, - "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" - }, - "parameters": { - "temperature": 0.7, - "top_p": 0.95, - "stream": true, - "max_tokens": 4096, - "stop": [], - "frequency_penalty": 0, - "presence_penalty": 0 - }, - "metadata": { - "author": "01-ai, The Bloke", - "tags": ["34B", "Foundational Model"], - "size": 20660000000 - }, - "engine": "nitro" - } - \ No newline at end of file + "sources": [ + { + "filename": "yi-34b-chat.Q5_K_M.gguf", + "url": "https://huggingface.co/TheBloke/Yi-34B-Chat-GGUF/resolve/main/yi-34b-chat.Q5_K_M.gguf" + } + ], + "id": "yi-34b", + "object": "model", + "name": "Yi 34B Q5", + "version": "1.0", + "description": "Yi-34B, a specialized chat model, is known for its diverse and creative responses and excels across various NLP tasks and benchmarks.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant", + "llama_model_path": "yi-34b-chat.Q5_K_M.gguf" + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 4096, + "stop": [], + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "01-ai, The Bloke", + "tags": ["34B", "Foundational Model"], + "size": 20660000000 + }, + "engine": "nitro" +} diff --git a/uikit/src/button/index.tsx b/uikit/src/button/index.tsx index 7561b5c73..15919d666 100644 --- a/uikit/src/button/index.tsx +++ b/uikit/src/button/index.tsx @@ -14,6 +14,7 @@ const buttonVariants = cva('btn', { outline: 'btn-outline', secondary: 'btn-secondary', secondaryBlue: 'btn-secondary-blue', + secondaryDanger: 'btn-secondary-danger', ghost: 'btn-ghost', success: 'btn-success', }, diff --git a/uikit/src/button/styles.scss b/uikit/src/button/styles.scss index 9e30c14b3..74585ed1e 100644 --- a/uikit/src/button/styles.scss +++ b/uikit/src/button/styles.scss @@ -9,13 +9,17 @@ } &-secondary-blue { - @apply bg-blue-200 text-blue-600 hover:bg-blue-500/80; + @apply bg-blue-200 text-blue-600 hover:bg-blue-500/50; } &-danger { @apply bg-danger text-danger-foreground hover:bg-danger/90; } + &-secondary-danger { + @apply bg-red-200 text-red-600 hover:bg-red-500/50; + } + &-outline { @apply border-input border bg-transparent; } diff --git a/uikit/src/input/styles.scss b/uikit/src/input/styles.scss index d96e32c78..b78db270a 100644 --- a/uikit/src/input/styles.scss +++ b/uikit/src/input/styles.scss @@ -1,6 +1,6 @@ .input { @apply border-border placeholder:text-muted-foreground flex h-9 w-full rounded-lg border bg-transparent px-3 py-1 transition-colors; - @apply disabled:cursor-not-allowed disabled:opacity-50; + @apply disabled:cursor-not-allowed disabled:bg-zinc-100; @apply focus-within:outline-none focus-visible:outline-0 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-1; @apply file:border-0 file:bg-transparent file:font-medium; } diff --git a/web/containers/Layout/Ribbon/index.tsx b/web/containers/Layout/Ribbon/index.tsx index 6c63ade33..83ed2725a 100644 --- a/web/containers/Layout/Ribbon/index.tsx +++ b/web/containers/Layout/Ribbon/index.tsx @@ -41,7 +41,10 @@ export default function RibbonNav() { icon: ( ), state: MainViewState.Thread, @@ -60,7 +63,7 @@ export default function RibbonNav() { const secondaryMenus = [ { - name: 'Local Server', + name: 'Local API Server', icon: ( { const { children } = props - const { mainViewState } = useMainViewState() + const { mainViewState, setMainViewState } = useMainViewState() const { theme, setTheme } = useTheme() @@ -21,6 +24,12 @@ const BaseLayout = (props: PropsWithChildren) => { setTheme(theme as string) }, [setTheme, theme]) + useEffect(() => { + if (localStorage.getItem(SUCCESS_SET_NEW_DESTINATION) === 'true') { + setMainViewState(MainViewState.Settings) + } + }, []) + return (
diff --git a/web/containers/Providers/EventListener.tsx b/web/containers/Providers/EventListener.tsx index d91a877d6..2816c88e2 100644 --- a/web/containers/Providers/EventListener.tsx +++ b/web/containers/Providers/EventListener.tsx @@ -105,6 +105,7 @@ export default function EventListenerWrapper({ children }: PropsWithChildren) { }) } return () => {} + // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return ( diff --git a/web/containers/ShortcutModal/index.tsx b/web/containers/ShortcutModal/index.tsx index 638df02d8..04d6dfc0f 100644 --- a/web/containers/ShortcutModal/index.tsx +++ b/web/containers/ShortcutModal/index.tsx @@ -50,10 +50,12 @@ const availableShortcuts = [ const ShortcutModal: React.FC = () => ( - - + +
+ +
diff --git a/web/hooks/useDownloadModel.ts b/web/hooks/useDownloadModel.ts index 49dbe1d5b..528108d18 100644 --- a/web/hooks/useDownloadModel.ts +++ b/web/hooks/useDownloadModel.ts @@ -6,6 +6,7 @@ import { ModelExtension, abortDownload, joinPath, + ModelArtifact, } from '@janhq/core' import { useSetAtom } from 'jotai' @@ -25,6 +26,23 @@ export default function useDownloadModel() { const addNewDownloadingModel = useSetAtom(addNewDownloadingModelAtom) const downloadModel = async (model: Model) => { + const childrenDownloadProgress: DownloadState[] = [] + model.sources.forEach((source: ModelArtifact) => { + childrenDownloadProgress.push({ + modelId: source.filename, + time: { + elapsed: 0, + remaining: 0, + }, + speed: 0, + percent: 0, + size: { + total: 0, + transferred: 0, + }, + }) + }) + // set an initial download state setDownloadState({ modelId: model.id, @@ -38,6 +56,7 @@ export default function useDownloadModel() { total: 0, transferred: 0, }, + children: childrenDownloadProgress, }) addNewDownloadingModel(model) @@ -46,6 +65,7 @@ export default function useDownloadModel() { .get(ExtensionTypeEnum.Model) ?.downloadModel(model, { ignoreSSL, proxy }) } + const abortModelDownload = async (model: Model) => { await abortDownload( await joinPath(['models', model.id, modelBinFileName(model)]) diff --git a/web/hooks/useGetConfiguredModels.ts b/web/hooks/useGetConfiguredModels.ts index 5662d534e..919f43754 100644 --- a/web/hooks/useGetConfiguredModels.ts +++ b/web/hooks/useGetConfiguredModels.ts @@ -1,7 +1,6 @@ import { useEffect, useState } from 'react' -import { ExtensionTypeEnum, ModelExtension } from '@janhq/core' -import { Model } from '@janhq/core' +import { ExtensionTypeEnum, ModelExtension, Model } from '@janhq/core' import { extensionManager } from '@/extension/ExtensionManager' @@ -25,6 +24,7 @@ export function useGetConfiguredModels() { useEffect(() => { fetchModels() + // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return { loading, models } diff --git a/web/hooks/useGetDownloadedModels.ts b/web/hooks/useGetDownloadedModels.ts index f509fce63..bba420858 100644 --- a/web/hooks/useGetDownloadedModels.ts +++ b/web/hooks/useGetDownloadedModels.ts @@ -6,7 +6,7 @@ import { atom, useAtom } from 'jotai' import { extensionManager } from '@/extension/ExtensionManager' -const downloadedModelsAtom = atom([]) +export const downloadedModelsAtom = atom([]) export function useGetDownloadedModels() { const [downloadedModels, setDownloadedModels] = useAtom(downloadedModelsAtom) @@ -15,7 +15,8 @@ export function useGetDownloadedModels() { getDownloadedModels().then((downloadedModels) => { setDownloadedModels(downloadedModels) }) - }, [setDownloadedModels]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) return { downloadedModels, setDownloadedModels } } diff --git a/web/hooks/useRecommendedModel.ts b/web/hooks/useRecommendedModel.ts index dd474d0b5..2ee4c1a7f 100644 --- a/web/hooks/useRecommendedModel.ts +++ b/web/hooks/useRecommendedModel.ts @@ -110,6 +110,7 @@ export default function useRecommendedModel() { console.debug(`Using last used model ${lastUsedModel.id}`) setRecommendedModel(lastUsedModel) + // eslint-disable-next-line react-hooks/exhaustive-deps }, [getAndSortDownloadedModels, activeThread]) useEffect(() => { diff --git a/web/hooks/useSettings.ts b/web/hooks/useSettings.ts index 34d123359..ef4e08480 100644 --- a/web/hooks/useSettings.ts +++ b/web/hooks/useSettings.ts @@ -13,6 +13,7 @@ export const useSettings = () => { useEffect(() => { setTimeout(() => validateSettings, 3000) + // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const validateSettings = async () => { diff --git a/web/hooks/useVaultDirectory.ts b/web/hooks/useVaultDirectory.ts new file mode 100644 index 000000000..3aa7383c9 --- /dev/null +++ b/web/hooks/useVaultDirectory.ts @@ -0,0 +1,105 @@ +import { useEffect } from 'react' + +import { fs, AppConfiguration } from '@janhq/core' + +import { atom, useAtom } from 'jotai' + +import { useMainViewState } from './useMainViewState' + +const isSameDirectoryAtom = atom(false) +const isDirectoryConfirmAtom = atom(false) +const isErrorSetNewDestAtom = atom(false) +const currentPathAtom = atom('') +const newDestinationPathAtom = atom('') + +export const SUCCESS_SET_NEW_DESTINATION = 'successSetNewDestination' + +export function useVaultDirectory() { + const [isSameDirectory, setIsSameDirectory] = useAtom(isSameDirectoryAtom) + const { setMainViewState } = useMainViewState() + const [isDirectoryConfirm, setIsDirectoryConfirm] = useAtom( + isDirectoryConfirmAtom + ) + const [isErrorSetNewDest, setIsErrorSetNewDest] = useAtom( + isErrorSetNewDestAtom + ) + const [currentPath, setCurrentPath] = useAtom(currentPathAtom) + const [newDestinationPath, setNewDestinationPath] = useAtom( + newDestinationPathAtom + ) + + useEffect(() => { + window.core?.api + ?.getAppConfigurations() + ?.then((appConfig: AppConfiguration) => { + setCurrentPath(appConfig.data_folder) + }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + const setNewDestination = async () => { + const destFolder = await window.core?.api?.selectDirectory() + setNewDestinationPath(destFolder) + + if (destFolder) { + console.debug(`Destination folder selected: ${destFolder}`) + try { + const appConfiguration: AppConfiguration = + await window.core?.api?.getAppConfigurations() + const currentJanDataFolder = appConfiguration.data_folder + + if (currentJanDataFolder === destFolder) { + console.debug( + `Destination folder is the same as current folder. Ignore..` + ) + setIsSameDirectory(true) + setIsDirectoryConfirm(false) + return + } else { + setIsSameDirectory(false) + setIsDirectoryConfirm(true) + } + setIsErrorSetNewDest(false) + } catch (e) { + console.error(`Error: ${e}`) + setIsErrorSetNewDest(true) + } + } + } + + const applyNewDestination = async () => { + try { + const appConfiguration: AppConfiguration = + await window.core?.api?.getAppConfigurations() + const currentJanDataFolder = appConfiguration.data_folder + + appConfiguration.data_folder = newDestinationPath + + await fs.syncFile(currentJanDataFolder, newDestinationPath) + await window.core?.api?.updateAppConfiguration(appConfiguration) + console.debug( + `File sync finished from ${currentPath} to ${newDestinationPath}` + ) + + setIsErrorSetNewDest(false) + localStorage.setItem(SUCCESS_SET_NEW_DESTINATION, 'true') + await window.core?.api?.relaunch() + } catch (e) { + console.error(`Error: ${e}`) + setIsErrorSetNewDest(true) + } + } + + return { + setNewDestination, + newDestinationPath, + applyNewDestination, + isSameDirectory, + setIsDirectoryConfirm, + isDirectoryConfirm, + setIsSameDirectory, + currentPath, + isErrorSetNewDest, + setIsErrorSetNewDest, + } +} diff --git a/web/package.json b/web/package.json index bba3dd48b..5293cf765 100644 --- a/web/package.json +++ b/web/package.json @@ -21,7 +21,7 @@ "class-variance-authority": "^0.7.0", "framer-motion": "^10.16.4", "highlight.js": "^11.9.0", - "jotai": "^2.4.0", + "jotai": "^2.6.0", "lodash": "^4.17.21", "lucide-react": "^0.291.0", "marked": "^9.1.2", diff --git a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx index b56e20404..656a671c7 100644 --- a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx +++ b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx @@ -26,7 +26,7 @@ import { useCreateNewThread } from '@/hooks/useCreateNewThread' import useDownloadModel from '@/hooks/useDownloadModel' import { useDownloadState } from '@/hooks/useDownloadState' import { getAssistants } from '@/hooks/useGetAssistants' -import { useGetDownloadedModels } from '@/hooks/useGetDownloadedModels' +import { downloadedModelsAtom } from '@/hooks/useGetDownloadedModels' import { useMainViewState } from '@/hooks/useMainViewState' import { toGibibytes } from '@/utils/converter' @@ -43,8 +43,8 @@ type Props = { const ExploreModelItemHeader: React.FC = ({ model, onClick, open }) => { const { downloadModel } = useDownloadModel() - const { downloadedModels } = useGetDownloadedModels() - const { modelDownloadStateAtom, downloadStates } = useDownloadState() + const downloadedModels = useAtomValue(downloadedModelsAtom) + const { modelDownloadStateAtom } = useDownloadState() const { requestCreateNewThread } = useCreateNewThread() const totalRam = useAtomValue(totalRamAtom) const serverEnabled = useAtomValue(serverEnabledAtom) @@ -100,9 +100,7 @@ const ExploreModelItemHeader: React.FC = ({ model, onClick, open }) => { )} ) - } - - if (downloadState != null && downloadStates.length > 0) { + } else if (downloadState != null) { downloadButton = } diff --git a/web/screens/LocalServer/index.tsx b/web/screens/LocalServer/index.tsx index 600437b62..ce709d831 100644 --- a/web/screens/LocalServer/index.tsx +++ b/web/screens/LocalServer/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import React, { useEffect, useState } from 'react' @@ -55,16 +56,16 @@ const hostAtom = atom('127.0.0.1') const portAtom = atom('1337') const LocalServerScreen = () => { + const [errorRangePort, setErrorRangePort] = useState(false) const [serverEnabled, setServerEnabled] = useAtom(serverEnabledAtom) const showing = useAtomValue(showRightSideBarAtom) const activeModelParams = useAtomValue(getActiveThreadModelParamsAtom) const modelEngineParams = toSettingParams(activeModelParams) - const componentDataEngineSetting = getConfigurationsData(modelEngineParams) const { openServerLog, clearServerLog } = useServerLog() - const { activeModel, startModel, stateModel } = useActiveModel() + const { startModel, stateModel } = useActiveModel() const [selectedModel] = useAtom(selectedModelAtom) const [isCorsEnabled, setIsCorsEnabled] = useAtom(corsEnabledAtom) @@ -77,6 +78,15 @@ const LocalServerScreen = () => { const [firstTimeVisitAPIServer, setFirstTimeVisitAPIServer] = useState(false) + const handleChangePort = (value: any) => { + if (Number(value) <= 0 || Number(value) >= 65536) { + setErrorRangePort(true) + } else { + setErrorRangePort(false) + } + setPort(value) + } + useEffect(() => { if ( localStorage.getItem(FIRST_TIME_VISIT_API_SERVER) === null || @@ -87,6 +97,10 @@ const LocalServerScreen = () => { } }, [firstTimeVisitAPIServer]) + useEffect(() => { + handleChangePort(port) + }, []) + return (
{/* Left SideBar */} @@ -102,7 +116,7 @@ const LocalServerScreen = () => {
+ {errorRangePort && ( +

{`The port range should be from 0 to 65536`}

+ )}