From 65b8d8e66b8641b43201ffb132fdfb158cc7b6d5 Mon Sep 17 00:00:00 2001 From: Hoang Ha <64120343+hahuyhoang411@users.noreply.github.com> Date: Mon, 20 May 2024 23:45:06 +0700 Subject: [PATCH 01/13] Fix: Phi-3 doesn't display (#2928) * fix: params correction * add phi * version bump --- extensions/inference-nitro-extension/package.json | 2 +- .../resources/models/phi3-3.8b/model.json | 12 +++++++++--- .../inference-nitro-extension/rollup.config.ts | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/extensions/inference-nitro-extension/package.json b/extensions/inference-nitro-extension/package.json index d396778d9..13db97f64 100644 --- a/extensions/inference-nitro-extension/package.json +++ b/extensions/inference-nitro-extension/package.json @@ -1,7 +1,7 @@ { "name": "@janhq/inference-cortex-extension", "productName": "Cortex Inference Engine", - "version": "1.0.7", + "version": "1.0.8", "description": "This extension embeds cortex.cpp, a lightweight inference engine written in C++. See https://nitro.jan.ai.\nAdditional dependencies could be installed to run without Cuda Toolkit installation.", "main": "dist/index.js", "node": "dist/node/index.cjs.js", diff --git a/extensions/inference-nitro-extension/resources/models/phi3-3.8b/model.json b/extensions/inference-nitro-extension/resources/models/phi3-3.8b/model.json index 6777cb6b6..f384fd953 100644 --- a/extensions/inference-nitro-extension/resources/models/phi3-3.8b/model.json +++ b/extensions/inference-nitro-extension/resources/models/phi3-3.8b/model.json @@ -8,17 +8,23 @@ "id": "phi3-3.8b", "object": "model", "name": "Phi-3 Mini", - "version": "1.0", + "version": "1.1", "description": "Phi-3 Mini is Microsoft's newest, compact model designed for mobile use.", "format": "gguf", "settings": { "ctx_len": 4096, "prompt_template": "<|user|>\n{prompt}<|end|>\n<|assistant|>\n", - "llama_model_path": "Phi-3-mini-4k-instruct-q4.gguf" + "llama_model_path": "Phi-3-mini-4k-instruct-q4.gguf", + "ngl": 32 }, "parameters": { "max_tokens": 4096, - "stop": ["<|end|>"] + "stop": ["<|end|>"], + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "frequency_penalty": 0, + "presence_penalty": 0 }, "metadata": { "author": "Microsoft", diff --git a/extensions/inference-nitro-extension/rollup.config.ts b/extensions/inference-nitro-extension/rollup.config.ts index b0707f404..7c3cc90d7 100644 --- a/extensions/inference-nitro-extension/rollup.config.ts +++ b/extensions/inference-nitro-extension/rollup.config.ts @@ -23,6 +23,7 @@ const mistralIns7bq4Json = require('./resources/models/mistral-ins-7b-q4/model.j 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 phi3bJson = require('./resources/models/phi3-3.8b/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') @@ -64,6 +65,7 @@ export default [ mixtral8x7bInstructJson, noromaid7bJson, openchat357bJson, + phi3bJson, phind34bJson, qwen7bJson, stableZephyr3bJson, From ae499c7ac417d7781c69e8511d8b045ed1be7646 Mon Sep 17 00:00:00 2001 From: Van Pham <64197333+Van-QA@users.noreply.github.com> Date: Mon, 20 May 2024 23:45:37 +0700 Subject: [PATCH 02/13] Feat/oai endpoints mapper using JSON (#2929) * feat: test mapper * chore: temporally add other runner * chore: temp remove ubuntu-18-04-openai-api-collection-test * chore: test json file * chore: test json file * Correct path endpoints_mapping.json * feat: running via endpoints * feat: running multiple endpoint * feat: use endpoint value from workflow dispatch * feat: add mapper between endpoint and python test file * feat: config run all * feat: config run all --------- Co-authored-by: Van-QA Co-authored-by: Hien To --- .github/workflows/jan-openai-api-test.yml | 21 +++++-- docs/tests/conftest.py | 42 +++++++++++-- docs/tests/endpoints_mapping.json | 75 +++++++++++++++++++++++ 3 files changed, 129 insertions(+), 9 deletions(-) create mode 100644 docs/tests/endpoints_mapping.json diff --git a/.github/workflows/jan-openai-api-test.yml b/.github/workflows/jan-openai-api-test.yml index 9964a41d5..b7e2717b3 100644 --- a/.github/workflows/jan-openai-api-test.yml +++ b/.github/workflows/jan-openai-api-test.yml @@ -1,6 +1,13 @@ name: Test - OpenAI API Pytest collection on: workflow_dispatch: + inputs: + endpoints: + description: 'comma-separated list (see available at endpoints_mapping.json e.g. GET /users,POST /transform)' + required: false + default: all + type: string + push: branches: - main @@ -38,11 +45,11 @@ jobs: rm -rf ~/jan make clean - - name: install dependencies + - name: Install dependencies run: | npm install -g @stoplight/prism-cli - - name: create python virtual environment and run test + - name: Create python virtual environment and run test run: | python3 -m venv /tmp/jan source /tmp/jan/bin/activate @@ -65,10 +72,14 @@ jobs: # Append to conftest.py cat ../docs/tests/conftest.py >> tests/conftest.py - + cat ../docs/tests/endpoints_mapping.json >> tests/endpoints_mapping.json + # start mock server and run test then stop mock server - prism mock ../docs/openapi/jan.yaml > prism.log & prism_pid=$! && pytest --reportportal --html=report.html && kill $prism_pid + prism mock ../docs/openapi/jan.yaml > prism.log & prism_pid=$! && + pytest --endpoint "$ENDPOINTS" --reportportal --html=report.html && kill $prism_pid deactivate + env: + ENDPOINTS: ${{ github.event.inputs.endpoints }} - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -79,7 +90,7 @@ jobs: openai-python/assets openai-python/prism.log - - name: clean up + - name: Clean up if: always() run: | rm -rf /tmp/jan diff --git a/docs/tests/conftest.py b/docs/tests/conftest.py index 86b6c422f..bec60cf0b 100644 --- a/docs/tests/conftest.py +++ b/docs/tests/conftest.py @@ -1,6 +1,40 @@ +import json + + +def pytest_addoption(parser): + parser.addoption( + "--endpoint", action="store", default="all", help="my option: endpoints" + ) + + +def pytest_configure(config): + config.addinivalue_line( + "markers", "endpoint(endpoint): this mark select the test based on endpoint" + ) + + +def pytest_runtest_setup(item): + getoption = item.config.getoption("--endpoint").split(",") + if getoption not in (["all"], [''], [""]): + endpoint_names = [mark.args[0] for mark in item.iter_markers(name="endpoint")] + if not endpoint_names or not set(getoption).intersection(set(endpoint_names)): + pytest.skip("Test skipped because endpoint is {!r}".format(endpoint_names)) + + def pytest_collection_modifyitems(items): + # load the JSON file + with open("tests/endpoints_mapping.json", "r") as json_file: + endpoints_file_mapping = json.load(json_file) + + # create a dictionary to map filenames to endpoints + filename_to_endpoint = {} + for endpoint, files in endpoints_file_mapping.items(): + for filename in files: + filename_to_endpoint[filename] = endpoint + + # add the markers based on the JSON file for item in items: - # add the name of the file (without extension) as a marker - filename = item.nodeid.split("::")[0].split("/")[-1].replace(".py", "") - marker = pytest.mark.file(filename) - item.add_marker(marker) + # map the name of the file to endpoint, else use default value + filename = item.fspath.basename + marker = filename_to_endpoint.get(filename, filename) + item.add_marker(pytest.mark.endpoint(marker, filename=filename)) diff --git a/docs/tests/endpoints_mapping.json b/docs/tests/endpoints_mapping.json new file mode 100644 index 000000000..5800abc32 --- /dev/null +++ b/docs/tests/endpoints_mapping.json @@ -0,0 +1,75 @@ +{ + "/embeddings": [ + "test_embedding.py" + ], + "/audio/translations": [ + "test_translations.py" + ], + "/audio/transcriptions": [ + "test_transcriptions.py" + ], + "/moderations": [ + "test_moderations.py" + ], + "/images/generations": [ + "test_images.py" + ], + "/batches": [ + "test_batches.py" + ], + "/vector_stores": [ + "test_vector_stores.py" + ], + "/fine_tuning/jobs": [ + "test_jobs.py", + "test_checkpoints.py" + ], + "/assistants": [ + "test_assistants.py" + ], + "/threads/{thread_id}/runs": [ + "test_runs.py" + ], + "/threads/{thread_id}/runs/{run_id}/steps": [ + "test_steps.py" + ], + "/vector_stores/{vector_store_id}/file_batches": [ + "test_file_batches.py" + ], + "/messages": [ + "test_messages.py" + ], + "/vector_stores/{vector_store_id}/files": [ + "test_files.py" + ], + "/chat/completions": [ + "test_completions.py" + ], + "/threads": [ + "test_threads.py" + ], + "/audio/speech": [ + "test_speech.py" + ], + "/models": [ + "test_models.py" + ], + "native_client_sdk_only": [ + "test_streaming.py" + ], + "utils": [ + "test_response.py", + "test_client.py", + "test_extract_files.py", + "test_typing.py", + "test_legacy_response.py", + "test_module_client.py", + "test_old_api.py", + "test_proxy.py", + "test_qs.py", + "test_required_args.py", + "test_transform.py", + "test_azure.py", + "test_deepcopy.py" + ] +} From 6ba540d1f70bb42f4137544fc62ff790c42487b8 Mon Sep 17 00:00:00 2001 From: NamH Date: Tue, 21 May 2024 13:53:46 +0700 Subject: [PATCH 03/13] fix: fix crash when model name not ready (#2931) Signed-off-by: James Co-authored-by: James --- .../ModelSegmentInfo/index.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelSegmentInfo/index.tsx b/web/screens/Settings/HuggingFaceRepoDetailModal/ModelSegmentInfo/index.tsx index 11086d237..6a6601b33 100644 --- a/web/screens/Settings/HuggingFaceRepoDetailModal/ModelSegmentInfo/index.tsx +++ b/web/screens/Settings/HuggingFaceRepoDetailModal/ModelSegmentInfo/index.tsx @@ -13,11 +13,12 @@ const ModelSegmentInfo: React.FC = () => { ) const { author, modelName, downloads, modelUrl } = useMemo(() => { - const author = - (importingHuggingFaceRepoData?.cardData['model_creator'] as string) ?? - 'N/A' - const modelName = - (importingHuggingFaceRepoData?.cardData['model_name'] as string) ?? 'N/A' + const cardData = importingHuggingFaceRepoData?.cardData + const author = (cardData?.['model_creator'] ?? 'N/A') as string + const modelName = (cardData?.['model_name'] ?? + importingHuggingFaceRepoData?.id ?? + 'N/A') as string + const modelUrl = importingHuggingFaceRepoData?.modelUrl ?? 'N/A' const downloads = importingHuggingFaceRepoData?.downloads ?? 0 From 5573ec9fdbfa39ad025545fe667a9a2d0111d19c Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Wed, 22 May 2024 15:42:27 +0700 Subject: [PATCH 04/13] Replace deprecated steps github action (#2935) Co-authored-by: Hien To --- .github/workflows/jan-electron-build.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/jan-electron-build.yml b/.github/workflows/jan-electron-build.yml index 8898c8211..ab90f696f 100644 --- a/.github/workflows/jan-electron-build.yml +++ b/.github/workflows/jan-electron-build.yml @@ -25,12 +25,11 @@ jobs: GITHUB_REF: ${{ github.ref }} - name: Create Draft Release id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: softprops/action-gh-release@v2 with: tag_name: ${{ github.ref_name }} - release_name: "${{ env.VERSION }}" + token: ${{ secrets.GITHUB_TOKEN }} + name: "${{ env.VERSION }}" draft: true prerelease: false From 385ebb775092763f68f5baf3e766d745aac93c31 Mon Sep 17 00:00:00 2001 From: Hoang Ha <64120343+hahuyhoang411@users.noreply.github.com> Date: Wed, 22 May 2024 21:20:42 +0700 Subject: [PATCH 05/13] Chore: phi3 long-context update (#2936) * init * init * fix: correct version * version bump * correct url * remove small * correct size --- .../inference-nitro-extension/package.json | 2 +- .../resources/models/phi3-medium/model.json | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 extensions/inference-nitro-extension/resources/models/phi3-medium/model.json diff --git a/extensions/inference-nitro-extension/package.json b/extensions/inference-nitro-extension/package.json index 13db97f64..f17d81853 100644 --- a/extensions/inference-nitro-extension/package.json +++ b/extensions/inference-nitro-extension/package.json @@ -1,7 +1,7 @@ { "name": "@janhq/inference-cortex-extension", "productName": "Cortex Inference Engine", - "version": "1.0.8", + "version": "1.0.9", "description": "This extension embeds cortex.cpp, a lightweight inference engine written in C++. See https://nitro.jan.ai.\nAdditional dependencies could be installed to run without Cuda Toolkit installation.", "main": "dist/index.js", "node": "dist/node/index.cjs.js", diff --git a/extensions/inference-nitro-extension/resources/models/phi3-medium/model.json b/extensions/inference-nitro-extension/resources/models/phi3-medium/model.json new file mode 100644 index 000000000..63dda8f0a --- /dev/null +++ b/extensions/inference-nitro-extension/resources/models/phi3-medium/model.json @@ -0,0 +1,38 @@ +{ + "sources": [ + { + "url": "https://huggingface.co/bartowski/Phi-3-medium-128k-instruct-GGUF/resolve/main/Phi-3-medium-128k-instruct-Q4_K_M.gguf", + "filename": "Phi-3-medium-128k-instruct-Q4_K_M.gguf" + } + ], + "id": "phi3-medium", + "object": "model", + "name": "Phi-3 Medium", + "version": "1.0", + "description": "Phi-3 Medium is Microsoft's latest SOTA model.", + "format": "gguf", + "settings": { + "ctx_len": 128000, + "prompt_template": "<|user|>\n{prompt}<|end|>\n<|assistant|>\n", + "llama_model_path": "Phi-3-medium-128k-instruct-Q4_K_M.gguf", + "ngl": 32 + }, + "parameters": { + "max_tokens": 128000, + "stop": ["<|end|>"], + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "frequency_penalty": 0, + "presence_penalty": 0 + }, + "metadata": { + "author": "Microsoft", + "tags": [ + "7B", + "Finetuned" + ], + "size": 8366000000 + }, + "engine": "nitro" + } \ No newline at end of file From f7c089c7656545dbc5bf326994d7bee62055beee Mon Sep 17 00:00:00 2001 From: Van Pham <64197333+Van-QA@users.noreply.github.com> Date: Wed, 22 May 2024 21:21:02 +0700 Subject: [PATCH 06/13] Bump cortex to 0.4.8 (#2938) --- extensions/inference-nitro-extension/bin/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/inference-nitro-extension/bin/version.txt b/extensions/inference-nitro-extension/bin/version.txt index f90568270..cb498ab2c 100644 --- a/extensions/inference-nitro-extension/bin/version.txt +++ b/extensions/inference-nitro-extension/bin/version.txt @@ -1 +1 @@ -0.4.7 +0.4.8 From 66e65e7c6e96ee3dd75e53769cc32e4f7b7d93d7 Mon Sep 17 00:00:00 2001 From: eckartal <159995642+eckartal@users.noreply.github.com> Date: Fri, 24 May 2024 09:40:38 +0700 Subject: [PATCH 07/13] Update README.md (#2927) Updated: Title: Turn your computer into an AI computer Nvidia -> NVIDIA M1/M2 -> M1/M2/M3/M4 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5c4da2985..313a41004 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Jan - Bring AI to your Desktop +# Jan - Turn your computer into an AI computer ![Jan banner](https://github.com/janhq/jan/assets/89722390/35daac7d-b895-487c-a6ac-6663daaad78e) @@ -25,7 +25,7 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute **Jan runs on any hardware.** From PCs to multi-GPU clusters, Jan supports universal architectures: -- [x] Nvidia GPUs (fast) +- [x] NVIDIA GPUs (fast) - [x] Apple M-series (fast) - [x] Apple Intel - [x] Linux Debian @@ -57,7 +57,7 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute - M1/M2 + M1/M2/M3/M4 @@ -90,7 +90,7 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute - M1/M2 + M1/M2/M3/M4 From c9e8df2cfaeda6d11a45613dfe4fda72e71209e2 Mon Sep 17 00:00:00 2001 From: Mohammed Aldakhil <41828058+Marco-9456@users.noreply.github.com> Date: Fri, 24 May 2024 04:42:27 +0200 Subject: [PATCH 08/13] docs: Update README.md (#2939) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 313a41004..e1622b081 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,8 @@ - Discord

-> ⚠️ **Jan is currently in Development**: Expect breaking changes and bugs! +>[!Warning] +>**Jan is currently in Development**: Expect breaking changes and bugs! Jan is an open-source ChatGPT alternative that runs 100% offline on your computer. From 9cf9fa0dd31bed228bfd472fa6a28c1a78f3e31f Mon Sep 17 00:00:00 2001 From: Van Pham <64197333+Van-QA@users.noreply.github.com> Date: Fri, 24 May 2024 13:01:25 +0700 Subject: [PATCH 09/13] Bump cortex to 0.4.9 (#2940) --- extensions/inference-nitro-extension/bin/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/inference-nitro-extension/bin/version.txt b/extensions/inference-nitro-extension/bin/version.txt index cb498ab2c..76914ddc0 100644 --- a/extensions/inference-nitro-extension/bin/version.txt +++ b/extensions/inference-nitro-extension/bin/version.txt @@ -1 +1 @@ -0.4.8 +0.4.9 From 20c9c3ff2b135923563663b29adffb32f4cabcda Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Fri, 24 May 2024 17:59:44 +0700 Subject: [PATCH 10/13] Code sign retry 3 times (#2943) * Replace deprecated steps github action * Windows codesign retry 3 times --------- Co-authored-by: Hien To --- electron/sign.js | 63 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/electron/sign.js b/electron/sign.js index 73afedc4e..9955e53e8 100644 --- a/electron/sign.js +++ b/electron/sign.js @@ -1,5 +1,28 @@ const { exec } = require('child_process') +function execCommandWithRetry(command, retries = 3) { + return new Promise((resolve, reject) => { + const execute = (attempt) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error(`Error: ${error}`) + if (attempt < retries) { + console.log(`Retrying... Attempt ${attempt + 1}`) + execute(attempt + 1) + } else { + return reject(error) + } + } else { + console.log(`stdout: ${stdout}`) + console.error(`stderr: ${stderr}`) + resolve() + } + }) + } + execute(0) + }) +} + function sign({ path, name, @@ -13,16 +36,9 @@ function sign({ }) { return new Promise((resolve, reject) => { const command = `azuresigntool.exe sign -kvu "${certUrl}" -kvi "${clientId}" -kvt "${tenantId}" -kvs "${clientSecret}" -kvc "${certName}" -tr "${timestampServer}" -v "${path}"` - - exec(command, (error, stdout, stderr) => { - if (error) { - console.error(`Error: ${error}`) - return reject(error) - } - console.log(`stdout: ${stdout}`) - console.error(`stderr: ${stderr}`) - resolve() - }) + execCommandWithRetry(command) + .then(resolve) + .catch(reject) }) } @@ -34,15 +50,20 @@ exports.default = async function (options) { const certName = process.env.AZURE_CERT_NAME const timestampServer = 'http://timestamp.globalsign.com/tsa/r6advanced1' - await sign({ - path: options.path, - name: 'jan-win-x64', - certUrl, - clientId, - tenantId, - clientSecret, - certName, - timestampServer, - version: options.version, - }) + try { + await sign({ + path: options.path, + name: 'jan-win-x64', + certUrl, + clientId, + tenantId, + clientSecret, + certName, + timestampServer, + version: options.version, + }) + } catch (error) { + console.error('Failed to sign after 3 attempts:', error) + process.exit(1) + } } From 25daba9696fd43b164d9b8b4f7ae749bf5140d50 Mon Sep 17 00:00:00 2001 From: Hoang Ha <64120343+hahuyhoang411@users.noreply.github.com> Date: Fri, 24 May 2024 18:10:23 +0700 Subject: [PATCH 11/13] Chore: aya update (#2941) * init * init * fix: correct format * version bump * add: aya 8b, aya 35b, phi3 * fix: stop token * fix: stop token --- .../inference-nitro-extension/package.json | 2 +- .../resources/models/aya-23-35b/model.json | 35 +++++++++++++++++++ .../resources/models/aya-23-8b/model.json | 35 +++++++++++++++++++ .../rollup.config.ts | 8 ++++- 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 extensions/inference-nitro-extension/resources/models/aya-23-35b/model.json create mode 100644 extensions/inference-nitro-extension/resources/models/aya-23-8b/model.json diff --git a/extensions/inference-nitro-extension/package.json b/extensions/inference-nitro-extension/package.json index f17d81853..1903eafef 100644 --- a/extensions/inference-nitro-extension/package.json +++ b/extensions/inference-nitro-extension/package.json @@ -1,7 +1,7 @@ { "name": "@janhq/inference-cortex-extension", "productName": "Cortex Inference Engine", - "version": "1.0.9", + "version": "1.0.10", "description": "This extension embeds cortex.cpp, a lightweight inference engine written in C++. See https://nitro.jan.ai.\nAdditional dependencies could be installed to run without Cuda Toolkit installation.", "main": "dist/index.js", "node": "dist/node/index.cjs.js", diff --git a/extensions/inference-nitro-extension/resources/models/aya-23-35b/model.json b/extensions/inference-nitro-extension/resources/models/aya-23-35b/model.json new file mode 100644 index 000000000..c70c02080 --- /dev/null +++ b/extensions/inference-nitro-extension/resources/models/aya-23-35b/model.json @@ -0,0 +1,35 @@ +{ + "sources": [ + { + "filename": "aya-23-35B-Q4_K_M.gguf", + "url": "https://huggingface.co/bartowski/aya-23-35B-GGUF/resolve/main/aya-23-35B-Q4_K_M.gguf" + } + ], + "id": "aya-23-35b", + "object": "model", + "name": "Aya 23 35B Q4", + "version": "1.0", + "description": "Aya 23 can talk upto 23 languages fluently.", + "format": "gguf", + "settings": { + "ctx_len": 8192, + "prompt_template": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>{system_prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>{prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", + "llama_model_path": "aya-23-35B-Q4_K_M.gguf", + "ngl": 40 + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 8192, + "frequency_penalty": 0, + "presence_penalty": 0, + "stop": ["<|END_OF_TURN_TOKEN|>"] + }, + "metadata": { + "author": "CohereForAI", + "tags": ["34B", "Finetuned"], + "size": 21556982144 + }, + "engine": "nitro" +} diff --git a/extensions/inference-nitro-extension/resources/models/aya-23-8b/model.json b/extensions/inference-nitro-extension/resources/models/aya-23-8b/model.json new file mode 100644 index 000000000..ccb9a6f7f --- /dev/null +++ b/extensions/inference-nitro-extension/resources/models/aya-23-8b/model.json @@ -0,0 +1,35 @@ +{ + "sources": [ + { + "filename": "aya-23-8B-Q4_K_M.gguf", + "url": "https://huggingface.co/bartowski/aya-23-8B-GGUF/resolve/main/aya-23-8B-Q4_K_M.gguf" + } + ], + "id": "aya-23-8b", + "object": "model", + "name": "Aya 23 8B Q4", + "version": "1.0", + "description": "Aya 23 can talk upto 23 languages fluently.", + "format": "gguf", + "settings": { + "ctx_len": 8192, + "prompt_template": "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>{system_prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|USER_TOKEN|>{prompt}<|END_OF_TURN_TOKEN|><|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>", + "llama_model_path": "aya-23-8B-Q4_K_M.gguf", + "ngl": 32 + }, + "parameters": { + "temperature": 0.7, + "top_p": 0.95, + "stream": true, + "max_tokens": 8192, + "frequency_penalty": 0, + "presence_penalty": 0, + "stop": ["<|END_OF_TURN_TOKEN|>"] + }, + "metadata": { + "author": "CohereForAI", + "tags": ["7B", "Finetuned","Featured"], + "size": 5056982144 + }, + "engine": "nitro" +} diff --git a/extensions/inference-nitro-extension/rollup.config.ts b/extensions/inference-nitro-extension/rollup.config.ts index 7c3cc90d7..c28d5b64e 100644 --- a/extensions/inference-nitro-extension/rollup.config.ts +++ b/extensions/inference-nitro-extension/rollup.config.ts @@ -35,6 +35,9 @@ const wizardcoder13bJson = require('./resources/models/wizardcoder-13b/model.jso const yi34bJson = require('./resources/models/yi-34b/model.json') const llama3Json = require('./resources/models/llama3-8b-instruct/model.json') const llama3Hermes8bJson = require('./resources/models/llama3-hermes-8b/model.json') +const aya8bJson = require('./resources/models/aya-23-8b/model.json') +const aya35bJson = require('./resources/models/aya-23-35b/model.json') +const phimediumJson = require('./resources/models/phi3-medium/model.json') export default [ { @@ -76,7 +79,10 @@ export default [ wizardcoder13bJson, yi34bJson, llama3Json, - llama3Hermes8bJson + llama3Hermes8bJson, + phimediumJson, + aya8bJson, + aya35bJson ]), NODE: JSON.stringify(`${packageJson.name}/${packageJson.node}`), DEFAULT_SETTINGS: JSON.stringify(defaultSettingJson), From b1856b689e48bdc0401dd957f9d64785b1c84987 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Mon, 27 May 2024 09:51:18 +0700 Subject: [PATCH 12/13] fix: unchange title and last message when clean or delete message (#2937) --- web/helpers/atoms/ChatMessage.atom.ts | 1 + web/hooks/useDeleteThread.ts | 19 ++++++++--- web/screens/Chat/MessageToolbar/index.tsx | 41 +++++++++++++++++++++-- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/web/helpers/atoms/ChatMessage.atom.ts b/web/helpers/atoms/ChatMessage.atom.ts index d092dd89c..4da22d13a 100644 --- a/web/helpers/atoms/ChatMessage.atom.ts +++ b/web/helpers/atoms/ChatMessage.atom.ts @@ -114,6 +114,7 @@ export const deleteMessageAtom = atom(null, (get, set, id: string) => { newData[threadId] = newData[threadId].filter( (e) => e.id !== id && e.status !== MessageStatus.Error ) + set(chatMessages, newData) } }) diff --git a/web/hooks/useDeleteThread.ts b/web/hooks/useDeleteThread.ts index 62f3a65b5..69e51228f 100644 --- a/web/hooks/useDeleteThread.ts +++ b/web/hooks/useDeleteThread.ts @@ -6,6 +6,7 @@ import { ConversationalExtension, fs, joinPath, + Thread, } from '@janhq/core' import { useAtom, useAtomValue, useSetAtom } from 'jotai' @@ -27,6 +28,7 @@ import { setActiveThreadIdAtom, deleteThreadStateAtom, updateThreadStateLastMessageAtom, + updateThreadAtom, } from '@/helpers/atoms/Thread.atom' export default function useDeleteThread() { @@ -41,6 +43,7 @@ export default function useDeleteThread() { const deleteThreadState = useSetAtom(deleteThreadStateAtom) const updateThreadLastMessage = useSetAtom(updateThreadStateLastMessageAtom) + const updateThread = useSetAtom(updateThreadAtom) const cleanThread = useCallback( async (threadId: string) => { @@ -73,19 +76,27 @@ export default function useDeleteThread() { thread.metadata = { ...thread.metadata, - lastMessage: undefined, } + + const updatedThread: Thread = { + ...thread, + title: 'New Thread', + metadata: { ...thread.metadata, lastMessage: undefined }, + } + await extensionManager .get(ExtensionTypeEnum.Conversational) - ?.saveThread(thread) + ?.saveThread(updatedThread) updateThreadLastMessage(threadId, undefined) + updateThread(updatedThread) }, [ - janDataFolderPath, + cleanMessages, threads, messages, - cleanMessages, updateThreadLastMessage, + updateThread, + janDataFolderPath, ] ) diff --git a/web/screens/Chat/MessageToolbar/index.tsx b/web/screens/Chat/MessageToolbar/index.tsx index 9c62c5d2f..744a8def0 100644 --- a/web/screens/Chat/MessageToolbar/index.tsx +++ b/web/screens/Chat/MessageToolbar/index.tsx @@ -1,3 +1,5 @@ +import { useCallback } from 'react' + import { MessageStatus, ExtensionTypeEnum, @@ -5,6 +7,7 @@ import { ChatCompletionRole, ConversationalExtension, ContentType, + Thread, } from '@janhq/core' import { useAtomValue, useSetAtom } from 'jotai' import { @@ -26,7 +29,11 @@ import { editMessageAtom, getCurrentChatMessagesAtom, } from '@/helpers/atoms/ChatMessage.atom' -import { activeThreadAtom } from '@/helpers/atoms/Thread.atom' +import { + activeThreadAtom, + updateThreadAtom, + updateThreadStateLastMessageAtom, +} from '@/helpers/atoms/Thread.atom' const MessageToolbar = ({ message }: { message: ThreadMessage }) => { const deleteMessage = useSetAtom(deleteMessageAtom) @@ -35,9 +42,19 @@ const MessageToolbar = ({ message }: { message: ThreadMessage }) => { const messages = useAtomValue(getCurrentChatMessagesAtom) const { resendChatMessage } = useSendChatMessage() const clipboard = useClipboard({ timeout: 1000 }) + const updateThreadLastMessage = useSetAtom(updateThreadStateLastMessageAtom) + const updateThread = useSetAtom(updateThreadAtom) - const onDeleteClick = async () => { + const onDeleteClick = useCallback(async () => { deleteMessage(message.id ?? '') + + const lastResponse = messages + .filter( + (msg) => + msg.id !== message.id && msg.role === ChatCompletionRole.Assistant + ) + .slice(-1)[0] + if (thread) { // Should also delete error messages to clear out the error state await extensionManager @@ -48,8 +65,26 @@ const MessageToolbar = ({ message }: { message: ThreadMessage }) => { (msg) => msg.id !== message.id && msg.status !== MessageStatus.Error ) ) + + const updatedThread: Thread = { + ...thread, + metadata: { + ...thread.metadata, + lastMessage: messages.filter( + (msg) => msg.role === ChatCompletionRole.Assistant + )[ + messages.filter((msg) => msg.role === ChatCompletionRole.Assistant) + .length - 1 + ]?.content[0].text.value, + }, + } + + updateThreadLastMessage(thread.id, lastResponse?.content) + + updateThread(updatedThread) } - } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [messages]) const onEditClick = async () => { setEditMessage(message.id ?? '') From 611a3616729c270f83d326139529b5cd96f1f46f Mon Sep 17 00:00:00 2001 From: Van Pham <64197333+Van-QA@users.noreply.github.com> Date: Mon, 27 May 2024 13:15:01 +0700 Subject: [PATCH 13/13] Update package.json to use next@14.2.3 (#2949) --- web/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/package.json b/web/package.json index a654e3a5c..7c2e58e8c 100644 --- a/web/package.json +++ b/web/package.json @@ -29,7 +29,7 @@ "marked": "^9.1.2", "marked-highlight": "^2.0.6", "marked-katex-extension": "^5.0.1", - "next": "14.0.1", + "next": "14.2.3", "next-themes": "^0.2.1", "postcss": "8.4.31", "posthog-js": "^1.95.1",