From dcd36eba9285657b205d5affab9cd4d55f9c0898 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Mon, 4 Mar 2024 22:10:39 +0900 Subject: [PATCH 001/131] fix: re-configure changelog sections --- .../{changelogs => changelog}/README.mdx | 6 +- .../{changelogs => changelog}/cache.json | 2 +- .../changelog-v0.2.0.mdx | 20 +- .../changelog-v0.2.1.mdx | 0 .../changelog-v0.2.2.mdx | 0 .../changelog-v0.2.3.mdx | 0 .../changelog-v0.3.0.mdx | 20 +- .../changelog-v0.3.1.mdx | 0 .../changelog-v0.3.2.mdx | 0 .../changelog-v0.3.3.mdx | 0 .../changelog-v0.4.0.mdx | 128 +++--- .../changelog-v0.4.1.mdx | 102 ++--- .../changelog-v0.4.2.mdx | 78 ++-- .../changelog-v0.4.3.mdx | 116 +++--- .../changelog-v0.4.4.mdx | 374 +++++++++--------- .../changelog-v0.4.5.mdx | 184 ++++----- .../changelog-v0.4.6.mdx | 106 ++--- .../changelog-v0.4.7.mdx | 214 +++++----- docs/docs/guides/changelogs/_category_.json | 8 - 19 files changed, 675 insertions(+), 683 deletions(-) rename docs/docs/guides/{changelogs => changelog}/README.mdx (84%) rename docs/docs/guides/{changelogs => changelog}/cache.json (99%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.2.0.mdx (97%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.2.1.mdx (100%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.2.2.mdx (100%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.2.3.mdx (100%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.3.0.mdx (96%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.3.1.mdx (100%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.3.2.mdx (100%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.3.3.mdx (100%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.0.mdx (98%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.1.mdx (98%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.2.mdx (97%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.3.mdx (98%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.4.mdx (98%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.5.mdx (98%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.6.mdx (98%) rename docs/docs/guides/{changelogs => changelog}/changelog-v0.4.7.mdx (98%) delete mode 100644 docs/docs/guides/changelogs/_category_.json diff --git a/docs/docs/guides/changelogs/README.mdx b/docs/docs/guides/changelog/README.mdx similarity index 84% rename from docs/docs/guides/changelogs/README.mdx rename to docs/docs/guides/changelog/README.mdx index 82e8662ab..be78d1f33 100644 --- a/docs/docs/guides/changelogs/README.mdx +++ b/docs/docs/guides/changelog/README.mdx @@ -1,7 +1,7 @@ --- -title: Changelogs -slug: /guides/changelogs/ -sidebar_position: 12 +title: Changelog +slug: /guides/changelog/ +sidebar_position: 5 description: Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. keywords: [ diff --git a/docs/docs/guides/changelogs/cache.json b/docs/docs/guides/changelog/cache.json similarity index 99% rename from docs/docs/guides/changelogs/cache.json rename to docs/docs/guides/changelog/cache.json index bd6887c56..96aecc521 100644 --- a/docs/docs/guides/changelogs/cache.json +++ b/docs/docs/guides/changelog/cache.json @@ -8469,4 +8469,4 @@ "mentions_count": 8 } ] -} \ No newline at end of file +} diff --git a/docs/docs/guides/changelogs/changelog-v0.2.0.mdx b/docs/docs/guides/changelog/changelog-v0.2.0.mdx similarity index 97% rename from docs/docs/guides/changelogs/changelog-v0.2.0.mdx rename to docs/docs/guides/changelog/changelog-v0.2.0.mdx index dd6e23adb..d5d9b4845 100644 --- a/docs/docs/guides/changelogs/changelog-v0.2.0.mdx +++ b/docs/docs/guides/changelog/changelog-v0.2.0.mdx @@ -1,12 +1,12 @@ ---- -sidebar_position: 16 ---- -# v0.2.0 - -For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.0) - -Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs](https://github.com/janhq/jan/pull/342) - +--- +sidebar_position: 16 +--- +# v0.2.0 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.0) + +Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs](https://github.com/janhq/jan/pull/342) + ## Changes - feat: Add Jan Hacker House event page to Docs @dan-jan (#342) @@ -43,4 +43,4 @@ Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs]( ## Contributor @0xSage, @Its-Alamin-H, @dan-jan, @drakehere, @hiento09, @hientominh, @louis-jan, @namchuai, Hien To and James - + diff --git a/docs/docs/guides/changelogs/changelog-v0.2.1.mdx b/docs/docs/guides/changelog/changelog-v0.2.1.mdx similarity index 100% rename from docs/docs/guides/changelogs/changelog-v0.2.1.mdx rename to docs/docs/guides/changelog/changelog-v0.2.1.mdx diff --git a/docs/docs/guides/changelogs/changelog-v0.2.2.mdx b/docs/docs/guides/changelog/changelog-v0.2.2.mdx similarity index 100% rename from docs/docs/guides/changelogs/changelog-v0.2.2.mdx rename to docs/docs/guides/changelog/changelog-v0.2.2.mdx diff --git a/docs/docs/guides/changelogs/changelog-v0.2.3.mdx b/docs/docs/guides/changelog/changelog-v0.2.3.mdx similarity index 100% rename from docs/docs/guides/changelogs/changelog-v0.2.3.mdx rename to docs/docs/guides/changelog/changelog-v0.2.3.mdx diff --git a/docs/docs/guides/changelogs/changelog-v0.3.0.mdx b/docs/docs/guides/changelog/changelog-v0.3.0.mdx similarity index 96% rename from docs/docs/guides/changelogs/changelog-v0.3.0.mdx rename to docs/docs/guides/changelog/changelog-v0.3.0.mdx index 80449f0aa..65523ae77 100644 --- a/docs/docs/guides/changelogs/changelog-v0.3.0.mdx +++ b/docs/docs/guides/changelog/changelog-v0.3.0.mdx @@ -1,12 +1,12 @@ ---- -sidebar_position: 12 ---- -# v0.3.0 - -For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3.0) - -Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https://github.com/janhq/jan/pull/482) - +--- +sidebar_position: 12 +--- +# v0.3.0 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3.0) + +Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https://github.com/janhq/jan/pull/482) + ## Changes - fix: hide preferences section if empty @louis-jan (#482) @@ -26,4 +26,4 @@ Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https:/ ## Contributor @hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai - + diff --git a/docs/docs/guides/changelogs/changelog-v0.3.1.mdx b/docs/docs/guides/changelog/changelog-v0.3.1.mdx similarity index 100% rename from docs/docs/guides/changelogs/changelog-v0.3.1.mdx rename to docs/docs/guides/changelog/changelog-v0.3.1.mdx diff --git a/docs/docs/guides/changelogs/changelog-v0.3.2.mdx b/docs/docs/guides/changelog/changelog-v0.3.2.mdx similarity index 100% rename from docs/docs/guides/changelogs/changelog-v0.3.2.mdx rename to docs/docs/guides/changelog/changelog-v0.3.2.mdx diff --git a/docs/docs/guides/changelogs/changelog-v0.3.3.mdx b/docs/docs/guides/changelog/changelog-v0.3.3.mdx similarity index 100% rename from docs/docs/guides/changelogs/changelog-v0.3.3.mdx rename to docs/docs/guides/changelog/changelog-v0.3.3.mdx diff --git a/docs/docs/guides/changelogs/changelog-v0.4.0.mdx b/docs/docs/guides/changelog/changelog-v0.4.0.mdx similarity index 98% rename from docs/docs/guides/changelogs/changelog-v0.4.0.mdx rename to docs/docs/guides/changelog/changelog-v0.4.0.mdx index b473ef082..9d81d0a00 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.0.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.0.mdx @@ -7,68 +7,68 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #878: bug: fix tag description showing a title and fix card right panel](https://github.com/janhq/jan/pull/878) -## Changes - -- bug: fix tag description showing a title and fix card right panel @urmauur (#878) -- fix/no-assistant-available-fresh-install @louis-jan (#876) -- Model.json update @hahuyhoang411 (#870) -- Hotfix desc for openhermes @hahuyhoang411 (#864) -- Openhermes update v1 @hahuyhoang411 (#863) -- update deepseek 1.3b @hahuyhoang411 (#858) -- Update tags @hahuyhoang411 (#857) -- Update model hub @hahuyhoang411 (#829) -- hotfix: fix typo @tikikun (#836) -- chore: pre-populate Jan's /models folder with model.jsons @hahuyhoang411 (#775) -- chore: clarification changes to the model settings and model parameters @tikikun (#742) - -## 🚀 Features - -- feat: revamp landing page @urmauur (#745) -- feat : add cover image model hub screen @urmauur (#872) -- feat: boilerplate for express server localhost 1337 @linhtran174 (#803) -- enhancement: revamp hub screen @urmauur (#825) -- feat: revamp thread screen @urmauur (#802) -- docs/update-api-reference @hieu-jan (#739) -- refactor: model plugin to follow new specs @namchuai (#682) - -## 🐛 Fixes - -- fix: Nitro interface update to prevent warning @vuonghoainam (#877) -- fix: delete message break the entire thread @louis-jan (#869) -- fix: can not download multiple models at once @louis-jan (#867) -- fix: production CI workflow does not populate models @louis-jan (#862) -- fix: update wrong main view state when use a model @namchuai (#861) -- fix: handle crash issue on hljs highlighting @louis-jan (#859) -- fix: empty assistant instruction by default @louis-jan (#855) -- bug: fix broken banner position hub screen @urmauur (#846) -- fix: not update active model when using resend button @namchuai (#834) -- Hotfix jan windows download nitro failed @hiento09 (#838) -- Switch to download nitro .tar.gz file instead of .zip file on windows @hiento09 (#832) -- fix/docusaurus-seo @hieu-jan (#818) -- fix: CI script - reorder copy models action @louis-jan (#819) -- fix: messages sync is not threadsafe @louis-jan (#784) -- Fix Makefile Indentation Issue @hiento09 (#788) - -## 🧰 Maintenance - -- chore: update model ranking @louis-jan (#874) -- Bump nitro version to 0.1.21 - nitro has windows codesign @hiento09 (#843) -- Hotfix jan windows download nitro failed @hiento09 (#838) -- 810 docs add modeljson and revamp models specs page @tikikun (#816) -- Add document for nightly build and update message for manual build @hiento09 (#831) -- chore: Bump nitro to 0.1.20 @vuonghoainam (#830) -- Refactor build:extension command @hiento09 (#822) -- feat: pre-populate Jan's /models folder @namchuai (#796) -- chore: fix pr auto labeling @0xSage (#812) -- chore: add gi automations @0xSage (#809) -- refactor: jan extensions @louis-jan (#799) -- Remove .zip in artifact name @hiento09 (#800) -- docs/update-api-reference @hieu-jan (#739) -- Add nightly build ci @hiento09 (#794) -- Fix Makefile Indentation Issue @hiento09 (#788) -- Switch from .zip to .tar.gz for nitro url inference plugin @hiento09 (#781) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam +## Changes + +- bug: fix tag description showing a title and fix card right panel @urmauur (#878) +- fix/no-assistant-available-fresh-install @louis-jan (#876) +- Model.json update @hahuyhoang411 (#870) +- Hotfix desc for openhermes @hahuyhoang411 (#864) +- Openhermes update v1 @hahuyhoang411 (#863) +- update deepseek 1.3b @hahuyhoang411 (#858) +- Update tags @hahuyhoang411 (#857) +- Update model hub @hahuyhoang411 (#829) +- hotfix: fix typo @tikikun (#836) +- chore: pre-populate Jan's /models folder with model.jsons @hahuyhoang411 (#775) +- chore: clarification changes to the model settings and model parameters @tikikun (#742) + +## 🚀 Features + +- feat: revamp landing page @urmauur (#745) +- feat : add cover image model hub screen @urmauur (#872) +- feat: boilerplate for express server localhost 1337 @linhtran174 (#803) +- enhancement: revamp hub screen @urmauur (#825) +- feat: revamp thread screen @urmauur (#802) +- docs/update-api-reference @hieu-jan (#739) +- refactor: model plugin to follow new specs @namchuai (#682) + +## 🐛 Fixes + +- fix: Nitro interface update to prevent warning @vuonghoainam (#877) +- fix: delete message break the entire thread @louis-jan (#869) +- fix: can not download multiple models at once @louis-jan (#867) +- fix: production CI workflow does not populate models @louis-jan (#862) +- fix: update wrong main view state when use a model @namchuai (#861) +- fix: handle crash issue on hljs highlighting @louis-jan (#859) +- fix: empty assistant instruction by default @louis-jan (#855) +- bug: fix broken banner position hub screen @urmauur (#846) +- fix: not update active model when using resend button @namchuai (#834) +- Hotfix jan windows download nitro failed @hiento09 (#838) +- Switch to download nitro .tar.gz file instead of .zip file on windows @hiento09 (#832) +- fix/docusaurus-seo @hieu-jan (#818) +- fix: CI script - reorder copy models action @louis-jan (#819) +- fix: messages sync is not threadsafe @louis-jan (#784) +- Fix Makefile Indentation Issue @hiento09 (#788) + +## 🧰 Maintenance + +- chore: update model ranking @louis-jan (#874) +- Bump nitro version to 0.1.21 - nitro has windows codesign @hiento09 (#843) +- Hotfix jan windows download nitro failed @hiento09 (#838) +- 810 docs add modeljson and revamp models specs page @tikikun (#816) +- Add document for nightly build and update message for manual build @hiento09 (#831) +- chore: Bump nitro to 0.1.20 @vuonghoainam (#830) +- Refactor build:extension command @hiento09 (#822) +- feat: pre-populate Jan's /models folder @namchuai (#796) +- chore: fix pr auto labeling @0xSage (#812) +- chore: add gi automations @0xSage (#809) +- refactor: jan extensions @louis-jan (#799) +- Remove .zip in artifact name @hiento09 (#800) +- docs/update-api-reference @hieu-jan (#739) +- Add nightly build ci @hiento09 (#794) +- Fix Makefile Indentation Issue @hiento09 (#788) +- Switch from .zip to .tar.gz for nitro url inference plugin @hiento09 (#781) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam diff --git a/docs/docs/guides/changelogs/changelog-v0.4.1.mdx b/docs/docs/guides/changelog/changelog-v0.4.1.mdx similarity index 98% rename from docs/docs/guides/changelogs/changelog-v0.4.1.mdx rename to docs/docs/guides/changelog/changelog-v0.4.1.mdx index a49b3b87c..c1dc19d13 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.1.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.1.mdx @@ -7,55 +7,55 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #903: Update README.md](https://github.com/janhq/jan/pull/903) -## Changes - -- Update README.md @imtuyethan (#903) - -## 🚀 Features - -- feat: Kill nitro process with API - nitro 0.1.27 @vuonghoainam (#975) -- feat: Inference Nitro with Prompt Template @hahuyhoang411 (#952) -- feat: Add NVIDIA triton trt-llm extension @vuonghoainam (#888) -- feat: Hotfit for Nitro loading on CPU with hyper-threading support @vuonghoainam (#931) -- feat: adding model params @namchuai (#886) -- feat: Multiple inference engines for nitro and openai @vuonghoainam (#814) -- docs: add json schema for engine and model parameters @tikikun (#840) -- feat: improve SEO keywords @hieu-jan (#894) -- enhancement: fix spacing landing page responsive @urmauur (#891) -- bug: added label coming soon for windows and linux @urmauur (#881) - -## 🐛 Fixes - -- fix: 963 can not run openai models on windows @louis-jan (#974) -- fix: Inference engine Nitro with Windows with/ without CUDA @vuonghoainam (#950) -- Fix error Jan app linux crash @hiento09 (#958) -- fix: windows bug - control buttons close,max,min hidden @linhtran174 (#949) -- bug: fix ui landing page @urmauur (#937) -- fix: model parameters for inference extensions @vuonghoainam (#935) -- [bug] Fix floating border outside card right panel @urmauur (#934) -- fix: import\_typescript.default.isTokenKind is not a function @louis-jan (#923) -- bug: fix syntax formatting @urmauur (#899) -- bug: update metadata title and desc @urmauur (#884) -- fix: download button text color is blending into the background @louis-jan (#883) - -## 🧰 Maintenance - -- chore: add desktop app analytics @louis-jan (#978) -- refactor: clean types and interfaces @0xSage (#966) -- docs: scaffold dev docs @0xSage (#856) -- chore: Bump nitro to 0.1.26 @vuonghoainam (#960) -- Update update-release-url.yml @hiento09 (#951) -- Fix update release url pipeline run failed @hiento09 (#947) -- chore: Bumpt nitro bin version to version 0.1.23 @vuonghoainam (#942) -- Fix update release url pipeline @hiento09 (#941) -- CI automatically update Update README with Nightly Build Information and stable download URL @hiento09 (#940) -- refactor: deprecate invokers - auto proxying apis - strict types @louis-jan (#924) -- docs: standardize yaml files @hieu-jan (#933) -- chore: universal module definition @louis-jan (#902) -- docs: add assistants api reference @hieu-jan (#801) -- docs: add json schema for engine and model parameters @tikikun (#840) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @jan-service-account, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam +## Changes + +- Update README.md @imtuyethan (#903) + +## 🚀 Features + +- feat: Kill nitro process with API - nitro 0.1.27 @vuonghoainam (#975) +- feat: Inference Nitro with Prompt Template @hahuyhoang411 (#952) +- feat: Add NVIDIA triton trt-llm extension @vuonghoainam (#888) +- feat: Hotfit for Nitro loading on CPU with hyper-threading support @vuonghoainam (#931) +- feat: adding model params @namchuai (#886) +- feat: Multiple inference engines for nitro and openai @vuonghoainam (#814) +- docs: add json schema for engine and model parameters @tikikun (#840) +- feat: improve SEO keywords @hieu-jan (#894) +- enhancement: fix spacing landing page responsive @urmauur (#891) +- bug: added label coming soon for windows and linux @urmauur (#881) + +## 🐛 Fixes + +- fix: 963 can not run openai models on windows @louis-jan (#974) +- fix: Inference engine Nitro with Windows with/ without CUDA @vuonghoainam (#950) +- Fix error Jan app linux crash @hiento09 (#958) +- fix: windows bug - control buttons close,max,min hidden @linhtran174 (#949) +- bug: fix ui landing page @urmauur (#937) +- fix: model parameters for inference extensions @vuonghoainam (#935) +- [bug] Fix floating border outside card right panel @urmauur (#934) +- fix: import\_typescript.default.isTokenKind is not a function @louis-jan (#923) +- bug: fix syntax formatting @urmauur (#899) +- bug: update metadata title and desc @urmauur (#884) +- fix: download button text color is blending into the background @louis-jan (#883) + +## 🧰 Maintenance + +- chore: add desktop app analytics @louis-jan (#978) +- refactor: clean types and interfaces @0xSage (#966) +- docs: scaffold dev docs @0xSage (#856) +- chore: Bump nitro to 0.1.26 @vuonghoainam (#960) +- Update update-release-url.yml @hiento09 (#951) +- Fix update release url pipeline run failed @hiento09 (#947) +- chore: Bumpt nitro bin version to version 0.1.23 @vuonghoainam (#942) +- Fix update release url pipeline @hiento09 (#941) +- CI automatically update Update README with Nightly Build Information and stable download URL @hiento09 (#940) +- refactor: deprecate invokers - auto proxying apis - strict types @louis-jan (#924) +- docs: standardize yaml files @hieu-jan (#933) +- chore: universal module definition @louis-jan (#902) +- docs: add assistants api reference @hieu-jan (#801) +- docs: add json schema for engine and model parameters @tikikun (#840) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @jan-service-account, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam diff --git a/docs/docs/guides/changelogs/changelog-v0.4.2.mdx b/docs/docs/guides/changelog/changelog-v0.4.2.mdx similarity index 97% rename from docs/docs/guides/changelogs/changelog-v0.4.2.mdx rename to docs/docs/guides/changelog/changelog-v0.4.2.mdx index 76ba8ab0d..f5c39d1e3 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.2.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.2.mdx @@ -7,43 +7,43 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1033: Hotfix model hub](https://github.com/janhq/jan/pull/1033) -## Changes - -- Hotfix model hub @hahuyhoang411 (#1033) -- Update Model.json @hahuyhoang411 (#1005) - -## 🚀 Features - -- feat: app theme depend on local storage instead native theme electron @urmauur (#1014) -- feat: move stop inference button into the send button @urmauur (#1011) -- feat: loader when starting model @urmauur (#945) -- fix: enable download app linux @urmauur (#993) -- fix: remove coming soon windows @urmauur (#986) - -## 🐛 Fixes - -- fix: migrate new models @louis-jan (#1034) -- fix: add input for api key remote model @urmauur (#1031) -- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) -- fix: delete first message then regenerate again will break the thread @louis-jan (#1015) -- fix: #995 - Fix onboarding state and model sorting @louis-jan (#1009) -- fix: limit analytics events capture @louis-jan (#1012) -- fix: wrong selected model right panel @urmauur (#1001) -- fix: review finder and view as json @louis-jan (#1000) -- fix: enable download app linux @urmauur (#993) - -## 🧰 Maintenance - -- chore: remigrate if there is no models dir @louis-jan (#1038) -- bump nitro version to 0.1.30 @hiento09 (#1036) -- chore: in app copy fixes @0xSage (#1032) -- Separate posthog project for jan app and docs @hiento09 (#1029) -- Update posthog capture url list @hiento09 (#1022) -- docs: second half of "import model docs" PR @0xSage (#1021) -- docs: how to import models @0xSage (#1020) -- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @jan-service-account, @louis-jan and @urmauur +## Changes + +- Hotfix model hub @hahuyhoang411 (#1033) +- Update Model.json @hahuyhoang411 (#1005) + +## 🚀 Features + +- feat: app theme depend on local storage instead native theme electron @urmauur (#1014) +- feat: move stop inference button into the send button @urmauur (#1011) +- feat: loader when starting model @urmauur (#945) +- fix: enable download app linux @urmauur (#993) +- fix: remove coming soon windows @urmauur (#986) + +## 🐛 Fixes + +- fix: migrate new models @louis-jan (#1034) +- fix: add input for api key remote model @urmauur (#1031) +- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) +- fix: delete first message then regenerate again will break the thread @louis-jan (#1015) +- fix: #995 - Fix onboarding state and model sorting @louis-jan (#1009) +- fix: limit analytics events capture @louis-jan (#1012) +- fix: wrong selected model right panel @urmauur (#1001) +- fix: review finder and view as json @louis-jan (#1000) +- fix: enable download app linux @urmauur (#993) + +## 🧰 Maintenance + +- chore: remigrate if there is no models dir @louis-jan (#1038) +- bump nitro version to 0.1.30 @hiento09 (#1036) +- chore: in app copy fixes @0xSage (#1032) +- Separate posthog project for jan app and docs @hiento09 (#1029) +- Update posthog capture url list @hiento09 (#1022) +- docs: second half of "import model docs" PR @0xSage (#1021) +- docs: how to import models @0xSage (#1020) +- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @jan-service-account, @louis-jan and @urmauur diff --git a/docs/docs/guides/changelogs/changelog-v0.4.3.mdx b/docs/docs/guides/changelog/changelog-v0.4.3.mdx similarity index 98% rename from docs/docs/guides/changelogs/changelog-v0.4.3.mdx rename to docs/docs/guides/changelog/changelog-v0.4.3.mdx index 054b6595d..c40af7baf 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.3.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.3.mdx @@ -7,62 +7,62 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1159: Hotfix Prompt template for models on the Hub](https://github.com/janhq/jan/pull/1159) -## Changes - -- Hotfix Prompt template for models on the Hub @hahuyhoang411 (#1159) -- Update model list for new release @hahuyhoang411 (#1143) -- fix(Thread): #1119 focus on the first thread to prevent blank chat screen @namchuai (#1127) -- fix(Thread): #1064 message being added to wrong thread if switching thread @namchuai (#1108) -- fix(Thread): #1042 allow create new thread by clicking Use in Jan Hub @namchuai (#1103) -- feat(ModelSetting): #1065 update state of model setting between threads @namchuai (#1090) -- Update model version @hahuyhoang411 (#1086) -- fix: cache hallucinations and failed to load model due to race condition @louis-jan (#1071) -- fix(thread): #1043 default model to prefer active model @namchuai (#1070) -- Update issue templates @0xSage (#1058) -- Update ctx\_len and max\_tokens @hahuyhoang411 (#1035) - -## 🚀 Features - -- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) -- Feature autoupdater for nightly build @hiento09 (#1068) -- feat: copy button for code block @urmauur (#1062) -- Enhancements to Dependency Installation and App Testing @hiento09 (#965) - -## 🐛 Fixes - -- fix: error road map url @hieu-jan (#1153) -- Fix token speed slow in machine has multi gpus @hiento09 (#1157) -- fix: added dialog confirmation clean thread @urmauur (#1142) -- fix: remove remote model from shortcut models dialog @urmauur (#1124) -- fix: ui issue - all models are activated @louis-jan (#1120) -- fix: should not hide empty message away @louis-jan (#1116) -- fix: added tooltip for user cannot change model after starting thread @urmauur (#1115) -- fix: remote model always active badges @urmauur (#1113) -- fix: handle chat completion state with enter button @louis-jan (#1114) -- fix: model active indicator only show when model activated @urmauur (#1110) -- fix: #1096 yield error message upon thread switching @louis-jan (#1109) -- fix: toaster success deleted thread showing id instead of active model @urmauur (#1111) -- fix: update copy setting page @urmauur (#1105) -- fix: search recommended model @urmauur (#1106) -- fix: #1097 streaming response is replaced by error message @louis-jan (#1099) -- Fix auto update windows Bug @hiento09 (#1102) -- fix: added dialog confirmation when delete thread @urmauur (#1093) -- fix: system monitor broken layout when responsive @urmauur (#1085) -- bug: chatbox doesn't resize back down @urmauur (#1084) -- fix: thread is broken after deleted first generated message @louis-jan (#1061) - -## 🧰 Maintenance - -- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) -- docs: refactor dev docs, guides and specs @0xSage (#1092) -- Correct jq command cause ci nightly build run failed @hiento09 (#1104) -- Fix nightly build autoupdater @hiento09 (#1073) -- Feature autoupdater for nightly build @hiento09 (#1068) -- docs: Update product.md @0xSage (#1066) -- Posthog disable click event and increase timeout for nitro load model… @hiento09 (#1060) -- docs: improve quickstart docs @0xSage (#1047) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai and @urmauur +## Changes + +- Hotfix Prompt template for models on the Hub @hahuyhoang411 (#1159) +- Update model list for new release @hahuyhoang411 (#1143) +- fix(Thread): #1119 focus on the first thread to prevent blank chat screen @namchuai (#1127) +- fix(Thread): #1064 message being added to wrong thread if switching thread @namchuai (#1108) +- fix(Thread): #1042 allow create new thread by clicking Use in Jan Hub @namchuai (#1103) +- feat(ModelSetting): #1065 update state of model setting between threads @namchuai (#1090) +- Update model version @hahuyhoang411 (#1086) +- fix: cache hallucinations and failed to load model due to race condition @louis-jan (#1071) +- fix(thread): #1043 default model to prefer active model @namchuai (#1070) +- Update issue templates @0xSage (#1058) +- Update ctx\_len and max\_tokens @hahuyhoang411 (#1035) + +## 🚀 Features + +- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) +- Feature autoupdater for nightly build @hiento09 (#1068) +- feat: copy button for code block @urmauur (#1062) +- Enhancements to Dependency Installation and App Testing @hiento09 (#965) + +## 🐛 Fixes + +- fix: error road map url @hieu-jan (#1153) +- Fix token speed slow in machine has multi gpus @hiento09 (#1157) +- fix: added dialog confirmation clean thread @urmauur (#1142) +- fix: remove remote model from shortcut models dialog @urmauur (#1124) +- fix: ui issue - all models are activated @louis-jan (#1120) +- fix: should not hide empty message away @louis-jan (#1116) +- fix: added tooltip for user cannot change model after starting thread @urmauur (#1115) +- fix: remote model always active badges @urmauur (#1113) +- fix: handle chat completion state with enter button @louis-jan (#1114) +- fix: model active indicator only show when model activated @urmauur (#1110) +- fix: #1096 yield error message upon thread switching @louis-jan (#1109) +- fix: toaster success deleted thread showing id instead of active model @urmauur (#1111) +- fix: update copy setting page @urmauur (#1105) +- fix: search recommended model @urmauur (#1106) +- fix: #1097 streaming response is replaced by error message @louis-jan (#1099) +- Fix auto update windows Bug @hiento09 (#1102) +- fix: added dialog confirmation when delete thread @urmauur (#1093) +- fix: system monitor broken layout when responsive @urmauur (#1085) +- bug: chatbox doesn't resize back down @urmauur (#1084) +- fix: thread is broken after deleted first generated message @louis-jan (#1061) + +## 🧰 Maintenance + +- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) +- docs: refactor dev docs, guides and specs @0xSage (#1092) +- Correct jq command cause ci nightly build run failed @hiento09 (#1104) +- Fix nightly build autoupdater @hiento09 (#1073) +- Feature autoupdater for nightly build @hiento09 (#1068) +- docs: Update product.md @0xSage (#1066) +- Posthog disable click event and increase timeout for nitro load model… @hiento09 (#1060) +- docs: improve quickstart docs @0xSage (#1047) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai and @urmauur diff --git a/docs/docs/guides/changelogs/changelog-v0.4.4.mdx b/docs/docs/guides/changelog/changelog-v0.4.4.mdx similarity index 98% rename from docs/docs/guides/changelogs/changelog-v0.4.4.mdx rename to docs/docs/guides/changelog/changelog-v0.4.4.mdx index c941f41d4..bf179a8f4 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.4.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.4.mdx @@ -7,191 +7,191 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1587: Update 2023-11-05-hello-world.md](https://github.com/janhq/jan/pull/1587) -## Changes - -- Update 2023-11-05-hello-world.md @Ssstars (#1587) -- fix(API): #1511 update swagger page @namchuai (#1572) -- fix(Thread): #1212 thread.json not created when user change thread settings @namchuai (#1570) -- fix(Thread): #1336 not allow creating too many unfinished thread @namchuai (#1538) -- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1555) -- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1553) -- Update 02-embracing-pod-structure.mdx @Ssstars (#1550) -- Update 01-how-we-hire.mdx @Ssstars (#1551) -- Update 01-how-we-hire.mdx @Ssstars (#1524) -- fix(InferenceExtension): #1067 sync the nitro process state @namchuai (#1493) -- fix(Messages): #1434 create message via api does not display on app correctly @namchuai (#1479) -- Docs for the Integration of Continue and Jan in VSCode @0xgokuz (#1467) -- Chore: Update model.json for UI @hahuyhoang411 (#1448) -- Docs for Installing Models from Hub @0xgokuz (#1450) -- Update about.md @Ssstars (#1436) -- feat(UI): #1404 make left side bar collapsible by hot key @namchuai (#1420) -- docs: Typo in 06-hardware.md @akaMrNagar (#1408) -- fix(API): #1409 fix wrong prefix for threads api @namchuai (#1410) -- Update model hub @hahuyhoang411 (#1383) -- fix(Model): remove unsupported default model setting params @namchuai (#1382) -- fix(trinity): update cover path for trinity v1.2 @hahuyhoang411 (#1380) -- Chore/update model hub @hahuyhoang411 (#1342) -- Update about.md @Ssstars (#1359) -- fix(JanHub): #1158 sort model list @namchuai (#1257) -- fix(Message): open link with external browser @namchuai (#1339) -- feat(Model): #1028 made model.json optional @namchuai (#1314) -- docs: Update onboarding.md @Diane0111 (#1293) -- fix: clean resource on exit @louis-jan (#1290) -- fix: posthog configuration @hieu-jan (#1283) -- docs: update README.md @eltociear (#1277) -- Enable scrolling in the message chat box @Gri-ffin (#1280) -- chore: Update README.md @sr-albert (#1263) -- Adding new model to the Hub @hahuyhoang411 (#1213) -- Feature GPU detection for Jan on Windows and Linux @hiento09 (#1242) -- fix(Thread): #1168 fix newly created thread cannot select model after restart @namchuai (#1176) - -## 🚀 Features - -- feat: add compatibility tag to model selection in right panel @urmauur (#1552) -- Feature integrate antivirus scanner to ci @hiento09 (#1529) -- feat: [hub] update compatibility tags colors @urmauur (#1516) -- feat: hub recommendation labels @urmauur (#1440) -- Feature linux support app image format @hiento09 (#1442) -- fix: render external links @urmauur (#1441) -- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) -- feat(UI): update UI footer @urmauur (#1424) -- Fix Bug for Chat Reply Goes off Screen @mishrababhishek (#1393) -- feat: move social media from left panel into footer @urmauur (#1325) -- feat: implementation new UI thread settings @urmauur (#1301) -- Bring social media links @Gri-ffin (#1295) -- feat: added keyboard shortcut list in setting page @urmauur (#1275) -- feat: add swagger /docs to localhost:1337 @louis-jan (#1268) -- feat: update posthog configuration @hieu-jan (#1258) -- feat: Deprecate model.json ready state in favor of .download ext @louis-jan (#1238) -- feat: add engine settings @namchuai (#1199) -- feat: users should be able to switch models mid-thread @louis-jan (#1226) -- feat: temporary link how to import model @urmauur (#1209) - -## 🐛 Fixes - -- fix: #1594 - Model settings - change thread model - go back does not see according settings @louis-jan (#1595) -- fix: #1548 - duplicate command shortcut instruction @louis-jan (#1600) -- fix: switch model caused app crash @louis-jan (#1597) -- fix: #1559 Inference Parameters displayed on new thread with Openai GPT Model @louis-jan (#1588) -- fix: enable user set value manually model setting from input @urmauur (#1585) -- fix: #1569 - Does not apply thread settings when loading model @louis-jan (#1576) -- fix: could not change model params settings @louis-jan (#1547) -- fix: gpu check module export does not work in extension @louis-jan (#1536) -- fix: adjust calculation hub labels using total RAM instead remaining RAM @urmauur (#1522) -- Feature integrate antivirus scanner to ci @hiento09 (#1529) -- fix: allow users to set max tokens variably @urmauur (#1513) -- fix: stop word update @louis-jan (#1457) -- Revert nitro to 0.2.6 @hiento09 (#1491) -- fix: enable text selection codeblock @urmauur (#1466) -- fix: suppress all main node JS error message dialog @louis-jan (#1460) -- Correct AppImage path @hiento09 (#1446) -- fix: render external links @urmauur (#1441) -- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) -- fix: GET /models does not work due to new default model dir @louis-jan (#1392) -- fix: model migration stopped working @louis-jan (#1378) -- fix: wrong condition for displaying error message @louis-jan (#1376) -- fix: show hide section engine params @urmauur (#1374) -- fix: copy stream tooltip and hide section when no params setting @urmauur (#1373) -- bugs: fix stop streaming when user delete or clean thread @urmauur (#1347) -- fix: show a proper error message on download failure @louis-jan (#1345) -- Add detect cuda version jan app @hiento09 (#1351) -- fix: Error occurred: Unexpected token "d", "data: ..." is not a valid JSON @louis-jan (#1332) -- fix: app getting stuck at downloading 99% while downloading model @louis-jan (#1320) -- correct type utf-8 @hiento09 (#1311) -- Fix memory on mac included cached and swap @hiento09 (#1298) -- fix: should check app dir before spawning log @louis-jan (#1297) -- fix: disable process logging from server @louis-jan (#1296) -- fix: user should be able to access Swagger docs from localhost:1337 @louis-jan (#1292) -- Switch from Gigabyte to Gibibyte - System monitor @hiento09 (#1286) -- Switch from systeminformation to os-utils to resolve Bitdefender false positive and memory leak issue @hiento09 (#1282) -- fix: swagger CSP issue @louis-jan (#1284) -- fix: support markdown break line @urmauur (#1274) -- fix ci test run failed @hiento09 (#1267) -- Fix wrong linux nitro path @hiento09 (#1266) -- fix: enable command enter on dialog confirmation clean thread @urmauur (#1261) -- fix: input message duplicated due with some input sources @louis-jan (#1259) -- fix: mac users should not see GPU settings @louis-jan (#1255) -- fix: remove redundant gpu detection prompt event @louis-jan (#1254) -- fix: engine settings GUI - feature toggle @louis-jan (#1252) -- Fix bug #1178 high ram on windows @hiento09 (#1241) -- fix: #1183 Reveal in finder does not work on windows @namchuai (#1239) -- fix: remove delay tooltip and click event @urmauur (#1217) -- fix: enable enter command on dialog confirmation delete thread @urmauur (#1218) -- fix: Cleared thread last message is not updated @louis-jan (#1225) -- Fix switch thread crash nitro windows linux @hiento09 (#1214) -- fix: darkmode broken color @urmauur (#1186) - -## 🧰 Maintenance - -- chore: typo model.json @louis-jan (#1599) -- docs: add 04-how-to-get-error-logs.mdx @hieu-jan (#1580) -- chore: teach how to attach logs @0xSage (#1578) -- chore: issues should auto close with PRs through template @0xSage (#1577) -- chore: Update issue templates @0xSage (#1568) -- docs: fix x handles @0xSage (#1532) -- Docs to integrate OpenRouter with Jan without UI/UX @0xgokuz (#1495) -- chore: fix darkmode docs @hieu-jan (#1520) -- docs: fix algolia configuration @hieu-jan (#1518) -- docs: fix algolia configuration @hieu-jan (#1517) -- Revert URL release in readme to version 0.4.3 @hiento09 (#1502) -- refactor: add app and nitro log - resolve dependencies issue @louis-jan (#1447) -- chore: enable agolia @hieu-jan (#1497) -- docs: update troubleshooting and redirects old pages @hieu-jan (#1492) -- docs: minor fix @hieu-jan (#1478) -- docs: initial handbook structure @hieu-jan (#1477) -- Bump nitro to 0.2.8 and change Jan App to support cuda >= 11.7 @hiento09 (#1476) -- Chore update docs jan - add AppImage instruction to docusaurus @hiento09 (#1480) -- Bump nitro to 0.2.7 @hiento09 (#1474) -- chore: error message update @louis-jan (#1473) -- docs: Update 02-import-manually.mdx @0xSage (#1469) -- docs: Update about.md @0xSage (#1465) -- Bump nitro version to 0.2.6 @hiento09 (#1458) -- docs: adding customize engine settings @hieu-jan (#1455) -- docs: add-missing-path @hieu-jan (#1454) -- docs: resize gif @hieu-jan (#1453) -- docs: revenue philosophy @0xSage (#1443) -- docs: jan framework principles @0xSage (#1438) -- docs: fix typo in docs @hieu-jan (#1419) -- chore: clean up use os hook @namchuai (#1418) -- docs: explain each docs page intent @0xSage (#1417) -- docs: Update 01-server.md @0xSage (#1416) -- Update warning url from github md file to jan.ai docs site @hiento09 (#1414) -- docs: improve gpu not used guide @hieu-jan (#1405) -- chore: update README.md @eltociear (#1406) -- Update USAGE docs for linux @hiento09 (#1401) -- docs: gpu not detected @0xSage (#1399) -- docs: Troubleshoot Failed To Fetch @gabrielle-ong (#1398) -- docs: improve docs syntax @hieu-jan (#1394) -- docs: add-install-nightly-guide @hieu-jan (#1390) -- docs: correct href link @hieu-jan (#1338) -- docs: fix chat payload and cURL @hieu-jan (#1360) -- docs: add Chatting Guide @hieu-jan (#1184) -- Chore add docs usage how to switch run mode jan app @hiento09 (#1353) -- docs: configure index page @hieu-jan (#1330) -- docs: Update product.md @0xSage (#1326) -- docs: Update 01-server.md @0xSage (#1327) -- refactor: deprecate the appVersion IPC and use the predefined VERSION @louis-jan (#1309) -- docs: update using models documentation @hieu-jan (#1288) -- docs: update pm handbook @0xSage (#1307) -- docs: contributor docs overview @0xSage (#1305) -- chore: github PR template @0xSage (#1304) -- Fix memory on mac included cached and swap @hiento09 (#1298) -- Enrich discord message for nightly build url @hiento09 (#1294) -- Refactor CI by create shared jobs output @hiento09 (#1287) -- docs: update README.md @hieu-jan (#1281) -- docs: Update README.md @0xSage (#1248) -- feat: Jan Server, API and decoupled clients @louis-jan (#948) -- docs: improve 02-import-manually @hieu-jan (#1222) -- chore: Update issue templates @0xSage (#1229) -- docs: Update 02-import-manually.mdx @0xSage (#1197) -- add sleep 500ms if platform is windows before starting nitro process @hiento09 (#1215) -- docs: improve troubleshoot documentation @hieu-jan (#1173) -- docs: update bug report template @hieu-jan (#1180) -- docs: add troubleshooting @hieu-jan (#1169) -- chore: copy fixes @0xSage (#1167) -- docs: Update 01-start-thread.md @0xSage (#1122) - -## Contributor - -@0xSage, @0xgokuz, @Diane0111, @Gri-ffin, @Ssstars, @akaMrNagar, @eltociear, @gabrielle-ong, @hahuyhoang411, @hiento09, @hieu-jan, @jan-service-account, @louis-jan, @mishrababhishek, @namchuai, @sr-albert, @urmauur and Abhishek Mishra +## Changes + +- Update 2023-11-05-hello-world.md @Ssstars (#1587) +- fix(API): #1511 update swagger page @namchuai (#1572) +- fix(Thread): #1212 thread.json not created when user change thread settings @namchuai (#1570) +- fix(Thread): #1336 not allow creating too many unfinished thread @namchuai (#1538) +- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1555) +- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1553) +- Update 02-embracing-pod-structure.mdx @Ssstars (#1550) +- Update 01-how-we-hire.mdx @Ssstars (#1551) +- Update 01-how-we-hire.mdx @Ssstars (#1524) +- fix(InferenceExtension): #1067 sync the nitro process state @namchuai (#1493) +- fix(Messages): #1434 create message via api does not display on app correctly @namchuai (#1479) +- Docs for the Integration of Continue and Jan in VSCode @0xgokuz (#1467) +- Chore: Update model.json for UI @hahuyhoang411 (#1448) +- Docs for Installing Models from Hub @0xgokuz (#1450) +- Update about.md @Ssstars (#1436) +- feat(UI): #1404 make left side bar collapsible by hot key @namchuai (#1420) +- docs: Typo in 06-hardware.md @akaMrNagar (#1408) +- fix(API): #1409 fix wrong prefix for threads api @namchuai (#1410) +- Update model hub @hahuyhoang411 (#1383) +- fix(Model): remove unsupported default model setting params @namchuai (#1382) +- fix(trinity): update cover path for trinity v1.2 @hahuyhoang411 (#1380) +- Chore/update model hub @hahuyhoang411 (#1342) +- Update about.md @Ssstars (#1359) +- fix(JanHub): #1158 sort model list @namchuai (#1257) +- fix(Message): open link with external browser @namchuai (#1339) +- feat(Model): #1028 made model.json optional @namchuai (#1314) +- docs: Update onboarding.md @Diane0111 (#1293) +- fix: clean resource on exit @louis-jan (#1290) +- fix: posthog configuration @hieu-jan (#1283) +- docs: update README.md @eltociear (#1277) +- Enable scrolling in the message chat box @Gri-ffin (#1280) +- chore: Update README.md @sr-albert (#1263) +- Adding new model to the Hub @hahuyhoang411 (#1213) +- Feature GPU detection for Jan on Windows and Linux @hiento09 (#1242) +- fix(Thread): #1168 fix newly created thread cannot select model after restart @namchuai (#1176) + +## 🚀 Features + +- feat: add compatibility tag to model selection in right panel @urmauur (#1552) +- Feature integrate antivirus scanner to ci @hiento09 (#1529) +- feat: [hub] update compatibility tags colors @urmauur (#1516) +- feat: hub recommendation labels @urmauur (#1440) +- Feature linux support app image format @hiento09 (#1442) +- fix: render external links @urmauur (#1441) +- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) +- feat(UI): update UI footer @urmauur (#1424) +- Fix Bug for Chat Reply Goes off Screen @mishrababhishek (#1393) +- feat: move social media from left panel into footer @urmauur (#1325) +- feat: implementation new UI thread settings @urmauur (#1301) +- Bring social media links @Gri-ffin (#1295) +- feat: added keyboard shortcut list in setting page @urmauur (#1275) +- feat: add swagger /docs to localhost:1337 @louis-jan (#1268) +- feat: update posthog configuration @hieu-jan (#1258) +- feat: Deprecate model.json ready state in favor of .download ext @louis-jan (#1238) +- feat: add engine settings @namchuai (#1199) +- feat: users should be able to switch models mid-thread @louis-jan (#1226) +- feat: temporary link how to import model @urmauur (#1209) + +## 🐛 Fixes + +- fix: #1594 - Model settings - change thread model - go back does not see according settings @louis-jan (#1595) +- fix: #1548 - duplicate command shortcut instruction @louis-jan (#1600) +- fix: switch model caused app crash @louis-jan (#1597) +- fix: #1559 Inference Parameters displayed on new thread with Openai GPT Model @louis-jan (#1588) +- fix: enable user set value manually model setting from input @urmauur (#1585) +- fix: #1569 - Does not apply thread settings when loading model @louis-jan (#1576) +- fix: could not change model params settings @louis-jan (#1547) +- fix: gpu check module export does not work in extension @louis-jan (#1536) +- fix: adjust calculation hub labels using total RAM instead remaining RAM @urmauur (#1522) +- Feature integrate antivirus scanner to ci @hiento09 (#1529) +- fix: allow users to set max tokens variably @urmauur (#1513) +- fix: stop word update @louis-jan (#1457) +- Revert nitro to 0.2.6 @hiento09 (#1491) +- fix: enable text selection codeblock @urmauur (#1466) +- fix: suppress all main node JS error message dialog @louis-jan (#1460) +- Correct AppImage path @hiento09 (#1446) +- fix: render external links @urmauur (#1441) +- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) +- fix: GET /models does not work due to new default model dir @louis-jan (#1392) +- fix: model migration stopped working @louis-jan (#1378) +- fix: wrong condition for displaying error message @louis-jan (#1376) +- fix: show hide section engine params @urmauur (#1374) +- fix: copy stream tooltip and hide section when no params setting @urmauur (#1373) +- bugs: fix stop streaming when user delete or clean thread @urmauur (#1347) +- fix: show a proper error message on download failure @louis-jan (#1345) +- Add detect cuda version jan app @hiento09 (#1351) +- fix: Error occurred: Unexpected token "d", "data: ..." is not a valid JSON @louis-jan (#1332) +- fix: app getting stuck at downloading 99% while downloading model @louis-jan (#1320) +- correct type utf-8 @hiento09 (#1311) +- Fix memory on mac included cached and swap @hiento09 (#1298) +- fix: should check app dir before spawning log @louis-jan (#1297) +- fix: disable process logging from server @louis-jan (#1296) +- fix: user should be able to access Swagger docs from localhost:1337 @louis-jan (#1292) +- Switch from Gigabyte to Gibibyte - System monitor @hiento09 (#1286) +- Switch from systeminformation to os-utils to resolve Bitdefender false positive and memory leak issue @hiento09 (#1282) +- fix: swagger CSP issue @louis-jan (#1284) +- fix: support markdown break line @urmauur (#1274) +- fix ci test run failed @hiento09 (#1267) +- Fix wrong linux nitro path @hiento09 (#1266) +- fix: enable command enter on dialog confirmation clean thread @urmauur (#1261) +- fix: input message duplicated due with some input sources @louis-jan (#1259) +- fix: mac users should not see GPU settings @louis-jan (#1255) +- fix: remove redundant gpu detection prompt event @louis-jan (#1254) +- fix: engine settings GUI - feature toggle @louis-jan (#1252) +- Fix bug #1178 high ram on windows @hiento09 (#1241) +- fix: #1183 Reveal in finder does not work on windows @namchuai (#1239) +- fix: remove delay tooltip and click event @urmauur (#1217) +- fix: enable enter command on dialog confirmation delete thread @urmauur (#1218) +- fix: Cleared thread last message is not updated @louis-jan (#1225) +- Fix switch thread crash nitro windows linux @hiento09 (#1214) +- fix: darkmode broken color @urmauur (#1186) + +## 🧰 Maintenance + +- chore: typo model.json @louis-jan (#1599) +- docs: add 04-how-to-get-error-logs.mdx @hieu-jan (#1580) +- chore: teach how to attach logs @0xSage (#1578) +- chore: issues should auto close with PRs through template @0xSage (#1577) +- chore: Update issue templates @0xSage (#1568) +- docs: fix x handles @0xSage (#1532) +- Docs to integrate OpenRouter with Jan without UI/UX @0xgokuz (#1495) +- chore: fix darkmode docs @hieu-jan (#1520) +- docs: fix algolia configuration @hieu-jan (#1518) +- docs: fix algolia configuration @hieu-jan (#1517) +- Revert URL release in readme to version 0.4.3 @hiento09 (#1502) +- refactor: add app and nitro log - resolve dependencies issue @louis-jan (#1447) +- chore: enable agolia @hieu-jan (#1497) +- docs: update troubleshooting and redirects old pages @hieu-jan (#1492) +- docs: minor fix @hieu-jan (#1478) +- docs: initial handbook structure @hieu-jan (#1477) +- Bump nitro to 0.2.8 and change Jan App to support cuda >= 11.7 @hiento09 (#1476) +- Chore update docs jan - add AppImage instruction to docusaurus @hiento09 (#1480) +- Bump nitro to 0.2.7 @hiento09 (#1474) +- chore: error message update @louis-jan (#1473) +- docs: Update 02-import-manually.mdx @0xSage (#1469) +- docs: Update about.md @0xSage (#1465) +- Bump nitro version to 0.2.6 @hiento09 (#1458) +- docs: adding customize engine settings @hieu-jan (#1455) +- docs: add-missing-path @hieu-jan (#1454) +- docs: resize gif @hieu-jan (#1453) +- docs: revenue philosophy @0xSage (#1443) +- docs: jan framework principles @0xSage (#1438) +- docs: fix typo in docs @hieu-jan (#1419) +- chore: clean up use os hook @namchuai (#1418) +- docs: explain each docs page intent @0xSage (#1417) +- docs: Update 01-server.md @0xSage (#1416) +- Update warning url from github md file to jan.ai docs site @hiento09 (#1414) +- docs: improve gpu not used guide @hieu-jan (#1405) +- chore: update README.md @eltociear (#1406) +- Update USAGE docs for linux @hiento09 (#1401) +- docs: gpu not detected @0xSage (#1399) +- docs: Troubleshoot Failed To Fetch @gabrielle-ong (#1398) +- docs: improve docs syntax @hieu-jan (#1394) +- docs: add-install-nightly-guide @hieu-jan (#1390) +- docs: correct href link @hieu-jan (#1338) +- docs: fix chat payload and cURL @hieu-jan (#1360) +- docs: add Chatting Guide @hieu-jan (#1184) +- Chore add docs usage how to switch run mode jan app @hiento09 (#1353) +- docs: configure index page @hieu-jan (#1330) +- docs: Update product.md @0xSage (#1326) +- docs: Update 01-server.md @0xSage (#1327) +- refactor: deprecate the appVersion IPC and use the predefined VERSION @louis-jan (#1309) +- docs: update using models documentation @hieu-jan (#1288) +- docs: update pm handbook @0xSage (#1307) +- docs: contributor docs overview @0xSage (#1305) +- chore: github PR template @0xSage (#1304) +- Fix memory on mac included cached and swap @hiento09 (#1298) +- Enrich discord message for nightly build url @hiento09 (#1294) +- Refactor CI by create shared jobs output @hiento09 (#1287) +- docs: update README.md @hieu-jan (#1281) +- docs: Update README.md @0xSage (#1248) +- feat: Jan Server, API and decoupled clients @louis-jan (#948) +- docs: improve 02-import-manually @hieu-jan (#1222) +- chore: Update issue templates @0xSage (#1229) +- docs: Update 02-import-manually.mdx @0xSage (#1197) +- add sleep 500ms if platform is windows before starting nitro process @hiento09 (#1215) +- docs: improve troubleshoot documentation @hieu-jan (#1173) +- docs: update bug report template @hieu-jan (#1180) +- docs: add troubleshooting @hieu-jan (#1169) +- chore: copy fixes @0xSage (#1167) +- docs: Update 01-start-thread.md @0xSage (#1122) + +## Contributor + +@0xSage, @0xgokuz, @Diane0111, @Gri-ffin, @Ssstars, @akaMrNagar, @eltociear, @gabrielle-ong, @hahuyhoang411, @hiento09, @hieu-jan, @jan-service-account, @louis-jan, @mishrababhishek, @namchuai, @sr-albert, @urmauur and Abhishek Mishra diff --git a/docs/docs/guides/changelogs/changelog-v0.4.5.mdx b/docs/docs/guides/changelog/changelog-v0.4.5.mdx similarity index 98% rename from docs/docs/guides/changelogs/changelog-v0.4.5.mdx rename to docs/docs/guides/changelog/changelog-v0.4.5.mdx index df5c650e8..0627dd10b 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.5.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.5.mdx @@ -7,96 +7,96 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1758: bug: Correct text for Windows](https://github.com/janhq/jan/issues/1758) -## Changes - -- fix(Wording): #1758 correct text for windows @namchuai (#1768) -- fix(Log): server log is not display in windows @namchuai (#1764) -- Release Cut v0.4.5 @louis-jan (#1752) -- chore(nitro): 0.2.11 -> 0.2.12 @hiro-v (#1754) -- fix: Nitro CPU threads with correct physical/ performance CPU count @hiro-v (#1726) -- fix(Model): #1662 imported model does not use gpu @namchuai (#1723) -- fix(API): #1720 host/port provided in the local API server does not fully applied @namchuai (#1721) -- fix: server API reference @hiro-v (#1670) -- fix(Model): refactor model label @namchuai (#1596) -- docs/postmortem v 0.4.4 @hieu-jan (#1617) -- chore(ShortcutModal): clean up shortcut modal @namchuai (#1614) -- chore(Dependencies): upgrade node-fetch to fix vulnerable issue @namchuai (#1598) - -## 🚀 Features - -- feat: update UI allow user change folder @urmauur (#1738) -- feat: error message when not enough RAM @urmauur (#1706) -- feat: improvement ux for local api server @urmauur (#1704) -- feat: allow user to move jan folder @namchuai (#1649) -- feat: HTTP proxy support @markmehere (#1562) -- Feature add schedule clean cloudflare page and r2 @hiento09 (#1653) -- feat: relayout left panel setting page @urmauur (#1648) -- Update CI follow git flow @hiento09 (#1625) -- feat: Implement UI page API server dashboard @urmauur (#1636) -- fix: #1545 long thread title @lucido-simon (#1605) - -## 🐛 Fixes - -- fix: model selection does not show in API settings page @louis-jan (#1828) -- fix: user can't view model setting in local api server @namchuai (#1807) -- fix: cannot change jan data folder @namchuai (#1805) -- fix: model selection does not show in API settings page @louis-jan (#1802) -- fix: user can't use a model in model hub @namchuai (#1801) -- fix: stop openai inference raises something amiss @louis-jan (#1799) -- regression fix: input disabled darkmode @urmauur (#1800) -- fix: clean last message when user clean thread message @namchuai (#1793) -- fix: app log not being printed @namchuai (#1790) -- fix: api settings are not applied on changes @louis-jan (#1789) -- fix: could not delete model @louis-jan (#1779) -- fix: can not start model when server is not enabled from model settings page @louis-jan (#1774) -- regression fix: input port not accept alphabets @urmauur (#1772) -- Correct bash script syntax in ci @hiento09 (#1769) -- Hotfix CI pre-release not trigger @hiento09 (#1757) -- fix: bring back open app directory @louis-jan (#1756) -- fix: input port have range validation @urmauur (#1741) -- Fix error nightly build schedule run failed @hiento09 (#1736) -- fix: active model when start server @urmauur (#1719) -- fix: Change to fixed `localhost` instead of using host variable @hiro-v (#1729) -- Fix autoupdater nightly build error @hiento09 (#1727) -- Correct download url readme @hiento09 (#1724) -- fix: API chat/completion is blocked by CORS @louis-jan (#1705) -- fix: Jan server - v1/chat/completions is throwing ERR\_REQUIRE\_ESM @louis-jan (#1703) -- fix: Jan server is showing blank page @louis-jan (#1702) -- fix: switching loader from remote to local model from thread right panel @urmauur (#1692) -- fix: hot-fix algolia search @hieu-jan (#1700) -- fix: disable api key field while server is running @urmauur (#1694) -- fix: stoping model show starting model @urmauur (#1693) -- fix bug #1650 hogging resources @hiento09 (#1663) -- fix: auto select text when collapse panel @urmauur (#1645) -- fix: wrong selected model ref @louis-jan (#1638) -- fix: enable check for update on all supported platforms @louis-jan (#1626) -- fix: correct footer @hieu-jan (#1628) - -## 🧰 Maintenance - -- Docs publish to github page trigger on push to docs branch @hiento09 (#1783) -- Correct bash script syntax in ci @hiento09 (#1769) -- Combine 2 ci pipeline pre-release and nightly into one @hiento09 (#1767) -- Hotfix CI pre-release not trigger @hiento09 (#1757) -- Fix error nightly build schedule run failed @hiento09 (#1736) -- docs: add troubleshoot unexpected token @hieu-jan (#1711) -- docs: fix about pages @0xSage (#1699) -- refactor: deprecate extension type implementation @louis-jan (#1677) -- refactor: file prefix replace utils \& add unit test @louis-jan (#1676) -- Correct ref branch for update url on README.md file @hiento09 (#1672) -- docs: update 02-somethings-amiss @hieu-jan (#1668) -- Cherrypick cicd to main branch to apply new gitflow @hiento09 (#1665) -- docs: add user and developer guides for extensions @hieu-jan (#1657) -- docs: add QA Script @hieu-jan (#1660) -- chore: Bump nitro to 0.2.11 @hiro-v (#1655) -- chore: Bump version nitro to 0.2.10 @hiro-v (#1644) -- docs: add antivirus compatibility testing @hieu-jan (#1641) -- refactor: introduce node module in nitro extension @louis-jan (#1630) -- Update 02-somethings-amiss.mdx @Ssstars (#1634) -- docs: add integration AzureOpenAI @hieu-jan (#1632) -- docs: add troubleshooting permission denied @hieu-jan (#1631) - -## Contributor - -@0xSage, @Ssstars, @hiento09, @hientominh, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @lucido-simon, @markmehere, @namchuai and @urmauur +## Changes + +- fix(Wording): #1758 correct text for windows @namchuai (#1768) +- fix(Log): server log is not display in windows @namchuai (#1764) +- Release Cut v0.4.5 @louis-jan (#1752) +- chore(nitro): 0.2.11 -> 0.2.12 @hiro-v (#1754) +- fix: Nitro CPU threads with correct physical/ performance CPU count @hiro-v (#1726) +- fix(Model): #1662 imported model does not use gpu @namchuai (#1723) +- fix(API): #1720 host/port provided in the local API server does not fully applied @namchuai (#1721) +- fix: server API reference @hiro-v (#1670) +- fix(Model): refactor model label @namchuai (#1596) +- docs/postmortem v 0.4.4 @hieu-jan (#1617) +- chore(ShortcutModal): clean up shortcut modal @namchuai (#1614) +- chore(Dependencies): upgrade node-fetch to fix vulnerable issue @namchuai (#1598) + +## 🚀 Features + +- feat: update UI allow user change folder @urmauur (#1738) +- feat: error message when not enough RAM @urmauur (#1706) +- feat: improvement ux for local api server @urmauur (#1704) +- feat: allow user to move jan folder @namchuai (#1649) +- feat: HTTP proxy support @markmehere (#1562) +- Feature add schedule clean cloudflare page and r2 @hiento09 (#1653) +- feat: relayout left panel setting page @urmauur (#1648) +- Update CI follow git flow @hiento09 (#1625) +- feat: Implement UI page API server dashboard @urmauur (#1636) +- fix: #1545 long thread title @lucido-simon (#1605) + +## 🐛 Fixes + +- fix: model selection does not show in API settings page @louis-jan (#1828) +- fix: user can't view model setting in local api server @namchuai (#1807) +- fix: cannot change jan data folder @namchuai (#1805) +- fix: model selection does not show in API settings page @louis-jan (#1802) +- fix: user can't use a model in model hub @namchuai (#1801) +- fix: stop openai inference raises something amiss @louis-jan (#1799) +- regression fix: input disabled darkmode @urmauur (#1800) +- fix: clean last message when user clean thread message @namchuai (#1793) +- fix: app log not being printed @namchuai (#1790) +- fix: api settings are not applied on changes @louis-jan (#1789) +- fix: could not delete model @louis-jan (#1779) +- fix: can not start model when server is not enabled from model settings page @louis-jan (#1774) +- regression fix: input port not accept alphabets @urmauur (#1772) +- Correct bash script syntax in ci @hiento09 (#1769) +- Hotfix CI pre-release not trigger @hiento09 (#1757) +- fix: bring back open app directory @louis-jan (#1756) +- fix: input port have range validation @urmauur (#1741) +- Fix error nightly build schedule run failed @hiento09 (#1736) +- fix: active model when start server @urmauur (#1719) +- fix: Change to fixed `localhost` instead of using host variable @hiro-v (#1729) +- Fix autoupdater nightly build error @hiento09 (#1727) +- Correct download url readme @hiento09 (#1724) +- fix: API chat/completion is blocked by CORS @louis-jan (#1705) +- fix: Jan server - v1/chat/completions is throwing ERR\_REQUIRE\_ESM @louis-jan (#1703) +- fix: Jan server is showing blank page @louis-jan (#1702) +- fix: switching loader from remote to local model from thread right panel @urmauur (#1692) +- fix: hot-fix algolia search @hieu-jan (#1700) +- fix: disable api key field while server is running @urmauur (#1694) +- fix: stoping model show starting model @urmauur (#1693) +- fix bug #1650 hogging resources @hiento09 (#1663) +- fix: auto select text when collapse panel @urmauur (#1645) +- fix: wrong selected model ref @louis-jan (#1638) +- fix: enable check for update on all supported platforms @louis-jan (#1626) +- fix: correct footer @hieu-jan (#1628) + +## 🧰 Maintenance + +- Docs publish to github page trigger on push to docs branch @hiento09 (#1783) +- Correct bash script syntax in ci @hiento09 (#1769) +- Combine 2 ci pipeline pre-release and nightly into one @hiento09 (#1767) +- Hotfix CI pre-release not trigger @hiento09 (#1757) +- Fix error nightly build schedule run failed @hiento09 (#1736) +- docs: add troubleshoot unexpected token @hieu-jan (#1711) +- docs: fix about pages @0xSage (#1699) +- refactor: deprecate extension type implementation @louis-jan (#1677) +- refactor: file prefix replace utils \& add unit test @louis-jan (#1676) +- Correct ref branch for update url on README.md file @hiento09 (#1672) +- docs: update 02-somethings-amiss @hieu-jan (#1668) +- Cherrypick cicd to main branch to apply new gitflow @hiento09 (#1665) +- docs: add user and developer guides for extensions @hieu-jan (#1657) +- docs: add QA Script @hieu-jan (#1660) +- chore: Bump nitro to 0.2.11 @hiro-v (#1655) +- chore: Bump version nitro to 0.2.10 @hiro-v (#1644) +- docs: add antivirus compatibility testing @hieu-jan (#1641) +- refactor: introduce node module in nitro extension @louis-jan (#1630) +- Update 02-somethings-amiss.mdx @Ssstars (#1634) +- docs: add integration AzureOpenAI @hieu-jan (#1632) +- docs: add troubleshooting permission denied @hieu-jan (#1631) + +## Contributor + +@0xSage, @Ssstars, @hiento09, @hientominh, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @lucido-simon, @markmehere, @namchuai and @urmauur diff --git a/docs/docs/guides/changelogs/changelog-v0.4.6.mdx b/docs/docs/guides/changelog/changelog-v0.4.6.mdx similarity index 98% rename from docs/docs/guides/changelogs/changelog-v0.4.6.mdx rename to docs/docs/guides/changelog/changelog-v0.4.6.mdx index 5e8fefdcd..0ed9a5505 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.6.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.6.mdx @@ -7,57 +7,57 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1918: Regression fix assistant extension codesign](https://github.com/janhq/jan/pull/1918) -## Changes - -- Regression fix assitant extension codesign @hiento09 (#1918) -- Release cut 0.4.6 @louis-jan (#1888) -- feat: add factory reset feature @namchuai (#1750) -- chore: add react developer tools to electron @Helloyunho (#1858) -- Sync Release 0.4.5 to dev @louis-jan (#1830) - -## 🚀 Features - -- feat: integrate umami @hieu-jan (#1809) -- feat: Add default value for ngl @hiro-v (#1886) -- feat: add start/stop model via http api @namchuai (#1862) -- feat: add snackbar component and update style side banner @urmauur (#1874) -- feat: move open app directory into icon folder @urmauur (#1879) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- feat: put timestamp under thread name in left panel @urmauur (#1820) -- perf: remove unnecessary rerender when user typing input @namchuai (#1818) - -## 🐛 Fixes - -- fix: umami analytics send app loaded event @louis-jan (#1928) -- fix: migration loading indicator @louis-jan (#1913) -- fix: broken manual import model with NA fields @louis-jan (#1912) -- fix: openAIEmbedding now requires top level API Key configuration @louis-jan (#1902) -- fix: load model fail overlays thread message error @louis-jan (#1901) -- fix: show generate response on message send @louis-jan (#1895) -- fix: display error message on model load fail @louis-jan (#1894) -- fix: the selected model auto revert back to previous used model with setting mismatch @louis-jan (#1883) -- fix: add dialog confirm when move folder and next dest isn't empty @urmauur (#1880) -- Increase timeout for explore.e2e.spec test @hiento09 (#1844) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- fix: auto collapse retrieval setting while update config @urmauur (#1866) -- fix: loader show while error global when change folder @urmauur (#1870) -- fix: retrieval always ask for api key @louis-jan (#1856) -- fix: all input text box are disabled @namchuai (#1855) -- fix: add loader when user change folder @urmauur (#1850) -- Add code sign step for darwin assistant extension @hiento09 (#1841) -- fix: preserve focused thread when navigating in jan app @namchuai (#1814) -- fix: highlight menu dropdown server options @urmauur (#1831) - -## 🧰 Maintenance - -- chore: mark RAG as experimental feature @louis-jan (#1882) -- Increase timeout for explore.e2e.spec test @hiento09 (#1844) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- chore: Jan Data Folder setting is no longer an experimental feature @louis-jan (#1847) -- chore: resolve main conflict @louis-jan (#1833) -- Update release url on README to default branch instead of main branch @hiento09 (#1832) - -## Contributor - -@Helloyunho, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai, @urmauur and James +## Changes + +- Regression fix assitant extension codesign @hiento09 (#1918) +- Release cut 0.4.6 @louis-jan (#1888) +- feat: add factory reset feature @namchuai (#1750) +- chore: add react developer tools to electron @Helloyunho (#1858) +- Sync Release 0.4.5 to dev @louis-jan (#1830) + +## 🚀 Features + +- feat: integrate umami @hieu-jan (#1809) +- feat: Add default value for ngl @hiro-v (#1886) +- feat: add start/stop model via http api @namchuai (#1862) +- feat: add snackbar component and update style side banner @urmauur (#1874) +- feat: move open app directory into icon folder @urmauur (#1879) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- feat: put timestamp under thread name in left panel @urmauur (#1820) +- perf: remove unnecessary rerender when user typing input @namchuai (#1818) + +## 🐛 Fixes + +- fix: umami analytics send app loaded event @louis-jan (#1928) +- fix: migration loading indicator @louis-jan (#1913) +- fix: broken manual import model with NA fields @louis-jan (#1912) +- fix: openAIEmbedding now requires top level API Key configuration @louis-jan (#1902) +- fix: load model fail overlays thread message error @louis-jan (#1901) +- fix: show generate response on message send @louis-jan (#1895) +- fix: display error message on model load fail @louis-jan (#1894) +- fix: the selected model auto revert back to previous used model with setting mismatch @louis-jan (#1883) +- fix: add dialog confirm when move folder and next dest isn't empty @urmauur (#1880) +- Increase timeout for explore.e2e.spec test @hiento09 (#1844) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- fix: auto collapse retrieval setting while update config @urmauur (#1866) +- fix: loader show while error global when change folder @urmauur (#1870) +- fix: retrieval always ask for api key @louis-jan (#1856) +- fix: all input text box are disabled @namchuai (#1855) +- fix: add loader when user change folder @urmauur (#1850) +- Add code sign step for darwin assistant extension @hiento09 (#1841) +- fix: preserve focused thread when navigating in jan app @namchuai (#1814) +- fix: highlight menu dropdown server options @urmauur (#1831) + +## 🧰 Maintenance + +- chore: mark RAG as experimental feature @louis-jan (#1882) +- Increase timeout for explore.e2e.spec test @hiento09 (#1844) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- chore: Jan Data Folder setting is no longer an experimental feature @louis-jan (#1847) +- chore: resolve main conflict @louis-jan (#1833) +- Update release url on README to default branch instead of main branch @hiento09 (#1832) + +## Contributor + +@Helloyunho, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai, @urmauur and James diff --git a/docs/docs/guides/changelogs/changelog-v0.4.7.mdx b/docs/docs/guides/changelog/changelog-v0.4.7.mdx similarity index 98% rename from docs/docs/guides/changelogs/changelog-v0.4.7.mdx rename to docs/docs/guides/changelog/changelog-v0.4.7.mdx index a65a60e92..77a19e158 100644 --- a/docs/docs/guides/changelogs/changelog-v0.4.7.mdx +++ b/docs/docs/guides/changelog/changelog-v0.4.7.mdx @@ -7,111 +7,111 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #2121: Release cut v0.4.7](https://github.com/janhq/jan/pull/2121) -## Changes - -- Release cut v0.4.7 @louis-jan (#2121) -- chore: update models @hahuyhoang411 (#1829) -- add docs for entire advanced settings @hieu-jan (#2063) -- docs: Fix #2040 : added /v1 path to apiBase @ldebs (#2041) -- fix: ui for disabled state of gpu acceleration @namchuai (#2034) -- feat: Initialize POM structure with fixtures on Playwright @Van-QA (#2015) -- Alternative solution for `Thread titles should auto-summarize Topic` @0xgokuz (#1976) -- Update authors.yml Rex @hahuyhoang411 (#1956) -- Update authors.yml Louis @louis-jan (#1955) -- Change env Dockerfile.gpu and update README @hiento09 (#1963) -- chore: Update authors.yml for Van Pham @Van-QA (#1954) -- Sync dev branch to docs branch @hieu-jan (#1948) -- sync current docs branch to dev branch @hieu-jan (#1947) -- feat: Playwright capture screenshot of Electron desktop app (Jan) on failures @Van-QA (#1934) -- Sync main to dev after release 0.4.6 @hiento09 (#1929) - -## 🚀 Features - -- feat: Add nitro vulkan to support AMD GPU/ APU and Intel Arc GPU @hiro-v (#2056) -- fix: flow edit message @urmauur (#2113) -- Feature helmchart and ci jan server @hiento09 (#2106) -- feat: improvementUI GPU acceleration @urmauur (#1990) -- feat: add edit messages users @urmauur (#1974) -- feat: revamp ui dropdown list model option @urmauur (#1977) -- feat: add modal troubleshooting guideline @urmauur (#1968) -- feat: integrate umami script locally @hieu-jan (#1958) -- feat: User Selectable GPUs and GPU-based Model Recommendations @hiento09 (#1730) - -## 🐛 Fixes - -- fix: correct vulkan settings @louis-jan (#2128) -- fix: chore UI @louis-jan (#2125) -- Regression: bump nitro to 0.3.13 @hiento09 (#2124) -- Regression: Linux vulkan binary path @hiento09 (#2123) -- fix: revert back menu actions @louis-jan (#2120) -- fix: mismatching between nightly build and version - jan about @louis-jan (#2114) -- fix: flow edit message @urmauur (#2113) -- fix: tools section should be expanded by default @louis-jan (#2110) -- fix: failed to bind port - nitro error message copy @louis-jan (#2101) -- fix: remove caret down icon when tab selected into remote model @urmauur (#2102) -- fix: openai client sdk compatible @louis-jan (#2096) -- Fix bug #2005 docker blank website @hiento09 (#2093) -- fix: check if port is occupied before start local server @namchuai (#2098) -- fix: broken model.json update @louis-jan (#2099) -- fix: make text input scrollable @urmauur (#2083) -- fix: failed to send message blocks thread creation @louis-jan (#2091) -- fix: server crashes on missing module @louis-jan (#2089) -- fix: expand assistant and model settings by default @louis-jan (#2081) -- fix: move jan data folder - error handling for no write permission granted @louis-jan (#2077) -- fix: check for updates should show no update are available on the latest build @louis-jan (#2075) -- fix: infinity showed when haven't get total size @namchuai (#2066) -- fix: should stop running the model when GPU settings are changed @louis-jan (#2067) -- fix: settings page state loop and dark theme @louis-jan (#2065) -- fix: Fix Nitro windows with error 3221225781 @hiro-v (#2057) -- fix: message should only be interrupted when i start another thread @louis-jan (#2053) -- fix: local server start error should not change to started state @louis-jan (#2052) -- fix: update copy of message queue @louis-jan (#2051) -- fix: download mutilple binaries @namchuai (#2043) -- fix: disable gpu drop down box if there's no GPU ready @namchuai (#2046) -- fix: app should generate thread title with length restriction @louis-jan (#2037) -- fix: factory reset not remove jan data folder @namchuai (#2027) -- fix: content setting right panel default to collapse @urmauur (#2026) -- fix: local server blank parameters if there is no thread selected @louis-jan (#2028) -- fix: model path backward compatible @louis-jan (#2018) -- fix: resolve state update loop infinitive rerendering @louis-jan (#2017) -- fix: lack of auto-cleaning mechanism for logs @louis-jan (#2003) -- fix: app stuck regenerating assistant response @louis-jan (#2001) -- fix: decouple thread summary update @louis-jan (#1994) -- fix: app fails gracefully with clear error messages @louis-jan (#1993) -- fix: retrieval stuck at generating response @louis-jan (#1988) -- Fix macos auto update failed on nightly build @hiento09 (#1991) -- fix: model downloads broken on nightly @louis-jan (#1984) -- fix: RAG enhancements @urmauur (#1965) -- Update docs run Jan Server in Docker mode @hiento09 (#1960) -- fix: update conditional check last status message @urmauur (#1951) -- fix: markdown render for chat completion role user @urmauur (#1944) -- fix: avoid users to create so many threads at the same time @urmauur (#1930) -- fix: download model will close panel item hub @urmauur (#1923) - -## 🧰 Maintenance - -- docs: improve integrations guide \& import model using absolute path @hieu-jan (#2076) -- chore: add app version into log @namchuai (#2116) -- docs: add integration docs Mistral AI API @hieu-jan (#2070) -- docs:add-advanced-settings-https-proxy @hieu-jan (#2054) -- chore: refactor watch system resource hook @louis-jan (#2048) -- docs: Updates Guide Using the Local Server @SamPatt (#1924) -- server install core using link instead of file @hiento09 (#2025) -- chore: prettier fix @louis-jan (#2019) -- chore: bump nitro 0.3.9 @louis-jan (#2016) -- refactor: reduce IPC \& API handlers - shared node logics @louis-jan (#2011) -- docs: update 03-gpu-not-used with RTX issues @hieu-jan (#1992) -- docs: add Jan installation using Docker @hieu-jan (#1981) -- chore: reduce bundle size @louis-jan (#1970) -- docs: add author.yml @hieu-jan (#1973) -- Update authors.yml hien @hiento09 (#1953) -- chore: server download progress + S3 @louis-jan (#1925) -- chore: add author james @namchuai (#1952) -- chore: Add author - Ashley @imtuyethan (#1950) -- chore: Add Author - Hiro @hiro-v (#1949) -- docs: adding new feature for v0.4.6 to release checklist @Van-QA (#1927) - -## Contributor - -@0xSage, @0xgokuz, @SamPatt, @Van-QA, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @imtuyethan, @jan-service-account, @ldebs, @louis-jan, @namchuai, @urmauur and James +## Changes + +- Release cut v0.4.7 @louis-jan (#2121) +- chore: update models @hahuyhoang411 (#1829) +- add docs for entire advanced settings @hieu-jan (#2063) +- docs: Fix #2040 : added /v1 path to apiBase @ldebs (#2041) +- fix: ui for disabled state of gpu acceleration @namchuai (#2034) +- feat: Initialize POM structure with fixtures on Playwright @Van-QA (#2015) +- Alternative solution for `Thread titles should auto-summarize Topic` @0xgokuz (#1976) +- Update authors.yml Rex @hahuyhoang411 (#1956) +- Update authors.yml Louis @louis-jan (#1955) +- Change env Dockerfile.gpu and update README @hiento09 (#1963) +- chore: Update authors.yml for Van Pham @Van-QA (#1954) +- Sync dev branch to docs branch @hieu-jan (#1948) +- sync current docs branch to dev branch @hieu-jan (#1947) +- feat: Playwright capture screenshot of Electron desktop app (Jan) on failures @Van-QA (#1934) +- Sync main to dev after release 0.4.6 @hiento09 (#1929) + +## 🚀 Features + +- feat: Add nitro vulkan to support AMD GPU/ APU and Intel Arc GPU @hiro-v (#2056) +- fix: flow edit message @urmauur (#2113) +- Feature helmchart and ci jan server @hiento09 (#2106) +- feat: improvementUI GPU acceleration @urmauur (#1990) +- feat: add edit messages users @urmauur (#1974) +- feat: revamp ui dropdown list model option @urmauur (#1977) +- feat: add modal troubleshooting guideline @urmauur (#1968) +- feat: integrate umami script locally @hieu-jan (#1958) +- feat: User Selectable GPUs and GPU-based Model Recommendations @hiento09 (#1730) + +## 🐛 Fixes + +- fix: correct vulkan settings @louis-jan (#2128) +- fix: chore UI @louis-jan (#2125) +- Regression: bump nitro to 0.3.13 @hiento09 (#2124) +- Regression: Linux vulkan binary path @hiento09 (#2123) +- fix: revert back menu actions @louis-jan (#2120) +- fix: mismatching between nightly build and version - jan about @louis-jan (#2114) +- fix: flow edit message @urmauur (#2113) +- fix: tools section should be expanded by default @louis-jan (#2110) +- fix: failed to bind port - nitro error message copy @louis-jan (#2101) +- fix: remove caret down icon when tab selected into remote model @urmauur (#2102) +- fix: openai client sdk compatible @louis-jan (#2096) +- Fix bug #2005 docker blank website @hiento09 (#2093) +- fix: check if port is occupied before start local server @namchuai (#2098) +- fix: broken model.json update @louis-jan (#2099) +- fix: make text input scrollable @urmauur (#2083) +- fix: failed to send message blocks thread creation @louis-jan (#2091) +- fix: server crashes on missing module @louis-jan (#2089) +- fix: expand assistant and model settings by default @louis-jan (#2081) +- fix: move jan data folder - error handling for no write permission granted @louis-jan (#2077) +- fix: check for updates should show no update are available on the latest build @louis-jan (#2075) +- fix: infinity showed when haven't get total size @namchuai (#2066) +- fix: should stop running the model when GPU settings are changed @louis-jan (#2067) +- fix: settings page state loop and dark theme @louis-jan (#2065) +- fix: Fix Nitro windows with error 3221225781 @hiro-v (#2057) +- fix: message should only be interrupted when i start another thread @louis-jan (#2053) +- fix: local server start error should not change to started state @louis-jan (#2052) +- fix: update copy of message queue @louis-jan (#2051) +- fix: download mutilple binaries @namchuai (#2043) +- fix: disable gpu drop down box if there's no GPU ready @namchuai (#2046) +- fix: app should generate thread title with length restriction @louis-jan (#2037) +- fix: factory reset not remove jan data folder @namchuai (#2027) +- fix: content setting right panel default to collapse @urmauur (#2026) +- fix: local server blank parameters if there is no thread selected @louis-jan (#2028) +- fix: model path backward compatible @louis-jan (#2018) +- fix: resolve state update loop infinitive rerendering @louis-jan (#2017) +- fix: lack of auto-cleaning mechanism for logs @louis-jan (#2003) +- fix: app stuck regenerating assistant response @louis-jan (#2001) +- fix: decouple thread summary update @louis-jan (#1994) +- fix: app fails gracefully with clear error messages @louis-jan (#1993) +- fix: retrieval stuck at generating response @louis-jan (#1988) +- Fix macos auto update failed on nightly build @hiento09 (#1991) +- fix: model downloads broken on nightly @louis-jan (#1984) +- fix: RAG enhancements @urmauur (#1965) +- Update docs run Jan Server in Docker mode @hiento09 (#1960) +- fix: update conditional check last status message @urmauur (#1951) +- fix: markdown render for chat completion role user @urmauur (#1944) +- fix: avoid users to create so many threads at the same time @urmauur (#1930) +- fix: download model will close panel item hub @urmauur (#1923) + +## 🧰 Maintenance + +- docs: improve integrations guide \& import model using absolute path @hieu-jan (#2076) +- chore: add app version into log @namchuai (#2116) +- docs: add integration docs Mistral AI API @hieu-jan (#2070) +- docs:add-advanced-settings-https-proxy @hieu-jan (#2054) +- chore: refactor watch system resource hook @louis-jan (#2048) +- docs: Updates Guide Using the Local Server @SamPatt (#1924) +- server install core using link instead of file @hiento09 (#2025) +- chore: prettier fix @louis-jan (#2019) +- chore: bump nitro 0.3.9 @louis-jan (#2016) +- refactor: reduce IPC \& API handlers - shared node logics @louis-jan (#2011) +- docs: update 03-gpu-not-used with RTX issues @hieu-jan (#1992) +- docs: add Jan installation using Docker @hieu-jan (#1981) +- chore: reduce bundle size @louis-jan (#1970) +- docs: add author.yml @hieu-jan (#1973) +- Update authors.yml hien @hiento09 (#1953) +- chore: server download progress + S3 @louis-jan (#1925) +- chore: add author james @namchuai (#1952) +- chore: Add author - Ashley @imtuyethan (#1950) +- chore: Add Author - Hiro @hiro-v (#1949) +- docs: adding new feature for v0.4.6 to release checklist @Van-QA (#1927) + +## Contributor + +@0xSage, @0xgokuz, @SamPatt, @Van-QA, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @imtuyethan, @jan-service-account, @ldebs, @louis-jan, @namchuai, @urmauur and James diff --git a/docs/docs/guides/changelogs/_category_.json b/docs/docs/guides/changelogs/_category_.json deleted file mode 100644 index 7b86610f6..000000000 --- a/docs/docs/guides/changelogs/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Changelogs", - "position": 5, - "link": { - "type": "generated-index", - "description": "Changelog for Jan" - } -} \ No newline at end of file From 32b4162fe55f6f6a73f38c32be313c693d5d6837 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Mon, 4 Mar 2024 22:25:54 +0900 Subject: [PATCH 002/131] docs: add command run API server without frontend --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e9dc506cc..fa5c2a8b9 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,12 @@ Contributions are welcome! Please read the [CONTRIBUTING.md](CONTRIBUTING.md) fi This will start the development server and open the desktop app. +3. (Optional) **Run the API server without frontend** + + ```bash + yarn dev:server + ``` + ### For production build ```bash From 1584f0d21e407fc4e0573d0505242783d73c3c23 Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Mon, 4 Mar 2024 23:03:42 +0700 Subject: [PATCH 003/131] Add prefix latest/ for task clean r2 bucket (#2233) Co-authored-by: Hien To --- .github/workflows/clean-cloudflare-page-preview-url-and-r2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clean-cloudflare-page-preview-url-and-r2.yml b/.github/workflows/clean-cloudflare-page-preview-url-and-r2.yml index de761ca69..15b759cac 100644 --- a/.github/workflows/clean-cloudflare-page-preview-url-and-r2.yml +++ b/.github/workflows/clean-cloudflare-page-preview-url-and-r2.yml @@ -58,7 +58,7 @@ jobs: - name: Delete object older than 10 days run: | # Get the list of objects in the 'latest' folder - OBJECTS=$(aws s3api list-objects --bucket ${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }} --query 'Contents[?LastModified<`'$(date -d "$current_date -10 days" -u +"%Y-%m-%dT%H:%M:%SZ")'`].{Key: Key}' --endpoint-url https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com | jq -c .) + OBJECTS=$(aws s3api list-objects --bucket ${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }} --prefix "latest/" --query 'Contents[?LastModified<`'$(date -d "$current_date -10 days" -u +"%Y-%m-%dT%H:%M:%SZ")'`].{Key: Key}' --endpoint-url https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com | jq -c .) # Create a JSON file for the delete operation echo "{\"Objects\": $OBJECTS, \"Quiet\": false}" > delete.json From e6c10202e0463552e925f9b25c39451b8bebaaf6 Mon Sep 17 00:00:00 2001 From: hiro <22463238+hiro-v@users.noreply.github.com> Date: Tue, 5 Mar 2024 08:33:09 +0700 Subject: [PATCH 004/131] feat: Jan can see (#2069) * feat: jan can see feat: Add GPT-4 Vision model (Preview) fix: Add visionModel as property in ModelInfo fix: Fix condition to load local messages in useSetActiveThread hook feat: Enable Image as input for chat fix: Update model parameters in JSON files for remote GPT models fix: Add thread as optional fix: Add support for message as image fix: Linter fix: Update proxyModel to proxy_model and add textModel chore: Change proxyModel to proxy_model fix: Update settings with visionModel and textModel fix: vision model passed through the retrieval tool fix: linter * fix: could not load image and request is not able to be sent --------- Co-authored-by: Louis --- core/src/types/model/modelEntity.ts | 11 ++--- extensions/assistant-extension/src/index.ts | 7 +-- models/bakllava-1/model.json | 2 + models/gpt-3.5-turbo-16k-0613/model.json | 5 +- models/gpt-3.5-turbo/model.json | 5 +- models/gpt-4-vision-preview/model.json | 26 ++++++++++ models/gpt-4/model.json | 5 +- models/llava-1.5-13b-q5/model.json | 4 +- models/llava-1.5-7b-q5/model.json | 4 +- web/containers/DropdownListSidebar/index.tsx | 15 ++++-- web/hooks/usePath.ts | 9 +++- web/hooks/useSendChatMessage.ts | 49 ++++++++++++++----- web/hooks/useSetActiveThread.ts | 14 +++--- web/hooks/useUpdateModelParameters.ts | 13 +++-- web/screens/Chat/ChatInput/index.tsx | 40 ++++++++++++--- .../Chat/SimpleTextMessage/RelativeImage.tsx | 30 ++++++++++++ web/screens/Chat/SimpleTextMessage/index.tsx | 20 +++++--- web/utils/base64.ts | 36 ++++++++++++++ 18 files changed, 238 insertions(+), 57 deletions(-) create mode 100644 models/gpt-4-vision-preview/model.json create mode 100644 web/screens/Chat/SimpleTextMessage/RelativeImage.tsx diff --git a/core/src/types/model/modelEntity.ts b/core/src/types/model/modelEntity.ts index 644c34dfb..3cbe799e2 100644 --- a/core/src/types/model/modelEntity.ts +++ b/core/src/types/model/modelEntity.ts @@ -7,7 +7,7 @@ export type ModelInfo = { settings: ModelSettingParams parameters: ModelRuntimeParams engine?: InferenceEngine - proxyEngine?: InferenceEngine + proxy_model?: InferenceEngine } /** @@ -93,12 +93,7 @@ export type Model = { */ engine: InferenceEngine - proxyEngine?: InferenceEngine - - /** - * Is multimodal or not. - */ - visionModel?: boolean + proxy_model?: InferenceEngine } export type ModelMetadata = { @@ -124,6 +119,8 @@ export type ModelSettingParams = { llama_model_path?: string mmproj?: string cont_batching?: boolean + vision_model?: boolean + text_model?: boolean } /** diff --git a/extensions/assistant-extension/src/index.ts b/extensions/assistant-extension/src/index.ts index 0a5319c8a..a2c153295 100644 --- a/extensions/assistant-extension/src/index.ts +++ b/extensions/assistant-extension/src/index.ts @@ -10,6 +10,7 @@ import { executeOnMain, AssistantExtension, AssistantEvent, + ChatCompletionMessageContentType, } from '@janhq/core' export default class JanAssistantExtension extends AssistantExtension { @@ -86,7 +87,7 @@ export default class JanAssistantExtension extends AssistantExtension { NODE, 'toolRetrievalIngestNewDocument', docFile, - data.model?.proxyEngine + data.model?.proxy_model ) } } else if ( @@ -105,7 +106,7 @@ export default class JanAssistantExtension extends AssistantExtension { ...data, model: { ...data.model, - engine: data.model.proxyEngine, + engine: data.model.proxy_model, }, } events.emit(MessageEvent.OnMessageSent, output) @@ -168,7 +169,7 @@ export default class JanAssistantExtension extends AssistantExtension { ...data, model: { ...data.model, - engine: data.model.proxyEngine, + engine: data.model.proxy_model, }, } events.emit(MessageEvent.OnMessageSent, output) diff --git a/models/bakllava-1/model.json b/models/bakllava-1/model.json index 91f6f4136..93f87c7f4 100644 --- a/models/bakllava-1/model.json +++ b/models/bakllava-1/model.json @@ -16,6 +16,8 @@ "description": "BakLlava 1 can bring vision understanding to Jan", "format": "gguf", "settings": { + "vision_model": true, + "text_model": false, "ctx_len": 4096, "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", "llama_model_path": "ggml-model-q5_k.gguf", diff --git a/models/gpt-3.5-turbo-16k-0613/model.json b/models/gpt-3.5-turbo-16k-0613/model.json index aa57e1154..ba4aed14d 100644 --- a/models/gpt-3.5-turbo-16k-0613/model.json +++ b/models/gpt-3.5-turbo-16k-0613/model.json @@ -11,7 +11,10 @@ "description": "OpenAI GPT 3.5 Turbo 16k 0613 model is extremely good", "format": "api", "settings": {}, - "parameters": {}, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, "metadata": { "author": "OpenAI", "tags": ["General", "Big Context Length"] diff --git a/models/gpt-3.5-turbo/model.json b/models/gpt-3.5-turbo/model.json index 617f0d056..0359f1950 100644 --- a/models/gpt-3.5-turbo/model.json +++ b/models/gpt-3.5-turbo/model.json @@ -11,7 +11,10 @@ "description": "OpenAI GPT 3.5 Turbo model is extremely good", "format": "api", "settings": {}, - "parameters": {}, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, "metadata": { "author": "OpenAI", "tags": ["General", "Big Context Length"] diff --git a/models/gpt-4-vision-preview/model.json b/models/gpt-4-vision-preview/model.json new file mode 100644 index 000000000..a5febf207 --- /dev/null +++ b/models/gpt-4-vision-preview/model.json @@ -0,0 +1,26 @@ +{ + "sources": [ + { + "url": "https://openai.com" + } + ], + "id": "gpt-4-vision-preview", + "object": "model", + "name": "OpenAI GPT 4 with Vision (Preview)", + "version": "1.0", + "description": "OpenAI GPT 4 with Vision model is extremely good in preview", + "format": "api", + "settings": { + "vision_model": true, + "textModel": false + }, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, + "metadata": { + "author": "OpenAI", + "tags": ["General", "Big Context Length", "Vision"] + }, + "engine": "openai" +} diff --git a/models/gpt-4/model.json b/models/gpt-4/model.json index 7aa2338e3..1d99374ef 100644 --- a/models/gpt-4/model.json +++ b/models/gpt-4/model.json @@ -11,7 +11,10 @@ "description": "OpenAI GPT 4 model is extremely good", "format": "api", "settings": {}, - "parameters": {}, + "parameters": { + "max_tokens": 4096, + "temperature": 0.7 + }, "metadata": { "author": "OpenAI", "tags": ["General", "Big Context Length"] diff --git a/models/llava-1.5-13b-q5/model.json b/models/llava-1.5-13b-q5/model.json index 027b8398f..ae17a7cb1 100644 --- a/models/llava-1.5-13b-q5/model.json +++ b/models/llava-1.5-13b-q5/model.json @@ -12,10 +12,12 @@ "id": "llava-1.5-13b-q5", "object": "model", "name": "LlaVa 1.5 13B Q5 K", - "version": "1.0", + "version": "1.1", "description": "LlaVa 1.5 can bring vision understanding to Jan", "format": "gguf", "settings": { + "vision_model": true, + "text_model": false, "ctx_len": 4096, "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", "llama_model_path": "ggml-model-q5_k.gguf", diff --git a/models/llava-1.5-7b-q5/model.json b/models/llava-1.5-7b-q5/model.json index 658b98880..1c98a519e 100644 --- a/models/llava-1.5-7b-q5/model.json +++ b/models/llava-1.5-7b-q5/model.json @@ -12,10 +12,12 @@ "id": "llava-1.5-7b-q5", "object": "model", "name": "LlaVa 1.5 7B Q5 K", - "version": "1.0", + "version": "1.1", "description": "LlaVa 1.5 can bring vision understanding to Jan", "format": "gguf", "settings": { + "vision_model": true, + "text_model": false, "ctx_len": 4096, "prompt_template": "\n### Instruction:\n{prompt}\n### Response:\n", "llama_model_path": "ggml-model-q5_k.gguf", diff --git a/web/containers/DropdownListSidebar/index.tsx b/web/containers/DropdownListSidebar/index.tsx index c05d26e51..2940fbdbe 100644 --- a/web/containers/DropdownListSidebar/index.tsx +++ b/web/containers/DropdownListSidebar/index.tsx @@ -139,11 +139,16 @@ const DropdownListSidebar = ({ // Update model parameter to the thread file if (model) - updateModelParameter(activeThread.id, { - params: modelParams, - modelId: model.id, - engine: model.engine, - }) + updateModelParameter( + activeThread.id, + { + params: modelParams, + modelId: model.id, + engine: model.engine, + }, + // Overwrite the existing model parameter + true + ) } }, [ diff --git a/web/hooks/usePath.ts b/web/hooks/usePath.ts index bc4a94d1f..545cfb6ee 100644 --- a/web/hooks/usePath.ts +++ b/web/hooks/usePath.ts @@ -1,4 +1,9 @@ -import { openFileExplorer, joinPath, getJanDataFolderPath } from '@janhq/core' +import { + openFileExplorer, + joinPath, + getJanDataFolderPath, + baseName, +} from '@janhq/core' import { useAtomValue } from 'jotai' import { selectedModelAtom } from '@/containers/DropdownListSidebar' @@ -78,6 +83,8 @@ export const usePath = () => { const userSpace = await getJanDataFolderPath() let filePath = undefined + + id = await baseName(id) filePath = await joinPath(['threads', `${activeThread.id}/files`, `${id}`]) if (!filePath) return const fullPath = await joinPath([userSpace, filePath]) diff --git a/web/hooks/useSendChatMessage.ts b/web/hooks/useSendChatMessage.ts index 6c8f98aab..9b3664203 100644 --- a/web/hooks/useSendChatMessage.ts +++ b/web/hooks/useSendChatMessage.ts @@ -30,7 +30,7 @@ import { fileUploadAtom, } from '@/containers/Providers/Jotai' -import { getBase64 } from '@/utils/base64' +import { compressImage, getBase64 } from '@/utils/base64' import { toRuntimeParams, toSettingParams } from '@/utils/modelParam' import { loadModelErrorAtom, useActiveModel } from './useActiveModel' @@ -169,12 +169,22 @@ export default function useSendChatMessage() { setCurrentPrompt('') setEditPrompt('') - const base64Blob = fileUpload[0] - ? await getBase64(fileUpload[0].file).then() + let base64Blob = fileUpload[0] + ? await getBase64(fileUpload[0].file) : undefined + const fileContentType = fileUpload[0]?.type + const msgId = ulid() + const isDocumentInput = base64Blob && fileContentType === 'pdf' + const isImageInput = base64Blob && fileContentType === 'image' + + if (isImageInput && base64Blob) { + // Compress image + base64Blob = await compressImage(base64Blob, 512) + } + const messages: ChatCompletionMessage[] = [ activeThread.assistants[0]?.instructions, ] @@ -202,13 +212,23 @@ export default function useSendChatMessage() { type: ChatCompletionMessageContentType.Text, text: prompt, }, - { - type: ChatCompletionMessageContentType.Doc, - doc_url: { - url: `threads/${activeThread.id}/files/${msgId}.pdf`, - }, - }, - ] + isDocumentInput + ? { + type: ChatCompletionMessageContentType.Doc, + doc_url: { + url: `threads/${activeThread.id}/files/${msgId}.pdf`, + }, + } + : null, + isImageInput + ? { + type: ChatCompletionMessageContentType.Image, + image_url: { + url: base64Blob, + }, + } + : null, + ].filter((e) => e !== null) : prompt, } as ChatCompletionMessage, ]) @@ -226,8 +246,13 @@ export default function useSendChatMessage() { ) { modelRequest = { ...modelRequest, - engine: InferenceEngine.tool_retrieval_enabled, - proxyEngine: modelRequest.engine, + // Tool retrieval support document input only for now + ...(isDocumentInput + ? { + engine: InferenceEngine.tool_retrieval_enabled, + proxy_model: modelRequest.engine, + } + : {}), } } const messageRequest: MessageRequest = { diff --git a/web/hooks/useSetActiveThread.ts b/web/hooks/useSetActiveThread.ts index 486a14d03..8e9268065 100644 --- a/web/hooks/useSetActiveThread.ts +++ b/web/hooks/useSetActiveThread.ts @@ -21,17 +21,17 @@ export default function useSetActiveThread() { const setActiveThread = async (thread: Thread) => { // Load local messages only if there are no messages in the state - if (!readyMessageThreads[thread.id]) { - const messages = await getLocalThreadMessage(thread.id) - setThreadMessage(thread.id, messages) + if (!readyMessageThreads[thread?.id]) { + const messages = await getLocalThreadMessage(thread?.id) + setThreadMessage(thread?.id, messages) } - setActiveThreadId(thread.id) + setActiveThreadId(thread?.id) const modelParams: ModelParams = { - ...thread.assistants[0]?.model?.parameters, - ...thread.assistants[0]?.model?.settings, + ...thread?.assistants[0]?.model?.parameters, + ...thread?.assistants[0]?.model?.settings, } - setThreadModelParams(thread.id, modelParams) + setThreadModelParams(thread?.id, modelParams) } return { setActiveThread } diff --git a/web/hooks/useUpdateModelParameters.ts b/web/hooks/useUpdateModelParameters.ts index 694394cee..99663229b 100644 --- a/web/hooks/useUpdateModelParameters.ts +++ b/web/hooks/useUpdateModelParameters.ts @@ -37,7 +37,8 @@ export default function useUpdateModelParameters() { const updateModelParameter = async ( threadId: string, - settings: UpdateModelParameter + settings: UpdateModelParameter, + overwrite: boolean = false ) => { const thread = threads.find((thread) => thread.id === threadId) if (!thread) { @@ -66,8 +67,14 @@ export default function useUpdateModelParameters() { const runtimeParams = toRuntimeParams(updatedModelParams) const settingParams = toSettingParams(updatedModelParams) - assistant.model.parameters = runtimeParams - assistant.model.settings = settingParams + assistant.model.parameters = { + ...(overwrite ? {} : assistant.model.parameters), + ...runtimeParams, + } + assistant.model.settings = { + ...(overwrite ? {} : assistant.model.settings), + ...settingParams, + } if (selectedModel) { assistant.model.id = settings.modelId ?? selectedModel?.id assistant.model.engine = settings.engine ?? selectedModel?.engine diff --git a/web/screens/Chat/ChatInput/index.tsx b/web/screens/Chat/ChatInput/index.tsx index d5334cab8..052720d6c 100644 --- a/web/screens/Chat/ChatInput/index.tsx +++ b/web/screens/Chat/ChatInput/index.tsx @@ -165,7 +165,8 @@ const ChatInput: React.FC = () => { if ( fileUpload.length > 0 || (activeThread?.assistants[0].tools && - !activeThread?.assistants[0].tools[0]?.enabled) + !activeThread?.assistants[0].tools[0]?.enabled && + !activeThread?.assistants[0].model.settings.vision_model) ) { e.stopPropagation() } else { @@ -177,7 +178,8 @@ const ChatInput: React.FC = () => { {fileUpload.length > 0 || (activeThread?.assistants[0].tools && - !activeThread?.assistants[0].tools[0]?.enabled && ( + !activeThread?.assistants[0].tools[0]?.enabled && + !activeThread?.assistants[0].model.settings.vision_model && ( {fileUpload.length !== 0 && ( @@ -206,15 +208,41 @@ const ChatInput: React.FC = () => { className="absolute bottom-10 right-0 w-36 cursor-pointer rounded-lg border border-border bg-background py-1 shadow" >
    -
  • +
  • { + if (activeThread?.assistants[0].model.settings.vision_model) { + imageInputRef.current?.click() + setShowAttacmentMenus(false) + } + }} + > Image
  • { - fileInputRef.current?.click() - setShowAttacmentMenus(false) + if ( + !activeThread?.assistants[0].model.settings.vision_model || + activeThread?.assistants[0].model.settings.text_model !== + false + ) { + fileInputRef.current?.click() + setShowAttacmentMenus(false) + } }} > diff --git a/web/screens/Chat/SimpleTextMessage/RelativeImage.tsx b/web/screens/Chat/SimpleTextMessage/RelativeImage.tsx new file mode 100644 index 000000000..fda4c0755 --- /dev/null +++ b/web/screens/Chat/SimpleTextMessage/RelativeImage.tsx @@ -0,0 +1,30 @@ +import { useEffect, useState } from 'react' + +import { getJanDataFolderPath } from '@janhq/core' + +export const RelativeImage = ({ + id, + src, + onClick, +}: { + id: string + src: string + onClick: () => void +}) => { + const [path, setPath] = useState('') + + useEffect(() => { + getJanDataFolderPath().then((dataFolderPath) => { + setPath(dataFolderPath) + }) + }, []) + return ( + + ) +} diff --git a/web/screens/Chat/SimpleTextMessage/index.tsx b/web/screens/Chat/SimpleTextMessage/index.tsx index e5e2364b4..8d72614ad 100644 --- a/web/screens/Chat/SimpleTextMessage/index.tsx +++ b/web/screens/Chat/SimpleTextMessage/index.tsx @@ -38,6 +38,8 @@ import EditChatInput from '../EditChatInput' import Icon from '../FileUploadPreview/Icon' import MessageToolbar from '../MessageToolbar' +import { RelativeImage } from './RelativeImage' + import { editMessageAtom, getCurrentChatMessagesAtom, @@ -204,14 +206,16 @@ const SimpleTextMessage: React.FC = (props) => {
    <> {props.content[0]?.type === ContentType.Image && ( -
    - {props.content[0]?.text.name} onViewFile(`${props.id}.png`)} - /> -
    +
    +
    + + onViewFile(`${props.content[0]?.text.annotations[0]}`) + } + /> +
    => resolve(baseURL as string) } }) + +export function compressImage( + base64Image: string, + size: number +): Promise { + // Create a canvas element + const canvas = document.createElement('canvas') + const ctx = canvas.getContext('2d') + + // Create an image object + const image = new Image() + + // Set the image source to the base64 string + image.src = base64Image + + return new Promise((resolve) => { + // Wait for the image to load + image.onload = () => { + // Set the canvas width and height to the image width and height + const width = Math.min(size, image.width) + const height = (image.height / image.width) * width + + canvas.width = width + canvas.height = height + + // Draw the image on the canvas + ctx?.drawImage(image, 0, 0, canvas.width, canvas.height) + + // Convert the canvas to a data URL with the specified quality + const compressedBase64Image = canvas.toDataURL(`image/jpeg`, 1) + + // Log the compressed base64 image + return resolve(compressedBase64Image) + } + }) +} From 02013639a4eb728aa2045218f850f79fdeaf525a Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 5 Mar 2024 13:39:08 +0700 Subject: [PATCH 005/131] fix: drag and drop support image format when model has vision_model attribute (#2237) --- web/screens/Chat/ChatInput/index.tsx | 8 +++---- web/screens/Chat/index.tsx | 33 +++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/web/screens/Chat/ChatInput/index.tsx b/web/screens/Chat/ChatInput/index.tsx index 052720d6c..a7985a59c 100644 --- a/web/screens/Chat/ChatInput/index.tsx +++ b/web/screens/Chat/ChatInput/index.tsx @@ -165,8 +165,7 @@ const ChatInput: React.FC = () => { if ( fileUpload.length > 0 || (activeThread?.assistants[0].tools && - !activeThread?.assistants[0].tools[0]?.enabled && - !activeThread?.assistants[0].model.settings.vision_model) + !activeThread?.assistants[0].tools[0]?.enabled) ) { e.stopPropagation() } else { @@ -178,8 +177,7 @@ const ChatInput: React.FC = () => { {fileUpload.length > 0 || (activeThread?.assistants[0].tools && - !activeThread?.assistants[0].tools[0]?.enabled && - !activeThread?.assistants[0].model.settings.vision_model && ( + !activeThread?.assistants[0].tools[0]?.enabled && ( {fileUpload.length !== 0 && ( @@ -205,7 +203,7 @@ const ChatInput: React.FC = () => { {showAttacmentMenus && (
    • { const isGeneratingResponse = useAtomValue(isGeneratingResponseAtom) + const acceptedFormat: Accept = activeThread?.assistants[0].model.settings + .vision_model + ? { + 'application/pdf': ['.pdf'], + 'image/jpeg': ['.jpeg'], + 'image/png': ['.png'], + 'image/jpg': ['.jpg'], + } + : { + 'application/pdf': ['.pdf'], + } + const { getRootProps, isDragReject } = useDropzone({ noClick: true, multiple: false, - accept: { - 'application/pdf': ['.pdf'], - }, + accept: acceptedFormat, onDragOver: (e) => { // Retrieval file drag and drop is experimental feature @@ -164,10 +174,21 @@ const ChatScreen: React.FC = () => {
      {isDragReject - ? 'Currently, we only support 1 attachment at the same time with PDF format' + ? `Currently, we only support 1 attachment at the same time with ${ + activeThread?.assistants[0].model.settings + .vision_model + ? 'PDF, JPEG, JPG, PNG' + : 'PDF' + } format` : 'Drop file here'}
      - {!isDragReject &&

      (PDF)

      } + {!isDragReject && ( +

      + {activeThread?.assistants[0].model.settings.vision_model + ? 'PDF, JPEG, JPG, PNG' + : 'PDF'} +

      + )}
    From 8ecd93661d94667316afed4635bf1f5a1f2d792d Mon Sep 17 00:00:00 2001 From: NamH Date: Tue, 5 Mar 2024 14:03:39 +0700 Subject: [PATCH 006/131] fix: replaced user path from app log (#2238) Signed-off-by: James Co-authored-by: James --- web/hooks/useLogs.tsx | 45 +++++++++++++++++++++++++++---------------- web/hooks/usePath.ts | 21 +++++++------------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/web/hooks/useLogs.tsx b/web/hooks/useLogs.tsx index fc591405f..91620d6c3 100644 --- a/web/hooks/useLogs.tsx +++ b/web/hooks/useLogs.tsx @@ -1,26 +1,37 @@ -import { - fs, - joinPath, - openFileExplorer, - getJanDataFolderPath, -} from '@janhq/core' +import { useCallback } from 'react' + +import { fs, joinPath, openFileExplorer } from '@janhq/core' +import { useAtomValue } from 'jotai' + +import { janDataFolderPathAtom } from '@/helpers/atoms/AppConfig.atom' export const useLogs = () => { - const getLogs = async (file: string) => { - const path = await joinPath(['file://logs', `${file}.log`]) - if (!(await fs.existsSync(path))) return {} - const logs = await fs.readFileSync(path, 'utf-8') + const janDataFolderPath = useAtomValue(janDataFolderPathAtom) - return logs - } - const openServerLog = async () => { - const janDataFolderPath = await getJanDataFolderPath() + const getLogs = useCallback( + async (file: string) => { + const path = await joinPath(['file://logs', `${file}.log`]) + if (!(await fs.existsSync(path))) return '' + const logs = await fs.readFileSync(path, 'utf-8') + + const sanitizedLogs = logs.replace( + new RegExp(`${janDataFolderPath}\\/`, 'g'), + 'jan-data-folder/' + ) + + return sanitizedLogs + }, + [janDataFolderPath] + ) + + const openServerLog = useCallback(async () => { const fullPath = await joinPath([janDataFolderPath, 'logs', 'server.log']) return openFileExplorer(fullPath) - } + }, [janDataFolderPath]) - const clearServerLog = async () => { + const clearServerLog = useCallback(async () => { await fs.writeFileSync(await joinPath(['file://logs', 'server.log']), '') - } + }, []) + return { getLogs, openServerLog, clearServerLog } } diff --git a/web/hooks/usePath.ts b/web/hooks/usePath.ts index 545cfb6ee..ed784a5c5 100644 --- a/web/hooks/usePath.ts +++ b/web/hooks/usePath.ts @@ -1,16 +1,13 @@ -import { - openFileExplorer, - joinPath, - getJanDataFolderPath, - baseName, -} from '@janhq/core' +import { openFileExplorer, joinPath, baseName } from '@janhq/core' import { useAtomValue } from 'jotai' import { selectedModelAtom } from '@/containers/DropdownListSidebar' +import { janDataFolderPathAtom } from '@/helpers/atoms/AppConfig.atom' import { activeThreadAtom } from '@/helpers/atoms/Thread.atom' export const usePath = () => { + const janDataFolderPath = useAtomValue(janDataFolderPathAtom) const activeThread = useAtomValue(activeThreadAtom) const selectedModel = useAtomValue(selectedModelAtom) @@ -18,7 +15,6 @@ export const usePath = () => { // TODO: this logic should be refactored. if (type !== 'Model' && !activeThread) return - const userSpace = await getJanDataFolderPath() let filePath = undefined const assistantId = activeThread?.assistants[0]?.assistant_id switch (type) { @@ -40,7 +36,7 @@ export const usePath = () => { } if (!filePath) return - const fullPath = await joinPath([userSpace, filePath]) + const fullPath = await joinPath([janDataFolderPath, filePath]) openFileExplorer(fullPath) } @@ -48,7 +44,6 @@ export const usePath = () => { // TODO: this logic should be refactored. if (type !== 'Model' && !activeThread) return - const userSpace = await getJanDataFolderPath() let filePath = undefined const assistantId = activeThread?.assistants[0]?.assistant_id switch (type) { @@ -74,31 +69,29 @@ export const usePath = () => { } if (!filePath) return - const fullPath = await joinPath([userSpace, filePath]) + const fullPath = await joinPath([janDataFolderPath, filePath]) openFileExplorer(fullPath) } const onViewFile = async (id: string) => { if (!activeThread) return - const userSpace = await getJanDataFolderPath() let filePath = undefined id = await baseName(id) filePath = await joinPath(['threads', `${activeThread.id}/files`, `${id}`]) if (!filePath) return - const fullPath = await joinPath([userSpace, filePath]) + const fullPath = await joinPath([janDataFolderPath, filePath]) openFileExplorer(fullPath) } const onViewFileContainer = async () => { if (!activeThread) return - const userSpace = await getJanDataFolderPath() let filePath = undefined filePath = await joinPath(['threads', `${activeThread.id}/files`]) if (!filePath) return - const fullPath = await joinPath([userSpace, filePath]) + const fullPath = await joinPath([janDataFolderPath, filePath]) openFileExplorer(fullPath) } From 5758ac8b9427ae30dc184a08eb26d201b6eec68d Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Tue, 5 Mar 2024 16:01:51 +0700 Subject: [PATCH 007/131] docs: Update tailwind config and remove unused css --- .../HomepagePrimaryFeatures/styles.module.css | 77 ---------------- .../styles.module.css | 87 ------------------- .../styles.module.css | 68 --------------- .../NavbarExtension/NavPageContainer.jsx | 25 ------ .../NavPageContainer.module.css | 14 --- .../theme/NavbarExtension/index.module.css | 19 ---- docs/tailwind.config.js | 6 +- 7 files changed, 5 insertions(+), 291 deletions(-) delete mode 100644 docs/src/components/HomepagePrimaryFeatures/styles.module.css delete mode 100644 docs/src/components/HomepageSecondaryFeatures/styles.module.css delete mode 100644 docs/src/components/HomepageTerinaryFeatures/styles.module.css delete mode 100644 docs/src/theme/NavbarExtension/NavPageContainer.jsx delete mode 100644 docs/src/theme/NavbarExtension/NavPageContainer.module.css delete mode 100644 docs/src/theme/NavbarExtension/index.module.css diff --git a/docs/src/components/HomepagePrimaryFeatures/styles.module.css b/docs/src/components/HomepagePrimaryFeatures/styles.module.css deleted file mode 100644 index 63fb3a1e1..000000000 --- a/docs/src/components/HomepagePrimaryFeatures/styles.module.css +++ /dev/null @@ -1,77 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 5rem 0; - width: 100%; -} - -.cards { - display: flex; - flex-wrap: wrap; - gap: 4rem; -} - -@media screen and (max-width: 768px) { - .cards { - gap: 2rem; - } -} - -.card { - min-width: 250px; - min-height: 275px; - max-height: 325px; - flex: 1; - border-radius: 15px; - padding: 2rem 1.5rem; - position: relative; - display: flex; - flex-direction: column; - justify-content: space-between; -} - -.card p { - font-size: 1.25rem; -} - -.cardImage { - position: absolute; - right: 1rem; - bottom: 1rem; -} - -.cardImage img { - height: 100px; -} - -@media screen and (max-width: 1024px) { - .cardImage { - display: none; - } -} - -.cardBluish { - background: linear-gradient(90deg, rgba(238,238,238,1) 0%, rgba(185,202,237,1) 100%); -} - -.cardPinkish { - background: linear-gradient(90deg, rgba(238,238,238,1) 0%, rgba(215,194,238,1) 100%); -} - -.card h3 { - font-size: 1.5rem; - font-weight: 600; - padding-top: 1rem; -} - -.card a { - all: unset; - color: white; - background-color: #1C1E21; - padding: 0.75rem 1.25rem; - border-radius: 6px; -} - -.card a:hover { - cursor: pointer; -} \ No newline at end of file diff --git a/docs/src/components/HomepageSecondaryFeatures/styles.module.css b/docs/src/components/HomepageSecondaryFeatures/styles.module.css deleted file mode 100644 index 1d0710ee7..000000000 --- a/docs/src/components/HomepageSecondaryFeatures/styles.module.css +++ /dev/null @@ -1,87 +0,0 @@ -.features { - padding-top: 2rem; - display: flex; - align-items: center; - width: 100%; -} - -.cards { - display: flex; - flex-wrap: wrap; - justify-content: center; /* Center align the cards */ - gap: 2rem; -} - -.card { - background-color: #ECECEF; - width: calc(33.33% - 2rem); /* Adjust width for responsiveness */ - border-radius: 15px; - position: relative; - display: flex; - flex-direction: column; - justify-content: space-between; - margin-bottom: 2rem; /* Add margin between cards */ - padding: 1rem; /* Add padding to cards */ -} - -@media screen and (max-width: 768px) { - .card { - width: calc(50% - 2rem); /* Adjust width for smaller screens */ - } -} - -@media screen and (max-width: 576px) { - .card { - width: calc(100% - 2rem); /* Adjust width for mobile screens */ - } -} - -.cardContent { - margin-top: 3rem; - padding: 2rem; -} - -.cardLogo { - height: 130px; - width: 100%; -} - -.cardFooter { - padding-left: 2rem; - padding-right: 2rem; - padding-bottom: 2rem; - padding-top: 0; -} - -.cardLogo img { - object-fit: cover; -} - -.card p { - font-size: 1rem; - padding-top: 1rem; -} - -.card h3 { - font-size: 1.25rem; - font-weight: 600; -} - -.card a { - all: unset; - color: white; - background-color: #1C1E21; - padding: 0.75rem 1.25rem; - border-radius: 6px; -} - -.card a svg { - padding-top: 12px; - height: 1.5rem; - width: 1.5rem; - color: white; -} - -.card a:hover { - cursor: pointer; -} diff --git a/docs/src/components/HomepageTerinaryFeatures/styles.module.css b/docs/src/components/HomepageTerinaryFeatures/styles.module.css deleted file mode 100644 index be47332e0..000000000 --- a/docs/src/components/HomepageTerinaryFeatures/styles.module.css +++ /dev/null @@ -1,68 +0,0 @@ -.features { - padding-top: 5rem; - padding-bottom: 5rem; - display: flex; - align-items: center; - width: 100%; -} - -.cards { - display: flex; - justify-content: center; - flex-wrap: wrap; - gap: 2rem; -} - -@media screen and (max-width: 768px) { - .cards { - gap: 2rem; - } -} - -.card { - background-color: #ECECEF; - width: 275px; - border-radius: 15px; - position: relative; - display: flex; - flex-direction: column; - /* justify-content: space-between; */ - padding: 2rem; -} - -.cardContent { - margin-top: 1rem; - justify-content: start; -} - -.cardContent li { - font-weight: 600; - list-style: circle; - margin: 1rem; - padding: 0; -} - -.cardContent li::marker { - color: #2563EB; -} - -.cardHeader { - display: flex; - align-content: center; - gap: 1rem; -} - -.cardHeader img { - /*width: 40px;*/ - height: 40px; -} - -.card p { - font-size: 1rem; - margin-bottom: 1rem; -} - -.card h3 { - font-size: 1.2rem; - font-weight: 600; -} diff --git a/docs/src/theme/NavbarExtension/NavPageContainer.jsx b/docs/src/theme/NavbarExtension/NavPageContainer.jsx deleted file mode 100644 index 0c292c5a4..000000000 --- a/docs/src/theme/NavbarExtension/NavPageContainer.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from "react"; -import Link from '@docusaurus/Link'; -import css from "./NavPageContainer.module.css"; - -export default function NavPageContainer() { - return ( -
    - - Guide - - - Developer - - - API Reference - -
    - ); -} \ No newline at end of file diff --git a/docs/src/theme/NavbarExtension/NavPageContainer.module.css b/docs/src/theme/NavbarExtension/NavPageContainer.module.css deleted file mode 100644 index 9a5f14a1b..000000000 --- a/docs/src/theme/NavbarExtension/NavPageContainer.module.css +++ /dev/null @@ -1,14 +0,0 @@ -.NavPageContainer { - margin-right: auto; - display: flex; - align-items: right; - } - - .NavPageItem { - margin: 0 30px; - font-size: 16px; - font-weight: normal; - color: #262a2f; - cursor: pointer; - text-decoration: none; - } \ No newline at end of file diff --git a/docs/src/theme/NavbarExtension/index.module.css b/docs/src/theme/NavbarExtension/index.module.css deleted file mode 100644 index 4811f0fa5..000000000 --- a/docs/src/theme/NavbarExtension/index.module.css +++ /dev/null @@ -1,19 +0,0 @@ -.NavBar { - height: 3rem; /* Adjust height as needed */ - background-color: #fff; - padding: 0.5rem 0.8rem; /* Adjust padding as needed */ - display: flex; - align-items: center; - justify-content: space-between; /* Align items to the start and end of the container */ - position: fixed; /* Fixed position to keep it on top */ - top: 55px; /* Position it at the top */ - left: 0; /* Position it at the left */ - width: 100%; /* Occupy full width of the viewport */ - z-index: 5; /* Ensure it's above other elements */ -} - -@media screen and (max-width: 768px) { - .NavBar { - display: none; /* Hide the NavBar on mobile devices */ - } -} diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js index 7ef39234d..a79121d56 100644 --- a/docs/tailwind.config.js +++ b/docs/tailwind.config.js @@ -57,7 +57,11 @@ module.exports = { "sans-serif", ], }, - extend: {}, + extend: { + backgroundImage: { + 'custom-img': "url('/img/homepage-new/bg.png')", + } + }, }, plugins: [require("tailwindcss-animate")], }; From 50412a6eed297b70feb1adc30f2b926cbfeaa635 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Tue, 5 Mar 2024 16:02:33 +0700 Subject: [PATCH 008/131] docs: Update navbar content and styling so it has style similar to Snowflake --- docs/src/theme/NavbarExtension/index.js | 51 +++++++++++++++++++++---- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/docs/src/theme/NavbarExtension/index.js b/docs/src/theme/NavbarExtension/index.js index 885482839..29e49f812 100644 --- a/docs/src/theme/NavbarExtension/index.js +++ b/docs/src/theme/NavbarExtension/index.js @@ -1,13 +1,48 @@ import React from "react"; -import css from "./index.module.css"; -import NavPageContainer from "./NavPageContainer"; +import { NavLink, useLocation } from "react-router-dom"; +export default function NavBarExtension() { + const location = useLocation(); - -export default function NavBar() { return ( -
    - -
    + ); -} \ No newline at end of file +} From afd3cb95b802a53581e6bc005b310d448f7e1eb9 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Tue, 5 Mar 2024 16:03:04 +0700 Subject: [PATCH 009/131] docs: Hub page styling fix darkmode and change into tailwind styling --- docs/src/pages/docs.js | 46 +++++++++++++++---------------- docs/src/pages/docs.module.css | 49 ---------------------------------- 2 files changed, 23 insertions(+), 72 deletions(-) diff --git a/docs/src/pages/docs.js b/docs/src/pages/docs.js index a46f98e47..934d9471f 100644 --- a/docs/src/pages/docs.js +++ b/docs/src/pages/docs.js @@ -1,22 +1,22 @@ -import clsx from 'clsx' -import useDocusaurusContext from '@docusaurus/useDocusaurusContext' -import Layout from '@theme/Layout' -import Heading from '@theme/Heading' +import React from 'react'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import Heading from '@theme/Heading'; +import { DocSearch } from '@docsearch/react'; +import HomepagePrimaryFeatures from '../components/HomepagePrimaryFeatures'; +import HomepageSecondaryFeatures from '../components/HomepageSecondaryFeatures'; +import HomepageTerinaryFeatures from '../components/HomepageTerinaryFeatures'; + import styles from './docs.module.css' -import HomepagePrimaryFeatures from '../components/HomepagePrimaryFeatures' -import HomepageSecondaryFeatures from '../components/HomepageSecondaryFeatures' -import HomepageTerinaryFeatures from '../components/HomepageTerinaryFeatures' -import { DocSearch } from '@docsearch/react' -import NavbarExtended from '../theme/NavbarExtension' function HomepageHeader() { - const { siteConfig } = useDocusaurusContext() + const { siteConfig } = useDocusaurusContext(); return ( -
    - -
    - +
    +
    +
    + Hello, how can we help?
    @@ -28,30 +28,30 @@ function HomepageHeader() { insight={true} />
    -

    - Open-source ChatGPT alternative that runs 100% offline on your - computer. + +

    + Open-source ChatGPT alternative that runs 100% offline on your computer.

    - ) + ); } export default function Home() { - const { siteConfig } = useDocusaurusContext() + const { siteConfig } = useDocusaurusContext(); return ( -
    +
    -
    +
    - ) + ); } diff --git a/docs/src/pages/docs.module.css b/docs/src/pages/docs.module.css index 590c5a18b..009ff2930 100644 --- a/docs/src/pages/docs.module.css +++ b/docs/src/pages/docs.module.css @@ -1,47 +1,3 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } -} - -@media screen and (max-width: 1400px) { - .homeBg { - background-size: auto 600px !important; - } -} - -.homeBg { - background-image: url('/img/homepage-new/bg.png') !important; - background-size: contain; - background-repeat: no-repeat; -} - -.heroTitle { - font-size: 3rem; - font-weight: 600; - color: white; - margin-top: 4rem; - margin-bottom: 3rem; -} - -@media screen and (max-width: 1024px) { - .heroTitle { - font-size: 2rem; - } -} - .searchBar { background-color: white; max-width: 580px; @@ -88,8 +44,3 @@ padding: 0px 5px; margin: 0px 10px; } - -.heroSubtitle { - font-size: 1.25rem; - color: white; -} From 16bbd9e52bb63ce2ea9db22dfbe488317683fb19 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Tue, 5 Mar 2024 16:03:30 +0700 Subject: [PATCH 010/131] docs: update layout so it can handle navbar function smoothly --- docs/src/theme/Layout/index.js | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/src/theme/Layout/index.js b/docs/src/theme/Layout/index.js index 2557d2c9f..a0286812a 100644 --- a/docs/src/theme/Layout/index.js +++ b/docs/src/theme/Layout/index.js @@ -14,6 +14,11 @@ import Footer from "@site/src/containers/Footer"; import LayoutProvider from "@theme/Layout/Provider"; import ErrorPageContent from "@theme/ErrorPageContent"; import styles from "./styles.module.scss"; +import NavBarExtension from "../NavbarExtension"; +import { useLocation } from "react-router-dom"; + +const allowedPaths = ["/docs/", "/developer/", "/api-reference/", "/guides/", "/guides", "/docs", "/developer", "/api-reference", "/guides/changelog"]; + export default function Layout(props) { const { children, @@ -24,6 +29,10 @@ export default function Layout(props) { description, } = props; useKeyboardNavigation(); + + const location = useLocation(); + + const isAllowedPath = allowedPaths.includes(location.pathname); return ( @@ -32,14 +41,20 @@ export default function Layout(props) { - + + + {isAllowedPath ? : ""} + + {/* {console.log("Is allowed path?", location.pathname)} */} +
    }> From 53e0c53a23583d5e83c8ace6030977f921c350be Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Tue, 5 Mar 2024 16:04:01 +0700 Subject: [PATCH 011/131] docs: Update hub page component styling to tailwind css --- .../HomepagePrimaryFeatures/index.js | 41 ++++--- .../HomepageSecondaryFeatures/index.js | 102 +++++++---------- .../HomepageTerinaryFeatures/index.js | 105 +++++++++--------- 3 files changed, 113 insertions(+), 135 deletions(-) diff --git a/docs/src/components/HomepagePrimaryFeatures/index.js b/docs/src/components/HomepagePrimaryFeatures/index.js index b06decfb7..e139ae358 100644 --- a/docs/src/components/HomepagePrimaryFeatures/index.js +++ b/docs/src/components/HomepagePrimaryFeatures/index.js @@ -1,37 +1,34 @@ -import styles from "../HomepagePrimaryFeatures/styles.module.css"; -import clsx from "clsx"; - export default function HomepagePrimaryFeatures() { return ( -
    +
    -
    -
    +
    +
    +
    +

    Installation

    +

    Set up Jan with our guide to install across multiple platforms.

    +
    -

    Installation

    -

    Set up Jan with our guide to install across multiple platform.

    + Get Started
    - -
    - {"Card +
    + {"Card
    -
    +
    +
    +

    Models

    +

    Explore the available pre-configured AI models.

    +
    -

    Models

    -

    Explore the available pre-configured AI models.

    + Support
    -
    - Support -
    -
    - {"Card +
    + {"Card
    ); -} \ No newline at end of file +} diff --git a/docs/src/components/HomepageSecondaryFeatures/index.js b/docs/src/components/HomepageSecondaryFeatures/index.js index 3d58117af..9c8307c3f 100644 --- a/docs/src/components/HomepageSecondaryFeatures/index.js +++ b/docs/src/components/HomepageSecondaryFeatures/index.js @@ -1,67 +1,51 @@ -import styles from "../HomepageSecondaryFeatures/styles.module.css"; -import clsx from "clsx"; +import React from "react"; export default function HomepageSecondaryFeatures() { return ( -
    +
    -
    -
    -
    -
    - {"Feature -
    -
    -

    Quickstart

    -

    Jump right in with our Quickstart guide, designed to get you going with simple steps and clear instructions for a smooth setup.

    -
    -
    - -
    -
    -
    -
    - {"Feature -
    -
    -

    Integrations

    -

    Discover how Jan seamlessly integrates with 9 different system, streamlining your application for maximum efficiency.

    -
    -
    - -
    -
    -
    -
    - {"Feature -
    -
    -

    Error Codes

    -

    Navigate through common error codes with explanations and solutions to resolve them quickly.

    -
    -
    - -
    +
    + + +
    ); -} \ No newline at end of file +} + +function FeatureCard({ imgSrc, title, description, href }) { + return ( +
    +
    +
    + {"Feature +
    +
    +

    {title}

    +

    {description}

    +
    +
    + +
    + ); +} diff --git a/docs/src/components/HomepageTerinaryFeatures/index.js b/docs/src/components/HomepageTerinaryFeatures/index.js index e3003cbd9..025bab0ca 100644 --- a/docs/src/components/HomepageTerinaryFeatures/index.js +++ b/docs/src/components/HomepageTerinaryFeatures/index.js @@ -1,109 +1,106 @@ -import styles from "../HomepageTerinaryFeatures/styles.module.css"; -import clsx from "clsx"; - export default function HomepageTerinaryFeatures() { return ( -
    +
    -
    -
    -
    +
    +
    +
    {"Icon"} -

    Get Started

    +

    Get Started

    - -
    -
    +
    +
    {"Icon"} -

    Settings

    +
    Settings
    - -
    -
    +
    +
    {"Icon"} -

    Features

    +
    Features
    - -
    -
    +
    +
    {"Icon"} -

    Troubleshooting

    +
    Troubleshooting
    -
    -

    Find solutions to common issues, including error codes, and FAQs.

    -
    ); -} \ No newline at end of file +} From 22d81d563ab1b8522695b17e68c3525d492f8fd4 Mon Sep 17 00:00:00 2001 From: Service Account Date: Tue, 5 Mar 2024 10:45:33 +0000 Subject: [PATCH 012/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fa5c2a8b9..96d07bcff 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 From 56fcf981a1497c34675204ee1616e2db878311be Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Tue, 5 Mar 2024 18:07:40 +0700 Subject: [PATCH 013/131] docs: fix bug and rename Changelog nav item --- docs/src/theme/NavbarExtension/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/theme/NavbarExtension/index.js b/docs/src/theme/NavbarExtension/index.js index 29e49f812..2c40c1504 100644 --- a/docs/src/theme/NavbarExtension/index.js +++ b/docs/src/theme/NavbarExtension/index.js @@ -5,7 +5,7 @@ export default function NavBarExtension() { const location = useLocation(); return ( -
    - ); + ) } function FeatureCard({ imgSrc, title, description, href }) { @@ -34,7 +34,7 @@ function FeatureCard({ imgSrc, title, description, href }) { - ); + ) } From d6af0f0778e335ec3689d6c1bf1342d4bdd87aae Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Tue, 5 Mar 2024 21:05:53 +0900 Subject: [PATCH 020/131] docs: update not-using-gpu --- docs/docs/guides/common-error/not-using-gpu.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/guides/common-error/not-using-gpu.mdx b/docs/docs/guides/common-error/not-using-gpu.mdx index 72ba9f0cb..a7dd788f8 100644 --- a/docs/docs/guides/common-error/not-using-gpu.mdx +++ b/docs/docs/guides/common-error/not-using-gpu.mdx @@ -30,7 +30,7 @@ This guide provides steps to troubleshoot and resolve issues when the Jan app do #### NVIDIA Driver - - Install an [NVIDIA driver](https://www.nvidia.com/Download/index.aspx) supporting CUDA 11.7 or higher. + - Install an [NVIDIA Driver](https://www.nvidia.com/Download/index.aspx) supporting CUDA 11.7 or higher. - Use the following command to verify the installation: ```sh @@ -51,7 +51,7 @@ This guide provides steps to troubleshoot and resolve issues when the Jan app do #### NVIDIA Driver - - Install an [NVIDIA driver](https://www.nvidia.com/Download/index.aspx) supporting CUDA 11.7 or higher. + - Install an [NVIDIA Driver](https://www.nvidia.com/Download/index.aspx) supporting CUDA 11.7 or higher. - Use the following command to verify the installation: ```sh From b0f4c87e90583993321311f54fe3b22a18f4f5e1 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Tue, 5 Mar 2024 21:09:15 +0900 Subject: [PATCH 021/131] docs: improve current text --- docs/docs/guides/advanced-settings/http-proxy.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/advanced-settings/http-proxy.mdx b/docs/docs/guides/advanced-settings/http-proxy.mdx index 538cedfa6..23f357e8b 100644 --- a/docs/docs/guides/advanced-settings/http-proxy.mdx +++ b/docs/docs/guides/advanced-settings/http-proxy.mdx @@ -23,7 +23,7 @@ HTTPS Proxy encrypts data between your browser and the internet, making it hard :::note -When configuring Jan using an HTTPS proxy, the speed of downloading model may be affected due to the encryption and decryption process. It also depends on the networking of cloud provider. +When configuring Jan using an HTTPS proxy, the speed of the downloading model may be affected due to the encryption and decryption process. It also depends on the networking of the cloud service provider. ::: From 510491253cdd9eb3c4dabfe321554c6236f3128a Mon Sep 17 00:00:00 2001 From: NamH Date: Tue, 5 Mar 2024 22:09:38 +0700 Subject: [PATCH 022/131] fix: error message being sent along with conversation when inference (#2242) Signed-off-by: James Co-authored-by: James --- core/src/types/message/messageEntity.ts | 9 +++++++++ .../inference-openai-extension/src/helpers/sse.ts | 10 +++++++--- extensions/inference-openai-extension/src/index.ts | 1 + web/screens/Chat/ChatBody/index.tsx | 10 +++++----- web/screens/Chat/ErrorMessage/index.tsx | 8 ++++++-- web/utils/errorMessage.ts | 11 +++++++++++ 6 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 web/utils/errorMessage.ts diff --git a/core/src/types/message/messageEntity.ts b/core/src/types/message/messageEntity.ts index e9211d550..b7365c6cd 100644 --- a/core/src/types/message/messageEntity.ts +++ b/core/src/types/message/messageEntity.ts @@ -29,6 +29,9 @@ export type ThreadMessage = { metadata?: Record type?: string + + /** The error code which explain what error type. Used in conjunction with MessageStatus.Error */ + error_code?: ErrorCode } /** @@ -77,6 +80,12 @@ export enum MessageStatus { Stopped = 'stopped', } +export enum ErrorCode { + InvalidApiKey = 'invalid_api_key', + + Unknown = 'unknown', +} + /** * The content type of the message. */ diff --git a/extensions/inference-openai-extension/src/helpers/sse.ts b/extensions/inference-openai-extension/src/helpers/sse.ts index 11db38282..23528912d 100644 --- a/extensions/inference-openai-extension/src/helpers/sse.ts +++ b/extensions/inference-openai-extension/src/helpers/sse.ts @@ -1,3 +1,4 @@ +import { ErrorCode } from '@janhq/core' import { Observable } from 'rxjs' /** @@ -40,9 +41,12 @@ export function requestInference( }) .then(async (response) => { if (!response.ok) { - subscriber.next( - (await response.json()).error?.message ?? 'Error occurred.' - ) + const data = await response.json() + const error = { + message: data.error?.message ?? 'Error occurred.', + code: data.error?.code ?? ErrorCode.Unknown, + } + subscriber.error(error) subscriber.complete() return } diff --git a/extensions/inference-openai-extension/src/index.ts b/extensions/inference-openai-extension/src/index.ts index 481171742..8fbba0ea3 100644 --- a/extensions/inference-openai-extension/src/index.ts +++ b/extensions/inference-openai-extension/src/index.ts @@ -216,6 +216,7 @@ export default class JanInferenceOpenAIExtension extends BaseExtension { } message.content = [messageContent] message.status = MessageStatus.Error + message.error_code = err.code events.emit(MessageEvent.OnMessageUpdate, message) }, }) diff --git a/web/screens/Chat/ChatBody/index.tsx b/web/screens/Chat/ChatBody/index.tsx index f6fc7d723..a82451f19 100644 --- a/web/screens/Chat/ChatBody/index.tsx +++ b/web/screens/Chat/ChatBody/index.tsx @@ -78,11 +78,11 @@ const ChatBody: React.FC = () => { {messages.map((message, index) => (
    - {((message.status !== MessageStatus.Error && - message.status !== MessageStatus.Pending) || - message.content.length > 0) && ( - - )} + {message.status !== MessageStatus.Error && + message.content.length > 0 && ( + + )} + {(message.status === MessageStatus.Error || message.status === MessageStatus.Stopped) && index === messages.length - 1 && ( diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx index c9041e23a..b1439597f 100644 --- a/web/screens/Chat/ErrorMessage/index.tsx +++ b/web/screens/Chat/ErrorMessage/index.tsx @@ -1,4 +1,4 @@ -import { MessageStatus, ThreadMessage } from '@janhq/core' +import { ErrorCode, MessageStatus, ThreadMessage } from '@janhq/core' import { Button } from '@janhq/uikit' import { useAtomValue, useSetAtom } from 'jotai' import { RefreshCcw } from 'lucide-react' @@ -10,6 +10,8 @@ import ModalTroubleShooting, { import { loadModelErrorAtom } from '@/hooks/useActiveModel' import useSendChatMessage from '@/hooks/useSendChatMessage' +import { getErrorTitle } from '@/utils/errorMessage' + import { getCurrentChatMessagesAtom } from '@/helpers/atoms/ChatMessage.atom' const ErrorMessage = ({ message }: { message: ThreadMessage }) => { @@ -25,6 +27,8 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { resendChatMessage(message) } + const errorTitle = getErrorTitle(message.error_code ?? ErrorCode.Unknown) + return (
    {message.status === MessageStatus.Stopped && ( @@ -68,7 +72,7 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { key={message.id} className="flex flex-col items-center text-center text-sm font-medium text-gray-500" > -

    {`Apologies, something’s amiss!`}

    +

    {errorTitle}

    Jan’s in beta. Access  { + if (errorCode === ErrorCode.Unknown) { + return 'Apologies, something’s amiss!' + } + + if (errorCode === ErrorCode.InvalidApiKey) { + return 'Invalid API key. Please check your API key and try again.' + } +} From e9e69425cac220b0c8ca154dba30bb64a9120000 Mon Sep 17 00:00:00 2001 From: Service Account Date: Tue, 5 Mar 2024 20:15:12 +0000 Subject: [PATCH 023/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 96d07bcff..ebb3c4f3f 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 From 7f6e4abb7f2d555c57534104c3177dcc58f57280 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Wed, 6 Mar 2024 08:31:14 +0700 Subject: [PATCH 024/131] docs: Fix navbar issues. Keep stay when clicked other menu items from the sidebar. --- docs/src/theme/Layout/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/theme/Layout/index.js b/docs/src/theme/Layout/index.js index a0286812a..753af50af 100644 --- a/docs/src/theme/Layout/index.js +++ b/docs/src/theme/Layout/index.js @@ -32,7 +32,8 @@ export default function Layout(props) { const location = useLocation(); - const isAllowedPath = allowedPaths.includes(location.pathname); + const isAllowedPath = allowedPaths.some(path => location.pathname.startsWith(path)); + return ( From 5ca3069fa12fb0ae26077c91dc536274271cc71c Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 6 Mar 2024 09:09:38 +0700 Subject: [PATCH 025/131] fix: image upload button and drag event are not enabled (#2248) * fix: image upload button and drag event are not enabled * fix: add tooltips for unsupported model --- extensions/model-extension/package.json | 2 +- web/containers/DropdownListSidebar/index.tsx | 15 +-- web/hooks/useUpdateModelParameters.ts | 13 +- web/screens/Chat/ChatInput/index.tsx | 130 ++++++++++++------- web/screens/Chat/index.tsx | 8 +- web/utils/modelParam.ts | 2 + 6 files changed, 102 insertions(+), 68 deletions(-) diff --git a/extensions/model-extension/package.json b/extensions/model-extension/package.json index e99122bcf..ef43ecadf 100644 --- a/extensions/model-extension/package.json +++ b/extensions/model-extension/package.json @@ -1,6 +1,6 @@ { "name": "@janhq/model-extension", - "version": "1.0.25", + "version": "1.0.27", "description": "Model Management Extension provides model exploration and seamless downloads", "main": "dist/index.js", "module": "dist/module.js", diff --git a/web/containers/DropdownListSidebar/index.tsx b/web/containers/DropdownListSidebar/index.tsx index 2940fbdbe..c05d26e51 100644 --- a/web/containers/DropdownListSidebar/index.tsx +++ b/web/containers/DropdownListSidebar/index.tsx @@ -139,16 +139,11 @@ const DropdownListSidebar = ({ // Update model parameter to the thread file if (model) - updateModelParameter( - activeThread.id, - { - params: modelParams, - modelId: model.id, - engine: model.engine, - }, - // Overwrite the existing model parameter - true - ) + updateModelParameter(activeThread.id, { + params: modelParams, + modelId: model.id, + engine: model.engine, + }) } }, [ diff --git a/web/hooks/useUpdateModelParameters.ts b/web/hooks/useUpdateModelParameters.ts index 99663229b..694394cee 100644 --- a/web/hooks/useUpdateModelParameters.ts +++ b/web/hooks/useUpdateModelParameters.ts @@ -37,8 +37,7 @@ export default function useUpdateModelParameters() { const updateModelParameter = async ( threadId: string, - settings: UpdateModelParameter, - overwrite: boolean = false + settings: UpdateModelParameter ) => { const thread = threads.find((thread) => thread.id === threadId) if (!thread) { @@ -67,14 +66,8 @@ export default function useUpdateModelParameters() { const runtimeParams = toRuntimeParams(updatedModelParams) const settingParams = toSettingParams(updatedModelParams) - assistant.model.parameters = { - ...(overwrite ? {} : assistant.model.parameters), - ...runtimeParams, - } - assistant.model.settings = { - ...(overwrite ? {} : assistant.model.settings), - ...settingParams, - } + assistant.model.parameters = runtimeParams + assistant.model.settings = settingParams if (selectedModel) { assistant.model.id = settings.modelId ?? selectedModel?.id assistant.model.engine = settings.engine ?? selectedModel?.engine diff --git a/web/screens/Chat/ChatInput/index.tsx b/web/screens/Chat/ChatInput/index.tsx index a7985a59c..c90a12cd2 100644 --- a/web/screens/Chat/ChatInput/index.tsx +++ b/web/screens/Chat/ChatInput/index.tsx @@ -53,10 +53,10 @@ const ChatInput: React.FC = () => { const activeThreadId = useAtomValue(getActiveThreadIdAtom) const [isWaitingToSend, setIsWaitingToSend] = useAtom(waitingToSendMessage) const [fileUpload, setFileUpload] = useAtom(fileUploadAtom) + const [showAttacmentMenus, setShowAttacmentMenus] = useState(false) const textareaRef = useRef(null) const fileInputRef = useRef(null) const imageInputRef = useRef(null) - const [showAttacmentMenus, setShowAttacmentMenus] = useState(false) const experimentalFeature = useAtomValue(experimentalFeatureEnabledAtom) const isGeneratingResponse = useAtomValue(isGeneratingResponseAtom) const threadStates = useAtomValue(threadStatesAtom) @@ -165,7 +165,8 @@ const ChatInput: React.FC = () => { if ( fileUpload.length > 0 || (activeThread?.assistants[0].tools && - !activeThread?.assistants[0].tools[0]?.enabled) + !activeThread?.assistants[0].tools[0]?.enabled && + !activeThread?.assistants[0].model.settings.vision_model) ) { e.stopPropagation() } else { @@ -177,12 +178,13 @@ const ChatInput: React.FC = () => { {fileUpload.length > 0 || (activeThread?.assistants[0].tools && - !activeThread?.assistants[0].tools[0]?.enabled && ( + !activeThread?.assistants[0].tools[0]?.enabled && + !activeThread?.assistants[0].model.settings.vision_model && ( {fileUpload.length !== 0 && ( Currently, we only support 1 attachment at the same - time + time. )} {activeThread?.assistants[0].tools && @@ -190,7 +192,7 @@ const ChatInput: React.FC = () => { false && ( Turn on Retrieval in Assistant Settings to use this - feature + feature. )} @@ -206,46 +208,86 @@ const ChatInput: React.FC = () => { className="absolute bottom-10 right-0 z-30 w-36 cursor-pointer rounded-lg border border-border bg-background py-1 shadow" >

      -
    • { - if (activeThread?.assistants[0].model.settings.vision_model) { - imageInputRef.current?.click() - setShowAttacmentMenus(false) - } - }} - > - - Image -
    • -
    • + +
    • { + if ( + activeThread?.assistants[0].model.settings.vision_model + ) { + imageInputRef.current?.click() + setShowAttacmentMenus(false) + } + }} + > + + Image +
    • + + + {!activeThread?.assistants[0].model.settings.vision_model && ( + + This feature only supports multimodal models. + + + )} + + + + +
    • { + if ( + !activeThread?.assistants[0].model.settings + .vision_model || + activeThread?.assistants[0].model.settings + .text_model !== false + ) { + fileInputRef.current?.click() + setShowAttacmentMenus(false) + } + }} + > + + Document +
    • +
      + + {(!activeThread?.assistants[0].tools || + !activeThread?.assistants[0].tools[0]?.enabled || activeThread?.assistants[0].model.settings.text_model === - false - ? 'cursor-not-allowed opacity-50' - : 'cursor-pointer' - )} - onClick={() => { - if ( - !activeThread?.assistants[0].model.settings.vision_model || - activeThread?.assistants[0].model.settings.text_model !== - false - ) { - fileInputRef.current?.click() - setShowAttacmentMenus(false) - } - }} - > - - Document - + false) && ( + + {activeThread?.assistants[0].model.settings.text_model === + false ? ( + + This model does not support text-based retrieval. + + ) : ( + + Turn on Retrieval in Assistant Settings to use this + feature. + + )} + + + )} + +
    )} diff --git a/web/screens/Chat/index.tsx b/web/screens/Chat/index.tsx index 4f441ac45..85fd5332c 100644 --- a/web/screens/Chat/index.tsx +++ b/web/screens/Chat/index.tsx @@ -90,8 +90,9 @@ const ChatScreen: React.FC = () => { if (!experimentalFeature) return if ( e.dataTransfer.items.length === 1 && - activeThread?.assistants[0].tools && - activeThread?.assistants[0].tools[0]?.enabled + ((activeThread?.assistants[0].tools && + activeThread?.assistants[0].tools[0]?.enabled) || + activeThread?.assistants[0].model.settings.vision_model) ) { setDragOver(true) } else if ( @@ -112,7 +113,8 @@ const ChatScreen: React.FC = () => { files.length !== 1 || rejectFiles.length !== 0 || (activeThread?.assistants[0].tools && - !activeThread?.assistants[0].tools[0]?.enabled) + !activeThread?.assistants[0].tools[0]?.enabled && + !activeThread?.assistants[0].model.settings.vision_model) ) return const imageType = files[0]?.type.includes('image') diff --git a/web/utils/modelParam.ts b/web/utils/modelParam.ts index 4b9fe84ae..a6d144c3e 100644 --- a/web/utils/modelParam.ts +++ b/web/utils/modelParam.ts @@ -42,6 +42,8 @@ export const toSettingParams = ( prompt_template: undefined, llama_model_path: undefined, mmproj: undefined, + vision_model: undefined, + text_model: undefined, } const settingParams: ModelSettingParams = {} From 9d0cdf8de99025991e6dacc7dc9077449835f2bf Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Wed, 6 Mar 2024 13:56:39 +0700 Subject: [PATCH 026/131] docs: update the changelog docs --- .../{guides => releases}/changelog/README.mdx | 4 +- .../{guides => releases}/changelog/cache.json | 0 .../changelog/changelog-v0.2.0.mdx | 92 ++--- .../changelog/changelog-v0.2.1.mdx | 164 ++++---- .../changelog/changelog-v0.2.2.mdx | 64 +-- .../changelog/changelog-v0.2.3.mdx | 38 +- .../changelog/changelog-v0.3.0.mdx | 58 +-- .../changelog/changelog-v0.3.1.mdx | 134 +++---- .../changelog/changelog-v0.3.2.mdx | 70 ++-- .../changelog/changelog-v0.3.3.mdx | 180 ++++----- .../changelog/changelog-v0.4.0.mdx | 128 +++--- .../changelog/changelog-v0.4.1.mdx | 102 ++--- .../changelog/changelog-v0.4.2.mdx | 78 ++-- .../changelog/changelog-v0.4.3.mdx | 116 +++--- .../changelog/changelog-v0.4.4.mdx | 374 +++++++++--------- .../changelog/changelog-v0.4.5.mdx | 184 ++++----- .../changelog/changelog-v0.4.6.mdx | 106 ++--- .../changelog/changelog-v0.4.7.mdx | 214 +++++----- docs/docusaurus.config.js | 11 +- docs/sidebars.js | 6 + docs/src/theme/Layout/index.js | 2 +- docs/src/theme/NavbarExtension/index.js | 8 +- 22 files changed, 1070 insertions(+), 1063 deletions(-) rename docs/docs/{guides => releases}/changelog/README.mdx (89%) rename docs/docs/{guides => releases}/changelog/cache.json (100%) rename docs/docs/{guides => releases}/changelog/changelog-v0.2.0.mdx (97%) rename docs/docs/{guides => releases}/changelog/changelog-v0.2.1.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.2.2.mdx (97%) rename docs/docs/{guides => releases}/changelog/changelog-v0.2.3.mdx (97%) rename docs/docs/{guides => releases}/changelog/changelog-v0.3.0.mdx (96%) rename docs/docs/{guides => releases}/changelog/changelog-v0.3.1.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.3.2.mdx (97%) rename docs/docs/{guides => releases}/changelog/changelog-v0.3.3.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.0.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.1.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.2.mdx (97%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.3.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.4.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.5.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.6.mdx (98%) rename docs/docs/{guides => releases}/changelog/changelog-v0.4.7.mdx (98%) diff --git a/docs/docs/guides/changelog/README.mdx b/docs/docs/releases/changelog/README.mdx similarity index 89% rename from docs/docs/guides/changelog/README.mdx rename to docs/docs/releases/changelog/README.mdx index be78d1f33..09e6d8222 100644 --- a/docs/docs/guides/changelog/README.mdx +++ b/docs/docs/releases/changelog/README.mdx @@ -1,7 +1,7 @@ --- title: Changelog -slug: /guides/changelog/ -sidebar_position: 5 +sidebar_position: 1 +slug: /changelog description: Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. keywords: [ diff --git a/docs/docs/guides/changelog/cache.json b/docs/docs/releases/changelog/cache.json similarity index 100% rename from docs/docs/guides/changelog/cache.json rename to docs/docs/releases/changelog/cache.json diff --git a/docs/docs/guides/changelog/changelog-v0.2.0.mdx b/docs/docs/releases/changelog/changelog-v0.2.0.mdx similarity index 97% rename from docs/docs/guides/changelog/changelog-v0.2.0.mdx rename to docs/docs/releases/changelog/changelog-v0.2.0.mdx index d5d9b4845..2bda6b5a7 100644 --- a/docs/docs/guides/changelog/changelog-v0.2.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.0.mdx @@ -1,46 +1,46 @@ ---- -sidebar_position: 16 ---- -# v0.2.0 - -For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.0) - -Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs](https://github.com/janhq/jan/pull/342) - -## Changes - -- feat: Add Jan Hacker House event page to Docs @dan-jan (#342) -- feat: Hide incomplete Hardware section from Docs site @dan-jan (#341) -- style: better chatbox ui @0xSage (#338) -- feat: allowing user to fetch models from github @namchuai (#319) -- fixes: #247 - inference plugin should check nitro service available @louis-jan (#313) -- Fix icon error for linux app @hiento09 (#316) -- docs: initial hardware content @Its-Alamin-H (#240) -- fixes #277 - bug: memory utilization always at 99% @louis-jan (#309) -- Docusaurus parser string from githubapi to get latest release @hiento09 (#312) -- Footer background, CTA \& Highlight colors @drakehere (#288) -- Fix CI Test run failed on ubuntu and change release file app name @hiento09 (#307) -- Add docusaurus test build pipeline @hiento09 (#302) -- fix: #271 Cannot read properties of undefined (reading 'map') @louis-jan (#300) -- Fix Docusaurus server side render error @hiento09 (#301) -- fix #283: small ui fixes @namchuai (#299) - -## 🐛 Bug Fixes - -- Fix #290: Add description in package.json and rename to jan @hiento09 (#333) - -## 🧰 Maintenance - -- Add Documentation category to release note template @hiento09 (#332) -- Chore/release note template @hiento09 (#323) -- Add release note template @hiento09 (#322) - -## 📖 Documentaion - -- Add auto update app download url on jan.ai @hiento09 (#311) -- docs: update per v0.1.3 @0xSage (#280) - -## Contributor - -@0xSage, @Its-Alamin-H, @dan-jan, @drakehere, @hiento09, @hientominh, @louis-jan, @namchuai, Hien To and James - +--- +sidebar_position: 16 +--- +# v0.2.0 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.0) + +Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs](https://github.com/janhq/jan/pull/342) + +## Changes + +- feat: Add Jan Hacker House event page to Docs @dan-jan (#342) +- feat: Hide incomplete Hardware section from Docs site @dan-jan (#341) +- style: better chatbox ui @0xSage (#338) +- feat: allowing user to fetch models from github @namchuai (#319) +- fixes: #247 - inference plugin should check nitro service available @louis-jan (#313) +- Fix icon error for linux app @hiento09 (#316) +- docs: initial hardware content @Its-Alamin-H (#240) +- fixes #277 - bug: memory utilization always at 99% @louis-jan (#309) +- Docusaurus parser string from githubapi to get latest release @hiento09 (#312) +- Footer background, CTA \& Highlight colors @drakehere (#288) +- Fix CI Test run failed on ubuntu and change release file app name @hiento09 (#307) +- Add docusaurus test build pipeline @hiento09 (#302) +- fix: #271 Cannot read properties of undefined (reading 'map') @louis-jan (#300) +- Fix Docusaurus server side render error @hiento09 (#301) +- fix #283: small ui fixes @namchuai (#299) + +## 🐛 Bug Fixes + +- Fix #290: Add description in package.json and rename to jan @hiento09 (#333) + +## 🧰 Maintenance + +- Add Documentation category to release note template @hiento09 (#332) +- Chore/release note template @hiento09 (#323) +- Add release note template @hiento09 (#322) + +## 📖 Documentaion + +- Add auto update app download url on jan.ai @hiento09 (#311) +- docs: update per v0.1.3 @0xSage (#280) + +## Contributor + +@0xSage, @Its-Alamin-H, @dan-jan, @drakehere, @hiento09, @hientominh, @louis-jan, @namchuai, Hien To and James + diff --git a/docs/docs/guides/changelog/changelog-v0.2.1.mdx b/docs/docs/releases/changelog/changelog-v0.2.1.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.2.1.mdx rename to docs/docs/releases/changelog/changelog-v0.2.1.mdx index a7724ff08..2f2cb5aad 100644 --- a/docs/docs/guides/changelog/changelog-v0.2.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.1.mdx @@ -7,86 +7,86 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2 Highlighted Issue: [Issue #446: fix: model is started but the indicator is not stopped loading](https://github.com/janhq/jan/pull/446) -## Changes - -- fix: model is started but the indicator is not stopped loading @louis-jan (#446) -- fix: bring back install plugin manually function @louis-jan (#448) -- fix: duplicated messages when user switch between conversations @namchuai (#441) -- chore: added loader starting and stopping model @urmauur (#438) -- chore: Change license to AGPL @dan-jan (#442) -- fix: plugin \& model catalog import cache are not cleared properly @louis-jan (#437) -- fix error codesign @hiento09 (#439) -- fix: app version and cleanup unused code @urmauur (#434) -- chore: update core service - get plugin manifest @louis-jan (#432) -- ui: interface revamp @urmauur (#429) -- fix: scroll on explore models does not work @namchuai (#427) -- feat: adding create bot functionality @namchuai (#368) -- chore: install or update a plugin should not interrupt dev process @louis-jan (#420) -- chore: Update nitro 0.1.2 windows/ linux @vuonghoainam (#421) -- chore: update core service enums @louis-jan (#414) -- feat: chat with documents plugin @louis-jan (#417) -- misc: setup prettier @urmauur (#412) -- adr: 007 - Jan Plugin Catalog @louis-jan (#408) -- adr: 006 - Jan Core Module @louis-jan (#404) -- feat: Support for nitro release 0.1.2 @vuonghoainam (#409) -- feat: explore plugins from the npm repository and install them remotely @louis-jan (#399) -- feat: fix event description @dan-jan (#400) -- fix: high cpu usage @louis-jan (#401) -- docs: model installation ADR @0xSage (#390) -- chore: update core events module @louis-jan (#394) -- feat: Update Social OG Image and Meta Description @dan-jan (#387) -- misc: UI home @urmauur (#392) -- Update hcmc-oct23.md @0xSage (#389) -- chore: remove deprecated extension functions @louis-jan (#388) -- Fix bugs image overlap dropdown button download @urmauur (#384) -- chore: resolve fetch models api limit rate @louis-jan (#383) -- chore: update convo summary @louis-jan (#378) -- Update interface landing page @urmauur (#381) -- Add simple copywriting changes @dan-jan (#382) -- chore: update core services and module export @louis-jan (#376) -- chore: #371 - reference to plugin name and module path as variables @louis-jan (#372) -- feat: Edit event details, hide all unnecessary website sections @dan-jan (#369) -- docs: UI Service ADR @0xSage (#318) -- Feat/issue 255 adr 001 jand cloud native @nam-john-ho (#262) -- Move plugins folder from electron to root folder @hiento09 (#366) -- feature: core plugin support events \& preferences modules @louis-jan (#365) -- Fix/250 @namchuai (#349) -- Change License and update README @dan-jan (#356) -- Jan 339 @dan-jan (#348) -- feat: Jan 339 @dan-jan (#347) -- Add social og:image @dan-jan (#346) -- feat(ard): Add adr 002 @vuonghoainam (#261) - -## 🚀 Features - -- #357 plugin \& app can subscribe and emit events @louis-jan (#358) -- feature: @janhq/plugin-core module \& usage @louis-jan (#321) - -## 🐛 Bug Fixes - -- Change to load nitron on windows and linux from bash/shell script @hiento09 (#451) -- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) -- Correct version of plugins @hiento09 (#374) - -## 🧰 Maintenance - -- upgrade leveldown to newest version @hiento09 (#447) -- Update auto-sign plugin by search file permission 664 @hiento09 (#445) -- Change codesign plugin folder in ci @hiento09 (#440) -- Add continue on error for import cert @hiento09 (#436) -- Update code siging for new data plugin @hiento09 (#433) -- Add readme inference plugin @hiento09 (#426) -- Add username to remote origin @hiento09 (#425) -- Add auto create PR to plugin-catalog when a new version of plugin is … @hiento09 (#416) -- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) -- Chore/remove package lock @hiento09 (#398) -- Refactor cicd @hiento09 (#397) -- Correct version of plugins @hiento09 (#374) -- Rename plugin-core to core @hiento09 (#370) -- Fix error check change in plugins folder @hiento09 (#367) -- chore: jan.ai nits @0xSage (#354) - -## Contributor - -@0xSage, @dan-jan, @hiento09, @jan-service-account, @louis-jan, @nam-john-ho, @namchuai, @tikikun, @urmauur, @vuonghoainam and Hien To +## Changes + +- fix: model is started but the indicator is not stopped loading @louis-jan (#446) +- fix: bring back install plugin manually function @louis-jan (#448) +- fix: duplicated messages when user switch between conversations @namchuai (#441) +- chore: added loader starting and stopping model @urmauur (#438) +- chore: Change license to AGPL @dan-jan (#442) +- fix: plugin \& model catalog import cache are not cleared properly @louis-jan (#437) +- fix error codesign @hiento09 (#439) +- fix: app version and cleanup unused code @urmauur (#434) +- chore: update core service - get plugin manifest @louis-jan (#432) +- ui: interface revamp @urmauur (#429) +- fix: scroll on explore models does not work @namchuai (#427) +- feat: adding create bot functionality @namchuai (#368) +- chore: install or update a plugin should not interrupt dev process @louis-jan (#420) +- chore: Update nitro 0.1.2 windows/ linux @vuonghoainam (#421) +- chore: update core service enums @louis-jan (#414) +- feat: chat with documents plugin @louis-jan (#417) +- misc: setup prettier @urmauur (#412) +- adr: 007 - Jan Plugin Catalog @louis-jan (#408) +- adr: 006 - Jan Core Module @louis-jan (#404) +- feat: Support for nitro release 0.1.2 @vuonghoainam (#409) +- feat: explore plugins from the npm repository and install them remotely @louis-jan (#399) +- feat: fix event description @dan-jan (#400) +- fix: high cpu usage @louis-jan (#401) +- docs: model installation ADR @0xSage (#390) +- chore: update core events module @louis-jan (#394) +- feat: Update Social OG Image and Meta Description @dan-jan (#387) +- misc: UI home @urmauur (#392) +- Update hcmc-oct23.md @0xSage (#389) +- chore: remove deprecated extension functions @louis-jan (#388) +- Fix bugs image overlap dropdown button download @urmauur (#384) +- chore: resolve fetch models api limit rate @louis-jan (#383) +- chore: update convo summary @louis-jan (#378) +- Update interface landing page @urmauur (#381) +- Add simple copywriting changes @dan-jan (#382) +- chore: update core services and module export @louis-jan (#376) +- chore: #371 - reference to plugin name and module path as variables @louis-jan (#372) +- feat: Edit event details, hide all unnecessary website sections @dan-jan (#369) +- docs: UI Service ADR @0xSage (#318) +- Feat/issue 255 adr 001 jand cloud native @nam-john-ho (#262) +- Move plugins folder from electron to root folder @hiento09 (#366) +- feature: core plugin support events \& preferences modules @louis-jan (#365) +- Fix/250 @namchuai (#349) +- Change License and update README @dan-jan (#356) +- Jan 339 @dan-jan (#348) +- feat: Jan 339 @dan-jan (#347) +- Add social og:image @dan-jan (#346) +- feat(ard): Add adr 002 @vuonghoainam (#261) + +## 🚀 Features + +- #357 plugin \& app can subscribe and emit events @louis-jan (#358) +- feature: @janhq/plugin-core module \& usage @louis-jan (#321) + +## 🐛 Bug Fixes + +- Change to load nitron on windows and linux from bash/shell script @hiento09 (#451) +- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) +- Correct version of plugins @hiento09 (#374) + +## 🧰 Maintenance + +- upgrade leveldown to newest version @hiento09 (#447) +- Update auto-sign plugin by search file permission 664 @hiento09 (#445) +- Change codesign plugin folder in ci @hiento09 (#440) +- Add continue on error for import cert @hiento09 (#436) +- Update code siging for new data plugin @hiento09 (#433) +- Add readme inference plugin @hiento09 (#426) +- Add username to remote origin @hiento09 (#425) +- Add auto create PR to plugin-catalog when a new version of plugin is … @hiento09 (#416) +- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) +- Chore/remove package lock @hiento09 (#398) +- Refactor cicd @hiento09 (#397) +- Correct version of plugins @hiento09 (#374) +- Rename plugin-core to core @hiento09 (#370) +- Fix error check change in plugins folder @hiento09 (#367) +- chore: jan.ai nits @0xSage (#354) + +## Contributor + +@0xSage, @dan-jan, @hiento09, @jan-service-account, @louis-jan, @nam-john-ho, @namchuai, @tikikun, @urmauur, @vuonghoainam and Hien To diff --git a/docs/docs/guides/changelog/changelog-v0.2.2.mdx b/docs/docs/releases/changelog/changelog-v0.2.2.mdx similarity index 97% rename from docs/docs/guides/changelog/changelog-v0.2.2.mdx rename to docs/docs/releases/changelog/changelog-v0.2.2.mdx index 0ce3acd65..2702b420f 100644 --- a/docs/docs/guides/changelog/changelog-v0.2.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.2.mdx @@ -7,36 +7,36 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2 Highlighted Issue: [Issue #469: chore: plugin and app version dependency](https://github.com/janhq/jan/pull/469) -## Changes - -- chore: plugin and app version dependency @louis-jan (#469) -- bug: showing a modal when user start conf but model not active @urmauur (#466) -- fix: duplicated modal and loading state @louis-jan (#465) -- bug: fix overflow scroll horizontal message @urmauur (#464) -- bug: avoid chat body scroll horizontal @urmauur (#462) -- bug: fix logic plugin update plugin and show installed version @urmauur (#459) -- bug: chat view drops enumeration @urmauur (#456) -- fix: allow switching models when switch between conversations @namchuai (#458) -- fix: CI run fails on windows @louis-jan (#463) -- fix: failed to build electron app @louis-jan (#461) -- fix: correct app version display @louis-jan (#452) -- fix: enable link color blue on docusaurus markdown @urmauur (#449) - -## 🚀 Features - -- feat: Add ADR-008 for extensible Jan @vuonghoainam (#431) - -## 🐛 Bug Fixes - -- data-plugin force leveldown to 6.1.1 @hiento09 (#453) - -## 🧰 Maintenance - -- Use electron-rebuild to build leveldown@5.6.0 for darwin arm64 @hiento09 (#455) -- data-plugin force leveldown back to 5.6.0 and rebuild for darwin arm64 @hiento09 (#454) -- data-plugin force leveldown to 6.1.1 @hiento09 (#453) - -## Contributor - -@hiento09, @jan-service-account, @louis-jan, @namchuai, @urmauur and @vuonghoainam +## Changes + +- chore: plugin and app version dependency @louis-jan (#469) +- bug: showing a modal when user start conf but model not active @urmauur (#466) +- fix: duplicated modal and loading state @louis-jan (#465) +- bug: fix overflow scroll horizontal message @urmauur (#464) +- bug: avoid chat body scroll horizontal @urmauur (#462) +- bug: fix logic plugin update plugin and show installed version @urmauur (#459) +- bug: chat view drops enumeration @urmauur (#456) +- fix: allow switching models when switch between conversations @namchuai (#458) +- fix: CI run fails on windows @louis-jan (#463) +- fix: failed to build electron app @louis-jan (#461) +- fix: correct app version display @louis-jan (#452) +- fix: enable link color blue on docusaurus markdown @urmauur (#449) + +## 🚀 Features + +- feat: Add ADR-008 for extensible Jan @vuonghoainam (#431) + +## 🐛 Bug Fixes + +- data-plugin force leveldown to 6.1.1 @hiento09 (#453) + +## 🧰 Maintenance + +- Use electron-rebuild to build leveldown@5.6.0 for darwin arm64 @hiento09 (#455) +- data-plugin force leveldown back to 5.6.0 and rebuild for darwin arm64 @hiento09 (#454) +- data-plugin force leveldown to 6.1.1 @hiento09 (#453) + +## Contributor + +@hiento09, @jan-service-account, @louis-jan, @namchuai, @urmauur and @vuonghoainam diff --git a/docs/docs/guides/changelog/changelog-v0.2.3.mdx b/docs/docs/releases/changelog/changelog-v0.2.3.mdx similarity index 97% rename from docs/docs/guides/changelog/changelog-v0.2.3.mdx rename to docs/docs/releases/changelog/changelog-v0.2.3.mdx index 0d33c989c..9b3b1f872 100644 --- a/docs/docs/guides/changelog/changelog-v0.2.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.3.mdx @@ -7,23 +7,23 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2 Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https://github.com/janhq/jan/pull/482) -## Changes - -- fix: hide preferences section if empty @louis-jan (#482) -- chore: fix conversation summary @louis-jan (#480) -- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) -- fix: download now change state immediately @namchuai (#475) -- chore: add required app version to edge release plugin @louis-jan (#471) - -## 🐛 Bug Fixes - -- add rebuild for mac x64 @hiento09 (#473) - -## 🧰 Maintenance - -- Add build deps for data-plugin in CI @hiento09 (#472) - -## Contributor - -@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai +## Changes + +- fix: hide preferences section if empty @louis-jan (#482) +- chore: fix conversation summary @louis-jan (#480) +- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) +- fix: download now change state immediately @namchuai (#475) +- chore: add required app version to edge release plugin @louis-jan (#471) + +## 🐛 Bug Fixes + +- add rebuild for mac x64 @hiento09 (#473) + +## 🧰 Maintenance + +- Add build deps for data-plugin in CI @hiento09 (#472) + +## Contributor + +@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai diff --git a/docs/docs/guides/changelog/changelog-v0.3.0.mdx b/docs/docs/releases/changelog/changelog-v0.3.0.mdx similarity index 96% rename from docs/docs/guides/changelog/changelog-v0.3.0.mdx rename to docs/docs/releases/changelog/changelog-v0.3.0.mdx index 65523ae77..82f921e35 100644 --- a/docs/docs/guides/changelog/changelog-v0.3.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.0.mdx @@ -1,29 +1,29 @@ ---- -sidebar_position: 12 ---- -# v0.3.0 - -For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3.0) - -Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https://github.com/janhq/jan/pull/482) - -## Changes - -- fix: hide preferences section if empty @louis-jan (#482) -- chore: fix conversation summary @louis-jan (#480) -- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) -- fix: download now change state immediately @namchuai (#475) -- chore: add required app version to edge release plugin @louis-jan (#471) - -## 🐛 Bug Fixes - -- add rebuild for mac x64 @hiento09 (#473) - -## 🧰 Maintenance - -- Add build deps for data-plugin in CI @hiento09 (#472) - -## Contributor - -@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai - +--- +sidebar_position: 12 +--- +# v0.3.0 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3.0) + +Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https://github.com/janhq/jan/pull/482) + +## Changes + +- fix: hide preferences section if empty @louis-jan (#482) +- chore: fix conversation summary @louis-jan (#480) +- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) +- fix: download now change state immediately @namchuai (#475) +- chore: add required app version to edge release plugin @louis-jan (#471) + +## 🐛 Bug Fixes + +- add rebuild for mac x64 @hiento09 (#473) + +## 🧰 Maintenance + +- Add build deps for data-plugin in CI @hiento09 (#472) + +## Contributor + +@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai + diff --git a/docs/docs/guides/changelog/changelog-v0.3.1.mdx b/docs/docs/releases/changelog/changelog-v0.3.1.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.3.1.mdx rename to docs/docs/releases/changelog/changelog-v0.3.1.mdx index 2ff260797..203bc9c9b 100644 --- a/docs/docs/guides/changelog/changelog-v0.3.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.1.mdx @@ -7,71 +7,71 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3 Highlighted Issue: [Issue #580: fix: preformatted text indents the first line strangely](https://github.com/janhq/jan/pull/580) -## Changes - -- fix: preformatted text indents the first line strangely @louis-jan (#580) -- fix: failed to package app since core and uikit are not being built @louis-jan (#575) -- cleanup: remove component folder and cleanup conversation screen @urmauur (#574) -- bug: update convo state when user change model @urmauur (#571) -- fix(#566): jan cannot retrieve the conversations @namchuai (#570) -- bug: Toast messages shows [object object] @urmauur (#569) -- ui: improve state of welcome screen @urmauur (#563) -- chore: fixed an issue where app does not yield message result @louis-jan (#561) -- Update readme @urmauur (#560) -- ui: standalone UIKit and refactor @urmauur (#557) -- Small description changes @dan-jan (#558) -- add 'change download button based on OS' feature @Vikram-2004 (#551) -- feat: revamp plugin architecture @louis-jan (#535) -- Fix mobile padding @imtuyethan (#550) -- chore: Update Readme @dan-jan (#549) -- Update Homepage and README with 1-line pitch @dan-jan (#548) -- docs: Add About, Events, Blog @dan-jan (#546) -- Ashley/update website content @imtuyethan (#545) -- Add guides @hahuyhoang411 (#488) -- Structure Docs @dan-jan (#536) -- Update README.md @imtuyethan (#533) -- Chore: Setup "Jan Improvements Proposal" workflow @dan-jan (#534) -- Update website tag line @imtuyethan (#527) -- fix: #396 - allow user to cancel a model download @louis-jan (#530) -- fix: #479 - Toggle plugin is now experimental feature @louis-jan (#531) -- chore: disable app update on test @louis-jan (#521) -- bug: chat UI is not consistent @urmauur (#520) -- refactor: plugin manager and execution as ts @louis-jan (#504) -- fix: app toolbar is gone on windows @louis-jan (#503) -- Chore: refactor code, hide plugin menu in web @ghost (#502) -- fix: dest.end is not a function @louis-jan (#501) -- #255: Jan cloud native @ghost (#320) -- bug: download new version should show in status bar @urmauur (#500) -- feat: add New Conversation button on the conversation sidebar @urmauur (#499) -- chore: update plugin readme @louis-jan (#497) -- chore: update plugins license @louis-jan (#496) -- #255: Read plugins manifest from CDN @ghost (#495) -- chore: update plugin sdk - add appDataPath @louis-jan (#492) -- chore: enable back bot function for edge-release @louis-jan (#474) -- chore: attempt to kill Nitro subprocesses @louis-jan (#484) -- docs: new dev hub @0xSage (#450) - -## 🚀 Features - -- feat: Experimental Feature Toggle @louis-jan (#525) - -## 🐛 Bug Fixes - -- Add rebuild leveldown for arm on mac intel @hiento09 (#487) - -## 🧰 Maintenance - -- Bump nitro version from 0.1.4 to 0.1.6 @hiento09 (#581) -- Add set yarn network timeout for uikit @hiento09 (#579) -- Fix error CI e2e run failed on windows @hiento09 (#578) -- Fix build plugins macos codesiging error @hiento09 (#576) -- Add install nitro mac intel inference plugin build locally @hiento09 (#542) -- Bump nitro version to 0.1.4 @hiento09 (#532) -- Chore/update yarn dev script @hiento09 (#529) -- Inference Plugin pull nitro binary from release @hiento09 (#524) -- Correct version and license @hiento09 (#498) - -## Contributor - -@0xSage, @Vikram-2004, @dan-jan, @hahuyhoang411, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai, @tikikun, @urmauur, Han, James, John and nam-john-ho +## Changes + +- fix: preformatted text indents the first line strangely @louis-jan (#580) +- fix: failed to package app since core and uikit are not being built @louis-jan (#575) +- cleanup: remove component folder and cleanup conversation screen @urmauur (#574) +- bug: update convo state when user change model @urmauur (#571) +- fix(#566): jan cannot retrieve the conversations @namchuai (#570) +- bug: Toast messages shows [object object] @urmauur (#569) +- ui: improve state of welcome screen @urmauur (#563) +- chore: fixed an issue where app does not yield message result @louis-jan (#561) +- Update readme @urmauur (#560) +- ui: standalone UIKit and refactor @urmauur (#557) +- Small description changes @dan-jan (#558) +- add 'change download button based on OS' feature @Vikram-2004 (#551) +- feat: revamp plugin architecture @louis-jan (#535) +- Fix mobile padding @imtuyethan (#550) +- chore: Update Readme @dan-jan (#549) +- Update Homepage and README with 1-line pitch @dan-jan (#548) +- docs: Add About, Events, Blog @dan-jan (#546) +- Ashley/update website content @imtuyethan (#545) +- Add guides @hahuyhoang411 (#488) +- Structure Docs @dan-jan (#536) +- Update README.md @imtuyethan (#533) +- Chore: Setup "Jan Improvements Proposal" workflow @dan-jan (#534) +- Update website tag line @imtuyethan (#527) +- fix: #396 - allow user to cancel a model download @louis-jan (#530) +- fix: #479 - Toggle plugin is now experimental feature @louis-jan (#531) +- chore: disable app update on test @louis-jan (#521) +- bug: chat UI is not consistent @urmauur (#520) +- refactor: plugin manager and execution as ts @louis-jan (#504) +- fix: app toolbar is gone on windows @louis-jan (#503) +- Chore: refactor code, hide plugin menu in web @ghost (#502) +- fix: dest.end is not a function @louis-jan (#501) +- #255: Jan cloud native @ghost (#320) +- bug: download new version should show in status bar @urmauur (#500) +- feat: add New Conversation button on the conversation sidebar @urmauur (#499) +- chore: update plugin readme @louis-jan (#497) +- chore: update plugins license @louis-jan (#496) +- #255: Read plugins manifest from CDN @ghost (#495) +- chore: update plugin sdk - add appDataPath @louis-jan (#492) +- chore: enable back bot function for edge-release @louis-jan (#474) +- chore: attempt to kill Nitro subprocesses @louis-jan (#484) +- docs: new dev hub @0xSage (#450) + +## 🚀 Features + +- feat: Experimental Feature Toggle @louis-jan (#525) + +## 🐛 Bug Fixes + +- Add rebuild leveldown for arm on mac intel @hiento09 (#487) + +## 🧰 Maintenance + +- Bump nitro version from 0.1.4 to 0.1.6 @hiento09 (#581) +- Add set yarn network timeout for uikit @hiento09 (#579) +- Fix error CI e2e run failed on windows @hiento09 (#578) +- Fix build plugins macos codesiging error @hiento09 (#576) +- Add install nitro mac intel inference plugin build locally @hiento09 (#542) +- Bump nitro version to 0.1.4 @hiento09 (#532) +- Chore/update yarn dev script @hiento09 (#529) +- Inference Plugin pull nitro binary from release @hiento09 (#524) +- Correct version and license @hiento09 (#498) + +## Contributor + +@0xSage, @Vikram-2004, @dan-jan, @hahuyhoang411, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai, @tikikun, @urmauur, Han, James, John and nam-john-ho diff --git a/docs/docs/guides/changelog/changelog-v0.3.2.mdx b/docs/docs/releases/changelog/changelog-v0.3.2.mdx similarity index 97% rename from docs/docs/guides/changelog/changelog-v0.3.2.mdx rename to docs/docs/releases/changelog/changelog-v0.3.2.mdx index b99bb7413..fb04861a9 100644 --- a/docs/docs/guides/changelog/changelog-v0.3.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.2.mdx @@ -7,39 +7,39 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3 Highlighted Issue: [Issue #612: fix: disabled required env](https://github.com/janhq/jan/pull/612) -## Changes - -- fix: disabled required env @urmauur (#612) -- Install Posthog snippet @imtuyethan (#573) -- web: google tag manager @urmauur (#562) -- docs: fix syntax highlighting @0xSage (#602) -- chore: remove past event @0xSage (#600) -- docs: new docs @0xSage (#599) -- [chore]: Update docs @dan-jan (#597) - -## 🚀 Features - -- refactor: main electron with managers and handlers @louis-jan (#610) - -## 🐛 Bug Fixes - -- Fix: Failed to load model - unload model nitro @louis-jan (#616) -- Restore cpx nitro step in yarn script @hiento09 (#617) -- fix(#591): prevent duplicate message id issue @namchuai (#595) -- bug: cancelling a model download should be delete the model file on user data @urmauur (#613) -- bug: fix weird padding vertical snippet code @urmauur (#608) -- bug: Fix button download detect intel or apple silicon @urmauur (#609) -- bug: enable delete conversation after deleted model @urmauur (#594) -- bug: download modal should truncate model name @urmauur (#592) -- bug: support multiple line input chat using Textarea instead @urmauur (#593) - -## 🧰 Maintenance - -- refactor: main electron with managers and handlers @louis-jan (#610) -- Chore/refactor yarn script @hiento09 (#615) -- fix: line height and update typography component @urmauur (#611) - -## Contributor - -@0xSage, @dan-jan, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai and @urmauur +## Changes + +- fix: disabled required env @urmauur (#612) +- Install Posthog snippet @imtuyethan (#573) +- web: google tag manager @urmauur (#562) +- docs: fix syntax highlighting @0xSage (#602) +- chore: remove past event @0xSage (#600) +- docs: new docs @0xSage (#599) +- [chore]: Update docs @dan-jan (#597) + +## 🚀 Features + +- refactor: main electron with managers and handlers @louis-jan (#610) + +## 🐛 Bug Fixes + +- Fix: Failed to load model - unload model nitro @louis-jan (#616) +- Restore cpx nitro step in yarn script @hiento09 (#617) +- fix(#591): prevent duplicate message id issue @namchuai (#595) +- bug: cancelling a model download should be delete the model file on user data @urmauur (#613) +- bug: fix weird padding vertical snippet code @urmauur (#608) +- bug: Fix button download detect intel or apple silicon @urmauur (#609) +- bug: enable delete conversation after deleted model @urmauur (#594) +- bug: download modal should truncate model name @urmauur (#592) +- bug: support multiple line input chat using Textarea instead @urmauur (#593) + +## 🧰 Maintenance + +- refactor: main electron with managers and handlers @louis-jan (#610) +- Chore/refactor yarn script @hiento09 (#615) +- fix: line height and update typography component @urmauur (#611) + +## Contributor + +@0xSage, @dan-jan, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai and @urmauur diff --git a/docs/docs/guides/changelog/changelog-v0.3.3.mdx b/docs/docs/releases/changelog/changelog-v0.3.3.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.3.3.mdx rename to docs/docs/releases/changelog/changelog-v0.3.3.mdx index 89648b0f6..23d8bb9e3 100644 --- a/docs/docs/guides/changelog/changelog-v0.3.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.3.mdx @@ -7,94 +7,94 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3 Highlighted Issue: [Issue #719: docs: cleanup](https://github.com/janhq/jan/pull/719) -## Changes - -- docs: cleanup @0xSage (#719) -- docs: threads and messages @0xSage (#681) -- Updating Onboarding Kit @Diane0111 (#675) -- Update issue templates @0xSage (#685) -- docs: polish models spec @0xSage (#680) -- Feature: Preview URL for each PR and add pre-release.jan.ai as staging of Jan Docs @hiento09 (#669) -- Migrate Model definitions to Swagger/OpenAPI @dan-jan (#659) -- [docs] Add Introduction and refactor Models Spec @dan-jan (#657) -- docs: Add model methods to swagger @0xSage (#660) -- Models Spec: Delete broken Markdown links @dan-jan (#648) -- docs: assistants and threads specs @0xSage (#646) - -## 🚀 Features - -- improvement: styling message action toolbar @urmauur (#737) -- experimental: allow user to give instruction for the conversation @louis-jan (#714) -- docs/enable-seo-docusaurus @hieu-jan (#725) -- Add windows code sign to CI @hiento09 (#712) -- docs: update installation guide @hieu-jan (#664) -- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) -- docs: add OpenAI swagger file @hieu-jan (#623) -- Update landing page Jan @urmauur (#638) - -## 🐛 Bug Fixes - -- chore: open app data should lead user to jan root @louis-jan (#749) -- fix: cancel download does not work @louis-jan (#746) -- fix: error when switching between threads @louis-jan (#736) -- chore: app raises error when attempting to start a model that is already starting @louis-jan (#721) -- bug: fix filter list menu from command base on search type and make a symbol base on OS @urmauur (#723) -- bug: fix clickable small download button on chat screen @urmauur (#722) -- fix: incorrect update progress bar visibility check @louis-jan (#713) -- fix: app shows wrong performance tag, all say not enough ram on windows @louis-jan (#699) -- bug: fix padding quotations and numbering list @urmauur (#695) -- fix: local npm module update does not reflect web app @louis-jan (#677) -- [bug] fix markdown todo items shifted to the left and remove the dots @urmauur (#694) -- bug: fix footer and section spacing landing page @urmauur (#683) -- bug: fix anchor link sidebar openapi @urmauur (#668) -- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) -- bug: fix titles should have spaces in between @urmauur (#652) -- bug: fix compatibility content not fully display @urmauur (#653) - -## 🧰 Maintenance - -- chore: fix app grammar @0xSage (#750) -- chore: bumb nitro version @louis-jan (#740) -- chore: fs module should not cover app logic @louis-jan (#720) -- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) -- docs: upgrade mdx-js package @hieu-jan (#705) -- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) -- Fix error docs pipeline run failed @hiento09 (#702) -- Revert docs CICD trigger on push to main instead of tag-based @hiento09 (#698) -- fix: local npm module update does not reflect web app @louis-jan (#677) -- Chore: refactor to makefile @hiento09 (#691) -- Add Instruction to publish docs @hiento09 (#687) -- chore/add-mermaid @hieu-jan (#672) -- chore/update package docs @hieu-jan (#670) -- Enhance Cross-Platform Argument Handling for Nitro Startup Scripts @hiento09 (#674) -- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) -- docs: add OpenAI swagger file @hieu-jan (#623) -- Preliminary Restructure of Docs @dan-jan (#655) -- Model specs @vuonghoainam (#641) -- refactor: refactor app entities @louis-jan (#626) -- refactor: move file to jan root @namchuai (#598) -- Add run-script-os @linhtran174 (#620) -- Refactor Jan Documentation @dan-jan (#625) - -## 📖 Documentaion - -- docs: update specs/product @0xSage (#744) -- docs/enable-seo-docusaurus @hieu-jan (#725) -- docs: assistant spec @vuonghoainam (#707) -- docs: Refactor Jan Site Structure @dan-jan (#706) -- docs/improve install docs @hieu-jan (#708) -- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) -- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) -- docs: update installation guide @hieu-jan (#664) -- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) -- docs: add OpenAI swagger file @hieu-jan (#623) -- Preliminary Restructure of Docs @dan-jan (#655) -- Fix: specs revision @vuonghoainam (#649) -- Model specs @vuonghoainam (#641) -- Update README.md @imtuyethan (#629) -- Refactor Jan Documentation @dan-jan (#625) - -## Contributor - -@0xSage, @Diane0111, @dan-jan, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @linhtran174, @louis-jan, @namchuai, @urmauur, @vuonghoainam and Le Tra Mi +## Changes + +- docs: cleanup @0xSage (#719) +- docs: threads and messages @0xSage (#681) +- Updating Onboarding Kit @Diane0111 (#675) +- Update issue templates @0xSage (#685) +- docs: polish models spec @0xSage (#680) +- Feature: Preview URL for each PR and add pre-release.jan.ai as staging of Jan Docs @hiento09 (#669) +- Migrate Model definitions to Swagger/OpenAPI @dan-jan (#659) +- [docs] Add Introduction and refactor Models Spec @dan-jan (#657) +- docs: Add model methods to swagger @0xSage (#660) +- Models Spec: Delete broken Markdown links @dan-jan (#648) +- docs: assistants and threads specs @0xSage (#646) + +## 🚀 Features + +- improvement: styling message action toolbar @urmauur (#737) +- experimental: allow user to give instruction for the conversation @louis-jan (#714) +- docs/enable-seo-docusaurus @hieu-jan (#725) +- Add windows code sign to CI @hiento09 (#712) +- docs: update installation guide @hieu-jan (#664) +- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) +- docs: add OpenAI swagger file @hieu-jan (#623) +- Update landing page Jan @urmauur (#638) + +## 🐛 Bug Fixes + +- chore: open app data should lead user to jan root @louis-jan (#749) +- fix: cancel download does not work @louis-jan (#746) +- fix: error when switching between threads @louis-jan (#736) +- chore: app raises error when attempting to start a model that is already starting @louis-jan (#721) +- bug: fix filter list menu from command base on search type and make a symbol base on OS @urmauur (#723) +- bug: fix clickable small download button on chat screen @urmauur (#722) +- fix: incorrect update progress bar visibility check @louis-jan (#713) +- fix: app shows wrong performance tag, all say not enough ram on windows @louis-jan (#699) +- bug: fix padding quotations and numbering list @urmauur (#695) +- fix: local npm module update does not reflect web app @louis-jan (#677) +- [bug] fix markdown todo items shifted to the left and remove the dots @urmauur (#694) +- bug: fix footer and section spacing landing page @urmauur (#683) +- bug: fix anchor link sidebar openapi @urmauur (#668) +- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) +- bug: fix titles should have spaces in between @urmauur (#652) +- bug: fix compatibility content not fully display @urmauur (#653) + +## 🧰 Maintenance + +- chore: fix app grammar @0xSage (#750) +- chore: bumb nitro version @louis-jan (#740) +- chore: fs module should not cover app logic @louis-jan (#720) +- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) +- docs: upgrade mdx-js package @hieu-jan (#705) +- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) +- Fix error docs pipeline run failed @hiento09 (#702) +- Revert docs CICD trigger on push to main instead of tag-based @hiento09 (#698) +- fix: local npm module update does not reflect web app @louis-jan (#677) +- Chore: refactor to makefile @hiento09 (#691) +- Add Instruction to publish docs @hiento09 (#687) +- chore/add-mermaid @hieu-jan (#672) +- chore/update package docs @hieu-jan (#670) +- Enhance Cross-Platform Argument Handling for Nitro Startup Scripts @hiento09 (#674) +- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) +- docs: add OpenAI swagger file @hieu-jan (#623) +- Preliminary Restructure of Docs @dan-jan (#655) +- Model specs @vuonghoainam (#641) +- refactor: refactor app entities @louis-jan (#626) +- refactor: move file to jan root @namchuai (#598) +- Add run-script-os @linhtran174 (#620) +- Refactor Jan Documentation @dan-jan (#625) + +## 📖 Documentaion + +- docs: update specs/product @0xSage (#744) +- docs/enable-seo-docusaurus @hieu-jan (#725) +- docs: assistant spec @vuonghoainam (#707) +- docs: Refactor Jan Site Structure @dan-jan (#706) +- docs/improve install docs @hieu-jan (#708) +- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) +- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) +- docs: update installation guide @hieu-jan (#664) +- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) +- docs: add OpenAI swagger file @hieu-jan (#623) +- Preliminary Restructure of Docs @dan-jan (#655) +- Fix: specs revision @vuonghoainam (#649) +- Model specs @vuonghoainam (#641) +- Update README.md @imtuyethan (#629) +- Refactor Jan Documentation @dan-jan (#625) + +## Contributor + +@0xSage, @Diane0111, @dan-jan, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @linhtran174, @louis-jan, @namchuai, @urmauur, @vuonghoainam and Le Tra Mi diff --git a/docs/docs/guides/changelog/changelog-v0.4.0.mdx b/docs/docs/releases/changelog/changelog-v0.4.0.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.4.0.mdx rename to docs/docs/releases/changelog/changelog-v0.4.0.mdx index 9d81d0a00..b473ef082 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.0.mdx @@ -7,68 +7,68 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #878: bug: fix tag description showing a title and fix card right panel](https://github.com/janhq/jan/pull/878) -## Changes - -- bug: fix tag description showing a title and fix card right panel @urmauur (#878) -- fix/no-assistant-available-fresh-install @louis-jan (#876) -- Model.json update @hahuyhoang411 (#870) -- Hotfix desc for openhermes @hahuyhoang411 (#864) -- Openhermes update v1 @hahuyhoang411 (#863) -- update deepseek 1.3b @hahuyhoang411 (#858) -- Update tags @hahuyhoang411 (#857) -- Update model hub @hahuyhoang411 (#829) -- hotfix: fix typo @tikikun (#836) -- chore: pre-populate Jan's /models folder with model.jsons @hahuyhoang411 (#775) -- chore: clarification changes to the model settings and model parameters @tikikun (#742) - -## 🚀 Features - -- feat: revamp landing page @urmauur (#745) -- feat : add cover image model hub screen @urmauur (#872) -- feat: boilerplate for express server localhost 1337 @linhtran174 (#803) -- enhancement: revamp hub screen @urmauur (#825) -- feat: revamp thread screen @urmauur (#802) -- docs/update-api-reference @hieu-jan (#739) -- refactor: model plugin to follow new specs @namchuai (#682) - -## 🐛 Fixes - -- fix: Nitro interface update to prevent warning @vuonghoainam (#877) -- fix: delete message break the entire thread @louis-jan (#869) -- fix: can not download multiple models at once @louis-jan (#867) -- fix: production CI workflow does not populate models @louis-jan (#862) -- fix: update wrong main view state when use a model @namchuai (#861) -- fix: handle crash issue on hljs highlighting @louis-jan (#859) -- fix: empty assistant instruction by default @louis-jan (#855) -- bug: fix broken banner position hub screen @urmauur (#846) -- fix: not update active model when using resend button @namchuai (#834) -- Hotfix jan windows download nitro failed @hiento09 (#838) -- Switch to download nitro .tar.gz file instead of .zip file on windows @hiento09 (#832) -- fix/docusaurus-seo @hieu-jan (#818) -- fix: CI script - reorder copy models action @louis-jan (#819) -- fix: messages sync is not threadsafe @louis-jan (#784) -- Fix Makefile Indentation Issue @hiento09 (#788) - -## 🧰 Maintenance - -- chore: update model ranking @louis-jan (#874) -- Bump nitro version to 0.1.21 - nitro has windows codesign @hiento09 (#843) -- Hotfix jan windows download nitro failed @hiento09 (#838) -- 810 docs add modeljson and revamp models specs page @tikikun (#816) -- Add document for nightly build and update message for manual build @hiento09 (#831) -- chore: Bump nitro to 0.1.20 @vuonghoainam (#830) -- Refactor build:extension command @hiento09 (#822) -- feat: pre-populate Jan's /models folder @namchuai (#796) -- chore: fix pr auto labeling @0xSage (#812) -- chore: add gi automations @0xSage (#809) -- refactor: jan extensions @louis-jan (#799) -- Remove .zip in artifact name @hiento09 (#800) -- docs/update-api-reference @hieu-jan (#739) -- Add nightly build ci @hiento09 (#794) -- Fix Makefile Indentation Issue @hiento09 (#788) -- Switch from .zip to .tar.gz for nitro url inference plugin @hiento09 (#781) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam +## Changes + +- bug: fix tag description showing a title and fix card right panel @urmauur (#878) +- fix/no-assistant-available-fresh-install @louis-jan (#876) +- Model.json update @hahuyhoang411 (#870) +- Hotfix desc for openhermes @hahuyhoang411 (#864) +- Openhermes update v1 @hahuyhoang411 (#863) +- update deepseek 1.3b @hahuyhoang411 (#858) +- Update tags @hahuyhoang411 (#857) +- Update model hub @hahuyhoang411 (#829) +- hotfix: fix typo @tikikun (#836) +- chore: pre-populate Jan's /models folder with model.jsons @hahuyhoang411 (#775) +- chore: clarification changes to the model settings and model parameters @tikikun (#742) + +## 🚀 Features + +- feat: revamp landing page @urmauur (#745) +- feat : add cover image model hub screen @urmauur (#872) +- feat: boilerplate for express server localhost 1337 @linhtran174 (#803) +- enhancement: revamp hub screen @urmauur (#825) +- feat: revamp thread screen @urmauur (#802) +- docs/update-api-reference @hieu-jan (#739) +- refactor: model plugin to follow new specs @namchuai (#682) + +## 🐛 Fixes + +- fix: Nitro interface update to prevent warning @vuonghoainam (#877) +- fix: delete message break the entire thread @louis-jan (#869) +- fix: can not download multiple models at once @louis-jan (#867) +- fix: production CI workflow does not populate models @louis-jan (#862) +- fix: update wrong main view state when use a model @namchuai (#861) +- fix: handle crash issue on hljs highlighting @louis-jan (#859) +- fix: empty assistant instruction by default @louis-jan (#855) +- bug: fix broken banner position hub screen @urmauur (#846) +- fix: not update active model when using resend button @namchuai (#834) +- Hotfix jan windows download nitro failed @hiento09 (#838) +- Switch to download nitro .tar.gz file instead of .zip file on windows @hiento09 (#832) +- fix/docusaurus-seo @hieu-jan (#818) +- fix: CI script - reorder copy models action @louis-jan (#819) +- fix: messages sync is not threadsafe @louis-jan (#784) +- Fix Makefile Indentation Issue @hiento09 (#788) + +## 🧰 Maintenance + +- chore: update model ranking @louis-jan (#874) +- Bump nitro version to 0.1.21 - nitro has windows codesign @hiento09 (#843) +- Hotfix jan windows download nitro failed @hiento09 (#838) +- 810 docs add modeljson and revamp models specs page @tikikun (#816) +- Add document for nightly build and update message for manual build @hiento09 (#831) +- chore: Bump nitro to 0.1.20 @vuonghoainam (#830) +- Refactor build:extension command @hiento09 (#822) +- feat: pre-populate Jan's /models folder @namchuai (#796) +- chore: fix pr auto labeling @0xSage (#812) +- chore: add gi automations @0xSage (#809) +- refactor: jan extensions @louis-jan (#799) +- Remove .zip in artifact name @hiento09 (#800) +- docs/update-api-reference @hieu-jan (#739) +- Add nightly build ci @hiento09 (#794) +- Fix Makefile Indentation Issue @hiento09 (#788) +- Switch from .zip to .tar.gz for nitro url inference plugin @hiento09 (#781) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam diff --git a/docs/docs/guides/changelog/changelog-v0.4.1.mdx b/docs/docs/releases/changelog/changelog-v0.4.1.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.4.1.mdx rename to docs/docs/releases/changelog/changelog-v0.4.1.mdx index c1dc19d13..a49b3b87c 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.1.mdx @@ -7,55 +7,55 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #903: Update README.md](https://github.com/janhq/jan/pull/903) -## Changes - -- Update README.md @imtuyethan (#903) - -## 🚀 Features - -- feat: Kill nitro process with API - nitro 0.1.27 @vuonghoainam (#975) -- feat: Inference Nitro with Prompt Template @hahuyhoang411 (#952) -- feat: Add NVIDIA triton trt-llm extension @vuonghoainam (#888) -- feat: Hotfit for Nitro loading on CPU with hyper-threading support @vuonghoainam (#931) -- feat: adding model params @namchuai (#886) -- feat: Multiple inference engines for nitro and openai @vuonghoainam (#814) -- docs: add json schema for engine and model parameters @tikikun (#840) -- feat: improve SEO keywords @hieu-jan (#894) -- enhancement: fix spacing landing page responsive @urmauur (#891) -- bug: added label coming soon for windows and linux @urmauur (#881) - -## 🐛 Fixes - -- fix: 963 can not run openai models on windows @louis-jan (#974) -- fix: Inference engine Nitro with Windows with/ without CUDA @vuonghoainam (#950) -- Fix error Jan app linux crash @hiento09 (#958) -- fix: windows bug - control buttons close,max,min hidden @linhtran174 (#949) -- bug: fix ui landing page @urmauur (#937) -- fix: model parameters for inference extensions @vuonghoainam (#935) -- [bug] Fix floating border outside card right panel @urmauur (#934) -- fix: import\_typescript.default.isTokenKind is not a function @louis-jan (#923) -- bug: fix syntax formatting @urmauur (#899) -- bug: update metadata title and desc @urmauur (#884) -- fix: download button text color is blending into the background @louis-jan (#883) - -## 🧰 Maintenance - -- chore: add desktop app analytics @louis-jan (#978) -- refactor: clean types and interfaces @0xSage (#966) -- docs: scaffold dev docs @0xSage (#856) -- chore: Bump nitro to 0.1.26 @vuonghoainam (#960) -- Update update-release-url.yml @hiento09 (#951) -- Fix update release url pipeline run failed @hiento09 (#947) -- chore: Bumpt nitro bin version to version 0.1.23 @vuonghoainam (#942) -- Fix update release url pipeline @hiento09 (#941) -- CI automatically update Update README with Nightly Build Information and stable download URL @hiento09 (#940) -- refactor: deprecate invokers - auto proxying apis - strict types @louis-jan (#924) -- docs: standardize yaml files @hieu-jan (#933) -- chore: universal module definition @louis-jan (#902) -- docs: add assistants api reference @hieu-jan (#801) -- docs: add json schema for engine and model parameters @tikikun (#840) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @jan-service-account, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam +## Changes + +- Update README.md @imtuyethan (#903) + +## 🚀 Features + +- feat: Kill nitro process with API - nitro 0.1.27 @vuonghoainam (#975) +- feat: Inference Nitro with Prompt Template @hahuyhoang411 (#952) +- feat: Add NVIDIA triton trt-llm extension @vuonghoainam (#888) +- feat: Hotfit for Nitro loading on CPU with hyper-threading support @vuonghoainam (#931) +- feat: adding model params @namchuai (#886) +- feat: Multiple inference engines for nitro and openai @vuonghoainam (#814) +- docs: add json schema for engine and model parameters @tikikun (#840) +- feat: improve SEO keywords @hieu-jan (#894) +- enhancement: fix spacing landing page responsive @urmauur (#891) +- bug: added label coming soon for windows and linux @urmauur (#881) + +## 🐛 Fixes + +- fix: 963 can not run openai models on windows @louis-jan (#974) +- fix: Inference engine Nitro with Windows with/ without CUDA @vuonghoainam (#950) +- Fix error Jan app linux crash @hiento09 (#958) +- fix: windows bug - control buttons close,max,min hidden @linhtran174 (#949) +- bug: fix ui landing page @urmauur (#937) +- fix: model parameters for inference extensions @vuonghoainam (#935) +- [bug] Fix floating border outside card right panel @urmauur (#934) +- fix: import\_typescript.default.isTokenKind is not a function @louis-jan (#923) +- bug: fix syntax formatting @urmauur (#899) +- bug: update metadata title and desc @urmauur (#884) +- fix: download button text color is blending into the background @louis-jan (#883) + +## 🧰 Maintenance + +- chore: add desktop app analytics @louis-jan (#978) +- refactor: clean types and interfaces @0xSage (#966) +- docs: scaffold dev docs @0xSage (#856) +- chore: Bump nitro to 0.1.26 @vuonghoainam (#960) +- Update update-release-url.yml @hiento09 (#951) +- Fix update release url pipeline run failed @hiento09 (#947) +- chore: Bumpt nitro bin version to version 0.1.23 @vuonghoainam (#942) +- Fix update release url pipeline @hiento09 (#941) +- CI automatically update Update README with Nightly Build Information and stable download URL @hiento09 (#940) +- refactor: deprecate invokers - auto proxying apis - strict types @louis-jan (#924) +- docs: standardize yaml files @hieu-jan (#933) +- chore: universal module definition @louis-jan (#902) +- docs: add assistants api reference @hieu-jan (#801) +- docs: add json schema for engine and model parameters @tikikun (#840) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @jan-service-account, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam diff --git a/docs/docs/guides/changelog/changelog-v0.4.2.mdx b/docs/docs/releases/changelog/changelog-v0.4.2.mdx similarity index 97% rename from docs/docs/guides/changelog/changelog-v0.4.2.mdx rename to docs/docs/releases/changelog/changelog-v0.4.2.mdx index f5c39d1e3..76ba8ab0d 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.2.mdx @@ -7,43 +7,43 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1033: Hotfix model hub](https://github.com/janhq/jan/pull/1033) -## Changes - -- Hotfix model hub @hahuyhoang411 (#1033) -- Update Model.json @hahuyhoang411 (#1005) - -## 🚀 Features - -- feat: app theme depend on local storage instead native theme electron @urmauur (#1014) -- feat: move stop inference button into the send button @urmauur (#1011) -- feat: loader when starting model @urmauur (#945) -- fix: enable download app linux @urmauur (#993) -- fix: remove coming soon windows @urmauur (#986) - -## 🐛 Fixes - -- fix: migrate new models @louis-jan (#1034) -- fix: add input for api key remote model @urmauur (#1031) -- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) -- fix: delete first message then regenerate again will break the thread @louis-jan (#1015) -- fix: #995 - Fix onboarding state and model sorting @louis-jan (#1009) -- fix: limit analytics events capture @louis-jan (#1012) -- fix: wrong selected model right panel @urmauur (#1001) -- fix: review finder and view as json @louis-jan (#1000) -- fix: enable download app linux @urmauur (#993) - -## 🧰 Maintenance - -- chore: remigrate if there is no models dir @louis-jan (#1038) -- bump nitro version to 0.1.30 @hiento09 (#1036) -- chore: in app copy fixes @0xSage (#1032) -- Separate posthog project for jan app and docs @hiento09 (#1029) -- Update posthog capture url list @hiento09 (#1022) -- docs: second half of "import model docs" PR @0xSage (#1021) -- docs: how to import models @0xSage (#1020) -- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @jan-service-account, @louis-jan and @urmauur +## Changes + +- Hotfix model hub @hahuyhoang411 (#1033) +- Update Model.json @hahuyhoang411 (#1005) + +## 🚀 Features + +- feat: app theme depend on local storage instead native theme electron @urmauur (#1014) +- feat: move stop inference button into the send button @urmauur (#1011) +- feat: loader when starting model @urmauur (#945) +- fix: enable download app linux @urmauur (#993) +- fix: remove coming soon windows @urmauur (#986) + +## 🐛 Fixes + +- fix: migrate new models @louis-jan (#1034) +- fix: add input for api key remote model @urmauur (#1031) +- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) +- fix: delete first message then regenerate again will break the thread @louis-jan (#1015) +- fix: #995 - Fix onboarding state and model sorting @louis-jan (#1009) +- fix: limit analytics events capture @louis-jan (#1012) +- fix: wrong selected model right panel @urmauur (#1001) +- fix: review finder and view as json @louis-jan (#1000) +- fix: enable download app linux @urmauur (#993) + +## 🧰 Maintenance + +- chore: remigrate if there is no models dir @louis-jan (#1038) +- bump nitro version to 0.1.30 @hiento09 (#1036) +- chore: in app copy fixes @0xSage (#1032) +- Separate posthog project for jan app and docs @hiento09 (#1029) +- Update posthog capture url list @hiento09 (#1022) +- docs: second half of "import model docs" PR @0xSage (#1021) +- docs: how to import models @0xSage (#1020) +- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @jan-service-account, @louis-jan and @urmauur diff --git a/docs/docs/guides/changelog/changelog-v0.4.3.mdx b/docs/docs/releases/changelog/changelog-v0.4.3.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.4.3.mdx rename to docs/docs/releases/changelog/changelog-v0.4.3.mdx index c40af7baf..054b6595d 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.3.mdx @@ -7,62 +7,62 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1159: Hotfix Prompt template for models on the Hub](https://github.com/janhq/jan/pull/1159) -## Changes - -- Hotfix Prompt template for models on the Hub @hahuyhoang411 (#1159) -- Update model list for new release @hahuyhoang411 (#1143) -- fix(Thread): #1119 focus on the first thread to prevent blank chat screen @namchuai (#1127) -- fix(Thread): #1064 message being added to wrong thread if switching thread @namchuai (#1108) -- fix(Thread): #1042 allow create new thread by clicking Use in Jan Hub @namchuai (#1103) -- feat(ModelSetting): #1065 update state of model setting between threads @namchuai (#1090) -- Update model version @hahuyhoang411 (#1086) -- fix: cache hallucinations and failed to load model due to race condition @louis-jan (#1071) -- fix(thread): #1043 default model to prefer active model @namchuai (#1070) -- Update issue templates @0xSage (#1058) -- Update ctx\_len and max\_tokens @hahuyhoang411 (#1035) - -## 🚀 Features - -- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) -- Feature autoupdater for nightly build @hiento09 (#1068) -- feat: copy button for code block @urmauur (#1062) -- Enhancements to Dependency Installation and App Testing @hiento09 (#965) - -## 🐛 Fixes - -- fix: error road map url @hieu-jan (#1153) -- Fix token speed slow in machine has multi gpus @hiento09 (#1157) -- fix: added dialog confirmation clean thread @urmauur (#1142) -- fix: remove remote model from shortcut models dialog @urmauur (#1124) -- fix: ui issue - all models are activated @louis-jan (#1120) -- fix: should not hide empty message away @louis-jan (#1116) -- fix: added tooltip for user cannot change model after starting thread @urmauur (#1115) -- fix: remote model always active badges @urmauur (#1113) -- fix: handle chat completion state with enter button @louis-jan (#1114) -- fix: model active indicator only show when model activated @urmauur (#1110) -- fix: #1096 yield error message upon thread switching @louis-jan (#1109) -- fix: toaster success deleted thread showing id instead of active model @urmauur (#1111) -- fix: update copy setting page @urmauur (#1105) -- fix: search recommended model @urmauur (#1106) -- fix: #1097 streaming response is replaced by error message @louis-jan (#1099) -- Fix auto update windows Bug @hiento09 (#1102) -- fix: added dialog confirmation when delete thread @urmauur (#1093) -- fix: system monitor broken layout when responsive @urmauur (#1085) -- bug: chatbox doesn't resize back down @urmauur (#1084) -- fix: thread is broken after deleted first generated message @louis-jan (#1061) - -## 🧰 Maintenance - -- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) -- docs: refactor dev docs, guides and specs @0xSage (#1092) -- Correct jq command cause ci nightly build run failed @hiento09 (#1104) -- Fix nightly build autoupdater @hiento09 (#1073) -- Feature autoupdater for nightly build @hiento09 (#1068) -- docs: Update product.md @0xSage (#1066) -- Posthog disable click event and increase timeout for nitro load model… @hiento09 (#1060) -- docs: improve quickstart docs @0xSage (#1047) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai and @urmauur +## Changes + +- Hotfix Prompt template for models on the Hub @hahuyhoang411 (#1159) +- Update model list for new release @hahuyhoang411 (#1143) +- fix(Thread): #1119 focus on the first thread to prevent blank chat screen @namchuai (#1127) +- fix(Thread): #1064 message being added to wrong thread if switching thread @namchuai (#1108) +- fix(Thread): #1042 allow create new thread by clicking Use in Jan Hub @namchuai (#1103) +- feat(ModelSetting): #1065 update state of model setting between threads @namchuai (#1090) +- Update model version @hahuyhoang411 (#1086) +- fix: cache hallucinations and failed to load model due to race condition @louis-jan (#1071) +- fix(thread): #1043 default model to prefer active model @namchuai (#1070) +- Update issue templates @0xSage (#1058) +- Update ctx\_len and max\_tokens @hahuyhoang411 (#1035) + +## 🚀 Features + +- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) +- Feature autoupdater for nightly build @hiento09 (#1068) +- feat: copy button for code block @urmauur (#1062) +- Enhancements to Dependency Installation and App Testing @hiento09 (#965) + +## 🐛 Fixes + +- fix: error road map url @hieu-jan (#1153) +- Fix token speed slow in machine has multi gpus @hiento09 (#1157) +- fix: added dialog confirmation clean thread @urmauur (#1142) +- fix: remove remote model from shortcut models dialog @urmauur (#1124) +- fix: ui issue - all models are activated @louis-jan (#1120) +- fix: should not hide empty message away @louis-jan (#1116) +- fix: added tooltip for user cannot change model after starting thread @urmauur (#1115) +- fix: remote model always active badges @urmauur (#1113) +- fix: handle chat completion state with enter button @louis-jan (#1114) +- fix: model active indicator only show when model activated @urmauur (#1110) +- fix: #1096 yield error message upon thread switching @louis-jan (#1109) +- fix: toaster success deleted thread showing id instead of active model @urmauur (#1111) +- fix: update copy setting page @urmauur (#1105) +- fix: search recommended model @urmauur (#1106) +- fix: #1097 streaming response is replaced by error message @louis-jan (#1099) +- Fix auto update windows Bug @hiento09 (#1102) +- fix: added dialog confirmation when delete thread @urmauur (#1093) +- fix: system monitor broken layout when responsive @urmauur (#1085) +- bug: chatbox doesn't resize back down @urmauur (#1084) +- fix: thread is broken after deleted first generated message @louis-jan (#1061) + +## 🧰 Maintenance + +- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) +- docs: refactor dev docs, guides and specs @0xSage (#1092) +- Correct jq command cause ci nightly build run failed @hiento09 (#1104) +- Fix nightly build autoupdater @hiento09 (#1073) +- Feature autoupdater for nightly build @hiento09 (#1068) +- docs: Update product.md @0xSage (#1066) +- Posthog disable click event and increase timeout for nitro load model… @hiento09 (#1060) +- docs: improve quickstart docs @0xSage (#1047) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai and @urmauur diff --git a/docs/docs/guides/changelog/changelog-v0.4.4.mdx b/docs/docs/releases/changelog/changelog-v0.4.4.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.4.4.mdx rename to docs/docs/releases/changelog/changelog-v0.4.4.mdx index bf179a8f4..c941f41d4 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.4.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.4.mdx @@ -7,191 +7,191 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1587: Update 2023-11-05-hello-world.md](https://github.com/janhq/jan/pull/1587) -## Changes - -- Update 2023-11-05-hello-world.md @Ssstars (#1587) -- fix(API): #1511 update swagger page @namchuai (#1572) -- fix(Thread): #1212 thread.json not created when user change thread settings @namchuai (#1570) -- fix(Thread): #1336 not allow creating too many unfinished thread @namchuai (#1538) -- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1555) -- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1553) -- Update 02-embracing-pod-structure.mdx @Ssstars (#1550) -- Update 01-how-we-hire.mdx @Ssstars (#1551) -- Update 01-how-we-hire.mdx @Ssstars (#1524) -- fix(InferenceExtension): #1067 sync the nitro process state @namchuai (#1493) -- fix(Messages): #1434 create message via api does not display on app correctly @namchuai (#1479) -- Docs for the Integration of Continue and Jan in VSCode @0xgokuz (#1467) -- Chore: Update model.json for UI @hahuyhoang411 (#1448) -- Docs for Installing Models from Hub @0xgokuz (#1450) -- Update about.md @Ssstars (#1436) -- feat(UI): #1404 make left side bar collapsible by hot key @namchuai (#1420) -- docs: Typo in 06-hardware.md @akaMrNagar (#1408) -- fix(API): #1409 fix wrong prefix for threads api @namchuai (#1410) -- Update model hub @hahuyhoang411 (#1383) -- fix(Model): remove unsupported default model setting params @namchuai (#1382) -- fix(trinity): update cover path for trinity v1.2 @hahuyhoang411 (#1380) -- Chore/update model hub @hahuyhoang411 (#1342) -- Update about.md @Ssstars (#1359) -- fix(JanHub): #1158 sort model list @namchuai (#1257) -- fix(Message): open link with external browser @namchuai (#1339) -- feat(Model): #1028 made model.json optional @namchuai (#1314) -- docs: Update onboarding.md @Diane0111 (#1293) -- fix: clean resource on exit @louis-jan (#1290) -- fix: posthog configuration @hieu-jan (#1283) -- docs: update README.md @eltociear (#1277) -- Enable scrolling in the message chat box @Gri-ffin (#1280) -- chore: Update README.md @sr-albert (#1263) -- Adding new model to the Hub @hahuyhoang411 (#1213) -- Feature GPU detection for Jan on Windows and Linux @hiento09 (#1242) -- fix(Thread): #1168 fix newly created thread cannot select model after restart @namchuai (#1176) - -## 🚀 Features - -- feat: add compatibility tag to model selection in right panel @urmauur (#1552) -- Feature integrate antivirus scanner to ci @hiento09 (#1529) -- feat: [hub] update compatibility tags colors @urmauur (#1516) -- feat: hub recommendation labels @urmauur (#1440) -- Feature linux support app image format @hiento09 (#1442) -- fix: render external links @urmauur (#1441) -- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) -- feat(UI): update UI footer @urmauur (#1424) -- Fix Bug for Chat Reply Goes off Screen @mishrababhishek (#1393) -- feat: move social media from left panel into footer @urmauur (#1325) -- feat: implementation new UI thread settings @urmauur (#1301) -- Bring social media links @Gri-ffin (#1295) -- feat: added keyboard shortcut list in setting page @urmauur (#1275) -- feat: add swagger /docs to localhost:1337 @louis-jan (#1268) -- feat: update posthog configuration @hieu-jan (#1258) -- feat: Deprecate model.json ready state in favor of .download ext @louis-jan (#1238) -- feat: add engine settings @namchuai (#1199) -- feat: users should be able to switch models mid-thread @louis-jan (#1226) -- feat: temporary link how to import model @urmauur (#1209) - -## 🐛 Fixes - -- fix: #1594 - Model settings - change thread model - go back does not see according settings @louis-jan (#1595) -- fix: #1548 - duplicate command shortcut instruction @louis-jan (#1600) -- fix: switch model caused app crash @louis-jan (#1597) -- fix: #1559 Inference Parameters displayed on new thread with Openai GPT Model @louis-jan (#1588) -- fix: enable user set value manually model setting from input @urmauur (#1585) -- fix: #1569 - Does not apply thread settings when loading model @louis-jan (#1576) -- fix: could not change model params settings @louis-jan (#1547) -- fix: gpu check module export does not work in extension @louis-jan (#1536) -- fix: adjust calculation hub labels using total RAM instead remaining RAM @urmauur (#1522) -- Feature integrate antivirus scanner to ci @hiento09 (#1529) -- fix: allow users to set max tokens variably @urmauur (#1513) -- fix: stop word update @louis-jan (#1457) -- Revert nitro to 0.2.6 @hiento09 (#1491) -- fix: enable text selection codeblock @urmauur (#1466) -- fix: suppress all main node JS error message dialog @louis-jan (#1460) -- Correct AppImage path @hiento09 (#1446) -- fix: render external links @urmauur (#1441) -- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) -- fix: GET /models does not work due to new default model dir @louis-jan (#1392) -- fix: model migration stopped working @louis-jan (#1378) -- fix: wrong condition for displaying error message @louis-jan (#1376) -- fix: show hide section engine params @urmauur (#1374) -- fix: copy stream tooltip and hide section when no params setting @urmauur (#1373) -- bugs: fix stop streaming when user delete or clean thread @urmauur (#1347) -- fix: show a proper error message on download failure @louis-jan (#1345) -- Add detect cuda version jan app @hiento09 (#1351) -- fix: Error occurred: Unexpected token "d", "data: ..." is not a valid JSON @louis-jan (#1332) -- fix: app getting stuck at downloading 99% while downloading model @louis-jan (#1320) -- correct type utf-8 @hiento09 (#1311) -- Fix memory on mac included cached and swap @hiento09 (#1298) -- fix: should check app dir before spawning log @louis-jan (#1297) -- fix: disable process logging from server @louis-jan (#1296) -- fix: user should be able to access Swagger docs from localhost:1337 @louis-jan (#1292) -- Switch from Gigabyte to Gibibyte - System monitor @hiento09 (#1286) -- Switch from systeminformation to os-utils to resolve Bitdefender false positive and memory leak issue @hiento09 (#1282) -- fix: swagger CSP issue @louis-jan (#1284) -- fix: support markdown break line @urmauur (#1274) -- fix ci test run failed @hiento09 (#1267) -- Fix wrong linux nitro path @hiento09 (#1266) -- fix: enable command enter on dialog confirmation clean thread @urmauur (#1261) -- fix: input message duplicated due with some input sources @louis-jan (#1259) -- fix: mac users should not see GPU settings @louis-jan (#1255) -- fix: remove redundant gpu detection prompt event @louis-jan (#1254) -- fix: engine settings GUI - feature toggle @louis-jan (#1252) -- Fix bug #1178 high ram on windows @hiento09 (#1241) -- fix: #1183 Reveal in finder does not work on windows @namchuai (#1239) -- fix: remove delay tooltip and click event @urmauur (#1217) -- fix: enable enter command on dialog confirmation delete thread @urmauur (#1218) -- fix: Cleared thread last message is not updated @louis-jan (#1225) -- Fix switch thread crash nitro windows linux @hiento09 (#1214) -- fix: darkmode broken color @urmauur (#1186) - -## 🧰 Maintenance - -- chore: typo model.json @louis-jan (#1599) -- docs: add 04-how-to-get-error-logs.mdx @hieu-jan (#1580) -- chore: teach how to attach logs @0xSage (#1578) -- chore: issues should auto close with PRs through template @0xSage (#1577) -- chore: Update issue templates @0xSage (#1568) -- docs: fix x handles @0xSage (#1532) -- Docs to integrate OpenRouter with Jan without UI/UX @0xgokuz (#1495) -- chore: fix darkmode docs @hieu-jan (#1520) -- docs: fix algolia configuration @hieu-jan (#1518) -- docs: fix algolia configuration @hieu-jan (#1517) -- Revert URL release in readme to version 0.4.3 @hiento09 (#1502) -- refactor: add app and nitro log - resolve dependencies issue @louis-jan (#1447) -- chore: enable agolia @hieu-jan (#1497) -- docs: update troubleshooting and redirects old pages @hieu-jan (#1492) -- docs: minor fix @hieu-jan (#1478) -- docs: initial handbook structure @hieu-jan (#1477) -- Bump nitro to 0.2.8 and change Jan App to support cuda >= 11.7 @hiento09 (#1476) -- Chore update docs jan - add AppImage instruction to docusaurus @hiento09 (#1480) -- Bump nitro to 0.2.7 @hiento09 (#1474) -- chore: error message update @louis-jan (#1473) -- docs: Update 02-import-manually.mdx @0xSage (#1469) -- docs: Update about.md @0xSage (#1465) -- Bump nitro version to 0.2.6 @hiento09 (#1458) -- docs: adding customize engine settings @hieu-jan (#1455) -- docs: add-missing-path @hieu-jan (#1454) -- docs: resize gif @hieu-jan (#1453) -- docs: revenue philosophy @0xSage (#1443) -- docs: jan framework principles @0xSage (#1438) -- docs: fix typo in docs @hieu-jan (#1419) -- chore: clean up use os hook @namchuai (#1418) -- docs: explain each docs page intent @0xSage (#1417) -- docs: Update 01-server.md @0xSage (#1416) -- Update warning url from github md file to jan.ai docs site @hiento09 (#1414) -- docs: improve gpu not used guide @hieu-jan (#1405) -- chore: update README.md @eltociear (#1406) -- Update USAGE docs for linux @hiento09 (#1401) -- docs: gpu not detected @0xSage (#1399) -- docs: Troubleshoot Failed To Fetch @gabrielle-ong (#1398) -- docs: improve docs syntax @hieu-jan (#1394) -- docs: add-install-nightly-guide @hieu-jan (#1390) -- docs: correct href link @hieu-jan (#1338) -- docs: fix chat payload and cURL @hieu-jan (#1360) -- docs: add Chatting Guide @hieu-jan (#1184) -- Chore add docs usage how to switch run mode jan app @hiento09 (#1353) -- docs: configure index page @hieu-jan (#1330) -- docs: Update product.md @0xSage (#1326) -- docs: Update 01-server.md @0xSage (#1327) -- refactor: deprecate the appVersion IPC and use the predefined VERSION @louis-jan (#1309) -- docs: update using models documentation @hieu-jan (#1288) -- docs: update pm handbook @0xSage (#1307) -- docs: contributor docs overview @0xSage (#1305) -- chore: github PR template @0xSage (#1304) -- Fix memory on mac included cached and swap @hiento09 (#1298) -- Enrich discord message for nightly build url @hiento09 (#1294) -- Refactor CI by create shared jobs output @hiento09 (#1287) -- docs: update README.md @hieu-jan (#1281) -- docs: Update README.md @0xSage (#1248) -- feat: Jan Server, API and decoupled clients @louis-jan (#948) -- docs: improve 02-import-manually @hieu-jan (#1222) -- chore: Update issue templates @0xSage (#1229) -- docs: Update 02-import-manually.mdx @0xSage (#1197) -- add sleep 500ms if platform is windows before starting nitro process @hiento09 (#1215) -- docs: improve troubleshoot documentation @hieu-jan (#1173) -- docs: update bug report template @hieu-jan (#1180) -- docs: add troubleshooting @hieu-jan (#1169) -- chore: copy fixes @0xSage (#1167) -- docs: Update 01-start-thread.md @0xSage (#1122) - -## Contributor - -@0xSage, @0xgokuz, @Diane0111, @Gri-ffin, @Ssstars, @akaMrNagar, @eltociear, @gabrielle-ong, @hahuyhoang411, @hiento09, @hieu-jan, @jan-service-account, @louis-jan, @mishrababhishek, @namchuai, @sr-albert, @urmauur and Abhishek Mishra +## Changes + +- Update 2023-11-05-hello-world.md @Ssstars (#1587) +- fix(API): #1511 update swagger page @namchuai (#1572) +- fix(Thread): #1212 thread.json not created when user change thread settings @namchuai (#1570) +- fix(Thread): #1336 not allow creating too many unfinished thread @namchuai (#1538) +- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1555) +- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1553) +- Update 02-embracing-pod-structure.mdx @Ssstars (#1550) +- Update 01-how-we-hire.mdx @Ssstars (#1551) +- Update 01-how-we-hire.mdx @Ssstars (#1524) +- fix(InferenceExtension): #1067 sync the nitro process state @namchuai (#1493) +- fix(Messages): #1434 create message via api does not display on app correctly @namchuai (#1479) +- Docs for the Integration of Continue and Jan in VSCode @0xgokuz (#1467) +- Chore: Update model.json for UI @hahuyhoang411 (#1448) +- Docs for Installing Models from Hub @0xgokuz (#1450) +- Update about.md @Ssstars (#1436) +- feat(UI): #1404 make left side bar collapsible by hot key @namchuai (#1420) +- docs: Typo in 06-hardware.md @akaMrNagar (#1408) +- fix(API): #1409 fix wrong prefix for threads api @namchuai (#1410) +- Update model hub @hahuyhoang411 (#1383) +- fix(Model): remove unsupported default model setting params @namchuai (#1382) +- fix(trinity): update cover path for trinity v1.2 @hahuyhoang411 (#1380) +- Chore/update model hub @hahuyhoang411 (#1342) +- Update about.md @Ssstars (#1359) +- fix(JanHub): #1158 sort model list @namchuai (#1257) +- fix(Message): open link with external browser @namchuai (#1339) +- feat(Model): #1028 made model.json optional @namchuai (#1314) +- docs: Update onboarding.md @Diane0111 (#1293) +- fix: clean resource on exit @louis-jan (#1290) +- fix: posthog configuration @hieu-jan (#1283) +- docs: update README.md @eltociear (#1277) +- Enable scrolling in the message chat box @Gri-ffin (#1280) +- chore: Update README.md @sr-albert (#1263) +- Adding new model to the Hub @hahuyhoang411 (#1213) +- Feature GPU detection for Jan on Windows and Linux @hiento09 (#1242) +- fix(Thread): #1168 fix newly created thread cannot select model after restart @namchuai (#1176) + +## 🚀 Features + +- feat: add compatibility tag to model selection in right panel @urmauur (#1552) +- Feature integrate antivirus scanner to ci @hiento09 (#1529) +- feat: [hub] update compatibility tags colors @urmauur (#1516) +- feat: hub recommendation labels @urmauur (#1440) +- Feature linux support app image format @hiento09 (#1442) +- fix: render external links @urmauur (#1441) +- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) +- feat(UI): update UI footer @urmauur (#1424) +- Fix Bug for Chat Reply Goes off Screen @mishrababhishek (#1393) +- feat: move social media from left panel into footer @urmauur (#1325) +- feat: implementation new UI thread settings @urmauur (#1301) +- Bring social media links @Gri-ffin (#1295) +- feat: added keyboard shortcut list in setting page @urmauur (#1275) +- feat: add swagger /docs to localhost:1337 @louis-jan (#1268) +- feat: update posthog configuration @hieu-jan (#1258) +- feat: Deprecate model.json ready state in favor of .download ext @louis-jan (#1238) +- feat: add engine settings @namchuai (#1199) +- feat: users should be able to switch models mid-thread @louis-jan (#1226) +- feat: temporary link how to import model @urmauur (#1209) + +## 🐛 Fixes + +- fix: #1594 - Model settings - change thread model - go back does not see according settings @louis-jan (#1595) +- fix: #1548 - duplicate command shortcut instruction @louis-jan (#1600) +- fix: switch model caused app crash @louis-jan (#1597) +- fix: #1559 Inference Parameters displayed on new thread with Openai GPT Model @louis-jan (#1588) +- fix: enable user set value manually model setting from input @urmauur (#1585) +- fix: #1569 - Does not apply thread settings when loading model @louis-jan (#1576) +- fix: could not change model params settings @louis-jan (#1547) +- fix: gpu check module export does not work in extension @louis-jan (#1536) +- fix: adjust calculation hub labels using total RAM instead remaining RAM @urmauur (#1522) +- Feature integrate antivirus scanner to ci @hiento09 (#1529) +- fix: allow users to set max tokens variably @urmauur (#1513) +- fix: stop word update @louis-jan (#1457) +- Revert nitro to 0.2.6 @hiento09 (#1491) +- fix: enable text selection codeblock @urmauur (#1466) +- fix: suppress all main node JS error message dialog @louis-jan (#1460) +- Correct AppImage path @hiento09 (#1446) +- fix: render external links @urmauur (#1441) +- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) +- fix: GET /models does not work due to new default model dir @louis-jan (#1392) +- fix: model migration stopped working @louis-jan (#1378) +- fix: wrong condition for displaying error message @louis-jan (#1376) +- fix: show hide section engine params @urmauur (#1374) +- fix: copy stream tooltip and hide section when no params setting @urmauur (#1373) +- bugs: fix stop streaming when user delete or clean thread @urmauur (#1347) +- fix: show a proper error message on download failure @louis-jan (#1345) +- Add detect cuda version jan app @hiento09 (#1351) +- fix: Error occurred: Unexpected token "d", "data: ..." is not a valid JSON @louis-jan (#1332) +- fix: app getting stuck at downloading 99% while downloading model @louis-jan (#1320) +- correct type utf-8 @hiento09 (#1311) +- Fix memory on mac included cached and swap @hiento09 (#1298) +- fix: should check app dir before spawning log @louis-jan (#1297) +- fix: disable process logging from server @louis-jan (#1296) +- fix: user should be able to access Swagger docs from localhost:1337 @louis-jan (#1292) +- Switch from Gigabyte to Gibibyte - System monitor @hiento09 (#1286) +- Switch from systeminformation to os-utils to resolve Bitdefender false positive and memory leak issue @hiento09 (#1282) +- fix: swagger CSP issue @louis-jan (#1284) +- fix: support markdown break line @urmauur (#1274) +- fix ci test run failed @hiento09 (#1267) +- Fix wrong linux nitro path @hiento09 (#1266) +- fix: enable command enter on dialog confirmation clean thread @urmauur (#1261) +- fix: input message duplicated due with some input sources @louis-jan (#1259) +- fix: mac users should not see GPU settings @louis-jan (#1255) +- fix: remove redundant gpu detection prompt event @louis-jan (#1254) +- fix: engine settings GUI - feature toggle @louis-jan (#1252) +- Fix bug #1178 high ram on windows @hiento09 (#1241) +- fix: #1183 Reveal in finder does not work on windows @namchuai (#1239) +- fix: remove delay tooltip and click event @urmauur (#1217) +- fix: enable enter command on dialog confirmation delete thread @urmauur (#1218) +- fix: Cleared thread last message is not updated @louis-jan (#1225) +- Fix switch thread crash nitro windows linux @hiento09 (#1214) +- fix: darkmode broken color @urmauur (#1186) + +## 🧰 Maintenance + +- chore: typo model.json @louis-jan (#1599) +- docs: add 04-how-to-get-error-logs.mdx @hieu-jan (#1580) +- chore: teach how to attach logs @0xSage (#1578) +- chore: issues should auto close with PRs through template @0xSage (#1577) +- chore: Update issue templates @0xSage (#1568) +- docs: fix x handles @0xSage (#1532) +- Docs to integrate OpenRouter with Jan without UI/UX @0xgokuz (#1495) +- chore: fix darkmode docs @hieu-jan (#1520) +- docs: fix algolia configuration @hieu-jan (#1518) +- docs: fix algolia configuration @hieu-jan (#1517) +- Revert URL release in readme to version 0.4.3 @hiento09 (#1502) +- refactor: add app and nitro log - resolve dependencies issue @louis-jan (#1447) +- chore: enable agolia @hieu-jan (#1497) +- docs: update troubleshooting and redirects old pages @hieu-jan (#1492) +- docs: minor fix @hieu-jan (#1478) +- docs: initial handbook structure @hieu-jan (#1477) +- Bump nitro to 0.2.8 and change Jan App to support cuda >= 11.7 @hiento09 (#1476) +- Chore update docs jan - add AppImage instruction to docusaurus @hiento09 (#1480) +- Bump nitro to 0.2.7 @hiento09 (#1474) +- chore: error message update @louis-jan (#1473) +- docs: Update 02-import-manually.mdx @0xSage (#1469) +- docs: Update about.md @0xSage (#1465) +- Bump nitro version to 0.2.6 @hiento09 (#1458) +- docs: adding customize engine settings @hieu-jan (#1455) +- docs: add-missing-path @hieu-jan (#1454) +- docs: resize gif @hieu-jan (#1453) +- docs: revenue philosophy @0xSage (#1443) +- docs: jan framework principles @0xSage (#1438) +- docs: fix typo in docs @hieu-jan (#1419) +- chore: clean up use os hook @namchuai (#1418) +- docs: explain each docs page intent @0xSage (#1417) +- docs: Update 01-server.md @0xSage (#1416) +- Update warning url from github md file to jan.ai docs site @hiento09 (#1414) +- docs: improve gpu not used guide @hieu-jan (#1405) +- chore: update README.md @eltociear (#1406) +- Update USAGE docs for linux @hiento09 (#1401) +- docs: gpu not detected @0xSage (#1399) +- docs: Troubleshoot Failed To Fetch @gabrielle-ong (#1398) +- docs: improve docs syntax @hieu-jan (#1394) +- docs: add-install-nightly-guide @hieu-jan (#1390) +- docs: correct href link @hieu-jan (#1338) +- docs: fix chat payload and cURL @hieu-jan (#1360) +- docs: add Chatting Guide @hieu-jan (#1184) +- Chore add docs usage how to switch run mode jan app @hiento09 (#1353) +- docs: configure index page @hieu-jan (#1330) +- docs: Update product.md @0xSage (#1326) +- docs: Update 01-server.md @0xSage (#1327) +- refactor: deprecate the appVersion IPC and use the predefined VERSION @louis-jan (#1309) +- docs: update using models documentation @hieu-jan (#1288) +- docs: update pm handbook @0xSage (#1307) +- docs: contributor docs overview @0xSage (#1305) +- chore: github PR template @0xSage (#1304) +- Fix memory on mac included cached and swap @hiento09 (#1298) +- Enrich discord message for nightly build url @hiento09 (#1294) +- Refactor CI by create shared jobs output @hiento09 (#1287) +- docs: update README.md @hieu-jan (#1281) +- docs: Update README.md @0xSage (#1248) +- feat: Jan Server, API and decoupled clients @louis-jan (#948) +- docs: improve 02-import-manually @hieu-jan (#1222) +- chore: Update issue templates @0xSage (#1229) +- docs: Update 02-import-manually.mdx @0xSage (#1197) +- add sleep 500ms if platform is windows before starting nitro process @hiento09 (#1215) +- docs: improve troubleshoot documentation @hieu-jan (#1173) +- docs: update bug report template @hieu-jan (#1180) +- docs: add troubleshooting @hieu-jan (#1169) +- chore: copy fixes @0xSage (#1167) +- docs: Update 01-start-thread.md @0xSage (#1122) + +## Contributor + +@0xSage, @0xgokuz, @Diane0111, @Gri-ffin, @Ssstars, @akaMrNagar, @eltociear, @gabrielle-ong, @hahuyhoang411, @hiento09, @hieu-jan, @jan-service-account, @louis-jan, @mishrababhishek, @namchuai, @sr-albert, @urmauur and Abhishek Mishra diff --git a/docs/docs/guides/changelog/changelog-v0.4.5.mdx b/docs/docs/releases/changelog/changelog-v0.4.5.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.4.5.mdx rename to docs/docs/releases/changelog/changelog-v0.4.5.mdx index 0627dd10b..df5c650e8 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.5.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.5.mdx @@ -7,96 +7,96 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1758: bug: Correct text for Windows](https://github.com/janhq/jan/issues/1758) -## Changes - -- fix(Wording): #1758 correct text for windows @namchuai (#1768) -- fix(Log): server log is not display in windows @namchuai (#1764) -- Release Cut v0.4.5 @louis-jan (#1752) -- chore(nitro): 0.2.11 -> 0.2.12 @hiro-v (#1754) -- fix: Nitro CPU threads with correct physical/ performance CPU count @hiro-v (#1726) -- fix(Model): #1662 imported model does not use gpu @namchuai (#1723) -- fix(API): #1720 host/port provided in the local API server does not fully applied @namchuai (#1721) -- fix: server API reference @hiro-v (#1670) -- fix(Model): refactor model label @namchuai (#1596) -- docs/postmortem v 0.4.4 @hieu-jan (#1617) -- chore(ShortcutModal): clean up shortcut modal @namchuai (#1614) -- chore(Dependencies): upgrade node-fetch to fix vulnerable issue @namchuai (#1598) - -## 🚀 Features - -- feat: update UI allow user change folder @urmauur (#1738) -- feat: error message when not enough RAM @urmauur (#1706) -- feat: improvement ux for local api server @urmauur (#1704) -- feat: allow user to move jan folder @namchuai (#1649) -- feat: HTTP proxy support @markmehere (#1562) -- Feature add schedule clean cloudflare page and r2 @hiento09 (#1653) -- feat: relayout left panel setting page @urmauur (#1648) -- Update CI follow git flow @hiento09 (#1625) -- feat: Implement UI page API server dashboard @urmauur (#1636) -- fix: #1545 long thread title @lucido-simon (#1605) - -## 🐛 Fixes - -- fix: model selection does not show in API settings page @louis-jan (#1828) -- fix: user can't view model setting in local api server @namchuai (#1807) -- fix: cannot change jan data folder @namchuai (#1805) -- fix: model selection does not show in API settings page @louis-jan (#1802) -- fix: user can't use a model in model hub @namchuai (#1801) -- fix: stop openai inference raises something amiss @louis-jan (#1799) -- regression fix: input disabled darkmode @urmauur (#1800) -- fix: clean last message when user clean thread message @namchuai (#1793) -- fix: app log not being printed @namchuai (#1790) -- fix: api settings are not applied on changes @louis-jan (#1789) -- fix: could not delete model @louis-jan (#1779) -- fix: can not start model when server is not enabled from model settings page @louis-jan (#1774) -- regression fix: input port not accept alphabets @urmauur (#1772) -- Correct bash script syntax in ci @hiento09 (#1769) -- Hotfix CI pre-release not trigger @hiento09 (#1757) -- fix: bring back open app directory @louis-jan (#1756) -- fix: input port have range validation @urmauur (#1741) -- Fix error nightly build schedule run failed @hiento09 (#1736) -- fix: active model when start server @urmauur (#1719) -- fix: Change to fixed `localhost` instead of using host variable @hiro-v (#1729) -- Fix autoupdater nightly build error @hiento09 (#1727) -- Correct download url readme @hiento09 (#1724) -- fix: API chat/completion is blocked by CORS @louis-jan (#1705) -- fix: Jan server - v1/chat/completions is throwing ERR\_REQUIRE\_ESM @louis-jan (#1703) -- fix: Jan server is showing blank page @louis-jan (#1702) -- fix: switching loader from remote to local model from thread right panel @urmauur (#1692) -- fix: hot-fix algolia search @hieu-jan (#1700) -- fix: disable api key field while server is running @urmauur (#1694) -- fix: stoping model show starting model @urmauur (#1693) -- fix bug #1650 hogging resources @hiento09 (#1663) -- fix: auto select text when collapse panel @urmauur (#1645) -- fix: wrong selected model ref @louis-jan (#1638) -- fix: enable check for update on all supported platforms @louis-jan (#1626) -- fix: correct footer @hieu-jan (#1628) - -## 🧰 Maintenance - -- Docs publish to github page trigger on push to docs branch @hiento09 (#1783) -- Correct bash script syntax in ci @hiento09 (#1769) -- Combine 2 ci pipeline pre-release and nightly into one @hiento09 (#1767) -- Hotfix CI pre-release not trigger @hiento09 (#1757) -- Fix error nightly build schedule run failed @hiento09 (#1736) -- docs: add troubleshoot unexpected token @hieu-jan (#1711) -- docs: fix about pages @0xSage (#1699) -- refactor: deprecate extension type implementation @louis-jan (#1677) -- refactor: file prefix replace utils \& add unit test @louis-jan (#1676) -- Correct ref branch for update url on README.md file @hiento09 (#1672) -- docs: update 02-somethings-amiss @hieu-jan (#1668) -- Cherrypick cicd to main branch to apply new gitflow @hiento09 (#1665) -- docs: add user and developer guides for extensions @hieu-jan (#1657) -- docs: add QA Script @hieu-jan (#1660) -- chore: Bump nitro to 0.2.11 @hiro-v (#1655) -- chore: Bump version nitro to 0.2.10 @hiro-v (#1644) -- docs: add antivirus compatibility testing @hieu-jan (#1641) -- refactor: introduce node module in nitro extension @louis-jan (#1630) -- Update 02-somethings-amiss.mdx @Ssstars (#1634) -- docs: add integration AzureOpenAI @hieu-jan (#1632) -- docs: add troubleshooting permission denied @hieu-jan (#1631) - -## Contributor - -@0xSage, @Ssstars, @hiento09, @hientominh, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @lucido-simon, @markmehere, @namchuai and @urmauur +## Changes + +- fix(Wording): #1758 correct text for windows @namchuai (#1768) +- fix(Log): server log is not display in windows @namchuai (#1764) +- Release Cut v0.4.5 @louis-jan (#1752) +- chore(nitro): 0.2.11 -> 0.2.12 @hiro-v (#1754) +- fix: Nitro CPU threads with correct physical/ performance CPU count @hiro-v (#1726) +- fix(Model): #1662 imported model does not use gpu @namchuai (#1723) +- fix(API): #1720 host/port provided in the local API server does not fully applied @namchuai (#1721) +- fix: server API reference @hiro-v (#1670) +- fix(Model): refactor model label @namchuai (#1596) +- docs/postmortem v 0.4.4 @hieu-jan (#1617) +- chore(ShortcutModal): clean up shortcut modal @namchuai (#1614) +- chore(Dependencies): upgrade node-fetch to fix vulnerable issue @namchuai (#1598) + +## 🚀 Features + +- feat: update UI allow user change folder @urmauur (#1738) +- feat: error message when not enough RAM @urmauur (#1706) +- feat: improvement ux for local api server @urmauur (#1704) +- feat: allow user to move jan folder @namchuai (#1649) +- feat: HTTP proxy support @markmehere (#1562) +- Feature add schedule clean cloudflare page and r2 @hiento09 (#1653) +- feat: relayout left panel setting page @urmauur (#1648) +- Update CI follow git flow @hiento09 (#1625) +- feat: Implement UI page API server dashboard @urmauur (#1636) +- fix: #1545 long thread title @lucido-simon (#1605) + +## 🐛 Fixes + +- fix: model selection does not show in API settings page @louis-jan (#1828) +- fix: user can't view model setting in local api server @namchuai (#1807) +- fix: cannot change jan data folder @namchuai (#1805) +- fix: model selection does not show in API settings page @louis-jan (#1802) +- fix: user can't use a model in model hub @namchuai (#1801) +- fix: stop openai inference raises something amiss @louis-jan (#1799) +- regression fix: input disabled darkmode @urmauur (#1800) +- fix: clean last message when user clean thread message @namchuai (#1793) +- fix: app log not being printed @namchuai (#1790) +- fix: api settings are not applied on changes @louis-jan (#1789) +- fix: could not delete model @louis-jan (#1779) +- fix: can not start model when server is not enabled from model settings page @louis-jan (#1774) +- regression fix: input port not accept alphabets @urmauur (#1772) +- Correct bash script syntax in ci @hiento09 (#1769) +- Hotfix CI pre-release not trigger @hiento09 (#1757) +- fix: bring back open app directory @louis-jan (#1756) +- fix: input port have range validation @urmauur (#1741) +- Fix error nightly build schedule run failed @hiento09 (#1736) +- fix: active model when start server @urmauur (#1719) +- fix: Change to fixed `localhost` instead of using host variable @hiro-v (#1729) +- Fix autoupdater nightly build error @hiento09 (#1727) +- Correct download url readme @hiento09 (#1724) +- fix: API chat/completion is blocked by CORS @louis-jan (#1705) +- fix: Jan server - v1/chat/completions is throwing ERR\_REQUIRE\_ESM @louis-jan (#1703) +- fix: Jan server is showing blank page @louis-jan (#1702) +- fix: switching loader from remote to local model from thread right panel @urmauur (#1692) +- fix: hot-fix algolia search @hieu-jan (#1700) +- fix: disable api key field while server is running @urmauur (#1694) +- fix: stoping model show starting model @urmauur (#1693) +- fix bug #1650 hogging resources @hiento09 (#1663) +- fix: auto select text when collapse panel @urmauur (#1645) +- fix: wrong selected model ref @louis-jan (#1638) +- fix: enable check for update on all supported platforms @louis-jan (#1626) +- fix: correct footer @hieu-jan (#1628) + +## 🧰 Maintenance + +- Docs publish to github page trigger on push to docs branch @hiento09 (#1783) +- Correct bash script syntax in ci @hiento09 (#1769) +- Combine 2 ci pipeline pre-release and nightly into one @hiento09 (#1767) +- Hotfix CI pre-release not trigger @hiento09 (#1757) +- Fix error nightly build schedule run failed @hiento09 (#1736) +- docs: add troubleshoot unexpected token @hieu-jan (#1711) +- docs: fix about pages @0xSage (#1699) +- refactor: deprecate extension type implementation @louis-jan (#1677) +- refactor: file prefix replace utils \& add unit test @louis-jan (#1676) +- Correct ref branch for update url on README.md file @hiento09 (#1672) +- docs: update 02-somethings-amiss @hieu-jan (#1668) +- Cherrypick cicd to main branch to apply new gitflow @hiento09 (#1665) +- docs: add user and developer guides for extensions @hieu-jan (#1657) +- docs: add QA Script @hieu-jan (#1660) +- chore: Bump nitro to 0.2.11 @hiro-v (#1655) +- chore: Bump version nitro to 0.2.10 @hiro-v (#1644) +- docs: add antivirus compatibility testing @hieu-jan (#1641) +- refactor: introduce node module in nitro extension @louis-jan (#1630) +- Update 02-somethings-amiss.mdx @Ssstars (#1634) +- docs: add integration AzureOpenAI @hieu-jan (#1632) +- docs: add troubleshooting permission denied @hieu-jan (#1631) + +## Contributor + +@0xSage, @Ssstars, @hiento09, @hientominh, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @lucido-simon, @markmehere, @namchuai and @urmauur diff --git a/docs/docs/guides/changelog/changelog-v0.4.6.mdx b/docs/docs/releases/changelog/changelog-v0.4.6.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.4.6.mdx rename to docs/docs/releases/changelog/changelog-v0.4.6.mdx index 0ed9a5505..5e8fefdcd 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.6.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.6.mdx @@ -7,57 +7,57 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1918: Regression fix assistant extension codesign](https://github.com/janhq/jan/pull/1918) -## Changes - -- Regression fix assitant extension codesign @hiento09 (#1918) -- Release cut 0.4.6 @louis-jan (#1888) -- feat: add factory reset feature @namchuai (#1750) -- chore: add react developer tools to electron @Helloyunho (#1858) -- Sync Release 0.4.5 to dev @louis-jan (#1830) - -## 🚀 Features - -- feat: integrate umami @hieu-jan (#1809) -- feat: Add default value for ngl @hiro-v (#1886) -- feat: add start/stop model via http api @namchuai (#1862) -- feat: add snackbar component and update style side banner @urmauur (#1874) -- feat: move open app directory into icon folder @urmauur (#1879) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- feat: put timestamp under thread name in left panel @urmauur (#1820) -- perf: remove unnecessary rerender when user typing input @namchuai (#1818) - -## 🐛 Fixes - -- fix: umami analytics send app loaded event @louis-jan (#1928) -- fix: migration loading indicator @louis-jan (#1913) -- fix: broken manual import model with NA fields @louis-jan (#1912) -- fix: openAIEmbedding now requires top level API Key configuration @louis-jan (#1902) -- fix: load model fail overlays thread message error @louis-jan (#1901) -- fix: show generate response on message send @louis-jan (#1895) -- fix: display error message on model load fail @louis-jan (#1894) -- fix: the selected model auto revert back to previous used model with setting mismatch @louis-jan (#1883) -- fix: add dialog confirm when move folder and next dest isn't empty @urmauur (#1880) -- Increase timeout for explore.e2e.spec test @hiento09 (#1844) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- fix: auto collapse retrieval setting while update config @urmauur (#1866) -- fix: loader show while error global when change folder @urmauur (#1870) -- fix: retrieval always ask for api key @louis-jan (#1856) -- fix: all input text box are disabled @namchuai (#1855) -- fix: add loader when user change folder @urmauur (#1850) -- Add code sign step for darwin assistant extension @hiento09 (#1841) -- fix: preserve focused thread when navigating in jan app @namchuai (#1814) -- fix: highlight menu dropdown server options @urmauur (#1831) - -## 🧰 Maintenance - -- chore: mark RAG as experimental feature @louis-jan (#1882) -- Increase timeout for explore.e2e.spec test @hiento09 (#1844) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- chore: Jan Data Folder setting is no longer an experimental feature @louis-jan (#1847) -- chore: resolve main conflict @louis-jan (#1833) -- Update release url on README to default branch instead of main branch @hiento09 (#1832) - -## Contributor - -@Helloyunho, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai, @urmauur and James +## Changes + +- Regression fix assitant extension codesign @hiento09 (#1918) +- Release cut 0.4.6 @louis-jan (#1888) +- feat: add factory reset feature @namchuai (#1750) +- chore: add react developer tools to electron @Helloyunho (#1858) +- Sync Release 0.4.5 to dev @louis-jan (#1830) + +## 🚀 Features + +- feat: integrate umami @hieu-jan (#1809) +- feat: Add default value for ngl @hiro-v (#1886) +- feat: add start/stop model via http api @namchuai (#1862) +- feat: add snackbar component and update style side banner @urmauur (#1874) +- feat: move open app directory into icon folder @urmauur (#1879) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- feat: put timestamp under thread name in left panel @urmauur (#1820) +- perf: remove unnecessary rerender when user typing input @namchuai (#1818) + +## 🐛 Fixes + +- fix: umami analytics send app loaded event @louis-jan (#1928) +- fix: migration loading indicator @louis-jan (#1913) +- fix: broken manual import model with NA fields @louis-jan (#1912) +- fix: openAIEmbedding now requires top level API Key configuration @louis-jan (#1902) +- fix: load model fail overlays thread message error @louis-jan (#1901) +- fix: show generate response on message send @louis-jan (#1895) +- fix: display error message on model load fail @louis-jan (#1894) +- fix: the selected model auto revert back to previous used model with setting mismatch @louis-jan (#1883) +- fix: add dialog confirm when move folder and next dest isn't empty @urmauur (#1880) +- Increase timeout for explore.e2e.spec test @hiento09 (#1844) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- fix: auto collapse retrieval setting while update config @urmauur (#1866) +- fix: loader show while error global when change folder @urmauur (#1870) +- fix: retrieval always ask for api key @louis-jan (#1856) +- fix: all input text box are disabled @namchuai (#1855) +- fix: add loader when user change folder @urmauur (#1850) +- Add code sign step for darwin assistant extension @hiento09 (#1841) +- fix: preserve focused thread when navigating in jan app @namchuai (#1814) +- fix: highlight menu dropdown server options @urmauur (#1831) + +## 🧰 Maintenance + +- chore: mark RAG as experimental feature @louis-jan (#1882) +- Increase timeout for explore.e2e.spec test @hiento09 (#1844) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- chore: Jan Data Folder setting is no longer an experimental feature @louis-jan (#1847) +- chore: resolve main conflict @louis-jan (#1833) +- Update release url on README to default branch instead of main branch @hiento09 (#1832) + +## Contributor + +@Helloyunho, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai, @urmauur and James diff --git a/docs/docs/guides/changelog/changelog-v0.4.7.mdx b/docs/docs/releases/changelog/changelog-v0.4.7.mdx similarity index 98% rename from docs/docs/guides/changelog/changelog-v0.4.7.mdx rename to docs/docs/releases/changelog/changelog-v0.4.7.mdx index 77a19e158..a65a60e92 100644 --- a/docs/docs/guides/changelog/changelog-v0.4.7.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.7.mdx @@ -7,111 +7,111 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #2121: Release cut v0.4.7](https://github.com/janhq/jan/pull/2121) -## Changes - -- Release cut v0.4.7 @louis-jan (#2121) -- chore: update models @hahuyhoang411 (#1829) -- add docs for entire advanced settings @hieu-jan (#2063) -- docs: Fix #2040 : added /v1 path to apiBase @ldebs (#2041) -- fix: ui for disabled state of gpu acceleration @namchuai (#2034) -- feat: Initialize POM structure with fixtures on Playwright @Van-QA (#2015) -- Alternative solution for `Thread titles should auto-summarize Topic` @0xgokuz (#1976) -- Update authors.yml Rex @hahuyhoang411 (#1956) -- Update authors.yml Louis @louis-jan (#1955) -- Change env Dockerfile.gpu and update README @hiento09 (#1963) -- chore: Update authors.yml for Van Pham @Van-QA (#1954) -- Sync dev branch to docs branch @hieu-jan (#1948) -- sync current docs branch to dev branch @hieu-jan (#1947) -- feat: Playwright capture screenshot of Electron desktop app (Jan) on failures @Van-QA (#1934) -- Sync main to dev after release 0.4.6 @hiento09 (#1929) - -## 🚀 Features - -- feat: Add nitro vulkan to support AMD GPU/ APU and Intel Arc GPU @hiro-v (#2056) -- fix: flow edit message @urmauur (#2113) -- Feature helmchart and ci jan server @hiento09 (#2106) -- feat: improvementUI GPU acceleration @urmauur (#1990) -- feat: add edit messages users @urmauur (#1974) -- feat: revamp ui dropdown list model option @urmauur (#1977) -- feat: add modal troubleshooting guideline @urmauur (#1968) -- feat: integrate umami script locally @hieu-jan (#1958) -- feat: User Selectable GPUs and GPU-based Model Recommendations @hiento09 (#1730) - -## 🐛 Fixes - -- fix: correct vulkan settings @louis-jan (#2128) -- fix: chore UI @louis-jan (#2125) -- Regression: bump nitro to 0.3.13 @hiento09 (#2124) -- Regression: Linux vulkan binary path @hiento09 (#2123) -- fix: revert back menu actions @louis-jan (#2120) -- fix: mismatching between nightly build and version - jan about @louis-jan (#2114) -- fix: flow edit message @urmauur (#2113) -- fix: tools section should be expanded by default @louis-jan (#2110) -- fix: failed to bind port - nitro error message copy @louis-jan (#2101) -- fix: remove caret down icon when tab selected into remote model @urmauur (#2102) -- fix: openai client sdk compatible @louis-jan (#2096) -- Fix bug #2005 docker blank website @hiento09 (#2093) -- fix: check if port is occupied before start local server @namchuai (#2098) -- fix: broken model.json update @louis-jan (#2099) -- fix: make text input scrollable @urmauur (#2083) -- fix: failed to send message blocks thread creation @louis-jan (#2091) -- fix: server crashes on missing module @louis-jan (#2089) -- fix: expand assistant and model settings by default @louis-jan (#2081) -- fix: move jan data folder - error handling for no write permission granted @louis-jan (#2077) -- fix: check for updates should show no update are available on the latest build @louis-jan (#2075) -- fix: infinity showed when haven't get total size @namchuai (#2066) -- fix: should stop running the model when GPU settings are changed @louis-jan (#2067) -- fix: settings page state loop and dark theme @louis-jan (#2065) -- fix: Fix Nitro windows with error 3221225781 @hiro-v (#2057) -- fix: message should only be interrupted when i start another thread @louis-jan (#2053) -- fix: local server start error should not change to started state @louis-jan (#2052) -- fix: update copy of message queue @louis-jan (#2051) -- fix: download mutilple binaries @namchuai (#2043) -- fix: disable gpu drop down box if there's no GPU ready @namchuai (#2046) -- fix: app should generate thread title with length restriction @louis-jan (#2037) -- fix: factory reset not remove jan data folder @namchuai (#2027) -- fix: content setting right panel default to collapse @urmauur (#2026) -- fix: local server blank parameters if there is no thread selected @louis-jan (#2028) -- fix: model path backward compatible @louis-jan (#2018) -- fix: resolve state update loop infinitive rerendering @louis-jan (#2017) -- fix: lack of auto-cleaning mechanism for logs @louis-jan (#2003) -- fix: app stuck regenerating assistant response @louis-jan (#2001) -- fix: decouple thread summary update @louis-jan (#1994) -- fix: app fails gracefully with clear error messages @louis-jan (#1993) -- fix: retrieval stuck at generating response @louis-jan (#1988) -- Fix macos auto update failed on nightly build @hiento09 (#1991) -- fix: model downloads broken on nightly @louis-jan (#1984) -- fix: RAG enhancements @urmauur (#1965) -- Update docs run Jan Server in Docker mode @hiento09 (#1960) -- fix: update conditional check last status message @urmauur (#1951) -- fix: markdown render for chat completion role user @urmauur (#1944) -- fix: avoid users to create so many threads at the same time @urmauur (#1930) -- fix: download model will close panel item hub @urmauur (#1923) - -## 🧰 Maintenance - -- docs: improve integrations guide \& import model using absolute path @hieu-jan (#2076) -- chore: add app version into log @namchuai (#2116) -- docs: add integration docs Mistral AI API @hieu-jan (#2070) -- docs:add-advanced-settings-https-proxy @hieu-jan (#2054) -- chore: refactor watch system resource hook @louis-jan (#2048) -- docs: Updates Guide Using the Local Server @SamPatt (#1924) -- server install core using link instead of file @hiento09 (#2025) -- chore: prettier fix @louis-jan (#2019) -- chore: bump nitro 0.3.9 @louis-jan (#2016) -- refactor: reduce IPC \& API handlers - shared node logics @louis-jan (#2011) -- docs: update 03-gpu-not-used with RTX issues @hieu-jan (#1992) -- docs: add Jan installation using Docker @hieu-jan (#1981) -- chore: reduce bundle size @louis-jan (#1970) -- docs: add author.yml @hieu-jan (#1973) -- Update authors.yml hien @hiento09 (#1953) -- chore: server download progress + S3 @louis-jan (#1925) -- chore: add author james @namchuai (#1952) -- chore: Add author - Ashley @imtuyethan (#1950) -- chore: Add Author - Hiro @hiro-v (#1949) -- docs: adding new feature for v0.4.6 to release checklist @Van-QA (#1927) - -## Contributor - -@0xSage, @0xgokuz, @SamPatt, @Van-QA, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @imtuyethan, @jan-service-account, @ldebs, @louis-jan, @namchuai, @urmauur and James +## Changes + +- Release cut v0.4.7 @louis-jan (#2121) +- chore: update models @hahuyhoang411 (#1829) +- add docs for entire advanced settings @hieu-jan (#2063) +- docs: Fix #2040 : added /v1 path to apiBase @ldebs (#2041) +- fix: ui for disabled state of gpu acceleration @namchuai (#2034) +- feat: Initialize POM structure with fixtures on Playwright @Van-QA (#2015) +- Alternative solution for `Thread titles should auto-summarize Topic` @0xgokuz (#1976) +- Update authors.yml Rex @hahuyhoang411 (#1956) +- Update authors.yml Louis @louis-jan (#1955) +- Change env Dockerfile.gpu and update README @hiento09 (#1963) +- chore: Update authors.yml for Van Pham @Van-QA (#1954) +- Sync dev branch to docs branch @hieu-jan (#1948) +- sync current docs branch to dev branch @hieu-jan (#1947) +- feat: Playwright capture screenshot of Electron desktop app (Jan) on failures @Van-QA (#1934) +- Sync main to dev after release 0.4.6 @hiento09 (#1929) + +## 🚀 Features + +- feat: Add nitro vulkan to support AMD GPU/ APU and Intel Arc GPU @hiro-v (#2056) +- fix: flow edit message @urmauur (#2113) +- Feature helmchart and ci jan server @hiento09 (#2106) +- feat: improvementUI GPU acceleration @urmauur (#1990) +- feat: add edit messages users @urmauur (#1974) +- feat: revamp ui dropdown list model option @urmauur (#1977) +- feat: add modal troubleshooting guideline @urmauur (#1968) +- feat: integrate umami script locally @hieu-jan (#1958) +- feat: User Selectable GPUs and GPU-based Model Recommendations @hiento09 (#1730) + +## 🐛 Fixes + +- fix: correct vulkan settings @louis-jan (#2128) +- fix: chore UI @louis-jan (#2125) +- Regression: bump nitro to 0.3.13 @hiento09 (#2124) +- Regression: Linux vulkan binary path @hiento09 (#2123) +- fix: revert back menu actions @louis-jan (#2120) +- fix: mismatching between nightly build and version - jan about @louis-jan (#2114) +- fix: flow edit message @urmauur (#2113) +- fix: tools section should be expanded by default @louis-jan (#2110) +- fix: failed to bind port - nitro error message copy @louis-jan (#2101) +- fix: remove caret down icon when tab selected into remote model @urmauur (#2102) +- fix: openai client sdk compatible @louis-jan (#2096) +- Fix bug #2005 docker blank website @hiento09 (#2093) +- fix: check if port is occupied before start local server @namchuai (#2098) +- fix: broken model.json update @louis-jan (#2099) +- fix: make text input scrollable @urmauur (#2083) +- fix: failed to send message blocks thread creation @louis-jan (#2091) +- fix: server crashes on missing module @louis-jan (#2089) +- fix: expand assistant and model settings by default @louis-jan (#2081) +- fix: move jan data folder - error handling for no write permission granted @louis-jan (#2077) +- fix: check for updates should show no update are available on the latest build @louis-jan (#2075) +- fix: infinity showed when haven't get total size @namchuai (#2066) +- fix: should stop running the model when GPU settings are changed @louis-jan (#2067) +- fix: settings page state loop and dark theme @louis-jan (#2065) +- fix: Fix Nitro windows with error 3221225781 @hiro-v (#2057) +- fix: message should only be interrupted when i start another thread @louis-jan (#2053) +- fix: local server start error should not change to started state @louis-jan (#2052) +- fix: update copy of message queue @louis-jan (#2051) +- fix: download mutilple binaries @namchuai (#2043) +- fix: disable gpu drop down box if there's no GPU ready @namchuai (#2046) +- fix: app should generate thread title with length restriction @louis-jan (#2037) +- fix: factory reset not remove jan data folder @namchuai (#2027) +- fix: content setting right panel default to collapse @urmauur (#2026) +- fix: local server blank parameters if there is no thread selected @louis-jan (#2028) +- fix: model path backward compatible @louis-jan (#2018) +- fix: resolve state update loop infinitive rerendering @louis-jan (#2017) +- fix: lack of auto-cleaning mechanism for logs @louis-jan (#2003) +- fix: app stuck regenerating assistant response @louis-jan (#2001) +- fix: decouple thread summary update @louis-jan (#1994) +- fix: app fails gracefully with clear error messages @louis-jan (#1993) +- fix: retrieval stuck at generating response @louis-jan (#1988) +- Fix macos auto update failed on nightly build @hiento09 (#1991) +- fix: model downloads broken on nightly @louis-jan (#1984) +- fix: RAG enhancements @urmauur (#1965) +- Update docs run Jan Server in Docker mode @hiento09 (#1960) +- fix: update conditional check last status message @urmauur (#1951) +- fix: markdown render for chat completion role user @urmauur (#1944) +- fix: avoid users to create so many threads at the same time @urmauur (#1930) +- fix: download model will close panel item hub @urmauur (#1923) + +## 🧰 Maintenance + +- docs: improve integrations guide \& import model using absolute path @hieu-jan (#2076) +- chore: add app version into log @namchuai (#2116) +- docs: add integration docs Mistral AI API @hieu-jan (#2070) +- docs:add-advanced-settings-https-proxy @hieu-jan (#2054) +- chore: refactor watch system resource hook @louis-jan (#2048) +- docs: Updates Guide Using the Local Server @SamPatt (#1924) +- server install core using link instead of file @hiento09 (#2025) +- chore: prettier fix @louis-jan (#2019) +- chore: bump nitro 0.3.9 @louis-jan (#2016) +- refactor: reduce IPC \& API handlers - shared node logics @louis-jan (#2011) +- docs: update 03-gpu-not-used with RTX issues @hieu-jan (#1992) +- docs: add Jan installation using Docker @hieu-jan (#1981) +- chore: reduce bundle size @louis-jan (#1970) +- docs: add author.yml @hieu-jan (#1973) +- Update authors.yml hien @hiento09 (#1953) +- chore: server download progress + S3 @louis-jan (#1925) +- chore: add author james @namchuai (#1952) +- chore: Add author - Ashley @imtuyethan (#1950) +- chore: Add Author - Hiro @hiro-v (#1949) +- docs: adding new feature for v0.4.6 to release checklist @Van-QA (#1927) + +## Contributor + +@0xSage, @0xgokuz, @SamPatt, @Van-QA, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @imtuyethan, @jan-service-account, @ldebs, @louis-jan, @namchuai, @urmauur and James diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 25b84b877..9adc71bda 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -299,7 +299,7 @@ const config = { { type: "docSidebar", sidebarId: "guidesSidebar", - label: "User Guide", + label: "Guides", }, { type: "docSidebar", @@ -310,6 +310,11 @@ const config = { to: "/api-reference", label: "API Reference", }, + { + type: "docSidebar", + sidebarId: "releasesSidebar", + label: "Changelog", + }, // { // type: "docSidebar", // sidebarId: "docsSidebar", @@ -343,10 +348,6 @@ const config = { }, }, - customFields: { - githubAccessToken: process.env.GITHUB_ACCESS_TOKEN || "XXXX", - }, - themes: ["@docusaurus/theme-live-codeblock", "@docusaurus/theme-mermaid"], }; diff --git a/docs/sidebars.js b/docs/sidebars.js index e1690eca4..fb14f0abe 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -162,6 +162,12 @@ const sidebars = { dirName: "developer", }, ], + releasesSidebar: [ + { + type: "autogenerated", + dirName: "releases", + }, + ] }; module.exports = sidebars; diff --git a/docs/src/theme/Layout/index.js b/docs/src/theme/Layout/index.js index 753af50af..9c2ae32db 100644 --- a/docs/src/theme/Layout/index.js +++ b/docs/src/theme/Layout/index.js @@ -17,7 +17,7 @@ import styles from "./styles.module.scss"; import NavBarExtension from "../NavbarExtension"; import { useLocation } from "react-router-dom"; -const allowedPaths = ["/docs/", "/developer/", "/api-reference/", "/guides/", "/guides", "/docs", "/developer", "/api-reference", "/guides/changelog"]; +const allowedPaths = ["/docs/", "/developer/", "/api-reference/", "/guides/", "/guides", "/docs", "/developer", "/api-reference", "/changelog"]; export default function Layout(props) { const { diff --git a/docs/src/theme/NavbarExtension/index.js b/docs/src/theme/NavbarExtension/index.js index 2c40c1504..a4b418975 100644 --- a/docs/src/theme/NavbarExtension/index.js +++ b/docs/src/theme/NavbarExtension/index.js @@ -17,9 +17,9 @@ export default function NavBarExtension() { - Guide + Guides Changelog From 059461db49775e985fa6c18d74b3c1be4727401b Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Wed, 6 Mar 2024 13:57:27 +0700 Subject: [PATCH 027/131] docs: Add guides doc for how to get error logs --- .../error-codes/how-to-get-error-logs.mdx | 49 ++++++++++++++++++ docs/src/theme/DocCard/assets/logs-error.png | Bin 0 -> 4698 bytes docs/src/theme/DocCard/index.js | 10 +++- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 docs/docs/guides/error-codes/how-to-get-error-logs.mdx create mode 100644 docs/src/theme/DocCard/assets/logs-error.png diff --git a/docs/docs/guides/error-codes/how-to-get-error-logs.mdx b/docs/docs/guides/error-codes/how-to-get-error-logs.mdx new file mode 100644 index 000000000..045468e33 --- /dev/null +++ b/docs/docs/guides/error-codes/how-to-get-error-logs.mdx @@ -0,0 +1,49 @@ +--- +title: How to Get Error Logs +sidebar_position: 5 +description: A step-by-step guide to get the Jan app error logs. +keywords: + [ + Jan AI, + Jan, + ChatGPT alternative, + local AI, + private AI, + conversational AI, + no-subscription fee, + large language model, + troubleshooting, + permission denied, + ] +--- + +To get the error logs of your Jan application, follow the steps below: +### Jan Application +1. Navigate to the main dashboard. +2. Click the **gear icon (⚙️)** on the bottom left of your screen. +3. Under the **Settings screen**, click the **Advanced Settings**. +4. On the **Jan Data Folder** click the **folder icon (📂)** to access the data. +5. Click the **logs** folder. + +### Jan UI +1. Open your Unix or Linux terminal. +2. Use the following commands to get the recent 50 lines of log files: +```bash +tail -n 50 ~/jan/logs/app.log + +``` + +### Jan API Server +1. Open your Unix or Linux terminal. +2. Use the following commands to get the recent 50 lines of log files: +```bash +tail -n 50 ~/jan/logs/server.log + +``` +:::warning +Ensure to redact any private or sensitive information when sharing logs or error details. +::: + +:::note +If you have any questions or are looking for support, please don't hesitate to contact us via our [Discord community](https://discord.gg/Dt7MxDyNNZ) or create a new issue in our [GitHub repository](https://github.com/janhq/jan/issues/new/choose). +::: \ No newline at end of file diff --git a/docs/src/theme/DocCard/assets/logs-error.png b/docs/src/theme/DocCard/assets/logs-error.png new file mode 100644 index 0000000000000000000000000000000000000000..f161c7babac4828dd7378012b978d62d59872985 GIT binary patch literal 4698 zcmZvAXH*kF({AWZdhdwRLl;4m-lR(>NDB~ZfY6(OLI9QCL7D*p>7gT?AWb?Z^r|2& z6e-f-_8P^*~6IeClKs^%j4qp^hHg{3Z- zaj~<@SIH@^IG41{;qlwM=C5SG1dDYFJsXTovM>>84KgNFG&(2oA{(d4$q>)yhAEds zU++-7{-Gwvr=KsQgcxHUkj>v+TV(Mw1}-<=Nr+%a1CIJl2qyGLR+_0k-# zaL}e3-rqirtJ?o%#3h@~muMe6jtuD4+0QET>*k)HsB_99#T71aK`@jum@mkNAcjwy z*~{kv&j|z*G0+|JoM(X9G%a=cN#T*R5J99iLt*49?rH*ebi_-Pkn1o?9`iSDh_j$?I@;P)7h zPfz_^D;vyB$?YU`=EhoF%(GR>930B7RgEBeQg3pNO|(p+FC3D1l^7zG-Rs+>M}|D2 zQ)Mh{lE7hh^Zd-@7*KM|i3E^5uMA8U967NBUaGYS<*j;2+zdV_DHUdgpdk{HV`#B@ zy*dW_xlm;I!hCrEvW>Lhbfr9wtp6aUNpx}ClgU%x_b5IG@gykX;yCKWaU0CCZdk;3 zt6Ymepb=|QQ>*&^gV=&ZTGp4`1MY-&!^f(qUE-@wbD04LtFcPFK^QB(YmurLahm!E zJE}qTY-aS7UE9#QWO=~omAEA3sqe_y7&lfbm-Exj+67`RKOg;|+}KICIM4AK--1z;;%9Cpvv2{fa789nox|mu4n4bozVZa{aH2 z+6|bcZuG6oE?VbaF8qZhrzm&&k7W?dRLeI?GYDHcpLf!j!Q~~>@ivq{D?o4AEd!Ps zVdsO?=6*NvoAT04oEE{ID5o?NL|3a<5XL7Lsm5UK55nwTgs#jy$dVB`F}@RZvu0&t zOS`3@=rlRz5J4LLZkgbtK#R1qFa?rL%LR_f@K^|SvVAx-c_2YmvwSJvca@H4gCHow zEp5eqvSdUhRLG<$R4q*uNhrF3wuln*UZ0zP5=*R-R8J6JTz5xjN!dZ$)W;7(x=$n* z@)s<`N8+4;w;!Cq*c#E-B_JN>HPCn}hRb<&A8FJRwuX1}AD<;u&NjvViBq}gyLyA% zB-zKfwYPL!kMT66IUVcN?g9P2w^8Jo^k8Y~vA_?KrFvsP*7RD=q~C4S#59YC zvxd^e^4nX&E!H61gq{pCTMa8NZ0jrPhfZFKW53?!_TfB>#q(w$TCP^}qb~ZORO*-q zeYP7>&2Vm4IZCa9waw6ex51&r0JVztX}#|H2ujgYoC5=eNaK*jmG+Maw%3RxztOD| z9jwV7uP^5y_NM%(uCMblfYrmKVV9AkiwWgyAtzoX7$ysJUOkM5d3mIqNJJ``bEgk3 zA!$$a#aO0&w)MeZ$Gzd-%O;18r>X5vH5{*mM7KpaP$r%2^j*S`(Y?QVSwQ-4riQGN zfzyo`HG=WWsHTHO9^vfti(byV@0MYK8*Ws@{w!g7Te20#gI+gB&;7B+aw~mru;`3h zw(qFbPn5~w?3V>EbYY)%ao_Iw457GXQlLME4IAd=2irtu1(NC?fmdSokuG`D5Vr_F7w=80jm%c77d##2Z#< z6M=*N(^PAm!p7*r&&^F~yg(VQ|MN0{JdBa_ba3SUOA8C4f-Tm*2O{?5|B9<%HiFDS zS_duVIfOK!MU0s<@1$9y^`?9?XjePs0I=BAv3-4>M>p+6&;C>f1#oUtHV25*^fngD z{n(R_gME?84cY7(*P|bs-t``?RbBbI%|omwBji1>Ala9_eT>ccEx7{r%BmWsVmA>S zHI61EM}A*8OlhbDHWsnq_wJ|iI7xji(pmF2EqX3EDc!1kASdD^^`Q{^yaFUD$D=dG ztq~esRzGO4Ddx-YtenNlDY?jX@?O=-VYydN%DgkIG^8%8y6Bze{EWNjM!lm{FQb_f z>q54rF7wV_!fxftY-T@b5WJp8wAts^o04cDAHCQdU|)Nt`xmmOoLb42RR4cn^#8!S z4x|_a{kIMB)D2=!!hw+7^jXc~LNyhB?H}4j-gIe3WpvTat{nCR3qR`G%nE4PmWm59 z3EBUowL(LU`2JBf#7l~Iv1UaqiY;kp7qjZqmu~QJO zt21~Q^dl7AUXnE4vo2#(B2|AP;5b`eFP{gTTXsYX(zaFqk~j1W(KOvTlKB2Y$~0TP zb@HgzZ@aP#Q2>%}5`%_@zistl;5`*DYHpr6q-_yzpx^Omu}?!g4gAZjXzIb}f~A9$ zceJv27>(=~K#Xb@4`+8q=bP=vLw_EIo`&_P+nPl**VW{3Tz^0Jl96?H7lq0p5zZZ3 zynn`Lbn{Lfj|c~b*WLMdP@rC-eE%wF2BAucNbq6VEqQhNXexo;IY&DN-TA_Hr~UB9 zjBX;;t;Bb9r$^)*3?vauwg(itNE9w`s|nIDF?RyP0pVVv;$%u>yTGcfR^}{kBi_v4 zl>flQ^TgvJhn$J@4;3J91{D5;G!IWqfVFvaI)ipQ03p+E9h*Uv^0LkJ%ewl#+xkwv z3ifFSOT;>q?a;ZIFZzciq!|Kvqjt(Ob8|YaypVUInFxcA;9N`OkK=_~i)V%xT?Dyv zdov_@3G`ChJud-zBIXbW2YmniMS{|Sf#N&&3HJCtGY84-@^$$pn#cZdJfyGE^BM7r zZ5nKde%q#~#h4+a+?J}0$TL8qhrF=%{1VD*Rfdh)mNnlN{0eH^Y1Ojcz*Knppei-e z_2Gj?JI2apz9}>vF9rBw>arWsM6HM+B%dx!9ZCFo6!D!vc`qhVS~Ypp0$0fgvuZ#k zT5p_HEYtN}v=`qYHd*t?R6?eV$<35*?I zNroAlzN93F?B&mzfwxJtqTw4tI;`?LYq7`?d>$3l5&LjsW+}>!KJ5XCHt}?EO0sTy zbRaj-T4^W=34a$fV8Lvbc@3hcd&oA+=8dtaCXU6&z()SuC?}A{;;RkHa06-R5d9g* zm#^R)8E~}-?vYg*29l4qQJUtD`6C!rz!$<_rxkmlw3EKhx8B_7SDTFiD%xZu71m{! z8!)e>^^@%I^QCn^cre%E@(x^SX`g6zL8<+Ywg+1`}E!HJ8b$)NAbpe-7_kwSjq8@i{^gf8k@*P~Q1(zfi zMnJ=`M*0|tqJL=)7fM1Bn{k1us})h)|NjB!y_#;i#4dcb#k-(i_-Wn(#P_hE!osJ& z4c~*sdpq3VA(({lql@d7(Z_4PPi^7xF6V{-EEzk`|&P_^G ztuEAD{kt-H1-$h0ztg0=CZxCt%@gvco633Eb%0~jRpjYz5LS*K8FM^!cTZd33!nIe zzi;F1g6(FPc-%(3qrBeX1dWK1V--(9TH@PlF}<$C{phrn7m2)VdR>vQ zkHx~{yDp0#%LuK$_j275pXqw8wrqvlOR|kvu@Jdl5L7Bt>XAF?jS)_d|EYNKftIQj z)f(z}ZfbAE;I=q;b-OvE9NgW(IZCn)!>15j?3M=m1w3&Sit`Dxe{_Y9{GL0GqMmsf zNmhy&Y*SfP^}b6rL#?++Dok~+eqOtZNo4aH@n^GK8x><;2TB^l;sB12^*y>2mhRLh;nw5N!w z16WToksZ-CNAc;~z9!d5LdqNla|gj*wSD^;vgEQ(g8elVw*O?WQ)Bt}am2*@&VGgi#J>YMdafxn;*L9B`<m)s2=22#9W z%>PMxq*^xvUHPVc9EZn&F&DgLi0_-J4{IsoJ}@0~apIm6S!lW`E}84yJa5&1!4ltB zVE4?=wrAd`6F*6ezg1>=Uo)Oy;}2EQ%?lxu(nOE6=oMA+kh<&>(nrnbyg(ig^<}a? z!)Jium`v^WyJQA4(h2g^_{;fK_U#)Fp{;dbX?M`y}aXY=<(s>1Q9ruoJPhxR$e$0K$ok2pgg zr`>b9z$XkVj}=^k!S|&1@@X;@U*vh`ZFG(+e%kQHDuPoE*XFJtQB!y(1|_cFa$}F;_Q)MYVE#)LW37UcGdhK^DjNug z`odLX;l5&Wfctvd%sJQNOQRv;;}qu4G7M`B|1GECL~U5vX%$)<3?Oxsz~W1ON>7Ai z42OujkoOa*8`*aB#2SN8Lh_|~nZvp@ATZ*EHh*^;EZA`9{hzdW=68nMi^kwWPhXdB za(ld#(o(N~q{l%Yv4Hg6n|F1nn sYTC6v=f|y)DpfPa16*@bJDfK>Z`umJ?;HU%)$~-Wm2D&b2TM958~^|S literal 0 HcmV?d00001 diff --git a/docs/src/theme/DocCard/index.js b/docs/src/theme/DocCard/index.js index 2246ef3c1..b0723058b 100644 --- a/docs/src/theme/DocCard/index.js +++ b/docs/src/theme/DocCard/index.js @@ -45,6 +45,7 @@ import gpu from './assets/gpu.png'; import mistral from './assets/mistral.png'; import lm from './assets/lm.png'; import ollama from './assets/ollama.png'; +import logsError from './assets/logs-error.png'; function CardContainer({href, children}) { return ( @@ -166,7 +167,7 @@ function CardLink({item}) { Logo ) : (item.label === "Broken Build") ? ( Logo - ) : (item.label === "Jan not using GPU") ? ( + ) : (item.label === "Troubleshooting NVIDIA GPU") ? ( Logo ) : (item.label === "Mistral AI") ? ( Logo @@ -174,10 +175,15 @@ function CardLink({item}) { Logo ) : (item.label === "Ollama") ? ( Logo + ) : (item.label === "How to Get Error Logs") ? ( + Logo ) : ( // If not "Customize Engine Settings", use default icon '📄️' - ); + ); + + + const doc = useDocById(item.docId ?? undefined); return ( Date: Wed, 6 Mar 2024 13:57:53 +0700 Subject: [PATCH 028/131] docs: update manual import slug --- docs/docs/guides/models/import-models.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/guides/models/import-models.mdx b/docs/docs/guides/models/import-models.mdx index ab992b0ef..116c63fb7 100644 --- a/docs/docs/guides/models/import-models.mdx +++ b/docs/docs/guides/models/import-models.mdx @@ -1,5 +1,6 @@ --- title: Manual Import +slug: /guides/using-models/import-manually/ sidebar_position: 3 description: A step-by-step guide on how to perform manual import feature. keywords: From 7e2f1d9adab2d167f87688cde1abf10ac465e2bc Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Wed, 6 Mar 2024 13:58:12 +0700 Subject: [PATCH 029/131] docs: update the content for thread and best practices --- docs/docs/guides/best-practices.mdx | 12 ++++++------ docs/docs/guides/thread.mdx | 29 ++++++++--------------------- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/docs/docs/guides/best-practices.mdx b/docs/docs/guides/best-practices.mdx index c3cdacb69..9dabef8dc 100644 --- a/docs/docs/guides/best-practices.mdx +++ b/docs/docs/guides/best-practices.mdx @@ -23,26 +23,26 @@ Jan is a versatile platform offering solutions for integrating AI locally across The [quickstart guide](quickstart.mdx) is designed to facilitate a quick setup process. It provides a clear instruction and simple steps to get you up and running with Jan.ai quickly. Even, if you are inexperienced in AI, the quickstart can offer valuable insights and tips to help you get started quickly. ## Setting up the Right Models -Jan offers a range of pre-configured AI models that is tailored to different tasks and industries. You should indentify which on that aligns with your objectives. There are model's factors to be considered: +Jan offers a range of pre-configured AI models that are tailored to different tasks and industries. You should identify which on that aligns with your objectives. There are factors to be considered: - Capabilities - Accuracy - Processing Speed :::note -Some of these factors also depends on your hardware, please see [Hardware Requirement](hardware-requiement.mdx). +- Some of these factors also depend on your hardware, please see Hardware Requirement. +- Choosing the right model is important to achieve the best performance. ::: -Choosing the right model is important to achieve the best performance. ## Setting up Jan Ensure that you familiarize yourself with the Jan application. Jan offers advanced settings that you can adjust. These settings may influence how your AI behaves locally. Please see the [Advanced Settings](./advanced-settings/advanced-settings.mdx) article for a complete list of Jan's configurations and instructions on how to configure them. ## Integrations -One of Jan.ai key features is its ability to integrate with many FileSystemWritableFileStream. Whether you are incorporating Jan.ai with any open-source LLM provider or other WebTransportBidirectionalStream, it is important to understand the integration capabilities and limitations. +One of Jan's key features is its ability to integrate with many systems. Whether you are incorporating Jan.ai with any open-source LLM provider or other tools, it is important to understand the integration capabilities and limitations. ## Mastering the Prompt Engineering -Prompt engineering is an important aspect when dealing with AI models to generate the desired outputs. Mastering this skill can significantly enhance the performance and the responses of the AI. Below are some tips that you can do for promptengineering: +Prompt engineering is an important aspect when dealing with AI models to generate the desired outputs. Mastering this skill can significantly enhance the performance and the responses of the AI. Below are some tips that you can do for prompt engineering: - Ask the model to adopt a persona - Be specific and details get a more specific answers - Provide examples or preference text or context at the beginning - Use a clear and concise language -- Use a certain keywords and phrases +- Use certain keywords and phrases diff --git a/docs/docs/guides/thread.mdx b/docs/docs/guides/thread.mdx index e9cf89932..fdd8fb603 100644 --- a/docs/docs/guides/thread.mdx +++ b/docs/docs/guides/thread.mdx @@ -5,58 +5,45 @@ hide_table_of_contents: true description: Manage your interaction with AI locally. --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; Jan provides a straightforward and private solution for managing your threads with AI on your own device. As you interact with AI using Jan, you'll accumulate a history of threads. Jan offers easy tools to organize, delete, or review your past threads with AI. This guide will show you how to keep your threads private and well-organized. - - ### View Thread History - To view your threads history, follow the steps below: + To view your thread history, follow the steps below: 1. Navigate to the main dashboard. 2. Locate the list of threads screen on the left side. 3. To view a specific thread, simply choose the one you're interested in and then scroll up or down to explore the entire conversation. - - - ### Manage the Threads via Folder - To manage your threads history and configurations, follow the steps below: + ### Manage Thread via Jan Data Folder + To manage your thread history and configurations, follow the steps below: 1. Navigate to the Thread that you want to manage via the list of threads on the left side of the dashboard. - 2. Click on the **three dots (⋮)** on the Thread section. + 2. Click on the **three dots (⋮)** in the Thread section. 3. There are two available options to select: - **Reveal in Finder**: Opens the folder containing the thread history and configurations. - **View as JSON**: Opens the thread.json file in your default browser. - - - ### Clean Threads History To clean all the messages from a thread, follow the steps below: 1. Navigate to the Thread that you want to clean. - 2. Click on the **three dots (⋮)** on the Thread section. + 2. Click on the **three dots (⋮)** in the Thread section. 3. Sleect the **Clean Thread** button. :::note -This will delete all messages in the thread, while keeping the thread settings. +This will delete all messages in the thread while keeping the thread settings. ::: - - + ### Delete Threads History To delete a thread, follow the steps below: 1. Navigate to the Thread that you want to delete. - 2. Click on the **three dots (⋮)** on the Thread section. + 2. Click on the **three dots (⋮)** in the Thread section. 3. Sleect the **Delete Thread** button. :::note This will delete all messages and the thread settings. ::: - - - \ No newline at end of file From 7556430693459acd8f6309c40d03f91af50a2251 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 6 Mar 2024 16:15:46 +0700 Subject: [PATCH 030/131] fix: should not attach error messages to the completion request (#2258) --- .../src/helpers/sse.ts | 2 +- .../inference-openai-extension/src/index.ts | 2 +- .../src/index.ts | 2 +- web/helpers/atoms/ChatMessage.atom.ts | 5 ++++- web/hooks/useSendChatMessage.ts | 6 ++++-- web/screens/Chat/ErrorMessage/index.tsx | 5 ++++- web/screens/Chat/MessageToolbar/index.tsx | 5 ++++- .../DataFolder/ModalErrorSetDestGlobal.tsx | 2 +- web/utils/errorMessage.ts | 18 +++++++++++------- 9 files changed, 31 insertions(+), 16 deletions(-) diff --git a/extensions/inference-openai-extension/src/helpers/sse.ts b/extensions/inference-openai-extension/src/helpers/sse.ts index 23528912d..bee2e65bc 100644 --- a/extensions/inference-openai-extension/src/helpers/sse.ts +++ b/extensions/inference-openai-extension/src/helpers/sse.ts @@ -43,7 +43,7 @@ export function requestInference( if (!response.ok) { const data = await response.json() const error = { - message: data.error?.message ?? 'Error occurred.', + message: data.error?.message ?? 'An error occurred.', code: data.error?.code ?? ErrorCode.Unknown, } subscriber.error(error) diff --git a/extensions/inference-openai-extension/src/index.ts b/extensions/inference-openai-extension/src/index.ts index 8fbba0ea3..e617b81e5 100644 --- a/extensions/inference-openai-extension/src/index.ts +++ b/extensions/inference-openai-extension/src/index.ts @@ -210,7 +210,7 @@ export default class JanInferenceOpenAIExtension extends BaseExtension { const messageContent: ThreadContent = { type: ContentType.Text, text: { - value: 'Error occurred: ' + err.message, + value: 'An error occurred. ' + err.message, annotations: [], }, } diff --git a/extensions/inference-triton-trtllm-extension/src/index.ts b/extensions/inference-triton-trtllm-extension/src/index.ts index f009a81e0..2ba23d6cb 100644 --- a/extensions/inference-triton-trtllm-extension/src/index.ts +++ b/extensions/inference-triton-trtllm-extension/src/index.ts @@ -205,7 +205,7 @@ export default class JanInferenceTritonTrtLLMExtension extends BaseExtension { const messageContent: ThreadContent = { type: ContentType.Text, text: { - value: 'Error occurred: ' + err.message, + value: 'An error occurred. ' + err.message, annotations: [], }, } diff --git a/web/helpers/atoms/ChatMessage.atom.ts b/web/helpers/atoms/ChatMessage.atom.ts index 0061eca7c..d092dd89c 100644 --- a/web/helpers/atoms/ChatMessage.atom.ts +++ b/web/helpers/atoms/ChatMessage.atom.ts @@ -110,7 +110,10 @@ export const deleteMessageAtom = atom(null, (get, set, id: string) => { } const threadId = get(getActiveThreadIdAtom) if (threadId) { - newData[threadId] = newData[threadId].filter((e) => e.id !== id) + // Should also delete error messages to clear out the error state + newData[threadId] = newData[threadId].filter( + (e) => e.id !== id && e.status !== MessageStatus.Error + ) set(chatMessages, newData) } }) diff --git a/web/hooks/useSendChatMessage.ts b/web/hooks/useSendChatMessage.ts index 9b3664203..09c64a0f1 100644 --- a/web/hooks/useSendChatMessage.ts +++ b/web/hooks/useSendChatMessage.ts @@ -109,8 +109,9 @@ export default function useSendChatMessage() { currentMessages .filter( (e) => - currentMessage.role === ChatCompletionRole.User || - e.id !== currentMessage.id + (currentMessage.role === ChatCompletionRole.User || + e.id !== currentMessage.id) && + e.status !== MessageStatus.Error ) .map((msg) => ({ role: msg.role, @@ -198,6 +199,7 @@ export default function useSendChatMessage() { }) .concat( currentMessages + .filter((e) => e.status !== MessageStatus.Error) .map((msg) => ({ role: msg.role, content: msg.content[0]?.text.value ?? '', diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx index b1439597f..25cec1cb9 100644 --- a/web/screens/Chat/ErrorMessage/index.tsx +++ b/web/screens/Chat/ErrorMessage/index.tsx @@ -27,7 +27,10 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { resendChatMessage(message) } - const errorTitle = getErrorTitle(message.error_code ?? ErrorCode.Unknown) + const errorTitle = getErrorTitle( + message.error_code ?? ErrorCode.Unknown, + message.content[0]?.text?.value + ) return (
    diff --git a/web/screens/Chat/MessageToolbar/index.tsx b/web/screens/Chat/MessageToolbar/index.tsx index e5d81475e..9c62c5d2f 100644 --- a/web/screens/Chat/MessageToolbar/index.tsx +++ b/web/screens/Chat/MessageToolbar/index.tsx @@ -39,11 +39,14 @@ const MessageToolbar = ({ message }: { message: ThreadMessage }) => { const onDeleteClick = async () => { deleteMessage(message.id ?? '') if (thread) { + // Should also delete error messages to clear out the error state await extensionManager .get(ExtensionTypeEnum.Conversational) ?.writeMessages( thread.id, - messages.filter((msg) => msg.id !== message.id) + messages.filter( + (msg) => msg.id !== message.id && msg.status !== MessageStatus.Error + ) ) } } diff --git a/web/screens/Settings/Advanced/DataFolder/ModalErrorSetDestGlobal.tsx b/web/screens/Settings/Advanced/DataFolder/ModalErrorSetDestGlobal.tsx index 84646e735..16dc60578 100644 --- a/web/screens/Settings/Advanced/DataFolder/ModalErrorSetDestGlobal.tsx +++ b/web/screens/Settings/Advanced/DataFolder/ModalErrorSetDestGlobal.tsx @@ -21,7 +21,7 @@ const ModalErrorSetDestGlobal = () => { - Error Occurred + An Error Occurred

    Oops! Something went wrong. Jan data folder remains the same. Please diff --git a/web/utils/errorMessage.ts b/web/utils/errorMessage.ts index 3af75e787..3fce6c7f3 100644 --- a/web/utils/errorMessage.ts +++ b/web/utils/errorMessage.ts @@ -1,11 +1,15 @@ import { ErrorCode } from '@janhq/core' -export const getErrorTitle = (errorCode: ErrorCode) => { - if (errorCode === ErrorCode.Unknown) { - return 'Apologies, something’s amiss!' - } - - if (errorCode === ErrorCode.InvalidApiKey) { - return 'Invalid API key. Please check your API key and try again.' +export const getErrorTitle = ( + errorCode: ErrorCode, + errorMessage: string | undefined +) => { + switch (errorCode) { + case ErrorCode.Unknown: + return 'Apologies, something’s amiss!' + case ErrorCode.InvalidApiKey: + return 'Invalid API key. Please check your API key and try again.' + default: + return errorMessage } } From 84414479e4a9efd1d0ca3b3f2356c448218fede6 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Wed, 6 Mar 2024 20:12:46 +0700 Subject: [PATCH 031/131] docs: fix the broken link -> redirect to the right paths --- docs/docusaurus.config.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 9adc71bda..cd6078327 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -74,6 +74,38 @@ const config = { from: "/guides/troubleshooting/gpu-not-used/", to: "/guides/common-error/not-using-gpu/", }, + { + from: "/guides/troubleshooting/", + to: "/guides/error-codes/", + }, + { + from: "/troubleshooting/stuck-on-broken-build/", + to: "/guides/common-error/broken-build/", + }, + { + from: "/guides/troubleshooting/", + to: "/guides/error-codes/", + }, + { + from: "/troubleshooting/somethings-amiss/", + to: "/guides/error-codes/something-amiss/", + }, + { + from: "/troubleshooting/how-to-get-error-logs/", + to: "/guides/error-codes/how-to-get-error-logs/", + }, + { + from: "/troubleshooting/permission-denied/", + to: "/guides/error-codes/permission-denied/", + }, + { + from: "/troubleshooting/unexpected-token/", + to: "/guides/error-codes/unexpected-token/", + }, + { + from: "/troubleshooting/undefined-issue/", + to: "/guides/error-codes/undefined-issue/", + }, ], }, ], From b950518e4d0154e13c4d9b1f97f5b80fb73bed2d Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Wed, 6 Mar 2024 20:14:01 +0700 Subject: [PATCH 032/131] docs: fix the slug for changelog --- docs/docs/releases/changelog/changelog-v0.2.0.mdx | 1 + docs/docs/releases/changelog/changelog-v0.2.1.mdx | 1 + docs/docs/releases/changelog/changelog-v0.2.2.mdx | 1 + docs/docs/releases/changelog/changelog-v0.2.3.mdx | 1 + docs/docs/releases/changelog/changelog-v0.3.0.mdx | 1 + docs/docs/releases/changelog/changelog-v0.3.1.mdx | 1 + docs/docs/releases/changelog/changelog-v0.3.2.mdx | 1 + docs/docs/releases/changelog/changelog-v0.3.3.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.0.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.1.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.2.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.3.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.4.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.5.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.6.mdx | 1 + docs/docs/releases/changelog/changelog-v0.4.7.mdx | 1 + 16 files changed, 16 insertions(+) diff --git a/docs/docs/releases/changelog/changelog-v0.2.0.mdx b/docs/docs/releases/changelog/changelog-v0.2.0.mdx index 2bda6b5a7..2115095ca 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.0.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 16 +slug: /changelog/changelog-v0.2.0 --- # v0.2.0 diff --git a/docs/docs/releases/changelog/changelog-v0.2.1.mdx b/docs/docs/releases/changelog/changelog-v0.2.1.mdx index 2f2cb5aad..5afc5999b 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.1.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 15 +slug: /changelog/changelog-v0.2.1 --- # v0.2.1 diff --git a/docs/docs/releases/changelog/changelog-v0.2.2.mdx b/docs/docs/releases/changelog/changelog-v0.2.2.mdx index 2702b420f..54a317bff 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.2.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 14 +slug: /changelog/changelog-v0.2.2 --- # v0.2.2 diff --git a/docs/docs/releases/changelog/changelog-v0.2.3.mdx b/docs/docs/releases/changelog/changelog-v0.2.3.mdx index 9b3b1f872..20ae6e077 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.3.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 13 +slug: /changelog/changelog-v0.2.3 --- # v0.2.3 diff --git a/docs/docs/releases/changelog/changelog-v0.3.0.mdx b/docs/docs/releases/changelog/changelog-v0.3.0.mdx index 82f921e35..5c0d94400 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.0.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 12 +slug: /changelog/changelog-v0.3.0 --- # v0.3.0 diff --git a/docs/docs/releases/changelog/changelog-v0.3.1.mdx b/docs/docs/releases/changelog/changelog-v0.3.1.mdx index 203bc9c9b..c636db7c8 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.1.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 11 +slug: /changelog/changelog-v0.3.1 --- # v0.3.1 diff --git a/docs/docs/releases/changelog/changelog-v0.3.2.mdx b/docs/docs/releases/changelog/changelog-v0.3.2.mdx index fb04861a9..01e403ef9 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.2.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 10 +slug: /changelog/changelog-v0.3.2 --- # v0.3.2 diff --git a/docs/docs/releases/changelog/changelog-v0.3.3.mdx b/docs/docs/releases/changelog/changelog-v0.3.3.mdx index 23d8bb9e3..9d8e75076 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.3.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 9 +slug: /changelog/changelog-v0.3.3 --- # v0.3.3 diff --git a/docs/docs/releases/changelog/changelog-v0.4.0.mdx b/docs/docs/releases/changelog/changelog-v0.4.0.mdx index b473ef082..3afa7849e 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.0.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 8 +slug: /changelog/changelog-v0.4.0 --- # v0.4.0 diff --git a/docs/docs/releases/changelog/changelog-v0.4.1.mdx b/docs/docs/releases/changelog/changelog-v0.4.1.mdx index a49b3b87c..79731a654 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.1.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 7 +slug: /changelog/changelog-v0.4.0 --- # v0.4.1 diff --git a/docs/docs/releases/changelog/changelog-v0.4.2.mdx b/docs/docs/releases/changelog/changelog-v0.4.2.mdx index 76ba8ab0d..4b64ca7f4 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.2.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 6 +slug: /changelog/changelog-v0.4.2 --- # v0.4.2 diff --git a/docs/docs/releases/changelog/changelog-v0.4.3.mdx b/docs/docs/releases/changelog/changelog-v0.4.3.mdx index 054b6595d..2426f6280 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.3.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 5 +slug: /changelog/changelog-v0.4.3 --- # v0.4.3 diff --git a/docs/docs/releases/changelog/changelog-v0.4.4.mdx b/docs/docs/releases/changelog/changelog-v0.4.4.mdx index c941f41d4..f61e35c44 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.4.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.4.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 4 +slug: /changelog/changelog-v0.4.4 --- # v0.4.4 diff --git a/docs/docs/releases/changelog/changelog-v0.4.5.mdx b/docs/docs/releases/changelog/changelog-v0.4.5.mdx index df5c650e8..d2e1d245b 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.5.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.5.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 3 +slug: /changelog/changelog-v0.4.5 --- # v0.4.5 diff --git a/docs/docs/releases/changelog/changelog-v0.4.6.mdx b/docs/docs/releases/changelog/changelog-v0.4.6.mdx index 5e8fefdcd..37bc2d493 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.6.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.6.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 2 +slug: /changelog/changelog-v0.4.6 --- # v0.4.6 diff --git a/docs/docs/releases/changelog/changelog-v0.4.7.mdx b/docs/docs/releases/changelog/changelog-v0.4.7.mdx index a65a60e92..7e7942096 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.7.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.7.mdx @@ -1,5 +1,6 @@ --- sidebar_position: 1 +slug: /changelog/changelog-v0.4.7 --- # v0.4.7 From 2677ef4a155f51376ac7bebd78d6ccfeffd0964d Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Wed, 6 Mar 2024 20:15:44 +0700 Subject: [PATCH 033/131] docs: fix the changelog v0.4.1 --- docs/docs/releases/changelog/changelog-v0.4.1.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/releases/changelog/changelog-v0.4.1.mdx b/docs/docs/releases/changelog/changelog-v0.4.1.mdx index 79731a654..10cf4308a 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.1.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 7 -slug: /changelog/changelog-v0.4.0 +slug: /changelog/changelog-v0.4.1 --- # v0.4.1 From 610a384af8c29ee2c4ad07c2a9353a4ca0b1b14b Mon Sep 17 00:00:00 2001 From: Hoang Ha <64120343+hahuyhoang411@users.noreply.github.com> Date: Wed, 6 Mar 2024 21:28:05 +0700 Subject: [PATCH 034/131] Chore: Update new models to model hub (#2192) * add: qwen 7B * add: gemma 7B * add: qwen prompt tempalte * fix: prompt template gemma 7b * add: gemma 2b * fix: correct id gemma 2b * chore: fix noromaid model size --- models/gemma-2b/model.json | 34 ++++++++++++++++++++++++++++++++++ models/gemma-7b/model.json | 34 ++++++++++++++++++++++++++++++++++ models/noromaid-7b/model.json | 2 +- models/qwen-7b/model.json | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 models/gemma-2b/model.json create mode 100644 models/gemma-7b/model.json create mode 100644 models/qwen-7b/model.json diff --git a/models/gemma-2b/model.json b/models/gemma-2b/model.json new file mode 100644 index 000000000..e07b2d677 --- /dev/null +++ b/models/gemma-2b/model.json @@ -0,0 +1,34 @@ +{ + "sources": [ + { + "filename": "gemma-2b-it-q4_k_m.gguf", + "url": "https://huggingface.co/lmstudio-ai/gemma-2b-it-GGUF/resolve/main/gemma-2b-it-q4_k_m.gguf" + } + ], + "id": "gemma-2b", + "object": "model", + "name": "Gemma 2B Q4", + "version": "1.0", + "description": "Gemma is built from the same technology with Google's Gemini.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "user\n{prompt}\nmodel", + "llama_model_path": "gemma-2b-it-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": "Google", + "tags": ["2B", "Finetuned"], + "size": 1500000000 + }, + "engine": "nitro" +} diff --git a/models/gemma-7b/model.json b/models/gemma-7b/model.json new file mode 100644 index 000000000..3c1911fda --- /dev/null +++ b/models/gemma-7b/model.json @@ -0,0 +1,34 @@ +{ + "sources": [ + { + "filename": "gemma-7b-it-q4_K_M.gguf", + "url": "https://huggingface.co/mmnga/gemma-7b-it-gguf/resolve/main/gemma-7b-it-q4_K_M.gguf" + } + ], + "id": "gemma-7b", + "object": "model", + "name": "Gemma 7B Q4", + "version": "1.0", + "description": "Gemma is built from the same technology with Google's Gemini.", + "format": "gguf", + "settings": { + "ctx_len": 4096, + "prompt_template": "user\n{prompt}\nmodel", + "llama_model_path": "gemma-7b-it-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": "Google", + "tags": ["7B", "Finetuned"], + "size": 5330000000 + }, + "engine": "nitro" +} diff --git a/models/noromaid-7b/model.json b/models/noromaid-7b/model.json index 78d579a64..1daaa361b 100644 --- a/models/noromaid-7b/model.json +++ b/models/noromaid-7b/model.json @@ -28,7 +28,7 @@ "metadata": { "author": "NeverSleep", "tags": ["7B", "Merged"], - "size": 4370000000 + "size": 5130000000 }, "engine": "nitro" } diff --git a/models/qwen-7b/model.json b/models/qwen-7b/model.json new file mode 100644 index 000000000..16def5b29 --- /dev/null +++ b/models/qwen-7b/model.json @@ -0,0 +1,34 @@ +{ + "sources": [ + { + "filename": "qwen1_5-7b-chat-q4_k_m.gguf", + "url": "https://huggingface.co/Qwen/Qwen1.5-7B-Chat-GGUF/resolve/main/qwen1_5-7b-chat-q4_k_m.gguf" + } + ], + "id": "qwen-7b", + "object": "model", + "name": "Qwen Chat 7B Q4", + "version": "1.0", + "description": "Qwen is optimized at Chinese, ideal for everyday 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": "qwen1_5-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": "Alibaba", + "tags": ["7B", "Finetuned"], + "size": 4770000000 + }, + "engine": "nitro" +} From e2d42aa98419ef12998f769f16e9aeea787d8c79 Mon Sep 17 00:00:00 2001 From: Service Account Date: Wed, 6 Mar 2024 14:43:09 +0000 Subject: [PATCH 035/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ebb3c4f3f..91a8f6a53 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 From b4f6e2724be185b056252fcdf54fc2d89a4f0821 Mon Sep 17 00:00:00 2001 From: Service Account Date: Wed, 6 Mar 2024 15:36:45 +0000 Subject: [PATCH 036/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 91a8f6a53..748470924 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 From 49ad85584318145ccba760f4ea89d6a1ea612fee Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 7 Mar 2024 09:36:42 +0700 Subject: [PATCH 037/131] feat: prompt user to download an update manually (#2261) --- electron/handlers/update.ts | 5 +- .../BottomBar/UpdateFailedModal/index.tsx | 69 +++++++++++++++++++ web/containers/Layout/BottomBar/index.tsx | 2 + .../Providers/AppUpdateListener.tsx | 11 ++- web/containers/Providers/Jotai.tsx | 1 + 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx diff --git a/electron/handlers/update.ts b/electron/handlers/update.ts index 0d8cc4cc0..c8e28e580 100644 --- a/electron/handlers/update.ts +++ b/electron/handlers/update.ts @@ -3,6 +3,8 @@ import { WindowManager } from './../managers/window' import { autoUpdater } from 'electron-updater' import { AppEvent } from '@janhq/core' +export let waitingToInstallVersion: string | undefined = undefined + export function handleAppUpdates() { /* Should not check for update during development */ if (!app.isPackaged) { @@ -29,6 +31,7 @@ export function handleAppUpdates() { buttons: ['Restart', 'Later'], }) if (action.response === 0) { + waitingToInstallVersion = _info?.version autoUpdater.quitAndInstall() } }) @@ -37,7 +40,7 @@ export function handleAppUpdates() { autoUpdater.on('error', (info: any) => { WindowManager.instance.currentWindow?.webContents.send( AppEvent.onAppUpdateDownloadError, - info + { failedToInstallVersion: waitingToInstallVersion, info } ) }) diff --git a/web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx b/web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx new file mode 100644 index 000000000..f82fc0ee2 --- /dev/null +++ b/web/containers/Layout/BottomBar/UpdateFailedModal/index.tsx @@ -0,0 +1,69 @@ +import React from 'react' + +import { + Modal, + ModalPortal, + ModalContent, + ModalHeader, + ModalTitle, + ModalFooter, + ModalClose, + Button, +} from '@janhq/uikit' +import { Share2Icon } from '@radix-ui/react-icons' +import { useAtom } from 'jotai' + +import { updateVersionError } from '@/containers/Providers/Jotai' + +const UpdatedFailedModal = () => { + const [error, setError] = useAtom(updateVersionError) + + return ( + setError(undefined)}> + + + + Unable to Install Update + +

    + An error occurred while installing Jan{' '} + {error}. We + appreciate your help with{' '} + + manual downloading and installation. + +

    + +
    + setError(undefined)}> + + + { + window.open('https://github.com/janhq/jan#download', '_blank') + setError(undefined) + }} + > + + +
    +
    +
    + + ) +} + +export default UpdatedFailedModal diff --git a/web/containers/Layout/BottomBar/index.tsx b/web/containers/Layout/BottomBar/index.tsx index 66c089744..2373ac3d4 100644 --- a/web/containers/Layout/BottomBar/index.tsx +++ b/web/containers/Layout/BottomBar/index.tsx @@ -17,6 +17,7 @@ import { appDownloadProgress } from '@/containers/Providers/Jotai' import ImportingModelState from './ImportingModelState' import SystemMonitor from './SystemMonitor' +import UpdatedFailedModal from './UpdateFailedModal' const menuLinks = [ { @@ -44,6 +45,7 @@ const BottomBar = () => {
    +
    diff --git a/web/containers/Providers/AppUpdateListener.tsx b/web/containers/Providers/AppUpdateListener.tsx index dceb4df13..542886ee5 100644 --- a/web/containers/Providers/AppUpdateListener.tsx +++ b/web/containers/Providers/AppUpdateListener.tsx @@ -3,10 +3,11 @@ import { Fragment, PropsWithChildren, useEffect } from 'react' import { useSetAtom } from 'jotai' -import { appDownloadProgress } from './Jotai' +import { appDownloadProgress, updateVersionError } from './Jotai' const AppUpdateListener = ({ children }: PropsWithChildren) => { const setProgress = useSetAtom(appDownloadProgress) + const setUpdateVersionError = useSetAtom(updateVersionError) useEffect(() => { if (window && window.electronAPI) { @@ -18,9 +19,13 @@ const AppUpdateListener = ({ children }: PropsWithChildren) => { ) window.electronAPI.onAppUpdateDownloadError( - (_event: string, callback: any) => { - console.error('Download error', callback) + (_event: string, error: any) => { + console.error('Download error: ', error) setProgress(-1) + + // Can not install update + // Prompt user to download the update manually + setUpdateVersionError(error.failedToInstallVersion) } ) diff --git a/web/containers/Providers/Jotai.tsx b/web/containers/Providers/Jotai.tsx index 5907ac746..c43786c89 100644 --- a/web/containers/Providers/Jotai.tsx +++ b/web/containers/Providers/Jotai.tsx @@ -12,6 +12,7 @@ export const editPromptAtom = atom('') export const currentPromptAtom = atom('') export const fileUploadAtom = atom([]) export const appDownloadProgress = atom(-1) +export const updateVersionError = atom(undefined) export const searchAtom = atom('') export default function JotaiWrapper({ children }: Props) { From 04077ac493d8228dbb7614db982abe02225f4bbb Mon Sep 17 00:00:00 2001 From: Service Account Date: Thu, 7 Mar 2024 04:48:40 +0000 Subject: [PATCH 038/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 748470924..bc885a39e 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 From 5abe2e1c24d75e5a31754c1f9f2cf73263ec7f0a Mon Sep 17 00:00:00 2001 From: NamH Date: Thu, 7 Mar 2024 12:16:18 +0700 Subject: [PATCH 039/131] chore: temporary remove convert model (#2266) Signed-off-by: James Co-authored-by: James --- web/screens/ExploreModels/index.tsx | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/web/screens/ExploreModels/index.tsx b/web/screens/ExploreModels/index.tsx index 1ad0b00ae..484e62b0e 100644 --- a/web/screens/ExploreModels/index.tsx +++ b/web/screens/ExploreModels/index.tsx @@ -20,7 +20,6 @@ import { setImportModelStageAtom } from '@/hooks/useImportModel' import ExploreModelList from './ExploreModelList' import { HuggingFaceModal } from './HuggingFaceModal' -import { experimentalFeatureEnabledAtom } from '@/helpers/atoms/AppConfig.atom' import { configuredModelsAtom, downloadedModelsAtom, @@ -37,8 +36,6 @@ const ExploreModelsScreen = () => { const [showHuggingFaceModal, setShowHuggingFaceModal] = useState(false) const setImportModelStage = useSetAtom(setImportModelStageAtom) - const experimentalFeature = useAtomValue(experimentalFeatureEnabledAtom) - const filteredModels = configuredModels.filter((x) => { if (sortSelected === 'Downloaded') { return ( @@ -59,10 +56,6 @@ const ExploreModelsScreen = () => { setImportModelStage('SELECTING_MODEL') }, [setImportModelStage]) - const onHuggingFaceConverterClick = () => { - setShowHuggingFaceModal(true) - } - return (
    { Import Model
    - {experimentalFeature && ( + {/* {experimentalFeature && (

    { Convert from Hugging Face

    - )} + )} */}
    From 3ef660b7fe2a044c25d4da9ac4c36a1aff7e53b0 Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Thu, 7 Mar 2024 12:25:30 +0700 Subject: [PATCH 040/131] Add modify notary team in CI (#2265) Co-authored-by: Hien To --- .github/workflows/template-build-macos-arm64.yml | 7 +++++++ .github/workflows/template-build-macos-x64.yml | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/.github/workflows/template-build-macos-arm64.yml b/.github/workflows/template-build-macos-arm64.yml index 54355d55c..2ef40b7c0 100644 --- a/.github/workflows/template-build-macos-arm64.yml +++ b/.github/workflows/template-build-macos-arm64.yml @@ -78,6 +78,10 @@ jobs: jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "bucket": "${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }}", "region": "auto", "endpoint": "https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com", "path": "${{ inputs.cloudflare_r2_path }}", "channel": "latest"}]' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json + + jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json + mv /tmp/package.json electron/package.json + cat electron/package.json - name: Update app version base on tag @@ -91,6 +95,9 @@ jobs: mv /tmp/package.json electron/package.json jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json mv /tmp/package.json web/package.json + jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json + mv /tmp/package.json electron/package.json + cat electron/package.json env: VERSION_TAG: ${{ inputs.new_version }} diff --git a/.github/workflows/template-build-macos-x64.yml b/.github/workflows/template-build-macos-x64.yml index e313c2947..12aad37bd 100644 --- a/.github/workflows/template-build-macos-x64.yml +++ b/.github/workflows/template-build-macos-x64.yml @@ -72,6 +72,10 @@ jobs: jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "bucket": "${{ secrets.CLOUDFLARE_R2_BUCKET_NAME }}", "region": "auto", "endpoint": "https://${{ secrets.CLOUDFLARE_ACCOUNT_ID }}.r2.cloudflarestorage.com", "path": "${{ inputs.cloudflare_r2_path }}", "channel": "latest"}]' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json + + jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json + mv /tmp/package.json electron/package.json + cat electron/package.json - name: Update app version base on tag @@ -85,6 +89,9 @@ jobs: mv /tmp/package.json electron/package.json jq --arg version "${VERSION_TAG#v}" '.version = $version' web/package.json > /tmp/package.json mv /tmp/package.json web/package.json + jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json + mv /tmp/package.json electron/package.json + cat electron/package.json env: VERSION_TAG: ${{ inputs.new_version }} From e70773da918a96d6dad3893b239b47e921b16ebf Mon Sep 17 00:00:00 2001 From: Service Account Date: Thu, 7 Mar 2024 06:29:36 +0000 Subject: [PATCH 041/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bc885a39e..8a4c03098 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 From 61da85234355bb42c220ec0ad000c1589fbde5eb Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:12:44 +0900 Subject: [PATCH 042/131] feat: changeEditUrl --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index cd6078327..79d675c7a 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -123,7 +123,7 @@ const config = { docs: { routeBasePath: "/", sidebarPath: require.resolve("./sidebars.js"), - editUrl: "https://github.com/janhq/jan/tree/main/docs", + editUrl: "https://github.com/janhq/jan/tree/dev/docs", showLastUpdateAuthor: true, showLastUpdateTime: true, }, From f08eacb0779d4d514500d96c36606c7ecec13e69 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Thu, 7 Mar 2024 18:24:25 +0700 Subject: [PATCH 043/131] docs: Add a highlight category for each Menu groups. --- docs/sidebars.js | 74 +++++++++++++++++++++++++++++++++++++++-- docs/src/css/custom.css | 15 +++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/docs/sidebars.js b/docs/sidebars.js index fb14f0abe..dea87cd9e 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -150,10 +150,80 @@ const sidebars = { ], }, ], + // guidesSidebar: [ + // { + // type: "autogenerated", + // dirName: "guides", + // }, + // ], guidesSidebar: [ { - type: "autogenerated", - dirName: "guides", + type: "category", + label: "Get Started", + collapsible: false, + className: "head_Menu", + items: [ + "guides/quickstart", + "guides/install", + "guides/start-server", + "guides/models-list" + ] + }, + { + type: "category", + label: "Guides", + collapsible: false, + className: "head_Menu", + items: [ + "guides/best-practices", + "guides/thread", + "guides/faq", + "guides/hardware-requiement", + ] + }, + { + type: "category", + label: "Advanced Features", + collapsible: false, + className: "head_Menu", + items: [ + "guides/models/README", + "guides/models/customize-engine", + "guides/models/import-models", + "guides/models/integrate-remote", + "guides/extensions/README", + "guides/extensions/import-ext", + "guides/extensions/setup-ext", + "guides/integration/README", + "guides/integration/azure", + "guides/integration/discord", + "guides/integration/groq", + "guides/integration/lmstudio", + "guides/integration/mistral", + "guides/integration/ollama", + "guides/integration/openinterpreter", + "guides/integration/openrouter", + "guides/integration/raycast", + "guides/integration/vscode", + ] + }, + { + type: "category", + label: "Troubleshooting", + collapsible: false, + className: "head_Menu", + items: [ + "guides/common-error/README", + "guides/common-error/broken-build", + "guides/common-error/not-using-gpu", + "guides/error-codes/README", + "guides/error-codes/how-to-get-error-logs", + "guides/error-codes/permission-denied", + "guides/error-codes/something-amiss", + "guides/error-codes/undefined-issue", + "guides/error-codes/unexpected-token", + "guides/faq" + ] }, ], developerSidebar: [ diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 9ed8fd0d8..5307bec2e 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -6,3 +6,18 @@ [data-theme="dark"] .DocSearch { --docsearch-hit-active-color: #090a11; /* Keep the color unchanged */ } + +/* sidebarStyles.css */ +.head_Menu div { + font-weight: bold; + background-color: whitesmoke; + margin-left: 0.7rem; + font-size: larger; +} + +.head_Menu li { + /* Custom styles for the sidebar items */ + font-weight: normal; + background-color: white; + margin-bottom: 5px; /* Adjust margin as needed */ +} \ No newline at end of file From 751c273cde8a5f67a82350e7a79677a9ea052bdd Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Thu, 7 Mar 2024 18:24:56 +0700 Subject: [PATCH 044/131] docs: Add content Groq integration --- docs/docs/guides/integration/groq.mdx | 84 +++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/docs/guides/integration/groq.mdx diff --git a/docs/docs/guides/integration/groq.mdx b/docs/docs/guides/integration/groq.mdx new file mode 100644 index 000000000..a3a12dbc5 --- /dev/null +++ b/docs/docs/guides/integration/groq.mdx @@ -0,0 +1,84 @@ +--- +title: Groq +sidebar_position: 10 +slug: /guides/integration/groq +description: Learn how to integrate Groq API with Jan for enhanced functionality. +keywords: + [ + Groq API, + Jan, + Jan AI, + ChatGPT alternative, + conversational AI, + large language model, + integration, + Groq integration, + API integration + ] +--- + +## How to Integrate Mistral AI with Jan + +This guide provides step-by-step instructions on integrating the Groq API with Jan, enabling users to leverage Groq's capabilities within Jan's conversational interface. + +Before proceeding, ensure you have the following: +- Access to the Jan platform +- Groq API credentials + +## Integration Steps + +### Step 1: Obtain Groq API Credentials + +If you haven't already, sign up for the Groq API and obtain your API credentials. +Obtain Groq API keys from your [Groq Console](https://console.groq.com/keys). + +### Step 2: Configure Jan Settings + +1. Insert the Groq AI API key into `~/jan/engines/openai.json`. + +```json title="~/jan/engines/openai.json" +{ + "full_url": "https://api.groq.com/openai/v1", + "api_key": "" +} +``` + +### Step 3: Enable Groq Integration + +To set up the configuration for Groq in Jan, follow these steps: + +1. Navigate to `~/jan/models`. +2. Create a folder named `groq`. +3. Inside the groq folder, create a model.json file with the specified settings: +```json title="~/jan/models/groq/model.json +{ + "id": "groq", + "object": "model", + "name": "Groq Integration", + "version": "1.0", + "description": "Integration with Groq API for enhanced functionality.", + "format": "api", + "sources": [], + "settings": {}, + "parameters": {}, + "metadata": { + "author": "Your Name", + "tags": ["Groq Integration"] + }, + "engine": "groq" +} +``` + +### Step 4: Start the Model + +1. Restart Jan and navigate to the **Hub**. +2. Locate your model and click the **Use** button. + +## Troubleshooting + +If you encounter any issues during the integration process or while using Groq with Jan, consider the following troubleshooting steps: + +- Double-check your API credentials and ensure they are correctly entered. +- Verify that the Groq integration is enabled within Jan's settings. +- Check for any error messages or logs that may provide insight into the issue. +- Reach out to Groq API support for assistance if needed. \ No newline at end of file From 7d988cc2d9c048049292457910fa16f01d32d9a9 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Thu, 7 Mar 2024 18:25:08 +0700 Subject: [PATCH 045/131] docs: Add FAQs content --- docs/docs/guides/faq.mdx | 80 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/docs/docs/guides/faq.mdx b/docs/docs/guides/faq.mdx index 2a79e9fde..d25b0f980 100644 --- a/docs/docs/guides/faq.mdx +++ b/docs/docs/guides/faq.mdx @@ -17,6 +17,80 @@ keywords: ] --- -:::caution -This is currently under development. -::: \ No newline at end of file +## General Issues + +- **Why can't I download models like Pandora 11B Q4 and Solar Instruct 10.7B Q4?** + - These models might have been removed or taken down. Please check the [Pre-configured Models](models-list.mdx) for the latest updates on model availability. + +- **Why does Jan display "Apologies, something's amiss" when I try to run it?** + - This issue may arise if you're using an older Intel chip that does not fully support AVX instructions required for running AI models. Upgrading your hardware may resolve this issue. + +- **How can I use Jan in Russia?** + - To use Jan in Russia, a VPN or [HTTPS - Proxy](./advanced-settings/http-proxy.mdx) is recommended to bypass any regional restrictions that might be in place. + +- **I'm experiencing an error on startup from Nitro. What should I do?** + - If you encounter errors with Nitro, try switching the path to use the Nitro executable for the version 12-0. This adjustment can help resolve path-related issues. + +## Download and Installation Issues + +- **What does "Error occurred: Unexpected token" mean?** + - This error usually indicates a problem with your internet connection or that your access to certain resources is being blocked. Using a VPN or [HTTPS - Proxy](./advanced-settings/http-proxy.mdx) can help avoid these issues by providing a secure and unrestricted internet connection. + +- **Why aren't my downloads working?** + - If you're having trouble downloading directly through Jan, you might want to download the model separately and then import it into Jan. Detailed instructions are available on [here](install.mdx). + +- **Jan AI doesn't open on my Mac with an Intel processor. What can I do?** + - Granting the `.npm` folder permission for the user can resolve issues related to permissions on macOS, especially for users with Intel processors. + +- **What should I do if the model download freezes?** + - If a model download freezes, consider importing the models manually. You can find more detailed guidance on how to do this at [Manual Import](./models/import-models.mdx) article. + +- **I received a message that the model GPT4 does not exist or I do not have access. What should I do?** + - This message typically means you need to top up your credit with OpenAI or check your access permissions for the model. + +- **I can't download models from "Explore the Hub." What's the solution?** + - Uninstalling Jan, clearing the cache, and reinstalling it following the guide provided [here](install.mdx) may help. Also, consider downloading the `.gguf` model via a browser as an alternative approach. + +## Technical Issues and Solutions + +- **How can I download models with a socks5 proxy or import a local model file?** + - Nightly builds of Jan offer support for downloading models with socks5 proxies or importing local model files. + +- **My device shows no GPU usage and lacks a Settings folder. What should I do?** + - Using the nightly builds of Jan can address issues related to GPU usage and the absence of a Settings folder, as these builds contain the latest fixes and features. + +- **Why does Jan display a toast message saying a model is loaded when it is not actually loaded?** + - This issue can be resolved by downloading the `.gguf` file from Hugging Face and replacing it in the model folder. This ensures the correct model is loaded. + +- **How to enable CORS when running Nitro?** + - By default, CORS (Cross-Origin Resource Sharing) is disabled when running Nitro. Enabling CORS can be necessary for certain operations and integrations. Check the official documentation for instructions on how to enable CORS if your workflow requires it. + +## Compatibility and Support + +- **How to use GPU AMD for Jan?** + - Jan now supports AMD GPUs through Vulkan. This enhancement allows users with AMD graphics cards to leverage GPU acceleration, improving performance for AI model computations. + +- **Is Jan available for Android or iOS?** + - Jan is primarily focused on the Desktop app and does not currently offer mobile apps for Android or iOS. The development team is concentrating on enhancing the desktop experience. + +## Development and Features + +- **Can I use local files from my computer with Jan?** + - The feature to use local files is currently in development. For more information, please our offical [Discord](https://discord.com/invite/FTk2MvZwJH) for the latest update. + +- **Does Jan support Safetensors?** + - At the moment, Jan only supports GGUF. However, there are plans to support `.safetensor` files in the future. + +- **I hope to customize the installation path of each model. Is that possible?** + - Yes you can customize the installation path. Please see [here](https://github.com/janhq/jan/issues/1010) for more information. + +## Troubleshooting + +- **What should I do if there's high CPU usage while Jan is idle?** + - If you notice high CPU usage while Jan is idle, consider using the nightly builds of Jan + +- **What does the error "Failed to fetch" mean, and how can I fix it?** + - The "Failed to fetch" error typically occurs due to network issues or restrictions. Using the nightly builds of Jan may help overcome these issues by providing updated fixes and features. + +- **What should I do if "Failed to fetch" occurs using MacBook Pro with Intel HD Graphics 4000 1536 MB?** + - Ensure that the model size is less than 90% of your available VRAM and that the VRAM is accessible to the app. Managing the resources effectively can help mitigate this issue. From ca90b008c10d3ce3b78befe1aeeb662df7e1b1f8 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Thu, 7 Mar 2024 18:50:30 +0700 Subject: [PATCH 046/131] docs: fix the sidebar issues --- docs/sidebars.js | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/sidebars.js b/docs/sidebars.js index dea87cd9e..61bd85439 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -178,7 +178,6 @@ const sidebars = { "guides/best-practices", "guides/thread", "guides/faq", - "guides/hardware-requiement", ] }, { From d07c3deac4f19447c404024604adc229d93d8d44 Mon Sep 17 00:00:00 2001 From: eckartal <159995642+eckartal@users.noreply.github.com> Date: Thu, 7 Mar 2024 23:27:31 +0300 Subject: [PATCH 047/131] Update about.md Updated how we tell the Jan's story Changed the sections and their hierarchies Added values/principles Updated the table Added "Join the team" and "how we work" sections --- docs/docs/about/about.md | 84 +++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/docs/docs/about/about.md b/docs/docs/about/about.md index 3066f3003..3f3f01f28 100644 --- a/docs/docs/about/about.md +++ b/docs/docs/about/about.md @@ -1,7 +1,7 @@ --- title: About Jan slug: /about -description: Jan is a productivity tool to customize AI to your needs and workflows. +description: Jan is a desktop application that turns computers into thinking machines. keywords: [ Jan AI, @@ -15,51 +15,75 @@ keywords: ] --- -Jan is a [open-source](https://en.wikipedia.org/wiki/Open_source), [local-first](https://www.inkandswitch.com/local-first/) tool to [create, customize and use AI](https://www.gatesnotes.com/AI-agents) for everyday tasks. +Jan turns computers into a thinking machine to change how you use computers. +Jan is created and maintained by Jan Labs, a robotics company. -You can: +With Jan, you can: -- Run locally using [open-source LLMs](https://huggingface.co/models?pipeline_tag=text-generation) or connect to cloud AIs like [ChatGPT](https://openai.com/blog/openai-api) or [Google](https://ai.google.dev/) -- Fine-tune AI with specific knowledge -- Search the web and other databases -- Connect AI to your everyday tools and (with your permission) do work on your behalf +- Run [open-source LLMs](https://huggingface.co/models?pipeline_tag=text-generation) locally or connect to cloud AIs like [ChatGPT](https://openai.com/blog/openai-api) or [Google](https://ai.google.dev/). +- Fine-tune AI with specific knowledge. +- Supercharge your productivity by leveraging AI. +- Search the web and databases. +- Integrate AI with everyday tools to work on your behalf (with permission). +- Customize and add features with Extensions. -Longer-term, Jan is building a cognitive framework for future robots. We envision a world where we have personal or company robots that we continually improve and customize, growing together with us. +:::tip + +Jan aims for long-term human-robot collaboration, envisioning AI as a harmonious extension of human capabilities. Our goal is to build customizable robots that we continually improve and customize, growing together. + +::: ![Human repairing a Droid](/img/star-wars-droids.png) -## Why do we exist +## Jan’s Principles -At Jan, our mission is to advance human-machine collaboration. We achieve this through delivering the best open-source, local-first tools to allow users to run, customize and tinker with AI. +- **Ownership**: Jan is committed to developing a product that fully belong to users. You're the true owner, free from data tracking and storage by us. +- **Privacy**: Jan works locally by default, allowing use without an internet connection. Your data stays on your device in a universal format, giving you complete privacy control. +- **100% User Supported**: Every user can access, develop, and customize Jan codebases to suit their needs. +- **Rejecting Dark Patterns**: We never use tricks to extract more money or lock you into an ecosystem. -## What's different about it? +## Why do we exist? -| | Status Quo | Jan | -| ---------------------------------------------------------- | -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| Ownership | AI Monopolies owned by Big Tech | AI that you own and control | -| Openness? | Closed-source | [Open-source (AGPLv3)](https://github.com/janhq/jan/blob/main/LICENSE) | -| Your role | Consume | Create, Tinker and Customize | -| Approach | Cloud | [Local-first](https://www.inkandswitch.com/local-first/), running 100% on your devices | -| Data | Data stored on their servers | Data stored in your local filesystem in open, non-proprietary file formats | -| Privacy | 😂 | Runs 100% on your own machine, predictably, privately and offline | -| Transparency | "Black Box" | Runs predictability with code available to tinker and customize | -| What happens if there's an outage or goes out of business? | Your life's work held hostage in the cloud in proprietary data formats[^1] | Continues to run 100% on your computer, your data is safe in your local folder | -| Driving Philosophy | Monetize your users | [Privacy as a human right](https://en.wikipedia.org/wiki/Right_to_privacy) and the [Right to Repair](https://www.repair.org/) | +> *"I do not fear computers. I fear the lack of them." - Isaac Asimov* -## How do I get it? +Jan was founded on the belief that AI should coexist with humans, not replace them. Our mission is to democratize AI access, ensuring everyone can easily utilize it with full ownership and control over their data, free from privacy concerns. + +### What are the things Jan committed on? + +We are committed to creating open, local-first products that extend individual freedom, rejecting dark patterns and ecosystem lock-ins, and embracing an open-source ethos. + +#### What's different about it? + +| | Status Quo | Jan | +|----------------|---------------------|-----------------------------| +| **Ownership** | Owned by Big Tech | Fully owned by you | +| **Openness** | Closed-source | [Open-source (AGPLv3)](https://github.com/janhq/jan/blob/main/LICENSE) | +| **Your Role** | Consumer | Creator | +| **Approach** | Cloud-based | [Local-first](https://www.inkandswitch.com/local-first/) | +| **Data Handling** | Stored on external servers | Stored locally, openly accessible | +| **Privacy** | Questionable | Private and offline | +| **Transparency** | Opaque "Black Box" | Open-source and customizable | +| **Outage Resilience** | Potential data hostage | Continues to work on your device | +| **Philosophy** | User monetization | Empowerment with the right to repair | + +## How we work + +Jan is an open-source product with transparent development and future features. Users have the right to modify and customize Jan. We are committed to building an open-source AI ecosystem. + +Jan is building in public using GitHub, where anyone is welcome to join. Key resources include Jan's [Kanban](https://github.com/orgs/janhq/projects/5/views/7) and Jan's [Roadmap](https://github.com/orgs/janhq/projects/5/views/29). + +Jan has a fully-remote team, primarily based in the APAC timezone, and we use Discord and GitHub for collaboration. Our community is central to our operations, and we embrace asynchronous work. We hold meetings only for synchronization and vision sharing, using [Excalidraw](https://excalidraw.com/) or [Miro](https://miro.com/) for visualization and sharing notes on Discord for alignment. We also use [HackMD](https://hackmd.io/) to document our ideas and build a Jan library. + +## How to get it? You can install and start using Jan in less than 5 minutes, from [jan.ai](https://jan.ai) or our [Github repo](https://github.com/janhq/jan). -You can read the [User Guide](/docs/user-guide) if you need some help to get started. - ## What license is the code under? Jan is licensed under the [AGPLv3 License](https://github.com/janhq/jan/blob/main/LICENSE). We happily accept pull requests, however, we do ask that you sign a [Contributor License Agreement](https://en.wikipedia.org/wiki/Contributor_License_Agreement) so that we have the right to relicense your contributions[^2]. -We also have a [Contributor Program](/docs/team/contributor-program) to provide ownership and upside to contributors who have made significant contributions to the project. - ## What was it built with? [Jan](https://github.com/janhq/jan) is pragmatically built using `Typescript` at the application level and `C++` at the Inference level (which we have refactored into [Nitro](https://nitro.jan.ai)[^3]). @@ -73,11 +97,9 @@ We follow [clean architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/ Architecturally, we have made similar choices to the [Next.js Enterprise Javascript Stack](https://vercel.com/templates/next.js/nextjs-enterprise-boilerplate), which is a [battle-tested](https://nextjs.org/showcase/enterprise) framework for building enterprise-grade applications that scale. -:::tip +## Join the team -**At its core, Jan is a software development kit to build and run copilots on personal devices**. The Desktop Client many folks use is, rather, a specific set of extensions packaged by default. We're excited to see what developers do with the SDK (once its in better shape). - -::: +Join us on this journey at Jan Labs, where we embrace open-source collaboration and transparency. Together, let's shape a future where Jan becomes an essential companion in the open-source community. Explore [careers](https://janai.bamboohr.com/careers) with us. ## Contact From 11d8c4783e710ae228d1bf3a14ddeac794acfa1f Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 8 Mar 2024 08:04:17 +0900 Subject: [PATCH 048/131] docs: correct typo and format style --- docs/docs/about/about.md | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/docs/docs/about/about.md b/docs/docs/about/about.md index 3f3f01f28..0f1651c1a 100644 --- a/docs/docs/about/about.md +++ b/docs/docs/about/about.md @@ -12,10 +12,13 @@ keywords: conversational AI, no-subscription fee, large language model, + about Jan, + desktop application, + thinking machine, ] --- -Jan turns computers into a thinking machine to change how you use computers. +Jan turns computers into a thinking machine to change how you use computers. Jan is created and maintained by Jan Labs, a robotics company. With Jan, you can: @@ -35,16 +38,16 @@ Jan aims for long-term human-robot collaboration, envisioning AI as a harmonious ![Human repairing a Droid](/img/star-wars-droids.png) -## Jan’s Principles +## Jan’s principles -- **Ownership**: Jan is committed to developing a product that fully belong to users. You're the true owner, free from data tracking and storage by us. +- **Ownership**: Jan is committed to developing a product that fully belongs to users. You're the true owner, free from data tracking and storage by us. - **Privacy**: Jan works locally by default, allowing use without an internet connection. Your data stays on your device in a universal format, giving you complete privacy control. -- **100% User Supported**: Every user can access, develop, and customize Jan codebases to suit their needs. +- **100% User Supported**: Every user can access, develop, and customize Jan's codebases to suit their needs. - **Rejecting Dark Patterns**: We never use tricks to extract more money or lock you into an ecosystem. ## Why do we exist? -> *"I do not fear computers. I fear the lack of them." - Isaac Asimov* +> _"I do not fear computers. I fear the lack of them." - Isaac Asimov_ Jan was founded on the belief that AI should coexist with humans, not replace them. Our mission is to democratize AI access, ensuring everyone can easily utilize it with full ownership and control over their data, free from privacy concerns. @@ -54,17 +57,17 @@ We are committed to creating open, local-first products that extend individual f #### What's different about it? -| | Status Quo | Jan | -|----------------|---------------------|-----------------------------| -| **Ownership** | Owned by Big Tech | Fully owned by you | -| **Openness** | Closed-source | [Open-source (AGPLv3)](https://github.com/janhq/jan/blob/main/LICENSE) | -| **Your Role** | Consumer | Creator | -| **Approach** | Cloud-based | [Local-first](https://www.inkandswitch.com/local-first/) | -| **Data Handling** | Stored on external servers | Stored locally, openly accessible | -| **Privacy** | Questionable | Private and offline | -| **Transparency** | Opaque "Black Box" | Open-source and customizable | -| **Outage Resilience** | Potential data hostage | Continues to work on your device | -| **Philosophy** | User monetization | Empowerment with the right to repair | +| | Status Quo | Jan | +| --------------------- | -------------------------- | ---------------------------------------------------------------------- | +| **Ownership** | Owned by Big Tech | Fully owned by you | +| **Openness** | Closed-source | [Open-source (AGPLv3)](https://github.com/janhq/jan/blob/main/LICENSE) | +| **Your Role** | Consumer | Creator | +| **Approach** | Cloud-based | [Local-first](https://www.inkandswitch.com/local-first/) | +| **Data Handling** | Stored on external servers | Stored locally, openly accessible | +| **Privacy** | Questionable | Private and offline | +| **Transparency** | Opaque "Black Box" | Open-source and customizable | +| **Outage Resilience** | Potential data hostage | Continues to work on your device | +| **Philosophy** | User monetization | Empowerment with the right to repair | ## How we work @@ -76,7 +79,7 @@ Jan has a fully-remote team, primarily based in the APAC timezone, and we use Di ## How to get it? -You can install and start using Jan in less than 5 minutes, from [jan.ai](https://jan.ai) or our [Github repo](https://github.com/janhq/jan). +You can install and start using Jan in less than 5 minutes, from [Jan.ai](https://jan.ai) or our [Github repo](https://github.com/janhq/jan). ## What license is the code under? From f36d740b1eb6e1b5caadd1fc115a0da3044b0e5b Mon Sep 17 00:00:00 2001 From: NamH Date: Fri, 8 Mar 2024 10:01:37 +0700 Subject: [PATCH 049/131] feat: add quick ask (#2197) * feat: add quick ask Signed-off-by: James --------- Signed-off-by: James Co-authored-by: James Co-authored-by: Louis --- .gitignore | 1 + core/package.json | 11 +- core/src/api/index.ts | 11 ++ .../node/api/restful/helper/startStopModel.ts | 6 +- core/src/types/miscellaneous/appUpdate.ts | 7 + core/src/types/miscellaneous/index.ts | 1 + core/src/types/model/modelEntity.ts | 4 + electron/handlers/common.ts | 15 +- electron/handlers/native.ts | 41 +++++- electron/handlers/update.ts | 26 ++-- electron/icons/icon-tray.png | Bin 0 -> 1352 bytes electron/icons/icon-tray@2x.png | Bin 0 -> 2269 bytes electron/main.ts | 103 +++++++++----- electron/managers/mainWindowConfig.ts | 16 +++ electron/managers/quickAskWindowConfig.ts | 13 ++ electron/managers/window.ts | 132 +++++++++++++++--- electron/package.json | 18 ++- electron/utils/clean.ts | 4 +- electron/utils/selectedText.ts | 39 ++++++ extensions/assistant-extension/package.json | 2 +- .../inference-nitro-extension/package.json | 2 +- server/package.json | 4 +- uikit/package.json | 2 +- web/app/search/SelectedText.tsx | 47 +++++++ web/app/search/UserInput.tsx | 86 ++++++++++++ web/app/search/page.tsx | 13 ++ .../Providers/AppUpdateListener.tsx | 12 +- .../Providers/ClipboardListener.tsx | 17 +++ web/containers/Providers/DataLoader.tsx | 2 +- web/containers/Providers/EventHandler.tsx | 13 +- web/containers/Providers/EventListener.tsx | 12 +- web/containers/Providers/Jotai.tsx | 2 + web/containers/Providers/KeyListener.tsx | 4 + web/containers/Providers/QuickAskListener.tsx | 39 ++++++ web/helpers/atoms/Assistant.atom.ts | 2 +- web/hooks/useActiveModel.ts | 10 +- web/hooks/useSendChatMessage.ts | 55 ++++---- web/package.json | 5 +- .../ImportingModelItem.tsx | 2 +- 39 files changed, 631 insertions(+), 148 deletions(-) create mode 100644 core/src/types/miscellaneous/appUpdate.ts create mode 100644 electron/icons/icon-tray.png create mode 100644 electron/icons/icon-tray@2x.png create mode 100644 electron/managers/mainWindowConfig.ts create mode 100644 electron/managers/quickAskWindowConfig.ts create mode 100644 electron/utils/selectedText.ts create mode 100644 web/app/search/SelectedText.tsx create mode 100644 web/app/search/UserInput.tsx create mode 100644 web/app/search/page.tsx create mode 100644 web/containers/Providers/ClipboardListener.tsx create mode 100644 web/containers/Providers/QuickAskListener.tsx diff --git a/.gitignore b/.gitignore index 75518bf5a..ae0691605 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ electron/renderer electron/models electron/docs electron/engines +electron/playwright-report server/pre-install package-lock.json diff --git a/core/package.json b/core/package.json index c3abe2d56..2bf3e1735 100644 --- a/core/package.json +++ b/core/package.json @@ -45,19 +45,20 @@ "start": "rollup -c rollup.config.ts -w" }, "devDependencies": { - "jest": "^25.4.0", - "@types/jest": "^29.5.11", + "jest": "^29.7.0", + "@types/jest": "^29.5.12", "@types/node": "^12.0.2", - "eslint-plugin-jest": "^23.8.2", + "eslint-plugin-jest": "^27.9.0", + "eslint": "8.57.0", "rollup": "^2.38.5", "rollup-plugin-commonjs": "^9.1.8", "rollup-plugin-json": "^3.1.0", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-sourcemaps": "^0.6.3", "rollup-plugin-typescript2": "^0.36.0", - "ts-jest": "^26.1.1", + "ts-jest": "^29.1.2", "tslib": "^2.6.2", - "typescript": "^5.2.2", + "typescript": "^5.3.3", "rimraf": "^3.0.2" } } diff --git a/core/src/api/index.ts b/core/src/api/index.ts index 7fb8eeb38..e62b49087 100644 --- a/core/src/api/index.ts +++ b/core/src/api/index.ts @@ -9,6 +9,14 @@ export enum NativeRoute { selectDirectory = 'selectDirectory', selectModelFiles = 'selectModelFiles', relaunch = 'relaunch', + + hideQuickAskWindow = 'hideQuickAskWindow', + sendQuickAskInput = 'sendQuickAskInput', + + hideMainWindow = 'hideMainWindow', + showMainWindow = 'showMainWindow', + + quickAskSizeUpdated = 'quickAskSizeUpdated', } /** @@ -31,6 +39,9 @@ export enum AppEvent { onAppUpdateDownloadUpdate = 'onAppUpdateDownloadUpdate', onAppUpdateDownloadError = 'onAppUpdateDownloadError', onAppUpdateDownloadSuccess = 'onAppUpdateDownloadSuccess', + + onUserSubmitQuickAsk = 'onUserSubmitQuickAsk', + onSelectedText = 'onSelectedText', } export enum DownloadRoute { diff --git a/core/src/node/api/restful/helper/startStopModel.ts b/core/src/node/api/restful/helper/startStopModel.ts index 0e6972b0b..4627b4120 100644 --- a/core/src/node/api/restful/helper/startStopModel.ts +++ b/core/src/node/api/restful/helper/startStopModel.ts @@ -41,7 +41,7 @@ const runModel = async (modelId: string, settingParams?: ModelSettingParams): Pr const modelFolderFullPath = join(janDataFolderPath, 'models', modelId) if (!fs.existsSync(modelFolderFullPath)) { - throw `Model not found: ${modelId}` + throw new Error(`Model not found: ${modelId}`) } const files: string[] = fs.readdirSync(modelFolderFullPath) @@ -53,7 +53,7 @@ const runModel = async (modelId: string, settingParams?: ModelSettingParams): Pr const modelMetadata: Model = JSON.parse(fs.readFileSync(modelMetadataPath, 'utf-8')) if (!ggufBinFile) { - throw 'No GGUF model file found' + throw new Error('No GGUF model file found') } const modelBinaryPath = join(modelFolderFullPath, ggufBinFile) @@ -76,7 +76,7 @@ const runModel = async (modelId: string, settingParams?: ModelSettingParams): Pr const promptTemplate = modelMetadata.settings.prompt_template const prompt = promptTemplateConverter(promptTemplate) if (prompt?.error) { - return Promise.reject(prompt.error) + throw new Error(prompt.error) } nitroModelSettings.system_prompt = prompt.system_prompt nitroModelSettings.user_prompt = prompt.user_prompt diff --git a/core/src/types/miscellaneous/appUpdate.ts b/core/src/types/miscellaneous/appUpdate.ts new file mode 100644 index 000000000..ed135e3bd --- /dev/null +++ b/core/src/types/miscellaneous/appUpdate.ts @@ -0,0 +1,7 @@ +export type AppUpdateInfo = { + total: number + delta: number + transferred: number + percent: number + bytesPerSecond: number +} diff --git a/core/src/types/miscellaneous/index.ts b/core/src/types/miscellaneous/index.ts index 02c973323..e9c205a73 100644 --- a/core/src/types/miscellaneous/index.ts +++ b/core/src/types/miscellaneous/index.ts @@ -1,2 +1,3 @@ export * from './systemResourceInfo' export * from './promptTemplate' +export * from './appUpdate' diff --git a/core/src/types/model/modelEntity.ts b/core/src/types/model/modelEntity.ts index 3cbe799e2..11d3e0526 100644 --- a/core/src/types/model/modelEntity.ts +++ b/core/src/types/model/modelEntity.ts @@ -138,3 +138,7 @@ export type ModelRuntimeParams = { presence_penalty?: number engine?: string } + +export type ModelInitFailed = Model & { + error: Error +} diff --git a/electron/handlers/common.ts b/electron/handlers/common.ts index 5a54a92bd..a2a1bd2f7 100644 --- a/electron/handlers/common.ts +++ b/electron/handlers/common.ts @@ -1,25 +1,20 @@ import { Handler, RequestHandler } from '@janhq/core/node' import { ipcMain } from 'electron' -import { WindowManager } from '../managers/window' +import { windowManager } from '../managers/window' export function injectHandler() { const ipcWrapper: Handler = ( route: string, listener: (...args: any[]) => any - ) => { - return ipcMain.handle(route, async (event, ...args: any[]) => { + ) => + ipcMain.handle(route, async (_event, ...args: any[]) => { return listener(...args) }) - } const handler = new RequestHandler( ipcWrapper, - (channel: string, args: any) => { - return WindowManager.instance.currentWindow?.webContents.send( - channel, - args - ) - } + (channel: string, args: any) => + windowManager.mainWindow?.webContents.send(channel, args) ) handler.handle() } diff --git a/electron/handlers/native.ts b/electron/handlers/native.ts index 19a473e73..04e9b71af 100644 --- a/electron/handlers/native.ts +++ b/electron/handlers/native.ts @@ -1,13 +1,13 @@ import { app, ipcMain, dialog, shell } from 'electron' import { join } from 'path' -import { WindowManager } from '../managers/window' +import { windowManager } from '../managers/window' import { ModuleManager, getJanDataFolderPath, getJanExtensionsPath, init, } from '@janhq/core/node' -import { NativeRoute } from '@janhq/core' +import { AppEvent, NativeRoute } from '@janhq/core' export function handleAppIPCs() { /** @@ -62,12 +62,12 @@ export function handleAppIPCs() { // Path to install extension to extensionsPath: getJanExtensionsPath(), }) - WindowManager.instance.currentWindow?.reload() + windowManager.mainWindow?.reload() } }) ipcMain.handle(NativeRoute.selectDirectory, async () => { - const mainWindow = WindowManager.instance.currentWindow + const mainWindow = windowManager.mainWindow if (!mainWindow) { console.error('No main window found') return @@ -85,7 +85,7 @@ export function handleAppIPCs() { }) ipcMain.handle(NativeRoute.selectModelFiles, async () => { - const mainWindow = WindowManager.instance.currentWindow + const mainWindow = windowManager.mainWindow if (!mainWindow) { console.error('No main window found') return @@ -101,4 +101,35 @@ export function handleAppIPCs() { return filePaths }) + + ipcMain.handle( + NativeRoute.hideQuickAskWindow, + async (): Promise => windowManager.hideQuickAskWindow() + ) + + ipcMain.handle( + NativeRoute.sendQuickAskInput, + async (_event, input: string): Promise => { + windowManager.mainWindow?.webContents.send( + AppEvent.onUserSubmitQuickAsk, + input + ) + } + ) + + ipcMain.handle( + NativeRoute.hideMainWindow, + async (): Promise => windowManager.hideMainWindow() + ) + + ipcMain.handle( + NativeRoute.showMainWindow, + async (): Promise => windowManager.showMainWindow() + ) + + ipcMain.handle( + NativeRoute.quickAskSizeUpdated, + async (_event, heightOffset: number): Promise => + windowManager.expandQuickAskWindow(heightOffset) + ) } diff --git a/electron/handlers/update.ts b/electron/handlers/update.ts index c8e28e580..3f52c401e 100644 --- a/electron/handlers/update.ts +++ b/electron/handlers/update.ts @@ -1,6 +1,11 @@ import { app, dialog } from 'electron' -import { WindowManager } from './../managers/window' -import { autoUpdater } from 'electron-updater' +import { windowManager } from './../managers/window' +import { + ProgressInfo, + UpdateDownloadedEvent, + UpdateInfo, + autoUpdater, +} from 'electron-updater' import { AppEvent } from '@janhq/core' export let waitingToInstallVersion: string | undefined = undefined @@ -11,7 +16,7 @@ export function handleAppUpdates() { return } /* New Update Available */ - autoUpdater.on('update-available', async (_info: any) => { + autoUpdater.on('update-available', async (_info: UpdateInfo) => { const action = await dialog.showMessageBox({ title: 'Update Available', message: 'Would you like to download and install it now?', @@ -21,8 +26,8 @@ export function handleAppUpdates() { }) /* App Update Completion Message */ - autoUpdater.on('update-downloaded', async (_info: any) => { - WindowManager.instance.currentWindow?.webContents.send( + autoUpdater.on('update-downloaded', async (_info: UpdateDownloadedEvent) => { + windowManager.mainWindow?.webContents.send( AppEvent.onAppUpdateDownloadSuccess, {} ) @@ -37,23 +42,24 @@ export function handleAppUpdates() { }) /* App Update Error */ - autoUpdater.on('error', (info: any) => { - WindowManager.instance.currentWindow?.webContents.send( + autoUpdater.on('error', (info: Error) => { + windowManager.mainWindow?.webContents.send( AppEvent.onAppUpdateDownloadError, { failedToInstallVersion: waitingToInstallVersion, info } ) }) /* App Update Progress */ - autoUpdater.on('download-progress', (progress: any) => { + autoUpdater.on('download-progress', (progress: ProgressInfo) => { console.debug('app update progress: ', progress.percent) - WindowManager.instance.currentWindow?.webContents.send( + windowManager.mainWindow?.webContents.send( AppEvent.onAppUpdateDownloadUpdate, { - percent: progress.percent, + ...progress, } ) }) + autoUpdater.autoDownload = false autoUpdater.autoInstallOnAppQuit = true if (process.env.CI !== 'e2e') { diff --git a/electron/icons/icon-tray.png b/electron/icons/icon-tray.png new file mode 100644 index 0000000000000000000000000000000000000000..ab356a9dc4318aabb43fb6e8d3b04486a0c95fc7 GIT binary patch literal 1352 zcmZ`%3ou+~6#myHgrd^LdZk`jgpg|!E4DHvc7vp=-ibl$u~%ynkJwewNf2~0`ie)J zv?C@;5*Z<0QSV)k6)YnjiK=R)GAR{Qi)C4RdoF!Ur|q5p{*QCM@0|0U|IhLD@zl~V z(m)7ld3$mEVbvl3Jye)&>|YLm#Vp#(pNG)p()~H)8>aG%X6NB~&iA7Jx^@TDDFTw5OZl#)d#cN|+5nI>=`9wcO7Rc`fk6z|ZHP^lDpVnYqRVWd zhF&Qe_|s*p?6rb)vIZJtUvHsH>MvJ`djIe~vX_gDf2-1fs>oStvr?^A)keky3^9a= z!GqvZ_A=I*^w(Pq$Ox^5tMz-qC~q~GtaQ06{#M?11PWI6Fu=I-KxeCGKRG|#zg(*& zYtR7-Sk{{Lz-_L}GTv zeUbFnUJe*n8)(y4|F)xI0*t_gZd8jTThfEDhXJ|fZ*5=S_7N<~K5K=<92&cLS7isI z=rUif(faXI1Q)v1Z2=vCB0>AM*BbPKC{PM*-0ER$bz71*LaGA^2cQ*-ZVL!Vwvix? z`I)N2b14=2`;brVKfjk8RW)o?bdsIfQ*ZN9PnbTJvc7r5yLiz^m23HNR@x;W0j5UP zf70^$!qB$SoApcpWZR_S!_e%Rg5; z{`g!@(+9Uduh*i|ODl`ovPui;KDt-fa;1z;b$;#Yn!o83o~G=ls$^w)7+i?+=<2kz zC@qPOdNxgarNCf4Kfr%<2 zrjMhL%OOs>D$HxpD~6DJM#zs8;_T=o92UgHm`Cif!}b^}5OZN;Og6@{!!S06xt(0~ z{Rbf~fgc-_`u_w+I&U5bHh*Oh#>U|SVPst5zd4RBJ4wQxns9()NOA%aVuUG?NjOSL hNpXmcKP!liOvD`$lHMs?bTtAH^5*(*?jMiH{2h=^c>w?b literal 0 HcmV?d00001 diff --git a/electron/icons/icon-tray@2x.png b/electron/icons/icon-tray@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a82c285f53bd7bce072322ef67f6e9ffd73aba28 GIT binary patch literal 2269 zcmZ{lc{CJm7ssEOVeFc+W=*9cG?pxbNMjkYG)=N=8f%8k5@Y#gCMIS7$&xgw5E7~E zk|ngFcRP zd&$a;Nf|pM(`m83wXk^fF?+t3Scj`-x-{+0GO)xHCrR(xE3Yl1prVmfmfC^HN<42T ztOl26UZ5o;CS8-YBZbmR?Mhuj84?DL5YM1*wU$kz-XHTmvGQ2|m@llQ=MC3VH|`qc zoh18CQ(C6SD1FZ1DLvoU=vf^#3h&1u_bi8IlD$dIp0L!DLOPH;un6cQ_omDC!ckwIiK3imp)U;xZ(|GJ z?1l+LFtORJUfy3lU!t?S2Zq@r0J)=zp~KPTy#3+i+`^lE0_1sC%M>Ra+Q1R%A&<&v z;Ao4h00LIRof0c1lTjAK%?}AVZNC)4Eta&FcAQg3N?8W~p#|u=`b>n_7%?N_XDNFt*=mm4KQ6{iJ>uT5>MAC;86vnMoJ&aKJgo>6ac{FgqJW+!j3h2tStj2WXS;C7HIKzbNUJXpJoM> zb4SYFp4eC3p`J<(mamr+W>zh&uxcku6%&n!HyMa@!wq$x%9k}+jrfSK;|u7bJ0TiN zKW=W#!w!xd>77mUeIY~>HO}|rW*m1D{2|)izNq!(8*a9;i^GY%5_@FH8F{F$vj=XT z)02uRd?87b67O0k=?&}e{cAns!UrA1`h4ninvR(4uRSUPmj$%?G0zil0h$2ja>2Xc zAx`r0y*YtNlNJ?^ZI7L5i|{TG_BUf?v)q1jvt(aK!H8-7ag}b8t5SR>2aD&yg#+JFsdx1&5Grtf&Q5?-7 zIaE?_skkK3NhZmYv5J6puT~Lb?o_iTm{}S?O&jsCA3aGk%{IiAB?E@8!7H1@`yLaQ z@u#-@#EY2Kjl9^BY4|^LC9L-J^7tlSpb{LWxh!VQc8aP?|D%c`{84z1HdB#G!x+*W*0#$x@1jYxK2^pt zg9n+|x&!!+Z}7J=b_I`i1(_3eIfPI%aSZt1)V5nSb5TtsLHl=wSJoC}5z}I7qFt+@ z%86o!VX#pwle=0`#B~^bg$aZPyGJD$@3-_SxU1{>s(bQ@k{nPzXz>}&=^ous z%t*d)i-kj;AbD3BOUMK^J@#l%gwRK$5yE@)J^}P%k)B>`v!J1X6pS zUwyNc7jS(|kdco~uZ9efd@nKtp!QGV%ZYxek~gW;ac z!V3=`mo%Hs{A_A9w+uJX>Brlx6*d=_VjCoBN*dtA_)6iX4(Q-jXuA_y&Fr6jP&FH9 ztamL&nboU5bj?v5G?Zj^TNFcuG#KFRuy*ckG3v?Q{#*OSFX77PMGq62N#?OGZs%iS z&P-2kguO0-8zZ0~Jz$rq)J^{sl44;onGj2K@G4)gXt<>;x4m;d%hqeh*XQ%CC13cn z`t2O$fm2V{RpWrzz72HEtY2NR){4W8_y^mnrA0HbdTgz${0Xg2wRWTW;i>*80@(Jwe4>i+|&^?~_(;Lv|MP=iDL zDO7xD`2S#x{@vtScJKtB+5MY2eKCL { + if (!app.isPackaged) { + windowManager.mainWindow?.webContents.openDevTools() + } + }) + .then(() => { + const iconPath = join(app.getAppPath(), 'icons', 'icon-tray.png') + const tray = new Tray(iconPath) + tray.setToolTip(app.getName()) + + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Open Jan', + type: 'normal', + click: () => windowManager.showMainWindow(), + }, + { + label: 'Open Quick Ask', + type: 'normal', + click: () => windowManager.showQuickAskWindow(), + }, + { label: 'Quit', type: 'normal', click: () => app.quit() }, + ]) + tray.setContextMenu(contextMenu) + }) + .then(() => { + log(`Version: ${app.getVersion()}`) + }) .then(() => { app.on('activate', () => { if (!BrowserWindow.getAllWindows().length) { @@ -45,45 +87,42 @@ app }) .then(() => cleanLogs()) -app.once('window-all-closed', () => { - cleanUpAndQuit() +app.on('ready', () => { + registerGlobalShortcuts() }) app.once('quit', () => { cleanUpAndQuit() }) +function createQuickAskWindow() { + const startUrl = app.isPackaged ? `file://${quickAskPath}` : quickAskUrl + windowManager.createQuickAskWindow(preloadPath, startUrl) +} + function createMainWindow() { - /* Create main window */ - const mainWindow = WindowManager.instance.createWindow({ - webPreferences: { - nodeIntegration: true, - preload: join(__dirname, 'preload.js'), - webSecurity: false, - }, + const startUrl = app.isPackaged ? `file://${mainPath}` : mainUrl + windowManager.createMainWindow(preloadPath, startUrl) +} + +function registerGlobalShortcuts() { + // TODO: Toggle below line when build production + // const ret = globalShortcut.register(quickAskHotKey, () => { + // const selectedText = '' + const ret = registerShortcut(quickAskHotKey, (selectedText: string) => { + if (!windowManager.isQuickAskWindowVisible()) { + windowManager.showQuickAskWindow() + windowManager.sendQuickAskSelectedText(selectedText) + } else { + windowManager.hideQuickAskWindow() + } }) - const startURL = app.isPackaged - ? `file://${join(__dirname, '..', 'renderer', 'index.html')}` - : 'http://localhost:3000' - - /* Load frontend app to the window */ - mainWindow.loadURL(startURL) - - mainWindow.once('ready-to-show', () => mainWindow?.show()) - mainWindow.on('closed', () => { - if (process.platform !== 'darwin') app.quit() - }) - - /* Open external links in the default browser */ - mainWindow.webContents.setWindowOpenHandler(({ url }) => { - shell.openExternal(url) - return { action: 'deny' } - }) - - /* Enable dev tools for development */ - if (!app.isPackaged) mainWindow.webContents.openDevTools() - log(`Version: ${app.getVersion()}`) + if (!ret) { + console.error('Global shortcut registration failed') + } else { + console.log('Global shortcut registered successfully') + } } /** diff --git a/electron/managers/mainWindowConfig.ts b/electron/managers/mainWindowConfig.ts new file mode 100644 index 000000000..184fb1c86 --- /dev/null +++ b/electron/managers/mainWindowConfig.ts @@ -0,0 +1,16 @@ +const DEFAULT_WIDTH = 1200 +const DEFAULT_HEIGHT = 800 + +export const mainWindowConfig: Electron.BrowserWindowConstructorOptions = { + width: DEFAULT_WIDTH, + minWidth: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + skipTaskbar: true, + show: true, + trafficLightPosition: { + x: 10, + y: 15, + }, + titleBarStyle: 'hiddenInset', + vibrancy: 'sidebar', +} diff --git a/electron/managers/quickAskWindowConfig.ts b/electron/managers/quickAskWindowConfig.ts new file mode 100644 index 000000000..4a5ce1e5d --- /dev/null +++ b/electron/managers/quickAskWindowConfig.ts @@ -0,0 +1,13 @@ +const DEFAULT_WIDTH = 556 + +const DEFAULT_HEIGHT = 60 + +export const quickAskWindowConfig: Electron.BrowserWindowConstructorOptions = { + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + skipTaskbar: true, + resizable: false, + transparent: true, + frame: false, + type: 'panel', +} diff --git a/electron/managers/window.ts b/electron/managers/window.ts index 4edf505b2..5a5254bc8 100644 --- a/electron/managers/window.ts +++ b/electron/managers/window.ts @@ -1,37 +1,123 @@ -import { BrowserWindow } from 'electron' +import { BrowserWindow, app, shell } from 'electron' +import { quickAskWindowConfig } from './quickAskWindowConfig' +import { AppEvent } from '@janhq/core' +import { mainWindowConfig } from './mainWindowConfig' /** * Manages the current window instance. */ -export class WindowManager { - public static instance: WindowManager = new WindowManager() - public currentWindow?: BrowserWindow - - constructor() { - if (WindowManager.instance) { - return WindowManager.instance - } - } +// TODO: refactor this +let isAppQuitting = false +class WindowManager { + public mainWindow?: BrowserWindow + private _quickAskWindow: BrowserWindow | undefined = undefined + private _quickAskWindowVisible = false + private _mainWindowVisible = false /** * Creates a new window instance. * @param {Electron.BrowserWindowConstructorOptions} options - The options to create the window with. * @returns The created window instance. */ - createWindow(options?: Electron.BrowserWindowConstructorOptions | undefined) { - this.currentWindow = new BrowserWindow({ - width: 1200, - minWidth: 1200, - height: 800, - show: true, - trafficLightPosition: { - x: 10, - y: 15, + createMainWindow(preloadPath: string, startUrl: string) { + this.mainWindow = new BrowserWindow({ + ...mainWindowConfig, + webPreferences: { + nodeIntegration: true, + preload: preloadPath, + webSecurity: false, }, - titleBarStyle: 'hiddenInset', - vibrancy: 'sidebar', - ...options, }) - return this.currentWindow + + /* Load frontend app to the window */ + this.mainWindow.loadURL(startUrl) + + /* Open external links in the default browser */ + this.mainWindow.webContents.setWindowOpenHandler(({ url }) => { + shell.openExternal(url) + return { action: 'deny' } + }) + + app.on('before-quit', function () { + isAppQuitting = true + }) + + windowManager.mainWindow?.on('close', function (evt) { + if (!isAppQuitting) { + evt.preventDefault() + windowManager.hideMainWindow() + } + }) + } + + createQuickAskWindow(preloadPath: string, startUrl: string): void { + this._quickAskWindow = new BrowserWindow({ + ...quickAskWindowConfig, + webPreferences: { + nodeIntegration: true, + preload: preloadPath, + webSecurity: false, + }, + }) + + this._quickAskWindow.loadURL(startUrl) + this._quickAskWindow.on('blur', () => { + this.hideQuickAskWindow() + }) + this.hideQuickAskWindow() + } + + isMainWindowVisible(): boolean { + return this._mainWindowVisible + } + + hideMainWindow(): void { + this.mainWindow?.hide() + this._mainWindowVisible = false + // Only macos + if (process.platform === 'darwin') app.dock.hide() + } + + showMainWindow(): void { + this.mainWindow?.show() + this._mainWindowVisible = true + // Only macos + if (process.platform === 'darwin') app.dock.show() + } + + hideQuickAskWindow(): void { + this._quickAskWindow?.hide() + this._quickAskWindowVisible = false + } + + showQuickAskWindow(): void { + this._quickAskWindow?.show() + this._quickAskWindowVisible = true + } + + isQuickAskWindowVisible(): boolean { + return this._quickAskWindowVisible + } + + expandQuickAskWindow(heightOffset: number): void { + const width = quickAskWindowConfig.width! + const height = quickAskWindowConfig.height! + heightOffset + this._quickAskWindow?.setSize(width, height, true) + } + + sendQuickAskSelectedText(selectedText: string): void { + this._quickAskWindow?.webContents.send( + AppEvent.onSelectedText, + selectedText + ) + } + + cleanUp(): void { + this.mainWindow?.destroy() + this._quickAskWindow?.destroy() + this._quickAskWindowVisible = false + this._mainWindowVisible = false } } + +export const windowManager = new WindowManager() diff --git a/electron/package.json b/electron/package.json index cd6b83137..93c30682c 100644 --- a/electron/package.json +++ b/electron/package.json @@ -16,13 +16,15 @@ "pre-install", "models/**/*", "docs/**/*", - "scripts/**/*" + "scripts/**/*", + "icons/**/*" ], "asarUnpack": [ "pre-install", "models", "docs", - "scripts" + "scripts", + "icons" ], "publish": [ { @@ -39,6 +41,7 @@ "notarize": { "teamId": "F8AH6NHVY5" }, + "icon": "icons/icon.png" }, "linux": { @@ -81,7 +84,6 @@ "@janhq/core": "link:./core", "@janhq/server": "link:./server", "@npmcli/arborist": "^7.1.0", - "@uiball/loaders": "^1.3.0", "electron-store": "^8.1.0", "electron-updater": "^6.1.7", "fs-extra": "^11.2.0", @@ -90,7 +92,7 @@ "request": "^2.88.2", "request-progress": "^3.0.0", "ulid": "^2.3.0", - "use-debounce": "^9.0.4" + "@hurdlegroup/robotjs": "^0.11.4" }, "devDependencies": { "@electron/notarize": "^2.1.0", @@ -101,13 +103,15 @@ "@typescript-eslint/eslint-plugin": "^6.7.3", "@typescript-eslint/parser": "^6.7.3", "electron": "28.0.0", - "electron-builder": "^24.9.1", + "electron-builder": "^24.13.3", + "electron-builder-squirrel-windows": "^24.13.3", "electron-devtools-installer": "^3.2.0", "electron-playwright-helpers": "^1.6.0", - "eslint-plugin-react": "^7.33.2", + "eslint": "8.57.0", + "eslint-plugin-react": "^7.34.0", "rimraf": "^5.0.5", "run-script-os": "^1.1.6", - "typescript": "^5.2.2" + "typescript": "^5.3.3" }, "installConfig": { "hoistingLimits": "workspaces" diff --git a/electron/utils/clean.ts b/electron/utils/clean.ts index 2334b589a..12a68d39e 100644 --- a/electron/utils/clean.ts +++ b/electron/utils/clean.ts @@ -1,12 +1,12 @@ import { ModuleManager } from '@janhq/core/node' -import { WindowManager } from './../managers/window' +import { windowManager } from './../managers/window' import { dispose } from './disposable' import { app } from 'electron' export function cleanUpAndQuit() { if (!ModuleManager.instance.cleaningResource) { ModuleManager.instance.cleaningResource = true - WindowManager.instance.currentWindow?.destroy() + windowManager.cleanUp() dispose(ModuleManager.instance.requiredModules) ModuleManager.instance.clearImportedModules() app.quit() diff --git a/electron/utils/selectedText.ts b/electron/utils/selectedText.ts new file mode 100644 index 000000000..6b2349725 --- /dev/null +++ b/electron/utils/selectedText.ts @@ -0,0 +1,39 @@ +import { clipboard, globalShortcut } from "electron"; +import { keyTap, keys } from "@hurdlegroup/robotjs"; + +/** + * Gets selected text by synthesizing the keyboard shortcut + * "CommandOrControl+c" then reading text from the clipboard + */ +export const getSelectedText = async () => { + const currentClipboardContent = clipboard.readText(); // preserve clipboard content + clipboard.clear(); + keyTap("c" as keys, process.platform === "darwin" ? "command" : "control"); + await new Promise((resolve) => setTimeout(resolve, 200)); // add a delay before checking clipboard + const selectedText = clipboard.readText(); + clipboard.writeText(currentClipboardContent); + return selectedText; +}; + +/** + * Registers a global shortcut of `accelerator`. The `callback` is called + * with the selected text when the registered shorcut is pressed by the user + * + * Returns `true` if the shortcut was registered successfully + */ +export const registerShortcut = ( + accelerator: Electron.Accelerator, + callback: (selectedText: string) => void +) => { + return globalShortcut.register(accelerator, async () => { + callback(await getSelectedText()); + }); +}; + +/** + * Unregisters a global shortcut of `accelerator` and + * is equivalent to electron.globalShortcut.unregister + */ +export const unregisterShortcut = (accelerator: Electron.Accelerator) => { + globalShortcut.unregister(accelerator); +}; \ No newline at end of file diff --git a/extensions/assistant-extension/package.json b/extensions/assistant-extension/package.json index baa858655..e3860a1c1 100644 --- a/extensions/assistant-extension/package.json +++ b/extensions/assistant-extension/package.json @@ -26,7 +26,7 @@ "rollup-plugin-define": "^1.0.1", "rollup-plugin-sourcemaps": "^0.6.3", "rollup-plugin-typescript2": "^0.36.0", - "typescript": "^5.2.2", + "typescript": "^5.3.3", "run-script-os": "^1.1.6" }, "dependencies": { diff --git a/extensions/inference-nitro-extension/package.json b/extensions/inference-nitro-extension/package.json index ba6b473eb..e6365ad92 100644 --- a/extensions/inference-nitro-extension/package.json +++ b/extensions/inference-nitro-extension/package.json @@ -35,7 +35,7 @@ "rollup-plugin-sourcemaps": "^0.6.3", "rollup-plugin-typescript2": "^0.36.0", "run-script-os": "^1.1.6", - "typescript": "^5.2.2", + "typescript": "^5.3.3", "@types/os-utils": "^0.0.4", "@rollup/plugin-replace": "^5.0.5" }, diff --git a/server/package.json b/server/package.json index d9a2bbc9a..b2c237c61 100644 --- a/server/package.json +++ b/server/package.json @@ -39,8 +39,8 @@ "@types/tcp-port-used": "^1.0.4", "@typescript-eslint/eslint-plugin": "^6.7.3", "@typescript-eslint/parser": "^6.7.3", - "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react": "^7.34.0", "run-script-os": "^1.1.6", - "typescript": "^5.2.2" + "typescript": "^5.3.3" } } diff --git a/uikit/package.json b/uikit/package.json index 66f05840b..b011ed497 100644 --- a/uikit/package.json +++ b/uikit/package.json @@ -52,6 +52,6 @@ "tailwind-merge": "^2.0.0", "terser": "^5.24.0", "tsup": "^7.2.0", - "typescript": "^5.2.2" + "typescript": "^5.3.3" } } diff --git a/web/app/search/SelectedText.tsx b/web/app/search/SelectedText.tsx new file mode 100644 index 000000000..742eba956 --- /dev/null +++ b/web/app/search/SelectedText.tsx @@ -0,0 +1,47 @@ +import React, { useCallback, useEffect, useRef } from 'react' + +import { useAtom } from 'jotai' +import { X } from 'lucide-react' + +import { selectedTextAtom } from '@/containers/Providers/Jotai' + +const SelectedText = ({ onCleared }: { onCleared?: () => void }) => { + const [text, setText] = useAtom(selectedTextAtom) + const containerRef = useRef(null) + + useEffect(() => { + if (text.trim().length === 0) { + window.core?.api?.quickAskSizeUpdated(0) + } else { + window.core?.api?.quickAskSizeUpdated( + (containerRef.current?.offsetHeight ?? 0) + 14 + ) + } + }) + + const onClearClicked = useCallback(() => { + setText('') + onCleared?.() + }, [setText, onCleared]) + + const shouldShowSelectedText = text.trim().length > 0 + + return shouldShowSelectedText ? ( +
    +
    + +
    +

    {text}

    +
    + ) : ( +
    + ) +} + +export default SelectedText diff --git a/web/app/search/UserInput.tsx b/web/app/search/UserInput.tsx new file mode 100644 index 000000000..a5fbfc682 --- /dev/null +++ b/web/app/search/UserInput.tsx @@ -0,0 +1,86 @@ +import React, { useState, useRef, useEffect } from 'react' + +import { Button } from '@janhq/uikit' +import { useAtomValue } from 'jotai' + +import { Send } from 'lucide-react' + +import LogoMark from '@/containers/Brand/Logo/Mark' + +import { selectedTextAtom } from '@/containers/Providers/Jotai' + +import SelectedText from './SelectedText' + +const UserInput: React.FC = () => { + const [inputValue, setInputValue] = useState('') + const inputRef = useRef(null) + const formRef = useRef(null) + const selectedText = useAtomValue(selectedTextAtom) + + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus() + } + + const onKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + window.core?.api?.hideQuickAskWindow() + } + } + + document.addEventListener('keydown', onKeyDown) + + return () => { + document.removeEventListener('keydown', onKeyDown) + } + }, []) + + const handleChange = ( + event: + | React.ChangeEvent + | React.ChangeEvent + ) => { + const { value } = event.target + setInputValue(value) + } + + const onSubmit = (e: React.FormEvent) => { + e.preventDefault() + if (inputValue.trim() !== '') { + const fullText = `${inputValue} ${selectedText}`.trim() + window.core?.api?.sendQuickAskInput(fullText) + setInputValue('') + window.core?.api?.hideQuickAskWindow() + window.core?.api?.showMainWindow() + } + } + + return ( +
    +
    +
    + + + +
    +
    + + inputRef?.current?.focus()} /> +
    + ) +} + +export default UserInput diff --git a/web/app/search/page.tsx b/web/app/search/page.tsx new file mode 100644 index 000000000..0822c2676 --- /dev/null +++ b/web/app/search/page.tsx @@ -0,0 +1,13 @@ +'use client' + +import UserInput from './UserInput' + +const Search: React.FC = () => { + return ( +
    + +
    + ) +} + +export default Search diff --git a/web/containers/Providers/AppUpdateListener.tsx b/web/containers/Providers/AppUpdateListener.tsx index 542886ee5..d339b240a 100644 --- a/web/containers/Providers/AppUpdateListener.tsx +++ b/web/containers/Providers/AppUpdateListener.tsx @@ -1,6 +1,6 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { Fragment, PropsWithChildren, useEffect } from 'react' +import { AppUpdateInfo } from '@janhq/core' import { useSetAtom } from 'jotai' import { appDownloadProgress, updateVersionError } from './Jotai' @@ -12,13 +12,14 @@ const AppUpdateListener = ({ children }: PropsWithChildren) => { useEffect(() => { if (window && window.electronAPI) { window.electronAPI.onAppUpdateDownloadUpdate( - (_event: string, progress: any) => { - setProgress(progress.percent) - console.debug('app update progress:', progress.percent) + (_event: string, appUpdateInfo: AppUpdateInfo) => { + setProgress(appUpdateInfo.percent) + console.debug('app update progress:', appUpdateInfo.percent) } ) window.electronAPI.onAppUpdateDownloadError( + // eslint-disable-next-line @typescript-eslint/no-explicit-any (_event: string, error: any) => { console.error('Download error: ', error) setProgress(-1) @@ -33,8 +34,7 @@ const AppUpdateListener = ({ children }: PropsWithChildren) => { setProgress(-1) }) } - return () => {} - }, [setProgress]) + }, [setProgress, setUpdateVersionError]) return {children} } diff --git a/web/containers/Providers/ClipboardListener.tsx b/web/containers/Providers/ClipboardListener.tsx new file mode 100644 index 000000000..780515461 --- /dev/null +++ b/web/containers/Providers/ClipboardListener.tsx @@ -0,0 +1,17 @@ +import { Fragment, PropsWithChildren } from 'react' + +import { useSetAtom } from 'jotai' + +import { selectedTextAtom } from './Jotai' + +const ClipboardListener = ({ children }: PropsWithChildren) => { + const setSelectedText = useSetAtom(selectedTextAtom) + + window?.electronAPI?.onSelectedText((_event: string, text: string) => { + setSelectedText(text) + }) + + return {children} +} + +export default ClipboardListener diff --git a/web/containers/Providers/DataLoader.tsx b/web/containers/Providers/DataLoader.tsx index fb439c92f..bc1461d5b 100644 --- a/web/containers/Providers/DataLoader.tsx +++ b/web/containers/Providers/DataLoader.tsx @@ -2,7 +2,7 @@ import { Fragment, ReactNode, useEffect } from 'react' -import { AppConfiguration } from '@janhq/core/.' +import { AppConfiguration } from '@janhq/core' import { useSetAtom } from 'jotai' import useAssistants from '@/hooks/useAssistants' diff --git a/web/containers/Providers/EventHandler.tsx b/web/containers/Providers/EventHandler.tsx index 1dd0bd042..f0020d311 100644 --- a/web/containers/Providers/EventHandler.tsx +++ b/web/containers/Providers/EventHandler.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { Fragment, ReactNode, useCallback, useEffect, useRef } from 'react' import { @@ -15,6 +14,7 @@ import { MessageRequestType, ModelEvent, Thread, + ModelInitFailed, } from '@janhq/core' import { useAtomValue, useSetAtom } from 'jotai' import { ulid } from 'ulid' @@ -113,15 +113,14 @@ export default function EventHandler({ children }: { children: ReactNode }) { }, [setActiveModel, setStateModel]) const onModelInitFailed = useCallback( - (res: any) => { - const errorMessage = res?.error ?? res - console.error('Failed to load model: ', errorMessage) + (res: ModelInitFailed) => { + console.error('Failed to load model: ', res.error.message) setStateModel(() => ({ state: 'start', loading: false, - model: res.modelId, + model: res.id, })) - setLoadModelError(errorMessage) + setLoadModelError(res.error.message) setQueuedMessage(false) }, [setStateModel, setQueuedMessage, setLoadModelError] @@ -245,7 +244,7 @@ export default function EventHandler({ children }: { children: ReactNode }) { if (!threadMessages || threadMessages.length === 0) return - const summarizeFirstPrompt = `Summarize this text "${threadMessages[0].content[0].text.value}" for a conversation title in less than 10 words` + const summarizeFirstPrompt = `Summarize in a 5-word Title. Give the title only. "${threadMessages[0].content[0].text.value}"` // Prompt: Given this query from user {query}, return to me the summary in 5 words as the title const msgId = ulid() const messages: ChatCompletionMessage[] = [ diff --git a/web/containers/Providers/EventListener.tsx b/web/containers/Providers/EventListener.tsx index 9febbade5..bfc87917b 100644 --- a/web/containers/Providers/EventListener.tsx +++ b/web/containers/Providers/EventListener.tsx @@ -8,9 +8,11 @@ import { useSetAtom } from 'jotai' import { setDownloadStateAtom } from '@/hooks/useDownloadState' import AppUpdateListener from './AppUpdateListener' +import ClipboardListener from './ClipboardListener' import EventHandler from './EventHandler' import ModelImportListener from './ModelImportListener' +import QuickAskListener from './QuickAskListener' const EventListenerWrapper = ({ children }: PropsWithChildren) => { const setDownloadState = useSetAtom(setDownloadStateAtom) @@ -55,9 +57,13 @@ const EventListenerWrapper = ({ children }: PropsWithChildren) => { return ( - - {children} - + + + + {children} + + + ) } diff --git a/web/containers/Providers/Jotai.tsx b/web/containers/Providers/Jotai.tsx index c43786c89..7829041e9 100644 --- a/web/containers/Providers/Jotai.tsx +++ b/web/containers/Providers/Jotai.tsx @@ -15,6 +15,8 @@ export const appDownloadProgress = atom(-1) export const updateVersionError = atom(undefined) export const searchAtom = atom('') +export const selectedTextAtom = atom('') + export default function JotaiWrapper({ children }: Props) { return {children} } diff --git a/web/containers/Providers/KeyListener.tsx b/web/containers/Providers/KeyListener.tsx index a4702783c..d832059c2 100644 --- a/web/containers/Providers/KeyListener.tsx +++ b/web/containers/Providers/KeyListener.tsx @@ -24,6 +24,10 @@ export default function KeyListener({ children }: Props) { useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + window.core?.api?.hideMainWindow() + } + const prefixKey = isMac ? e.metaKey : e.ctrlKey if (e.key === 'b' && prefixKey) { diff --git a/web/containers/Providers/QuickAskListener.tsx b/web/containers/Providers/QuickAskListener.tsx new file mode 100644 index 000000000..3073c9036 --- /dev/null +++ b/web/containers/Providers/QuickAskListener.tsx @@ -0,0 +1,39 @@ +import { Fragment, ReactNode, useRef } from 'react' + +import { useSetAtom } from 'jotai' + +import { MainViewState } from '@/constants/screens' + +import useSendChatMessage from '@/hooks/useSendChatMessage' + +import { showRightSideBarAtom } from '@/screens/Chat/Sidebar' + +import { showLeftSideBarAtom } from './KeyListener' + +import { mainViewStateAtom } from '@/helpers/atoms/App.atom' + +type Props = { + children: ReactNode +} + +const QuickAskListener: React.FC = ({ children }) => { + const { sendChatMessage } = useSendChatMessage() + const setShowRightSideBar = useSetAtom(showRightSideBarAtom) + const setShowLeftSideBar = useSetAtom(showLeftSideBarAtom) + const setMainState = useSetAtom(mainViewStateAtom) + + const previousMessage = useRef('') + + window.electronAPI.onUserSubmitQuickAsk((_event: string, input: string) => { + if (previousMessage.current === input) return + setMainState(MainViewState.Thread) + setShowRightSideBar(false) + setShowLeftSideBar(false) + sendChatMessage(input) + previousMessage.current = input + }) + + return {children} +} + +export default QuickAskListener diff --git a/web/helpers/atoms/Assistant.atom.ts b/web/helpers/atoms/Assistant.atom.ts index e90923d3d..d44703cf4 100644 --- a/web/helpers/atoms/Assistant.atom.ts +++ b/web/helpers/atoms/Assistant.atom.ts @@ -1,4 +1,4 @@ -import { Assistant } from '@janhq/core/.' +import { Assistant } from '@janhq/core' import { atom } from 'jotai' export const assistantsAtom = atom([]) diff --git a/web/hooks/useActiveModel.ts b/web/hooks/useActiveModel.ts index 1b61a0dd1..600e10783 100644 --- a/web/hooks/useActiveModel.ts +++ b/web/hooks/useActiveModel.ts @@ -1,3 +1,5 @@ +import { useEffect, useRef } from 'react' + import { events, Model, ModelEvent } from '@janhq/core' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' @@ -24,6 +26,12 @@ export function useActiveModel() { const downloadedModels = useAtomValue(downloadedModelsAtom) const setLoadModelError = useSetAtom(loadModelErrorAtom) + const downloadedModelsRef = useRef([]) + + useEffect(() => { + downloadedModelsRef.current = downloadedModels + }, [downloadedModels]) + const startModel = async (modelId: string) => { if ( (activeModel && activeModel.id === modelId) || @@ -39,7 +47,7 @@ export function useActiveModel() { setStateModel({ state: 'start', loading: true, model: modelId }) - let model = downloadedModels.find((e) => e.id === modelId) + let model = downloadedModelsRef?.current.find((e) => e.id === modelId) if (!model) { toaster({ diff --git a/web/hooks/useSendChatMessage.ts b/web/hooks/useSendChatMessage.ts index 09c64a0f1..9e88e763a 100644 --- a/web/hooks/useSendChatMessage.ts +++ b/web/hooks/useSendChatMessage.ts @@ -63,9 +63,8 @@ export default function useSendChatMessage() { const setEditPrompt = useSetAtom(editPromptAtom) const currentMessages = useAtomValue(getCurrentChatMessagesAtom) - const { activeModel } = useActiveModel() const selectedModel = useAtomValue(selectedModelAtom) - const { startModel } = useActiveModel() + const { activeModel, startModel } = useActiveModel() const setQueuedMessage = useSetAtom(queuedMessageAtom) const loadModelFailed = useAtomValue(loadModelErrorAtom) @@ -78,6 +77,7 @@ export default function useSendChatMessage() { const setReloadModel = useSetAtom(reloadModelAtom) const [fileUpload, setFileUpload] = useAtom(fileUploadAtom) const setIsGeneratingResponse = useSetAtom(isGeneratingResponseAtom) + const activeThreadRef = useRef() useEffect(() => { modelRef.current = activeModel @@ -87,15 +87,19 @@ export default function useSendChatMessage() { loadModelFailedRef.current = loadModelFailed }, [loadModelFailed]) + useEffect(() => { + activeThreadRef.current = activeThread + }, [activeThread]) + const resendChatMessage = async (currentMessage: ThreadMessage) => { - if (!activeThread) { + if (!activeThreadRef.current) { console.error('No active thread') return } setIsGeneratingResponse(true) - updateThreadWaiting(activeThread.id, true) + updateThreadWaiting(activeThreadRef.current.id, true) const messages: ChatCompletionMessage[] = [ - activeThread.assistants[0]?.instructions, + activeThreadRef.current.assistants[0]?.instructions, ] .filter((e) => e && e.trim() !== '') .map((instructions) => { @@ -123,13 +127,14 @@ export default function useSendChatMessage() { id: ulid(), type: MessageRequestType.Thread, messages: messages, - threadId: activeThread.id, - model: activeThread.assistants[0].model ?? selectedModel, + threadId: activeThreadRef.current.id, + model: activeThreadRef.current.assistants[0].model ?? selectedModel, } - const modelId = selectedModel?.id ?? activeThread.assistants[0].model.id + const modelId = + selectedModel?.id ?? activeThreadRef.current.assistants[0].model.id - if (activeModel?.id !== modelId) { + if (modelRef.current?.id !== modelId) { setQueuedMessage(true) startModel(modelId) await waitForModelStarting(modelId) @@ -139,11 +144,11 @@ export default function useSendChatMessage() { if (currentMessage.role !== ChatCompletionRole.User) { // Delete last response before regenerating deleteMessage(currentMessage.id ?? '') - if (activeThread) { + if (activeThreadRef.current) { await extensionManager .get(ExtensionTypeEnum.Conversational) ?.writeMessages( - activeThread.id, + activeThreadRef.current.id, currentMessages.filter((msg) => msg.id !== currentMessage.id) ) } @@ -154,7 +159,7 @@ export default function useSendChatMessage() { const sendChatMessage = async (message: string) => { if (!message || message.trim().length === 0) return - if (!activeThread) { + if (!activeThreadRef.current) { console.error('No active thread') return } @@ -165,7 +170,7 @@ export default function useSendChatMessage() { const runtimeParams = toRuntimeParams(activeModelParams) const settingParams = toSettingParams(activeModelParams) - updateThreadWaiting(activeThread.id, true) + updateThreadWaiting(activeThreadRef.current.id, true) const prompt = message.trim() setCurrentPrompt('') setEditPrompt('') @@ -187,7 +192,7 @@ export default function useSendChatMessage() { } const messages: ChatCompletionMessage[] = [ - activeThread.assistants[0]?.instructions, + activeThreadRef.current.assistants[0]?.instructions, ] .filter((e) => e && e.trim() !== '') .map((instructions) => { @@ -218,7 +223,7 @@ export default function useSendChatMessage() { ? { type: ChatCompletionMessageContentType.Doc, doc_url: { - url: `threads/${activeThread.id}/files/${msgId}.pdf`, + url: `threads/${activeThreadRef.current.id}/files/${msgId}.pdf`, }, } : null, @@ -236,13 +241,14 @@ export default function useSendChatMessage() { ]) ) - let modelRequest = selectedModel ?? activeThread.assistants[0].model + let modelRequest = + selectedModel ?? activeThreadRef.current.assistants[0].model if (runtimeParams.stream == null) { runtimeParams.stream = true } // Add middleware to the model request with tool retrieval enabled if ( - activeThread.assistants[0].tools?.some( + activeThreadRef.current.assistants[0].tools?.some( (tool: AssistantTool) => tool.type === 'retrieval' && tool.enabled ) ) { @@ -260,14 +266,14 @@ export default function useSendChatMessage() { const messageRequest: MessageRequest = { id: msgId, type: MessageRequestType.Thread, - threadId: activeThread.id, + threadId: activeThreadRef.current.id, messages, model: { ...modelRequest, settings: settingParams, parameters: runtimeParams, }, - thread: activeThread, + thread: activeThreadRef.current, } const timestamp = Date.now() @@ -307,7 +313,7 @@ export default function useSendChatMessage() { const threadMessage: ThreadMessage = { id: msgId, - thread_id: activeThread.id, + thread_id: activeThreadRef.current.id, role: ChatCompletionRole.User, status: MessageStatus.Ready, created: timestamp, @@ -322,10 +328,10 @@ export default function useSendChatMessage() { } const updatedThread: Thread = { - ...activeThread, + ...activeThreadRef.current, updated: timestamp, metadata: { - ...(activeThread.metadata ?? {}), + ...(activeThreadRef.current.metadata ?? {}), lastMessage: prompt, }, } @@ -337,9 +343,10 @@ export default function useSendChatMessage() { .get(ExtensionTypeEnum.Conversational) ?.addNewMessage(threadMessage) - const modelId = selectedModel?.id ?? activeThread.assistants[0].model.id + const modelId = + selectedModel?.id ?? activeThreadRef.current.assistants[0].model.id - if (activeModel?.id !== modelId) { + if (modelRef.current?.id !== modelId) { setQueuedMessage(true) startModel(modelId) await waitForModelStarting(modelId) diff --git a/web/package.json b/web/package.json index 0a8af0f92..e3301f68b 100644 --- a/web/package.json +++ b/web/package.json @@ -37,6 +37,7 @@ "react-dropzone": "^14.2.3", "react-hook-form": "^7.47.0", "react-hot-toast": "^2.4.1", + "csstype": "^3.0.10", "react-icons": "^4.12.0", "react-scroll-to-bottom": "^4.2.0", "react-toastify": "^9.1.3", @@ -66,11 +67,11 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.28.1", "eslint-plugin-prettier": "^5.0.1", - "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.6", "rimraf": "^5.0.5", - "typescript": "^5.2.2" + "typescript": "^5.3.3" } } diff --git a/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx b/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx index 0426c3dd0..d4d50722f 100644 --- a/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx +++ b/web/screens/Settings/ImportingModelModal/ImportingModelItem.tsx @@ -1,6 +1,6 @@ import { useCallback, useMemo } from 'react' -import { ImportingModel } from '@janhq/core/.' +import { ImportingModel } from '@janhq/core' import { useSetAtom } from 'jotai' import { AlertCircle } from 'lucide-react' From bb4c72d892b9550559ab7f861bd19876f67fc0f2 Mon Sep 17 00:00:00 2001 From: hahuyhoang411 Date: Fri, 8 Mar 2024 12:07:10 +0700 Subject: [PATCH 050/131] add: init first draft version --- .../guides/error-codes/stuck-on-loading.mdx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 docs/docs/guides/error-codes/stuck-on-loading.mdx diff --git a/docs/docs/guides/error-codes/stuck-on-loading.mdx b/docs/docs/guides/error-codes/stuck-on-loading.mdx new file mode 100644 index 000000000..09762446b --- /dev/null +++ b/docs/docs/guides/error-codes/stuck-on-loading.mdx @@ -0,0 +1,45 @@ +--- +title: Stuck on loading model +slug: /troubleshooting/stuck-on-loading +description: Troubleshooting steps to resolve issues related to loading model. +keywords: + [ + Jan AI, + Jan, + ChatGPT alternative, + local AI, + private AI, + conversational AI, + no-subscription fee, + large language model, + troubleshooting, + ] +--- + +Encountering an stuck on loading model issue in Jan is caused by errors related the `Windows Management Instrumentation Command-line (WMIC)` path not being included in the system's PATH environment variable. + +It can be resolved through the following steps: + +#### Adding WMIC Path to Environment Variables: + +1. **Open System Properties:** + - Press `Windows key + R`. + - Type `sysdm.cpl` and press `Enter`. + +2. **Access Environment Variables:** + - Go to the "Advanced" tab. + - Click "Environment Variables" button. + +3. **Edit System PATH:** + - Under "System Variables," find and select `Path`. + - Click "Edit." + +4. **Add WMIC Path:** + - Click "New" and enter `C:\Windows\System32\Wbem`. + +5. **Save Changes:** + - Click "OK" to close and save your changes. + +6. **Verify Installation:** + - Restart any command prompts or terminals. + - Run `where wmic` to verify. Expected output: `C:\Windows\System32\wbem\WMIC.exe`. \ No newline at end of file From 5c7ac0a75291ea3e86032da0921b7d161caa36b7 Mon Sep 17 00:00:00 2001 From: hahuyhoang411 Date: Fri, 8 Mar 2024 13:40:37 +0700 Subject: [PATCH 051/131] add: docs for cpus without avx --- .../guides/error-codes/stuck-on-loading.mdx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/docs/guides/error-codes/stuck-on-loading.mdx b/docs/docs/guides/error-codes/stuck-on-loading.mdx index 09762446b..26ad6f6a5 100644 --- a/docs/docs/guides/error-codes/stuck-on-loading.mdx +++ b/docs/docs/guides/error-codes/stuck-on-loading.mdx @@ -16,11 +16,13 @@ keywords: ] --- +## 1. Missing Windows Management Instrumentation Command-line (WMIC) + Encountering an stuck on loading model issue in Jan is caused by errors related the `Windows Management Instrumentation Command-line (WMIC)` path not being included in the system's PATH environment variable. It can be resolved through the following steps: -#### Adding WMIC Path to Environment Variables: +### Adding WMIC Path to Environment Variables: 1. **Open System Properties:** - Press `Windows key + R`. @@ -42,4 +44,15 @@ It can be resolved through the following steps: 6. **Verify Installation:** - Restart any command prompts or terminals. - - Run `where wmic` to verify. Expected output: `C:\Windows\System32\wbem\WMIC.exe`. \ No newline at end of file + - Run `where wmic` to verify. Expected output: `C:\Windows\System32\wbem\WMIC.exe`. + + +## 2. CPU without AVX + +Encountering an issue with models stuck on loading in Jan can be due to the use of older generation CPUs that do not support Advanced Vector Extensions (AVX). + +To check if your CPU supports AVX, visit the following link: [CPUs with AVX](https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#CPUs_with_AVX) + +:::warning [Please use this with caution] +As a workaround, consider using an [emulator](https://www.intel.com/content/www/us/en/developer/articles/tool/software-development-emulator.html) to simulate AVX support. +::: \ No newline at end of file From 6cf2a462538ddc59dff60adc655dd50c7a4ad735 Mon Sep 17 00:00:00 2001 From: hahuyhoang411 Date: Fri, 8 Mar 2024 13:45:18 +0700 Subject: [PATCH 052/131] add: error message for wbem --- docs/docs/guides/error-codes/stuck-on-loading.mdx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/docs/guides/error-codes/stuck-on-loading.mdx b/docs/docs/guides/error-codes/stuck-on-loading.mdx index 26ad6f6a5..584857303 100644 --- a/docs/docs/guides/error-codes/stuck-on-loading.mdx +++ b/docs/docs/guides/error-codes/stuck-on-loading.mdx @@ -16,13 +16,16 @@ keywords: ] --- -## 1. Missing Windows Management Instrumentation Command-line (WMIC) +## 1. Issue: Missing Windows Management Instrumentation Command-line (WMIC) Encountering an stuck on loading model issue in Jan is caused by errors related the `Windows Management Instrumentation Command-line (WMIC)` path not being included in the system's PATH environment variable. -It can be resolved through the following steps: +Error message: +``` +index.js:47 Uncaught (in promise) Error: Error invoking remote method 'invokeExtensionFunc': Error: Command failed: WMIC CPU Get NumberOfCores +``` -### Adding WMIC Path to Environment Variables: +It can be resolved through the following steps: 1. **Open System Properties:** - Press `Windows key + R`. @@ -47,7 +50,7 @@ It can be resolved through the following steps: - Run `where wmic` to verify. Expected output: `C:\Windows\System32\wbem\WMIC.exe`. -## 2. CPU without AVX +## 2. Issue: Model Loading Stuck Due to CPU without AVX Encountering an issue with models stuck on loading in Jan can be due to the use of older generation CPUs that do not support Advanced Vector Extensions (AVX). From 17181927a4456a2a2f35cf28b86b8e4f11bac587 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Fri, 8 Mar 2024 14:12:50 +0700 Subject: [PATCH 053/131] docs: fix the navbar based on the latest feedback --- docs/sidebars.js | 105 +++++++++++++++++++++++++++++----------- docs/src/css/custom.css | 7 +++ 2 files changed, 84 insertions(+), 28 deletions(-) diff --git a/docs/sidebars.js b/docs/sidebars.js index 61bd85439..4c45cadbe 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -177,7 +177,6 @@ const sidebars = { items: [ "guides/best-practices", "guides/thread", - "guides/faq", ] }, { @@ -186,24 +185,54 @@ const sidebars = { collapsible: false, className: "head_Menu", items: [ - "guides/models/README", - "guides/models/customize-engine", - "guides/models/import-models", - "guides/models/integrate-remote", - "guides/extensions/README", - "guides/extensions/import-ext", - "guides/extensions/setup-ext", - "guides/integration/README", - "guides/integration/azure", - "guides/integration/discord", - "guides/integration/groq", - "guides/integration/lmstudio", - "guides/integration/mistral", - "guides/integration/ollama", - "guides/integration/openinterpreter", - "guides/integration/openrouter", - "guides/integration/raycast", - "guides/integration/vscode", + { + type: "category", + label: "Advanced Model Setup", + className: "head_SubMenu", + link: { + type: 'doc', + id: "guides/models/README", + }, + items: [ + "guides/models/customize-engine", + "guides/models/import-models", + "guides/models/integrate-remote", + ] + }, + { + type: "category", + label: "Extensions", + className: "head_SubMenu", + link: { + type: 'doc', + id: "guides/extensions/README", + }, + items: [ + "guides/extensions/import-ext", + "guides/extensions/setup-ext", + ] + }, + { + type: "category", + label: "Integrations", + className: "head_SubMenu", + link: { + type: 'doc', + id: "guides/integration/README", + }, + items: [ + "guides/integration/azure", + "guides/integration/discord", + "guides/integration/groq", + "guides/integration/lmstudio", + "guides/integration/mistral", + "guides/integration/ollama", + "guides/integration/openinterpreter", + "guides/integration/openrouter", + "guides/integration/raycast", + "guides/integration/vscode", + ] + }, ] }, { @@ -212,15 +241,35 @@ const sidebars = { collapsible: false, className: "head_Menu", items: [ - "guides/common-error/README", - "guides/common-error/broken-build", - "guides/common-error/not-using-gpu", - "guides/error-codes/README", - "guides/error-codes/how-to-get-error-logs", - "guides/error-codes/permission-denied", - "guides/error-codes/something-amiss", - "guides/error-codes/undefined-issue", - "guides/error-codes/unexpected-token", + { + type: "category", + label: "Error Codes", + className: "head_SubMenu", + link: { + type: 'doc', + id: "guides/error-codes/README", + }, + items: [ + "guides/error-codes/how-to-get-error-logs", + "guides/error-codes/permission-denied", + "guides/error-codes/something-amiss", + "guides/error-codes/undefined-issue", + "guides/error-codes/unexpected-token", + ] + }, + { + type: "category", + label: "Common Error", + className: "head_SubMenu", + link: { + type: 'doc', + id: "guides/common-error/README", + }, + items: [ + "guides/common-error/broken-build", + "guides/common-error/not-using-gpu", + ] + }, "guides/faq" ] }, diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 5307bec2e..7d6bd33d2 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -20,4 +20,11 @@ font-weight: normal; background-color: white; margin-bottom: 5px; /* Adjust margin as needed */ +} + +.head_SubMenu div { + font-weight: normal; + background-color: white; + margin-left: 0rem; + font-size: medium; } \ No newline at end of file From 74a72a1d6fb878774d676f633d9aa07c8ba7b202 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Fri, 8 Mar 2024 14:13:07 +0700 Subject: [PATCH 054/131] docs: update Faq and guides integration content --- docs/docs/guides/faq.mdx | 11 +++++++---- docs/docs/guides/integration/groq.mdx | 10 +++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/docs/guides/faq.mdx b/docs/docs/guides/faq.mdx index d25b0f980..7e3d7d13d 100644 --- a/docs/docs/guides/faq.mdx +++ b/docs/docs/guides/faq.mdx @@ -75,14 +75,11 @@ keywords: ## Development and Features -- **Can I use local files from my computer with Jan?** - - The feature to use local files is currently in development. For more information, please our offical [Discord](https://discord.com/invite/FTk2MvZwJH) for the latest update. - - **Does Jan support Safetensors?** - At the moment, Jan only supports GGUF. However, there are plans to support `.safetensor` files in the future. - **I hope to customize the installation path of each model. Is that possible?** - - Yes you can customize the installation path. Please see [here](https://github.com/janhq/jan/issues/1010) for more information. + - Yes you can customize the installation path. Please see [here](https://jan.ai/guides/advanced-settings/#access-the-jan-data-folder) for more information. ## Troubleshooting @@ -94,3 +91,9 @@ keywords: - **What should I do if "Failed to fetch" occurs using MacBook Pro with Intel HD Graphics 4000 1536 MB?** - Ensure that the model size is less than 90% of your available VRAM and that the VRAM is accessible to the app. Managing the resources effectively can help mitigate this issue. + +:::info[Assistance and Support] + +If you have questions, please join our [Discord community](https://discord.gg/Dt7MxDyNNZ) for support, updates, and discussions. + +::: \ No newline at end of file diff --git a/docs/docs/guides/integration/groq.mdx b/docs/docs/guides/integration/groq.mdx index a3a12dbc5..01eee1cb3 100644 --- a/docs/docs/guides/integration/groq.mdx +++ b/docs/docs/guides/integration/groq.mdx @@ -22,7 +22,7 @@ keywords: This guide provides step-by-step instructions on integrating the Groq API with Jan, enabling users to leverage Groq's capabilities within Jan's conversational interface. Before proceeding, ensure you have the following: -- Access to the Jan platform +- Access to the Jan Application - Groq API credentials ## Integration Steps @@ -38,7 +38,7 @@ Obtain Groq API keys from your [Groq Console](https://console.groq.com/keys). ```json title="~/jan/engines/openai.json" { - "full_url": "https://api.groq.com/openai/v1", + "full_url": "https://api.groq.com/openai/v1/chat/completions", "api_key": "" } ``` @@ -52,7 +52,7 @@ To set up the configuration for Groq in Jan, follow these steps: 3. Inside the groq folder, create a model.json file with the specified settings: ```json title="~/jan/models/groq/model.json { - "id": "groq", + "id": "mixtral-8x7b-32768", "object": "model", "name": "Groq Integration", "version": "1.0", @@ -62,10 +62,10 @@ To set up the configuration for Groq in Jan, follow these steps: "settings": {}, "parameters": {}, "metadata": { - "author": "Your Name", + "author": "Mistral ", "tags": ["Groq Integration"] }, - "engine": "groq" + "engine": "openai" } ``` From 2726ed34cd9ef6cc93372db9544764a09ce1f657 Mon Sep 17 00:00:00 2001 From: hahuyhoang411 Date: Fri, 8 Mar 2024 14:34:35 +0700 Subject: [PATCH 055/131] fix: typo --- docs/docs/guides/error-codes/stuck-on-loading.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/guides/error-codes/stuck-on-loading.mdx b/docs/docs/guides/error-codes/stuck-on-loading.mdx index 584857303..38ffed481 100644 --- a/docs/docs/guides/error-codes/stuck-on-loading.mdx +++ b/docs/docs/guides/error-codes/stuck-on-loading.mdx @@ -16,7 +16,7 @@ keywords: ] --- -## 1. Issue: Missing Windows Management Instrumentation Command-line (WMIC) +## 1. Issue: Model Loading Stuck Due To Missing Windows Management Instrumentation Command-line (WMIC) Encountering an stuck on loading model issue in Jan is caused by errors related the `Windows Management Instrumentation Command-line (WMIC)` path not being included in the system's PATH environment variable. @@ -50,7 +50,7 @@ It can be resolved through the following steps: - Run `where wmic` to verify. Expected output: `C:\Windows\System32\wbem\WMIC.exe`. -## 2. Issue: Model Loading Stuck Due to CPU without AVX +## 2. Issue: Model Loading Stuck Due To CPU Without AVX Encountering an issue with models stuck on loading in Jan can be due to the use of older generation CPUs that do not support Advanced Vector Extensions (AVX). From e22fdec23049d94347395812e3237530e9a99715 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Fri, 8 Mar 2024 14:34:42 +0700 Subject: [PATCH 056/131] fix: reducing height title-bar drag window for enable clickable quick ask (#2278) --- web/styles/base/global.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/styles/base/global.scss b/web/styles/base/global.scss index 05584c9e7..f1b7c3537 100644 --- a/web/styles/base/global.scss +++ b/web/styles/base/global.scss @@ -12,7 +12,7 @@ left: 0px; top: 0px; width: 100%; - height: 48px; + height: 24px; user-select: none; -webkit-app-region: drag; } From 775ae0b994ca146f41884f6a8b9bf12a6f1ac30d Mon Sep 17 00:00:00 2001 From: hahuyhoang411 Date: Fri, 8 Mar 2024 14:34:57 +0700 Subject: [PATCH 057/131] add: no assistant bug docs --- .../error-codes/no-assistant-available.mdx | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 docs/docs/guides/error-codes/no-assistant-available.mdx diff --git a/docs/docs/guides/error-codes/no-assistant-available.mdx b/docs/docs/guides/error-codes/no-assistant-available.mdx new file mode 100644 index 000000000..ed954db60 --- /dev/null +++ b/docs/docs/guides/error-codes/no-assistant-available.mdx @@ -0,0 +1,31 @@ +--- +title: No assistant available +slug: /troubleshooting/no-assistant-available +description: Troubleshooting steps to resolve issues related to loading model. +keywords: + [ + Jan AI, + Jan, + ChatGPT alternative, + local AI, + private AI, + conversational AI, + no-subscription fee, + large language model, + troubleshooting, + ] +--- + + +When you encounter the following error message: +``` +No assistant available. +``` + +This issue arises when a new, unintentional file appears in `/jan/assistants`. + +It can be resolved through the following steps: + +1. Access the `/jan/assistants` directory using a file manager or terminal. + +2. Within `/jan/assistants`, this directory should only contain a folder named `jan`. Identify any file outside of this folder and remove it. \ No newline at end of file From 8b8c9d748e10914c6ae40de5bb6f44c4244a38ed Mon Sep 17 00:00:00 2001 From: hahuyhoang411 Date: Fri, 8 Mar 2024 14:44:21 +0700 Subject: [PATCH 058/131] add: threads disappearance --- .../guides/error-codes/missing-thread.mdx | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 docs/docs/guides/error-codes/missing-thread.mdx diff --git a/docs/docs/guides/error-codes/missing-thread.mdx b/docs/docs/guides/error-codes/missing-thread.mdx new file mode 100644 index 000000000..36bf4a66b --- /dev/null +++ b/docs/docs/guides/error-codes/missing-thread.mdx @@ -0,0 +1,25 @@ +--- +title: Thread Disappearance +slug: /troubleshooting/thread-disappearance +description: Troubleshooting steps to resolve issues threads suddenly disappearance. +keywords: + [ + Jan AI, + Jan, + ChatGPT alternative, + local AI, + private AI, + conversational AI, + no-subscription fee, + large language model, + troubleshooting, + ] +--- + +When you encounter the error of old threads suddenly disappear. This can happen when a new, unintentional file is created in `/jan/threads`. + +It can be resolved through the following steps: + +1. Go to `/jan/threads`. + +2. The `/jan/threads` directory contains many folders named with the prefix `jan_` followed by an ID (e.g., `jan_123`). Look for any file not conforming to this naming pattern and remove it. \ No newline at end of file From 3c1607fe440cc14dfad21a869d7e72b8eee974a9 Mon Sep 17 00:00:00 2001 From: hahuyhoang411 Date: Fri, 8 Mar 2024 14:44:42 +0700 Subject: [PATCH 059/131] fix: coorect slug --- docs/docs/guides/error-codes/no-assistant-available.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/error-codes/no-assistant-available.mdx b/docs/docs/guides/error-codes/no-assistant-available.mdx index ed954db60..3dbdbe5f6 100644 --- a/docs/docs/guides/error-codes/no-assistant-available.mdx +++ b/docs/docs/guides/error-codes/no-assistant-available.mdx @@ -1,7 +1,7 @@ --- title: No assistant available slug: /troubleshooting/no-assistant-available -description: Troubleshooting steps to resolve issues related to loading model. +description: Troubleshooting steps to resolve issues no assistant available. keywords: [ Jan AI, From 3320162ea9c8eac1f2e9418f89964702bc2163e5 Mon Sep 17 00:00:00 2001 From: NamH Date: Fri, 8 Mar 2024 15:01:04 +0700 Subject: [PATCH 060/131] chore: small update/fixes for quick ask window (#2279) Signed-off-by: James Co-authored-by: James --- electron/main.ts | 5 +---- electron/managers/quickAskWindowConfig.ts | 9 +++++++++ electron/managers/window.ts | 1 - web/app/search/UserInput.tsx | 6 +++--- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/electron/main.ts b/electron/main.ts index ea51c2a83..21f95cd00 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, globalShortcut, Menu, Tray } from 'electron' +import { app, BrowserWindow, Menu, Tray } from 'electron' import { join } from 'path' /** @@ -106,9 +106,6 @@ function createMainWindow() { } function registerGlobalShortcuts() { - // TODO: Toggle below line when build production - // const ret = globalShortcut.register(quickAskHotKey, () => { - // const selectedText = '' const ret = registerShortcut(quickAskHotKey, (selectedText: string) => { if (!windowManager.isQuickAskWindowVisible()) { windowManager.showQuickAskWindow() diff --git a/electron/managers/quickAskWindowConfig.ts b/electron/managers/quickAskWindowConfig.ts index 4a5ce1e5d..eb30e8ebc 100644 --- a/electron/managers/quickAskWindowConfig.ts +++ b/electron/managers/quickAskWindowConfig.ts @@ -6,7 +6,16 @@ export const quickAskWindowConfig: Electron.BrowserWindowConstructorOptions = { width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT, skipTaskbar: true, + acceptFirstMouse: true, + hasShadow: true, + alwaysOnTop: true, + show: false, + fullscreenable: false, resizable: false, + center: true, + movable: false, + maximizable: false, + focusable: true, transparent: true, frame: false, type: 'panel', diff --git a/electron/managers/window.ts b/electron/managers/window.ts index 5a5254bc8..796a5d54a 100644 --- a/electron/managers/window.ts +++ b/electron/managers/window.ts @@ -64,7 +64,6 @@ class WindowManager { this._quickAskWindow.on('blur', () => { this.hideQuickAskWindow() }) - this.hideQuickAskWindow() } isMainWindowVisible(): boolean { diff --git a/web/app/search/UserInput.tsx b/web/app/search/UserInput.tsx index a5fbfc682..3bf148f40 100644 --- a/web/app/search/UserInput.tsx +++ b/web/app/search/UserInput.tsx @@ -18,10 +18,10 @@ const UserInput: React.FC = () => { const selectedText = useAtomValue(selectedTextAtom) useEffect(() => { - if (inputRef.current) { - inputRef.current.focus() - } + inputRef.current?.focus() + }) + useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { window.core?.api?.hideQuickAskWindow() From 82eb31114bd3c0f91c5c733bcb38227538cdfbfd Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 8 Mar 2024 19:25:50 +0900 Subject: [PATCH 061/131] docs: fixing slug --- docs/docs/guides/error-codes/no-assistant-available.mdx | 6 +++--- .../{stuck-on-loading.mdx => stuck-on-loading-model.mdx} | 5 +++-- .../{missing-thread.mdx => thread-disappreance.mdx} | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) rename docs/docs/guides/error-codes/{stuck-on-loading.mdx => stuck-on-loading-model.mdx} (96%) rename docs/docs/guides/error-codes/{missing-thread.mdx => thread-disappreance.mdx} (93%) diff --git a/docs/docs/guides/error-codes/no-assistant-available.mdx b/docs/docs/guides/error-codes/no-assistant-available.mdx index 3dbdbe5f6..31d9a75e9 100644 --- a/docs/docs/guides/error-codes/no-assistant-available.mdx +++ b/docs/docs/guides/error-codes/no-assistant-available.mdx @@ -1,6 +1,6 @@ --- -title: No assistant available -slug: /troubleshooting/no-assistant-available +title: No Assistant Available +sidebar_position: 7 description: Troubleshooting steps to resolve issues no assistant available. keywords: [ @@ -13,10 +13,10 @@ keywords: no-subscription fee, large language model, troubleshooting, + no assistant available, ] --- - When you encounter the following error message: ``` No assistant available. diff --git a/docs/docs/guides/error-codes/stuck-on-loading.mdx b/docs/docs/guides/error-codes/stuck-on-loading-model.mdx similarity index 96% rename from docs/docs/guides/error-codes/stuck-on-loading.mdx rename to docs/docs/guides/error-codes/stuck-on-loading-model.mdx index 38ffed481..95b45e6bf 100644 --- a/docs/docs/guides/error-codes/stuck-on-loading.mdx +++ b/docs/docs/guides/error-codes/stuck-on-loading-model.mdx @@ -1,6 +1,6 @@ --- -title: Stuck on loading model -slug: /troubleshooting/stuck-on-loading +title: Stuck on Loading Model +sidebar_position: 8 description: Troubleshooting steps to resolve issues related to loading model. keywords: [ @@ -13,6 +13,7 @@ keywords: no-subscription fee, large language model, troubleshooting, + stuck on loading model, ] --- diff --git a/docs/docs/guides/error-codes/missing-thread.mdx b/docs/docs/guides/error-codes/thread-disappreance.mdx similarity index 93% rename from docs/docs/guides/error-codes/missing-thread.mdx rename to docs/docs/guides/error-codes/thread-disappreance.mdx index 36bf4a66b..06235df56 100644 --- a/docs/docs/guides/error-codes/missing-thread.mdx +++ b/docs/docs/guides/error-codes/thread-disappreance.mdx @@ -1,6 +1,6 @@ --- title: Thread Disappearance -slug: /troubleshooting/thread-disappearance +sidebar_position: 6 description: Troubleshooting steps to resolve issues threads suddenly disappearance. keywords: [ @@ -13,6 +13,7 @@ keywords: no-subscription fee, large language model, troubleshooting, + thread disappearance, ] --- From 1f6ba881fc619e1c4241c683996df38ab8385e75 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sat, 9 Mar 2024 00:56:19 +0900 Subject: [PATCH 062/131] docs: fix typo --- docs/docs/guides/error-codes/stuck-on-loading-model.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/guides/error-codes/stuck-on-loading-model.mdx b/docs/docs/guides/error-codes/stuck-on-loading-model.mdx index 95b45e6bf..86a16b5fc 100644 --- a/docs/docs/guides/error-codes/stuck-on-loading-model.mdx +++ b/docs/docs/guides/error-codes/stuck-on-loading-model.mdx @@ -1,7 +1,7 @@ --- title: Stuck on Loading Model sidebar_position: 8 -description: Troubleshooting steps to resolve issues related to loading model. +description: Troubleshooting steps to resolve issues related to the loading model. keywords: [ Jan AI, @@ -19,7 +19,7 @@ keywords: ## 1. Issue: Model Loading Stuck Due To Missing Windows Management Instrumentation Command-line (WMIC) -Encountering an stuck on loading model issue in Jan is caused by errors related the `Windows Management Instrumentation Command-line (WMIC)` path not being included in the system's PATH environment variable. +Encountering a stuck-on-loading model issue in Jan is caused by errors related to the `Windows Management Instrumentation Command-line (WMIC)` path not being included in the system's PATH environment variable. Error message: ``` @@ -34,10 +34,10 @@ It can be resolved through the following steps: 2. **Access Environment Variables:** - Go to the "Advanced" tab. - - Click "Environment Variables" button. + - Click the "Environment Variables" button. 3. **Edit System PATH:** - - Under "System Variables," find and select `Path`. + - Under "System Variables" find and select `Path`. - Click "Edit." 4. **Add WMIC Path:** From f5bd8657296468624289fb896a0449c75f1579f7 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sat, 9 Mar 2024 07:48:49 +0900 Subject: [PATCH 063/131] docs: update slogan --- docs/docs/about/about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/about/about.md b/docs/docs/about/about.md index 0f1651c1a..a047ab910 100644 --- a/docs/docs/about/about.md +++ b/docs/docs/about/about.md @@ -18,7 +18,7 @@ keywords: ] --- -Jan turns computers into a thinking machine to change how you use computers. +Jan turns computers into thinking machines to change how we use them. Jan is created and maintained by Jan Labs, a robotics company. With Jan, you can: From d492207c7fedddc01a39f19bce8aef52512f9784 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sat, 9 Mar 2024 19:40:44 +0900 Subject: [PATCH 064/131] docs: fix darkmode issue --- docs/src/css/custom.css | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 7d6bd33d2..fd1f2b384 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -1,3 +1,4 @@ +/* Hide descriptions in cards without a description */ .DocCardList--no-description .card p { display: none; } @@ -7,7 +8,7 @@ --docsearch-hit-active-color: #090a11; /* Keep the color unchanged */ } -/* sidebarStyles.css */ +/* Sidebar styles */ .head_Menu div { font-weight: bold; background-color: whitesmoke; @@ -16,10 +17,9 @@ } .head_Menu li { - /* Custom styles for the sidebar items */ font-weight: normal; background-color: white; - margin-bottom: 5px; /* Adjust margin as needed */ + margin-bottom: 5px; } .head_SubMenu div { @@ -27,4 +27,20 @@ background-color: white; margin-left: 0rem; font-size: medium; -} \ No newline at end of file +} + +/* Dark mode styles based on Docusaurus dark theme */ +[data-theme="dark"] .head_Menu div { + background-color: var(--ifm-background-color); + color: var(--ifm-font-color-base); +} + +[data-theme="dark"] .head_Menu li { + background-color: var(--ifm-background-color); + color: var(--ifm-font-color-base); +} + +[data-theme="dark"] .head_SubMenu div { + background-color: var(--ifm-background-color); + color: var(--ifm-font-color-base); +} From 6359364e2f89fa941f6c62ac39c6d83903698361 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sat, 9 Mar 2024 19:42:11 +0900 Subject: [PATCH 065/131] docs: update groq integration --- docs/docs/guides/integration/groq.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/integration/groq.mdx b/docs/docs/guides/integration/groq.mdx index 01eee1cb3..a57bf16dd 100644 --- a/docs/docs/guides/integration/groq.mdx +++ b/docs/docs/guides/integration/groq.mdx @@ -62,7 +62,7 @@ To set up the configuration for Groq in Jan, follow these steps: "settings": {}, "parameters": {}, "metadata": { - "author": "Mistral ", + "author": "Mistral", "tags": ["Groq Integration"] }, "engine": "openai" From 086f8b207e34eee21618a528c04262776e9cb3eb Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sat, 9 Mar 2024 19:46:35 +0900 Subject: [PATCH 066/131] docs: enhance css style --- docs/src/css/custom.css | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index fd1f2b384..4593f4f94 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -4,43 +4,45 @@ } /* For dark theme */ -[data-theme="dark"] .DocSearch { +[data-theme='dark'] .DocSearch { --docsearch-hit-active-color: #090a11; /* Keep the color unchanged */ } - -/* Sidebar styles */ -.head_Menu div { +/* Sidebar styles based on Docusaurus light theme */ +[data-theme='light'] .head_Menu div { font-weight: bold; - background-color: whitesmoke; + background-color: var(--ifm-background-color); margin-left: 0.7rem; font-size: larger; + color: var(--ifm-font-color-base); } -.head_Menu li { +[data-theme='light'] .head_Menu li { font-weight: normal; - background-color: white; + background-color: var(--ifm-background-color); margin-bottom: 5px; + color: var(--ifm-font-color-base); } -.head_SubMenu div { +[data-theme='light'] .head_SubMenu div { font-weight: normal; - background-color: white; + background-color: var(--ifm-background-color); margin-left: 0rem; font-size: medium; + color: var(--ifm-font-color-base); } /* Dark mode styles based on Docusaurus dark theme */ -[data-theme="dark"] .head_Menu div { +[data-theme='dark'] .head_Menu div { background-color: var(--ifm-background-color); color: var(--ifm-font-color-base); } -[data-theme="dark"] .head_Menu li { +[data-theme='dark'] .head_Menu li { background-color: var(--ifm-background-color); color: var(--ifm-font-color-base); } -[data-theme="dark"] .head_SubMenu div { +[data-theme='dark'] .head_SubMenu div { background-color: var(--ifm-background-color); color: var(--ifm-font-color-base); } From 3e045148b15759b8c83f73a0781d16db4818645c Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sun, 10 Mar 2024 17:27:58 +0900 Subject: [PATCH 067/131] docs: update website-docs content --- docs/README.md | 60 +++++++------ docs/docs/.gitignore | 1 + .../how-we-work/website-docs/website-docs.md | 87 ++++++++++++++++++- 3 files changed, 119 insertions(+), 29 deletions(-) create mode 100644 docs/docs/.gitignore diff --git a/docs/README.md b/docs/README.md index b5d31702f..2b27b354b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,18 +1,18 @@ -# Website +This website is built using [Docusaurus 3.0](https://docusaurus.io/), a modern static website generator. -This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. - -## Information Architecture +### Information Architecture We try to **keep routes consistent** to maintain SEO. -- `/guides`: Guides on how to use the Jan application, with GIFs. For end users who are directly using Jan. Always assume users are not technical. +- **`/guides/`**: Guides on how to use the Jan application. For end users who are directly using Jan. -- `/developer`: Developer docs on how to extend Jan. These pages are about what people can build with our software. We must hide the complexity of HOW the app is built, but explain just enough of the high level architecture so devs know enough to build on top of it. +- **`/developer/`**: Developer docs on how to extend Jan. These pages are about what people can build with our software. -- `/api-reference`: Reference documentation, written in Swagger/OpenAPI format. +- **`/api-reference/`**: Reference documentation for the Jan API server, written in Swagger/OpenAPI format. -- `/docs`: Engineering specs and product specs, i.e. HOW the app is built. Mostly for internal reference and for our core contributors who are building the SDK itself. +- **`/changelog/`**: A list of changes made to the Jan application with each release. + +- **`/blog/`**: A blog for the Jan application. ### Sidebar Autogeneration @@ -20,34 +20,36 @@ The order of each page is either explicitly defined in `sidebar.js` or follows t Important slugs are hardcoded at the document level (and shouldn't be rerouted): -```md +``` --- title: Overview slug: /docs --- ``` -## Contributing +## How to Contribute -### Installation +Refer to the [Contributing Guide](https://github.com/janhq/jan/blob/dev/CONTRIBUTING.md) for more comprehensive information on how to contribute to the Jan project. -``` -$ yarn -``` +### Pre-requisites and Installation -### Local Development +- [Node.js](https://nodejs.org/en/) (version 20.0.0 or higher) +- [yarn](https://yarnpkg.com/) (version 1.22.0 or higher) -``` -$ cp .env.example .env -$ yarn start +#### Installation + +```bash +cd jan/docs +yarn install +yarn start ``` This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. -### Build +#### Build -``` -$ yarn build +```bash +yarn build ``` This command generates static content into the `build` directory and can be served using any static contents hosting service. @@ -56,25 +58,27 @@ This command generates static content into the `build` directory and can be serv Using SSH: -``` -$ USE_SSH=true yarn deploy +```bash +USE_SSH=true yarn deploy ``` Not using SSH: -``` -$ GIT_USER= yarn deploy +```bash +GIT_USER= yarn deploy ``` If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. ### Preview URL, Pre-release and Publishing Documentation -When a PR is created, the preview URL will be automatically commented on the PR. +- When a pull request is created, the preview URL will be automatically commented on the pull request. -The documentation will then be published to [https://jan.ai/](https://jan.ai/) when the PR is merged to `main`. +- The documentation will then be published to [https://dev.jan.ai/](https://dev.jan.ai/) when the pull request is merged to `dev`. + +- Our open-source maintainers will sync the updated content from `dev` to `docs` branch, which will then be published to [https://jan.ai/](https://jan.ai/). ### Additional Plugins - @docusaurus/theme-live-codeblock -- [Redocusaurus](https://redocusaurus.vercel.app/): manually upload swagger files at `/openapi/OpenAPISpec.json` +- [Redocusaurus](https://redocusaurus.vercel.app/): manually upload swagger files at `/openapi/jan.yaml` to update the API reference documentation. diff --git a/docs/docs/.gitignore b/docs/docs/.gitignore new file mode 100644 index 000000000..ff2a8c5fd --- /dev/null +++ b/docs/docs/.gitignore @@ -0,0 +1 @@ +guides/changelogs \ No newline at end of file diff --git a/docs/docs/how-we-work/website-docs/website-docs.md b/docs/docs/how-we-work/website-docs/website-docs.md index a152c6dc9..19fdc1676 100644 --- a/docs/docs/how-we-work/website-docs/website-docs.md +++ b/docs/docs/how-we-work/website-docs/website-docs.md @@ -1,3 +1,88 @@ --- title: Website & Docs ---- \ No newline at end of file +--- + +This website is built using [Docusaurus 3.0](https://docusaurus.io/), a modern static website generator. + +### Information Architecture + +We try to **keep routes consistent** to maintain SEO. + +- **`/guides/`**: Guides on how to use the Jan application. For end users who are directly using Jan. + +- **`/developer/`**: Developer docs on how to extend Jan. These pages are about what people can build with our software. + +- **`/api-reference/`**: Reference documentation for the Jan API server, written in Swagger/OpenAPI format. + +- **`/changelog/`**: A list of changes made to the Jan application with each release. + +- **`/blog/`**: A blog for the Jan application. + +### Sidebar Autogeneration + +The order of each page is either explicitly defined in `sidebar.js` or follows the [Docusaurus autogenerated](https://docusaurus.io/docs/next/sidebar/autogenerated) naming format, `##-path-name.md`. + +Important slugs are hardcoded at the document level (and shouldn't be rerouted): + +``` +--- +title: Overview +slug: /docs +--- +``` + +## How to Contribute + +Refer to the [Contributing Guide](https://github.com/janhq/jan/blob/dev/CONTRIBUTING.md) for more comprehensive information on how to contribute to the Jan project. + +### Pre-requisites and Installation + +- [Node.js](https://nodejs.org/en/) (version 20.0.0 or higher) +- [yarn](https://yarnpkg.com/) (version 1.22.0 or higher) + +#### Installation + +```bash +cd jan/docs +yarn install +yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +#### Build + +```bash +yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +```bash +USE_SSH=true yarn deploy +``` + +Not using SSH: + +```bash +GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. + +### Preview URL, Pre-release and Publishing Documentation + +- When a pull request is created, the preview URL will be automatically commented on the pull request. + +- The documentation will then be published to [https://dev.jan.ai/](https://dev.jan.ai/) when the pull request is merged to `dev`. + +- Our open-source maintainers will sync the updated content from `dev` to `docs` branch, which will then be published to [https://jan.ai/](https://jan.ai/). + +### Additional Plugins + +- @docusaurus/theme-live-codeblock +- [Redocusaurus](https://redocusaurus.vercel.app/): manually upload swagger files at `/openapi/jan.yaml` to update the API reference documentation. From 7cd2a76828b6ce93424d967a32f31a065d4e2b97 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sun, 10 Mar 2024 17:31:26 +0900 Subject: [PATCH 068/131] docs: update README.md --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index 2b27b354b..02330bc80 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,5 @@ +# Website & Docs + This website is built using [Docusaurus 3.0](https://docusaurus.io/), a modern static website generator. ### Information Architecture From 6c9fa258138a1d045851c0e2c965e9d71c4b3d0f Mon Sep 17 00:00:00 2001 From: Henry <150573299+hieu-jan@users.noreply.github.com> Date: Sun, 10 Mar 2024 17:45:06 +0900 Subject: [PATCH 069/131] delete docs/docs/.gitignore --- docs/docs/.gitignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/docs/.gitignore diff --git a/docs/docs/.gitignore b/docs/docs/.gitignore deleted file mode 100644 index ff2a8c5fd..000000000 --- a/docs/docs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -guides/changelogs \ No newline at end of file From 7026d2d594d593b6d7efd991f2ba827c4a12e767 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sun, 10 Mar 2024 18:19:19 +0900 Subject: [PATCH 070/131] feat: update changelog configuration --- docs/plugins/changelog-plugin/fetchData.js | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/docs/plugins/changelog-plugin/fetchData.js b/docs/plugins/changelog-plugin/fetchData.js index dce30c147..351ab3932 100644 --- a/docs/plugins/changelog-plugin/fetchData.js +++ b/docs/plugins/changelog-plugin/fetchData.js @@ -6,14 +6,13 @@ async function fetchData(siteConfig) { const repo = siteConfig.projectName; const apiUrl = `https://api.github.com/repos/${owner}/${repo}/releases`; - const outputDirectory = path.join(__dirname, '../../docs/guides/changelogs'); + const outputDirectory = path.join(__dirname, '../../docs/releases/changelog'); if (!fs.existsSync(outputDirectory)) { fs.mkdirSync(outputDirectory); } let counter = 1; - const categoryFilePath = path.join(outputDirectory, '_category_.json'); const cacheFilePath = path.join(outputDirectory, 'cache.json'); let cachedData = {}; @@ -83,7 +82,7 @@ async function fetchData(siteConfig) { const changes = release.body; - let markdownContent = `---\nsidebar_position: ${counter}\n---\n# ${version}\n\nFor more details, [GitHub Issues](${releaseUrl})\n\nHighlighted Issue: ${issueLink}\n\n${changes}\n`; + let markdownContent = `---\nsidebar_position: ${counter}\nslug: /changelog/changelog-${version}\n---\n# ${version}\n\nFor more details, [GitHub Issues](${releaseUrl})\n\nHighlighted Issue: ${issueLink}\n\n${changes}\n`; // Write to a separate markdown file for each version const outputFilePath = path.join(outputDirectory, `changelog-${version}.mdx`); @@ -93,20 +92,6 @@ async function fetchData(siteConfig) { counter++; } - - // Create _category_.json file - const categoryContent = { - label: 'Changelogs', - position: 5, - link: { - type: 'generated-index', - description: 'Changelog for Jan', - }, - }; - - fs.writeFileSync(categoryFilePath, JSON.stringify(categoryContent, null, 2), 'utf-8'); - - console.log(`_category_.json has been created at: ${categoryFilePath}`); } -module.exports = fetchData; +module.exports = fetchData; \ No newline at end of file From 90d208a22827a01d016f1fec8f507cc87ad46744 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Sun, 10 Mar 2024 18:28:53 +0900 Subject: [PATCH 071/131] feat: fetching changelogs --- .../releases/changelog/changelog-v0.2.0.mdx | 72 ++-- .../releases/changelog/changelog-v0.2.1.mdx | 164 ++++---- .../releases/changelog/changelog-v0.2.2.mdx | 64 +-- .../releases/changelog/changelog-v0.2.3.mdx | 38 +- .../releases/changelog/changelog-v0.3.0.mdx | 38 +- .../releases/changelog/changelog-v0.3.1.mdx | 134 +++---- .../releases/changelog/changelog-v0.3.2.mdx | 70 ++-- .../releases/changelog/changelog-v0.3.3.mdx | 180 ++++----- .../releases/changelog/changelog-v0.4.0.mdx | 128 +++--- .../releases/changelog/changelog-v0.4.1.mdx | 102 ++--- .../releases/changelog/changelog-v0.4.2.mdx | 78 ++-- .../releases/changelog/changelog-v0.4.3.mdx | 116 +++--- .../releases/changelog/changelog-v0.4.4.mdx | 374 +++++++++--------- .../releases/changelog/changelog-v0.4.5.mdx | 184 ++++----- .../releases/changelog/changelog-v0.4.6.mdx | 106 ++--- .../releases/changelog/changelog-v0.4.7.mdx | 214 +++++----- 16 files changed, 1031 insertions(+), 1031 deletions(-) diff --git a/docs/docs/releases/changelog/changelog-v0.2.0.mdx b/docs/docs/releases/changelog/changelog-v0.2.0.mdx index 2115095ca..5e2225cf3 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.0.mdx @@ -8,40 +8,40 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2 Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs](https://github.com/janhq/jan/pull/342) -## Changes - -- feat: Add Jan Hacker House event page to Docs @dan-jan (#342) -- feat: Hide incomplete Hardware section from Docs site @dan-jan (#341) -- style: better chatbox ui @0xSage (#338) -- feat: allowing user to fetch models from github @namchuai (#319) -- fixes: #247 - inference plugin should check nitro service available @louis-jan (#313) -- Fix icon error for linux app @hiento09 (#316) -- docs: initial hardware content @Its-Alamin-H (#240) -- fixes #277 - bug: memory utilization always at 99% @louis-jan (#309) -- Docusaurus parser string from githubapi to get latest release @hiento09 (#312) -- Footer background, CTA \& Highlight colors @drakehere (#288) -- Fix CI Test run failed on ubuntu and change release file app name @hiento09 (#307) -- Add docusaurus test build pipeline @hiento09 (#302) -- fix: #271 Cannot read properties of undefined (reading 'map') @louis-jan (#300) -- Fix Docusaurus server side render error @hiento09 (#301) -- fix #283: small ui fixes @namchuai (#299) - -## 🐛 Bug Fixes - -- Fix #290: Add description in package.json and rename to jan @hiento09 (#333) - -## 🧰 Maintenance - -- Add Documentation category to release note template @hiento09 (#332) -- Chore/release note template @hiento09 (#323) -- Add release note template @hiento09 (#322) - -## 📖 Documentaion - -- Add auto update app download url on jan.ai @hiento09 (#311) -- docs: update per v0.1.3 @0xSage (#280) - -## Contributor - -@0xSage, @Its-Alamin-H, @dan-jan, @drakehere, @hiento09, @hientominh, @louis-jan, @namchuai, Hien To and James +## Changes + +- feat: Add Jan Hacker House event page to Docs @dan-jan (#342) +- feat: Hide incomplete Hardware section from Docs site @dan-jan (#341) +- style: better chatbox ui @0xSage (#338) +- feat: allowing user to fetch models from github @namchuai (#319) +- fixes: #247 - inference plugin should check nitro service available @louis-jan (#313) +- Fix icon error for linux app @hiento09 (#316) +- docs: initial hardware content @Its-Alamin-H (#240) +- fixes #277 - bug: memory utilization always at 99% @louis-jan (#309) +- Docusaurus parser string from githubapi to get latest release @hiento09 (#312) +- Footer background, CTA \& Highlight colors @drakehere (#288) +- Fix CI Test run failed on ubuntu and change release file app name @hiento09 (#307) +- Add docusaurus test build pipeline @hiento09 (#302) +- fix: #271 Cannot read properties of undefined (reading 'map') @louis-jan (#300) +- Fix Docusaurus server side render error @hiento09 (#301) +- fix #283: small ui fixes @namchuai (#299) + +## 🐛 Bug Fixes + +- Fix #290: Add description in package.json and rename to jan @hiento09 (#333) + +## 🧰 Maintenance + +- Add Documentation category to release note template @hiento09 (#332) +- Chore/release note template @hiento09 (#323) +- Add release note template @hiento09 (#322) + +## 📖 Documentaion + +- Add auto update app download url on jan.ai @hiento09 (#311) +- docs: update per v0.1.3 @0xSage (#280) + +## Contributor + +@0xSage, @Its-Alamin-H, @dan-jan, @drakehere, @hiento09, @hientominh, @louis-jan, @namchuai, Hien To and James diff --git a/docs/docs/releases/changelog/changelog-v0.2.1.mdx b/docs/docs/releases/changelog/changelog-v0.2.1.mdx index 5afc5999b..97e1052a3 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.1.mdx @@ -8,86 +8,86 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2 Highlighted Issue: [Issue #446: fix: model is started but the indicator is not stopped loading](https://github.com/janhq/jan/pull/446) -## Changes - -- fix: model is started but the indicator is not stopped loading @louis-jan (#446) -- fix: bring back install plugin manually function @louis-jan (#448) -- fix: duplicated messages when user switch between conversations @namchuai (#441) -- chore: added loader starting and stopping model @urmauur (#438) -- chore: Change license to AGPL @dan-jan (#442) -- fix: plugin \& model catalog import cache are not cleared properly @louis-jan (#437) -- fix error codesign @hiento09 (#439) -- fix: app version and cleanup unused code @urmauur (#434) -- chore: update core service - get plugin manifest @louis-jan (#432) -- ui: interface revamp @urmauur (#429) -- fix: scroll on explore models does not work @namchuai (#427) -- feat: adding create bot functionality @namchuai (#368) -- chore: install or update a plugin should not interrupt dev process @louis-jan (#420) -- chore: Update nitro 0.1.2 windows/ linux @vuonghoainam (#421) -- chore: update core service enums @louis-jan (#414) -- feat: chat with documents plugin @louis-jan (#417) -- misc: setup prettier @urmauur (#412) -- adr: 007 - Jan Plugin Catalog @louis-jan (#408) -- adr: 006 - Jan Core Module @louis-jan (#404) -- feat: Support for nitro release 0.1.2 @vuonghoainam (#409) -- feat: explore plugins from the npm repository and install them remotely @louis-jan (#399) -- feat: fix event description @dan-jan (#400) -- fix: high cpu usage @louis-jan (#401) -- docs: model installation ADR @0xSage (#390) -- chore: update core events module @louis-jan (#394) -- feat: Update Social OG Image and Meta Description @dan-jan (#387) -- misc: UI home @urmauur (#392) -- Update hcmc-oct23.md @0xSage (#389) -- chore: remove deprecated extension functions @louis-jan (#388) -- Fix bugs image overlap dropdown button download @urmauur (#384) -- chore: resolve fetch models api limit rate @louis-jan (#383) -- chore: update convo summary @louis-jan (#378) -- Update interface landing page @urmauur (#381) -- Add simple copywriting changes @dan-jan (#382) -- chore: update core services and module export @louis-jan (#376) -- chore: #371 - reference to plugin name and module path as variables @louis-jan (#372) -- feat: Edit event details, hide all unnecessary website sections @dan-jan (#369) -- docs: UI Service ADR @0xSage (#318) -- Feat/issue 255 adr 001 jand cloud native @nam-john-ho (#262) -- Move plugins folder from electron to root folder @hiento09 (#366) -- feature: core plugin support events \& preferences modules @louis-jan (#365) -- Fix/250 @namchuai (#349) -- Change License and update README @dan-jan (#356) -- Jan 339 @dan-jan (#348) -- feat: Jan 339 @dan-jan (#347) -- Add social og:image @dan-jan (#346) -- feat(ard): Add adr 002 @vuonghoainam (#261) - -## 🚀 Features - -- #357 plugin \& app can subscribe and emit events @louis-jan (#358) -- feature: @janhq/plugin-core module \& usage @louis-jan (#321) - -## 🐛 Bug Fixes - -- Change to load nitron on windows and linux from bash/shell script @hiento09 (#451) -- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) -- Correct version of plugins @hiento09 (#374) - -## 🧰 Maintenance - -- upgrade leveldown to newest version @hiento09 (#447) -- Update auto-sign plugin by search file permission 664 @hiento09 (#445) -- Change codesign plugin folder in ci @hiento09 (#440) -- Add continue on error for import cert @hiento09 (#436) -- Update code siging for new data plugin @hiento09 (#433) -- Add readme inference plugin @hiento09 (#426) -- Add username to remote origin @hiento09 (#425) -- Add auto create PR to plugin-catalog when a new version of plugin is … @hiento09 (#416) -- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) -- Chore/remove package lock @hiento09 (#398) -- Refactor cicd @hiento09 (#397) -- Correct version of plugins @hiento09 (#374) -- Rename plugin-core to core @hiento09 (#370) -- Fix error check change in plugins folder @hiento09 (#367) -- chore: jan.ai nits @0xSage (#354) - -## Contributor - -@0xSage, @dan-jan, @hiento09, @jan-service-account, @louis-jan, @nam-john-ho, @namchuai, @tikikun, @urmauur, @vuonghoainam and Hien To +## Changes + +- fix: model is started but the indicator is not stopped loading @louis-jan (#446) +- fix: bring back install plugin manually function @louis-jan (#448) +- fix: duplicated messages when user switch between conversations @namchuai (#441) +- chore: added loader starting and stopping model @urmauur (#438) +- chore: Change license to AGPL @dan-jan (#442) +- fix: plugin \& model catalog import cache are not cleared properly @louis-jan (#437) +- fix error codesign @hiento09 (#439) +- fix: app version and cleanup unused code @urmauur (#434) +- chore: update core service - get plugin manifest @louis-jan (#432) +- ui: interface revamp @urmauur (#429) +- fix: scroll on explore models does not work @namchuai (#427) +- feat: adding create bot functionality @namchuai (#368) +- chore: install or update a plugin should not interrupt dev process @louis-jan (#420) +- chore: Update nitro 0.1.2 windows/ linux @vuonghoainam (#421) +- chore: update core service enums @louis-jan (#414) +- feat: chat with documents plugin @louis-jan (#417) +- misc: setup prettier @urmauur (#412) +- adr: 007 - Jan Plugin Catalog @louis-jan (#408) +- adr: 006 - Jan Core Module @louis-jan (#404) +- feat: Support for nitro release 0.1.2 @vuonghoainam (#409) +- feat: explore plugins from the npm repository and install them remotely @louis-jan (#399) +- feat: fix event description @dan-jan (#400) +- fix: high cpu usage @louis-jan (#401) +- docs: model installation ADR @0xSage (#390) +- chore: update core events module @louis-jan (#394) +- feat: Update Social OG Image and Meta Description @dan-jan (#387) +- misc: UI home @urmauur (#392) +- Update hcmc-oct23.md @0xSage (#389) +- chore: remove deprecated extension functions @louis-jan (#388) +- Fix bugs image overlap dropdown button download @urmauur (#384) +- chore: resolve fetch models api limit rate @louis-jan (#383) +- chore: update convo summary @louis-jan (#378) +- Update interface landing page @urmauur (#381) +- Add simple copywriting changes @dan-jan (#382) +- chore: update core services and module export @louis-jan (#376) +- chore: #371 - reference to plugin name and module path as variables @louis-jan (#372) +- feat: Edit event details, hide all unnecessary website sections @dan-jan (#369) +- docs: UI Service ADR @0xSage (#318) +- Feat/issue 255 adr 001 jand cloud native @nam-john-ho (#262) +- Move plugins folder from electron to root folder @hiento09 (#366) +- feature: core plugin support events \& preferences modules @louis-jan (#365) +- Fix/250 @namchuai (#349) +- Change License and update README @dan-jan (#356) +- Jan 339 @dan-jan (#348) +- feat: Jan 339 @dan-jan (#347) +- Add social og:image @dan-jan (#346) +- feat(ard): Add adr 002 @vuonghoainam (#261) + +## 🚀 Features + +- #357 plugin \& app can subscribe and emit events @louis-jan (#358) +- feature: @janhq/plugin-core module \& usage @louis-jan (#321) + +## 🐛 Bug Fixes + +- Change to load nitron on windows and linux from bash/shell script @hiento09 (#451) +- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) +- Correct version of plugins @hiento09 (#374) + +## 🧰 Maintenance + +- upgrade leveldown to newest version @hiento09 (#447) +- Update auto-sign plugin by search file permission 664 @hiento09 (#445) +- Change codesign plugin folder in ci @hiento09 (#440) +- Add continue on error for import cert @hiento09 (#436) +- Update code siging for new data plugin @hiento09 (#433) +- Add readme inference plugin @hiento09 (#426) +- Add username to remote origin @hiento09 (#425) +- Add auto create PR to plugin-catalog when a new version of plugin is … @hiento09 (#416) +- Fix data-plugin install failed on mac silicon from npm @hiento09 (#413) +- Chore/remove package lock @hiento09 (#398) +- Refactor cicd @hiento09 (#397) +- Correct version of plugins @hiento09 (#374) +- Rename plugin-core to core @hiento09 (#370) +- Fix error check change in plugins folder @hiento09 (#367) +- chore: jan.ai nits @0xSage (#354) + +## Contributor + +@0xSage, @dan-jan, @hiento09, @jan-service-account, @louis-jan, @nam-john-ho, @namchuai, @tikikun, @urmauur, @vuonghoainam and Hien To diff --git a/docs/docs/releases/changelog/changelog-v0.2.2.mdx b/docs/docs/releases/changelog/changelog-v0.2.2.mdx index 54a317bff..54d1a8bbf 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.2.mdx @@ -8,36 +8,36 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2 Highlighted Issue: [Issue #469: chore: plugin and app version dependency](https://github.com/janhq/jan/pull/469) -## Changes - -- chore: plugin and app version dependency @louis-jan (#469) -- bug: showing a modal when user start conf but model not active @urmauur (#466) -- fix: duplicated modal and loading state @louis-jan (#465) -- bug: fix overflow scroll horizontal message @urmauur (#464) -- bug: avoid chat body scroll horizontal @urmauur (#462) -- bug: fix logic plugin update plugin and show installed version @urmauur (#459) -- bug: chat view drops enumeration @urmauur (#456) -- fix: allow switching models when switch between conversations @namchuai (#458) -- fix: CI run fails on windows @louis-jan (#463) -- fix: failed to build electron app @louis-jan (#461) -- fix: correct app version display @louis-jan (#452) -- fix: enable link color blue on docusaurus markdown @urmauur (#449) - -## 🚀 Features - -- feat: Add ADR-008 for extensible Jan @vuonghoainam (#431) - -## 🐛 Bug Fixes - -- data-plugin force leveldown to 6.1.1 @hiento09 (#453) - -## 🧰 Maintenance - -- Use electron-rebuild to build leveldown@5.6.0 for darwin arm64 @hiento09 (#455) -- data-plugin force leveldown back to 5.6.0 and rebuild for darwin arm64 @hiento09 (#454) -- data-plugin force leveldown to 6.1.1 @hiento09 (#453) - -## Contributor - -@hiento09, @jan-service-account, @louis-jan, @namchuai, @urmauur and @vuonghoainam +## Changes + +- chore: plugin and app version dependency @louis-jan (#469) +- bug: showing a modal when user start conf but model not active @urmauur (#466) +- fix: duplicated modal and loading state @louis-jan (#465) +- bug: fix overflow scroll horizontal message @urmauur (#464) +- bug: avoid chat body scroll horizontal @urmauur (#462) +- bug: fix logic plugin update plugin and show installed version @urmauur (#459) +- bug: chat view drops enumeration @urmauur (#456) +- fix: allow switching models when switch between conversations @namchuai (#458) +- fix: CI run fails on windows @louis-jan (#463) +- fix: failed to build electron app @louis-jan (#461) +- fix: correct app version display @louis-jan (#452) +- fix: enable link color blue on docusaurus markdown @urmauur (#449) + +## 🚀 Features + +- feat: Add ADR-008 for extensible Jan @vuonghoainam (#431) + +## 🐛 Bug Fixes + +- data-plugin force leveldown to 6.1.1 @hiento09 (#453) + +## 🧰 Maintenance + +- Use electron-rebuild to build leveldown@5.6.0 for darwin arm64 @hiento09 (#455) +- data-plugin force leveldown back to 5.6.0 and rebuild for darwin arm64 @hiento09 (#454) +- data-plugin force leveldown to 6.1.1 @hiento09 (#453) + +## Contributor + +@hiento09, @jan-service-account, @louis-jan, @namchuai, @urmauur and @vuonghoainam diff --git a/docs/docs/releases/changelog/changelog-v0.2.3.mdx b/docs/docs/releases/changelog/changelog-v0.2.3.mdx index 20ae6e077..72dfbbd8a 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.3.mdx @@ -8,23 +8,23 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2 Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https://github.com/janhq/jan/pull/482) -## Changes - -- fix: hide preferences section if empty @louis-jan (#482) -- chore: fix conversation summary @louis-jan (#480) -- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) -- fix: download now change state immediately @namchuai (#475) -- chore: add required app version to edge release plugin @louis-jan (#471) - -## 🐛 Bug Fixes - -- add rebuild for mac x64 @hiento09 (#473) - -## 🧰 Maintenance - -- Add build deps for data-plugin in CI @hiento09 (#472) - -## Contributor - -@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai +## Changes + +- fix: hide preferences section if empty @louis-jan (#482) +- chore: fix conversation summary @louis-jan (#480) +- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) +- fix: download now change state immediately @namchuai (#475) +- chore: add required app version to edge release plugin @louis-jan (#471) + +## 🐛 Bug Fixes + +- add rebuild for mac x64 @hiento09 (#473) + +## 🧰 Maintenance + +- Add build deps for data-plugin in CI @hiento09 (#472) + +## Contributor + +@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai diff --git a/docs/docs/releases/changelog/changelog-v0.3.0.mdx b/docs/docs/releases/changelog/changelog-v0.3.0.mdx index 5c0d94400..603cc8f29 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.0.mdx @@ -8,23 +8,23 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3 Highlighted Issue: [Issue #482: fix: hide preferences section if empty](https://github.com/janhq/jan/pull/482) -## Changes - -- fix: hide preferences section if empty @louis-jan (#482) -- chore: fix conversation summary @louis-jan (#480) -- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) -- fix: download now change state immediately @namchuai (#475) -- chore: add required app version to edge release plugin @louis-jan (#471) - -## 🐛 Bug Fixes - -- add rebuild for mac x64 @hiento09 (#473) - -## 🧰 Maintenance - -- Add build deps for data-plugin in CI @hiento09 (#472) - -## Contributor - -@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai +## Changes + +- fix: hide preferences section if empty @louis-jan (#482) +- chore: fix conversation summary @louis-jan (#480) +- chore: missing create conversation button when there is no conversation is selected @louis-jan (#478) +- fix: download now change state immediately @namchuai (#475) +- chore: add required app version to edge release plugin @louis-jan (#471) + +## 🐛 Bug Fixes + +- add rebuild for mac x64 @hiento09 (#473) + +## 🧰 Maintenance + +- Add build deps for data-plugin in CI @hiento09 (#472) + +## Contributor + +@hiento09, @hientominh, @jan-service-account, @louis-jan and @namchuai diff --git a/docs/docs/releases/changelog/changelog-v0.3.1.mdx b/docs/docs/releases/changelog/changelog-v0.3.1.mdx index c636db7c8..531882196 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.1.mdx @@ -8,71 +8,71 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3 Highlighted Issue: [Issue #580: fix: preformatted text indents the first line strangely](https://github.com/janhq/jan/pull/580) -## Changes - -- fix: preformatted text indents the first line strangely @louis-jan (#580) -- fix: failed to package app since core and uikit are not being built @louis-jan (#575) -- cleanup: remove component folder and cleanup conversation screen @urmauur (#574) -- bug: update convo state when user change model @urmauur (#571) -- fix(#566): jan cannot retrieve the conversations @namchuai (#570) -- bug: Toast messages shows [object object] @urmauur (#569) -- ui: improve state of welcome screen @urmauur (#563) -- chore: fixed an issue where app does not yield message result @louis-jan (#561) -- Update readme @urmauur (#560) -- ui: standalone UIKit and refactor @urmauur (#557) -- Small description changes @dan-jan (#558) -- add 'change download button based on OS' feature @Vikram-2004 (#551) -- feat: revamp plugin architecture @louis-jan (#535) -- Fix mobile padding @imtuyethan (#550) -- chore: Update Readme @dan-jan (#549) -- Update Homepage and README with 1-line pitch @dan-jan (#548) -- docs: Add About, Events, Blog @dan-jan (#546) -- Ashley/update website content @imtuyethan (#545) -- Add guides @hahuyhoang411 (#488) -- Structure Docs @dan-jan (#536) -- Update README.md @imtuyethan (#533) -- Chore: Setup "Jan Improvements Proposal" workflow @dan-jan (#534) -- Update website tag line @imtuyethan (#527) -- fix: #396 - allow user to cancel a model download @louis-jan (#530) -- fix: #479 - Toggle plugin is now experimental feature @louis-jan (#531) -- chore: disable app update on test @louis-jan (#521) -- bug: chat UI is not consistent @urmauur (#520) -- refactor: plugin manager and execution as ts @louis-jan (#504) -- fix: app toolbar is gone on windows @louis-jan (#503) -- Chore: refactor code, hide plugin menu in web @ghost (#502) -- fix: dest.end is not a function @louis-jan (#501) -- #255: Jan cloud native @ghost (#320) -- bug: download new version should show in status bar @urmauur (#500) -- feat: add New Conversation button on the conversation sidebar @urmauur (#499) -- chore: update plugin readme @louis-jan (#497) -- chore: update plugins license @louis-jan (#496) -- #255: Read plugins manifest from CDN @ghost (#495) -- chore: update plugin sdk - add appDataPath @louis-jan (#492) -- chore: enable back bot function for edge-release @louis-jan (#474) -- chore: attempt to kill Nitro subprocesses @louis-jan (#484) -- docs: new dev hub @0xSage (#450) - -## 🚀 Features - -- feat: Experimental Feature Toggle @louis-jan (#525) - -## 🐛 Bug Fixes - -- Add rebuild leveldown for arm on mac intel @hiento09 (#487) - -## 🧰 Maintenance - -- Bump nitro version from 0.1.4 to 0.1.6 @hiento09 (#581) -- Add set yarn network timeout for uikit @hiento09 (#579) -- Fix error CI e2e run failed on windows @hiento09 (#578) -- Fix build plugins macos codesiging error @hiento09 (#576) -- Add install nitro mac intel inference plugin build locally @hiento09 (#542) -- Bump nitro version to 0.1.4 @hiento09 (#532) -- Chore/update yarn dev script @hiento09 (#529) -- Inference Plugin pull nitro binary from release @hiento09 (#524) -- Correct version and license @hiento09 (#498) - -## Contributor - -@0xSage, @Vikram-2004, @dan-jan, @hahuyhoang411, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai, @tikikun, @urmauur, Han, James, John and nam-john-ho +## Changes + +- fix: preformatted text indents the first line strangely @louis-jan (#580) +- fix: failed to package app since core and uikit are not being built @louis-jan (#575) +- cleanup: remove component folder and cleanup conversation screen @urmauur (#574) +- bug: update convo state when user change model @urmauur (#571) +- fix(#566): jan cannot retrieve the conversations @namchuai (#570) +- bug: Toast messages shows [object object] @urmauur (#569) +- ui: improve state of welcome screen @urmauur (#563) +- chore: fixed an issue where app does not yield message result @louis-jan (#561) +- Update readme @urmauur (#560) +- ui: standalone UIKit and refactor @urmauur (#557) +- Small description changes @dan-jan (#558) +- add 'change download button based on OS' feature @Vikram-2004 (#551) +- feat: revamp plugin architecture @louis-jan (#535) +- Fix mobile padding @imtuyethan (#550) +- chore: Update Readme @dan-jan (#549) +- Update Homepage and README with 1-line pitch @dan-jan (#548) +- docs: Add About, Events, Blog @dan-jan (#546) +- Ashley/update website content @imtuyethan (#545) +- Add guides @hahuyhoang411 (#488) +- Structure Docs @dan-jan (#536) +- Update README.md @imtuyethan (#533) +- Chore: Setup "Jan Improvements Proposal" workflow @dan-jan (#534) +- Update website tag line @imtuyethan (#527) +- fix: #396 - allow user to cancel a model download @louis-jan (#530) +- fix: #479 - Toggle plugin is now experimental feature @louis-jan (#531) +- chore: disable app update on test @louis-jan (#521) +- bug: chat UI is not consistent @urmauur (#520) +- refactor: plugin manager and execution as ts @louis-jan (#504) +- fix: app toolbar is gone on windows @louis-jan (#503) +- Chore: refactor code, hide plugin menu in web @ghost (#502) +- fix: dest.end is not a function @louis-jan (#501) +- #255: Jan cloud native @ghost (#320) +- bug: download new version should show in status bar @urmauur (#500) +- feat: add New Conversation button on the conversation sidebar @urmauur (#499) +- chore: update plugin readme @louis-jan (#497) +- chore: update plugins license @louis-jan (#496) +- #255: Read plugins manifest from CDN @ghost (#495) +- chore: update plugin sdk - add appDataPath @louis-jan (#492) +- chore: enable back bot function for edge-release @louis-jan (#474) +- chore: attempt to kill Nitro subprocesses @louis-jan (#484) +- docs: new dev hub @0xSage (#450) + +## 🚀 Features + +- feat: Experimental Feature Toggle @louis-jan (#525) + +## 🐛 Bug Fixes + +- Add rebuild leveldown for arm on mac intel @hiento09 (#487) + +## 🧰 Maintenance + +- Bump nitro version from 0.1.4 to 0.1.6 @hiento09 (#581) +- Add set yarn network timeout for uikit @hiento09 (#579) +- Fix error CI e2e run failed on windows @hiento09 (#578) +- Fix build plugins macos codesiging error @hiento09 (#576) +- Add install nitro mac intel inference plugin build locally @hiento09 (#542) +- Bump nitro version to 0.1.4 @hiento09 (#532) +- Chore/update yarn dev script @hiento09 (#529) +- Inference Plugin pull nitro binary from release @hiento09 (#524) +- Correct version and license @hiento09 (#498) + +## Contributor + +@0xSage, @Vikram-2004, @dan-jan, @hahuyhoang411, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai, @tikikun, @urmauur, Han, James, John and nam-john-ho diff --git a/docs/docs/releases/changelog/changelog-v0.3.2.mdx b/docs/docs/releases/changelog/changelog-v0.3.2.mdx index 01e403ef9..b62a878d1 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.2.mdx @@ -8,39 +8,39 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3 Highlighted Issue: [Issue #612: fix: disabled required env](https://github.com/janhq/jan/pull/612) -## Changes - -- fix: disabled required env @urmauur (#612) -- Install Posthog snippet @imtuyethan (#573) -- web: google tag manager @urmauur (#562) -- docs: fix syntax highlighting @0xSage (#602) -- chore: remove past event @0xSage (#600) -- docs: new docs @0xSage (#599) -- [chore]: Update docs @dan-jan (#597) - -## 🚀 Features - -- refactor: main electron with managers and handlers @louis-jan (#610) - -## 🐛 Bug Fixes - -- Fix: Failed to load model - unload model nitro @louis-jan (#616) -- Restore cpx nitro step in yarn script @hiento09 (#617) -- fix(#591): prevent duplicate message id issue @namchuai (#595) -- bug: cancelling a model download should be delete the model file on user data @urmauur (#613) -- bug: fix weird padding vertical snippet code @urmauur (#608) -- bug: Fix button download detect intel or apple silicon @urmauur (#609) -- bug: enable delete conversation after deleted model @urmauur (#594) -- bug: download modal should truncate model name @urmauur (#592) -- bug: support multiple line input chat using Textarea instead @urmauur (#593) - -## 🧰 Maintenance - -- refactor: main electron with managers and handlers @louis-jan (#610) -- Chore/refactor yarn script @hiento09 (#615) -- fix: line height and update typography component @urmauur (#611) - -## Contributor - -@0xSage, @dan-jan, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai and @urmauur +## Changes + +- fix: disabled required env @urmauur (#612) +- Install Posthog snippet @imtuyethan (#573) +- web: google tag manager @urmauur (#562) +- docs: fix syntax highlighting @0xSage (#602) +- chore: remove past event @0xSage (#600) +- docs: new docs @0xSage (#599) +- [chore]: Update docs @dan-jan (#597) + +## 🚀 Features + +- refactor: main electron with managers and handlers @louis-jan (#610) + +## 🐛 Bug Fixes + +- Fix: Failed to load model - unload model nitro @louis-jan (#616) +- Restore cpx nitro step in yarn script @hiento09 (#617) +- fix(#591): prevent duplicate message id issue @namchuai (#595) +- bug: cancelling a model download should be delete the model file on user data @urmauur (#613) +- bug: fix weird padding vertical snippet code @urmauur (#608) +- bug: Fix button download detect intel or apple silicon @urmauur (#609) +- bug: enable delete conversation after deleted model @urmauur (#594) +- bug: download modal should truncate model name @urmauur (#592) +- bug: support multiple line input chat using Textarea instead @urmauur (#593) + +## 🧰 Maintenance + +- refactor: main electron with managers and handlers @louis-jan (#610) +- Chore/refactor yarn script @hiento09 (#615) +- fix: line height and update typography component @urmauur (#611) + +## Contributor + +@0xSage, @dan-jan, @hiento09, @imtuyethan, @jan-service-account, @louis-jan, @namchuai and @urmauur diff --git a/docs/docs/releases/changelog/changelog-v0.3.3.mdx b/docs/docs/releases/changelog/changelog-v0.3.3.mdx index 9d8e75076..66a871186 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.3.mdx @@ -8,94 +8,94 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.3 Highlighted Issue: [Issue #719: docs: cleanup](https://github.com/janhq/jan/pull/719) -## Changes - -- docs: cleanup @0xSage (#719) -- docs: threads and messages @0xSage (#681) -- Updating Onboarding Kit @Diane0111 (#675) -- Update issue templates @0xSage (#685) -- docs: polish models spec @0xSage (#680) -- Feature: Preview URL for each PR and add pre-release.jan.ai as staging of Jan Docs @hiento09 (#669) -- Migrate Model definitions to Swagger/OpenAPI @dan-jan (#659) -- [docs] Add Introduction and refactor Models Spec @dan-jan (#657) -- docs: Add model methods to swagger @0xSage (#660) -- Models Spec: Delete broken Markdown links @dan-jan (#648) -- docs: assistants and threads specs @0xSage (#646) - -## 🚀 Features - -- improvement: styling message action toolbar @urmauur (#737) -- experimental: allow user to give instruction for the conversation @louis-jan (#714) -- docs/enable-seo-docusaurus @hieu-jan (#725) -- Add windows code sign to CI @hiento09 (#712) -- docs: update installation guide @hieu-jan (#664) -- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) -- docs: add OpenAI swagger file @hieu-jan (#623) -- Update landing page Jan @urmauur (#638) - -## 🐛 Bug Fixes - -- chore: open app data should lead user to jan root @louis-jan (#749) -- fix: cancel download does not work @louis-jan (#746) -- fix: error when switching between threads @louis-jan (#736) -- chore: app raises error when attempting to start a model that is already starting @louis-jan (#721) -- bug: fix filter list menu from command base on search type and make a symbol base on OS @urmauur (#723) -- bug: fix clickable small download button on chat screen @urmauur (#722) -- fix: incorrect update progress bar visibility check @louis-jan (#713) -- fix: app shows wrong performance tag, all say not enough ram on windows @louis-jan (#699) -- bug: fix padding quotations and numbering list @urmauur (#695) -- fix: local npm module update does not reflect web app @louis-jan (#677) -- [bug] fix markdown todo items shifted to the left and remove the dots @urmauur (#694) -- bug: fix footer and section spacing landing page @urmauur (#683) -- bug: fix anchor link sidebar openapi @urmauur (#668) -- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) -- bug: fix titles should have spaces in between @urmauur (#652) -- bug: fix compatibility content not fully display @urmauur (#653) - -## 🧰 Maintenance - -- chore: fix app grammar @0xSage (#750) -- chore: bumb nitro version @louis-jan (#740) -- chore: fs module should not cover app logic @louis-jan (#720) -- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) -- docs: upgrade mdx-js package @hieu-jan (#705) -- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) -- Fix error docs pipeline run failed @hiento09 (#702) -- Revert docs CICD trigger on push to main instead of tag-based @hiento09 (#698) -- fix: local npm module update does not reflect web app @louis-jan (#677) -- Chore: refactor to makefile @hiento09 (#691) -- Add Instruction to publish docs @hiento09 (#687) -- chore/add-mermaid @hieu-jan (#672) -- chore/update package docs @hieu-jan (#670) -- Enhance Cross-Platform Argument Handling for Nitro Startup Scripts @hiento09 (#674) -- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) -- docs: add OpenAI swagger file @hieu-jan (#623) -- Preliminary Restructure of Docs @dan-jan (#655) -- Model specs @vuonghoainam (#641) -- refactor: refactor app entities @louis-jan (#626) -- refactor: move file to jan root @namchuai (#598) -- Add run-script-os @linhtran174 (#620) -- Refactor Jan Documentation @dan-jan (#625) - -## 📖 Documentaion - -- docs: update specs/product @0xSage (#744) -- docs/enable-seo-docusaurus @hieu-jan (#725) -- docs: assistant spec @vuonghoainam (#707) -- docs: Refactor Jan Site Structure @dan-jan (#706) -- docs/improve install docs @hieu-jan (#708) -- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) -- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) -- docs: update installation guide @hieu-jan (#664) -- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) -- docs: add OpenAI swagger file @hieu-jan (#623) -- Preliminary Restructure of Docs @dan-jan (#655) -- Fix: specs revision @vuonghoainam (#649) -- Model specs @vuonghoainam (#641) -- Update README.md @imtuyethan (#629) -- Refactor Jan Documentation @dan-jan (#625) - -## Contributor - -@0xSage, @Diane0111, @dan-jan, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @linhtran174, @louis-jan, @namchuai, @urmauur, @vuonghoainam and Le Tra Mi +## Changes + +- docs: cleanup @0xSage (#719) +- docs: threads and messages @0xSage (#681) +- Updating Onboarding Kit @Diane0111 (#675) +- Update issue templates @0xSage (#685) +- docs: polish models spec @0xSage (#680) +- Feature: Preview URL for each PR and add pre-release.jan.ai as staging of Jan Docs @hiento09 (#669) +- Migrate Model definitions to Swagger/OpenAPI @dan-jan (#659) +- [docs] Add Introduction and refactor Models Spec @dan-jan (#657) +- docs: Add model methods to swagger @0xSage (#660) +- Models Spec: Delete broken Markdown links @dan-jan (#648) +- docs: assistants and threads specs @0xSage (#646) + +## 🚀 Features + +- improvement: styling message action toolbar @urmauur (#737) +- experimental: allow user to give instruction for the conversation @louis-jan (#714) +- docs/enable-seo-docusaurus @hieu-jan (#725) +- Add windows code sign to CI @hiento09 (#712) +- docs: update installation guide @hieu-jan (#664) +- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) +- docs: add OpenAI swagger file @hieu-jan (#623) +- Update landing page Jan @urmauur (#638) + +## 🐛 Bug Fixes + +- chore: open app data should lead user to jan root @louis-jan (#749) +- fix: cancel download does not work @louis-jan (#746) +- fix: error when switching between threads @louis-jan (#736) +- chore: app raises error when attempting to start a model that is already starting @louis-jan (#721) +- bug: fix filter list menu from command base on search type and make a symbol base on OS @urmauur (#723) +- bug: fix clickable small download button on chat screen @urmauur (#722) +- fix: incorrect update progress bar visibility check @louis-jan (#713) +- fix: app shows wrong performance tag, all say not enough ram on windows @louis-jan (#699) +- bug: fix padding quotations and numbering list @urmauur (#695) +- fix: local npm module update does not reflect web app @louis-jan (#677) +- [bug] fix markdown todo items shifted to the left and remove the dots @urmauur (#694) +- bug: fix footer and section spacing landing page @urmauur (#683) +- bug: fix anchor link sidebar openapi @urmauur (#668) +- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) +- bug: fix titles should have spaces in between @urmauur (#652) +- bug: fix compatibility content not fully display @urmauur (#653) + +## 🧰 Maintenance + +- chore: fix app grammar @0xSage (#750) +- chore: bumb nitro version @louis-jan (#740) +- chore: fs module should not cover app logic @louis-jan (#720) +- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) +- docs: upgrade mdx-js package @hieu-jan (#705) +- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) +- Fix error docs pipeline run failed @hiento09 (#702) +- Revert docs CICD trigger on push to main instead of tag-based @hiento09 (#698) +- fix: local npm module update does not reflect web app @louis-jan (#677) +- Chore: refactor to makefile @hiento09 (#691) +- Add Instruction to publish docs @hiento09 (#687) +- chore/add-mermaid @hieu-jan (#672) +- chore/update package docs @hieu-jan (#670) +- Enhance Cross-Platform Argument Handling for Nitro Startup Scripts @hiento09 (#674) +- refactor: remove unused hooks and resolve no-explicit-any @louis-jan (#647) +- docs: add OpenAI swagger file @hieu-jan (#623) +- Preliminary Restructure of Docs @dan-jan (#655) +- Model specs @vuonghoainam (#641) +- refactor: refactor app entities @louis-jan (#626) +- refactor: move file to jan root @namchuai (#598) +- Add run-script-os @linhtran174 (#620) +- Refactor Jan Documentation @dan-jan (#625) + +## 📖 Documentaion + +- docs: update specs/product @0xSage (#744) +- docs/enable-seo-docusaurus @hieu-jan (#725) +- docs: assistant spec @vuonghoainam (#707) +- docs: Refactor Jan Site Structure @dan-jan (#706) +- docs/improve install docs @hieu-jan (#708) +- API Reference for Models, Messages, Threads @hahuyhoang411 (#679) +- [docs] Update Docusaurus to 3.0 and fix closing tag issue in Handbook @dan-jan (#704) +- docs: update installation guide @hieu-jan (#664) +- chore: Update based on team discussion on Nov 20 @vuonghoainam (#673) +- docs: add OpenAI swagger file @hieu-jan (#623) +- Preliminary Restructure of Docs @dan-jan (#655) +- Fix: specs revision @vuonghoainam (#649) +- Model specs @vuonghoainam (#641) +- Update README.md @imtuyethan (#629) +- Refactor Jan Documentation @dan-jan (#625) + +## Contributor + +@0xSage, @Diane0111, @dan-jan, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @linhtran174, @louis-jan, @namchuai, @urmauur, @vuonghoainam and Le Tra Mi diff --git a/docs/docs/releases/changelog/changelog-v0.4.0.mdx b/docs/docs/releases/changelog/changelog-v0.4.0.mdx index 3afa7849e..142d55a60 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.0.mdx @@ -8,68 +8,68 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #878: bug: fix tag description showing a title and fix card right panel](https://github.com/janhq/jan/pull/878) -## Changes - -- bug: fix tag description showing a title and fix card right panel @urmauur (#878) -- fix/no-assistant-available-fresh-install @louis-jan (#876) -- Model.json update @hahuyhoang411 (#870) -- Hotfix desc for openhermes @hahuyhoang411 (#864) -- Openhermes update v1 @hahuyhoang411 (#863) -- update deepseek 1.3b @hahuyhoang411 (#858) -- Update tags @hahuyhoang411 (#857) -- Update model hub @hahuyhoang411 (#829) -- hotfix: fix typo @tikikun (#836) -- chore: pre-populate Jan's /models folder with model.jsons @hahuyhoang411 (#775) -- chore: clarification changes to the model settings and model parameters @tikikun (#742) - -## 🚀 Features - -- feat: revamp landing page @urmauur (#745) -- feat : add cover image model hub screen @urmauur (#872) -- feat: boilerplate for express server localhost 1337 @linhtran174 (#803) -- enhancement: revamp hub screen @urmauur (#825) -- feat: revamp thread screen @urmauur (#802) -- docs/update-api-reference @hieu-jan (#739) -- refactor: model plugin to follow new specs @namchuai (#682) - -## 🐛 Fixes - -- fix: Nitro interface update to prevent warning @vuonghoainam (#877) -- fix: delete message break the entire thread @louis-jan (#869) -- fix: can not download multiple models at once @louis-jan (#867) -- fix: production CI workflow does not populate models @louis-jan (#862) -- fix: update wrong main view state when use a model @namchuai (#861) -- fix: handle crash issue on hljs highlighting @louis-jan (#859) -- fix: empty assistant instruction by default @louis-jan (#855) -- bug: fix broken banner position hub screen @urmauur (#846) -- fix: not update active model when using resend button @namchuai (#834) -- Hotfix jan windows download nitro failed @hiento09 (#838) -- Switch to download nitro .tar.gz file instead of .zip file on windows @hiento09 (#832) -- fix/docusaurus-seo @hieu-jan (#818) -- fix: CI script - reorder copy models action @louis-jan (#819) -- fix: messages sync is not threadsafe @louis-jan (#784) -- Fix Makefile Indentation Issue @hiento09 (#788) - -## 🧰 Maintenance - -- chore: update model ranking @louis-jan (#874) -- Bump nitro version to 0.1.21 - nitro has windows codesign @hiento09 (#843) -- Hotfix jan windows download nitro failed @hiento09 (#838) -- 810 docs add modeljson and revamp models specs page @tikikun (#816) -- Add document for nightly build and update message for manual build @hiento09 (#831) -- chore: Bump nitro to 0.1.20 @vuonghoainam (#830) -- Refactor build:extension command @hiento09 (#822) -- feat: pre-populate Jan's /models folder @namchuai (#796) -- chore: fix pr auto labeling @0xSage (#812) -- chore: add gi automations @0xSage (#809) -- refactor: jan extensions @louis-jan (#799) -- Remove .zip in artifact name @hiento09 (#800) -- docs/update-api-reference @hieu-jan (#739) -- Add nightly build ci @hiento09 (#794) -- Fix Makefile Indentation Issue @hiento09 (#788) -- Switch from .zip to .tar.gz for nitro url inference plugin @hiento09 (#781) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam +## Changes + +- bug: fix tag description showing a title and fix card right panel @urmauur (#878) +- fix/no-assistant-available-fresh-install @louis-jan (#876) +- Model.json update @hahuyhoang411 (#870) +- Hotfix desc for openhermes @hahuyhoang411 (#864) +- Openhermes update v1 @hahuyhoang411 (#863) +- update deepseek 1.3b @hahuyhoang411 (#858) +- Update tags @hahuyhoang411 (#857) +- Update model hub @hahuyhoang411 (#829) +- hotfix: fix typo @tikikun (#836) +- chore: pre-populate Jan's /models folder with model.jsons @hahuyhoang411 (#775) +- chore: clarification changes to the model settings and model parameters @tikikun (#742) + +## 🚀 Features + +- feat: revamp landing page @urmauur (#745) +- feat : add cover image model hub screen @urmauur (#872) +- feat: boilerplate for express server localhost 1337 @linhtran174 (#803) +- enhancement: revamp hub screen @urmauur (#825) +- feat: revamp thread screen @urmauur (#802) +- docs/update-api-reference @hieu-jan (#739) +- refactor: model plugin to follow new specs @namchuai (#682) + +## 🐛 Fixes + +- fix: Nitro interface update to prevent warning @vuonghoainam (#877) +- fix: delete message break the entire thread @louis-jan (#869) +- fix: can not download multiple models at once @louis-jan (#867) +- fix: production CI workflow does not populate models @louis-jan (#862) +- fix: update wrong main view state when use a model @namchuai (#861) +- fix: handle crash issue on hljs highlighting @louis-jan (#859) +- fix: empty assistant instruction by default @louis-jan (#855) +- bug: fix broken banner position hub screen @urmauur (#846) +- fix: not update active model when using resend button @namchuai (#834) +- Hotfix jan windows download nitro failed @hiento09 (#838) +- Switch to download nitro .tar.gz file instead of .zip file on windows @hiento09 (#832) +- fix/docusaurus-seo @hieu-jan (#818) +- fix: CI script - reorder copy models action @louis-jan (#819) +- fix: messages sync is not threadsafe @louis-jan (#784) +- Fix Makefile Indentation Issue @hiento09 (#788) + +## 🧰 Maintenance + +- chore: update model ranking @louis-jan (#874) +- Bump nitro version to 0.1.21 - nitro has windows codesign @hiento09 (#843) +- Hotfix jan windows download nitro failed @hiento09 (#838) +- 810 docs add modeljson and revamp models specs page @tikikun (#816) +- Add document for nightly build and update message for manual build @hiento09 (#831) +- chore: Bump nitro to 0.1.20 @vuonghoainam (#830) +- Refactor build:extension command @hiento09 (#822) +- feat: pre-populate Jan's /models folder @namchuai (#796) +- chore: fix pr auto labeling @0xSage (#812) +- chore: add gi automations @0xSage (#809) +- refactor: jan extensions @louis-jan (#799) +- Remove .zip in artifact name @hiento09 (#800) +- docs/update-api-reference @hieu-jan (#739) +- Add nightly build ci @hiento09 (#794) +- Fix Makefile Indentation Issue @hiento09 (#788) +- Switch from .zip to .tar.gz for nitro url inference plugin @hiento09 (#781) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam diff --git a/docs/docs/releases/changelog/changelog-v0.4.1.mdx b/docs/docs/releases/changelog/changelog-v0.4.1.mdx index 10cf4308a..38be38b74 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.1.mdx @@ -8,55 +8,55 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #903: Update README.md](https://github.com/janhq/jan/pull/903) -## Changes - -- Update README.md @imtuyethan (#903) - -## 🚀 Features - -- feat: Kill nitro process with API - nitro 0.1.27 @vuonghoainam (#975) -- feat: Inference Nitro with Prompt Template @hahuyhoang411 (#952) -- feat: Add NVIDIA triton trt-llm extension @vuonghoainam (#888) -- feat: Hotfit for Nitro loading on CPU with hyper-threading support @vuonghoainam (#931) -- feat: adding model params @namchuai (#886) -- feat: Multiple inference engines for nitro and openai @vuonghoainam (#814) -- docs: add json schema for engine and model parameters @tikikun (#840) -- feat: improve SEO keywords @hieu-jan (#894) -- enhancement: fix spacing landing page responsive @urmauur (#891) -- bug: added label coming soon for windows and linux @urmauur (#881) - -## 🐛 Fixes - -- fix: 963 can not run openai models on windows @louis-jan (#974) -- fix: Inference engine Nitro with Windows with/ without CUDA @vuonghoainam (#950) -- Fix error Jan app linux crash @hiento09 (#958) -- fix: windows bug - control buttons close,max,min hidden @linhtran174 (#949) -- bug: fix ui landing page @urmauur (#937) -- fix: model parameters for inference extensions @vuonghoainam (#935) -- [bug] Fix floating border outside card right panel @urmauur (#934) -- fix: import\_typescript.default.isTokenKind is not a function @louis-jan (#923) -- bug: fix syntax formatting @urmauur (#899) -- bug: update metadata title and desc @urmauur (#884) -- fix: download button text color is blending into the background @louis-jan (#883) - -## 🧰 Maintenance - -- chore: add desktop app analytics @louis-jan (#978) -- refactor: clean types and interfaces @0xSage (#966) -- docs: scaffold dev docs @0xSage (#856) -- chore: Bump nitro to 0.1.26 @vuonghoainam (#960) -- Update update-release-url.yml @hiento09 (#951) -- Fix update release url pipeline run failed @hiento09 (#947) -- chore: Bumpt nitro bin version to version 0.1.23 @vuonghoainam (#942) -- Fix update release url pipeline @hiento09 (#941) -- CI automatically update Update README with Nightly Build Information and stable download URL @hiento09 (#940) -- refactor: deprecate invokers - auto proxying apis - strict types @louis-jan (#924) -- docs: standardize yaml files @hieu-jan (#933) -- chore: universal module definition @louis-jan (#902) -- docs: add assistants api reference @hieu-jan (#801) -- docs: add json schema for engine and model parameters @tikikun (#840) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @jan-service-account, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam +## Changes + +- Update README.md @imtuyethan (#903) + +## 🚀 Features + +- feat: Kill nitro process with API - nitro 0.1.27 @vuonghoainam (#975) +- feat: Inference Nitro with Prompt Template @hahuyhoang411 (#952) +- feat: Add NVIDIA triton trt-llm extension @vuonghoainam (#888) +- feat: Hotfit for Nitro loading on CPU with hyper-threading support @vuonghoainam (#931) +- feat: adding model params @namchuai (#886) +- feat: Multiple inference engines for nitro and openai @vuonghoainam (#814) +- docs: add json schema for engine and model parameters @tikikun (#840) +- feat: improve SEO keywords @hieu-jan (#894) +- enhancement: fix spacing landing page responsive @urmauur (#891) +- bug: added label coming soon for windows and linux @urmauur (#881) + +## 🐛 Fixes + +- fix: 963 can not run openai models on windows @louis-jan (#974) +- fix: Inference engine Nitro with Windows with/ without CUDA @vuonghoainam (#950) +- Fix error Jan app linux crash @hiento09 (#958) +- fix: windows bug - control buttons close,max,min hidden @linhtran174 (#949) +- bug: fix ui landing page @urmauur (#937) +- fix: model parameters for inference extensions @vuonghoainam (#935) +- [bug] Fix floating border outside card right panel @urmauur (#934) +- fix: import\_typescript.default.isTokenKind is not a function @louis-jan (#923) +- bug: fix syntax formatting @urmauur (#899) +- bug: update metadata title and desc @urmauur (#884) +- fix: download button text color is blending into the background @louis-jan (#883) + +## 🧰 Maintenance + +- chore: add desktop app analytics @louis-jan (#978) +- refactor: clean types and interfaces @0xSage (#966) +- docs: scaffold dev docs @0xSage (#856) +- chore: Bump nitro to 0.1.26 @vuonghoainam (#960) +- Update update-release-url.yml @hiento09 (#951) +- Fix update release url pipeline run failed @hiento09 (#947) +- chore: Bumpt nitro bin version to version 0.1.23 @vuonghoainam (#942) +- Fix update release url pipeline @hiento09 (#941) +- CI automatically update Update README with Nightly Build Information and stable download URL @hiento09 (#940) +- refactor: deprecate invokers - auto proxying apis - strict types @louis-jan (#924) +- docs: standardize yaml files @hieu-jan (#933) +- chore: universal module definition @louis-jan (#902) +- docs: add assistants api reference @hieu-jan (#801) +- docs: add json schema for engine and model parameters @tikikun (#840) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @imtuyethan, @jan-service-account, @linhtran174, @louis-jan, @namchuai, @tikikun, @urmauur and @vuonghoainam diff --git a/docs/docs/releases/changelog/changelog-v0.4.2.mdx b/docs/docs/releases/changelog/changelog-v0.4.2.mdx index 4b64ca7f4..77b15a555 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.2.mdx @@ -8,43 +8,43 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1033: Hotfix model hub](https://github.com/janhq/jan/pull/1033) -## Changes - -- Hotfix model hub @hahuyhoang411 (#1033) -- Update Model.json @hahuyhoang411 (#1005) - -## 🚀 Features - -- feat: app theme depend on local storage instead native theme electron @urmauur (#1014) -- feat: move stop inference button into the send button @urmauur (#1011) -- feat: loader when starting model @urmauur (#945) -- fix: enable download app linux @urmauur (#993) -- fix: remove coming soon windows @urmauur (#986) - -## 🐛 Fixes - -- fix: migrate new models @louis-jan (#1034) -- fix: add input for api key remote model @urmauur (#1031) -- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) -- fix: delete first message then regenerate again will break the thread @louis-jan (#1015) -- fix: #995 - Fix onboarding state and model sorting @louis-jan (#1009) -- fix: limit analytics events capture @louis-jan (#1012) -- fix: wrong selected model right panel @urmauur (#1001) -- fix: review finder and view as json @louis-jan (#1000) -- fix: enable download app linux @urmauur (#993) - -## 🧰 Maintenance - -- chore: remigrate if there is no models dir @louis-jan (#1038) -- bump nitro version to 0.1.30 @hiento09 (#1036) -- chore: in app copy fixes @0xSage (#1032) -- Separate posthog project for jan app and docs @hiento09 (#1029) -- Update posthog capture url list @hiento09 (#1022) -- docs: second half of "import model docs" PR @0xSage (#1021) -- docs: how to import models @0xSage (#1020) -- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @jan-service-account, @louis-jan and @urmauur +## Changes + +- Hotfix model hub @hahuyhoang411 (#1033) +- Update Model.json @hahuyhoang411 (#1005) + +## 🚀 Features + +- feat: app theme depend on local storage instead native theme electron @urmauur (#1014) +- feat: move stop inference button into the send button @urmauur (#1011) +- feat: loader when starting model @urmauur (#945) +- fix: enable download app linux @urmauur (#993) +- fix: remove coming soon windows @urmauur (#986) + +## 🐛 Fixes + +- fix: migrate new models @louis-jan (#1034) +- fix: add input for api key remote model @urmauur (#1031) +- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) +- fix: delete first message then regenerate again will break the thread @louis-jan (#1015) +- fix: #995 - Fix onboarding state and model sorting @louis-jan (#1009) +- fix: limit analytics events capture @louis-jan (#1012) +- fix: wrong selected model right panel @urmauur (#1001) +- fix: review finder and view as json @louis-jan (#1000) +- fix: enable download app linux @urmauur (#993) + +## 🧰 Maintenance + +- chore: remigrate if there is no models dir @louis-jan (#1038) +- bump nitro version to 0.1.30 @hiento09 (#1036) +- chore: in app copy fixes @0xSage (#1032) +- Separate posthog project for jan app and docs @hiento09 (#1029) +- Update posthog capture url list @hiento09 (#1022) +- docs: second half of "import model docs" PR @0xSage (#1021) +- docs: how to import models @0xSage (#1020) +- fix bug #1013, enable posthog for release app version only @hiento09 (#1019) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @jan-service-account, @louis-jan and @urmauur diff --git a/docs/docs/releases/changelog/changelog-v0.4.3.mdx b/docs/docs/releases/changelog/changelog-v0.4.3.mdx index 2426f6280..d34c85f60 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.3.mdx @@ -8,62 +8,62 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1159: Hotfix Prompt template for models on the Hub](https://github.com/janhq/jan/pull/1159) -## Changes - -- Hotfix Prompt template for models on the Hub @hahuyhoang411 (#1159) -- Update model list for new release @hahuyhoang411 (#1143) -- fix(Thread): #1119 focus on the first thread to prevent blank chat screen @namchuai (#1127) -- fix(Thread): #1064 message being added to wrong thread if switching thread @namchuai (#1108) -- fix(Thread): #1042 allow create new thread by clicking Use in Jan Hub @namchuai (#1103) -- feat(ModelSetting): #1065 update state of model setting between threads @namchuai (#1090) -- Update model version @hahuyhoang411 (#1086) -- fix: cache hallucinations and failed to load model due to race condition @louis-jan (#1071) -- fix(thread): #1043 default model to prefer active model @namchuai (#1070) -- Update issue templates @0xSage (#1058) -- Update ctx\_len and max\_tokens @hahuyhoang411 (#1035) - -## 🚀 Features - -- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) -- Feature autoupdater for nightly build @hiento09 (#1068) -- feat: copy button for code block @urmauur (#1062) -- Enhancements to Dependency Installation and App Testing @hiento09 (#965) - -## 🐛 Fixes - -- fix: error road map url @hieu-jan (#1153) -- Fix token speed slow in machine has multi gpus @hiento09 (#1157) -- fix: added dialog confirmation clean thread @urmauur (#1142) -- fix: remove remote model from shortcut models dialog @urmauur (#1124) -- fix: ui issue - all models are activated @louis-jan (#1120) -- fix: should not hide empty message away @louis-jan (#1116) -- fix: added tooltip for user cannot change model after starting thread @urmauur (#1115) -- fix: remote model always active badges @urmauur (#1113) -- fix: handle chat completion state with enter button @louis-jan (#1114) -- fix: model active indicator only show when model activated @urmauur (#1110) -- fix: #1096 yield error message upon thread switching @louis-jan (#1109) -- fix: toaster success deleted thread showing id instead of active model @urmauur (#1111) -- fix: update copy setting page @urmauur (#1105) -- fix: search recommended model @urmauur (#1106) -- fix: #1097 streaming response is replaced by error message @louis-jan (#1099) -- Fix auto update windows Bug @hiento09 (#1102) -- fix: added dialog confirmation when delete thread @urmauur (#1093) -- fix: system monitor broken layout when responsive @urmauur (#1085) -- bug: chatbox doesn't resize back down @urmauur (#1084) -- fix: thread is broken after deleted first generated message @louis-jan (#1061) - -## 🧰 Maintenance - -- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) -- docs: refactor dev docs, guides and specs @0xSage (#1092) -- Correct jq command cause ci nightly build run failed @hiento09 (#1104) -- Fix nightly build autoupdater @hiento09 (#1073) -- Feature autoupdater for nightly build @hiento09 (#1068) -- docs: Update product.md @0xSage (#1066) -- Posthog disable click event and increase timeout for nitro load model… @hiento09 (#1060) -- docs: improve quickstart docs @0xSage (#1047) - -## Contributor - -@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai and @urmauur +## Changes + +- Hotfix Prompt template for models on the Hub @hahuyhoang411 (#1159) +- Update model list for new release @hahuyhoang411 (#1143) +- fix(Thread): #1119 focus on the first thread to prevent blank chat screen @namchuai (#1127) +- fix(Thread): #1064 message being added to wrong thread if switching thread @namchuai (#1108) +- fix(Thread): #1042 allow create new thread by clicking Use in Jan Hub @namchuai (#1103) +- feat(ModelSetting): #1065 update state of model setting between threads @namchuai (#1090) +- Update model version @hahuyhoang411 (#1086) +- fix: cache hallucinations and failed to load model due to race condition @louis-jan (#1071) +- fix(thread): #1043 default model to prefer active model @namchuai (#1070) +- Update issue templates @0xSage (#1058) +- Update ctx\_len and max\_tokens @hahuyhoang411 (#1035) + +## 🚀 Features + +- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) +- Feature autoupdater for nightly build @hiento09 (#1068) +- feat: copy button for code block @urmauur (#1062) +- Enhancements to Dependency Installation and App Testing @hiento09 (#965) + +## 🐛 Fixes + +- fix: error road map url @hieu-jan (#1153) +- Fix token speed slow in machine has multi gpus @hiento09 (#1157) +- fix: added dialog confirmation clean thread @urmauur (#1142) +- fix: remove remote model from shortcut models dialog @urmauur (#1124) +- fix: ui issue - all models are activated @louis-jan (#1120) +- fix: should not hide empty message away @louis-jan (#1116) +- fix: added tooltip for user cannot change model after starting thread @urmauur (#1115) +- fix: remote model always active badges @urmauur (#1113) +- fix: handle chat completion state with enter button @louis-jan (#1114) +- fix: model active indicator only show when model activated @urmauur (#1110) +- fix: #1096 yield error message upon thread switching @louis-jan (#1109) +- fix: toaster success deleted thread showing id instead of active model @urmauur (#1111) +- fix: update copy setting page @urmauur (#1105) +- fix: search recommended model @urmauur (#1106) +- fix: #1097 streaming response is replaced by error message @louis-jan (#1099) +- Fix auto update windows Bug @hiento09 (#1102) +- fix: added dialog confirmation when delete thread @urmauur (#1093) +- fix: system monitor broken layout when responsive @urmauur (#1085) +- bug: chatbox doesn't resize back down @urmauur (#1084) +- fix: thread is broken after deleted first generated message @louis-jan (#1061) + +## 🧰 Maintenance + +- feat: Add codeQL analysis for push main and pr main @hiro-v (#1128) +- docs: refactor dev docs, guides and specs @0xSage (#1092) +- Correct jq command cause ci nightly build run failed @hiento09 (#1104) +- Fix nightly build autoupdater @hiento09 (#1073) +- Feature autoupdater for nightly build @hiento09 (#1068) +- docs: Update product.md @0xSage (#1066) +- Posthog disable click event and increase timeout for nitro load model… @hiento09 (#1060) +- docs: improve quickstart docs @0xSage (#1047) + +## Contributor + +@0xSage, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai and @urmauur diff --git a/docs/docs/releases/changelog/changelog-v0.4.4.mdx b/docs/docs/releases/changelog/changelog-v0.4.4.mdx index f61e35c44..ea85cb2de 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.4.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.4.mdx @@ -8,191 +8,191 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1587: Update 2023-11-05-hello-world.md](https://github.com/janhq/jan/pull/1587) -## Changes - -- Update 2023-11-05-hello-world.md @Ssstars (#1587) -- fix(API): #1511 update swagger page @namchuai (#1572) -- fix(Thread): #1212 thread.json not created when user change thread settings @namchuai (#1570) -- fix(Thread): #1336 not allow creating too many unfinished thread @namchuai (#1538) -- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1555) -- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1553) -- Update 02-embracing-pod-structure.mdx @Ssstars (#1550) -- Update 01-how-we-hire.mdx @Ssstars (#1551) -- Update 01-how-we-hire.mdx @Ssstars (#1524) -- fix(InferenceExtension): #1067 sync the nitro process state @namchuai (#1493) -- fix(Messages): #1434 create message via api does not display on app correctly @namchuai (#1479) -- Docs for the Integration of Continue and Jan in VSCode @0xgokuz (#1467) -- Chore: Update model.json for UI @hahuyhoang411 (#1448) -- Docs for Installing Models from Hub @0xgokuz (#1450) -- Update about.md @Ssstars (#1436) -- feat(UI): #1404 make left side bar collapsible by hot key @namchuai (#1420) -- docs: Typo in 06-hardware.md @akaMrNagar (#1408) -- fix(API): #1409 fix wrong prefix for threads api @namchuai (#1410) -- Update model hub @hahuyhoang411 (#1383) -- fix(Model): remove unsupported default model setting params @namchuai (#1382) -- fix(trinity): update cover path for trinity v1.2 @hahuyhoang411 (#1380) -- Chore/update model hub @hahuyhoang411 (#1342) -- Update about.md @Ssstars (#1359) -- fix(JanHub): #1158 sort model list @namchuai (#1257) -- fix(Message): open link with external browser @namchuai (#1339) -- feat(Model): #1028 made model.json optional @namchuai (#1314) -- docs: Update onboarding.md @Diane0111 (#1293) -- fix: clean resource on exit @louis-jan (#1290) -- fix: posthog configuration @hieu-jan (#1283) -- docs: update README.md @eltociear (#1277) -- Enable scrolling in the message chat box @Gri-ffin (#1280) -- chore: Update README.md @sr-albert (#1263) -- Adding new model to the Hub @hahuyhoang411 (#1213) -- Feature GPU detection for Jan on Windows and Linux @hiento09 (#1242) -- fix(Thread): #1168 fix newly created thread cannot select model after restart @namchuai (#1176) - -## 🚀 Features - -- feat: add compatibility tag to model selection in right panel @urmauur (#1552) -- Feature integrate antivirus scanner to ci @hiento09 (#1529) -- feat: [hub] update compatibility tags colors @urmauur (#1516) -- feat: hub recommendation labels @urmauur (#1440) -- Feature linux support app image format @hiento09 (#1442) -- fix: render external links @urmauur (#1441) -- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) -- feat(UI): update UI footer @urmauur (#1424) -- Fix Bug for Chat Reply Goes off Screen @mishrababhishek (#1393) -- feat: move social media from left panel into footer @urmauur (#1325) -- feat: implementation new UI thread settings @urmauur (#1301) -- Bring social media links @Gri-ffin (#1295) -- feat: added keyboard shortcut list in setting page @urmauur (#1275) -- feat: add swagger /docs to localhost:1337 @louis-jan (#1268) -- feat: update posthog configuration @hieu-jan (#1258) -- feat: Deprecate model.json ready state in favor of .download ext @louis-jan (#1238) -- feat: add engine settings @namchuai (#1199) -- feat: users should be able to switch models mid-thread @louis-jan (#1226) -- feat: temporary link how to import model @urmauur (#1209) - -## 🐛 Fixes - -- fix: #1594 - Model settings - change thread model - go back does not see according settings @louis-jan (#1595) -- fix: #1548 - duplicate command shortcut instruction @louis-jan (#1600) -- fix: switch model caused app crash @louis-jan (#1597) -- fix: #1559 Inference Parameters displayed on new thread with Openai GPT Model @louis-jan (#1588) -- fix: enable user set value manually model setting from input @urmauur (#1585) -- fix: #1569 - Does not apply thread settings when loading model @louis-jan (#1576) -- fix: could not change model params settings @louis-jan (#1547) -- fix: gpu check module export does not work in extension @louis-jan (#1536) -- fix: adjust calculation hub labels using total RAM instead remaining RAM @urmauur (#1522) -- Feature integrate antivirus scanner to ci @hiento09 (#1529) -- fix: allow users to set max tokens variably @urmauur (#1513) -- fix: stop word update @louis-jan (#1457) -- Revert nitro to 0.2.6 @hiento09 (#1491) -- fix: enable text selection codeblock @urmauur (#1466) -- fix: suppress all main node JS error message dialog @louis-jan (#1460) -- Correct AppImage path @hiento09 (#1446) -- fix: render external links @urmauur (#1441) -- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) -- fix: GET /models does not work due to new default model dir @louis-jan (#1392) -- fix: model migration stopped working @louis-jan (#1378) -- fix: wrong condition for displaying error message @louis-jan (#1376) -- fix: show hide section engine params @urmauur (#1374) -- fix: copy stream tooltip and hide section when no params setting @urmauur (#1373) -- bugs: fix stop streaming when user delete or clean thread @urmauur (#1347) -- fix: show a proper error message on download failure @louis-jan (#1345) -- Add detect cuda version jan app @hiento09 (#1351) -- fix: Error occurred: Unexpected token "d", "data: ..." is not a valid JSON @louis-jan (#1332) -- fix: app getting stuck at downloading 99% while downloading model @louis-jan (#1320) -- correct type utf-8 @hiento09 (#1311) -- Fix memory on mac included cached and swap @hiento09 (#1298) -- fix: should check app dir before spawning log @louis-jan (#1297) -- fix: disable process logging from server @louis-jan (#1296) -- fix: user should be able to access Swagger docs from localhost:1337 @louis-jan (#1292) -- Switch from Gigabyte to Gibibyte - System monitor @hiento09 (#1286) -- Switch from systeminformation to os-utils to resolve Bitdefender false positive and memory leak issue @hiento09 (#1282) -- fix: swagger CSP issue @louis-jan (#1284) -- fix: support markdown break line @urmauur (#1274) -- fix ci test run failed @hiento09 (#1267) -- Fix wrong linux nitro path @hiento09 (#1266) -- fix: enable command enter on dialog confirmation clean thread @urmauur (#1261) -- fix: input message duplicated due with some input sources @louis-jan (#1259) -- fix: mac users should not see GPU settings @louis-jan (#1255) -- fix: remove redundant gpu detection prompt event @louis-jan (#1254) -- fix: engine settings GUI - feature toggle @louis-jan (#1252) -- Fix bug #1178 high ram on windows @hiento09 (#1241) -- fix: #1183 Reveal in finder does not work on windows @namchuai (#1239) -- fix: remove delay tooltip and click event @urmauur (#1217) -- fix: enable enter command on dialog confirmation delete thread @urmauur (#1218) -- fix: Cleared thread last message is not updated @louis-jan (#1225) -- Fix switch thread crash nitro windows linux @hiento09 (#1214) -- fix: darkmode broken color @urmauur (#1186) - -## 🧰 Maintenance - -- chore: typo model.json @louis-jan (#1599) -- docs: add 04-how-to-get-error-logs.mdx @hieu-jan (#1580) -- chore: teach how to attach logs @0xSage (#1578) -- chore: issues should auto close with PRs through template @0xSage (#1577) -- chore: Update issue templates @0xSage (#1568) -- docs: fix x handles @0xSage (#1532) -- Docs to integrate OpenRouter with Jan without UI/UX @0xgokuz (#1495) -- chore: fix darkmode docs @hieu-jan (#1520) -- docs: fix algolia configuration @hieu-jan (#1518) -- docs: fix algolia configuration @hieu-jan (#1517) -- Revert URL release in readme to version 0.4.3 @hiento09 (#1502) -- refactor: add app and nitro log - resolve dependencies issue @louis-jan (#1447) -- chore: enable agolia @hieu-jan (#1497) -- docs: update troubleshooting and redirects old pages @hieu-jan (#1492) -- docs: minor fix @hieu-jan (#1478) -- docs: initial handbook structure @hieu-jan (#1477) -- Bump nitro to 0.2.8 and change Jan App to support cuda >= 11.7 @hiento09 (#1476) -- Chore update docs jan - add AppImage instruction to docusaurus @hiento09 (#1480) -- Bump nitro to 0.2.7 @hiento09 (#1474) -- chore: error message update @louis-jan (#1473) -- docs: Update 02-import-manually.mdx @0xSage (#1469) -- docs: Update about.md @0xSage (#1465) -- Bump nitro version to 0.2.6 @hiento09 (#1458) -- docs: adding customize engine settings @hieu-jan (#1455) -- docs: add-missing-path @hieu-jan (#1454) -- docs: resize gif @hieu-jan (#1453) -- docs: revenue philosophy @0xSage (#1443) -- docs: jan framework principles @0xSage (#1438) -- docs: fix typo in docs @hieu-jan (#1419) -- chore: clean up use os hook @namchuai (#1418) -- docs: explain each docs page intent @0xSage (#1417) -- docs: Update 01-server.md @0xSage (#1416) -- Update warning url from github md file to jan.ai docs site @hiento09 (#1414) -- docs: improve gpu not used guide @hieu-jan (#1405) -- chore: update README.md @eltociear (#1406) -- Update USAGE docs for linux @hiento09 (#1401) -- docs: gpu not detected @0xSage (#1399) -- docs: Troubleshoot Failed To Fetch @gabrielle-ong (#1398) -- docs: improve docs syntax @hieu-jan (#1394) -- docs: add-install-nightly-guide @hieu-jan (#1390) -- docs: correct href link @hieu-jan (#1338) -- docs: fix chat payload and cURL @hieu-jan (#1360) -- docs: add Chatting Guide @hieu-jan (#1184) -- Chore add docs usage how to switch run mode jan app @hiento09 (#1353) -- docs: configure index page @hieu-jan (#1330) -- docs: Update product.md @0xSage (#1326) -- docs: Update 01-server.md @0xSage (#1327) -- refactor: deprecate the appVersion IPC and use the predefined VERSION @louis-jan (#1309) -- docs: update using models documentation @hieu-jan (#1288) -- docs: update pm handbook @0xSage (#1307) -- docs: contributor docs overview @0xSage (#1305) -- chore: github PR template @0xSage (#1304) -- Fix memory on mac included cached and swap @hiento09 (#1298) -- Enrich discord message for nightly build url @hiento09 (#1294) -- Refactor CI by create shared jobs output @hiento09 (#1287) -- docs: update README.md @hieu-jan (#1281) -- docs: Update README.md @0xSage (#1248) -- feat: Jan Server, API and decoupled clients @louis-jan (#948) -- docs: improve 02-import-manually @hieu-jan (#1222) -- chore: Update issue templates @0xSage (#1229) -- docs: Update 02-import-manually.mdx @0xSage (#1197) -- add sleep 500ms if platform is windows before starting nitro process @hiento09 (#1215) -- docs: improve troubleshoot documentation @hieu-jan (#1173) -- docs: update bug report template @hieu-jan (#1180) -- docs: add troubleshooting @hieu-jan (#1169) -- chore: copy fixes @0xSage (#1167) -- docs: Update 01-start-thread.md @0xSage (#1122) - -## Contributor - -@0xSage, @0xgokuz, @Diane0111, @Gri-ffin, @Ssstars, @akaMrNagar, @eltociear, @gabrielle-ong, @hahuyhoang411, @hiento09, @hieu-jan, @jan-service-account, @louis-jan, @mishrababhishek, @namchuai, @sr-albert, @urmauur and Abhishek Mishra +## Changes + +- Update 2023-11-05-hello-world.md @Ssstars (#1587) +- fix(API): #1511 update swagger page @namchuai (#1572) +- fix(Thread): #1212 thread.json not created when user change thread settings @namchuai (#1570) +- fix(Thread): #1336 not allow creating too many unfinished thread @namchuai (#1538) +- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1555) +- Update 01-how-to-get-involved-and-FAQ.mdx @Ssstars (#1553) +- Update 02-embracing-pod-structure.mdx @Ssstars (#1550) +- Update 01-how-we-hire.mdx @Ssstars (#1551) +- Update 01-how-we-hire.mdx @Ssstars (#1524) +- fix(InferenceExtension): #1067 sync the nitro process state @namchuai (#1493) +- fix(Messages): #1434 create message via api does not display on app correctly @namchuai (#1479) +- Docs for the Integration of Continue and Jan in VSCode @0xgokuz (#1467) +- Chore: Update model.json for UI @hahuyhoang411 (#1448) +- Docs for Installing Models from Hub @0xgokuz (#1450) +- Update about.md @Ssstars (#1436) +- feat(UI): #1404 make left side bar collapsible by hot key @namchuai (#1420) +- docs: Typo in 06-hardware.md @akaMrNagar (#1408) +- fix(API): #1409 fix wrong prefix for threads api @namchuai (#1410) +- Update model hub @hahuyhoang411 (#1383) +- fix(Model): remove unsupported default model setting params @namchuai (#1382) +- fix(trinity): update cover path for trinity v1.2 @hahuyhoang411 (#1380) +- Chore/update model hub @hahuyhoang411 (#1342) +- Update about.md @Ssstars (#1359) +- fix(JanHub): #1158 sort model list @namchuai (#1257) +- fix(Message): open link with external browser @namchuai (#1339) +- feat(Model): #1028 made model.json optional @namchuai (#1314) +- docs: Update onboarding.md @Diane0111 (#1293) +- fix: clean resource on exit @louis-jan (#1290) +- fix: posthog configuration @hieu-jan (#1283) +- docs: update README.md @eltociear (#1277) +- Enable scrolling in the message chat box @Gri-ffin (#1280) +- chore: Update README.md @sr-albert (#1263) +- Adding new model to the Hub @hahuyhoang411 (#1213) +- Feature GPU detection for Jan on Windows and Linux @hiento09 (#1242) +- fix(Thread): #1168 fix newly created thread cannot select model after restart @namchuai (#1176) + +## 🚀 Features + +- feat: add compatibility tag to model selection in right panel @urmauur (#1552) +- Feature integrate antivirus scanner to ci @hiento09 (#1529) +- feat: [hub] update compatibility tags colors @urmauur (#1516) +- feat: hub recommendation labels @urmauur (#1440) +- Feature linux support app image format @hiento09 (#1442) +- fix: render external links @urmauur (#1441) +- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) +- feat(UI): update UI footer @urmauur (#1424) +- Fix Bug for Chat Reply Goes off Screen @mishrababhishek (#1393) +- feat: move social media from left panel into footer @urmauur (#1325) +- feat: implementation new UI thread settings @urmauur (#1301) +- Bring social media links @Gri-ffin (#1295) +- feat: added keyboard shortcut list in setting page @urmauur (#1275) +- feat: add swagger /docs to localhost:1337 @louis-jan (#1268) +- feat: update posthog configuration @hieu-jan (#1258) +- feat: Deprecate model.json ready state in favor of .download ext @louis-jan (#1238) +- feat: add engine settings @namchuai (#1199) +- feat: users should be able to switch models mid-thread @louis-jan (#1226) +- feat: temporary link how to import model @urmauur (#1209) + +## 🐛 Fixes + +- fix: #1594 - Model settings - change thread model - go back does not see according settings @louis-jan (#1595) +- fix: #1548 - duplicate command shortcut instruction @louis-jan (#1600) +- fix: switch model caused app crash @louis-jan (#1597) +- fix: #1559 Inference Parameters displayed on new thread with Openai GPT Model @louis-jan (#1588) +- fix: enable user set value manually model setting from input @urmauur (#1585) +- fix: #1569 - Does not apply thread settings when loading model @louis-jan (#1576) +- fix: could not change model params settings @louis-jan (#1547) +- fix: gpu check module export does not work in extension @louis-jan (#1536) +- fix: adjust calculation hub labels using total RAM instead remaining RAM @urmauur (#1522) +- Feature integrate antivirus scanner to ci @hiento09 (#1529) +- fix: allow users to set max tokens variably @urmauur (#1513) +- fix: stop word update @louis-jan (#1457) +- Revert nitro to 0.2.6 @hiento09 (#1491) +- fix: enable text selection codeblock @urmauur (#1466) +- fix: suppress all main node JS error message dialog @louis-jan (#1460) +- Correct AppImage path @hiento09 (#1446) +- fix: render external links @urmauur (#1441) +- fix: add icon collapsible left panel and update keyboard shortcut page @urmauur (#1439) +- fix: GET /models does not work due to new default model dir @louis-jan (#1392) +- fix: model migration stopped working @louis-jan (#1378) +- fix: wrong condition for displaying error message @louis-jan (#1376) +- fix: show hide section engine params @urmauur (#1374) +- fix: copy stream tooltip and hide section when no params setting @urmauur (#1373) +- bugs: fix stop streaming when user delete or clean thread @urmauur (#1347) +- fix: show a proper error message on download failure @louis-jan (#1345) +- Add detect cuda version jan app @hiento09 (#1351) +- fix: Error occurred: Unexpected token "d", "data: ..." is not a valid JSON @louis-jan (#1332) +- fix: app getting stuck at downloading 99% while downloading model @louis-jan (#1320) +- correct type utf-8 @hiento09 (#1311) +- Fix memory on mac included cached and swap @hiento09 (#1298) +- fix: should check app dir before spawning log @louis-jan (#1297) +- fix: disable process logging from server @louis-jan (#1296) +- fix: user should be able to access Swagger docs from localhost:1337 @louis-jan (#1292) +- Switch from Gigabyte to Gibibyte - System monitor @hiento09 (#1286) +- Switch from systeminformation to os-utils to resolve Bitdefender false positive and memory leak issue @hiento09 (#1282) +- fix: swagger CSP issue @louis-jan (#1284) +- fix: support markdown break line @urmauur (#1274) +- fix ci test run failed @hiento09 (#1267) +- Fix wrong linux nitro path @hiento09 (#1266) +- fix: enable command enter on dialog confirmation clean thread @urmauur (#1261) +- fix: input message duplicated due with some input sources @louis-jan (#1259) +- fix: mac users should not see GPU settings @louis-jan (#1255) +- fix: remove redundant gpu detection prompt event @louis-jan (#1254) +- fix: engine settings GUI - feature toggle @louis-jan (#1252) +- Fix bug #1178 high ram on windows @hiento09 (#1241) +- fix: #1183 Reveal in finder does not work on windows @namchuai (#1239) +- fix: remove delay tooltip and click event @urmauur (#1217) +- fix: enable enter command on dialog confirmation delete thread @urmauur (#1218) +- fix: Cleared thread last message is not updated @louis-jan (#1225) +- Fix switch thread crash nitro windows linux @hiento09 (#1214) +- fix: darkmode broken color @urmauur (#1186) + +## 🧰 Maintenance + +- chore: typo model.json @louis-jan (#1599) +- docs: add 04-how-to-get-error-logs.mdx @hieu-jan (#1580) +- chore: teach how to attach logs @0xSage (#1578) +- chore: issues should auto close with PRs through template @0xSage (#1577) +- chore: Update issue templates @0xSage (#1568) +- docs: fix x handles @0xSage (#1532) +- Docs to integrate OpenRouter with Jan without UI/UX @0xgokuz (#1495) +- chore: fix darkmode docs @hieu-jan (#1520) +- docs: fix algolia configuration @hieu-jan (#1518) +- docs: fix algolia configuration @hieu-jan (#1517) +- Revert URL release in readme to version 0.4.3 @hiento09 (#1502) +- refactor: add app and nitro log - resolve dependencies issue @louis-jan (#1447) +- chore: enable agolia @hieu-jan (#1497) +- docs: update troubleshooting and redirects old pages @hieu-jan (#1492) +- docs: minor fix @hieu-jan (#1478) +- docs: initial handbook structure @hieu-jan (#1477) +- Bump nitro to 0.2.8 and change Jan App to support cuda >= 11.7 @hiento09 (#1476) +- Chore update docs jan - add AppImage instruction to docusaurus @hiento09 (#1480) +- Bump nitro to 0.2.7 @hiento09 (#1474) +- chore: error message update @louis-jan (#1473) +- docs: Update 02-import-manually.mdx @0xSage (#1469) +- docs: Update about.md @0xSage (#1465) +- Bump nitro version to 0.2.6 @hiento09 (#1458) +- docs: adding customize engine settings @hieu-jan (#1455) +- docs: add-missing-path @hieu-jan (#1454) +- docs: resize gif @hieu-jan (#1453) +- docs: revenue philosophy @0xSage (#1443) +- docs: jan framework principles @0xSage (#1438) +- docs: fix typo in docs @hieu-jan (#1419) +- chore: clean up use os hook @namchuai (#1418) +- docs: explain each docs page intent @0xSage (#1417) +- docs: Update 01-server.md @0xSage (#1416) +- Update warning url from github md file to jan.ai docs site @hiento09 (#1414) +- docs: improve gpu not used guide @hieu-jan (#1405) +- chore: update README.md @eltociear (#1406) +- Update USAGE docs for linux @hiento09 (#1401) +- docs: gpu not detected @0xSage (#1399) +- docs: Troubleshoot Failed To Fetch @gabrielle-ong (#1398) +- docs: improve docs syntax @hieu-jan (#1394) +- docs: add-install-nightly-guide @hieu-jan (#1390) +- docs: correct href link @hieu-jan (#1338) +- docs: fix chat payload and cURL @hieu-jan (#1360) +- docs: add Chatting Guide @hieu-jan (#1184) +- Chore add docs usage how to switch run mode jan app @hiento09 (#1353) +- docs: configure index page @hieu-jan (#1330) +- docs: Update product.md @0xSage (#1326) +- docs: Update 01-server.md @0xSage (#1327) +- refactor: deprecate the appVersion IPC and use the predefined VERSION @louis-jan (#1309) +- docs: update using models documentation @hieu-jan (#1288) +- docs: update pm handbook @0xSage (#1307) +- docs: contributor docs overview @0xSage (#1305) +- chore: github PR template @0xSage (#1304) +- Fix memory on mac included cached and swap @hiento09 (#1298) +- Enrich discord message for nightly build url @hiento09 (#1294) +- Refactor CI by create shared jobs output @hiento09 (#1287) +- docs: update README.md @hieu-jan (#1281) +- docs: Update README.md @0xSage (#1248) +- feat: Jan Server, API and decoupled clients @louis-jan (#948) +- docs: improve 02-import-manually @hieu-jan (#1222) +- chore: Update issue templates @0xSage (#1229) +- docs: Update 02-import-manually.mdx @0xSage (#1197) +- add sleep 500ms if platform is windows before starting nitro process @hiento09 (#1215) +- docs: improve troubleshoot documentation @hieu-jan (#1173) +- docs: update bug report template @hieu-jan (#1180) +- docs: add troubleshooting @hieu-jan (#1169) +- chore: copy fixes @0xSage (#1167) +- docs: Update 01-start-thread.md @0xSage (#1122) + +## Contributor + +@0xSage, @0xgokuz, @Diane0111, @Gri-ffin, @Ssstars, @akaMrNagar, @eltociear, @gabrielle-ong, @hahuyhoang411, @hiento09, @hieu-jan, @jan-service-account, @louis-jan, @mishrababhishek, @namchuai, @sr-albert, @urmauur and Abhishek Mishra diff --git a/docs/docs/releases/changelog/changelog-v0.4.5.mdx b/docs/docs/releases/changelog/changelog-v0.4.5.mdx index d2e1d245b..4c9163dc7 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.5.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.5.mdx @@ -8,96 +8,96 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1758: bug: Correct text for Windows](https://github.com/janhq/jan/issues/1758) -## Changes - -- fix(Wording): #1758 correct text for windows @namchuai (#1768) -- fix(Log): server log is not display in windows @namchuai (#1764) -- Release Cut v0.4.5 @louis-jan (#1752) -- chore(nitro): 0.2.11 -> 0.2.12 @hiro-v (#1754) -- fix: Nitro CPU threads with correct physical/ performance CPU count @hiro-v (#1726) -- fix(Model): #1662 imported model does not use gpu @namchuai (#1723) -- fix(API): #1720 host/port provided in the local API server does not fully applied @namchuai (#1721) -- fix: server API reference @hiro-v (#1670) -- fix(Model): refactor model label @namchuai (#1596) -- docs/postmortem v 0.4.4 @hieu-jan (#1617) -- chore(ShortcutModal): clean up shortcut modal @namchuai (#1614) -- chore(Dependencies): upgrade node-fetch to fix vulnerable issue @namchuai (#1598) - -## 🚀 Features - -- feat: update UI allow user change folder @urmauur (#1738) -- feat: error message when not enough RAM @urmauur (#1706) -- feat: improvement ux for local api server @urmauur (#1704) -- feat: allow user to move jan folder @namchuai (#1649) -- feat: HTTP proxy support @markmehere (#1562) -- Feature add schedule clean cloudflare page and r2 @hiento09 (#1653) -- feat: relayout left panel setting page @urmauur (#1648) -- Update CI follow git flow @hiento09 (#1625) -- feat: Implement UI page API server dashboard @urmauur (#1636) -- fix: #1545 long thread title @lucido-simon (#1605) - -## 🐛 Fixes - -- fix: model selection does not show in API settings page @louis-jan (#1828) -- fix: user can't view model setting in local api server @namchuai (#1807) -- fix: cannot change jan data folder @namchuai (#1805) -- fix: model selection does not show in API settings page @louis-jan (#1802) -- fix: user can't use a model in model hub @namchuai (#1801) -- fix: stop openai inference raises something amiss @louis-jan (#1799) -- regression fix: input disabled darkmode @urmauur (#1800) -- fix: clean last message when user clean thread message @namchuai (#1793) -- fix: app log not being printed @namchuai (#1790) -- fix: api settings are not applied on changes @louis-jan (#1789) -- fix: could not delete model @louis-jan (#1779) -- fix: can not start model when server is not enabled from model settings page @louis-jan (#1774) -- regression fix: input port not accept alphabets @urmauur (#1772) -- Correct bash script syntax in ci @hiento09 (#1769) -- Hotfix CI pre-release not trigger @hiento09 (#1757) -- fix: bring back open app directory @louis-jan (#1756) -- fix: input port have range validation @urmauur (#1741) -- Fix error nightly build schedule run failed @hiento09 (#1736) -- fix: active model when start server @urmauur (#1719) -- fix: Change to fixed `localhost` instead of using host variable @hiro-v (#1729) -- Fix autoupdater nightly build error @hiento09 (#1727) -- Correct download url readme @hiento09 (#1724) -- fix: API chat/completion is blocked by CORS @louis-jan (#1705) -- fix: Jan server - v1/chat/completions is throwing ERR\_REQUIRE\_ESM @louis-jan (#1703) -- fix: Jan server is showing blank page @louis-jan (#1702) -- fix: switching loader from remote to local model from thread right panel @urmauur (#1692) -- fix: hot-fix algolia search @hieu-jan (#1700) -- fix: disable api key field while server is running @urmauur (#1694) -- fix: stoping model show starting model @urmauur (#1693) -- fix bug #1650 hogging resources @hiento09 (#1663) -- fix: auto select text when collapse panel @urmauur (#1645) -- fix: wrong selected model ref @louis-jan (#1638) -- fix: enable check for update on all supported platforms @louis-jan (#1626) -- fix: correct footer @hieu-jan (#1628) - -## 🧰 Maintenance - -- Docs publish to github page trigger on push to docs branch @hiento09 (#1783) -- Correct bash script syntax in ci @hiento09 (#1769) -- Combine 2 ci pipeline pre-release and nightly into one @hiento09 (#1767) -- Hotfix CI pre-release not trigger @hiento09 (#1757) -- Fix error nightly build schedule run failed @hiento09 (#1736) -- docs: add troubleshoot unexpected token @hieu-jan (#1711) -- docs: fix about pages @0xSage (#1699) -- refactor: deprecate extension type implementation @louis-jan (#1677) -- refactor: file prefix replace utils \& add unit test @louis-jan (#1676) -- Correct ref branch for update url on README.md file @hiento09 (#1672) -- docs: update 02-somethings-amiss @hieu-jan (#1668) -- Cherrypick cicd to main branch to apply new gitflow @hiento09 (#1665) -- docs: add user and developer guides for extensions @hieu-jan (#1657) -- docs: add QA Script @hieu-jan (#1660) -- chore: Bump nitro to 0.2.11 @hiro-v (#1655) -- chore: Bump version nitro to 0.2.10 @hiro-v (#1644) -- docs: add antivirus compatibility testing @hieu-jan (#1641) -- refactor: introduce node module in nitro extension @louis-jan (#1630) -- Update 02-somethings-amiss.mdx @Ssstars (#1634) -- docs: add integration AzureOpenAI @hieu-jan (#1632) -- docs: add troubleshooting permission denied @hieu-jan (#1631) - -## Contributor - -@0xSage, @Ssstars, @hiento09, @hientominh, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @lucido-simon, @markmehere, @namchuai and @urmauur +## Changes + +- fix(Wording): #1758 correct text for windows @namchuai (#1768) +- fix(Log): server log is not display in windows @namchuai (#1764) +- Release Cut v0.4.5 @louis-jan (#1752) +- chore(nitro): 0.2.11 -> 0.2.12 @hiro-v (#1754) +- fix: Nitro CPU threads with correct physical/ performance CPU count @hiro-v (#1726) +- fix(Model): #1662 imported model does not use gpu @namchuai (#1723) +- fix(API): #1720 host/port provided in the local API server does not fully applied @namchuai (#1721) +- fix: server API reference @hiro-v (#1670) +- fix(Model): refactor model label @namchuai (#1596) +- docs/postmortem v 0.4.4 @hieu-jan (#1617) +- chore(ShortcutModal): clean up shortcut modal @namchuai (#1614) +- chore(Dependencies): upgrade node-fetch to fix vulnerable issue @namchuai (#1598) + +## 🚀 Features + +- feat: update UI allow user change folder @urmauur (#1738) +- feat: error message when not enough RAM @urmauur (#1706) +- feat: improvement ux for local api server @urmauur (#1704) +- feat: allow user to move jan folder @namchuai (#1649) +- feat: HTTP proxy support @markmehere (#1562) +- Feature add schedule clean cloudflare page and r2 @hiento09 (#1653) +- feat: relayout left panel setting page @urmauur (#1648) +- Update CI follow git flow @hiento09 (#1625) +- feat: Implement UI page API server dashboard @urmauur (#1636) +- fix: #1545 long thread title @lucido-simon (#1605) + +## 🐛 Fixes + +- fix: model selection does not show in API settings page @louis-jan (#1828) +- fix: user can't view model setting in local api server @namchuai (#1807) +- fix: cannot change jan data folder @namchuai (#1805) +- fix: model selection does not show in API settings page @louis-jan (#1802) +- fix: user can't use a model in model hub @namchuai (#1801) +- fix: stop openai inference raises something amiss @louis-jan (#1799) +- regression fix: input disabled darkmode @urmauur (#1800) +- fix: clean last message when user clean thread message @namchuai (#1793) +- fix: app log not being printed @namchuai (#1790) +- fix: api settings are not applied on changes @louis-jan (#1789) +- fix: could not delete model @louis-jan (#1779) +- fix: can not start model when server is not enabled from model settings page @louis-jan (#1774) +- regression fix: input port not accept alphabets @urmauur (#1772) +- Correct bash script syntax in ci @hiento09 (#1769) +- Hotfix CI pre-release not trigger @hiento09 (#1757) +- fix: bring back open app directory @louis-jan (#1756) +- fix: input port have range validation @urmauur (#1741) +- Fix error nightly build schedule run failed @hiento09 (#1736) +- fix: active model when start server @urmauur (#1719) +- fix: Change to fixed `localhost` instead of using host variable @hiro-v (#1729) +- Fix autoupdater nightly build error @hiento09 (#1727) +- Correct download url readme @hiento09 (#1724) +- fix: API chat/completion is blocked by CORS @louis-jan (#1705) +- fix: Jan server - v1/chat/completions is throwing ERR\_REQUIRE\_ESM @louis-jan (#1703) +- fix: Jan server is showing blank page @louis-jan (#1702) +- fix: switching loader from remote to local model from thread right panel @urmauur (#1692) +- fix: hot-fix algolia search @hieu-jan (#1700) +- fix: disable api key field while server is running @urmauur (#1694) +- fix: stoping model show starting model @urmauur (#1693) +- fix bug #1650 hogging resources @hiento09 (#1663) +- fix: auto select text when collapse panel @urmauur (#1645) +- fix: wrong selected model ref @louis-jan (#1638) +- fix: enable check for update on all supported platforms @louis-jan (#1626) +- fix: correct footer @hieu-jan (#1628) + +## 🧰 Maintenance + +- Docs publish to github page trigger on push to docs branch @hiento09 (#1783) +- Correct bash script syntax in ci @hiento09 (#1769) +- Combine 2 ci pipeline pre-release and nightly into one @hiento09 (#1767) +- Hotfix CI pre-release not trigger @hiento09 (#1757) +- Fix error nightly build schedule run failed @hiento09 (#1736) +- docs: add troubleshoot unexpected token @hieu-jan (#1711) +- docs: fix about pages @0xSage (#1699) +- refactor: deprecate extension type implementation @louis-jan (#1677) +- refactor: file prefix replace utils \& add unit test @louis-jan (#1676) +- Correct ref branch for update url on README.md file @hiento09 (#1672) +- docs: update 02-somethings-amiss @hieu-jan (#1668) +- Cherrypick cicd to main branch to apply new gitflow @hiento09 (#1665) +- docs: add user and developer guides for extensions @hieu-jan (#1657) +- docs: add QA Script @hieu-jan (#1660) +- chore: Bump nitro to 0.2.11 @hiro-v (#1655) +- chore: Bump version nitro to 0.2.10 @hiro-v (#1644) +- docs: add antivirus compatibility testing @hieu-jan (#1641) +- refactor: introduce node module in nitro extension @louis-jan (#1630) +- Update 02-somethings-amiss.mdx @Ssstars (#1634) +- docs: add integration AzureOpenAI @hieu-jan (#1632) +- docs: add troubleshooting permission denied @hieu-jan (#1631) + +## Contributor + +@0xSage, @Ssstars, @hiento09, @hientominh, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @lucido-simon, @markmehere, @namchuai and @urmauur diff --git a/docs/docs/releases/changelog/changelog-v0.4.6.mdx b/docs/docs/releases/changelog/changelog-v0.4.6.mdx index 37bc2d493..58bbe258b 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.6.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.6.mdx @@ -8,57 +8,57 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #1918: Regression fix assistant extension codesign](https://github.com/janhq/jan/pull/1918) -## Changes - -- Regression fix assitant extension codesign @hiento09 (#1918) -- Release cut 0.4.6 @louis-jan (#1888) -- feat: add factory reset feature @namchuai (#1750) -- chore: add react developer tools to electron @Helloyunho (#1858) -- Sync Release 0.4.5 to dev @louis-jan (#1830) - -## 🚀 Features - -- feat: integrate umami @hieu-jan (#1809) -- feat: Add default value for ngl @hiro-v (#1886) -- feat: add start/stop model via http api @namchuai (#1862) -- feat: add snackbar component and update style side banner @urmauur (#1874) -- feat: move open app directory into icon folder @urmauur (#1879) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- feat: put timestamp under thread name in left panel @urmauur (#1820) -- perf: remove unnecessary rerender when user typing input @namchuai (#1818) - -## 🐛 Fixes - -- fix: umami analytics send app loaded event @louis-jan (#1928) -- fix: migration loading indicator @louis-jan (#1913) -- fix: broken manual import model with NA fields @louis-jan (#1912) -- fix: openAIEmbedding now requires top level API Key configuration @louis-jan (#1902) -- fix: load model fail overlays thread message error @louis-jan (#1901) -- fix: show generate response on message send @louis-jan (#1895) -- fix: display error message on model load fail @louis-jan (#1894) -- fix: the selected model auto revert back to previous used model with setting mismatch @louis-jan (#1883) -- fix: add dialog confirm when move folder and next dest isn't empty @urmauur (#1880) -- Increase timeout for explore.e2e.spec test @hiento09 (#1844) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- fix: auto collapse retrieval setting while update config @urmauur (#1866) -- fix: loader show while error global when change folder @urmauur (#1870) -- fix: retrieval always ask for api key @louis-jan (#1856) -- fix: all input text box are disabled @namchuai (#1855) -- fix: add loader when user change folder @urmauur (#1850) -- Add code sign step for darwin assistant extension @hiento09 (#1841) -- fix: preserve focused thread when navigating in jan app @namchuai (#1814) -- fix: highlight menu dropdown server options @urmauur (#1831) - -## 🧰 Maintenance - -- chore: mark RAG as experimental feature @louis-jan (#1882) -- Increase timeout for explore.e2e.spec test @hiento09 (#1844) -- chore: Bump nitro to 0.3.3 @hiro-v (#1877) -- chore: Jan Data Folder setting is no longer an experimental feature @louis-jan (#1847) -- chore: resolve main conflict @louis-jan (#1833) -- Update release url on README to default branch instead of main branch @hiento09 (#1832) - -## Contributor - -@Helloyunho, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai, @urmauur and James +## Changes + +- Regression fix assitant extension codesign @hiento09 (#1918) +- Release cut 0.4.6 @louis-jan (#1888) +- feat: add factory reset feature @namchuai (#1750) +- chore: add react developer tools to electron @Helloyunho (#1858) +- Sync Release 0.4.5 to dev @louis-jan (#1830) + +## 🚀 Features + +- feat: integrate umami @hieu-jan (#1809) +- feat: Add default value for ngl @hiro-v (#1886) +- feat: add start/stop model via http api @namchuai (#1862) +- feat: add snackbar component and update style side banner @urmauur (#1874) +- feat: move open app directory into icon folder @urmauur (#1879) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- feat: put timestamp under thread name in left panel @urmauur (#1820) +- perf: remove unnecessary rerender when user typing input @namchuai (#1818) + +## 🐛 Fixes + +- fix: umami analytics send app loaded event @louis-jan (#1928) +- fix: migration loading indicator @louis-jan (#1913) +- fix: broken manual import model with NA fields @louis-jan (#1912) +- fix: openAIEmbedding now requires top level API Key configuration @louis-jan (#1902) +- fix: load model fail overlays thread message error @louis-jan (#1901) +- fix: show generate response on message send @louis-jan (#1895) +- fix: display error message on model load fail @louis-jan (#1894) +- fix: the selected model auto revert back to previous used model with setting mismatch @louis-jan (#1883) +- fix: add dialog confirm when move folder and next dest isn't empty @urmauur (#1880) +- Increase timeout for explore.e2e.spec test @hiento09 (#1844) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- fix: auto collapse retrieval setting while update config @urmauur (#1866) +- fix: loader show while error global when change folder @urmauur (#1870) +- fix: retrieval always ask for api key @louis-jan (#1856) +- fix: all input text box are disabled @namchuai (#1855) +- fix: add loader when user change folder @urmauur (#1850) +- Add code sign step for darwin assistant extension @hiento09 (#1841) +- fix: preserve focused thread when navigating in jan app @namchuai (#1814) +- fix: highlight menu dropdown server options @urmauur (#1831) + +## 🧰 Maintenance + +- chore: mark RAG as experimental feature @louis-jan (#1882) +- Increase timeout for explore.e2e.spec test @hiento09 (#1844) +- chore: Bump nitro to 0.3.3 @hiro-v (#1877) +- chore: Jan Data Folder setting is no longer an experimental feature @louis-jan (#1847) +- chore: resolve main conflict @louis-jan (#1833) +- Update release url on README to default branch instead of main branch @hiento09 (#1832) + +## Contributor + +@Helloyunho, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @namchuai, @urmauur and James diff --git a/docs/docs/releases/changelog/changelog-v0.4.7.mdx b/docs/docs/releases/changelog/changelog-v0.4.7.mdx index 7e7942096..57e5cfa16 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.7.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.7.mdx @@ -8,111 +8,111 @@ For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4 Highlighted Issue: [Issue #2121: Release cut v0.4.7](https://github.com/janhq/jan/pull/2121) -## Changes - -- Release cut v0.4.7 @louis-jan (#2121) -- chore: update models @hahuyhoang411 (#1829) -- add docs for entire advanced settings @hieu-jan (#2063) -- docs: Fix #2040 : added /v1 path to apiBase @ldebs (#2041) -- fix: ui for disabled state of gpu acceleration @namchuai (#2034) -- feat: Initialize POM structure with fixtures on Playwright @Van-QA (#2015) -- Alternative solution for `Thread titles should auto-summarize Topic` @0xgokuz (#1976) -- Update authors.yml Rex @hahuyhoang411 (#1956) -- Update authors.yml Louis @louis-jan (#1955) -- Change env Dockerfile.gpu and update README @hiento09 (#1963) -- chore: Update authors.yml for Van Pham @Van-QA (#1954) -- Sync dev branch to docs branch @hieu-jan (#1948) -- sync current docs branch to dev branch @hieu-jan (#1947) -- feat: Playwright capture screenshot of Electron desktop app (Jan) on failures @Van-QA (#1934) -- Sync main to dev after release 0.4.6 @hiento09 (#1929) - -## 🚀 Features - -- feat: Add nitro vulkan to support AMD GPU/ APU and Intel Arc GPU @hiro-v (#2056) -- fix: flow edit message @urmauur (#2113) -- Feature helmchart and ci jan server @hiento09 (#2106) -- feat: improvementUI GPU acceleration @urmauur (#1990) -- feat: add edit messages users @urmauur (#1974) -- feat: revamp ui dropdown list model option @urmauur (#1977) -- feat: add modal troubleshooting guideline @urmauur (#1968) -- feat: integrate umami script locally @hieu-jan (#1958) -- feat: User Selectable GPUs and GPU-based Model Recommendations @hiento09 (#1730) - -## 🐛 Fixes - -- fix: correct vulkan settings @louis-jan (#2128) -- fix: chore UI @louis-jan (#2125) -- Regression: bump nitro to 0.3.13 @hiento09 (#2124) -- Regression: Linux vulkan binary path @hiento09 (#2123) -- fix: revert back menu actions @louis-jan (#2120) -- fix: mismatching between nightly build and version - jan about @louis-jan (#2114) -- fix: flow edit message @urmauur (#2113) -- fix: tools section should be expanded by default @louis-jan (#2110) -- fix: failed to bind port - nitro error message copy @louis-jan (#2101) -- fix: remove caret down icon when tab selected into remote model @urmauur (#2102) -- fix: openai client sdk compatible @louis-jan (#2096) -- Fix bug #2005 docker blank website @hiento09 (#2093) -- fix: check if port is occupied before start local server @namchuai (#2098) -- fix: broken model.json update @louis-jan (#2099) -- fix: make text input scrollable @urmauur (#2083) -- fix: failed to send message blocks thread creation @louis-jan (#2091) -- fix: server crashes on missing module @louis-jan (#2089) -- fix: expand assistant and model settings by default @louis-jan (#2081) -- fix: move jan data folder - error handling for no write permission granted @louis-jan (#2077) -- fix: check for updates should show no update are available on the latest build @louis-jan (#2075) -- fix: infinity showed when haven't get total size @namchuai (#2066) -- fix: should stop running the model when GPU settings are changed @louis-jan (#2067) -- fix: settings page state loop and dark theme @louis-jan (#2065) -- fix: Fix Nitro windows with error 3221225781 @hiro-v (#2057) -- fix: message should only be interrupted when i start another thread @louis-jan (#2053) -- fix: local server start error should not change to started state @louis-jan (#2052) -- fix: update copy of message queue @louis-jan (#2051) -- fix: download mutilple binaries @namchuai (#2043) -- fix: disable gpu drop down box if there's no GPU ready @namchuai (#2046) -- fix: app should generate thread title with length restriction @louis-jan (#2037) -- fix: factory reset not remove jan data folder @namchuai (#2027) -- fix: content setting right panel default to collapse @urmauur (#2026) -- fix: local server blank parameters if there is no thread selected @louis-jan (#2028) -- fix: model path backward compatible @louis-jan (#2018) -- fix: resolve state update loop infinitive rerendering @louis-jan (#2017) -- fix: lack of auto-cleaning mechanism for logs @louis-jan (#2003) -- fix: app stuck regenerating assistant response @louis-jan (#2001) -- fix: decouple thread summary update @louis-jan (#1994) -- fix: app fails gracefully with clear error messages @louis-jan (#1993) -- fix: retrieval stuck at generating response @louis-jan (#1988) -- Fix macos auto update failed on nightly build @hiento09 (#1991) -- fix: model downloads broken on nightly @louis-jan (#1984) -- fix: RAG enhancements @urmauur (#1965) -- Update docs run Jan Server in Docker mode @hiento09 (#1960) -- fix: update conditional check last status message @urmauur (#1951) -- fix: markdown render for chat completion role user @urmauur (#1944) -- fix: avoid users to create so many threads at the same time @urmauur (#1930) -- fix: download model will close panel item hub @urmauur (#1923) - -## 🧰 Maintenance - -- docs: improve integrations guide \& import model using absolute path @hieu-jan (#2076) -- chore: add app version into log @namchuai (#2116) -- docs: add integration docs Mistral AI API @hieu-jan (#2070) -- docs:add-advanced-settings-https-proxy @hieu-jan (#2054) -- chore: refactor watch system resource hook @louis-jan (#2048) -- docs: Updates Guide Using the Local Server @SamPatt (#1924) -- server install core using link instead of file @hiento09 (#2025) -- chore: prettier fix @louis-jan (#2019) -- chore: bump nitro 0.3.9 @louis-jan (#2016) -- refactor: reduce IPC \& API handlers - shared node logics @louis-jan (#2011) -- docs: update 03-gpu-not-used with RTX issues @hieu-jan (#1992) -- docs: add Jan installation using Docker @hieu-jan (#1981) -- chore: reduce bundle size @louis-jan (#1970) -- docs: add author.yml @hieu-jan (#1973) -- Update authors.yml hien @hiento09 (#1953) -- chore: server download progress + S3 @louis-jan (#1925) -- chore: add author james @namchuai (#1952) -- chore: Add author - Ashley @imtuyethan (#1950) -- chore: Add Author - Hiro @hiro-v (#1949) -- docs: adding new feature for v0.4.6 to release checklist @Van-QA (#1927) - -## Contributor - -@0xSage, @0xgokuz, @SamPatt, @Van-QA, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @imtuyethan, @jan-service-account, @ldebs, @louis-jan, @namchuai, @urmauur and James +## Changes + +- Release cut v0.4.7 @louis-jan (#2121) +- chore: update models @hahuyhoang411 (#1829) +- add docs for entire advanced settings @hieu-jan (#2063) +- docs: Fix #2040 : added /v1 path to apiBase @ldebs (#2041) +- fix: ui for disabled state of gpu acceleration @namchuai (#2034) +- feat: Initialize POM structure with fixtures on Playwright @Van-QA (#2015) +- Alternative solution for `Thread titles should auto-summarize Topic` @0xgokuz (#1976) +- Update authors.yml Rex @hahuyhoang411 (#1956) +- Update authors.yml Louis @louis-jan (#1955) +- Change env Dockerfile.gpu and update README @hiento09 (#1963) +- chore: Update authors.yml for Van Pham @Van-QA (#1954) +- Sync dev branch to docs branch @hieu-jan (#1948) +- sync current docs branch to dev branch @hieu-jan (#1947) +- feat: Playwright capture screenshot of Electron desktop app (Jan) on failures @Van-QA (#1934) +- Sync main to dev after release 0.4.6 @hiento09 (#1929) + +## 🚀 Features + +- feat: Add nitro vulkan to support AMD GPU/ APU and Intel Arc GPU @hiro-v (#2056) +- fix: flow edit message @urmauur (#2113) +- Feature helmchart and ci jan server @hiento09 (#2106) +- feat: improvementUI GPU acceleration @urmauur (#1990) +- feat: add edit messages users @urmauur (#1974) +- feat: revamp ui dropdown list model option @urmauur (#1977) +- feat: add modal troubleshooting guideline @urmauur (#1968) +- feat: integrate umami script locally @hieu-jan (#1958) +- feat: User Selectable GPUs and GPU-based Model Recommendations @hiento09 (#1730) + +## 🐛 Fixes + +- fix: correct vulkan settings @louis-jan (#2128) +- fix: chore UI @louis-jan (#2125) +- Regression: bump nitro to 0.3.13 @hiento09 (#2124) +- Regression: Linux vulkan binary path @hiento09 (#2123) +- fix: revert back menu actions @louis-jan (#2120) +- fix: mismatching between nightly build and version - jan about @louis-jan (#2114) +- fix: flow edit message @urmauur (#2113) +- fix: tools section should be expanded by default @louis-jan (#2110) +- fix: failed to bind port - nitro error message copy @louis-jan (#2101) +- fix: remove caret down icon when tab selected into remote model @urmauur (#2102) +- fix: openai client sdk compatible @louis-jan (#2096) +- Fix bug #2005 docker blank website @hiento09 (#2093) +- fix: check if port is occupied before start local server @namchuai (#2098) +- fix: broken model.json update @louis-jan (#2099) +- fix: make text input scrollable @urmauur (#2083) +- fix: failed to send message blocks thread creation @louis-jan (#2091) +- fix: server crashes on missing module @louis-jan (#2089) +- fix: expand assistant and model settings by default @louis-jan (#2081) +- fix: move jan data folder - error handling for no write permission granted @louis-jan (#2077) +- fix: check for updates should show no update are available on the latest build @louis-jan (#2075) +- fix: infinity showed when haven't get total size @namchuai (#2066) +- fix: should stop running the model when GPU settings are changed @louis-jan (#2067) +- fix: settings page state loop and dark theme @louis-jan (#2065) +- fix: Fix Nitro windows with error 3221225781 @hiro-v (#2057) +- fix: message should only be interrupted when i start another thread @louis-jan (#2053) +- fix: local server start error should not change to started state @louis-jan (#2052) +- fix: update copy of message queue @louis-jan (#2051) +- fix: download mutilple binaries @namchuai (#2043) +- fix: disable gpu drop down box if there's no GPU ready @namchuai (#2046) +- fix: app should generate thread title with length restriction @louis-jan (#2037) +- fix: factory reset not remove jan data folder @namchuai (#2027) +- fix: content setting right panel default to collapse @urmauur (#2026) +- fix: local server blank parameters if there is no thread selected @louis-jan (#2028) +- fix: model path backward compatible @louis-jan (#2018) +- fix: resolve state update loop infinitive rerendering @louis-jan (#2017) +- fix: lack of auto-cleaning mechanism for logs @louis-jan (#2003) +- fix: app stuck regenerating assistant response @louis-jan (#2001) +- fix: decouple thread summary update @louis-jan (#1994) +- fix: app fails gracefully with clear error messages @louis-jan (#1993) +- fix: retrieval stuck at generating response @louis-jan (#1988) +- Fix macos auto update failed on nightly build @hiento09 (#1991) +- fix: model downloads broken on nightly @louis-jan (#1984) +- fix: RAG enhancements @urmauur (#1965) +- Update docs run Jan Server in Docker mode @hiento09 (#1960) +- fix: update conditional check last status message @urmauur (#1951) +- fix: markdown render for chat completion role user @urmauur (#1944) +- fix: avoid users to create so many threads at the same time @urmauur (#1930) +- fix: download model will close panel item hub @urmauur (#1923) + +## 🧰 Maintenance + +- docs: improve integrations guide \& import model using absolute path @hieu-jan (#2076) +- chore: add app version into log @namchuai (#2116) +- docs: add integration docs Mistral AI API @hieu-jan (#2070) +- docs:add-advanced-settings-https-proxy @hieu-jan (#2054) +- chore: refactor watch system resource hook @louis-jan (#2048) +- docs: Updates Guide Using the Local Server @SamPatt (#1924) +- server install core using link instead of file @hiento09 (#2025) +- chore: prettier fix @louis-jan (#2019) +- chore: bump nitro 0.3.9 @louis-jan (#2016) +- refactor: reduce IPC \& API handlers - shared node logics @louis-jan (#2011) +- docs: update 03-gpu-not-used with RTX issues @hieu-jan (#1992) +- docs: add Jan installation using Docker @hieu-jan (#1981) +- chore: reduce bundle size @louis-jan (#1970) +- docs: add author.yml @hieu-jan (#1973) +- Update authors.yml hien @hiento09 (#1953) +- chore: server download progress + S3 @louis-jan (#1925) +- chore: add author james @namchuai (#1952) +- chore: Add author - Ashley @imtuyethan (#1950) +- chore: Add Author - Hiro @hiro-v (#1949) +- docs: adding new feature for v0.4.6 to release checklist @Van-QA (#1927) + +## Contributor + +@0xSage, @0xgokuz, @SamPatt, @Van-QA, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @imtuyethan, @jan-service-account, @ldebs, @louis-jan, @namchuai, @urmauur and James From 3aeb6434b8d65f5540778ceff311c63d6683d933 Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Mon, 11 Mar 2024 13:02:54 +0700 Subject: [PATCH 072/131] codesign script force sign (#2291) Co-authored-by: Hien To --- .github/scripts/auto-sign.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/auto-sign.sh b/.github/scripts/auto-sign.sh index a2130e791..e7ea49d40 100755 --- a/.github/scripts/auto-sign.sh +++ b/.github/scripts/auto-sign.sh @@ -7,6 +7,6 @@ if [[ -z "$APP_PATH" ]] || [[ -z "$DEVELOPER_ID" ]]; then fi # If both variables are set, execute the following commands -find "$APP_PATH" \( -type f -perm +111 -o -name "*.node" \) -exec codesign -s "$DEVELOPER_ID" --options=runtime {} \; +find "$APP_PATH" \( -type f -perm +111 -o -name "*.node" \) -exec codesign --force -s "$DEVELOPER_ID" --options=runtime {} \; -find "$APP_PATH" -type f -name "*.o" -exec codesign -s "$DEVELOPER_ID" --options=runtime {} \; +find "$APP_PATH" -type f -name "*.o" -exec codesign --force -s "$DEVELOPER_ID" --options=runtime {} \; From 15064ac12539b9054847574420a070d4e7907d4a Mon Sep 17 00:00:00 2001 From: Service Account Date: Mon, 11 Mar 2024 06:17:51 +0000 Subject: [PATCH 073/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8a4c03098..dd9b05088 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 From 1474a28dea28ca7df94a50a61f1640698eabf843 Mon Sep 17 00:00:00 2001 From: Service Account Date: Mon, 11 Mar 2024 06:35:11 +0000 Subject: [PATCH 074/131] Update README.md with Stable Download URLs --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dd9b05088..43b43b3e2 100644 --- a/README.md +++ b/README.md @@ -43,31 +43,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute Stable (Recommended) - + jan.exe - + Intel - + M1/M2 - + jan.deb - + jan.AppImage From 0f14faf762a3e996718a2b4dfa73a1164de9be0b Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Mon, 11 Mar 2024 14:10:11 +0700 Subject: [PATCH 075/131] docs: fix the navbar style on darkmode version --- docs/src/css/custom.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 4593f4f94..deab47c88 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -33,16 +33,24 @@ /* Dark mode styles based on Docusaurus dark theme */ [data-theme='dark'] .head_Menu div { + font-weight: bold; background-color: var(--ifm-background-color); color: var(--ifm-font-color-base); + margin-left: 0.7rem; + font-size: larger; } [data-theme='dark'] .head_Menu li { + font-weight: normal; background-color: var(--ifm-background-color); + margin-bottom: 5px; color: var(--ifm-font-color-base); } [data-theme='dark'] .head_SubMenu div { + font-weight: normal; background-color: var(--ifm-background-color); color: var(--ifm-font-color-base); + margin-left: 0rem; + font-size: medium; } From 1ce3f1158d48545e99477430fa45bb4b2682881e Mon Sep 17 00:00:00 2001 From: Service Account Date: Mon, 11 Mar 2024 09:44:33 +0000 Subject: [PATCH 076/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 43b43b3e2..f847d63d2 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 From 9876cf2156f1cbbadd0a227504d34927bf5153ed Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Mon, 11 Mar 2024 20:21:03 +0700 Subject: [PATCH 077/131] docs: redirect the install slug to /install --- docs/docusaurus.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 79d675c7a..43334c988 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,6 +1,5 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion - require("dotenv").config(); const darkCodeTheme = require("prism-react-renderer/themes/dracula"); @@ -105,6 +104,9 @@ const config = { { from: "/troubleshooting/undefined-issue/", to: "/guides/error-codes/undefined-issue/", + }, { + from: "/install/", + to: "/guides/install/", }, ], }, From 1fac400d70400dc7aea60491b259298b308f2f30 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 11 Mar 2024 20:30:32 +0700 Subject: [PATCH 078/131] fix: replace robotjs by nutjs (#2295) (#2302) * fix: replace robotjs by nutjs (#2295) * fix: do not create quick ask window on test --- electron/main.ts | 24 +++-------------------- electron/package.json | 3 +-- electron/utils/selectedText.ts | 35 +++++++++++++++++++--------------- electron/utils/tray.ts | 24 +++++++++++++++++++++++ 4 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 electron/utils/tray.ts diff --git a/electron/main.ts b/electron/main.ts index 21f95cd00..8fe4247d6 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -27,6 +27,7 @@ import { setupReactDevTool } from './utils/dev' import { cleanLogs } from './utils/log' import { registerShortcut } from './utils/selectedText' +import { createSystemTray } from './utils/tray' const preloadPath = join(__dirname, 'preload.js') const rendererPath = join(__dirname, '..', 'renderer') @@ -48,33 +49,14 @@ app .then(setupMenu) .then(handleIPCs) .then(handleAppUpdates) - .then(createQuickAskWindow) + .then(() => process.env.CI !== 'e2e' && createQuickAskWindow()) .then(createMainWindow) .then(() => { if (!app.isPackaged) { windowManager.mainWindow?.webContents.openDevTools() } }) - .then(() => { - const iconPath = join(app.getAppPath(), 'icons', 'icon-tray.png') - const tray = new Tray(iconPath) - tray.setToolTip(app.getName()) - - const contextMenu = Menu.buildFromTemplate([ - { - label: 'Open Jan', - type: 'normal', - click: () => windowManager.showMainWindow(), - }, - { - label: 'Open Quick Ask', - type: 'normal', - click: () => windowManager.showQuickAskWindow(), - }, - { label: 'Quit', type: 'normal', click: () => app.quit() }, - ]) - tray.setContextMenu(contextMenu) - }) + .then(() => process.env.CI !== 'e2e' && createSystemTray()) .then(() => { log(`Version: ${app.getVersion()}`) }) diff --git a/electron/package.json b/electron/package.json index 93c30682c..e09e0daf2 100644 --- a/electron/package.json +++ b/electron/package.json @@ -41,7 +41,6 @@ "notarize": { "teamId": "F8AH6NHVY5" }, - "icon": "icons/icon.png" }, "linux": { @@ -92,7 +91,7 @@ "request": "^2.88.2", "request-progress": "^3.0.0", "ulid": "^2.3.0", - "@hurdlegroup/robotjs": "^0.11.4" + "@nut-tree/nut-js": "^4.0.0" }, "devDependencies": { "@electron/notarize": "^2.1.0", diff --git a/electron/utils/selectedText.ts b/electron/utils/selectedText.ts index 6b2349725..a39e331a9 100644 --- a/electron/utils/selectedText.ts +++ b/electron/utils/selectedText.ts @@ -1,19 +1,24 @@ -import { clipboard, globalShortcut } from "electron"; -import { keyTap, keys } from "@hurdlegroup/robotjs"; +import { clipboard, globalShortcut } from 'electron' +import { keyboard, Key } from '@nut-tree/nut-js' /** * Gets selected text by synthesizing the keyboard shortcut * "CommandOrControl+c" then reading text from the clipboard */ export const getSelectedText = async () => { - const currentClipboardContent = clipboard.readText(); // preserve clipboard content - clipboard.clear(); - keyTap("c" as keys, process.platform === "darwin" ? "command" : "control"); - await new Promise((resolve) => setTimeout(resolve, 200)); // add a delay before checking clipboard - const selectedText = clipboard.readText(); - clipboard.writeText(currentClipboardContent); - return selectedText; -}; + const currentClipboardContent = clipboard.readText() // preserve clipboard content + clipboard.clear() + const hotkeys: Key[] = [ + process.platform === 'darwin' ? Key.LeftCmd : Key.LeftControl, + Key.C, + ] + await keyboard.pressKey(...hotkeys) + await keyboard.releaseKey(...hotkeys) + await new Promise((resolve) => setTimeout(resolve, 200)) // add a delay before checking clipboard + const selectedText = clipboard.readText() + clipboard.writeText(currentClipboardContent) + return selectedText +} /** * Registers a global shortcut of `accelerator`. The `callback` is called @@ -26,14 +31,14 @@ export const registerShortcut = ( callback: (selectedText: string) => void ) => { return globalShortcut.register(accelerator, async () => { - callback(await getSelectedText()); - }); -}; + callback(await getSelectedText()) + }) +} /** * Unregisters a global shortcut of `accelerator` and * is equivalent to electron.globalShortcut.unregister */ export const unregisterShortcut = (accelerator: Electron.Accelerator) => { - globalShortcut.unregister(accelerator); -}; \ No newline at end of file + globalShortcut.unregister(accelerator) +} diff --git a/electron/utils/tray.ts b/electron/utils/tray.ts new file mode 100644 index 000000000..2ab3e6dcc --- /dev/null +++ b/electron/utils/tray.ts @@ -0,0 +1,24 @@ +import { join } from 'path' +import { Tray, app, Menu } from 'electron' +import { windowManager } from '../managers/window' + +export const createSystemTray = () => { + const iconPath = join(app.getAppPath(), 'icons', 'icon-tray.png') + const tray = new Tray(iconPath) + tray.setToolTip(app.getName()) + + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Open Jan', + type: 'normal', + click: () => windowManager.showMainWindow(), + }, + { + label: 'Open Quick Ask', + type: 'normal', + click: () => windowManager.showQuickAskWindow(), + }, + { label: 'Quit', type: 'normal', click: () => app.quit() }, + ]) + tray.setContextMenu(contextMenu) +} From 86af902d19e0b91068a401002fe9103b08809626 Mon Sep 17 00:00:00 2001 From: NamH Date: Mon, 11 Mar 2024 21:24:31 +0700 Subject: [PATCH 079/131] fix: message from quick ask not get the selected model (#2307) Signed-off-by: James Co-authored-by: James --- web/hooks/useSendChatMessage.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/web/hooks/useSendChatMessage.ts b/web/hooks/useSendChatMessage.ts index 9e88e763a..11a57a598 100644 --- a/web/hooks/useSendChatMessage.ts +++ b/web/hooks/useSendChatMessage.ts @@ -79,6 +79,8 @@ export default function useSendChatMessage() { const setIsGeneratingResponse = useSetAtom(isGeneratingResponseAtom) const activeThreadRef = useRef() + const selectedModelRef = useRef() + useEffect(() => { modelRef.current = activeModel }, [activeModel]) @@ -91,6 +93,10 @@ export default function useSendChatMessage() { activeThreadRef.current = activeThread }, [activeThread]) + useEffect(() => { + selectedModelRef.current = selectedModel + }, [selectedModel]) + const resendChatMessage = async (currentMessage: ThreadMessage) => { if (!activeThreadRef.current) { console.error('No active thread') @@ -128,11 +134,13 @@ export default function useSendChatMessage() { type: MessageRequestType.Thread, messages: messages, threadId: activeThreadRef.current.id, - model: activeThreadRef.current.assistants[0].model ?? selectedModel, + model: + activeThreadRef.current.assistants[0].model ?? selectedModelRef.current, } const modelId = - selectedModel?.id ?? activeThreadRef.current.assistants[0].model.id + selectedModelRef.current?.id ?? + activeThreadRef.current.assistants[0].model.id if (modelRef.current?.id !== modelId) { setQueuedMessage(true) @@ -213,7 +221,7 @@ export default function useSendChatMessage() { { role: ChatCompletionRole.User, content: - selectedModel && base64Blob + selectedModelRef.current && base64Blob ? [ { type: ChatCompletionMessageContentType.Text, @@ -242,7 +250,7 @@ export default function useSendChatMessage() { ) let modelRequest = - selectedModel ?? activeThreadRef.current.assistants[0].model + selectedModelRef?.current ?? activeThreadRef.current.assistants[0].model if (runtimeParams.stream == null) { runtimeParams.stream = true } @@ -344,7 +352,8 @@ export default function useSendChatMessage() { ?.addNewMessage(threadMessage) const modelId = - selectedModel?.id ?? activeThreadRef.current.assistants[0].model.id + selectedModelRef.current?.id ?? + activeThreadRef.current.assistants[0].model.id if (modelRef.current?.id !== modelId) { setQueuedMessage(true) From c8ea16e661bc4ae74e50e4b1bbd01a9e7961b06f Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 11 Mar 2024 22:58:18 +0700 Subject: [PATCH 080/131] fix: quick ask blocks app update (#2310) --- electron/handlers/update.ts | 2 ++ electron/main.ts | 31 +++++++++++++++++++++--------- electron/managers/tray.ts | 38 +++++++++++++++++++++++++++++++++++++ electron/utils/tray.ts | 24 ----------------------- 4 files changed, 62 insertions(+), 33 deletions(-) create mode 100644 electron/managers/tray.ts delete mode 100644 electron/utils/tray.ts diff --git a/electron/handlers/update.ts b/electron/handlers/update.ts index 3f52c401e..5ea261e54 100644 --- a/electron/handlers/update.ts +++ b/electron/handlers/update.ts @@ -7,6 +7,7 @@ import { autoUpdater, } from 'electron-updater' import { AppEvent } from '@janhq/core' +import { trayManager } from '../managers/tray' export let waitingToInstallVersion: string | undefined = undefined @@ -22,6 +23,7 @@ export function handleAppUpdates() { message: 'Would you like to download and install it now?', buttons: ['Download', 'Later'], }) + trayManager.destroyCurrentTray() if (action.response === 0) await autoUpdater.downloadUpdate() }) diff --git a/electron/main.ts b/electron/main.ts index 8fe4247d6..e72c7f95a 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, Menu, Tray } from 'electron' +import { app, BrowserWindow, Tray } from 'electron' import { join } from 'path' /** @@ -27,7 +27,7 @@ import { setupReactDevTool } from './utils/dev' import { cleanLogs } from './utils/log' import { registerShortcut } from './utils/selectedText' -import { createSystemTray } from './utils/tray' +import { trayManager } from './managers/tray' const preloadPath = join(__dirname, 'preload.js') const rendererPath = join(__dirname, '..', 'renderer') @@ -39,6 +39,8 @@ const quickAskUrl = `${mainUrl}/search` const quickAskHotKey = 'CommandOrControl+J' +const gotTheLock = app.requestSingleInstanceLock() + app .whenReady() .then(setupReactDevTool) @@ -56,11 +58,23 @@ app windowManager.mainWindow?.webContents.openDevTools() } }) - .then(() => process.env.CI !== 'e2e' && createSystemTray()) + .then(() => process.env.CI !== 'e2e' && trayManager.createSystemTray()) .then(() => { log(`Version: ${app.getVersion()}`) }) .then(() => { + if (!gotTheLock) { + app.quit() + } else { + app.on('second-instance', (_event, _commandLine, _workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (windowManager.mainWindow) { + if (windowManager.mainWindow.isMinimized()) + windowManager.mainWindow.restore() + windowManager.mainWindow.focus() + } + }) + } app.on('activate', () => { if (!BrowserWindow.getAllWindows().length) { createMainWindow() @@ -73,6 +87,10 @@ app.on('ready', () => { registerGlobalShortcuts() }) +app.on('before-quit', function (evt) { + trayManager.destroyCurrentTray() +}) + app.once('quit', () => { cleanUpAndQuit() }) @@ -89,12 +107,7 @@ function createMainWindow() { function registerGlobalShortcuts() { const ret = registerShortcut(quickAskHotKey, (selectedText: string) => { - if (!windowManager.isQuickAskWindowVisible()) { - windowManager.showQuickAskWindow() - windowManager.sendQuickAskSelectedText(selectedText) - } else { - windowManager.hideQuickAskWindow() - } + windowManager.showMainWindow() }) if (!ret) { diff --git a/electron/managers/tray.ts b/electron/managers/tray.ts new file mode 100644 index 000000000..18661e58e --- /dev/null +++ b/electron/managers/tray.ts @@ -0,0 +1,38 @@ +import { join } from 'path' +import { Tray, app, Menu } from 'electron' +import { windowManager } from '../managers/window' + +class TrayManager { + currentTray: Tray | undefined + + createSystemTray = () => { + if (this.currentTray) { + return + } + const iconPath = join(app.getAppPath(), 'icons', 'icon-tray.png') + const tray = new Tray(iconPath) + tray.setToolTip(app.getName()) + + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Open Jan', + type: 'normal', + click: () => windowManager.showMainWindow(), + }, + { + label: 'Open Quick Ask', + type: 'normal', + click: () => windowManager.showQuickAskWindow(), + }, + { label: 'Quit', type: 'normal', click: () => app.quit() }, + ]) + tray.setContextMenu(contextMenu) + } + + destroyCurrentTray() { + this.currentTray?.destroy() + this.currentTray = undefined + } +} + +export const trayManager = new TrayManager() diff --git a/electron/utils/tray.ts b/electron/utils/tray.ts deleted file mode 100644 index 2ab3e6dcc..000000000 --- a/electron/utils/tray.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { join } from 'path' -import { Tray, app, Menu } from 'electron' -import { windowManager } from '../managers/window' - -export const createSystemTray = () => { - const iconPath = join(app.getAppPath(), 'icons', 'icon-tray.png') - const tray = new Tray(iconPath) - tray.setToolTip(app.getName()) - - const contextMenu = Menu.buildFromTemplate([ - { - label: 'Open Jan', - type: 'normal', - click: () => windowManager.showMainWindow(), - }, - { - label: 'Open Quick Ask', - type: 'normal', - click: () => windowManager.showQuickAskWindow(), - }, - { label: 'Quit', type: 'normal', click: () => app.quit() }, - ]) - tray.setContextMenu(contextMenu) -} From bbfc686c33334e0b619ed07f80084293aed3aa4a Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 11 Mar 2024 23:29:39 +0700 Subject: [PATCH 081/131] fix: quick ask not show (#2315) * fix: quick ask not show * fix: window resize does not work on windows 11 --- electron/main.ts | 13 +++++++------ electron/managers/window.ts | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/electron/main.ts b/electron/main.ts index e72c7f95a..78577ac68 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -68,11 +68,7 @@ app } else { app.on('second-instance', (_event, _commandLine, _workingDirectory) => { // Someone tried to run a second instance, we should focus our window. - if (windowManager.mainWindow) { - if (windowManager.mainWindow.isMinimized()) - windowManager.mainWindow.restore() - windowManager.mainWindow.focus() - } + windowManager.showMainWindow() }) } app.on('activate', () => { @@ -107,7 +103,12 @@ function createMainWindow() { function registerGlobalShortcuts() { const ret = registerShortcut(quickAskHotKey, (selectedText: string) => { - windowManager.showMainWindow() + if (!windowManager.isQuickAskWindowVisible()) { + windowManager.showQuickAskWindow() + windowManager.sendQuickAskSelectedText(selectedText) + } else { + windowManager.hideQuickAskWindow() + } }) if (!ret) { diff --git a/electron/managers/window.ts b/electron/managers/window.ts index 796a5d54a..eed80c37c 100644 --- a/electron/managers/window.ts +++ b/electron/managers/window.ts @@ -101,6 +101,7 @@ class WindowManager { expandQuickAskWindow(heightOffset: number): void { const width = quickAskWindowConfig.width! const height = quickAskWindowConfig.height! + heightOffset + this._quickAskWindow?.setMinimumSize(width, height) this._quickAskWindow?.setSize(width, height, true) } From 6f899eb1186860a07bf8880a112473cbc40eb760 Mon Sep 17 00:00:00 2001 From: Service Account Date: Mon, 11 Mar 2024 17:43:46 +0000 Subject: [PATCH 082/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f847d63d2..ef9516b81 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 From de433bbe6e76c97c5aa98ecc533b253ce2f6bb5e Mon Sep 17 00:00:00 2001 From: Service Account Date: Mon, 11 Mar 2024 20:20:46 +0000 Subject: [PATCH 083/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ef9516b81..496bbd434 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 From ad7e483df606ac4230279b90db9dddd6e16e5e9c Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 12 Mar 2024 09:21:28 +0700 Subject: [PATCH 084/131] fix: jan app tray blocks app update (#2319) --- electron/managers/tray.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/electron/managers/tray.ts b/electron/managers/tray.ts index 18661e58e..4e1c1a4ff 100644 --- a/electron/managers/tray.ts +++ b/electron/managers/tray.ts @@ -27,6 +27,7 @@ class TrayManager { { label: 'Quit', type: 'normal', click: () => app.quit() }, ]) tray.setContextMenu(contextMenu) + this.currentTray = tray } destroyCurrentTray() { From 259698eaf720f99125cfed3a102018b55822dc51 Mon Sep 17 00:00:00 2001 From: Service Account Date: Tue, 12 Mar 2024 02:36:22 +0000 Subject: [PATCH 085/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 496bbd434..107a35d29 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 From facfaa190a285cccabc4200c097ee5116dabd31f Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Tue, 12 Mar 2024 10:03:00 +0700 Subject: [PATCH 086/131] feat: quick ask support darkmode (#2316) --- web/app/search/SelectedText.tsx | 8 ++++---- web/app/search/UserInput.tsx | 5 ++--- web/app/search/page.tsx | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/web/app/search/SelectedText.tsx b/web/app/search/SelectedText.tsx index 742eba956..2bb90775e 100644 --- a/web/app/search/SelectedText.tsx +++ b/web/app/search/SelectedText.tsx @@ -29,15 +29,15 @@ const SelectedText = ({ onCleared }: { onCleared?: () => void }) => { return shouldShowSelectedText ? (
    - +
    -

    {text}

    +

    {text}

    ) : (
    diff --git a/web/app/search/UserInput.tsx b/web/app/search/UserInput.tsx index 3bf148f40..85cb9843e 100644 --- a/web/app/search/UserInput.tsx +++ b/web/app/search/UserInput.tsx @@ -56,7 +56,7 @@ const UserInput: React.FC = () => { } return ( -
    +
    { {
    - inputRef?.current?.focus()} />
    ) diff --git a/web/app/search/page.tsx b/web/app/search/page.tsx index 0822c2676..912a843bb 100644 --- a/web/app/search/page.tsx +++ b/web/app/search/page.tsx @@ -4,7 +4,7 @@ import UserInput from './UserInput' const Search: React.FC = () => { return ( -
    +
    ) From b9b421a495876a58465710da872425a8e045dd57 Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 12 Mar 2024 17:25:50 +0700 Subject: [PATCH 087/131] fix: quick app bugs (#2327) --- electron/main.ts | 20 +++++++------ electron/managers/mainWindowConfig.ts | 2 +- electron/managers/tray.ts | 36 +++++++++++++++--------- electron/managers/window.ts | 4 --- web/containers/Providers/KeyListener.tsx | 4 --- 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/electron/main.ts b/electron/main.ts index 78577ac68..b7ac0a74c 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -43,6 +43,12 @@ const gotTheLock = app.requestSingleInstanceLock() app .whenReady() + .then(() => { + if (!gotTheLock) { + app.quit() + throw new Error('Another instance of the app is already running') + } + }) .then(setupReactDevTool) .then(setupCore) .then(createUserSpace) @@ -63,22 +69,20 @@ app log(`Version: ${app.getVersion()}`) }) .then(() => { - if (!gotTheLock) { - app.quit() - } else { - app.on('second-instance', (_event, _commandLine, _workingDirectory) => { - // Someone tried to run a second instance, we should focus our window. - windowManager.showMainWindow() - }) - } app.on('activate', () => { if (!BrowserWindow.getAllWindows().length) { createMainWindow() + } else { + windowManager.showMainWindow() } }) }) .then(() => cleanLogs()) +app.on('second-instance', (_event, _commandLine, _workingDirectory) => { + windowManager.showMainWindow() +}) + app.on('ready', () => { registerGlobalShortcuts() }) diff --git a/electron/managers/mainWindowConfig.ts b/electron/managers/mainWindowConfig.ts index 184fb1c86..4f1715a94 100644 --- a/electron/managers/mainWindowConfig.ts +++ b/electron/managers/mainWindowConfig.ts @@ -5,7 +5,7 @@ export const mainWindowConfig: Electron.BrowserWindowConstructorOptions = { width: DEFAULT_WIDTH, minWidth: DEFAULT_WIDTH, height: DEFAULT_HEIGHT, - skipTaskbar: true, + skipTaskbar: false, show: true, trafficLightPosition: { x: 10, diff --git a/electron/managers/tray.ts b/electron/managers/tray.ts index 4e1c1a4ff..e7e07a0a1 100644 --- a/electron/managers/tray.ts +++ b/electron/managers/tray.ts @@ -13,20 +13,28 @@ class TrayManager { const tray = new Tray(iconPath) tray.setToolTip(app.getName()) - const contextMenu = Menu.buildFromTemplate([ - { - label: 'Open Jan', - type: 'normal', - click: () => windowManager.showMainWindow(), - }, - { - label: 'Open Quick Ask', - type: 'normal', - click: () => windowManager.showQuickAskWindow(), - }, - { label: 'Quit', type: 'normal', click: () => app.quit() }, - ]) - tray.setContextMenu(contextMenu) + tray.on('click', () => { + windowManager.showQuickAskWindow() + }) + + // Add context menu for windows only + if (process.platform === 'win32') { + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Open Jan', + type: 'normal', + click: () => windowManager.showMainWindow(), + }, + { + label: 'Open Quick Ask', + type: 'normal', + click: () => windowManager.showQuickAskWindow(), + }, + { label: 'Quit', type: 'normal', click: () => app.quit() }, + ]) + + tray.setContextMenu(contextMenu) + } this.currentTray = tray } diff --git a/electron/managers/window.ts b/electron/managers/window.ts index eed80c37c..7b97f8349 100644 --- a/electron/managers/window.ts +++ b/electron/managers/window.ts @@ -73,15 +73,11 @@ class WindowManager { hideMainWindow(): void { this.mainWindow?.hide() this._mainWindowVisible = false - // Only macos - if (process.platform === 'darwin') app.dock.hide() } showMainWindow(): void { this.mainWindow?.show() this._mainWindowVisible = true - // Only macos - if (process.platform === 'darwin') app.dock.show() } hideQuickAskWindow(): void { diff --git a/web/containers/Providers/KeyListener.tsx b/web/containers/Providers/KeyListener.tsx index d832059c2..a4702783c 100644 --- a/web/containers/Providers/KeyListener.tsx +++ b/web/containers/Providers/KeyListener.tsx @@ -24,10 +24,6 @@ export default function KeyListener({ children }: Props) { useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Escape') { - window.core?.api?.hideMainWindow() - } - const prefixKey = isMac ? e.metaKey : e.ctrlKey if (e.key === 'b' && prefixKey) { From e073e43d19fc84062153db73058ed8fc3f83230f Mon Sep 17 00:00:00 2001 From: eckartal <159995642+eckartal@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:39:53 +0300 Subject: [PATCH 088/131] Create faq.md --- docs/docs/faq.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 docs/docs/faq.md diff --git a/docs/docs/faq.md b/docs/docs/faq.md new file mode 100644 index 000000000..9e6f6bdf9 --- /dev/null +++ b/docs/docs/faq.md @@ -0,0 +1,37 @@ +# Frequently Asked Questions (FAQ) + +## How does Jan ensure my data remains private? + +Jan prioritizes your privacy by running open-source AI models 100% offline on your computer, ensuring all conversations, documents, and files stay private. + +## Can I use Jan without an internet connection? + +Yes, Jan can run locally without an internet connection for many features. + +## Is Jan compatible with my operating system? + +Jan is available for Mac, Windows, Linux, ensuring wide compatibility. + +## Are there any costs associated with using Jan? + +Jan is free to use. However, if you opt to connect to remote APIs, you will need to cover those services' costs according to their pricing, not Jan's. + +## What types of AI models can I download or import with Jan? + +You can download popular AI models or import any model of your choice through Jan's Hub. + +## How do I customize Jan using the programmable API? + +The API allows you to tailor Jan to your needs, but specific details on usage would require consulting Jan's documentation. + +## How can I contribute to Jan's development or suggest features? + +Contributions can be made through GitHub and Discord, where you can also suggest features and contribute. + +## How can I get involved with the Jan community? + +Joining [Jan's Discord server](https://discord.gg/qSwXFx6Krr) is a great way to get involved with the community. + +## How do I troubleshoot issues with installing or using Jan? + +For troubleshooting, you should reach out on Discord and check GitHub for assistance and support from the community and the development team. From 32b76499d973e67586b1aad460b4577a0a9c50fb Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:54:59 +0900 Subject: [PATCH 089/131] fix: existing-changelog --- docs/plugins/changelog-plugin/fetchData.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/plugins/changelog-plugin/fetchData.js b/docs/plugins/changelog-plugin/fetchData.js index 351ab3932..a9b970b3a 100644 --- a/docs/plugins/changelog-plugin/fetchData.js +++ b/docs/plugins/changelog-plugin/fetchData.js @@ -1,5 +1,6 @@ const fs = require('fs'); const path = require('path'); +const fetch = require('node-fetch'); async function fetchData(siteConfig) { const owner = siteConfig.organizationName; @@ -70,6 +71,14 @@ async function fetchData(siteConfig) { // Process the GitHub releases data here for (const release of releases) { const version = release.tag_name; + + // Check if the changelog file already exists for the current version + const existingChangelogPath = path.join(outputDirectory, `changelog-${version}.mdx`); + if (fs.existsSync(existingChangelogPath)) { + console.log(`Changelog for version ${version} already exists. Skipping...`); + continue; + } + const releaseUrl = release.html_url; const issueNumberMatch = release.body.match(/#(\d+)/); const issueNumber = issueNumberMatch ? parseInt(issueNumberMatch[1], 10) : null; @@ -94,4 +103,4 @@ async function fetchData(siteConfig) { } } -module.exports = fetchData; \ No newline at end of file +module.exports = fetchData; From af5bcea773e0f0e574663fcf1f399f3e961f6a63 Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 12 Mar 2024 20:10:59 +0700 Subject: [PATCH 090/131] fix: gate quick ask with feature toggle (#2331) --- core/src/node/helper/config.ts | 2 +- core/src/types/config/appConfigEntity.ts | 1 + electron/main.ts | 13 ++++++- electron/managers/tray.ts | 4 +++ electron/managers/window.ts | 4 +++ web/containers/Providers/DataLoader.tsx | 9 +++-- web/helpers/atoms/AppConfig.atom.ts | 2 ++ web/hooks/useFactoryReset.ts | 1 + web/screens/Settings/Advanced/index.tsx | 45 ++++++++++++++++++++++-- 9 files changed, 74 insertions(+), 7 deletions(-) diff --git a/core/src/node/helper/config.ts b/core/src/node/helper/config.ts index 71e721578..06f2b03cd 100644 --- a/core/src/node/helper/config.ts +++ b/core/src/node/helper/config.ts @@ -4,13 +4,13 @@ import fs from 'fs' import os from 'os' import childProcess from 'child_process' -// TODO: move this to core const configurationFileName = 'settings.json' // TODO: do no specify app name in framework module const defaultJanDataFolder = join(os.homedir(), 'jan') const defaultAppConfig: AppConfiguration = { data_folder: defaultJanDataFolder, + quick_ask: false, } /** diff --git a/core/src/types/config/appConfigEntity.ts b/core/src/types/config/appConfigEntity.ts index 81ea0b30f..1402aeca1 100644 --- a/core/src/types/config/appConfigEntity.ts +++ b/core/src/types/config/appConfigEntity.ts @@ -1,3 +1,4 @@ export type AppConfiguration = { data_folder: string + quick_ask: boolean } diff --git a/electron/main.ts b/electron/main.ts index b7ac0a74c..70314b169 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -5,7 +5,7 @@ import { join } from 'path' * Managers **/ import { windowManager } from './managers/window' -import { log } from '@janhq/core/node' +import { getAppConfigurations, log } from '@janhq/core/node' /** * IPC Handlers @@ -95,7 +95,15 @@ app.once('quit', () => { cleanUpAndQuit() }) +app.once('window-all-closed', () => { + // Feature Toggle for Quick Ask + if (getAppConfigurations().quick_ask) return + cleanUpAndQuit() +}) + function createQuickAskWindow() { + // Feature Toggle for Quick Ask + if (!getAppConfigurations().quick_ask) return const startUrl = app.isPackaged ? `file://${quickAskPath}` : quickAskUrl windowManager.createQuickAskWindow(preloadPath, startUrl) } @@ -107,6 +115,9 @@ function createMainWindow() { function registerGlobalShortcuts() { const ret = registerShortcut(quickAskHotKey, (selectedText: string) => { + // Feature Toggle for Quick Ask + if (!getAppConfigurations().quick_ask) return + if (!windowManager.isQuickAskWindowVisible()) { windowManager.showQuickAskWindow() windowManager.sendQuickAskSelectedText(selectedText) diff --git a/electron/managers/tray.ts b/electron/managers/tray.ts index e7e07a0a1..b81b1e556 100644 --- a/electron/managers/tray.ts +++ b/electron/managers/tray.ts @@ -1,11 +1,15 @@ import { join } from 'path' import { Tray, app, Menu } from 'electron' import { windowManager } from '../managers/window' +import { getAppConfigurations } from '@janhq/core/node' class TrayManager { currentTray: Tray | undefined createSystemTray = () => { + // Feature Toggle for Quick Ask + if (!getAppConfigurations().quick_ask) return + if (this.currentTray) { return } diff --git a/electron/managers/window.ts b/electron/managers/window.ts index 7b97f8349..da8dd4b17 100644 --- a/electron/managers/window.ts +++ b/electron/managers/window.ts @@ -2,6 +2,7 @@ import { BrowserWindow, app, shell } from 'electron' import { quickAskWindowConfig } from './quickAskWindowConfig' import { AppEvent } from '@janhq/core' import { mainWindowConfig } from './mainWindowConfig' +import { getAppConfigurations } from '@janhq/core/node' /** * Manages the current window instance. @@ -43,6 +44,9 @@ class WindowManager { }) windowManager.mainWindow?.on('close', function (evt) { + // Feature Toggle for Quick Ask + if (!getAppConfigurations().quick_ask) return + if (!isAppQuitting) { evt.preventDefault() windowManager.hideMainWindow() diff --git a/web/containers/Providers/DataLoader.tsx b/web/containers/Providers/DataLoader.tsx index bc1461d5b..7d38a29d6 100644 --- a/web/containers/Providers/DataLoader.tsx +++ b/web/containers/Providers/DataLoader.tsx @@ -10,7 +10,10 @@ import useGetSystemResources from '@/hooks/useGetSystemResources' import useModels from '@/hooks/useModels' import useThreads from '@/hooks/useThreads' -import { janDataFolderPathAtom } from '@/helpers/atoms/AppConfig.atom' +import { + janDataFolderPathAtom, + quickAskEnabledAtom, +} from '@/helpers/atoms/AppConfig.atom' type Props = { children: ReactNode @@ -18,6 +21,7 @@ type Props = { const DataLoader: React.FC = ({ children }) => { const setJanDataFolderPath = useSetAtom(janDataFolderPathAtom) + const setQuickAskEnabled = useSetAtom(quickAskEnabledAtom) useModels() useThreads() @@ -29,8 +33,9 @@ const DataLoader: React.FC = ({ children }) => { ?.getAppConfigurations() ?.then((appConfig: AppConfiguration) => { setJanDataFolderPath(appConfig.data_folder) + setQuickAskEnabled(appConfig.quick_ask) }) - }, [setJanDataFolderPath]) + }, [setJanDataFolderPath, setQuickAskEnabled]) console.debug('Load Data...') diff --git a/web/helpers/atoms/AppConfig.atom.ts b/web/helpers/atoms/AppConfig.atom.ts index 75343d722..2c678b77d 100644 --- a/web/helpers/atoms/AppConfig.atom.ts +++ b/web/helpers/atoms/AppConfig.atom.ts @@ -6,6 +6,7 @@ const PROXY_FEATURE_ENABLED = 'proxyFeatureEnabled' const VULKAN_ENABLED = 'vulkanEnabled' const IGNORE_SSL = 'ignoreSSLFeature' const HTTPS_PROXY_FEATURE = 'httpsProxyFeature' +const QUICK_ASK_ENABLED = 'quickAskEnabled' export const janDataFolderPathAtom = atom('') @@ -19,3 +20,4 @@ export const proxyAtom = atomWithStorage(HTTPS_PROXY_FEATURE, '') export const ignoreSslAtom = atomWithStorage(IGNORE_SSL, false) export const vulkanEnabledAtom = atomWithStorage(VULKAN_ENABLED, false) +export const quickAskEnabledAtom = atomWithStorage(QUICK_ASK_ENABLED, false) diff --git a/web/hooks/useFactoryReset.ts b/web/hooks/useFactoryReset.ts index 06a637572..da0813060 100644 --- a/web/hooks/useFactoryReset.ts +++ b/web/hooks/useFactoryReset.ts @@ -30,6 +30,7 @@ export default function useFactoryReset() { // set the default jan data folder to user's home directory const configuration: AppConfiguration = { data_folder: defaultJanDataFolder, + quick_ask: appConfiguration?.quick_ask ?? false, } await window.core?.api?.updateAppConfiguration(configuration) } diff --git a/web/screens/Settings/Advanced/index.tsx b/web/screens/Settings/Advanced/index.tsx index 70cf335c2..0433ba75c 100644 --- a/web/screens/Settings/Advanced/index.tsx +++ b/web/screens/Settings/Advanced/index.tsx @@ -2,7 +2,7 @@ import { useEffect, useState, useCallback, ChangeEvent } from 'react' -import { openExternalUrl, fs } from '@janhq/core' +import { openExternalUrl, fs, AppConfiguration } from '@janhq/core' import { Switch, @@ -23,7 +23,7 @@ import { ScrollArea, } from '@janhq/uikit' -import { useAtom } from 'jotai' +import { useAtom, useAtomValue } from 'jotai' import { AlertTriangleIcon, AlertCircleIcon } from 'lucide-react' import ShortcutModal from '@/containers/ShortcutModal' @@ -42,6 +42,7 @@ import { proxyAtom, proxyEnabledAtom, vulkanEnabledAtom, + quickAskEnabledAtom, } from '@/helpers/atoms/AppConfig.atom' type GPU = { @@ -56,6 +57,8 @@ const Advanced = () => { ) const [vulkanEnabled, setVulkanEnabled] = useAtom(vulkanEnabledAtom) const [proxyEnabled, setProxyEnabled] = useAtom(proxyEnabledAtom) + const quickAskEnabled = useAtomValue(quickAskEnabledAtom) + const [proxy, setProxy] = useAtom(proxyAtom) const [ignoreSSL, setIgnoreSSL] = useAtom(ignoreSslAtom) @@ -87,6 +90,14 @@ const Advanced = () => { [setPartialProxy, setProxy] ) + const updateQuickAskEnabled = async (e: boolean) => { + const appConfiguration: AppConfiguration = + await window.core?.api?.getAppConfigurations() + appConfiguration.quick_ask = e + await window.core?.api?.updateAppConfiguration(appConfiguration) + window.core?.api?.relaunch() + } + useEffect(() => { const setUseGpuIfPossible = async () => { const settings = await readSettings() @@ -361,7 +372,7 @@ const Advanced = () => { Vulkan Support
    -

    +

    Enable Vulkan with AMD GPU/APU and Intel Arc GPU for better model performance (reload needed).

    @@ -426,6 +437,34 @@ const Advanced = () => { />
    +
    +
    +
    +
    + Jan Quick Ask +
    +
    +

    + Enable Quick Ask to be triggered via the default hotkey{' '} +

    + {isMac ? '⌘' : 'Ctrl'} + J +
    {' '} + (reload needed). +

    +
    + { + toaster({ + title: 'Reload', + description: + 'Quick Ask settings updated. Reload now to apply the changes.', + }) + updateQuickAskEnabled(!quickAskEnabled) + }} + /> +
    + {/* Clear log */}
    From 2082b81d64835edc714e0552f0c928950bc9cfbf Mon Sep 17 00:00:00 2001 From: Service Account Date: Tue, 12 Mar 2024 13:40:59 +0000 Subject: [PATCH 091/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 107a35d29..9fc133a8b 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 From e5369ed151238acec7c5105360e1282f45c20a72 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 13 Mar 2024 01:11:21 +0700 Subject: [PATCH 092/131] fix: do not migrate extensions from quick ask window (#2336) --- web/containers/Providers/index.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/web/containers/Providers/index.tsx b/web/containers/Providers/index.tsx index 73445f10a..e70a56ca8 100644 --- a/web/containers/Providers/index.tsx +++ b/web/containers/Providers/index.tsx @@ -4,6 +4,8 @@ import { PropsWithChildren, useEffect, useState } from 'react' import { Toaster } from 'react-hot-toast' +import { usePathname } from 'next/navigation' + import { TooltipProvider } from '@janhq/uikit' import GPUDriverPrompt from '@/containers/GPUDriverPromptModal' @@ -29,6 +31,7 @@ import { extensionManager } from '@/extension' const Providers = (props: PropsWithChildren) => { const { children } = props + const pathname = usePathname() const [setupCore, setSetupCore] = useState(false) const [activated, setActivated] = useState(false) @@ -40,6 +43,11 @@ const Providers = (props: PropsWithChildren) => { setTimeout(async () => { if (!isCoreExtensionInstalled()) { + // TODO: Proper window handle + // Do not migrate extension from quick ask window + if (pathname === '/search') { + return + } setSettingUp(true) await setupBaseExtensions() return From fb893b89f3d2f1b04b54ccbafd6482d1ca2282f9 Mon Sep 17 00:00:00 2001 From: Service Account Date: Tue, 12 Mar 2024 20:19:19 +0000 Subject: [PATCH 093/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9fc133a8b..a50691950 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 From bff20ab87bdc3a4c5270226aa9bae470228a807f Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 13 Mar 2024 10:18:20 +0700 Subject: [PATCH 094/131] fix: put quick ask feature toggle under experimental feature (#2338) --- web/screens/Settings/Advanced/index.tsx | 52 +++++++++++++------------ 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/web/screens/Settings/Advanced/index.tsx b/web/screens/Settings/Advanced/index.tsx index 0433ba75c..6853a5104 100644 --- a/web/screens/Settings/Advanced/index.tsx +++ b/web/screens/Settings/Advanced/index.tsx @@ -437,33 +437,35 @@ const Advanced = () => { />
    -
    -
    -
    -
    - Jan Quick Ask -
    + {experimentalEnabled && ( +
    +
    +
    +
    + Jan Quick Ask +
    +
    +

    + Enable Quick Ask to be triggered via the default hotkey{' '} +

    + {isMac ? '⌘' : 'Ctrl'} + J +
    {' '} + (reload needed). +

    -

    - Enable Quick Ask to be triggered via the default hotkey{' '} -

    - {isMac ? '⌘' : 'Ctrl'} + J -
    {' '} - (reload needed). -

    + { + toaster({ + title: 'Reload', + description: + 'Quick Ask settings updated. Reload now to apply the changes.', + }) + updateQuickAskEnabled(!quickAskEnabled) + }} + />
    - { - toaster({ - title: 'Reload', - description: - 'Quick Ask settings updated. Reload now to apply the changes.', - }) - updateQuickAskEnabled(!quickAskEnabled) - }} - /> -
    + )} {/* Clear log */}
    From f1db7a4f86090d1d1662a381824e5b7e9a488b17 Mon Sep 17 00:00:00 2001 From: Service Account Date: Wed, 13 Mar 2024 09:31:13 +0000 Subject: [PATCH 095/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a50691950..23604f01b 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 From 7048c85465eae1ee568f75b9965d16e22ee9e414 Mon Sep 17 00:00:00 2001 From: Service Account Date: Wed, 13 Mar 2024 20:17:51 +0000 Subject: [PATCH 096/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 23604f01b..bc206f4eb 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 From 0da6c3ad89812e84bdb1867be4391cdec9746078 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Thu, 14 Mar 2024 10:06:46 +0700 Subject: [PATCH 097/131] docs: Update API reference documentation to incorporate scalar implementation This commit introduces enhancements to the API reference documentation by implementing a scalar feature. The changes encompass both the user interface (UI) and functionality aspects, ensuring better clarity and usability for users interacting with the API documentation. --- docs/docusaurus.config.js | 16 +- docs/package.json | 1 + docs/yarn.lock | 1192 ++++++++++++++++++++++++++++++++++++- 3 files changed, 1200 insertions(+), 9 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 43334c988..6816def77 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -113,7 +113,19 @@ const config = { ], //To input custom Plugin - path.resolve(__dirname, 'plugins', 'changelog-plugin'), + // path.resolve(__dirname, 'plugins', 'changelog-plugin'), + [ + '@scalar/docusaurus', + { + label: '', + route: '/api-reference', + configuration: { + spec: { + url: 'https://aindrajaya.github.io/openapi-spec/openapi.json', + }, + }, + } + ], ], // The classic preset will relay each option entry to the respective sub plugin/theme. @@ -160,7 +172,7 @@ const config = { specs: [ { spec: "openapi/jan.yaml", // can be local file, url, or parsed json object - route: "/api-reference/", // path where to render docs + route: "/api-reference-1.0/", // path where to render docs }, ], theme: { diff --git a/docs/package.json b/docs/package.json index 2764786ba..eb386d783 100644 --- a/docs/package.json +++ b/docs/package.json @@ -26,6 +26,7 @@ "@heroicons/react": "^2.0.18", "@mdx-js/react": "^3.0.0", "@redocly/cli": "^1.4.1", + "@scalar/docusaurus": "^0.1.3", "autoprefixer": "^10.4.16", "axios": "^1.5.1", "clsx": "^1.2.1", diff --git a/docs/yarn.lock b/docs/yarn.lock index 339364c21..7a7642c14 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -1156,6 +1156,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.23.7": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -1195,6 +1202,128 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== +"@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.12.0": + version "6.15.0" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.15.0.tgz#37bc320f20cdda332d6bf4d1fc7f300f8fc5f04c" + integrity sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + +"@codemirror/commands@^6.0.0": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.3.3.tgz#03face5bf5f3de0fc4e09b177b3c91eda2ceb7e9" + integrity sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.4.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.1.0" + +"@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.2.1.tgz#5dc0a43b8e3c31f6af7aabd55ff07fe9aef2a227" + integrity sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.0.2" + "@lezer/css" "^1.0.0" + +"@codemirror/lang-html@^6.4.8": + version "6.4.8" + resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.8.tgz#961db9b1037efcb1d0f50ae6082e5a367fa1470c" + integrity sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/lang-css" "^6.0.0" + "@codemirror/lang-javascript" "^6.0.0" + "@codemirror/language" "^6.4.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + "@lezer/css" "^1.1.0" + "@lezer/html" "^1.3.0" + +"@codemirror/lang-javascript@^6.0.0": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz#7141090b22994bef85bcc5608a3bc1257f2db2ad" + integrity sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.6.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.17.0" + "@lezer/common" "^1.0.0" + "@lezer/javascript" "^1.0.0" + +"@codemirror/lang-json@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.1.tgz#0a0be701a5619c4b0f8991f9b5e95fe33f462330" + integrity sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ== + dependencies: + "@codemirror/language" "^6.0.0" + "@lezer/json" "^1.0.0" + +"@codemirror/lang-yaml@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-yaml/-/lang-yaml-6.0.0.tgz#768b5c646939bf444ba5b87a1ca8428059fedcb5" + integrity sha512-fVPapdX1oYr5HMC5bou1MHscGnNCvOHuhUW6C+V2gfIeIRcughvVfznV0OuUyHy0AdXoBCjOehjzFcmLRumu2Q== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.2.0" + "@lezer/yaml" "^1.0.0" + +"@codemirror/language@^6.0.0", "@codemirror/language@^6.10.1", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0": + version "6.10.1" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.10.1.tgz#428c932a158cb75942387acfe513c1ece1090b05" + integrity sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.23.0" + "@lezer/common" "^1.1.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + +"@codemirror/lint@^6.0.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.5.0.tgz#ea43b6e653dcc5bcd93456b55e9fe62e63f326d9" + integrity sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + crelt "^1.0.5" + +"@codemirror/search@^6.0.0": + version "6.5.6" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.6.tgz#8f858b9e678d675869112e475f082d1e8488db93" + integrity sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + crelt "^1.0.5" + +"@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.4.1.tgz#da57143695c056d9a3c38705ed34136e2b68171b" + integrity sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A== + +"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.23.1": + version "6.25.1" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.25.1.tgz#826ea345fd757dbeeab6a6165c1823e851c67d16" + integrity sha512-2LXLxsQnHDdfGzDvjzAwZh2ZviNJm7im6tGpa0IONIDnFd8RZ80D2SNi8PDi6YjKcMoMRK20v6OmKIdsrwsyoQ== + dependencies: + "@codemirror/state" "^6.4.0" + style-mod "^4.1.0" + w3c-keyname "^2.2.4" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1708,11 +1837,155 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + "@exodus/schemasafe@^1.0.0-rc.2": version "1.3.0" resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== +"@floating-ui/core@^1.0.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/dom@^1.6.1": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" + integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + +"@floating-ui/vue@^1.0.2": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@floating-ui/vue/-/vue-1.0.6.tgz#31860a12f1135d19554c232d99c5bab631c5c576" + integrity sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w== + dependencies: + "@floating-ui/dom" "^1.6.1" + "@floating-ui/utils" "^0.2.1" + vue-demi ">=0.13.0" + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1733,11 +2006,23 @@ "@tanstack/react-virtual" "^3.0.0-beta.60" client-only "^0.0.1" +"@headlessui/vue@^1.7.16": + version "1.7.19" + resolved "https://registry.yarnpkg.com/@headlessui/vue/-/vue-1.7.19.tgz#c128504afc14c5a85e2bedd59370a6a461b7c669" + integrity sha512-VFjKPybogux/5/QYGSq4zgG/x3RcxId15W8uguAJAjPBxelI23dwjOjTx/mIiMkM/Hd3rzFxcf2aIp56eEWRcA== + dependencies: + "@tanstack/vue-virtual" "^3.0.0-beta.60" + "@heroicons/react@^2.0.18": version "2.1.1" resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-2.1.1.tgz#422deb80c4d6caf3371aec6f4bee8361a354dc13" integrity sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA== +"@humanwhocodes/momoa@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-3.0.1.tgz#06ac240a4a57cd6d6dde7c13efacd3ef7f12e249" + integrity sha512-Yj2GOwIDb77+A5p4oV2x27edQ7NX86+vKBGWySnfwjKesxn8JCa90Q0Z0eyBBy2G1FulTDrRtfIdmPpIOGhCmQ== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1814,6 +2099,70 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@lezer/common@^1.0.0", "@lezer/common@^1.0.2", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.1.tgz#198b278b7869668e1bebbe687586e12a42731049" + integrity sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ== + +"@lezer/css@^1.0.0", "@lezer/css@^1.1.0": + version "1.1.8" + resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.8.tgz#11fd456dac53bc899b266778794ed4ca9576a5a4" + integrity sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3", "@lezer/highlight@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.0.tgz#e5898c3644208b4b589084089dceeea2966f7780" + integrity sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/html@^1.3.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.9.tgz#097150f0fb0d14e274515d3b3e50e7bd4a1d7ebc" + integrity sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/javascript@^1.0.0": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.13.tgz#e6459a000e1d7369db3e97b1764da63eeb5afe1b" + integrity sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.1.3" + "@lezer/lr" "^1.3.0" + +"@lezer/json@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@lezer/json/-/json-1.0.2.tgz#bdc849e174113e2d9a569a5e6fb1a27e2f703eaf" + integrity sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/lr@^1.0.0", "@lezer/lr@^1.3.0", "@lezer/lr@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.0.tgz#ed52a75dbbfbb0d1eb63710ea84c35ee647cb67e" + integrity sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/yaml@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@lezer/yaml/-/yaml-1.0.2.tgz#52e577f1284920d73e2d19089d408afb6b68d3b7" + integrity sha512-XCkwuxe+eumJ28nA9e1S6XKsXz9W7V/AG+WBiWOtiIuUpKcZ/bHuvN8bLxSDREIcybSRpEd/jvphh4vgm6Ed2g== + dependencies: + "@lezer/common" "^1.2.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.4.0" + "@mdx-js/mdx@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.0.tgz#37ef87685143fafedf1165f0a79e9fe95fbe5154" @@ -1981,6 +2330,263 @@ pluralize "^8.0.0" yaml-ast-parser "0.0.43" +"@replit/codemirror-css-color-picker@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@replit/codemirror-css-color-picker/-/codemirror-css-color-picker-6.1.0.tgz#57792898ebf03ea97833bb2fc91c8f54b6952fac" + integrity sha512-lkjtzOy8+C4VhuHegUfaqxsIsLVVW+FCRpKE+IOU4bX3Fp6Yo3sHS1PCHy1QlOtmL+Y+08Yb+giKuMXLyYzjew== + +"@rollup/rollup-android-arm-eabi@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" + integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== + +"@rollup/rollup-android-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" + integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== + +"@rollup/rollup-darwin-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" + integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== + +"@rollup/rollup-darwin-x64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" + integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== + +"@rollup/rollup-linux-arm-gnueabihf@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" + integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== + +"@rollup/rollup-linux-arm64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" + integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== + +"@rollup/rollup-linux-arm64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" + integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== + +"@rollup/rollup-linux-riscv64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" + integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== + +"@rollup/rollup-linux-x64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" + integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== + +"@rollup/rollup-linux-x64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" + integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== + +"@rollup/rollup-win32-arm64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" + integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== + +"@rollup/rollup-win32-ia32-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" + integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== + +"@rollup/rollup-win32-x64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" + integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== + +"@scalar/api-client@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@scalar/api-client/-/api-client-1.0.2.tgz#cc7f23025c32e3f34c0a1147ab10c9b380b44399" + integrity sha512-oKZWS1yXSEyv5A1Dn8SPps3qUu+SkEMV/2h7OUecjHFCmUEL6ndJn4RP+O/47435G0SkbllJrl34I/7tJ//Nzw== + dependencies: + "@headlessui/vue" "^1.7.16" + "@scalar/components" "0.4.4" + "@scalar/themes" "0.6.4" + "@scalar/use-codemirror" "0.9.0" + "@scalar/use-modal" "0.2.9" + "@vueuse/core" "^10.4.1" + axios "^1.6.5" + content-type "^1.0.5" + nanoid "^5.0.1" + pretty-bytes "^6.1.1" + pretty-ms "^8.0.0" + +"@scalar/api-reference-react@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@scalar/api-reference-react/-/api-reference-react-0.1.3.tgz#5e0ccf3596b162130e1f4beccc03f3e7c68d4140" + integrity sha512-hC7RxS7ROGrcPIxHeoWqcaocAkBdob/KrXwTVloq2yYdx+Gp9AS3A+7UPwbm/3NKUhbR87h0aMx/k5xY724UQA== + dependencies: + "@scalar/api-reference" "1.19.3" + +"@scalar/api-reference@1.19.3": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@scalar/api-reference/-/api-reference-1.19.3.tgz#85ebd349ac5aa5d1a921e21122f4033688098095" + integrity sha512-8OjCxI2wNelZNP9RDrClWoBrKaYXQK9MbEoxpDNi/6p4RU7j0gz0Wgzd0kpanOD/GwSmvMl7VOahO50CApgDNg== + dependencies: + "@floating-ui/vue" "^1.0.2" + "@headlessui/vue" "^1.7.16" + "@scalar/api-client" "1.0.2" + "@scalar/components" "0.4.4" + "@scalar/oas-utils" "0.1.0" + "@scalar/openapi-parser" "^0.3.2" + "@scalar/snippetz" "^0.1.5" + "@scalar/swagger-editor" "1.0.2" + "@scalar/themes" "0.6.4" + "@scalar/use-modal" "0.2.9" + "@scalar/use-tooltip" "0.5.12" + "@unhead/schema" "^1.8.3" + "@vcarl/remark-headings" "^0.1.0" + "@vueuse/core" "^10.4.1" + "@xmldom/xmldom" "^0.8.4" + axios "^1.6.5" + fuse.js "^6.6.2" + github-slugger "^2.0.0" + httpsnippet-lite "^3.0.5" + postcss-nested "^6.0.1" + rehype-external-links "^3.0.0" + rehype-format "^5.0.0" + rehype-highlight "^7.0.0" + rehype-raw "^7.0.0" + rehype-sanitize "^6.0.0" + rehype-stringify "^10.0.0" + remark-gfm "^4.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.1.0" + remark-stringify "^11.0.0" + unhead "^1.8.3" + unified "^11.0.4" + vue-sonner "^1.0.3" + +"@scalar/components@0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@scalar/components/-/components-0.4.4.tgz#1b6602ce5bbf8dcfcd33b64990d5615d1c191e1e" + integrity sha512-2q04mW1vY9/YH3r2Yp2wSHexf7YcoT5DBx3ThWZfoE2JDbRg58hiXqHwp3ePqLuIe/n6cnpcL29EWPQa12wFUA== + dependencies: + "@headlessui/vue" "^1.7.16" + "@vueuse/core" "^10.4.1" + "@xmldom/xmldom" "^0.8.4" + class-variance-authority "^0.7.0" + cva "1.0.0-beta.1" + nanoid "^5.0.1" + prismjs "^1.29.0" + tailwind-merge "^2.0.0" + +"@scalar/docusaurus@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@scalar/docusaurus/-/docusaurus-0.1.3.tgz#c2e5eebcf6f5d89e9850915d46d87841d179a920" + integrity sha512-K9c8ntilunAGGTvKI+UdxIHkT1PUSu9K759b8mwlUFdIjnZW1FuQOUqIFTFWHDXmUJ1iVAo/lxha7TI1lRqZKg== + dependencies: + "@scalar/api-reference-react" "0.1.3" + +"@scalar/oas-utils@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@scalar/oas-utils/-/oas-utils-0.1.0.tgz#dcd08d43723cfe4dea1be11ca226d0fbb02974fe" + integrity sha512-IVL1OYGK+qXHo0DURGqoiY6J88HBP9tE1GpUfs5nT9bcNr5A/b1qDlzXz4Xuxctl4gdn1GmIWzVXFhj1Cq8ydA== + dependencies: + yaml "^2.4.1" + +"@scalar/openapi-parser@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@scalar/openapi-parser/-/openapi-parser-0.3.2.tgz#9a3d38f14ae5a0d607a43960d88396de4b171926" + integrity sha512-o38wF1rKqCc7R0zFMta5rPTiY4cWwVcZPJkV1OCcnPsF2eE79uPkhYU2j/kdocJXVwMqqAe9a6+0o4R8YjgPVw== + dependencies: + "@humanwhocodes/momoa" "^3.0.1" + "@types/node" "^20.11.26" + ajv "^8.12.0" + ajv-draft-04 "^1.0.0" + ajv-formats "^2.1.1" + js-yaml "^4.1.0" + jsonpointer "^5.0.1" + leven "^4.0.0" + openapi-types "^12.1.3" + vite "^5.1.6" + yaml "^2.4.1" + +"@scalar/snippetz-core@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@scalar/snippetz-core/-/snippetz-core-0.1.3.tgz#a6efa79ced28c5c4aeefec4b992589fc2909ff5b" + integrity sha512-pHRi23VhxMddKMo/2zEnaRcc1QUTEva5H2tryuq+tER7imGWf2O09IGexiV9vY/8jzYh0QVl/2dlJUmnF9Ww5w== + dependencies: + "@types/har-format" "^1.2.15" + +"@scalar/snippetz-plugin-js-fetch@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-js-fetch/-/snippetz-plugin-js-fetch-0.1.0.tgz#c46e1d4680eae2ef1bf9930e78530a03c7bfb414" + integrity sha512-lliZSIqtbZawm+XXmMXEpCcpIQprRwJXNUxLAvryB9AGm9qTu0dIfsvjJPjiTAfRew5+sgebNQ8cEF4esMnnlQ== + dependencies: + "@scalar/snippetz-core" "0.1.3" + +"@scalar/snippetz-plugin-node-fetch@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-node-fetch/-/snippetz-plugin-node-fetch-0.1.1.tgz#87c97b4239189535815bad22aee23c53ede1982f" + integrity sha512-U6kqtQi1xAME8AWgJmEVAFA/uhcJ1RUNKtyVDjupd77LQu2FEOPwqI5dPSltxvnJdYrUjLhDcfIa8EO8uO43zw== + dependencies: + "@scalar/snippetz-core" "0.1.3" + +"@scalar/snippetz-plugin-node-undici@0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@scalar/snippetz-plugin-node-undici/-/snippetz-plugin-node-undici-0.1.5.tgz#5535c3539e08198d08463b31e3e94c8c13218400" + integrity sha512-ctOvCK3/Ta7ibuZjhV85M/gBuKURpeqgkWQHDFJubTHgUhQZudn60N5MY3ZtjoLFY7z9DCC5UenNYINveCdKJw== + dependencies: + "@scalar/snippetz-core" "0.1.3" + +"@scalar/snippetz@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@scalar/snippetz/-/snippetz-0.1.5.tgz#5957527a4a19b643942e122c5753cd565830703a" + integrity sha512-jHU8/KOO9vKbQFhsruflKugekgAtDm5GIAKZCYN+XtzqQ3jPGAjzkEZMXXvRDS2YPtFSzH2vzfqNMLB+q2Zupw== + dependencies: + "@scalar/snippetz-core" "0.1.3" + "@scalar/snippetz-plugin-js-fetch" "0.1.0" + "@scalar/snippetz-plugin-node-fetch" "0.1.1" + "@scalar/snippetz-plugin-node-undici" "0.1.5" + +"@scalar/swagger-editor@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@scalar/swagger-editor/-/swagger-editor-1.0.2.tgz#1afdaa9b6811281d16b376073e52812adcea7c02" + integrity sha512-G7bIMyeiplnd8+v0MWzu0G89KJCLdy1R3E629MP2oJQRt833VZtMMWDkznLr9wbQM+XAYhMQf0RRf01OtTcWrw== + +"@scalar/themes@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@scalar/themes/-/themes-0.6.4.tgz#db76df28e45217a9e93978e3de2d6d71aea8f371" + integrity sha512-MNa0kaqKacSl9G8FKe3RNjIqYkBDLqOJBQVvn+DjelviVdfFAhfTf/o1KftQKJ1j+RIB1iXY+/JmSKEWA+RvgA== + +"@scalar/use-codemirror@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@scalar/use-codemirror/-/use-codemirror-0.9.0.tgz#8f78a45b371b97cec55118405336cdaff85a8e6d" + integrity sha512-1qtov9NeLcEKEc4XFXBmo4FsZkuDFxr/qlxBkVYsJlpnujeWBZ+MnfUJQUskwD095kza5GQdjPt6oIEA3r7oxg== + dependencies: + "@codemirror/autocomplete" "^6.12.0" + "@codemirror/lang-css" "^6.2.1" + "@codemirror/lang-html" "^6.4.8" + "@codemirror/lang-json" "^6.0.0" + "@codemirror/lang-yaml" "^6.0.0" + "@codemirror/language" "^6.10.1" + "@codemirror/state" "^6.4.0" + "@codemirror/view" "^6.23.1" + "@lezer/common" "^1.2.1" + "@lezer/highlight" "^1.2.0" + "@lezer/lr" "^1.4.0" + "@replit/codemirror-css-color-picker" "^6.1.0" + "@uiw/codemirror-themes" "^4.21.21" + codemirror "^6.0.0" + y-codemirror.next "^0.3.2" + +"@scalar/use-modal@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@scalar/use-modal/-/use-modal-0.2.9.tgz#f42c7aee85dde546e78eaf2d6769ea86a9221034" + integrity sha512-h+Je4bjtF38kQsgfvAZ4TanhJaqHxL3nk7jM8tBYQmKYHCMyFo7oELglu830f0wNrO0TmhDrrQem745Z5uyb2Q== + +"@scalar/use-tooltip@0.5.12": + version "0.5.12" + resolved "https://registry.yarnpkg.com/@scalar/use-tooltip/-/use-tooltip-0.5.12.tgz#504727d8d38f8234e7b081a9a91a37829819bf61" + integrity sha512-pDKyGtysxxOcyWE/D5FyRODE1Nqb3LO5cc2X9m7JwjClTqeD3VuKnA3sC4UTcGNKUIDTqVXGyjnHeXoC10t6OA== + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -2156,6 +2762,18 @@ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.0.0.tgz#637bee36f0cabf96a1d436887c90f138a7e9378b" integrity sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg== +"@tanstack/virtual-core@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.1.3.tgz#77ced625f19ec9350f6e460f142b3be9bff03866" + integrity sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g== + +"@tanstack/vue-virtual@^3.0.0-beta.60": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@tanstack/vue-virtual/-/vue-virtual-3.1.3.tgz#06db1aab0e9b9603d315f398bca9ecf4cd71b510" + integrity sha512-OoRCSgp8Bc85Te3pg4OHFUukbWZeB25/O5rNd7MgMtrYIfJjNOaicZeJcvwqK6lDVTMpzohWUMVK/loqR1H8ig== + dependencies: + "@tanstack/virtual-core" "3.1.3" + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -2245,7 +2863,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -2275,6 +2893,11 @@ resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" integrity sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg== +"@types/har-format@^1.2.10", "@types/har-format@^1.2.15": + version "1.2.15" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.15.tgz#f352493638c2f89d706438a19a9eb300b493b506" + integrity sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA== + "@types/hast@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" @@ -2391,6 +3014,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@^20.11.26": + version "20.11.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.27.tgz#debe5cfc8a507dd60fe2a3b4875b1604f215c2ac" + integrity sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg== + dependencies: + undici-types "~5.26.4" + "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" @@ -2514,6 +3144,11 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== +"@types/web-bluetooth@^0.0.20": + version "0.0.20" + resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597" + integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== + "@types/ws@^8.5.5": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -2533,11 +3168,73 @@ dependencies: "@types/yargs-parser" "*" -"@ungap/structured-clone@^1.0.0": +"@uiw/codemirror-themes@^4.21.21": + version "4.21.24" + resolved "https://registry.yarnpkg.com/@uiw/codemirror-themes/-/codemirror-themes-4.21.24.tgz#69b83d1d77f8ad40a2a8689e8bf54e4b445b88f3" + integrity sha512-InY24KWP8YArDBACWHKFZ6ZU+WCvRHf3ZB2cCVxMVN35P1ANUmRzpAP2ernZQ5OIriL1/A/kXgD0Zg3Y65PNgg== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + +"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@unhead/dom@1.8.18": + version "1.8.18" + resolved "https://registry.yarnpkg.com/@unhead/dom/-/dom-1.8.18.tgz#64958f98134deb216f8e4cc6b714349c9d070f93" + integrity sha512-F6ckuW+IAojGCSb++WFQlDeI3/80OALpD6yDcDrhAxZ8ogQatd5gXWjTmSiuV/0M2XIeDq3jwampvq6oomU6Gw== + dependencies: + "@unhead/schema" "1.8.18" + "@unhead/shared" "1.8.18" + +"@unhead/schema@1.8.18", "@unhead/schema@^1.8.3": + version "1.8.18" + resolved "https://registry.yarnpkg.com/@unhead/schema/-/schema-1.8.18.tgz#792bad2fa5fcdd87b5a2c33aa4225a2bdc75d866" + integrity sha512-E4oq4juwGJkXPOJlc4Qdp1iVTe79H4TSMWkOB8sSlU44vhvcuZduFYH9CCn29JvtV/640Uaf2QeX4o+wX96LRQ== + dependencies: + hookable "^5.5.3" + zhead "^2.2.4" + +"@unhead/shared@1.8.18": + version "1.8.18" + resolved "https://registry.yarnpkg.com/@unhead/shared/-/shared-1.8.18.tgz#059f1baaf175ab1ce0a5dc6dc80588ffad93b2d7" + integrity sha512-2Tw5oyTjMkPn11UoR9AB3kSk2nDVG+7nCS4dZUwdxTMqndUnYyWoGB0EcO2WbK6YpkpulLIlfmiXVzWW4PTrWg== + dependencies: + "@unhead/schema" "1.8.18" + +"@vcarl/remark-headings@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@vcarl/remark-headings/-/remark-headings-0.1.0.tgz#b5831c3f16d8b2570872f554ba509437ec507a1e" + integrity sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q== + dependencies: + mdast-util-to-string "^3.1.0" + unist-util-visit "^4.0.0" + +"@vueuse/core@^10.4.1": + version "10.9.0" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.9.0.tgz#7d779a95cf0189de176fee63cee4ba44b3c85d64" + integrity sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg== + dependencies: + "@types/web-bluetooth" "^0.0.20" + "@vueuse/metadata" "10.9.0" + "@vueuse/shared" "10.9.0" + vue-demi ">=0.14.7" + +"@vueuse/metadata@10.9.0": + version "10.9.0" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.9.0.tgz#769a1a9db65daac15cf98084cbf7819ed3758620" + integrity sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA== + +"@vueuse/shared@10.9.0": + version "10.9.0" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.9.0.tgz#13af2a348de15d07b7be2fd0c7fc9853a69d8fe0" + integrity sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw== + dependencies: + vue-demi ">=0.14.7" + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -2659,6 +3356,11 @@ "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" +"@xmldom/xmldom@^0.8.4": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2725,6 +3427,11 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv-draft-04@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -2754,7 +3461,7 @@ ajv@^6.12.2, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.12.0, ajv@^8.9.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2908,6 +3615,15 @@ axios@^1.5.1: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.6.5: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-loader@^9.1.3: version "9.1.3" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" @@ -3260,6 +3976,13 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +class-variance-authority@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" + integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== + dependencies: + clsx "2.0.0" + classnames@^2.3.1: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" @@ -3323,6 +4046,11 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + clsx@^1.1.0, clsx@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" @@ -3333,6 +4061,19 @@ clsx@^2.0.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== +codemirror@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.1.tgz#62b91142d45904547ee3e0e0e4c1a79158035a29" + integrity sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/commands" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/search" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + collapse-white-space@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" @@ -3495,7 +4236,7 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@^1.0.5, content-type@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -3613,6 +4354,11 @@ cosmiconfig@^8.3.5: parse-json "^5.2.0" path-type "^4.0.0" +crelt@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== + cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -3792,6 +4538,13 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +cva@1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/cva/-/cva-1.0.0-beta.1.tgz#ad5ad2cc744ccf50d6b70f72645a60f9dfd86e8c" + integrity sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w== + dependencies: + clsx "2.0.0" + cytoscape-cose-bilkent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" @@ -4494,6 +5247,35 @@ es6-promise@^3.2.1: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== +esbuild@^0.19.3: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -4891,6 +5673,14 @@ format@^0.2.0: resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== +formdata-node@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" + integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== + dependencies: + node-domexception "1.0.0" + web-streams-polyfill "4.0.0-beta.3" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -4935,7 +5725,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -4945,6 +5735,11 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +fuse.js@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" + integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4985,6 +5780,11 @@ github-slugger@^1.5.0: resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== +github-slugger@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" + integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -5185,6 +5985,14 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +hast-util-embedded@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz#be4477780fbbe079cdba22982e357a0de4ba853e" + integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-from-parse5@^8.0.0: version "8.0.1" resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" @@ -5199,6 +6007,27 @@ hast-util-from-parse5@^8.0.0: vfile-location "^5.0.0" web-namespaces "^2.0.0" +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-body-ok-link@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz#6b2d808813a6f73eb20e61bdd2b203591af85eb4" + integrity sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== + dependencies: + "@types/hast" "^3.0.0" + hast-util-parse-selector@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" @@ -5206,6 +6035,17 @@ hast-util-parse-selector@^4.0.0: dependencies: "@types/hast" "^3.0.0" +hast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz#fa284c0cd4a82a0dd6020de8300a7b1ebffa1690" + integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-has-property "^3.0.0" + hast-util-is-body-ok-link "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-raw@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" @@ -5225,6 +6065,15 @@ hast-util-raw@^9.0.0: web-namespaces "^2.0.0" zwitch "^2.0.0" +hast-util-sanitize@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-5.0.1.tgz#8e90068cd68e651c569960b77a1b25076579b4cf" + integrity sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ== + dependencies: + "@types/hast" "^3.0.0" + "@ungap/structured-clone" "^1.2.0" + unist-util-position "^5.0.0" + hast-util-to-estree@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz#f2afe5e869ddf0cf690c75f9fc699f3180b51b19" @@ -5247,6 +6096,24 @@ hast-util-to-estree@^3.0.0: unist-util-position "^5.0.0" zwitch "^2.0.0" +hast-util-to-html@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz#51c0ae2a3550b9aa988c094c4fc4e327af0dddd1" + integrity sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-raw "^9.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + hast-util-to-jsx-runtime@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" @@ -5281,6 +6148,16 @@ hast-util-to-parse5@^8.0.0: web-namespaces "^2.0.0" zwitch "^2.0.0" +hast-util-to-text@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz#7f33a45d0bf7981ead44e82d9d8d75f511b3642f" + integrity sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + hast-util-is-element "^3.0.0" + unist-util-find-after "^5.0.0" + hast-util-whitespace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" @@ -5309,6 +6186,11 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== +highlight.js@~11.9.0: + version "11.9.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.9.0.tgz#04ab9ee43b52a41a047432c8103e2158a1b8b5b0" + integrity sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw== + history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -5328,6 +6210,11 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.7.0" +hookable@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" + integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -5395,6 +6282,11 @@ html-webpack-plugin@^5.5.3: pretty-error "^4.0.0" tapable "^2.0.0" +html-whitespace-sensitive-tag-names@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz#c7c8c11d93c014fba642e240d7f3da39656ab301" + integrity sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w== + htmlparser2@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" @@ -5484,6 +6376,15 @@ http2-wrapper@^2.1.10: quick-lru "^5.1.1" resolve-alpn "^1.2.0" +httpsnippet-lite@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/httpsnippet-lite/-/httpsnippet-lite-3.0.5.tgz#af937fa37d3f34e333a1f68e64f906c0fe48c992" + integrity sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA== + dependencies: + "@types/har-format" "^1.2.10" + formdata-node "^4.4.1" + stringify-object "3.3.0" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -5628,6 +6529,11 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +is-absolute-url@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-4.0.1.tgz#16e4d487d4fded05cfe0685e53ec86804a5e94dc" + integrity sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A== + is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" @@ -5823,6 +6729,11 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic.js@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" + integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== + jackspeak@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" @@ -5955,6 +6866,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonpointer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -6017,6 +6933,18 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +leven@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-4.0.0.tgz#b9c39c803f835950fabef9e122a9b47b95708710" + integrity sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw== + +lib0@^0.2.42: + version "0.2.91" + resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.91.tgz#a35759d0d9018d12317a8d709d1920ffa35be3d6" + integrity sha512-LRcTp8RmdHexL8olb7qErdROnJ2L6Js5Am99WQo0hiTRDWtk6vyUJJjTB6I/RcW8jwNQshM3NqH598DdhSOajA== + dependencies: + isomorphic.js "^0.2.4" + lilconfig@^2.0.3, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -6127,6 +7055,15 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lowlight@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-3.1.0.tgz#aa394c5f3a7689fce35fa49a7c850ba3ead4f590" + integrity sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.0.0" + highlight.js "~11.9.0" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7230,6 +8167,11 @@ nanoid@^3.3.6, nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^5.0.1: + version "5.0.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.6.tgz#7f99a033aa843e4dcf9778bdaec5eb02f4dc44d5" + integrity sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -7248,6 +8190,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-domexception@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + node-emoji@^2.1.0: version "2.1.3" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.1.3.tgz#93cfabb5cc7c3653aa52f29d6ffb7927d8047c06" @@ -7465,6 +8412,11 @@ openapi-sampler@^1.3.1: "@types/json-schema" "^7.0.7" json-pointer "0.6.2" +openapi-types@^12.1.3: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -7591,6 +8543,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-ms@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" + integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== + parse-numeric-range@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" @@ -8084,6 +9041,15 @@ postcss@^8.4.17, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.26, postcss@^8.4 picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.35: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + posthog-docusaurus@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/posthog-docusaurus/-/posthog-docusaurus-2.0.0.tgz#8b8ac890a2d780c8097a1a9766a3d24d2a1f1177" @@ -8094,6 +9060,11 @@ preact@^10.0.0: resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== +pretty-bytes@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz#38cd6bb46f47afbf667c202cfc754bffd2016a3b" + integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ== + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -8102,6 +9073,13 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +pretty-ms@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3" + integrity sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q== + dependencies: + parse-ms "^3.0.0" + pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" @@ -8590,6 +9568,54 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +rehype-external-links@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rehype-external-links/-/rehype-external-links-3.0.0.tgz#2b28b5cda1932f83f045b6f80a3e1b15f168c6f6" + integrity sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw== + dependencies: + "@types/hast" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-is-element "^3.0.0" + is-absolute-url "^4.0.0" + space-separated-tokens "^2.0.0" + unist-util-visit "^5.0.0" + +rehype-format@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/rehype-format/-/rehype-format-5.0.0.tgz#e51cc8edece2aee0e88e1efdd0625bc0cbef387b" + integrity sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-phrasing "^3.0.0" + hast-util-whitespace "^3.0.0" + html-whitespace-sensitive-tag-names "^3.0.0" + rehype-minify-whitespace "^6.0.0" + unist-util-visit-parents "^6.0.0" + +rehype-highlight@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-highlight/-/rehype-highlight-7.0.0.tgz#f2fd0eaebea7d4d4ce2fca2e8d9e3aea9441aefc" + integrity sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-text "^4.0.0" + lowlight "^3.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +rehype-minify-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz#fe97c5e9e48c5629458166753f2249afaa2e1fd1" + integrity sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-whitespace "^3.0.0" + unist-util-is "^6.0.0" + rehype-raw@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" @@ -8599,6 +9625,23 @@ rehype-raw@^7.0.0: hast-util-raw "^9.0.0" vfile "^6.0.0" +rehype-sanitize@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz#16e95f4a67a69cbf0f79e113c8e0df48203db73c" + integrity sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg== + dependencies: + "@types/hast" "^3.0.0" + hast-util-sanitize "^5.0.0" + +rehype-stringify@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.0.tgz#2031cf6fdd0355393706f0474ec794c75e5492f2" + integrity sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-html "^9.0.0" + unified "^11.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -8676,6 +9719,17 @@ remark-rehype@^11.0.0: unified "^11.0.0" vfile "^6.0.0" +remark-rehype@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.0.tgz#d5f264f42bcbd4d300f030975609d01a1697ccdc" + integrity sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + remark-stringify@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" @@ -8769,6 +9823,28 @@ robust-predicates@^3.0.0: resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== +rollup@^4.2.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" + integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.13.0" + "@rollup/rollup-android-arm64" "4.13.0" + "@rollup/rollup-darwin-arm64" "4.13.0" + "@rollup/rollup-darwin-x64" "4.13.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" + "@rollup/rollup-linux-arm64-gnu" "4.13.0" + "@rollup/rollup-linux-arm64-musl" "4.13.0" + "@rollup/rollup-linux-riscv64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-musl" "4.13.0" + "@rollup/rollup-win32-arm64-msvc" "4.13.0" + "@rollup/rollup-win32-ia32-msvc" "4.13.0" + "@rollup/rollup-win32-x64-msvc" "4.13.0" + fsevents "~2.3.2" + rtl-detect@^1.0.4: version "1.1.2" resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" @@ -9309,7 +10385,7 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -stringify-object@^3.3.0: +stringify-object@3.3.0, stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== @@ -9352,6 +10428,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +style-mod@^4.0.0, style-mod@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.2.tgz#ca238a1ad4786520f7515a8539d5a63691d7bf67" + integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== + style-to-object@^0.4.0: version "0.4.4" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" @@ -9468,6 +10549,13 @@ swagger2openapi@^7.0.6: yaml "^1.10.0" yargs "^17.0.1" +tailwind-merge@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.1.tgz#3f10f296a2dba1d88769de8244fafd95c3324aeb" + integrity sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q== + dependencies: + "@babel/runtime" "^7.23.7" + tailwind-merge@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.0.tgz#b6bb1c63ef26283c9e6675ba237df83bbd554688" @@ -9673,6 +10761,16 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +unhead@^1.8.3: + version "1.8.18" + resolved "https://registry.yarnpkg.com/unhead/-/unhead-1.8.18.tgz#0754e53bb3b7861cb724dd4d04370e453b51f39a" + integrity sha512-XmCGVev0bwo+jy5qh6PW1vACnPoQvv3MEwqo4w0+49W2ZGPMZYPtIa8GAZiaWgkycrlie1WgZejjJEG9bYVgZw== + dependencies: + "@unhead/dom" "1.8.18" + "@unhead/schema" "1.8.18" + "@unhead/shared" "1.8.18" + hookable "^5.5.3" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -9721,6 +10819,21 @@ unique-string@^3.0.0: dependencies: crypto-random-string "^4.0.0" +unist-util-find-after@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" + integrity sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" @@ -9764,6 +10877,14 @@ unist-util-stringify-position@^4.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" @@ -9772,6 +10893,15 @@ unist-util-visit-parents@^6.0.0: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + unist-util-visit@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" @@ -9925,6 +11055,32 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" +vite@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.6.tgz#706dae5fab9e97f57578469eef1405fc483943e4" + integrity sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA== + dependencies: + esbuild "^0.19.3" + postcss "^8.4.35" + rollup "^4.2.0" + optionalDependencies: + fsevents "~2.3.3" + +vue-demi@>=0.13.0, vue-demi@>=0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2" + integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA== + +vue-sonner@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vue-sonner/-/vue-sonner-1.1.2.tgz#996c662d817b150e67770272e1d1d7f8a2d3a0c6" + integrity sha512-yg4f5s0a3oiiI7cNvO0Dajux1Y7s04lxww3vnQtnwQawJ3KqaKA9RIRMdI9wGTosRGIOwgYFniFRGl4+IuKPZw== + +w3c-keyname@^2.2.4: + version "2.2.8" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== + watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -9945,6 +11101,11 @@ web-namespaces@^2.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== +web-streams-polyfill@4.0.0-beta.3: + version "4.0.0-beta.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" + integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== + web-worker@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" @@ -10189,6 +11350,13 @@ xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y-codemirror.next@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/y-codemirror.next/-/y-codemirror.next-0.3.2.tgz#15f7afec14a56fba4f25811d5f90b986e1cc644c" + integrity sha512-3ksMXoietzNkrgluG9ut+5q4PNHCS6sQ+mHd44hNX1s7TBe4iDgOOIswfY3oLsdamZLAUPr+TnRdYgYuNDs7Qg== + dependencies: + lib0 "^0.2.42" + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -10219,6 +11387,11 @@ yaml@^2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yaml@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -10278,7 +11451,12 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -zwitch@^2.0.0: +zhead@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/zhead/-/zhead-2.2.4.tgz#87cd1e2c3d2f465fa9f43b8db23f9716dfe6bed7" + integrity sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag== + +zwitch@^2.0.0, zwitch@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 24c6dd05bec712b768e3860ec380a02417279ca2 Mon Sep 17 00:00:00 2001 From: hiento09 <136591877+hiento09@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:12:30 +0700 Subject: [PATCH 098/131] Add icon file contain image size in file name to fix linux icon (#2344) Co-authored-by: Hien To --- electron/icons/512x512.png | Bin 0 -> 38651 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 electron/icons/512x512.png diff --git a/electron/icons/512x512.png b/electron/icons/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..289f99ded85e1e3cc91b17af6b607d2cafd97cd7 GIT binary patch literal 38651 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 Date: Thu, 14 Mar 2024 14:07:22 +0700 Subject: [PATCH 099/131] feat: Nitro-Tensorrt-LLM Extension (#2280) * feat: tensorrt-llm-extension * fix: loading * feat: add download tensorrt llm runner Signed-off-by: James * feat: update to rollupjs instead of webpack for monitoring extension Signed-off-by: James * feat: move update nvidia info to monitor extension Signed-off-by: James * allow download tensorrt Signed-off-by: James * update Signed-off-by: James * allow download tensor rt based on gpu setting Signed-off-by: James * update downloaded models Signed-off-by: James * feat: add extension compatibility * dynamic tensor rt engines Signed-off-by: James * update models Signed-off-by: James * chore: remove ts-ignore * feat: getting installation state from extension Signed-off-by: James * chore: adding type for decompress Signed-off-by: James * feat: update according Louis's comment Signed-off-by: James * feat: add progress for installing extension Signed-off-by: James * chore: remove args from extension installation * fix: model download does not work properly * fix: do not allow user to stop tensorrtllm inference * fix: extension installed style * fix: download tensorrt does not update state Signed-off-by: James * chore: replace int4 by fl16 * feat: modal for installing extension Signed-off-by: James * fix: start download immediately after press install Signed-off-by: James * fix: error switching between engines * feat: rename inference provider to ai engine and refactor to core * fix: missing ulid * fix: core bundler * feat: add cancel extension installing Signed-off-by: James * remove mocking for mac Signed-off-by: James * fix: show models only when extension is ready * add tensorrt badge for model Signed-off-by: James * fix: copy * fix: add compatible check (#2342) * fix: add compatible check Signed-off-by: James * fix: copy * fix: font * fix: copy * fix: broken monitoring extension * chore: bump engine * fix: copy * fix: model copy * fix: copy * fix: model json --------- Signed-off-by: James Co-authored-by: James Co-authored-by: Louis * fix: vulkan support * fix: installation button padding * fix: empty script * fix: remove hard code string --------- Signed-off-by: James Co-authored-by: James Co-authored-by: NamH --- .gitignore | 20 +- core/package.json | 12 +- core/rollup.config.ts | 2 +- core/src/api/index.ts | 3 + core/src/core.ts | 36 +- core/src/extension.ts | 44 +++ core/src/extensions/ai-engines/AIEngine.ts | 60 ++++ .../extensions/ai-engines/LocalOAIEngine.ts | 63 ++++ core/src/extensions/ai-engines/OAIEngine.ts | 116 +++++++ core/src/extensions/ai-engines/helpers/sse.ts | 67 ++++ core/src/extensions/ai-engines/index.ts | 3 + core/src/extensions/index.ts | 5 + core/src/extensions/model.ts | 3 +- core/src/extensions/monitoring.ts | 3 +- core/src/node/api/processors/download.ts | 36 +- core/src/node/api/restful/helper/builder.ts | 50 +-- core/src/types/file/index.ts | 35 +- .../miscellaneous/fileDownloadRequest.ts | 8 + core/src/types/miscellaneous/index.ts | 2 + core/src/types/miscellaneous/networkConfig.ts | 4 + .../types/miscellaneous/systemResourceInfo.ts | 28 ++ core/src/types/model/modelEntity.ts | 1 + core/src/types/model/modelInterface.ts | 7 +- core/src/types/monitoring/index.ts | 1 + core/src/types/monitoring/resourceInfo.ts | 6 + core/tsconfig.json | 4 +- extensions/huggingface-extension/src/index.ts | 7 +- .../inference-nitro-extension/download.bat | 2 +- .../inference-nitro-extension/package.json | 2 +- .../inference-nitro-extension/src/index.ts | 3 - .../src/node/accelerator.ts | 237 ------------- .../src/node/execute.ts | 9 +- .../src/node/index.ts | 20 +- extensions/model-extension/src/index.ts | 87 ++++- extensions/monitoring-extension/bin/.gitkeep | 0 extensions/monitoring-extension/download.bat | 2 + extensions/monitoring-extension/package.json | 29 +- .../monitoring-extension/rollup.config.ts | 68 ++++ .../src/@types/global.d.ts | 19 +- extensions/monitoring-extension/src/index.ts | 19 +- extensions/monitoring-extension/src/module.ts | 92 ----- .../monitoring-extension/src/node/index.ts | 317 ++++++++++++++++++ .../monitoring-extension/webpack.config.js | 35 -- extensions/tensorrt-llm-extension/README.md | 79 +++++ extensions/tensorrt-llm-extension/models.json | 49 +++ .../tensorrt-llm-extension/package.json | 75 +++++ .../tensorrt-llm-extension/rollup.config.ts | 73 ++++ .../src/@types/global.d.ts | 10 + .../tensorrt-llm-extension/src/index.ts | 147 ++++++++ .../tensorrt-llm-extension/src/node/index.ts | 191 +++++++++++ .../tensorrt-llm-extension/tsconfig.json | 20 ++ web/containers/DropdownListSidebar/index.tsx | 3 +- .../InstallingExtensionModal.tsx | 87 +++++ .../BottomBar/InstallingExtension/index.tsx | 52 +++ web/containers/Layout/BottomBar/index.tsx | 2 + web/containers/Layout/index.tsx | 3 + web/containers/Providers/EventListener.tsx | 59 +++- web/extension/ExtensionManager.ts | 4 +- web/helpers/atoms/Extension.atom.ts | 40 +++ web/hooks/useActiveModel.ts | 12 +- web/hooks/useDownloadModel.ts | 28 +- web/hooks/useDownloadState.ts | 202 +++++------ web/hooks/useGpuSetting.ts | 21 ++ web/next.config.js | 1 + .../ExploreModels/ExploreModelItem/index.tsx | 13 +- .../ExploreModelItemHeader/index.tsx | 18 + .../CoreExtensions/TensorRtExtensionItem.tsx | 225 +++++++++++++ web/screens/Settings/CoreExtensions/index.tsx | 110 +++--- web/services/appService.ts | 24 ++ web/services/coreService.ts | 7 +- web/types/index.d.ts | 1 + 71 files changed, 2497 insertions(+), 626 deletions(-) create mode 100644 core/src/extensions/ai-engines/AIEngine.ts create mode 100644 core/src/extensions/ai-engines/LocalOAIEngine.ts create mode 100644 core/src/extensions/ai-engines/OAIEngine.ts create mode 100644 core/src/extensions/ai-engines/helpers/sse.ts create mode 100644 core/src/extensions/ai-engines/index.ts create mode 100644 core/src/types/miscellaneous/fileDownloadRequest.ts create mode 100644 core/src/types/miscellaneous/networkConfig.ts create mode 100644 core/src/types/monitoring/resourceInfo.ts delete mode 100644 extensions/inference-nitro-extension/src/node/accelerator.ts create mode 100644 extensions/monitoring-extension/bin/.gitkeep create mode 100644 extensions/monitoring-extension/download.bat create mode 100644 extensions/monitoring-extension/rollup.config.ts delete mode 100644 extensions/monitoring-extension/src/module.ts create mode 100644 extensions/monitoring-extension/src/node/index.ts delete mode 100644 extensions/monitoring-extension/webpack.config.js create mode 100644 extensions/tensorrt-llm-extension/README.md create mode 100644 extensions/tensorrt-llm-extension/models.json create mode 100644 extensions/tensorrt-llm-extension/package.json create mode 100644 extensions/tensorrt-llm-extension/rollup.config.ts create mode 100644 extensions/tensorrt-llm-extension/src/@types/global.d.ts create mode 100644 extensions/tensorrt-llm-extension/src/index.ts create mode 100644 extensions/tensorrt-llm-extension/src/node/index.ts create mode 100644 extensions/tensorrt-llm-extension/tsconfig.json create mode 100644 web/containers/Layout/BottomBar/InstallingExtension/InstallingExtensionModal.tsx create mode 100644 web/containers/Layout/BottomBar/InstallingExtension/index.tsx create mode 100644 web/helpers/atoms/Extension.atom.ts create mode 100644 web/hooks/useGpuSetting.ts create mode 100644 web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx create mode 100644 web/services/appService.ts diff --git a/.gitignore b/.gitignore index ae0691605..d9787d87b 100644 --- a/.gitignore +++ b/.gitignore @@ -22,16 +22,16 @@ package-lock.json core/lib/** # Nitro binary files -extensions/inference-nitro-extension/bin/*/nitro -extensions/inference-nitro-extension/bin/*/*.metal -extensions/inference-nitro-extension/bin/*/*.exe -extensions/inference-nitro-extension/bin/*/*.dll -extensions/inference-nitro-extension/bin/*/*.exp -extensions/inference-nitro-extension/bin/*/*.lib -extensions/inference-nitro-extension/bin/saved-* -extensions/inference-nitro-extension/bin/*.tar.gz -extensions/inference-nitro-extension/bin/vulkaninfoSDK.exe -extensions/inference-nitro-extension/bin/vulkaninfo +extensions/*-extension/bin/*/nitro +extensions/*-extension/bin/*/*.metal +extensions/*-extension/bin/*/*.exe +extensions/*-extension/bin/*/*.dll +extensions/*-extension/bin/*/*.exp +extensions/*-extension/bin/*/*.lib +extensions/*-extension/bin/saved-* +extensions/*-extension/bin/*.tar.gz +extensions/*-extension/bin/vulkaninfoSDK.exe +extensions/*-extension/bin/vulkaninfo # Turborepo diff --git a/core/package.json b/core/package.json index 2bf3e1735..2f4f6b576 100644 --- a/core/package.json +++ b/core/package.json @@ -45,11 +45,12 @@ "start": "rollup -c rollup.config.ts -w" }, "devDependencies": { - "jest": "^29.7.0", "@types/jest": "^29.5.12", "@types/node": "^12.0.2", - "eslint-plugin-jest": "^27.9.0", "eslint": "8.57.0", + "eslint-plugin-jest": "^27.9.0", + "jest": "^29.7.0", + "rimraf": "^3.0.2", "rollup": "^2.38.5", "rollup-plugin-commonjs": "^9.1.8", "rollup-plugin-json": "^3.1.0", @@ -58,7 +59,10 @@ "rollup-plugin-typescript2": "^0.36.0", "ts-jest": "^29.1.2", "tslib": "^2.6.2", - "typescript": "^5.3.3", - "rimraf": "^3.0.2" + "typescript": "^5.3.3" + }, + "dependencies": { + "rxjs": "^7.8.1", + "ulid": "^2.3.0" } } diff --git a/core/rollup.config.ts b/core/rollup.config.ts index ebea8e237..95305bf25 100644 --- a/core/rollup.config.ts +++ b/core/rollup.config.ts @@ -64,7 +64,7 @@ export default [ // Allow json resolution json(), // Compile TypeScript files - typescript({ useTsconfigDeclarationDir: true }), + typescript({ useTsconfigDeclarationDir: true, exclude: ['src/*.ts', 'src/extensions/**'] }), // Allow bundling cjs modules (unlike webpack, rollup doesn't understand cjs) commonjs(), // Allow node_modules resolution, so you can use 'external' to control diff --git a/core/src/api/index.ts b/core/src/api/index.ts index e62b49087..f97593934 100644 --- a/core/src/api/index.ts +++ b/core/src/api/index.ts @@ -33,6 +33,8 @@ export enum AppRoute { stopServer = 'stopServer', log = 'log', logServer = 'logServer', + systemInformations = 'systemInformations', + showToast = 'showToast', } export enum AppEvent { @@ -56,6 +58,7 @@ export enum DownloadEvent { onFileDownloadUpdate = 'onFileDownloadUpdate', onFileDownloadError = 'onFileDownloadError', onFileDownloadSuccess = 'onFileDownloadSuccess', + onFileUnzipSuccess = 'onFileUnzipSuccess', } export enum LocalImportModelEvent { diff --git a/core/src/core.ts b/core/src/core.ts index 6e2442c2b..b8cbd3162 100644 --- a/core/src/core.ts +++ b/core/src/core.ts @@ -1,4 +1,4 @@ -import { FileStat } from './types' +import { DownloadRequest, FileStat, NetworkConfig } from './types' /** * Execute a extension module function in main process @@ -17,18 +17,16 @@ const executeOnMain: (extension: string, method: string, ...args: any[]) => Prom /** * Downloads a file from a URL and saves it to the local file system. - * @param {string} url - The URL of the file to download. - * @param {string} fileName - The name to use for the downloaded file. - * @param {object} network - Optional object to specify proxy/whether to ignore SSL certificates. + * + * @param {DownloadRequest} downloadRequest - The request to download the file. + * @param {NetworkConfig} network - Optional object to specify proxy/whether to ignore SSL certificates. + * * @returns {Promise} A promise that resolves when the file is downloaded. */ -const downloadFile: ( - url: string, - fileName: string, - network?: { proxy?: string; ignoreSSL?: boolean } -) => Promise = (url, fileName, network) => { - return global.core?.api?.downloadFile(url, fileName, network) -} +const downloadFile: (downloadRequest: DownloadRequest, network?: NetworkConfig) => Promise = ( + downloadRequest, + network +) => global.core?.api?.downloadFile(downloadRequest, network) /** * Aborts the download of a specific file. @@ -108,6 +106,20 @@ const log: (message: string, fileName?: string) => void = (message, fileName) => const isSubdirectory: (from: string, to: string) => Promise = (from: string, to: string) => global.core.api?.isSubdirectory(from, to) +/** + * Get system information + * @returns {Promise} - A promise that resolves with the system information. + */ +const systemInformations: () => Promise = () => global.core.api?.systemInformations() + +/** + * Show toast message from browser processes. + * @param title + * @param message + * @returns + */ +const showToast: (title: string, message: string) => void = (title, message) => + global.core.api?.showToast(title, message) /** * Register extension point function type definition */ @@ -134,5 +146,7 @@ export { log, isSubdirectory, getUserHomePath, + systemInformations, + showToast, FileStat, } diff --git a/core/src/extension.ts b/core/src/extension.ts index 3b3edc7b3..22accb4b4 100644 --- a/core/src/extension.ts +++ b/core/src/extension.ts @@ -10,6 +10,22 @@ export enum ExtensionTypeEnum { export interface ExtensionType { type(): ExtensionTypeEnum | undefined } + +export interface Compatibility { + platform: string[] + version: string +} + +const ALL_INSTALLATION_STATE = [ + 'NotRequired', // not required. + 'Installed', // require and installed. Good to go. + 'NotInstalled', // require to be installed. + 'Corrupted', // require but corrupted. Need to redownload. +] as const + +export type InstallationStateTuple = typeof ALL_INSTALLATION_STATE +export type InstallationState = InstallationStateTuple[number] + /** * Represents a base extension. * This class should be extended by any class that represents an extension. @@ -33,4 +49,32 @@ export abstract class BaseExtension implements ExtensionType { * Any cleanup logic for the extension should be put here. */ abstract onUnload(): void + + /** + * The compatibility of the extension. + * This is used to check if the extension is compatible with the current environment. + * @property {Array} platform + */ + compatibility(): Compatibility | undefined { + return undefined + } + + /** + * Determine if the prerequisites for the extension are installed. + * + * @returns {boolean} true if the prerequisites are installed, false otherwise. + */ + async installationState(): Promise { + return 'NotRequired' + } + + /** + * Install the prerequisites for the extension. + * + * @returns {Promise} + */ + // @ts-ignore + async install(...args): Promise { + return + } } diff --git a/core/src/extensions/ai-engines/AIEngine.ts b/core/src/extensions/ai-engines/AIEngine.ts new file mode 100644 index 000000000..608b5c193 --- /dev/null +++ b/core/src/extensions/ai-engines/AIEngine.ts @@ -0,0 +1,60 @@ +import { getJanDataFolderPath, joinPath } from '../../core' +import { events } from '../../events' +import { BaseExtension } from '../../extension' +import { fs } from '../../fs' +import { Model, ModelEvent } from '../../types' + +/** + * Base AIEngine + * Applicable to all AI Engines + */ +export abstract class AIEngine extends BaseExtension { + // The inference engine + abstract provider: string + // The model folder + modelFolder: string = 'models' + + abstract models(): Promise + + /** + * On extension load, subscribe to events. + */ + onLoad() { + this.prePopulateModels() + } + + /** + * Pre-populate models to App Data Folder + */ + prePopulateModels(): Promise { + return this.models().then((models) => { + const prePoluateOperations = models.map((model) => + getJanDataFolderPath() + .then((janDataFolder) => + // Attempt to create the model folder + joinPath([janDataFolder, this.modelFolder, model.id]).then((path) => + fs + .mkdirSync(path) + .catch() + .then(() => path) + ) + ) + .then((path) => joinPath([path, 'model.json'])) + .then((path) => { + // Do not overwite existing model.json + return fs.existsSync(path).then((exist: any) => { + if (!exist) return fs.writeFileSync(path, JSON.stringify(model, null, 2)) + }) + }) + .catch((e: Error) => { + console.error('Error', e) + }) + ) + Promise.all(prePoluateOperations).then(() => + // Emit event to update models + // So the UI can update the models list + events.emit(ModelEvent.OnModelsUpdate, {}) + ) + }) + } +} diff --git a/core/src/extensions/ai-engines/LocalOAIEngine.ts b/core/src/extensions/ai-engines/LocalOAIEngine.ts new file mode 100644 index 000000000..79dbcbf5e --- /dev/null +++ b/core/src/extensions/ai-engines/LocalOAIEngine.ts @@ -0,0 +1,63 @@ +import { executeOnMain, getJanDataFolderPath, joinPath } from '../../core' +import { events } from '../../events' +import { Model, ModelEvent } from '../../types' +import { OAIEngine } from './OAIEngine' + +/** + * Base OAI Local Inference Provider + * Added the implementation of loading and unloading model (applicable to local inference providers) + */ +export abstract class LocalOAIEngine extends OAIEngine { + // The inference engine + loadModelFunctionName: string = 'loadModel' + unloadModelFunctionName: string = 'unloadModel' + isRunning: boolean = false + + /** + * On extension load, subscribe to events. + */ + onLoad() { + super.onLoad() + // These events are applicable to local inference providers + events.on(ModelEvent.OnModelInit, (model: Model) => this.onModelInit(model)) + events.on(ModelEvent.OnModelStop, (model: Model) => this.onModelStop(model)) + } + + /** + * Load the model. + */ + async onModelInit(model: Model) { + if (model.engine.toString() !== this.provider) return + + const modelFolder = await joinPath([await getJanDataFolderPath(), this.modelFolder, model.id]) + + const res = await executeOnMain(this.nodeModule, this.loadModelFunctionName, { + modelFolder, + model, + }) + + if (res?.error) { + events.emit(ModelEvent.OnModelFail, { + ...model, + error: res.error, + }) + return + } else { + this.loadedModel = model + events.emit(ModelEvent.OnModelReady, model) + this.isRunning = true + } + } + /** + * Stops the model. + */ + onModelStop(model: Model) { + if (model.engine?.toString() !== this.provider) return + + this.isRunning = false + + executeOnMain(this.nodeModule, this.unloadModelFunctionName).then(() => { + events.emit(ModelEvent.OnModelStopped, {}) + }) + } +} diff --git a/core/src/extensions/ai-engines/OAIEngine.ts b/core/src/extensions/ai-engines/OAIEngine.ts new file mode 100644 index 000000000..3e583c9b9 --- /dev/null +++ b/core/src/extensions/ai-engines/OAIEngine.ts @@ -0,0 +1,116 @@ +import { requestInference } from './helpers/sse' +import { ulid } from 'ulid' +import { AIEngine } from './AIEngine' +import { + ChatCompletionRole, + ContentType, + InferenceEvent, + MessageEvent, + MessageRequest, + MessageRequestType, + MessageStatus, + Model, + ModelInfo, + ThreadContent, + ThreadMessage, +} from '../../types' +import { events } from '../../events' + +/** + * Base OAI Inference Provider + * Applicable to all OAI compatible inference providers + */ +export abstract class OAIEngine extends AIEngine { + // The inference engine + abstract inferenceUrl: string + abstract nodeModule: string + + // Controller to handle stop requests + controller = new AbortController() + isCancelled = false + + // The loaded model instance + loadedModel: Model | undefined + + /** + * On extension load, subscribe to events. + */ + onLoad() { + super.onLoad() + events.on(MessageEvent.OnMessageSent, (data: MessageRequest) => this.inference(data)) + events.on(InferenceEvent.OnInferenceStopped, () => this.onInferenceStopped()) + } + + /** + * On extension unload + */ + onUnload(): void {} + + /* + * Inference request + */ + inference(data: MessageRequest) { + if (data.model?.engine?.toString() !== this.provider) return + + const timestamp = Date.now() + const message: ThreadMessage = { + id: ulid(), + thread_id: data.threadId, + type: data.type, + assistant_id: data.assistantId, + role: ChatCompletionRole.Assistant, + content: [], + status: MessageStatus.Pending, + created: timestamp, + updated: timestamp, + object: 'thread.message', + } + + if (data.type !== MessageRequestType.Summary) { + events.emit(MessageEvent.OnMessageResponse, message) + } + + this.isCancelled = false + this.controller = new AbortController() + + const model: ModelInfo = { + ...(this.loadedModel ? this.loadedModel : {}), + ...data.model, + } + + requestInference(this.inferenceUrl, data.messages ?? [], model, this.controller).subscribe({ + next: (content: any) => { + const messageContent: ThreadContent = { + type: ContentType.Text, + text: { + value: content.trim(), + annotations: [], + }, + } + message.content = [messageContent] + events.emit(MessageEvent.OnMessageUpdate, message) + }, + complete: async () => { + message.status = message.content.length ? MessageStatus.Ready : MessageStatus.Error + events.emit(MessageEvent.OnMessageUpdate, message) + }, + error: async (err: any) => { + if (this.isCancelled || message.content.length) { + message.status = MessageStatus.Stopped + events.emit(MessageEvent.OnMessageUpdate, message) + return + } + message.status = MessageStatus.Error + events.emit(MessageEvent.OnMessageUpdate, message) + }, + }) + } + + /** + * Stops the inference. + */ + onInferenceStopped() { + this.isCancelled = true + this.controller?.abort() + } +} diff --git a/core/src/extensions/ai-engines/helpers/sse.ts b/core/src/extensions/ai-engines/helpers/sse.ts new file mode 100644 index 000000000..3d810d934 --- /dev/null +++ b/core/src/extensions/ai-engines/helpers/sse.ts @@ -0,0 +1,67 @@ +import { Observable } from 'rxjs' +import { ModelRuntimeParams } from '../../../types' +/** + * Sends a request to the inference server to generate a response based on the recent messages. + * @param recentMessages - An array of recent messages to use as context for the inference. + * @returns An Observable that emits the generated response as a string. + */ +export function requestInference( + inferenceUrl: string, + recentMessages: any[], + model: { + id: string + parameters: ModelRuntimeParams + }, + controller?: AbortController +): Observable { + return new Observable((subscriber) => { + const requestBody = JSON.stringify({ + messages: recentMessages, + model: model.id, + stream: true, + ...model.parameters, + }) + fetch(inferenceUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Accept': model.parameters.stream ? 'text/event-stream' : 'application/json', + }, + body: requestBody, + signal: controller?.signal, + }) + .then(async (response) => { + if (model.parameters.stream === false) { + const data = await response.json() + subscriber.next(data.choices[0]?.message?.content ?? '') + } else { + const stream = response.body + const decoder = new TextDecoder('utf-8') + const reader = stream?.getReader() + let content = '' + + while (true && reader) { + const { done, value } = await reader.read() + if (done) { + break + } + const text = decoder.decode(value) + const lines = text.trim().split('\n') + for (const line of lines) { + if (line.startsWith('data: ') && !line.includes('data: [DONE]')) { + const data = JSON.parse(line.replace('data: ', '')) + content += data.choices[0]?.delta?.content ?? '' + if (content.startsWith('assistant: ')) { + content = content.replace('assistant: ', '') + } + subscriber.next(content) + } + } + } + } + subscriber.complete() + }) + .catch((err) => subscriber.error(err)) + }) +} diff --git a/core/src/extensions/ai-engines/index.ts b/core/src/extensions/ai-engines/index.ts new file mode 100644 index 000000000..f4da62a7c --- /dev/null +++ b/core/src/extensions/ai-engines/index.ts @@ -0,0 +1,3 @@ +export * from './AIEngine' +export * from './OAIEngine' +export * from './LocalOAIEngine' diff --git a/core/src/extensions/index.ts b/core/src/extensions/index.ts index c6834482c..c049f3b3a 100644 --- a/core/src/extensions/index.ts +++ b/core/src/extensions/index.ts @@ -28,3 +28,8 @@ export { ModelExtension } from './model' * Hugging Face extension for converting HF models to GGUF. */ export { HuggingFaceExtension } from './huggingface' + +/** + * Base AI Engines. + */ +export * from './ai-engines' diff --git a/core/src/extensions/model.ts b/core/src/extensions/model.ts index 79202398b..33eec0afc 100644 --- a/core/src/extensions/model.ts +++ b/core/src/extensions/model.ts @@ -1,5 +1,5 @@ import { BaseExtension, ExtensionTypeEnum } from '../extension' -import { ImportingModel, Model, ModelInterface, OptionType } from '../index' +import { GpuSetting, ImportingModel, Model, ModelInterface, OptionType } from '../index' /** * Model extension for managing models. @@ -14,6 +14,7 @@ export abstract class ModelExtension extends BaseExtension implements ModelInter abstract downloadModel( model: Model, + gpuSettings?: GpuSetting, network?: { proxy: string; ignoreSSL?: boolean } ): Promise abstract cancelModelDownload(modelId: string): Promise diff --git a/core/src/extensions/monitoring.ts b/core/src/extensions/monitoring.ts index ba193f0f4..8d61580fc 100644 --- a/core/src/extensions/monitoring.ts +++ b/core/src/extensions/monitoring.ts @@ -1,5 +1,5 @@ import { BaseExtension, ExtensionTypeEnum } from '../extension' -import { MonitoringInterface } from '../index' +import { GpuSetting, MonitoringInterface } from '../index' /** * Monitoring extension for system monitoring. @@ -13,6 +13,7 @@ export abstract class MonitoringExtension extends BaseExtension implements Monit return ExtensionTypeEnum.SystemMonitoring } + abstract getGpuSetting(): Promise abstract getResourcesInfo(): Promise abstract getCurrentLoad(): Promise } diff --git a/core/src/node/api/processors/download.ts b/core/src/node/api/processors/download.ts index 4ddeff160..8e8e08f2f 100644 --- a/core/src/node/api/processors/download.ts +++ b/core/src/node/api/processors/download.ts @@ -5,7 +5,7 @@ import { getJanDataFolderPath } from '../../helper' import { DownloadManager } from '../../helper/download' import { createWriteStream, renameSync } from 'fs' import { Processor } from './Processor' -import { DownloadState } from '../../../types' +import { DownloadRequest, DownloadState, NetworkConfig } from '../../../types' export class Downloader implements Processor { observer?: Function @@ -20,24 +20,27 @@ export class Downloader implements Processor { return func(this.observer, ...args) } - downloadFile(observer: any, url: string, localPath: string, network: any) { + downloadFile(observer: any, downloadRequest: DownloadRequest, network?: NetworkConfig) { const request = require('request') const progress = require('request-progress') const strictSSL = !network?.ignoreSSL const proxy = network?.proxy?.startsWith('http') ? network.proxy : undefined + + const { localPath, url } = downloadRequest + let normalizedPath = localPath if (typeof localPath === 'string') { - localPath = normalizeFilePath(localPath) + normalizedPath = normalizeFilePath(localPath) } - const array = localPath.split(sep) + const array = normalizedPath.split(sep) const fileName = array.pop() ?? '' const modelId = array.pop() ?? '' - const destination = resolve(getJanDataFolderPath(), localPath) + const destination = resolve(getJanDataFolderPath(), normalizedPath) const rq = request({ url, strictSSL, proxy }) // Put request to download manager instance - DownloadManager.instance.setRequest(localPath, rq) + DownloadManager.instance.setRequest(normalizedPath, rq) // Downloading file to a temp file first const downloadingTempFile = `${destination}.download` @@ -56,16 +59,25 @@ export class Downloader implements Processor { total: 0, transferred: 0, }, + children: [], downloadState: 'downloading', + extensionId: downloadRequest.extensionId, + downloadType: downloadRequest.downloadType, + localPath: normalizedPath, } DownloadManager.instance.downloadProgressMap[modelId] = initialDownloadState + if (downloadRequest.downloadType === 'extension') { + observer?.(DownloadEvent.onFileDownloadUpdate, initialDownloadState) + } + progress(rq, {}) .on('progress', (state: any) => { + const currentDownloadState = DownloadManager.instance.downloadProgressMap[modelId] const downloadState: DownloadState = { + ...currentDownloadState, ...state, - modelId, - fileName, + fileName: fileName, downloadState: 'downloading', } console.debug('progress: ', downloadState) @@ -76,22 +88,22 @@ export class Downloader implements Processor { const currentDownloadState = DownloadManager.instance.downloadProgressMap[modelId] const downloadState: DownloadState = { ...currentDownloadState, + fileName: fileName, error: error.message, downloadState: 'error', } - if (currentDownloadState) { - DownloadManager.instance.downloadProgressMap[modelId] = downloadState - } observer?.(DownloadEvent.onFileDownloadError, downloadState) + DownloadManager.instance.downloadProgressMap[modelId] = downloadState }) .on('end', () => { const currentDownloadState = DownloadManager.instance.downloadProgressMap[modelId] - if (currentDownloadState && DownloadManager.instance.networkRequests[localPath]) { + if (currentDownloadState && DownloadManager.instance.networkRequests[normalizedPath]) { // Finished downloading, rename temp file to actual file renameSync(downloadingTempFile, destination) const downloadState: DownloadState = { ...currentDownloadState, + fileName: fileName, downloadState: 'end', } observer?.(DownloadEvent.onFileDownloadSuccess, downloadState) diff --git a/core/src/node/api/restful/helper/builder.ts b/core/src/node/api/restful/helper/builder.ts index 7001c0c76..6b9bbb3a8 100644 --- a/core/src/node/api/restful/helper/builder.ts +++ b/core/src/node/api/restful/helper/builder.ts @@ -1,7 +1,16 @@ -import fs from 'fs' +import { + existsSync, + readdirSync, + readFileSync, + writeFileSync, + mkdirSync, + appendFileSync, + createWriteStream, + rmdirSync, +} from 'fs' import { JanApiRouteConfiguration, RouteConfiguration } from './configuration' import { join } from 'path' -import { ContentType, MessageStatus, Model, ThreadMessage } from '../../../../index' +import { ContentType, MessageStatus, Model, ThreadMessage } from '../../../../types' import { getEngineConfiguration, getJanDataFolderPath } from '../../../helper' import { DEFAULT_CHAT_COMPLETION_URL } from './consts' @@ -9,12 +18,12 @@ import { DEFAULT_CHAT_COMPLETION_URL } from './consts' export const getBuilder = async (configuration: RouteConfiguration) => { const directoryPath = join(getJanDataFolderPath(), configuration.dirName) try { - if (!fs.existsSync(directoryPath)) { + if (!existsSync(directoryPath)) { console.debug('model folder not found') return [] } - const files: string[] = fs.readdirSync(directoryPath) + const files: string[] = readdirSync(directoryPath) const allDirectories: string[] = [] for (const file of files) { @@ -46,8 +55,8 @@ export const getBuilder = async (configuration: RouteConfiguration) => { } const readModelMetadata = (path: string): string | undefined => { - if (fs.existsSync(path)) { - return fs.readFileSync(path, 'utf-8') + if (existsSync(path)) { + return readFileSync(path, 'utf-8') } else { return undefined } @@ -81,7 +90,7 @@ export const deleteBuilder = async (configuration: RouteConfiguration, id: strin } const objectPath = join(directoryPath, id) - fs.rmdirSync(objectPath, { recursive: true }) + rmdirSync(objectPath, { recursive: true }) return { id: id, object: configuration.delete.object, @@ -96,20 +105,19 @@ export const getMessages = async (threadId: string): Promise => const threadDirPath = join(getJanDataFolderPath(), 'threads', threadId) const messageFile = 'messages.jsonl' try { - const files: string[] = fs.readdirSync(threadDirPath) + const files: string[] = readdirSync(threadDirPath) if (!files.includes(messageFile)) { console.error(`${threadDirPath} not contains message file`) return [] } const messageFilePath = join(threadDirPath, messageFile) - if (!fs.existsSync(messageFilePath)) { + if (!existsSync(messageFilePath)) { console.debug('message file not found') return [] } - const lines = fs - .readFileSync(messageFilePath, 'utf-8') + const lines = readFileSync(messageFilePath, 'utf-8') .toString() .split('\n') .filter((line: any) => line !== '') @@ -157,11 +165,11 @@ export const createThread = async (thread: any) => { const threadDirPath = join(getJanDataFolderPath(), 'threads', updatedThread.id) const threadJsonPath = join(threadDirPath, threadMetadataFileName) - if (!fs.existsSync(threadDirPath)) { - fs.mkdirSync(threadDirPath) + if (!existsSync(threadDirPath)) { + mkdirSync(threadDirPath) } - await fs.writeFileSync(threadJsonPath, JSON.stringify(updatedThread, null, 2)) + await writeFileSync(threadJsonPath, JSON.stringify(updatedThread, null, 2)) return updatedThread } catch (err) { return { @@ -191,7 +199,7 @@ export const updateThread = async (threadId: string, thread: any) => { const threadDirPath = join(getJanDataFolderPath(), 'threads', updatedThread.id) const threadJsonPath = join(threadDirPath, threadMetadataFileName) - await fs.writeFileSync(threadJsonPath, JSON.stringify(updatedThread, null, 2)) + await writeFileSync(threadJsonPath, JSON.stringify(updatedThread, null, 2)) return updatedThread } catch (err) { return { @@ -233,10 +241,10 @@ export const createMessage = async (threadId: string, message: any) => { const threadDirPath = join(getJanDataFolderPath(), 'threads', threadId) const threadMessagePath = join(threadDirPath, threadMessagesFileName) - if (!fs.existsSync(threadDirPath)) { - fs.mkdirSync(threadDirPath) + if (!existsSync(threadDirPath)) { + mkdirSync(threadDirPath) } - fs.appendFileSync(threadMessagePath, JSON.stringify(threadMessage) + '\n') + appendFileSync(threadMessagePath, JSON.stringify(threadMessage) + '\n') return threadMessage } catch (err) { return { @@ -259,8 +267,8 @@ export const downloadModel = async ( } const directoryPath = join(getJanDataFolderPath(), 'models', modelId) - if (!fs.existsSync(directoryPath)) { - fs.mkdirSync(directoryPath) + if (!existsSync(directoryPath)) { + mkdirSync(directoryPath) } // path to model binary @@ -281,7 +289,7 @@ export const downloadModel = async ( .on('end', function () { console.debug('end') }) - .pipe(fs.createWriteStream(modelBinaryPath)) + .pipe(createWriteStream(modelBinaryPath)) } return { diff --git a/core/src/types/file/index.ts b/core/src/types/file/index.ts index cc7274a28..d941987ef 100644 --- a/core/src/types/file/index.ts +++ b/core/src/types/file/index.ts @@ -4,16 +4,43 @@ export type FileStat = { } export type DownloadState = { - modelId: string + modelId: string // TODO: change to download id fileName: string time: DownloadTime speed: number - percent: number + percent: number size: DownloadSize - children?: DownloadState[] - error?: string downloadState: 'downloading' | 'error' | 'end' + children?: DownloadState[] + + error?: string + extensionId?: string + downloadType?: DownloadType + localPath?: string +} + +export type DownloadType = 'model' | 'extension' + +export type DownloadRequest = { + /** + * The URL to download the file from. + */ + url: string + + /** + * The local path to save the file to. + */ + localPath: string + + /** + * The extension ID of the extension that initiated the download. + * + * Can be extension name. + */ + extensionId?: string + + downloadType?: DownloadType } type DownloadTime = { diff --git a/core/src/types/miscellaneous/fileDownloadRequest.ts b/core/src/types/miscellaneous/fileDownloadRequest.ts new file mode 100644 index 000000000..83131aa71 --- /dev/null +++ b/core/src/types/miscellaneous/fileDownloadRequest.ts @@ -0,0 +1,8 @@ +export type FileDownloadRequest = { + downloadId: string + url: string + localPath: string + fileName: string + displayName: string + metadata: Record +} diff --git a/core/src/types/miscellaneous/index.ts b/core/src/types/miscellaneous/index.ts index e9c205a73..b4ef68ab6 100644 --- a/core/src/types/miscellaneous/index.ts +++ b/core/src/types/miscellaneous/index.ts @@ -1,3 +1,5 @@ export * from './systemResourceInfo' export * from './promptTemplate' export * from './appUpdate' +export * from './fileDownloadRequest' +export * from './networkConfig' \ No newline at end of file diff --git a/core/src/types/miscellaneous/networkConfig.ts b/core/src/types/miscellaneous/networkConfig.ts new file mode 100644 index 000000000..2d27f4223 --- /dev/null +++ b/core/src/types/miscellaneous/networkConfig.ts @@ -0,0 +1,4 @@ +export type NetworkConfig = { + proxy?: string + ignoreSSL?: boolean +} diff --git a/core/src/types/miscellaneous/systemResourceInfo.ts b/core/src/types/miscellaneous/systemResourceInfo.ts index 1472cda47..f7dd4a82b 100644 --- a/core/src/types/miscellaneous/systemResourceInfo.ts +++ b/core/src/types/miscellaneous/systemResourceInfo.ts @@ -2,3 +2,31 @@ export type SystemResourceInfo = { numCpuPhysicalCore: number memAvailable: number } + +export type RunMode = 'cpu' | 'gpu' + +export type GpuSetting = { + notify: boolean + run_mode: RunMode + nvidia_driver: { + exist: boolean + version: string + } + cuda: { + exist: boolean + version: string + } + gpus: GpuSettingInfo[] + gpu_highest_vram: string + gpus_in_use: string[] + is_initial: boolean + // TODO: This needs to be set based on user toggle in settings + vulkan: boolean +} + +export type GpuSettingInfo = { + id: string + vram: string + name: string + arch?: string +} diff --git a/core/src/types/model/modelEntity.ts b/core/src/types/model/modelEntity.ts index 11d3e0526..74568686b 100644 --- a/core/src/types/model/modelEntity.ts +++ b/core/src/types/model/modelEntity.ts @@ -19,6 +19,7 @@ export enum InferenceEngine { nitro = 'nitro', openai = 'openai', triton_trtllm = 'triton_trtllm', + nitro_tensorrt_llm = 'nitro-tensorrt-llm', tool_retrieval_enabled = 'tool_retrieval_enabled', } diff --git a/core/src/types/model/modelInterface.ts b/core/src/types/model/modelInterface.ts index 93d5867ee..639c7c8d3 100644 --- a/core/src/types/model/modelInterface.ts +++ b/core/src/types/model/modelInterface.ts @@ -1,3 +1,4 @@ +import { GpuSetting } from '../miscellaneous' import { Model } from './modelEntity' /** @@ -10,7 +11,11 @@ export interface ModelInterface { * @param network - Optional object to specify proxy/whether to ignore SSL certificates. * @returns A Promise that resolves when the model has been downloaded. */ - downloadModel(model: Model, network?: { ignoreSSL?: boolean; proxy?: string }): Promise + downloadModel( + model: Model, + gpuSettings?: GpuSetting, + network?: { ignoreSSL?: boolean; proxy?: string } + ): Promise /** * Cancels the download of a specific model. diff --git a/core/src/types/monitoring/index.ts b/core/src/types/monitoring/index.ts index 5828dae8b..b96c518fd 100644 --- a/core/src/types/monitoring/index.ts +++ b/core/src/types/monitoring/index.ts @@ -1 +1,2 @@ export * from './monitoringInterface' +export * from './resourceInfo' diff --git a/core/src/types/monitoring/resourceInfo.ts b/core/src/types/monitoring/resourceInfo.ts new file mode 100644 index 000000000..b19da5462 --- /dev/null +++ b/core/src/types/monitoring/resourceInfo.ts @@ -0,0 +1,6 @@ +export type ResourceInfo = { + mem: { + totalMemory: number + usedMemory: number + } +} diff --git a/core/tsconfig.json b/core/tsconfig.json index b112079d2..daeb7eeff 100644 --- a/core/tsconfig.json +++ b/core/tsconfig.json @@ -13,7 +13,7 @@ "declarationDir": "dist/types", "outDir": "dist/lib", "importHelpers": true, - "types": ["@types/jest"] + "types": ["@types/jest"], }, - "include": ["src"] + "include": ["src"], } diff --git a/extensions/huggingface-extension/src/index.ts b/extensions/huggingface-extension/src/index.ts index d8f755080..88292ce58 100644 --- a/extensions/huggingface-extension/src/index.ts +++ b/extensions/huggingface-extension/src/index.ts @@ -13,6 +13,7 @@ import { events, DownloadEvent, log, + DownloadRequest, } from '@janhq/core' import { ggufMetadata } from 'hyllama' @@ -148,7 +149,11 @@ export default class JanHuggingFaceExtension extends HuggingFaceExtension { if (this.interrupted) return if (!(await fs.existsSync(localPath))) { - downloadFile(url, localPath, network) + const downloadRequest: DownloadRequest = { + url, + localPath, + } + downloadFile(downloadRequest, network) filePaths.push(filePath) } } diff --git a/extensions/inference-nitro-extension/download.bat b/extensions/inference-nitro-extension/download.bat index 2ef3165c1..bb8c4ffdc 100644 --- a/extensions/inference-nitro-extension/download.bat +++ b/extensions/inference-nitro-extension/download.bat @@ -1,3 +1,3 @@ @echo off set /p NITRO_VERSION=<./bin/version.txt -.\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64-cuda-12-0.tar.gz -e --strip 1 -o ./bin/win-cuda-12-0 && .\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64-cuda-11-7.tar.gz -e --strip 1 -o ./bin/win-cuda-11-7 && .\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64.tar.gz -e --strip 1 -o ./bin/win-cpu && .\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64-vulkan.tar.gz -e --strip 1 -o ./bin/win-vulkan && .\node_modules\.bin\download https://delta.jan.ai/vulkaninfoSDK.exe -o ./bin +.\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64-cuda-12-0.tar.gz -e --strip 1 -o ./bin/win-cuda-12-0 && .\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64-cuda-11-7.tar.gz -e --strip 1 -o ./bin/win-cuda-11-7 && .\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64.tar.gz -e --strip 1 -o ./bin/win-cpu && .\node_modules\.bin\download https://github.com/janhq/nitro/releases/download/v%NITRO_VERSION%/nitro-%NITRO_VERSION%-win-amd64-vulkan.tar.gz -e --strip 1 -o ./bin/win-vulkan diff --git a/extensions/inference-nitro-extension/package.json b/extensions/inference-nitro-extension/package.json index e6365ad92..dd5798764 100644 --- a/extensions/inference-nitro-extension/package.json +++ b/extensions/inference-nitro-extension/package.json @@ -8,7 +8,7 @@ "license": "AGPL-3.0", "scripts": { "build": "tsc --module commonjs && rollup -c rollup.config.ts", - "downloadnitro:linux": "NITRO_VERSION=$(cat ./bin/version.txt) && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64.tar.gz -e --strip 1 -o ./bin/linux-cpu && chmod +x ./bin/linux-cpu/nitro && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64-cuda-12-0.tar.gz -e --strip 1 -o ./bin/linux-cuda-12-0 && chmod +x ./bin/linux-cuda-12-0/nitro && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64-cuda-11-7.tar.gz -e --strip 1 -o ./bin/linux-cuda-11-7 && chmod +x ./bin/linux-cuda-11-7/nitro && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64-vulkan.tar.gz -e --strip 1 -o ./bin/linux-vulkan && chmod +x ./bin/linux-vulkan/nitro && download https://delta.jan.ai/vulkaninfo -o ./bin && chmod +x ./bin/vulkaninfo", + "downloadnitro:linux": "NITRO_VERSION=$(cat ./bin/version.txt) && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64.tar.gz -e --strip 1 -o ./bin/linux-cpu && chmod +x ./bin/linux-cpu/nitro && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64-cuda-12-0.tar.gz -e --strip 1 -o ./bin/linux-cuda-12-0 && chmod +x ./bin/linux-cuda-12-0/nitro && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64-cuda-11-7.tar.gz -e --strip 1 -o ./bin/linux-cuda-11-7 && chmod +x ./bin/linux-cuda-11-7/nitro && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-linux-amd64-vulkan.tar.gz -e --strip 1 -o ./bin/linux-vulkan && chmod +x ./bin/linux-vulkan/nitro", "downloadnitro:darwin": "NITRO_VERSION=$(cat ./bin/version.txt) && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-mac-arm64.tar.gz -e --strip 1 -o ./bin/mac-arm64 && chmod +x ./bin/mac-arm64/nitro && download https://github.com/janhq/nitro/releases/download/v${NITRO_VERSION}/nitro-${NITRO_VERSION}-mac-amd64.tar.gz -e --strip 1 -o ./bin/mac-x64 && chmod +x ./bin/mac-x64/nitro", "downloadnitro:win32": "download.bat", "downloadnitro": "run-script-os", diff --git a/extensions/inference-nitro-extension/src/index.ts b/extensions/inference-nitro-extension/src/index.ts index 979b4cfac..70244a5d9 100644 --- a/extensions/inference-nitro-extension/src/index.ts +++ b/extensions/inference-nitro-extension/src/index.ts @@ -108,9 +108,6 @@ export default class JanInferenceNitroExtension extends InferenceExtension { events.on(InferenceEvent.OnInferenceStopped, () => this.onInferenceStopped() ) - - // Attempt to fetch nvidia info - await executeOnMain(NODE, 'updateNvidiaInfo', {}) } /** diff --git a/extensions/inference-nitro-extension/src/node/accelerator.ts b/extensions/inference-nitro-extension/src/node/accelerator.ts deleted file mode 100644 index 1ffdbc5bd..000000000 --- a/extensions/inference-nitro-extension/src/node/accelerator.ts +++ /dev/null @@ -1,237 +0,0 @@ -import { writeFileSync, existsSync, readFileSync } from 'fs' -import { exec, spawn } from 'child_process' -import path from 'path' -import { getJanDataFolderPath, log } from '@janhq/core/node' - -/** - * Default GPU settings - * TODO: This needs to be refactored to support multiple accelerators - **/ -const DEFALT_SETTINGS = { - notify: true, - run_mode: 'cpu', - nvidia_driver: { - exist: false, - version: '', - }, - cuda: { - exist: false, - version: '', - }, - gpus: [], - gpu_highest_vram: '', - gpus_in_use: [], - is_initial: true, - // TODO: This needs to be set based on user toggle in settings - vulkan: false -} - -/** - * Path to the settings file - **/ -export const GPU_INFO_FILE = path.join( - getJanDataFolderPath(), - 'settings', - 'settings.json' -) - -/** - * Current nitro process - */ -let nitroProcessInfo: NitroProcessInfo | undefined = undefined - -/** - * Nitro process info - */ -export interface NitroProcessInfo { - isRunning: boolean -} - -/** - * This will retrive GPU informations and persist settings.json - * Will be called when the extension is loaded to turn on GPU acceleration if supported - */ -export async function updateNvidiaInfo() { - if (process.platform !== 'darwin') { - let data - try { - data = JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) - } catch (error) { - data = DEFALT_SETTINGS - writeFileSync(GPU_INFO_FILE, JSON.stringify(data, null, 2)) - } - updateNvidiaDriverInfo() - updateGpuInfo() - } -} - -/** - * Retrieve current nitro process - */ -export const getNitroProcessInfo = (subprocess: any): NitroProcessInfo => { - nitroProcessInfo = { - isRunning: subprocess != null, - } - return nitroProcessInfo -} - -/** - * Validate nvidia and cuda for linux and windows - */ -export async function updateNvidiaDriverInfo(): Promise { - exec( - 'nvidia-smi --query-gpu=driver_version --format=csv,noheader', - (error, stdout) => { - let data = JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) - - if (!error) { - const firstLine = stdout.split('\n')[0].trim() - data['nvidia_driver'].exist = true - data['nvidia_driver'].version = firstLine - } else { - data['nvidia_driver'].exist = false - } - - writeFileSync(GPU_INFO_FILE, JSON.stringify(data, null, 2)) - Promise.resolve() - } - ) -} - -/** - * Check if file exists in paths - */ -export function checkFileExistenceInPaths( - file: string, - paths: string[] -): boolean { - return paths.some((p) => existsSync(path.join(p, file))) -} - -/** - * Validate cuda for linux and windows - */ -export function updateCudaExistence( - data: Record = DEFALT_SETTINGS -): Record { - let filesCuda12: string[] - let filesCuda11: string[] - let paths: string[] - let cudaVersion: string = '' - - if (process.platform === 'win32') { - filesCuda12 = ['cublas64_12.dll', 'cudart64_12.dll', 'cublasLt64_12.dll'] - filesCuda11 = ['cublas64_11.dll', 'cudart64_11.dll', 'cublasLt64_11.dll'] - paths = process.env.PATH ? process.env.PATH.split(path.delimiter) : [] - } else { - filesCuda12 = ['libcudart.so.12', 'libcublas.so.12', 'libcublasLt.so.12'] - filesCuda11 = ['libcudart.so.11.0', 'libcublas.so.11', 'libcublasLt.so.11'] - paths = process.env.LD_LIBRARY_PATH - ? process.env.LD_LIBRARY_PATH.split(path.delimiter) - : [] - paths.push('/usr/lib/x86_64-linux-gnu/') - } - - let cudaExists = filesCuda12.every( - (file) => existsSync(file) || checkFileExistenceInPaths(file, paths) - ) - - if (!cudaExists) { - cudaExists = filesCuda11.every( - (file) => existsSync(file) || checkFileExistenceInPaths(file, paths) - ) - if (cudaExists) { - cudaVersion = '11' - } - } else { - cudaVersion = '12' - } - - data['cuda'].exist = cudaExists - data['cuda'].version = cudaVersion - console.debug(data['is_initial'], data['gpus_in_use']) - if (cudaExists && data['is_initial'] && data['gpus_in_use'].length > 0) { - data.run_mode = 'gpu' - } - data.is_initial = false - return data -} - -/** - * Get GPU information - */ -export async function updateGpuInfo(): Promise { - let data = JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) - - // Cuda - if (data['vulkan'] === true) { - // Vulkan - exec( - process.platform === 'win32' - ? `${__dirname}\\..\\bin\\vulkaninfoSDK.exe --summary` - : `${__dirname}/../bin/vulkaninfo --summary`, - (error, stdout) => { - if (!error) { - const output = stdout.toString() - log(output) - const gpuRegex = /GPU(\d+):(?:[\s\S]*?)deviceName\s*=\s*(.*)/g - - let gpus = [] - let match - while ((match = gpuRegex.exec(output)) !== null) { - const id = match[1] - const name = match[2] - gpus.push({ id, vram: 0, name }) - } - data.gpus = gpus - - if (!data['gpus_in_use'] || data['gpus_in_use'].length === 0) { - data.gpus_in_use = [data.gpus.length > 1 ? '1' : '0'] - } - - data = updateCudaExistence(data) - writeFileSync(GPU_INFO_FILE, JSON.stringify(data, null, 2)) - } - Promise.resolve() - } - ) - } else { - exec( - 'nvidia-smi --query-gpu=index,memory.total,name --format=csv,noheader,nounits', - (error, stdout) => { - if (!error) { - log(stdout) - // Get GPU info and gpu has higher memory first - let highestVram = 0 - let highestVramId = '0' - let gpus = stdout - .trim() - .split('\n') - .map((line) => { - let [id, vram, name] = line.split(', ') - vram = vram.replace(/\r/g, '') - if (parseFloat(vram) > highestVram) { - highestVram = parseFloat(vram) - highestVramId = id - } - return { id, vram, name } - }) - - data.gpus = gpus - data.gpu_highest_vram = highestVramId - } else { - data.gpus = [] - data.gpu_highest_vram = '' - } - - if (!data['gpus_in_use'] || data['gpus_in_use'].length === 0) { - data.gpus_in_use = [data['gpu_highest_vram']] - } - - data = updateCudaExistence(data) - writeFileSync(GPU_INFO_FILE, JSON.stringify(data, null, 2)) - Promise.resolve() - } - ) - } -} diff --git a/extensions/inference-nitro-extension/src/node/execute.ts b/extensions/inference-nitro-extension/src/node/execute.ts index f9a668507..8bcc75ae4 100644 --- a/extensions/inference-nitro-extension/src/node/execute.ts +++ b/extensions/inference-nitro-extension/src/node/execute.ts @@ -1,12 +1,19 @@ +import { getJanDataFolderPath } from '@janhq/core/node' import { readFileSync } from 'fs' import * as path from 'path' -import { GPU_INFO_FILE } from './accelerator' export interface NitroExecutableOptions { executablePath: string cudaVisibleDevices: string vkVisibleDevices: string } + +export const GPU_INFO_FILE = path.join( + getJanDataFolderPath(), + 'settings', + 'settings.json' +) + /** * Find which executable file to run based on the current platform. * @returns The name of the executable file to run. diff --git a/extensions/inference-nitro-extension/src/node/index.ts b/extensions/inference-nitro-extension/src/node/index.ts index 9b2684a6c..c57eb262d 100644 --- a/extensions/inference-nitro-extension/src/node/index.ts +++ b/extensions/inference-nitro-extension/src/node/index.ts @@ -4,7 +4,6 @@ import { ChildProcessWithoutNullStreams, spawn } from 'child_process' import tcpPortUsed from 'tcp-port-used' import fetchRT from 'fetch-retry' import { log, getSystemResourceInfo } from '@janhq/core/node' -import { getNitroProcessInfo, updateNvidiaInfo } from './accelerator' import { Model, InferenceEngine, @@ -385,11 +384,26 @@ function dispose() { killSubprocess() } +/** + * Nitro process info + */ +export interface NitroProcessInfo { + isRunning: boolean +} + +/** + * Retrieve current nitro process + */ +const getCurrentNitroProcessInfo = (): NitroProcessInfo => { + return { + isRunning: subprocess != null, + } +} + export default { runModel, stopModel, killSubprocess, dispose, - updateNvidiaInfo, - getCurrentNitroProcessInfo: () => getNitroProcessInfo(subprocess), + getCurrentNitroProcessInfo, } diff --git a/extensions/model-extension/src/index.ts b/extensions/model-extension/src/index.ts index fb1f26885..d05e7d07f 100644 --- a/extensions/model-extension/src/index.ts +++ b/extensions/model-extension/src/index.ts @@ -17,6 +17,8 @@ import { ImportingModel, LocalImportModelEvent, baseName, + GpuSetting, + DownloadRequest, } from '@janhq/core' import { extractFileName } from './helpers/path' @@ -29,10 +31,14 @@ export default class JanModelExtension extends ModelExtension { private static readonly _modelMetadataFileName = 'model.json' private static readonly _supportedModelFormat = '.gguf' private static readonly _incompletedModelFileName = '.download' - private static readonly _offlineInferenceEngine = InferenceEngine.nitro - + private static readonly _offlineInferenceEngine = [ + InferenceEngine.nitro, + InferenceEngine.nitro_tensorrt_llm, + ] + private static readonly _tensorRtEngineFormat = '.engine' private static readonly _configDirName = 'config' private static readonly _defaultModelFileName = 'default-model.json' + private static readonly _supportedGpuArch = ['turing', 'ampere', 'ada'] /** * Called when the extension is loaded. @@ -89,12 +95,52 @@ export default class JanModelExtension extends ModelExtension { */ async downloadModel( model: Model, + gpuSettings?: GpuSetting, network?: { ignoreSSL?: boolean; proxy?: string } ): Promise { // create corresponding directory const modelDirPath = await joinPath([JanModelExtension._homeDir, model.id]) if (!(await fs.existsSync(modelDirPath))) await fs.mkdirSync(modelDirPath) + if (model.engine === InferenceEngine.nitro_tensorrt_llm) { + if (!gpuSettings || gpuSettings.gpus.length === 0) { + console.error('No GPU found. Please check your GPU setting.') + return + } + const firstGpu = gpuSettings.gpus[0] + if (!firstGpu.name.toLowerCase().includes('nvidia')) { + console.error('No Nvidia GPU found. Please check your GPU setting.') + return + } + const gpuArch = firstGpu.arch + if (gpuArch === undefined) { + console.error( + 'No GPU architecture found. Please check your GPU setting.' + ) + return + } + + if (!JanModelExtension._supportedGpuArch.includes(gpuArch)) { + console.error( + `Your GPU: ${firstGpu} is not supported. Only 20xx, 30xx, 40xx series are supported.` + ) + return + } + + const os = 'windows' // TODO: remove this hard coded value + + const newSources = model.sources.map((source) => { + const newSource = { ...source } + newSource.url = newSource.url + .replace(//g, os) + .replace(//g, gpuArch) + return newSource + }) + model.sources = newSources + } + + console.debug(`Download sources: ${JSON.stringify(model.sources)}`) + if (model.sources.length > 1) { // path to model binaries for (const source of model.sources) { @@ -105,8 +151,11 @@ export default class JanModelExtension extends ModelExtension { if (source.filename) { path = await joinPath([modelDirPath, source.filename]) } - - downloadFile(source.url, path, network) + const downloadRequest: DownloadRequest = { + url: source.url, + localPath: path, + } + downloadFile(downloadRequest, network) } // TODO: handle multiple binaries for web later } else { @@ -115,7 +164,11 @@ export default class JanModelExtension extends ModelExtension { JanModelExtension._supportedModelFormat ) const path = await joinPath([modelDirPath, fileName]) - downloadFile(model.sources[0]?.url, path, network) + const downloadRequest: DownloadRequest = { + url: model.sources[0]?.url, + localPath: path, + } + downloadFile(downloadRequest, network) if (window && window.core?.api && window.core.api.baseApiUrl) { this.startPollingDownloadProgress(model.id) @@ -238,7 +291,7 @@ export default class JanModelExtension extends ModelExtension { async getDownloadedModels(): Promise { return await this.getModelsMetadata( async (modelDir: string, model: Model) => { - if (model.engine !== JanModelExtension._offlineInferenceEngine) + if (!JanModelExtension._offlineInferenceEngine.includes(model.engine)) return true // model binaries (sources) are absolute path & exist @@ -247,22 +300,32 @@ export default class JanModelExtension extends ModelExtension { ) if (existFiles.every((exist) => exist)) return true - return await fs + const result = await fs .readdirSync(await joinPath([JanModelExtension._homeDir, modelDir])) .then((files: string[]) => { // 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 return ( files.includes(modelDir) || - files.filter( - (file) => + files.filter((file) => { + if ( + file.endsWith(JanModelExtension._incompletedModelFileName) + ) { + return false + } + return ( file .toLowerCase() - .includes(JanModelExtension._supportedModelFormat) && - !file.endsWith(JanModelExtension._incompletedModelFileName) - )?.length >= model.sources.length + .includes(JanModelExtension._supportedModelFormat) || + file + .toLowerCase() + .includes(JanModelExtension._tensorRtEngineFormat) + ) + })?.length > 0 // TODO: NamH find better way (can use basename to check the file name with source url) ) }) + + return result } ) } diff --git a/extensions/monitoring-extension/bin/.gitkeep b/extensions/monitoring-extension/bin/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/extensions/monitoring-extension/download.bat b/extensions/monitoring-extension/download.bat new file mode 100644 index 000000000..f1cf8b7ea --- /dev/null +++ b/extensions/monitoring-extension/download.bat @@ -0,0 +1,2 @@ +@echo off +.\node_modules\.bin\download https://delta.jan.ai/vulkaninfoSDK.exe -o ./bin \ No newline at end of file diff --git a/extensions/monitoring-extension/package.json b/extensions/monitoring-extension/package.json index 582f7cd7b..73d28ab37 100644 --- a/extensions/monitoring-extension/package.json +++ b/extensions/monitoring-extension/package.json @@ -3,21 +3,40 @@ "version": "1.0.10", "description": "This extension provides system health and OS level data", "main": "dist/index.js", - "module": "dist/module.js", + "node": "dist/node/index.cjs.js", "author": "Jan ", "license": "AGPL-3.0", "scripts": { - "build": "tsc -b . && webpack --config webpack.config.js", + "build": "tsc --module commonjs && rollup -c rollup.config.ts && npm run download-artifacts", + "download-artifacts": "run-script-os && cpx \"bin/**\" \"dist/bin\"", + "download-artifacts:darwin": "echo 'No artifacts to download for darwin'", + "download-artifacts:win32": "download.bat", + "download-artifacts:linux": "download https://delta.jan.ai/vulkaninfo -o ./bin && chmod +x ./bin/vulkaninfo", "build:publish": "rimraf *.tgz --glob && npm run build && npm pack && cpx *.tgz ../../pre-install" }, + "exports": { + ".": "./dist/index.js", + "./main": "./dist/node/index.cjs.js" + }, "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@types/node": "^20.11.4", + "@types/node-os-utils": "^1.3.4", + "run-script-os": "^1.1.6", + "cpx": "^1.5.0", "rimraf": "^3.0.2", - "webpack": "^5.88.2", - "webpack-cli": "^5.1.4", - "ts-loader": "^9.5.0" + "rollup": "^2.38.5", + "rollup-plugin-define": "^1.0.1", + "rollup-plugin-sourcemaps": "^0.6.3", + "rollup-plugin-typescript2": "^0.36.0", + "typescript": "^5.3.3", + "download-cli": "^1.1.1" }, "dependencies": { "@janhq/core": "file:../../core", + "@rollup/plugin-replace": "^5.0.5", "node-os-utils": "^1.3.7" }, "files": [ diff --git a/extensions/monitoring-extension/rollup.config.ts b/extensions/monitoring-extension/rollup.config.ts new file mode 100644 index 000000000..1b7a40bad --- /dev/null +++ b/extensions/monitoring-extension/rollup.config.ts @@ -0,0 +1,68 @@ +import resolve from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import sourceMaps from 'rollup-plugin-sourcemaps' +import typescript from 'rollup-plugin-typescript2' +import json from '@rollup/plugin-json' +import replace from '@rollup/plugin-replace' +const packageJson = require('./package.json') + +export default [ + { + input: `src/index.ts`, + output: [{ file: packageJson.main, format: 'es', sourcemap: true }], + // Indicate here external modules you don't wanna include in your bundle (i.e.: 'lodash') + external: [], + watch: { + include: 'src/**', + }, + plugins: [ + replace({ + NODE: JSON.stringify(`${packageJson.name}/${packageJson.node}`), + }), + // Allow json resolution + json(), + // Compile TypeScript files + typescript({ useTsconfigDeclarationDir: true }), + // Compile TypeScript files + // Allow bundling cjs modules (unlike webpack, rollup doesn't understand cjs) + commonjs(), + // Allow node_modules resolution, so you can use 'external' to control + // which external modules to include in the bundle + // https://github.com/rollup/rollup-plugin-node-resolve#usage + resolve({ + extensions: ['.js', '.ts', '.svelte'], + }), + + // Resolve source maps to the original source + sourceMaps(), + ], + }, + { + input: `src/node/index.ts`, + output: [ + { file: 'dist/node/index.cjs.js', format: 'cjs', sourcemap: true }, + ], + // Indicate here external modules you don't wanna include in your bundle (i.e.: 'lodash') + external: ['@janhq/core/node'], + watch: { + include: 'src/node/**', + }, + plugins: [ + // Allow json resolution + json(), + // Compile TypeScript files + typescript({ useTsconfigDeclarationDir: true }), + // Allow bundling cjs modules (unlike webpack, rollup doesn't understand cjs) + commonjs(), + // Allow node_modules resolution, so you can use 'external' to control + // which external modules to include in the bundle + // https://github.com/rollup/rollup-plugin-node-resolve#usage + resolve({ + extensions: ['.ts', '.js', '.json'], + }), + + // Resolve source maps to the original source + sourceMaps(), + ], + }, +] diff --git a/extensions/monitoring-extension/src/@types/global.d.ts b/extensions/monitoring-extension/src/@types/global.d.ts index 8106353cf..dfa96a0b1 100644 --- a/extensions/monitoring-extension/src/@types/global.d.ts +++ b/extensions/monitoring-extension/src/@types/global.d.ts @@ -1 +1,18 @@ -declare const MODULE: string +declare const NODE: string + +type CpuGpuInfo = { + cpu: { + usage: number + } + gpu: GpuInfo[] +} + +type GpuInfo = { + id: string + name: string + temperature: string + utilization: string + memoryTotal: string + memoryFree: string + memoryUtilization: string +} diff --git a/extensions/monitoring-extension/src/index.ts b/extensions/monitoring-extension/src/index.ts index ce9b2fc14..c7f53455d 100644 --- a/extensions/monitoring-extension/src/index.ts +++ b/extensions/monitoring-extension/src/index.ts @@ -1,4 +1,4 @@ -import { MonitoringExtension, executeOnMain } from '@janhq/core' +import { GpuSetting, MonitoringExtension, executeOnMain } from '@janhq/core' /** * JanMonitoringExtension is a extension that provides system monitoring functionality. @@ -8,19 +8,30 @@ export default class JanMonitoringExtension extends MonitoringExtension { /** * Called when the extension is loaded. */ - async onLoad() {} + async onLoad() { + // Attempt to fetch nvidia info + await executeOnMain(NODE, 'updateNvidiaInfo') + } /** * Called when the extension is unloaded. */ onUnload(): void {} + /** + * Returns the GPU configuration. + * @returns A Promise that resolves to an object containing the GPU configuration. + */ + async getGpuSetting(): Promise { + return executeOnMain(NODE, 'getGpuConfig') + } + /** * Returns information about the system resources. * @returns A Promise that resolves to an object containing information about the system resources. */ getResourcesInfo(): Promise { - return executeOnMain(MODULE, 'getResourcesInfo') + return executeOnMain(NODE, 'getResourcesInfo') } /** @@ -28,6 +39,6 @@ export default class JanMonitoringExtension extends MonitoringExtension { * @returns A Promise that resolves to an object containing information about the current system load. */ getCurrentLoad(): Promise { - return executeOnMain(MODULE, 'getCurrentLoad') + return executeOnMain(NODE, 'getCurrentLoad') } } diff --git a/extensions/monitoring-extension/src/module.ts b/extensions/monitoring-extension/src/module.ts deleted file mode 100644 index 27781a5d6..000000000 --- a/extensions/monitoring-extension/src/module.ts +++ /dev/null @@ -1,92 +0,0 @@ -const nodeOsUtils = require('node-os-utils') -const getJanDataFolderPath = require('@janhq/core/node').getJanDataFolderPath -const path = require('path') -const { readFileSync } = require('fs') -const exec = require('child_process').exec - -const NVIDIA_INFO_FILE = path.join( - getJanDataFolderPath(), - 'settings', - 'settings.json' -) - -const getResourcesInfo = () => - new Promise((resolve) => { - nodeOsUtils.mem.used().then((ramUsedInfo) => { - const totalMemory = ramUsedInfo.totalMemMb * 1024 * 1024 - const usedMemory = ramUsedInfo.usedMemMb * 1024 * 1024 - const response = { - mem: { - totalMemory, - usedMemory, - }, - } - resolve(response) - }) - }) - -const getCurrentLoad = () => - new Promise((resolve, reject) => { - nodeOsUtils.cpu.usage().then((cpuPercentage) => { - let data = { - run_mode: 'cpu', - gpus_in_use: [], - } - if (process.platform !== 'darwin') { - data = JSON.parse(readFileSync(NVIDIA_INFO_FILE, 'utf-8')) - } - if (data.run_mode === 'gpu' && data.gpus_in_use.length > 0) { - const gpuIds = data['gpus_in_use'].join(',') - if (gpuIds !== '' && data['vulkan'] !== true) { - exec( - `nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.total,memory.free,utilization.memory --format=csv,noheader,nounits --id=${gpuIds}`, - (error, stdout, _) => { - if (error) { - console.error(`exec error: ${error}`) - reject(error) - return - } - const gpuInfo = stdout - .trim() - .split('\n') - .map((line) => { - const [ - id, - name, - temperature, - utilization, - memoryTotal, - memoryFree, - memoryUtilization, - ] = line.split(', ').map((item) => item.replace(/\r/g, '')) - return { - id, - name, - temperature, - utilization, - memoryTotal, - memoryFree, - memoryUtilization, - } - }) - resolve({ - cpu: { usage: cpuPercentage }, - gpu: gpuInfo, - }) - } - ) - } else { - // Handle the case where gpuIds is empty - resolve({ cpu: { usage: cpuPercentage }, gpu: [] }) - } - } else { - // Handle the case where run_mode is not 'gpu' or no GPUs are in use - resolve({ cpu: { usage: cpuPercentage }, gpu: [] }) - } - }) - }) - -module.exports = { - getResourcesInfo, - getCurrentLoad, -} diff --git a/extensions/monitoring-extension/src/node/index.ts b/extensions/monitoring-extension/src/node/index.ts new file mode 100644 index 000000000..1d65704de --- /dev/null +++ b/extensions/monitoring-extension/src/node/index.ts @@ -0,0 +1,317 @@ +import { GpuSetting, GpuSettingInfo, ResourceInfo } from '@janhq/core' +import { getJanDataFolderPath, log } from '@janhq/core/node' +import { mem, cpu } from 'node-os-utils' +import { exec } from 'child_process' +import { writeFileSync, existsSync, readFileSync } from 'fs' +import path from 'path' + +/** + * Path to the settings file + **/ +export const GPU_INFO_FILE = path.join( + getJanDataFolderPath(), + 'settings', + 'settings.json' +) + +/** + * Default GPU settings + * TODO: This needs to be refactored to support multiple accelerators + **/ +const DEFAULT_SETTINGS: GpuSetting = { + notify: true, + run_mode: 'cpu', + nvidia_driver: { + exist: false, + version: '', + }, + cuda: { + exist: false, + version: '', + }, + gpus: [], + gpu_highest_vram: '', + gpus_in_use: [], + is_initial: true, + // TODO: This needs to be set based on user toggle in settings + vulkan: false, +} + +export const getGpuConfig = async (): Promise => { + if (process.platform === 'darwin') return undefined + return JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) +} + +export const getResourcesInfo = async (): Promise => { + const ramUsedInfo = await mem.used() + const totalMemory = ramUsedInfo.totalMemMb * 1024 * 1024 + const usedMemory = ramUsedInfo.usedMemMb * 1024 * 1024 + + const resourceInfo: ResourceInfo = { + mem: { + totalMemory, + usedMemory, + }, + } + + return resourceInfo +} + +export const getCurrentLoad = () => + new Promise(async (resolve, reject) => { + const cpuPercentage = await cpu.usage() + let data = { + run_mode: 'cpu', + gpus_in_use: [], + } + + if (process.platform !== 'darwin') { + data = JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) + } + + if (data.run_mode === 'gpu' && data.gpus_in_use.length > 0) { + const gpuIds = data.gpus_in_use.join(',') + if (gpuIds !== '' && data['vulkan'] !== true) { + exec( + `nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.total,memory.free,utilization.memory --format=csv,noheader,nounits --id=${gpuIds}`, + (error, stdout, _) => { + if (error) { + console.error(`exec error: ${error}`) + throw new Error(error.message) + } + const gpuInfo: GpuInfo[] = stdout + .trim() + .split('\n') + .map((line) => { + const [ + id, + name, + temperature, + utilization, + memoryTotal, + memoryFree, + memoryUtilization, + ] = line.split(', ').map((item) => item.replace(/\r/g, '')) + return { + id, + name, + temperature, + utilization, + memoryTotal, + memoryFree, + memoryUtilization, + } + }) + + resolve({ + cpu: { usage: cpuPercentage }, + gpu: gpuInfo, + }) + } + ) + } else { + // Handle the case where gpuIds is empty + resolve({ + cpu: { usage: cpuPercentage }, + gpu: [], + }) + } + } else { + // Handle the case where run_mode is not 'gpu' or no GPUs are in use + resolve({ + cpu: { usage: cpuPercentage }, + gpu: [], + }) + } + }) + +/** + * This will retrive GPU informations and persist settings.json + * Will be called when the extension is loaded to turn on GPU acceleration if supported + */ +export const updateNvidiaInfo = async () => { + // ignore if macos + if (process.platform === 'darwin') return + + try { + JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) + } catch (error) { + writeFileSync(GPU_INFO_FILE, JSON.stringify(DEFAULT_SETTINGS, null, 2)) + } + + await updateNvidiaDriverInfo() + await updateGpuInfo() +} + +const updateNvidiaDriverInfo = async () => + new Promise((resolve, reject) => { + exec( + 'nvidia-smi --query-gpu=driver_version --format=csv,noheader', + (error, stdout) => { + const data: GpuSetting = JSON.parse( + readFileSync(GPU_INFO_FILE, 'utf-8') + ) + + if (!error) { + const firstLine = stdout.split('\n')[0].trim() + data.nvidia_driver.exist = true + data.nvidia_driver.version = firstLine + } else { + data.nvidia_driver.exist = false + } + + writeFileSync(GPU_INFO_FILE, JSON.stringify(data, null, 2)) + resolve({}) + } + ) + }) + +const getGpuArch = (gpuName: string): string => { + if (!gpuName.toLowerCase().includes('nvidia')) return 'unknown' + + if (gpuName.includes('20')) return 'turing' + else if (gpuName.includes('30')) return 'ampere' + else if (gpuName.includes('40')) return 'ada' + else return 'unknown' +} + +const updateGpuInfo = async () => + new Promise((resolve, reject) => { + let data: GpuSetting = JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) + + // Cuda + if (data.vulkan === true) { + // Vulkan + exec( + process.platform === 'win32' + ? `${__dirname}\\..\\bin\\vulkaninfoSDK.exe --summary` + : `${__dirname}/../bin/vulkaninfo --summary`, + (error, stdout) => { + if (!error) { + const output = stdout.toString() + + log(output) + const gpuRegex = /GPU(\d+):(?:[\s\S]*?)deviceName\s*=\s*(.*)/g + + const gpus: GpuSettingInfo[] = [] + let match + while ((match = gpuRegex.exec(output)) !== null) { + const id = match[1] + const name = match[2] + const arch = getGpuArch(name) + gpus.push({ id, vram: '0', name, arch }) + } + data.gpus = gpus + + if (!data.gpus_in_use || data.gpus_in_use.length === 0) { + data.gpus_in_use = [data.gpus.length > 1 ? '1' : '0'] + } + + data = updateCudaExistence(data) + writeFileSync(GPU_INFO_FILE, JSON.stringify(data, null, 2)) + resolve({}) + } else { + reject(error) + } + } + ) + } else { + exec( + 'nvidia-smi --query-gpu=index,memory.total,name --format=csv,noheader,nounits', + (error, stdout) => { + if (!error) { + log(stdout) + // Get GPU info and gpu has higher memory first + let highestVram = 0 + let highestVramId = '0' + const gpus: GpuSettingInfo[] = stdout + .trim() + .split('\n') + .map((line) => { + let [id, vram, name] = line.split(', ') + const arch = getGpuArch(name) + vram = vram.replace(/\r/g, '') + if (parseFloat(vram) > highestVram) { + highestVram = parseFloat(vram) + highestVramId = id + } + return { id, vram, name, arch } + }) + + data.gpus = gpus + data.gpu_highest_vram = highestVramId + } else { + data.gpus = [] + data.gpu_highest_vram = '' + } + + if (!data.gpus_in_use || data.gpus_in_use.length === 0) { + data.gpus_in_use = [data.gpu_highest_vram] + } + + data = updateCudaExistence(data) + writeFileSync(GPU_INFO_FILE, JSON.stringify(data, null, 2)) + resolve({}) + } + ) + } + }) + +/** + * Check if file exists in paths + */ +const checkFileExistenceInPaths = (file: string, paths: string[]): boolean => { + return paths.some((p) => existsSync(path.join(p, file))) +} + +/** + * Validate cuda for linux and windows + */ +const updateCudaExistence = ( + data: GpuSetting = DEFAULT_SETTINGS +): GpuSetting => { + let filesCuda12: string[] + let filesCuda11: string[] + let paths: string[] + let cudaVersion: string = '' + + if (process.platform === 'win32') { + filesCuda12 = ['cublas64_12.dll', 'cudart64_12.dll', 'cublasLt64_12.dll'] + filesCuda11 = ['cublas64_11.dll', 'cudart64_11.dll', 'cublasLt64_11.dll'] + paths = process.env.PATH ? process.env.PATH.split(path.delimiter) : [] + } else { + filesCuda12 = ['libcudart.so.12', 'libcublas.so.12', 'libcublasLt.so.12'] + filesCuda11 = ['libcudart.so.11.0', 'libcublas.so.11', 'libcublasLt.so.11'] + paths = process.env.LD_LIBRARY_PATH + ? process.env.LD_LIBRARY_PATH.split(path.delimiter) + : [] + paths.push('/usr/lib/x86_64-linux-gnu/') + } + + let cudaExists = filesCuda12.every( + (file) => existsSync(file) || checkFileExistenceInPaths(file, paths) + ) + + if (!cudaExists) { + cudaExists = filesCuda11.every( + (file) => existsSync(file) || checkFileExistenceInPaths(file, paths) + ) + if (cudaExists) { + cudaVersion = '11' + } + } else { + cudaVersion = '12' + } + + data.cuda.exist = cudaExists + data.cuda.version = cudaVersion + + console.debug(data.is_initial, data.gpus_in_use) + + if (cudaExists && data.is_initial && data.gpus_in_use.length > 0) { + data.run_mode = 'gpu' + } + + data.is_initial = false + return data +} diff --git a/extensions/monitoring-extension/webpack.config.js b/extensions/monitoring-extension/webpack.config.js deleted file mode 100644 index c8c3a34f7..000000000 --- a/extensions/monitoring-extension/webpack.config.js +++ /dev/null @@ -1,35 +0,0 @@ -const path = require('path') -const webpack = require('webpack') -const packageJson = require('./package.json') - -module.exports = { - experiments: { outputModule: true }, - entry: './src/index.ts', // Adjust the entry point to match your project's main file - mode: 'production', - module: { - rules: [ - { - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/, - }, - ], - }, - output: { - filename: 'index.js', // Adjust the output file name as needed - path: path.resolve(__dirname, 'dist'), - library: { type: 'module' }, // Specify ESM output format - }, - plugins: [ - new webpack.DefinePlugin({ - MODULE: JSON.stringify(`${packageJson.name}/${packageJson.module}`), - }), - ], - resolve: { - extensions: ['.ts', '.js'], - }, - optimization: { - minimize: false, - }, - // Add loaders and other configuration as needed for your project -} diff --git a/extensions/tensorrt-llm-extension/README.md b/extensions/tensorrt-llm-extension/README.md new file mode 100644 index 000000000..34a670516 --- /dev/null +++ b/extensions/tensorrt-llm-extension/README.md @@ -0,0 +1,79 @@ +# Tensorrt-LLM Extension + +Created using Jan extension example + +# Create a Jan Extension using Typescript + +Use this template to bootstrap the creation of a TypeScript Jan extension. 🚀 + +## Create Your Own Extension + +To create your own extension, you can use this repository as a template! Just follow the below instructions: + +1. Click the Use this template button at the top of the repository +2. Select Create a new repository +3. Select an owner and name for your new repository +4. Click Create repository +5. Clone your new repository + +## Initial Setup + +After you've cloned the repository to your local machine or codespace, you'll need to perform some initial setup steps before you can develop your extension. + +> [!NOTE] +> +> You'll need to have a reasonably modern version of +> [Node.js](https://nodejs.org) handy. If you are using a version manager like +> [`nodenv`](https://github.com/nodenv/nodenv) or +> [`nvm`](https://github.com/nvm-sh/nvm), you can run `nodenv install` in the +> root of your repository to install the version specified in +> [`package.json`](./package.json). Otherwise, 20.x or later should work! + +1. :hammer_and_wrench: Install the dependencies + + ```bash + npm install + ``` + +1. :building_construction: Package the TypeScript for distribution + + ```bash + npm run bundle + ``` + +1. :white_check_mark: Check your artifact + + There will be a tgz file in your extension directory now + +## Update the Extension Metadata + +The [`package.json`](package.json) file defines metadata about your extension, such as +extension name, main entry, description and version. + +When you copy this repository, update `package.json` with the name, description for your extension. + +## Update the Extension Code + +The [`src/`](./src/) directory is the heart of your extension! This contains the +source code that will be run when your extension functions are invoked. You can replace the +contents of this directory with your own code. + +There are a few things to keep in mind when writing your extension code: + +- Most Jan Extension functions are processed asynchronously. + In `index.ts`, you will see that the extension function will return a `Promise`. + + ```typescript + import { events, MessageEvent, MessageRequest } from '@janhq/core' + + function onStart(): Promise { + return events.on(MessageEvent.OnMessageSent, (data: MessageRequest) => + this.inference(data) + ) + } + ``` + + For more information about the Jan Extension Core module, see the + [documentation](https://github.com/janhq/jan/blob/main/core/README.md). + +So, what are you waiting for? Go ahead and start customizing your extension! diff --git a/extensions/tensorrt-llm-extension/models.json b/extensions/tensorrt-llm-extension/models.json new file mode 100644 index 000000000..bc6a78256 --- /dev/null +++ b/extensions/tensorrt-llm-extension/models.json @@ -0,0 +1,49 @@ +[ + { + "sources": [ + { + "filename": "config.json", + "url": "https://delta.jan.ai/dist/models///LlamaCorn-1.1B-Chat-fp16/config.json" + }, + { + "filename": "rank0.engine", + "url": "https://delta.jan.ai/dist/models///LlamaCorn-1.1B-Chat-fp16/rank0.engine" + }, + { + "filename": "tokenizer.model", + "url": "https://delta.jan.ai/dist/models///LlamaCorn-1.1B-Chat-fp16/tokenizer.model" + }, + { + "filename": "special_tokens_map.json", + "url": "https://delta.jan.ai/dist/models///LlamaCorn-1.1B-Chat-fp16/special_tokens_map.json" + }, + { + "filename": "tokenizer.json", + "url": "https://delta.jan.ai/dist/models///LlamaCorn-1.1B-Chat-fp16/tokenizer.json" + }, + { + "filename": "tokenizer_config.json", + "url": "https://delta.jan.ai/dist/models///LlamaCorn-1.1B-Chat-fp16/tokenizer_config.json" + } + ], + "id": "llamacorn-1.1b-chat-fp16", + "object": "model", + "name": "LlamaCorn 1.1B Chat FP16", + "version": "1.0", + "description": "LlamaCorn is a refined version of TinyLlama-1.1B, optimized for conversational quality, running on consumer devices through TensorRT-LLM", + "format": "TensorRT-LLM", + "settings": { + "ctx_len": 2048 + }, + "parameters": { + "stream": true, + "max_tokens": 4096 + }, + "metadata": { + "author": "LLama", + "tags": ["TensorRT-LLM", "1B", "Finetuned"], + "size": 2151000000 + }, + "engine": "nitro-tensorrt-llm" + } +] diff --git a/extensions/tensorrt-llm-extension/package.json b/extensions/tensorrt-llm-extension/package.json new file mode 100644 index 000000000..01ff3e2c6 --- /dev/null +++ b/extensions/tensorrt-llm-extension/package.json @@ -0,0 +1,75 @@ +{ + "name": "@janhq/tensorrt-llm-extension", + "version": "0.0.2", + "description": "Enables accelerated inference leveraging Nvidia's TensorRT-LLM for optimal GPU hardware optimizations. Compatible with models in TensorRT-LLM format. Requires Nvidia GPU driver and CUDA Toolkit installation.", + "main": "dist/index.js", + "node": "dist/node/index.cjs.js", + "author": "Jan ", + "license": "AGPL-3.0", + "config": { + "host": "127.0.0.1", + "port": "3928" + }, + "compatibility": { + "platform": [ + "win32", + "linux" + ], + "app": [ + "0.1.0" + ] + }, + "scripts": { + "build": "tsc --module commonjs && rollup -c rollup.config.ts", + "build:publish:win32": "rimraf *.tgz --glob && npm run build && cpx \"bin/**\" \"dist/bin\" && npm pack && cpx *.tgz ../../pre-install", + "build:publish:linux": "rimraf *.tgz --glob && npm run build && cpx \"bin/**\" \"dist/bin\" && npm pack && cpx *.tgz ../../pre-install", + "build:publish:darwin": "rimraf *.tgz --glob && npm run build && cpx \"bin/**\" \"dist/bin\" && npm pack && cpx *.tgz ../../pre-install", + "build:publish": "run-script-os" + }, + "exports": { + ".": "./dist/index.js", + "./main": "./dist/node/index.cjs.js" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.5", + "@types/node": "^20.11.4", + "@types/os-utils": "^0.0.4", + "@types/tcp-port-used": "^1.0.4", + "@types/decompress": "4.2.7", + "cpx": "^1.5.0", + "download-cli": "^1.1.1", + "rimraf": "^3.0.2", + "rollup": "^2.38.5", + "rollup-plugin-define": "^1.0.1", + "rollup-plugin-sourcemaps": "^0.6.3", + "rollup-plugin-typescript2": "^0.36.0", + "run-script-os": "^1.1.6", + "typescript": "^5.2.2" + }, + "dependencies": { + "@janhq/core": "file:../../core", + "decompress": "^4.2.1", + "fetch-retry": "^5.0.6", + "path-browserify": "^1.0.1", + "rxjs": "^7.8.1", + "tcp-port-used": "^1.0.2", + "ulid": "^2.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "files": [ + "dist/*", + "package.json", + "README.md" + ], + "bundleDependencies": [ + "tcp-port-used", + "fetch-retry", + "decompress", + "@janhq/core" + ] +} diff --git a/extensions/tensorrt-llm-extension/rollup.config.ts b/extensions/tensorrt-llm-extension/rollup.config.ts new file mode 100644 index 000000000..33e45823b --- /dev/null +++ b/extensions/tensorrt-llm-extension/rollup.config.ts @@ -0,0 +1,73 @@ +import resolve from '@rollup/plugin-node-resolve' +import commonjs from '@rollup/plugin-commonjs' +import sourceMaps from 'rollup-plugin-sourcemaps' +import typescript from 'rollup-plugin-typescript2' +import json from '@rollup/plugin-json' +import replace from '@rollup/plugin-replace' +const packageJson = require('./package.json') + +export default [ + { + input: `src/index.ts`, + output: [{ file: packageJson.main, format: 'es', sourcemap: true }], + watch: { + include: 'src/**', + }, + plugins: [ + replace({ + EXTENSION_NAME: JSON.stringify(packageJson.name), + TENSORRT_VERSION: JSON.stringify('0.1.5'), + DOWNLOAD_RUNNER_URL: + process.platform === 'darwin' || process.platform === 'win32' + ? JSON.stringify( + 'https://github.com/janhq/nitro-tensorrt-llm/releases/download/windows-v/nitro-windows-v-amd64-tensorrt-llm-.tar.gz' + ) + : JSON.stringify( + 'https://github.com/janhq/nitro-tensorrt-llm/releases/download/linux-v/nitro-linux-v-amd64-tensorrt-llm-.tar.gz' + ), + NODE: JSON.stringify(`${packageJson.name}/${packageJson.node}`), + INFERENCE_URL: JSON.stringify( + process.env.INFERENCE_URL || + `${packageJson.config?.protocol ?? 'http'}://${packageJson.config?.host}:${packageJson.config?.port}/v1/chat/completions` + ), + COMPATIBILITY: JSON.stringify(packageJson.compatibility), + }), + json(), + typescript({ useTsconfigDeclarationDir: true }), + commonjs(), + resolve({ + extensions: ['.js', '.ts', '.svelte'], + }), + sourceMaps(), + ], + }, + { + input: `src/node/index.ts`, + output: [ + { file: 'dist/node/index.cjs.js', format: 'cjs', sourcemap: true }, + ], + external: ['@janhq/core/node'], + watch: { + include: 'src/node/**', + }, + plugins: [ + replace({ + LOAD_MODEL_URL: JSON.stringify( + `${packageJson.config?.protocol ?? 'http'}://${packageJson.config?.host}:${packageJson.config?.port}/inferences/tensorrtllm/loadmodel` + ), + TERMINATE_ENGINE_URL: JSON.stringify( + `${packageJson.config?.protocol ?? 'http'}://${packageJson.config?.host}:${packageJson.config?.port}/inferences/processmanager/destroy` + ), + ENGINE_HOST: JSON.stringify(packageJson.config?.host ?? '127.0.0.1'), + ENGINE_PORT: JSON.stringify(packageJson.config?.port ?? '3928'), + }), + json(), + typescript({ useTsconfigDeclarationDir: true }), + commonjs(), + resolve({ + extensions: ['.ts', '.js', '.json'], + }), + sourceMaps(), + ], + }, +] diff --git a/extensions/tensorrt-llm-extension/src/@types/global.d.ts b/extensions/tensorrt-llm-extension/src/@types/global.d.ts new file mode 100644 index 000000000..905e86380 --- /dev/null +++ b/extensions/tensorrt-llm-extension/src/@types/global.d.ts @@ -0,0 +1,10 @@ +declare const NODE: string +declare const INFERENCE_URL: string +declare const LOAD_MODEL_URL: string +declare const TERMINATE_ENGINE_URL: string +declare const ENGINE_HOST: string +declare const ENGINE_PORT: string +declare const DOWNLOAD_RUNNER_URL: string +declare const TENSORRT_VERSION: string +declare const COMPATIBILITY: object +declare const EXTENSION_NAME: string diff --git a/extensions/tensorrt-llm-extension/src/index.ts b/extensions/tensorrt-llm-extension/src/index.ts new file mode 100644 index 000000000..076951c3f --- /dev/null +++ b/extensions/tensorrt-llm-extension/src/index.ts @@ -0,0 +1,147 @@ +/** + * @module tensorrt-llm-extension/src/index + */ + +import { + Compatibility, + DownloadEvent, + DownloadRequest, + DownloadState, + GpuSetting, + InstallationState, + Model, + baseName, + downloadFile, + events, + executeOnMain, + joinPath, + showToast, + systemInformations, + LocalOAIEngine, + fs, +} from '@janhq/core' +import models from '../models.json' + +/** + * TensorRTLLMExtension - Implementation of LocalOAIEngine + * @extends BaseOAILocalInferenceProvider + * Provide pre-populated models for TensorRTLLM + */ +export default class TensorRTLLMExtension extends LocalOAIEngine { + /** + * Override custom function name for loading and unloading model + * Which are implemented from node module + */ + override provider = 'nitro-tensorrt-llm' + override inferenceUrl = INFERENCE_URL + override nodeModule = NODE + + private supportedGpuArch = ['turing', 'ampere', 'ada'] + + compatibility() { + return COMPATIBILITY as unknown as Compatibility + } + /** + * models implemented by the extension + * define pre-populated models + */ + async models(): Promise { + if ((await this.installationState()) === 'Installed') + return models as unknown as Model[] + return [] + } + + override async install(): Promise { + const info = await systemInformations() + console.debug( + `TensorRTLLMExtension installing pre-requisites... ${JSON.stringify(info)}` + ) + const gpuSetting: GpuSetting | undefined = info.gpuSetting + if (gpuSetting === undefined || gpuSetting.gpus.length === 0) { + console.error('No GPU setting found. Please check your GPU setting.') + return + } + + // TODO: we only check for the first graphics card. Need to refactor this later. + const firstGpu = gpuSetting.gpus[0] + if (!firstGpu.name.toLowerCase().includes('nvidia')) { + console.error('No Nvidia GPU found. Please check your GPU setting.') + return + } + + if (firstGpu.arch === undefined) { + console.error('No GPU architecture found. Please check your GPU setting.') + return + } + + if (!this.supportedGpuArch.includes(firstGpu.arch)) { + console.error( + `Your GPU: ${firstGpu} is not supported. Only 20xx, 30xx, 40xx series are supported.` + ) + return + } + + const binaryFolderPath = await executeOnMain( + this.nodeModule, + 'binaryFolder' + ) + if (!(await fs.existsSync(binaryFolderPath))) { + await fs.mkdirSync(binaryFolderPath) + } + + const placeholderUrl = DOWNLOAD_RUNNER_URL + const tensorrtVersion = TENSORRT_VERSION + + const url = placeholderUrl + .replace(//g, tensorrtVersion) + .replace(//g, firstGpu.arch) + + const tarball = await baseName(url) + + const tarballFullPath = await joinPath([binaryFolderPath, tarball]) + const downloadRequest: DownloadRequest = { + url, + localPath: tarballFullPath, + extensionId: EXTENSION_NAME, + downloadType: 'extension', + } + downloadFile(downloadRequest) + + // TODO: wrap this into a Promise + const onFileDownloadSuccess = async (state: DownloadState) => { + // if other download, ignore + if (state.fileName !== tarball) return + events.off(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) + await executeOnMain(this.nodeModule, 'decompressRunner', tarballFullPath) + events.emit(DownloadEvent.onFileUnzipSuccess, state) + + // Prepopulate models as soon as it's ready + this.prePopulateModels().then(() => { + showToast( + 'Extension installed successfully.', + 'New models are added to Model Hub.' + ) + }) + } + events.on(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) + } + + override async installationState(): Promise { + // For now, we just check the executable of nitro x tensor rt + const isNitroExecutableAvailable = await executeOnMain( + this.nodeModule, + 'isNitroExecutableAvailable' + ) + + return isNitroExecutableAvailable ? 'Installed' : 'NotInstalled' + } + + override onInferenceStopped() { + if (!this.isRunning) return + showToast( + 'Unable to Stop Inference', + 'The model does not support stopping inference.' + ) + return Promise.resolve() + } +} diff --git a/extensions/tensorrt-llm-extension/src/node/index.ts b/extensions/tensorrt-llm-extension/src/node/index.ts new file mode 100644 index 000000000..252468fc1 --- /dev/null +++ b/extensions/tensorrt-llm-extension/src/node/index.ts @@ -0,0 +1,191 @@ +import path from 'path' +import { ChildProcessWithoutNullStreams, spawn } from 'child_process' +import tcpPortUsed from 'tcp-port-used' +import fetchRT from 'fetch-retry' +import { log } from '@janhq/core/node' +import { existsSync } from 'fs' +import decompress from 'decompress' + +// Polyfill fetch with retry +const fetchRetry = fetchRT(fetch) + +/** + * The response object for model init operation. + */ +interface ModelLoadParams { + engine_path: string + ctx_len: number +} + +// The subprocess instance for Engine +let subprocess: ChildProcessWithoutNullStreams | undefined = undefined + +/** + * Initializes a engine subprocess to load a machine learning model. + * @param params - The model load settings. + */ +async function loadModel(params: any): Promise<{ error: Error | undefined }> { + // modelFolder is the absolute path to the running model folder + // e.g. ~/jan/models/llama-2 + let modelFolder = params.modelFolder + + const settings: ModelLoadParams = { + engine_path: modelFolder, + ctx_len: params.model.settings.ctx_len ?? 2048, + } + return runEngineAndLoadModel(settings) +} + +/** + * Stops a Engine subprocess. + */ +function unloadModel(): Promise { + const controller = new AbortController() + setTimeout(() => controller.abort(), 5000) + debugLog(`Request to kill engine`) + + subprocess?.kill() + return fetch(TERMINATE_ENGINE_URL, { + method: 'DELETE', + signal: controller.signal, + }) + .then(() => { + subprocess = undefined + }) + .catch(() => {}) // Do nothing with this attempt + .then(() => tcpPortUsed.waitUntilFree(parseInt(ENGINE_PORT), 300, 5000)) // Wait for port available + .then(() => debugLog(`Engine process is terminated`)) + .catch((err) => { + debugLog( + `Could not kill running process on port ${ENGINE_PORT}. Might be another process running on the same port? ${err}` + ) + throw 'PORT_NOT_AVAILABLE' + }) +} +/** + * 1. Spawn engine process + * 2. Load model into engine subprocess + * @returns + */ +async function runEngineAndLoadModel(settings: ModelLoadParams) { + return unloadModel() + .then(runEngine) + .then(() => loadModelRequest(settings)) + .catch((err) => { + // TODO: Broadcast error so app could display proper error message + debugLog(`${err}`, 'Error') + return { error: err } + }) +} + +/** + * Loads a LLM model into the Engine subprocess by sending a HTTP POST request. + */ +function loadModelRequest( + settings: ModelLoadParams +): Promise<{ error: Error | undefined }> { + debugLog(`Loading model with params ${JSON.stringify(settings)}`) + return fetchRetry(LOAD_MODEL_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(settings), + retries: 3, + retryDelay: 500, + }) + .then((res) => { + debugLog(`Load model success with response ${JSON.stringify(res)}`) + return Promise.resolve({ error: undefined }) + }) + .catch((err) => { + debugLog(`Load model failed with error ${err}`, 'Error') + return Promise.resolve({ error: err }) + }) +} + +/** + * Spawns engine subprocess. + */ +function runEngine(): Promise { + debugLog(`Spawning engine subprocess...`) + + return new Promise((resolve, reject) => { + // Current directory by default + let binaryFolder = path.join(__dirname, '..', 'bin') + // Binary path + const binary = path.join( + binaryFolder, + process.platform === 'win32' ? 'nitro.exe' : 'nitro' + ) + + const args: string[] = ['1', ENGINE_HOST, ENGINE_PORT] + // Execute the binary + debugLog(`Spawn nitro at path: ${binary}, and args: ${args}`) + subprocess = spawn(binary, args, { + cwd: binaryFolder, + env: { + ...process.env, + }, + }) + + // Handle subprocess output + subprocess.stdout.on('data', (data: any) => { + debugLog(`${data}`) + }) + + subprocess.stderr.on('data', (data: any) => { + debugLog(`${data}`) + }) + + subprocess.on('close', (code: any) => { + debugLog(`Engine exited with code: ${code}`) + subprocess = undefined + reject(`child process exited with code ${code}`) + }) + + tcpPortUsed.waitUntilUsed(parseInt(ENGINE_PORT), 300, 30000).then(() => { + debugLog(`Engine is ready`) + resolve() + }) + }) +} + +function debugLog(message: string, level: string = 'Debug') { + log(`[TENSORRT_LLM_NITRO]::${level}:${message}`) +} + +const binaryFolder = async (): Promise => { + return path.join(__dirname, '..', 'bin') +} + +const decompressRunner = async (zipPath: string) => { + const output = path.join(__dirname, '..', 'bin') + console.debug(`Decompressing ${zipPath} to ${output}...`) + try { + const files = await decompress(zipPath, output) + console.debug('Decompress finished!', files) + } catch (err) { + console.error(`Decompress ${zipPath} failed: ${err}`) + } +} + +const isNitroExecutableAvailable = async (): Promise => { + const binary = path.join( + __dirname, + '..', + 'bin', + process.platform === 'win32' ? 'nitro.exe' : 'nitro' + ) + + return existsSync(binary) +} + +export default { + binaryFolder, + decompressRunner, + loadModel, + unloadModel, + dispose: unloadModel, + isNitroExecutableAvailable, +} diff --git a/extensions/tensorrt-llm-extension/tsconfig.json b/extensions/tensorrt-llm-extension/tsconfig.json new file mode 100644 index 000000000..478a05728 --- /dev/null +++ b/extensions/tensorrt-llm-extension/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "target": "es5", + "module": "ES2020", + "lib": ["es2015", "es2016", "es2017", "dom"], + "strict": true, + "sourceMap": true, + "declaration": true, + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "declarationDir": "dist/types", + "outDir": "dist", + "importHelpers": true, + "resolveJsonModule": true, + "typeRoots": ["node_modules/@types"] + }, + "include": ["src"] +} diff --git a/web/containers/DropdownListSidebar/index.tsx b/web/containers/DropdownListSidebar/index.tsx index c05d26e51..ef7532063 100644 --- a/web/containers/DropdownListSidebar/index.tsx +++ b/web/containers/DropdownListSidebar/index.tsx @@ -73,8 +73,9 @@ const DropdownListSidebar = ({ const [copyId, setCopyId] = useState('') + // TODO: Update filter condition for the local model const localModel = downloadedModels.filter( - (model) => model.engine === InferenceEngine.nitro + (model) => model.engine !== InferenceEngine.openai ) const remoteModel = downloadedModels.filter( (model) => model.engine === InferenceEngine.openai diff --git a/web/containers/Layout/BottomBar/InstallingExtension/InstallingExtensionModal.tsx b/web/containers/Layout/BottomBar/InstallingExtension/InstallingExtensionModal.tsx new file mode 100644 index 000000000..d46764e88 --- /dev/null +++ b/web/containers/Layout/BottomBar/InstallingExtension/InstallingExtensionModal.tsx @@ -0,0 +1,87 @@ +import { useCallback, useEffect } from 'react' + +import { abortDownload } from '@janhq/core' +import { + Button, + Modal, + ModalContent, + ModalHeader, + ModalTitle, + Progress, +} from '@janhq/uikit' +import { atom, useAtom, useAtomValue } from 'jotai' + +import { + formatDownloadPercentage, + formatExtensionsName, +} from '@/utils/converter' + +import { + InstallingExtensionState, + installingExtensionAtom, +} from '@/helpers/atoms/Extension.atom' + +export const showInstallingExtensionModalAtom = atom(false) + +const InstallingExtensionModal: React.FC = () => { + const [showInstallingExtensionModal, setShowInstallingExtensionModal] = + useAtom(showInstallingExtensionModalAtom) + const installingExtensions = useAtomValue(installingExtensionAtom) + + useEffect(() => { + if (installingExtensions.length === 0) { + setShowInstallingExtensionModal(false) + } + }, [installingExtensions, setShowInstallingExtensionModal]) + + const onAbortInstallingExtensionClick = useCallback( + (item: InstallingExtensionState) => { + if (item.localPath) { + abortDownload(item.localPath) + } + }, + [] + ) + + return ( + setShowInstallingExtensionModal(false)} + > + + + Installing Extension + + {Object.values(installingExtensions).map((item) => ( +
    + +
    +
    +

    + {formatExtensionsName(item.extensionId)} +

    + {formatDownloadPercentage(item.percentage)} +
    + +
    +
    + ))} +
    +
    + ) +} + +export default InstallingExtensionModal diff --git a/web/containers/Layout/BottomBar/InstallingExtension/index.tsx b/web/containers/Layout/BottomBar/InstallingExtension/index.tsx new file mode 100644 index 000000000..05e803881 --- /dev/null +++ b/web/containers/Layout/BottomBar/InstallingExtension/index.tsx @@ -0,0 +1,52 @@ +import { Fragment, useCallback } from 'react' + +import { Progress } from '@janhq/uikit' +import { useAtomValue, useSetAtom } from 'jotai' + +import { showInstallingExtensionModalAtom } from './InstallingExtensionModal' + +import { installingExtensionAtom } from '@/helpers/atoms/Extension.atom' + +const InstallingExtension: React.FC = () => { + const installingExtensions = useAtomValue(installingExtensionAtom) + const setShowInstallingExtensionModal = useSetAtom( + showInstallingExtensionModalAtom + ) + const shouldShowInstalling = installingExtensions.length > 0 + + let totalPercentage = 0 + let totalExtensions = 0 + for (const installation of installingExtensions) { + totalPercentage += installation.percentage + totalExtensions++ + } + const progress = (totalPercentage / totalExtensions) * 100 + + const onClick = useCallback(() => { + setShowInstallingExtensionModal(true) + }, [setShowInstallingExtensionModal]) + + return ( + + {shouldShowInstalling ? ( +
    +

    + Installing Extension +

    + +
    + + + {progress.toFixed(2)}% + +
    +
    + ) : null} +
    + ) +} + +export default InstallingExtension diff --git a/web/containers/Layout/BottomBar/index.tsx b/web/containers/Layout/BottomBar/index.tsx index 2373ac3d4..3683d23db 100644 --- a/web/containers/Layout/BottomBar/index.tsx +++ b/web/containers/Layout/BottomBar/index.tsx @@ -16,6 +16,7 @@ import ProgressBar from '@/containers/ProgressBar' import { appDownloadProgress } from '@/containers/Providers/Jotai' import ImportingModelState from './ImportingModelState' +import InstallingExtension from './InstallingExtension' import SystemMonitor from './SystemMonitor' import UpdatedFailedModal from './UpdateFailedModal' @@ -46,6 +47,7 @@ const BottomBar = () => { +
    diff --git a/web/containers/Layout/index.tsx b/web/containers/Layout/index.tsx index 7e3ad38ab..fb08bc6ac 100644 --- a/web/containers/Layout/index.tsx +++ b/web/containers/Layout/index.tsx @@ -22,6 +22,8 @@ import ImportModelOptionModal from '@/screens/Settings/ImportModelOptionModal' import ImportingModelModal from '@/screens/Settings/ImportingModelModal' import SelectingModelModal from '@/screens/Settings/SelectingModelModal' +import InstallingExtensionModal from './BottomBar/InstallingExtension/InstallingExtensionModal' + import { mainViewStateAtom } from '@/helpers/atoms/App.atom' const BaseLayout = (props: PropsWithChildren) => { @@ -68,6 +70,7 @@ const BaseLayout = (props: PropsWithChildren) => { {importModelStage === 'IMPORTING_MODEL' && } {importModelStage === 'EDIT_MODEL_INFO' && } {importModelStage === 'CONFIRM_CANCEL' && } +
    ) } diff --git a/web/containers/Providers/EventListener.tsx b/web/containers/Providers/EventListener.tsx index bfc87917b..20fc6dde2 100644 --- a/web/containers/Providers/EventListener.tsx +++ b/web/containers/Providers/EventListener.tsx @@ -7,6 +7,10 @@ import { useSetAtom } from 'jotai' import { setDownloadStateAtom } from '@/hooks/useDownloadState' +import { formatExtensionsName } from '@/utils/converter' + +import { toaster } from '../Toast' + import AppUpdateListener from './AppUpdateListener' import ClipboardListener from './ClipboardListener' import EventHandler from './EventHandler' @@ -14,46 +18,89 @@ import EventHandler from './EventHandler' import ModelImportListener from './ModelImportListener' import QuickAskListener from './QuickAskListener' +import { + InstallingExtensionState, + removeInstallingExtensionAtom, + setInstallingExtensionAtom, +} from '@/helpers/atoms/Extension.atom' + const EventListenerWrapper = ({ children }: PropsWithChildren) => { const setDownloadState = useSetAtom(setDownloadStateAtom) + const setInstallingExtension = useSetAtom(setInstallingExtensionAtom) + const removeInstallingExtension = useSetAtom(removeInstallingExtensionAtom) const onFileDownloadUpdate = useCallback( async (state: DownloadState) => { console.debug('onFileDownloadUpdate', state) - setDownloadState(state) + if (state.downloadType === 'extension') { + const installingExtensionState: InstallingExtensionState = { + extensionId: state.extensionId!, + percentage: state.percent, + localPath: state.localPath, + } + setInstallingExtension(state.extensionId!, installingExtensionState) + } else { + setDownloadState(state) + } }, - [setDownloadState] + [setDownloadState, setInstallingExtension] ) const onFileDownloadError = useCallback( (state: DownloadState) => { console.debug('onFileDownloadError', state) - setDownloadState(state) + if (state.downloadType === 'extension') { + removeInstallingExtension(state.extensionId!) + } else { + setDownloadState(state) + } }, - [setDownloadState] + [setDownloadState, removeInstallingExtension] ) const onFileDownloadSuccess = useCallback( (state: DownloadState) => { console.debug('onFileDownloadSuccess', state) - setDownloadState(state) + if (state.downloadType !== 'extension') { + setDownloadState(state) + } }, [setDownloadState] ) + const onFileUnzipSuccess = useCallback( + (state: DownloadState) => { + console.debug('onFileUnzipSuccess', state) + toaster({ + title: 'Success', + description: `Install ${formatExtensionsName(state.extensionId!)} successfully.`, + type: 'success', + }) + removeInstallingExtension(state.extensionId!) + }, + [removeInstallingExtension] + ) + useEffect(() => { console.debug('EventListenerWrapper: registering event listeners...') events.on(DownloadEvent.onFileDownloadUpdate, onFileDownloadUpdate) events.on(DownloadEvent.onFileDownloadError, onFileDownloadError) events.on(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) + events.on(DownloadEvent.onFileUnzipSuccess, onFileUnzipSuccess) return () => { console.debug('EventListenerWrapper: unregistering event listeners...') events.off(DownloadEvent.onFileDownloadUpdate, onFileDownloadUpdate) events.off(DownloadEvent.onFileDownloadError, onFileDownloadError) events.off(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) + events.off(DownloadEvent.onFileUnzipSuccess, onFileUnzipSuccess) } - }, [onFileDownloadUpdate, onFileDownloadError, onFileDownloadSuccess]) + }, [ + onFileDownloadUpdate, + onFileDownloadError, + onFileDownloadSuccess, + onFileUnzipSuccess, + ]) return ( diff --git a/web/extension/ExtensionManager.ts b/web/extension/ExtensionManager.ts index 1259021f7..c976010c6 100644 --- a/web/extension/ExtensionManager.ts +++ b/web/extension/ExtensionManager.ts @@ -23,7 +23,9 @@ export class ExtensionManager { * @param type - The type of the extension to retrieve. * @returns The extension, if found. */ - get(type: ExtensionTypeEnum): T | undefined { + get( + type: ExtensionTypeEnum | string + ): T | undefined { return this.extensions.get(type) as T | undefined } diff --git a/web/helpers/atoms/Extension.atom.ts b/web/helpers/atoms/Extension.atom.ts new file mode 100644 index 000000000..7af755e35 --- /dev/null +++ b/web/helpers/atoms/Extension.atom.ts @@ -0,0 +1,40 @@ +import { atom } from 'jotai' + +type ExtensionId = string + +export type InstallingExtensionState = { + extensionId: ExtensionId + percentage: number + localPath?: string +} + +export const installingExtensionAtom = atom([]) + +export const setInstallingExtensionAtom = atom( + null, + (get, set, extensionId: string, state: InstallingExtensionState) => { + const current = get(installingExtensionAtom) + + const isExists = current.some((e) => e.extensionId === extensionId) + if (isExists) { + const newCurrent = current.map((e) => { + if (e.extensionId === extensionId) { + return state + } + return e + }) + set(installingExtensionAtom, newCurrent) + } else { + set(installingExtensionAtom, [...current, state]) + } + } +) + +export const removeInstallingExtensionAtom = atom( + null, + (get, set, extensionId: string) => { + const current = get(installingExtensionAtom) + const newCurrent = current.filter((e) => e.extensionId !== extensionId) + set(installingExtensionAtom, newCurrent) + } +) diff --git a/web/hooks/useActiveModel.ts b/web/hooks/useActiveModel.ts index 600e10783..e6c519f9f 100644 --- a/web/hooks/useActiveModel.ts +++ b/web/hooks/useActiveModel.ts @@ -40,6 +40,16 @@ export function useActiveModel() { console.debug(`Model ${modelId} is already initialized. Ignore..`) return } + + let model = downloadedModelsRef?.current.find((e) => e.id === modelId) + + // Switch between engines + if (model && activeModel && activeModel.engine !== model.engine) { + stopModel() + // TODO: Refactor inference provider would address this + await new Promise((res) => setTimeout(res, 1000)) + } + // TODO: incase we have multiple assistants, the configuration will be from assistant setLoadModelError(undefined) @@ -47,8 +57,6 @@ export function useActiveModel() { setStateModel({ state: 'start', loading: true, model: modelId }) - let model = downloadedModelsRef?.current.find((e) => e.id === modelId) - if (!model) { toaster({ title: `Model ${modelId} not found!`, diff --git a/web/hooks/useDownloadModel.ts b/web/hooks/useDownloadModel.ts index 9f6334c71..d0d13d93b 100644 --- a/web/hooks/useDownloadModel.ts +++ b/web/hooks/useDownloadModel.ts @@ -8,12 +8,15 @@ import { joinPath, ModelArtifact, DownloadState, + GpuSetting, } from '@janhq/core' import { useAtomValue, useSetAtom } from 'jotai' import { setDownloadStateAtom } from './useDownloadState' +import useGpuSetting from './useGpuSetting' + import { extensionManager } from '@/extension/ExtensionManager' import { ignoreSslAtom, @@ -29,6 +32,8 @@ export default function useDownloadModel() { const setDownloadState = useSetAtom(setDownloadStateAtom) const addDownloadingModel = useSetAtom(addDownloadingModelAtom) + const { getGpuSettings } = useGpuSetting() + const downloadModel = useCallback( async (model: Model) => { const childProgresses: DownloadState[] = model.sources.map( @@ -68,10 +73,22 @@ export default function useDownloadModel() { }) addDownloadingModel(model) - - await localDownloadModel(model, ignoreSSL, proxyEnabled ? proxy : '') + const gpuSettings = await getGpuSettings() + await localDownloadModel( + model, + ignoreSSL, + proxyEnabled ? proxy : '', + gpuSettings + ) }, - [ignoreSSL, proxy, proxyEnabled, addDownloadingModel, setDownloadState] + [ + ignoreSSL, + proxy, + proxyEnabled, + getGpuSettings, + addDownloadingModel, + setDownloadState, + ] ) const abortModelDownload = useCallback(async (model: Model) => { @@ -90,8 +107,9 @@ export default function useDownloadModel() { const localDownloadModel = async ( model: Model, ignoreSSL: boolean, - proxy: string + proxy: string, + gpuSettings?: GpuSetting ) => extensionManager .get(ExtensionTypeEnum.Model) - ?.downloadModel(model, { ignoreSSL, proxy }) + ?.downloadModel(model, gpuSettings, { ignoreSSL, proxy }) diff --git a/web/hooks/useDownloadState.ts b/web/hooks/useDownloadState.ts index 06de9bef6..03a8883cb 100644 --- a/web/hooks/useDownloadState.ts +++ b/web/hooks/useDownloadState.ts @@ -18,123 +18,129 @@ export const modelDownloadStateAtom = atom>({}) export const setDownloadStateAtom = atom( null, (get, set, state: DownloadState) => { - const currentState = { ...get(modelDownloadStateAtom) } + try { + const currentState = { ...get(modelDownloadStateAtom) } - if (state.downloadState === 'end') { - const modelDownloadState = currentState[state.modelId] + if (state.downloadState === 'end') { + const modelDownloadState = currentState[state.modelId] - const updatedChildren: DownloadState[] = - modelDownloadState.children!.filter( - (m) => m.fileName !== state.fileName + const updatedChildren: DownloadState[] = ( + modelDownloadState.children ?? [] + ).filter((m) => m.fileName !== state.fileName) + updatedChildren.push(state) + modelDownloadState.children = updatedChildren + currentState[state.modelId] = modelDownloadState + + const isAllChildrenDownloadEnd = modelDownloadState.children?.every( + (m) => m.downloadState === 'end' ) - updatedChildren.push(state) - modelDownloadState.children = updatedChildren - currentState[state.modelId] = modelDownloadState - const isAllChildrenDownloadEnd = modelDownloadState.children?.every( - (m) => m.downloadState === 'end' - ) + if (isAllChildrenDownloadEnd) { + // download successfully + delete currentState[state.modelId] + set(removeDownloadingModelAtom, state.modelId) - if (isAllChildrenDownloadEnd) { - // download successfully + const model = get(configuredModelsAtom).find( + (e) => e.id === state.modelId + ) + if (model) set(downloadedModelsAtom, (prev) => [...prev, model]) + toaster({ + title: 'Download Completed', + description: `Download ${state.modelId} completed`, + type: 'success', + }) + } + } else if (state.downloadState === 'error') { + // download error delete currentState[state.modelId] set(removeDownloadingModelAtom, state.modelId) - - const model = get(configuredModelsAtom).find( - (e) => e.id === state.modelId - ) - if (model) set(downloadedModelsAtom, (prev) => [...prev, model]) - toaster({ - title: 'Download Completed', - description: `Download ${state.modelId} completed`, - type: 'success', - }) - } - } else if (state.downloadState === 'error') { - // download error - delete currentState[state.modelId] - set(removeDownloadingModelAtom, state.modelId) - if (state.error === 'aborted') { - toaster({ - title: 'Cancel Download', - description: `Model ${state.modelId} download cancelled`, - type: 'warning', - }) - } else { - let error = state.error - if ( - typeof error?.includes === 'function' && - state.error?.includes('certificate') - ) { - error += - '. To fix enable "Ignore SSL Certificates" in Advanced settings.' + if (state.error === 'aborted') { + toaster({ + title: 'Cancel Download', + description: `Model ${state.modelId} download cancelled`, + type: 'warning', + }) + } else { + let error = state.error + if ( + typeof error?.includes === 'function' && + state.error?.includes('certificate') + ) { + error += + '. To fix enable "Ignore SSL Certificates" in Advanced settings.' + } + toaster({ + title: 'Download Failed', + description: `Model ${state.modelId} download failed: ${error}`, + type: 'error', + }) + } + } else { + // download in progress + if (state.size.total === 0) { + // this is initial state, just set the state + currentState[state.modelId] = state + set(modelDownloadStateAtom, currentState) + return } - toaster({ - title: 'Download Failed', - description: `Model ${state.modelId} download failed: ${error}`, - type: 'error', - }) - } - } else { - // download in progress - if (state.size.total === 0) { - // this is initial state, just set the state - currentState[state.modelId] = state - set(modelDownloadStateAtom, currentState) - return - } - const modelDownloadState = currentState[state.modelId] - if (!modelDownloadState) { - console.debug('setDownloadStateAtom: modelDownloadState not found') - return - } + const modelDownloadState = currentState[state.modelId] + if (!modelDownloadState) { + console.debug('setDownloadStateAtom: modelDownloadState not found') + return + } - // delete the children if the filename is matched and replace the new state - const updatedChildren: DownloadState[] = - modelDownloadState.children!.filter( - (m) => m.fileName !== state.fileName + // delete the children if the filename is matched and replace the new state + const updatedChildren: DownloadState[] = ( + modelDownloadState.children ?? [] + ).filter((m) => m.fileName !== state.fileName) + + updatedChildren.push(state) + + // re-calculate the overall progress if we have all the children download data + const isAnyChildDownloadNotReady = updatedChildren.some( + (m) => + m.size.total === 0 && + !modelDownloadState.children?.some( + (e) => e.fileName === m.fileName && e.downloadState === 'end' + ) && + modelDownloadState.children?.some((e) => e.fileName === m.fileName) ) - updatedChildren.push(state) + modelDownloadState.children = updatedChildren + if (isAnyChildDownloadNotReady) { + // just update the children + currentState[state.modelId] = modelDownloadState + set(modelDownloadStateAtom, currentState) + return + } - // re-calculate the overall progress if we have all the children download data - const isAnyChildDownloadNotReady = updatedChildren.some( - (m) => m.size.total === 0 - ) + const parentTotalSize = modelDownloadState.size.total + if (parentTotalSize === 0) { + // calculate the total size of the parent by sum all children total size + const totalSize = updatedChildren.reduce( + (acc, m) => acc + m.size.total, + 0 + ) - modelDownloadState.children = updatedChildren + modelDownloadState.size.total = totalSize + } - if (isAnyChildDownloadNotReady) { - // just update the children - currentState[state.modelId] = modelDownloadState - set(modelDownloadStateAtom, currentState) - - return - } - - const parentTotalSize = modelDownloadState.size.total - if (parentTotalSize === 0) { - // calculate the total size of the parent by sum all children total size - const totalSize = updatedChildren.reduce( - (acc, m) => acc + m.size.total, + // calculate the total transferred size by sum all children transferred size + const transferredSize = updatedChildren.reduce( + (acc, m) => acc + m.size.transferred, 0 ) - - modelDownloadState.size.total = totalSize + modelDownloadState.size.transferred = transferredSize + modelDownloadState.percent = + parentTotalSize === 0 ? 0 : transferredSize / parentTotalSize + currentState[state.modelId] = modelDownloadState } - // calculate the total transferred size by sum all children transferred size - const transferredSize = updatedChildren.reduce( - (acc, m) => acc + m.size.transferred, - 0 - ) - modelDownloadState.size.transferred = transferredSize - modelDownloadState.percent = - parentTotalSize === 0 ? 0 : transferredSize / parentTotalSize - currentState[state.modelId] = modelDownloadState + set(modelDownloadStateAtom, currentState) + } catch (e) { + console.debug('setDownloadStateAtom: state', state) + console.debug('setDownloadStateAtom: error', e) } - - set(modelDownloadStateAtom, currentState) } ) diff --git a/web/hooks/useGpuSetting.ts b/web/hooks/useGpuSetting.ts new file mode 100644 index 000000000..36f51ed57 --- /dev/null +++ b/web/hooks/useGpuSetting.ts @@ -0,0 +1,21 @@ +import { useCallback } from 'react' + +import { ExtensionTypeEnum, MonitoringExtension } from '@janhq/core' + +import { extensionManager } from '@/extension' + +export default function useGpuSetting() { + const getGpuSettings = useCallback(async () => { + const gpuSetting = await extensionManager + ?.get(ExtensionTypeEnum.SystemMonitoring) + ?.getGpuSetting() + + if (!gpuSetting) { + console.debug('No GPU setting found') + return undefined + } + return gpuSetting + }, []) + + return { getGpuSettings } +} diff --git a/web/next.config.js b/web/next.config.js index a4b3e6d43..48ea0703e 100644 --- a/web/next.config.js +++ b/web/next.config.js @@ -38,6 +38,7 @@ const nextConfig = { isMac: process.platform === 'darwin', isWindows: process.platform === 'win32', isLinux: process.platform === 'linux', + PLATFORM: JSON.stringify(process.platform), }), ] return config diff --git a/web/screens/ExploreModels/ExploreModelItem/index.tsx b/web/screens/ExploreModels/ExploreModelItem/index.tsx index 9cdfbc01a..e8887e70f 100644 --- a/web/screens/ExploreModels/ExploreModelItem/index.tsx +++ b/web/screens/ExploreModels/ExploreModelItem/index.tsx @@ -3,6 +3,8 @@ import { useState } from 'react' import { Model } from '@janhq/core' import { Badge } from '@janhq/uikit' +import { twMerge } from 'tailwind-merge' + import ExploreModelItemHeader from '@/screens/ExploreModels/ExploreModelItemHeader' type Props = { @@ -75,7 +77,16 @@ const ExploreModelItem: React.FC = ({ model }) => { Format -

    {model.format}

    +

    + {model.format} +

    diff --git a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx index 38e7f65a6..581a628ba 100644 --- a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx +++ b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx @@ -152,6 +152,7 @@ const ExploreModelItemHeader: React.FC = ({ model, onClick, open }) => {
    {model.name} +
    @@ -172,4 +173,21 @@ const ExploreModelItemHeader: React.FC = ({ model, onClick, open }) => { ) } +type EngineBadgeProps = { + engine: string +} + +const EngineBadge: React.FC = ({ engine }) => { + switch (engine) { + case 'nitro-tensorrt-llm': + return ( +
    + TensorRT-LLM +
    + ) + default: + return null + } +} + export default ExploreModelItemHeader diff --git a/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx new file mode 100644 index 000000000..e4c8ae04f --- /dev/null +++ b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx @@ -0,0 +1,225 @@ +import { useCallback, useEffect, useState } from 'react' + +import { + Compatibility, + GpuSetting, + InstallationState, + abortDownload, + systemInformations, +} from '@janhq/core' +import { + Button, + Progress, + Tooltip, + TooltipArrow, + TooltipContent, + TooltipPortal, + TooltipTrigger, +} from '@janhq/uikit' + +import { InfoCircledIcon } from '@radix-ui/react-icons' +import { useAtomValue } from 'jotai' + +import { extensionManager } from '@/extension' +import Extension from '@/extension/Extension' +import { installingExtensionAtom } from '@/helpers/atoms/Extension.atom' + +type Props = { + item: Extension +} + +const TensorRtExtensionItem: React.FC = ({ item }) => { + const [compatibility, setCompatibility] = useState( + undefined + ) + const [installState, setInstallState] = + useState('NotRequired') + const installingExtensions = useAtomValue(installingExtensionAtom) + const [isGpuSupported, setIsGpuSupported] = useState(false) + + const isInstalling = installingExtensions.some( + (e) => e.extensionId === item.name + ) + + const progress = isInstalling + ? installingExtensions.find((e) => e.extensionId === item.name) + ?.percentage ?? -1 + : -1 + + useEffect(() => { + const getSystemInfos = async () => { + const info = await systemInformations() + if (!info) { + setIsGpuSupported(false) + return + } + + const gpuSettings: GpuSetting | undefined = info.gpuSetting + if (!gpuSettings || gpuSettings.gpus.length === 0) { + setIsGpuSupported(false) + return + } + + const arch = gpuSettings.gpus[0].arch + if (!arch) { + setIsGpuSupported(false) + return + } + + const supportedGpuArch = ['turing', 'ampere', 'ada'] + setIsGpuSupported(supportedGpuArch.includes(arch)) + } + getSystemInfos() + }, []) + + useEffect(() => { + const getExtensionInstallationState = async () => { + const extension = extensionManager.get(item.name ?? '') + if (!extension) return + + if (typeof extension?.installationState === 'function') { + const installState = await extension.installationState() + setInstallState(installState) + } + } + + getExtensionInstallationState() + }, [item.name, isInstalling]) + + useEffect(() => { + const extension = extensionManager.get(item.name ?? '') + if (!extension) return + setCompatibility(extension.compatibility()) + }, [setCompatibility, item.name]) + + const onInstallClick = useCallback(async () => { + const extension = extensionManager.get(item.name ?? '') + if (!extension) return + + await extension.install() + }, [item.name]) + + const onCancelInstallingClick = () => { + const extension = installingExtensions.find( + (e) => e.extensionId === item.name + ) + if (extension?.localPath) { + abortDownload(extension.localPath) + } + } + + return ( +
    +
    +
    +
    + TensorRT-LLM Extension +
    +

    + v{item.version} +

    +
    +

    + {item.description} +

    +
    + {(!compatibility || compatibility['platform']?.includes(PLATFORM)) && + isGpuSupported ? ( +
    + +
    + ) : ( +
    +
    + Incompatible{' '} + + + + + + + {compatibility ? ( + + Only available on{' '} + {compatibility?.platform + ?.map((e: string) => + e === 'win32' + ? 'Windows' + : e === 'linux' + ? 'Linux' + : 'MacOS' + ) + .join(', ')} + + ) : ( + + Your GPUs are not compatible with this extension + + )} + + + + +
    +
    + )} +
    + ) +} + +type InstallStateProps = { + installProgress: number + installState: InstallationState + onInstallClick: () => void + onCancelClick: () => void +} + +const InstallStateIndicator: React.FC = ({ + installProgress, + installState, + onInstallClick, + onCancelClick, +}) => { + // TODO: NamH support dark mode for this + if (installProgress !== -1) { + const progress = installProgress * 100 + return ( +
    + +
    + + + {progress.toFixed(0)}% + +
    +
    + ) + } + + // TODO: NamH check for dark mode here + switch (installState) { + case 'Installed': + return ( +
    + Installed +
    + ) + case 'NotInstalled': + return ( + + ) + default: + return
    + } +} + +export default TensorRtExtensionItem diff --git a/web/screens/Settings/CoreExtensions/index.tsx b/web/screens/Settings/CoreExtensions/index.tsx index 8c9f92d7a..f5b66abeb 100644 --- a/web/screens/Settings/CoreExtensions/index.tsx +++ b/web/screens/Settings/CoreExtensions/index.tsx @@ -4,13 +4,18 @@ import React, { useState, useEffect, useRef } from 'react' import { Button, ScrollArea } from '@janhq/uikit' +import Loader from '@/containers/Loader' + import { formatExtensionsName } from '@/utils/converter' +import TensorRtExtensionItem from './TensorRtExtensionItem' + import { extensionManager } from '@/extension' import Extension from '@/extension/Extension' const ExtensionCatalog = () => { const [activeExtensions, setActiveExtensions] = useState([]) + const [showLoading, setShowLoading] = useState(false) const fileInputRef = useRef(null) /** * Fetches the active extensions and their preferences from the `extensions` and `preferences` modules. @@ -63,65 +68,76 @@ const ExtensionCatalog = () => { const handleFileChange = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (file) { + setShowLoading(true) install(event) } } return ( - -
    - {activeExtensions.map((item, i) => { - return ( -
    -
    -
    -
    - {formatExtensionsName(item.name ?? item.description ?? '')} -
    -

    - v{item.version} + <> + +

    + {activeExtensions.map((item, i) => { + // TODO: this is bad code, rewrite it + if (item.name === '@janhq/tensorrt-llm-extension') { + return + } + + return ( +
    +
    +
    +
    + {formatExtensionsName( + item.name ?? item.description ?? '' + )} +
    +

    + v{item.version} +

    +
    +

    + {item.description}

    -

    - {item.description} -

    + ) + })} + {/* Manual Installation */} +
    +
    +
    +
    + Manual Installation +
    +
    +

    + Select a extension file to install (.tgz) +

    - ) - })} - {/* Manual Installation */} -
    -
    -
    -
    - Manual Installation -
    +
    + +
    -

    - Select a extension file to install (.tgz) -

    -
    -
    - -
    -
    - + + {showLoading && } + ) } diff --git a/web/services/appService.ts b/web/services/appService.ts new file mode 100644 index 000000000..9327d55c3 --- /dev/null +++ b/web/services/appService.ts @@ -0,0 +1,24 @@ +import { ExtensionTypeEnum, MonitoringExtension } from '@janhq/core' + +import { toaster } from '@/containers/Toast' + +import { extensionManager } from '@/extension' + +export const appService = { + systemInformations: async () => { + const gpuSetting = await extensionManager + ?.get(ExtensionTypeEnum.SystemMonitoring) + ?.getGpuSetting() + + return { + gpuSetting, + // TODO: Other system information + } + }, + showToast: (title: string, description: string) => { + toaster({ + title, + description: description, + }) + }, +} diff --git a/web/services/coreService.ts b/web/services/coreService.ts index c010c6cec..a483cc452 100644 --- a/web/services/coreService.ts +++ b/web/services/coreService.ts @@ -1,5 +1,7 @@ +import { appService } from './appService' import { EventEmitter } from './eventsService' import { restAPI } from './restService' + export const setupCoreServices = () => { if (typeof window === 'undefined') { console.debug('undefine', window) @@ -10,7 +12,10 @@ export const setupCoreServices = () => { if (!window.core) { window.core = { events: new EventEmitter(), - api: window.electronAPI ?? restAPI, + api: { + ...(window.electronAPI ? window.electronAPI : restAPI), + ...appService, + }, } } } diff --git a/web/types/index.d.ts b/web/types/index.d.ts index 833c3e2bd..ed83e0d14 100644 --- a/web/types/index.d.ts +++ b/web/types/index.d.ts @@ -11,6 +11,7 @@ declare global { declare const isMac: boolean declare const isWindows: boolean declare const isLinux: boolean + declare const PLATFORM: string interface Core { api: APIFunctions events: EventEmitter From 561b1dd94a07aec5289236410f75f6be2e055d14 Mon Sep 17 00:00:00 2001 From: Service Account Date: Thu, 14 Mar 2024 07:27:24 +0000 Subject: [PATCH 100/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bc206f4eb..b25a917d7 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 From 03a0978f5345e394522f21f1638d0d62f89d2796 Mon Sep 17 00:00:00 2001 From: NamH Date: Thu, 14 Mar 2024 15:58:42 +0700 Subject: [PATCH 101/131] fix: some costmetic issues: badges corner, recommended for tensorrt models(#2346) Signed-off-by: hiro Co-authored-by: hiro --- uikit/src/badge/styles.scss | 2 +- web/containers/DropdownListSidebar/index.tsx | 2 +- web/screens/ExploreModels/ExploreModelItemHeader/index.tsx | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/uikit/src/badge/styles.scss b/uikit/src/badge/styles.scss index b777892d7..4788f65be 100644 --- a/uikit/src/badge/styles.scss +++ b/uikit/src/badge/styles.scss @@ -1,5 +1,5 @@ .badge { - @apply focus:ring-ring border-border inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2; + @apply focus:ring-ring border-border inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2; &-primary { @apply border-transparent bg-blue-100 text-blue-600; diff --git a/web/containers/DropdownListSidebar/index.tsx b/web/containers/DropdownListSidebar/index.tsx index ef7532063..70651a4d4 100644 --- a/web/containers/DropdownListSidebar/index.tsx +++ b/web/containers/DropdownListSidebar/index.tsx @@ -294,7 +294,7 @@ const DropdownListSidebar = ({ {toGibibytes(x.metadata.size)} - {x.engine == InferenceEngine.nitro && ( + {x.metadata.size && ( )}
    diff --git a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx index 581a628ba..ef75f57f5 100644 --- a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx +++ b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx @@ -180,10 +180,11 @@ type EngineBadgeProps = { const EngineBadge: React.FC = ({ engine }) => { switch (engine) { case 'nitro-tensorrt-llm': + const title = 'TensorRT-LLM' return ( -
    - TensorRT-LLM -
    + + {title} + ) default: return null From d9c3852997eb42159701fefa5265f7ba3dd74ea3 Mon Sep 17 00:00:00 2001 From: NamH Date: Thu, 14 Mar 2024 17:16:14 +0700 Subject: [PATCH 102/131] fix: ts error when declar var in case (#2348) Signed-off-by: James Co-authored-by: James --- web/screens/ExploreModels/ExploreModelItemHeader/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx index ef75f57f5..465e69fa6 100644 --- a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx +++ b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx @@ -178,9 +178,10 @@ type EngineBadgeProps = { } const EngineBadge: React.FC = ({ engine }) => { + const title = 'TensorRT-LLM' + switch (engine) { case 'nitro-tensorrt-llm': - const title = 'TensorRT-LLM' return ( {title} From 8120ad2a038e0b88333e5044db96b43dd73d4c4e Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Thu, 14 Mar 2024 18:37:54 +0700 Subject: [PATCH 103/131] fix: badge or progress tensorRtExtensionItem (#2349) --- .../Settings/CoreExtensions/TensorRtExtensionItem.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx index e4c8ae04f..b363f79be 100644 --- a/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx +++ b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx @@ -123,6 +123,7 @@ const TensorRtExtensionItem: React.FC = ({ item }) => { {item.description}

    + {(!compatibility || compatibility['platform']?.includes(PLATFORM)) && isGpuSupported ? (
    @@ -185,15 +186,14 @@ const InstallStateIndicator: React.FC = ({ onInstallClick, onCancelClick, }) => { - // TODO: NamH support dark mode for this if (installProgress !== -1) { const progress = installProgress * 100 return ( -
    +
    -
    +
    {progress.toFixed(0)}% From aab8ee84afd02f6e3da3ead0d9d5c27bcd1fe50f Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 14 Mar 2024 19:04:31 +0700 Subject: [PATCH 104/131] fix: disable rag & stream settings from tensorrt model.json (#2351) --- extensions/tensorrt-llm-extension/models.json | 4 ++-- extensions/tensorrt-llm-extension/src/index.ts | 7 +++++++ web/screens/Chat/ChatInput/index.tsx | 7 ++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/extensions/tensorrt-llm-extension/models.json b/extensions/tensorrt-llm-extension/models.json index bc6a78256..31bb11a9e 100644 --- a/extensions/tensorrt-llm-extension/models.json +++ b/extensions/tensorrt-llm-extension/models.json @@ -33,10 +33,10 @@ "description": "LlamaCorn is a refined version of TinyLlama-1.1B, optimized for conversational quality, running on consumer devices through TensorRT-LLM", "format": "TensorRT-LLM", "settings": { - "ctx_len": 2048 + "ctx_len": 2048, + "text_model": false }, "parameters": { - "stream": true, "max_tokens": 4096 }, "metadata": { diff --git a/extensions/tensorrt-llm-extension/src/index.ts b/extensions/tensorrt-llm-extension/src/index.ts index 076951c3f..e3014b447 100644 --- a/extensions/tensorrt-llm-extension/src/index.ts +++ b/extensions/tensorrt-llm-extension/src/index.ts @@ -19,6 +19,7 @@ import { systemInformations, LocalOAIEngine, fs, + MessageRequest, } from '@janhq/core' import models from '../models.json' @@ -144,4 +145,10 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { ) return Promise.resolve() } + + inference(data: MessageRequest): void { + // TensorRT LLM Extension supports streaming only + if (data.model) data.model.parameters.stream = true + super.inference(data) + } } diff --git a/web/screens/Chat/ChatInput/index.tsx b/web/screens/Chat/ChatInput/index.tsx index c90a12cd2..8707e8bcd 100644 --- a/web/screens/Chat/ChatInput/index.tsx +++ b/web/screens/Chat/ChatInput/index.tsx @@ -244,16 +244,13 @@ const ChatInput: React.FC = () => {
  • { if ( - !activeThread?.assistants[0].model.settings - .vision_model || activeThread?.assistants[0].model.settings .text_model !== false ) { From 0415786e2063bbffa2c625be6ea261803b0c5dd7 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 14 Mar 2024 19:28:38 +0700 Subject: [PATCH 105/131] fix: app does not recognize GPU first launch (#2350) --- .../monitoring-extension/src/node/index.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/extensions/monitoring-extension/src/node/index.ts b/extensions/monitoring-extension/src/node/index.ts index 1d65704de..25f151112 100644 --- a/extensions/monitoring-extension/src/node/index.ts +++ b/extensions/monitoring-extension/src/node/index.ts @@ -2,17 +2,17 @@ import { GpuSetting, GpuSettingInfo, ResourceInfo } from '@janhq/core' import { getJanDataFolderPath, log } from '@janhq/core/node' import { mem, cpu } from 'node-os-utils' import { exec } from 'child_process' -import { writeFileSync, existsSync, readFileSync } from 'fs' +import { writeFileSync, existsSync, readFileSync, mkdirSync } from 'fs' import path from 'path' +/** + * Path to the settings directory + **/ +export const SETTINGS_DIR = path.join(getJanDataFolderPath(), 'settings') /** * Path to the settings file **/ -export const GPU_INFO_FILE = path.join( - getJanDataFolderPath(), - 'settings', - 'settings.json' -) +export const GPU_INFO_FILE = path.join(SETTINGS_DIR, 'settings.json') /** * Default GPU settings @@ -136,6 +136,11 @@ export const updateNvidiaInfo = async () => { try { JSON.parse(readFileSync(GPU_INFO_FILE, 'utf-8')) } catch (error) { + if (!existsSync(SETTINGS_DIR)) { + mkdirSync(SETTINGS_DIR, { + recursive: true, + }) + } writeFileSync(GPU_INFO_FILE, JSON.stringify(DEFAULT_SETTINGS, null, 2)) } From f878555598563e10ecda4498b08f5cad249a01e5 Mon Sep 17 00:00:00 2001 From: Nicole Zhu Date: Thu, 14 Mar 2024 20:30:37 +0800 Subject: [PATCH 106/131] docs: trt-llm extension guides --- docs/docs/guides/inference/README.mdx | 8 ++ docs/docs/guides/inference/image.png | Bin 0 -> 27275 bytes docs/docs/guides/inference/llama-cpp.md | 11 +++ docs/docs/guides/inference/tensorrt-llm.md | 83 +++++++++++++++++++++ docs/sidebars.js | 13 ++++ 5 files changed, 115 insertions(+) create mode 100644 docs/docs/guides/inference/README.mdx create mode 100644 docs/docs/guides/inference/image.png create mode 100644 docs/docs/guides/inference/llama-cpp.md create mode 100644 docs/docs/guides/inference/tensorrt-llm.md diff --git a/docs/docs/guides/inference/README.mdx b/docs/docs/guides/inference/README.mdx new file mode 100644 index 000000000..289fd8241 --- /dev/null +++ b/docs/docs/guides/inference/README.mdx @@ -0,0 +1,8 @@ +--- +title: Extensions +slug: /guides/inference/ +--- + +import DocCardList from "@theme/DocCardList"; + + diff --git a/docs/docs/guides/inference/image.png b/docs/docs/guides/inference/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5f1f7104eb85703538d73fff97bdeee0019e4d33 GIT binary patch literal 27275 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 Be Extensions +2. Click install next to the TensorRT-LLM Extension +3. Check that files are correctly downloaded + +```sh +ls ~\jan\extensions\@janhq\tensorrt-llm-extension\dist\bin +# Your Extension Folder should now include `nitro.exe`, among other artifacts needed to run TRT-LLM +``` + +## Download a Compatible Model +TensorRT-LLM can only run models in `TensorRT` format. These models, aka "TensorRT Engines", are prebuilt specifically for each target OS+GPU architecture. + +We offer a handful of precompiled models for Ampere and Ada cards that you can immediately download and play with: + +1. Restart the application and go to the Hub +2. Look for models with the `TensorRT-LLM` label in the recommended models list. Click download. This step might take some time. 🙏 + +![image](https://hackmd.io/_uploads/rJewrEgRp.png) + +3. Click use and start chatting! +4. You may need to allow Nitro in your network + +![alt text](image.png) + +:::info +Due to our limited resources, we only prebuilt a few demo models. You can always build your desired models directly on your machine. [Read here](##Build-your-own-TensorRT-models). +::: + +## Configure Settings + +You can customize the default parameters for how Jan runs TensorRT-LLM. + +:::info +coming soon +::: + +## Troubleshooting + +### Incompatible Extension vs Engine versions + +For now, the model versions are pinned to the extension versions. + +### Uninstall Extension + +1. Quit the app +2. Go to Settings > Extensions +3. Delete the entire Extensions folder. +4. Reopen the app, only the default extensions should be restored. + +### Install Nitro-TensorRT-LLM manually + +To manually build the artifacts needed to run the server and TensorRT-LLM, you can reference the source code. [Read here](https://github.com/janhq/nitro-tensorrt-llm?tab=readme-ov-file#quickstart). + +### Build your own TensorRT models + +:::info +coming soon +::: diff --git a/docs/sidebars.js b/docs/sidebars.js index 4c45cadbe..26cb09eb2 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -199,6 +199,19 @@ const sidebars = { "guides/models/integrate-remote", ] }, + { + type: "category", + label: "Inference Providers", + className: "head_SubMenu", + link: { + type: 'doc', + id: "guides/inference/README", + }, + items: [ + "guides/inference/llama-cpp", + "guides/inference/tensorrt-llm", + ] + }, { type: "category", label: "Extensions", From b4eff9a1083b0811bfba99b4283421377df6842f Mon Sep 17 00:00:00 2001 From: Nicole Zhu Date: Thu, 14 Mar 2024 20:55:03 +0800 Subject: [PATCH 107/131] docs: fix slugs --- docs/docs/guides/{inference => engines}/README.mdx | 2 +- docs/docs/guides/{inference => engines}/image.png | Bin .../docs/guides/{inference => engines}/llama-cpp.md | 1 + .../guides/{inference => engines}/tensorrt-llm.md | 3 ++- docs/sidebars.js | 8 ++++---- 5 files changed, 8 insertions(+), 6 deletions(-) rename docs/docs/guides/{inference => engines}/README.mdx (73%) rename docs/docs/guides/{inference => engines}/image.png (100%) rename docs/docs/guides/{inference => engines}/llama-cpp.md (89%) rename docs/docs/guides/{inference => engines}/tensorrt-llm.md (95%) diff --git a/docs/docs/guides/inference/README.mdx b/docs/docs/guides/engines/README.mdx similarity index 73% rename from docs/docs/guides/inference/README.mdx rename to docs/docs/guides/engines/README.mdx index 289fd8241..3a7cdcc44 100644 --- a/docs/docs/guides/inference/README.mdx +++ b/docs/docs/guides/engines/README.mdx @@ -1,6 +1,6 @@ --- title: Extensions -slug: /guides/inference/ +slug: /guides/engines --- import DocCardList from "@theme/DocCardList"; diff --git a/docs/docs/guides/inference/image.png b/docs/docs/guides/engines/image.png similarity index 100% rename from docs/docs/guides/inference/image.png rename to docs/docs/guides/engines/image.png diff --git a/docs/docs/guides/inference/llama-cpp.md b/docs/docs/guides/engines/llama-cpp.md similarity index 89% rename from docs/docs/guides/inference/llama-cpp.md rename to docs/docs/guides/engines/llama-cpp.md index 470424dbb..bc485df6c 100644 --- a/docs/docs/guides/inference/llama-cpp.md +++ b/docs/docs/guides/engines/llama-cpp.md @@ -1,5 +1,6 @@ --- title: Llama-CPP Extension +slug: /guides/engines/llama-cpp --- ## Overview diff --git a/docs/docs/guides/inference/tensorrt-llm.md b/docs/docs/guides/engines/tensorrt-llm.md similarity index 95% rename from docs/docs/guides/inference/tensorrt-llm.md rename to docs/docs/guides/engines/tensorrt-llm.md index d795d55e6..177cc0cf4 100644 --- a/docs/docs/guides/inference/tensorrt-llm.md +++ b/docs/docs/guides/engines/tensorrt-llm.md @@ -1,5 +1,6 @@ --- title: TensorRT-LLM Extension +slug: /guides/engines/tensorrt-llm --- Users with Nvidia GPUs can get 20-40% faster* token speeds on their laptop or desktops by using [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM). @@ -48,7 +49,7 @@ We offer a handful of precompiled models for Ampere and Ada cards that you can i ![alt text](image.png) :::info -Due to our limited resources, we only prebuilt a few demo models. You can always build your desired models directly on your machine. [Read here](##Build-your-own-TensorRT-models). +Due to our limited resources, we only prebuilt a few demo models. You can always build your desired models directly on your machine. [Read here](#build-your-own-tensorrt-models). ::: ## Configure Settings diff --git a/docs/sidebars.js b/docs/sidebars.js index 26cb09eb2..8deafeaa1 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -201,15 +201,15 @@ const sidebars = { }, { type: "category", - label: "Inference Providers", + label: "AI Engines", className: "head_SubMenu", link: { type: 'doc', - id: "guides/inference/README", + id: "guides/engines/README", }, items: [ - "guides/inference/llama-cpp", - "guides/inference/tensorrt-llm", + "guides/engines/llama-cpp", + "guides/engines/tensorrt-llm", ] }, { From ab73941d4256549b027c28dc0bfd1a27f1c7b1bf Mon Sep 17 00:00:00 2001 From: Service Account Date: Thu, 14 Mar 2024 12:55:07 +0000 Subject: [PATCH 108/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b25a917d7..6f6044b30 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 From 1fe3dff875de61b53420058200741d5eca7fab7b Mon Sep 17 00:00:00 2001 From: Nicole Zhu Date: Thu, 14 Mar 2024 21:08:50 +0800 Subject: [PATCH 109/131] docs: update slugs again --- docs/docs/guides/engines/llama-cpp.md | 12 ------------ docs/docs/guides/{engines => providers}/README.mdx | 4 ++-- docs/docs/guides/{engines => providers}/image.png | Bin docs/docs/guides/providers/llama-cpp.md | 10 ++++++++++ .../guides/{engines => providers}/tensorrt-llm.md | 4 ++-- docs/sidebars.js | 8 ++++---- 6 files changed, 18 insertions(+), 20 deletions(-) delete mode 100644 docs/docs/guides/engines/llama-cpp.md rename docs/docs/guides/{engines => providers}/README.mdx (54%) rename docs/docs/guides/{engines => providers}/image.png (100%) create mode 100644 docs/docs/guides/providers/llama-cpp.md rename docs/docs/guides/{engines => providers}/tensorrt-llm.md (95%) diff --git a/docs/docs/guides/engines/llama-cpp.md b/docs/docs/guides/engines/llama-cpp.md deleted file mode 100644 index bc485df6c..000000000 --- a/docs/docs/guides/engines/llama-cpp.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Llama-CPP Extension -slug: /guides/engines/llama-cpp ---- - -## Overview - -[LlamaCPP](https://github.com/ggerganov/llama.cpp) is the default AI engine downloaded with Jan. It is served through Nitro, a C++ inference server, that handles additional UX and hardware optimizations. - -The source code for Nitro-llama-cpp is [here](https://github.com/janhq/nitro). - -There is no additional setup needed. \ No newline at end of file diff --git a/docs/docs/guides/engines/README.mdx b/docs/docs/guides/providers/README.mdx similarity index 54% rename from docs/docs/guides/engines/README.mdx rename to docs/docs/guides/providers/README.mdx index 3a7cdcc44..aa3bfea1f 100644 --- a/docs/docs/guides/engines/README.mdx +++ b/docs/docs/guides/providers/README.mdx @@ -1,6 +1,6 @@ --- -title: Extensions -slug: /guides/engines +title: Inference Providers +slug: /guides/providers --- import DocCardList from "@theme/DocCardList"; diff --git a/docs/docs/guides/engines/image.png b/docs/docs/guides/providers/image.png similarity index 100% rename from docs/docs/guides/engines/image.png rename to docs/docs/guides/providers/image.png diff --git a/docs/docs/guides/providers/llama-cpp.md b/docs/docs/guides/providers/llama-cpp.md new file mode 100644 index 000000000..3a21e80a7 --- /dev/null +++ b/docs/docs/guides/providers/llama-cpp.md @@ -0,0 +1,10 @@ +--- +title: llama.cpp +slug: /guides/providers/llama-cpp +--- + +## Overview + +[Nitro](https://github.com/janhq/nitro) is an inference server on top of [llama.cpp](https://github.com/ggerganov/llama.cpp). OpenAI-compatible API, queue, & scaling. + +Nitro is the default AI engine downloaded with Jan. There is no additional setup needed. \ No newline at end of file diff --git a/docs/docs/guides/engines/tensorrt-llm.md b/docs/docs/guides/providers/tensorrt-llm.md similarity index 95% rename from docs/docs/guides/engines/tensorrt-llm.md rename to docs/docs/guides/providers/tensorrt-llm.md index 177cc0cf4..4b0edec2a 100644 --- a/docs/docs/guides/engines/tensorrt-llm.md +++ b/docs/docs/guides/providers/tensorrt-llm.md @@ -1,6 +1,6 @@ --- -title: TensorRT-LLM Extension -slug: /guides/engines/tensorrt-llm +title: TensorRT-LLM +slug: /guides/providers/tensorrt-llm --- Users with Nvidia GPUs can get 20-40% faster* token speeds on their laptop or desktops by using [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM). diff --git a/docs/sidebars.js b/docs/sidebars.js index 8deafeaa1..b95e4044f 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -201,15 +201,15 @@ const sidebars = { }, { type: "category", - label: "AI Engines", + label: "Inference Providers", className: "head_SubMenu", link: { type: 'doc', - id: "guides/engines/README", + id: "guides/providers/README", }, items: [ - "guides/engines/llama-cpp", - "guides/engines/tensorrt-llm", + "guides/providers/llama-cpp", + "guides/providers/tensorrt-llm", ] }, { From 70fc24f6f1857f19d0d837fe95086a373443f210 Mon Sep 17 00:00:00 2001 From: Nicole Zhu Date: Thu, 14 Mar 2024 21:12:16 +0800 Subject: [PATCH 110/131] docs: nits --- docs/docs/guides/providers/llama-cpp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/providers/llama-cpp.md b/docs/docs/guides/providers/llama-cpp.md index 3a21e80a7..d2b0daa2a 100644 --- a/docs/docs/guides/providers/llama-cpp.md +++ b/docs/docs/guides/providers/llama-cpp.md @@ -5,6 +5,6 @@ slug: /guides/providers/llama-cpp ## Overview -[Nitro](https://github.com/janhq/nitro) is an inference server on top of [llama.cpp](https://github.com/ggerganov/llama.cpp). OpenAI-compatible API, queue, & scaling. +[Nitro](https://github.com/janhq/nitro) is an inference server on top of [llama.cpp](https://github.com/ggerganov/llama.cpp). It provides an OpenAI-compatible API, queue, & scaling. Nitro is the default AI engine downloaded with Jan. There is no additional setup needed. \ No newline at end of file From 4b6f218639b5c3f5dc0f231ea88af386c0b1c9c0 Mon Sep 17 00:00:00 2001 From: Nicole Zhu Date: Thu, 14 Mar 2024 21:45:31 +0800 Subject: [PATCH 111/131] docs: nits --- docs/docs/guides/providers/tensorrt-llm.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/docs/guides/providers/tensorrt-llm.md b/docs/docs/guides/providers/tensorrt-llm.md index 4b0edec2a..52da83b36 100644 --- a/docs/docs/guides/providers/tensorrt-llm.md +++ b/docs/docs/guides/providers/tensorrt-llm.md @@ -3,14 +3,17 @@ title: TensorRT-LLM slug: /guides/providers/tensorrt-llm --- -Users with Nvidia GPUs can get 20-40% faster* token speeds on their laptop or desktops by using [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM). +Users with Nvidia GPUs can get **20-40% faster\* token speeds** on their laptop or desktops by using [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM). The greater implication is that you are running FP16, which is also more accurate than quantized models. This guide walks you through how to install Jan's official [TensorRT-LLM Extension](https://github.com/janhq/nitro-tensorrt-llm). This extension uses [Nitro-TensorRT-LLM](https://github.com/janhq/nitro-tensorrt-llm) as the AI engine, instead of the default [Nitro-Llama-CPP](https://github.com/janhq/nitro). It includes an efficient C++ server to natively execute the [TRT-LLM C++ runtime](https://nvidia.github.io/TensorRT-LLM/gpt_runtime.html). It also comes with additional feature and performance improvements like OpenAI compatibility, tokenizer improvements, and queues. *Compared to using LlamaCPP engine. -:::info +:::warning This feature is only available for Windows users. Linux is coming soon. + +Additionally, we only prebuilt a few demo models. You can always build your desired models directly on your machine. [Read here](#build-your-own-tensorrt-models). + ::: ## Requirements @@ -48,8 +51,8 @@ We offer a handful of precompiled models for Ampere and Ada cards that you can i ![alt text](image.png) -:::info -Due to our limited resources, we only prebuilt a few demo models. You can always build your desired models directly on your machine. [Read here](#build-your-own-tensorrt-models). +:::warning +If you are our nightly builds, you may have to reinstall the TensorRT-LLM extension each time you update the app. We're working on better extension lifecyles - stay tuned. ::: ## Configure Settings From 758afdbeb44589076201aabdbdcf618bca3a581d Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 14 Mar 2024 22:11:55 +0700 Subject: [PATCH 112/131] fix: incompatible GPU error message (#2357) * fix: incompatible GPU error message * fix: change port --- extensions/tensorrt-llm-extension/models.json | 47 +++++++++++++++++++ .../tensorrt-llm-extension/package.json | 4 +- .../tensorrt-llm-extension/src/index.ts | 15 ++++++ web/screens/Chat/ErrorMessage/index.tsx | 21 +++++++++ .../CoreExtensions/TensorRtExtensionItem.tsx | 3 +- 5 files changed, 87 insertions(+), 3 deletions(-) diff --git a/extensions/tensorrt-llm-extension/models.json b/extensions/tensorrt-llm-extension/models.json index 31bb11a9e..30f345f47 100644 --- a/extensions/tensorrt-llm-extension/models.json +++ b/extensions/tensorrt-llm-extension/models.json @@ -45,5 +45,52 @@ "size": 2151000000 }, "engine": "nitro-tensorrt-llm" + }, + { + "sources": [ + { + "filename": "config.json", + "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/config.json" + }, + { + "filename": "rank0.engine", + "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/rank0.engine" + }, + { + "filename": "tokenizer.model", + "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/tokenizer.model" + }, + { + "filename": "special_tokens_map.json", + "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/special_tokens_map.json" + }, + { + "filename": "tokenizer.json", + "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/tokenizer.json" + }, + { + "filename": "tokenizer_config.json", + "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/tokenizer_config.json" + } + ], + "id": "tinyjensen-1.1b-chat-fp16", + "object": "model", + "name": "TinyJensen 1.1B Chat FP16", + "version": "1.0", + "description": "Do you want to chat with Jensen Huan? Here you are", + "format": "TensorRT-LLM", + "settings": { + "ctx_len": 2048, + "text_model": false + }, + "parameters": { + "max_tokens": 4096 + }, + "metadata": { + "author": "LLama", + "tags": ["TensorRT-LLM", "1B", "Finetuned"], + "size": 2151000000 + }, + "engine": "nitro-tensorrt-llm" } ] diff --git a/extensions/tensorrt-llm-extension/package.json b/extensions/tensorrt-llm-extension/package.json index 01ff3e2c6..96ede4a56 100644 --- a/extensions/tensorrt-llm-extension/package.json +++ b/extensions/tensorrt-llm-extension/package.json @@ -1,6 +1,6 @@ { "name": "@janhq/tensorrt-llm-extension", - "version": "0.0.2", + "version": "0.0.3", "description": "Enables accelerated inference leveraging Nvidia's TensorRT-LLM for optimal GPU hardware optimizations. Compatible with models in TensorRT-LLM format. Requires Nvidia GPU driver and CUDA Toolkit installation.", "main": "dist/index.js", "node": "dist/node/index.cjs.js", @@ -8,7 +8,7 @@ "license": "AGPL-3.0", "config": { "host": "127.0.0.1", - "port": "3928" + "port": "3929" }, "compatibility": { "platform": [ diff --git a/extensions/tensorrt-llm-extension/src/index.ts b/extensions/tensorrt-llm-extension/src/index.ts index e3014b447..cd85601dd 100644 --- a/extensions/tensorrt-llm-extension/src/index.ts +++ b/extensions/tensorrt-llm-extension/src/index.ts @@ -20,6 +20,7 @@ import { LocalOAIEngine, fs, MessageRequest, + ModelEvent, } from '@janhq/core' import models from '../models.json' @@ -127,6 +128,20 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { events.on(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) } + async onModelInit(model: Model): Promise { + if ((await this.installationState()) === 'Installed') + return super.onModelInit(model) + else { + events.emit(ModelEvent.OnModelFail, { + ...model, + error: { + message: 'EXTENSION_IS_NOT_INSTALLED::TensorRT-LLM extension', + }, + }) + return + } + } + override async installationState(): Promise { // For now, we just check the executable of nitro x tensor rt const isNitroExecutableAvailable = await executeOnMain( diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx index 25cec1cb9..5be87a59d 100644 --- a/web/screens/Chat/ErrorMessage/index.tsx +++ b/web/screens/Chat/ErrorMessage/index.tsx @@ -7,11 +7,14 @@ import ModalTroubleShooting, { modalTroubleShootingAtom, } from '@/containers/ModalTroubleShoot' +import { MainViewState } from '@/constants/screens' + import { loadModelErrorAtom } from '@/hooks/useActiveModel' import useSendChatMessage from '@/hooks/useSendChatMessage' import { getErrorTitle } from '@/utils/errorMessage' +import { mainViewStateAtom } from '@/helpers/atoms/App.atom' import { getCurrentChatMessagesAtom } from '@/helpers/atoms/ChatMessage.atom' const ErrorMessage = ({ message }: { message: ThreadMessage }) => { @@ -19,6 +22,7 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { const { resendChatMessage } = useSendChatMessage() const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom) const loadModelError = useAtomValue(loadModelErrorAtom) + const setMainState = useSetAtom(mainViewStateAtom) const PORT_NOT_AVAILABLE = 'PORT_NOT_AVAILABLE' const regenerateMessage = async () => { @@ -70,6 +74,23 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => {

  • + ) : loadModelError?.includes('EXTENSION_IS_NOT_INSTALLED') ? ( +
    +

    + Model is currently unavailable. Please switch to a different + model or install the{' '} + {' '} + to continue using it. +

    +
    ) : (
    = ({ item }) => { - {compatibility ? ( + {compatibility && + !compatibility['platform']?.includes(PLATFORM) ? ( Only available on{' '} {compatibility?.platform From e40d0481b747bcfac8c34a95e65536e4a11809b0 Mon Sep 17 00:00:00 2001 From: Service Account Date: Thu, 14 Mar 2024 16:28:47 +0000 Subject: [PATCH 113/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6f6044b30..adebb8ea1 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 From 58e12f35c978cc7ce40839f277f4ae3cbf7bc234 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 14 Mar 2024 23:59:42 +0700 Subject: [PATCH 114/131] fix: wrong engine handling (#2363) --- extensions/tensorrt-llm-extension/src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/tensorrt-llm-extension/src/index.ts b/extensions/tensorrt-llm-extension/src/index.ts index cd85601dd..02c676841 100644 --- a/extensions/tensorrt-llm-extension/src/index.ts +++ b/extensions/tensorrt-llm-extension/src/index.ts @@ -129,6 +129,8 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { } async onModelInit(model: Model): Promise { + if (model.engine !== this.provider) return + if ((await this.installationState()) === 'Installed') return super.onModelInit(model) else { @@ -138,7 +140,6 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { message: 'EXTENSION_IS_NOT_INSTALLED::TensorRT-LLM extension', }, }) - return } } @@ -162,6 +163,7 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { } inference(data: MessageRequest): void { + if (!this.isRunning) return // TensorRT LLM Extension supports streaming only if (data.model) data.model.parameters.stream = true super.inference(data) From da9b9c60c7d070e0cdf4c271bea08a20306b65f3 Mon Sep 17 00:00:00 2001 From: eckartal <159995642+eckartal@users.noreply.github.com> Date: Thu, 14 Mar 2024 20:35:20 +0300 Subject: [PATCH 115/131] Update faq.md - Added new questions - Updated some answers --- docs/docs/faq.md | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 9e6f6bdf9..0ab0944cc 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -1,20 +1,40 @@ # Frequently Asked Questions (FAQ) -## How does Jan ensure my data remains private? +## What is Jan? -Jan prioritizes your privacy by running open-source AI models 100% offline on your computer, ensuring all conversations, documents, and files stay private. +Jan is software that helps you run large language models (LLMs) on your everyday tasks. For details, read the [About page](https://jan.ai/about/). -## Can I use Jan without an internet connection? +## How do I use Jan? -Yes, Jan can run locally without an internet connection for many features. +Download Jan to your computer, choose a compatible LLM, or connect to a remote AI with the API code to start. You can switch between them as needed. ## Is Jan compatible with my operating system? Jan is available for Mac, Windows, Linux, ensuring wide compatibility. +## Do you use my data? + +No. See our data and analytics policy [here](https://jan.ai/privacy/#:~:text=We%20do%20not%20share%20your,with%20a%20better%20user%20experience.). + +## Do you sell my data? + +No. We don't even track your data. Jan is yours. + +## How does Jan ensure my data remains private? + +Jan prioritizes your privacy by running open-source AI models 100% offline on your computer, ensuring all conversations, documents, and files stay private. + +## What does "Jan" stand for? + +Jan stands for “Just Another Neuron”, as we are passionate about building software that complements in your existing neural pathways. But in the spirit of full transparency, it was also just a nice 3 letter domain name we owned 😂. + +## Can I use Jan without an internet connection? + +Yes, Jan can run locally without an internet connection for many features. + ## Are there any costs associated with using Jan? -Jan is free to use. However, if you opt to connect to remote APIs, you will need to cover those services' costs according to their pricing, not Jan's. +Jan is free to use. However, if you want to connect to remote APIs, like GPT-4, you will need to put in your own API key. ## What types of AI models can I download or import with Jan? @@ -26,7 +46,7 @@ The API allows you to tailor Jan to your needs, but specific details on usage wo ## How can I contribute to Jan's development or suggest features? -Contributions can be made through GitHub and Discord, where you can also suggest features and contribute. +Contributions can be made through [GitHub](https://github.com/janhq/jan) and [Discord](https://discord.gg/Exe46xPMbK), where you can also suggest features and contribute. ## How can I get involved with the Jan community? @@ -35,3 +55,11 @@ Joining [Jan's Discord server](https://discord.gg/qSwXFx6Krr) is a great way to ## How do I troubleshoot issues with installing or using Jan? For troubleshooting, you should reach out on Discord and check GitHub for assistance and support from the community and the development team. + +## Can I self host? + +Yes! We love the self-hosted movement. Jan is available as a Helm chart / docker composes which can be run across home servers or even production level environments. + +## Are you hiring? + +We often hire directly from our community. If you are interested to apply, please see our careers page [here](https://janai.bamboohr.com/careers). From 9181ec1f387e73a3cd00cc5f7445a369f0844713 Mon Sep 17 00:00:00 2001 From: eckartal <159995642+eckartal@users.noreply.github.com> Date: Thu, 14 Mar 2024 20:46:16 +0300 Subject: [PATCH 116/131] Rename docs/docs/faq.md to docs/docs/about/faq.md Moved under /about --- docs/docs/{ => about}/faq.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/docs/{ => about}/faq.md (100%) diff --git a/docs/docs/faq.md b/docs/docs/about/faq.md similarity index 100% rename from docs/docs/faq.md rename to docs/docs/about/faq.md From a91a95cdd71c7a67f166296bececa590bb013d00 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 15 Mar 2024 08:47:52 +0900 Subject: [PATCH 117/131] docs: bump changelog v0.4.8 --- docs/docs/releases/changelog/cache.json | 727 ++++++++++++++++-- .../releases/changelog/changelog-v0.4.8.mdx | 98 +++ docs/plugins/changelog-plugin/fetchData.js | 6 +- docs/plugins/changelog-plugin/index.js | 2 +- 4 files changed, 747 insertions(+), 86 deletions(-) create mode 100644 docs/docs/releases/changelog/changelog-v0.4.8.mdx diff --git a/docs/docs/releases/changelog/cache.json b/docs/docs/releases/changelog/cache.json index 96aecc521..fff125158 100644 --- a/docs/docs/releases/changelog/cache.json +++ b/docs/docs/releases/changelog/cache.json @@ -1,5 +1,568 @@ { "releases": [ + { + "url": "https://api.github.com/repos/janhq/jan/releases/145763492", + "assets_url": "https://api.github.com/repos/janhq/jan/releases/145763492/assets", + "upload_url": "https://uploads.github.com/repos/janhq/jan/releases/145763492/assets{?name,label}", + "html_url": "https://github.com/janhq/jan/releases/tag/v0.4.8", + "id": 145763492, + "author": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "node_id": "RE_kwDOKIBx0s4IsCyk", + "tag_name": "v0.4.8", + "target_commitish": "3aeb6434b8d65f5540778ceff311c63d6683d933", + "name": "0.4.8", + "draft": false, + "prerelease": false, + "created_at": "2024-03-11T06:02:54Z", + "published_at": "2024-03-11T06:34:40Z", + "assets": [ + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016220", + "id": 156016220, + "node_id": "RA_kwDOKIBx0s4JTJ5c", + "name": "jan-linux-amd64-0.4.8.deb", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 110060688, + "download_count": 487, + "created_at": "2024-03-11T06:08:19Z", + "updated_at": "2024-03-11T06:08:21Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-linux-amd64-0.4.8.deb" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016113", + "id": 156016113, + "node_id": "RA_kwDOKIBx0s4JTJ3x", + "name": "jan-linux-x86_64-0.4.8.AppImage", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 145793120, + "download_count": 355, + "created_at": "2024-03-11T06:07:03Z", + "updated_at": "2024-03-11T06:07:06Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-linux-x86_64-0.4.8.AppImage" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016899", + "id": 156016899, + "node_id": "RA_kwDOKIBx0s4JTKED", + "name": "jan-mac-arm64-0.4.8.dmg", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 121575422, + "download_count": 666, + "created_at": "2024-03-11T06:16:32Z", + "updated_at": "2024-03-11T06:16:43Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-arm64-0.4.8.dmg" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016900", + "id": 156016900, + "node_id": "RA_kwDOKIBx0s4JTKEE", + "name": "jan-mac-arm64-0.4.8.dmg.blockmap", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 128586, + "download_count": 2, + "created_at": "2024-03-11T06:16:32Z", + "updated_at": "2024-03-11T06:16:33Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-arm64-0.4.8.dmg.blockmap" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016916", + "id": 156016916, + "node_id": "RA_kwDOKIBx0s4JTKEU", + "name": "jan-mac-arm64-0.4.8.zip", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/zip", + "state": "uploaded", + "size": 117287741, + "download_count": 778, + "created_at": "2024-03-11T06:16:48Z", + "updated_at": "2024-03-11T06:17:07Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-arm64-0.4.8.zip" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016915", + "id": 156016915, + "node_id": "RA_kwDOKIBx0s4JTKET", + "name": "jan-mac-arm64-0.4.8.zip.blockmap", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 122022, + "download_count": 3, + "created_at": "2024-03-11T06:16:48Z", + "updated_at": "2024-03-11T06:16:49Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-arm64-0.4.8.zip.blockmap" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016670", + "id": 156016670, + "node_id": "RA_kwDOKIBx0s4JTKAe", + "name": "jan-mac-x64-0.4.8.dmg", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 128115024, + "download_count": 260, + "created_at": "2024-03-11T06:14:43Z", + "updated_at": "2024-03-11T06:14:49Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-x64-0.4.8.dmg" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016669", + "id": 156016669, + "node_id": "RA_kwDOKIBx0s4JTKAd", + "name": "jan-mac-x64-0.4.8.dmg.blockmap", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 135139, + "download_count": 2, + "created_at": "2024-03-11T06:14:43Z", + "updated_at": "2024-03-11T06:14:43Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-x64-0.4.8.dmg.blockmap" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016721", + "id": 156016721, + "node_id": "RA_kwDOKIBx0s4JTKBR", + "name": "jan-mac-x64-0.4.8.zip", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/zip", + "state": "uploaded", + "size": 123950755, + "download_count": 132, + "created_at": "2024-03-11T06:15:11Z", + "updated_at": "2024-03-11T06:15:17Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-x64-0.4.8.zip" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016722", + "id": 156016722, + "node_id": "RA_kwDOKIBx0s4JTKBS", + "name": "jan-mac-x64-0.4.8.zip.blockmap", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 130406, + "download_count": 2, + "created_at": "2024-03-11T06:15:11Z", + "updated_at": "2024-03-11T06:15:11Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-x64-0.4.8.zip.blockmap" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016806", + "id": 156016806, + "node_id": "RA_kwDOKIBx0s4JTKCm", + "name": "jan-win-x64-0.4.8.exe", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 119749864, + "download_count": 3852, + "created_at": "2024-03-11T06:15:48Z", + "updated_at": "2024-03-11T06:15:52Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-win-x64-0.4.8.exe" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016805", + "id": 156016805, + "node_id": "RA_kwDOKIBx0s4JTKCl", + "name": "jan-win-x64-0.4.8.exe.blockmap", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 127370, + "download_count": 1741, + "created_at": "2024-03-11T06:15:48Z", + "updated_at": "2024-03-11T06:15:48Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/jan-win-x64-0.4.8.exe.blockmap" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016223", + "id": 156016223, + "node_id": "RA_kwDOKIBx0s4JTJ5f", + "name": "latest-linux.yml", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "text/yaml", + "state": "uploaded", + "size": 540, + "download_count": 1385, + "created_at": "2024-03-11T06:08:22Z", + "updated_at": "2024-03-11T06:08:22Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/latest-linux.yml" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156017041", + "id": 156017041, + "node_id": "RA_kwDOKIBx0s4JTKGR", + "name": "latest-mac.yml", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "text/yaml", + "state": "uploaded", + "size": 842, + "download_count": 3208, + "created_at": "2024-03-11T06:18:08Z", + "updated_at": "2024-03-11T06:18:08Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/latest-mac.yml" + }, + { + "url": "https://api.github.com/repos/janhq/jan/releases/assets/156016808", + "id": 156016808, + "node_id": "RA_kwDOKIBx0s4JTKCo", + "name": "latest.yml", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "text/yaml", + "state": "uploaded", + "size": 339, + "download_count": 7760, + "created_at": "2024-03-11T06:15:52Z", + "updated_at": "2024-03-11T06:15:52Z", + "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.8/latest.yml" + } + ], + "tarball_url": "https://api.github.com/repos/janhq/jan/tarball/v0.4.8", + "zipball_url": "https://api.github.com/repos/janhq/jan/zipball/v0.4.8", + "body": "## Changes\r\n\r\n- Release cut v0.4.8 @louis-jan (#2267)\r\n- Add modify notary team in CI @hiento09 (#2265)\r\n- Chore: Update new models to model hub @hahuyhoang411 (#2192)\r\n- Macos Notarize migrage to new Team ID @hiento09 (#2228)\r\n- docs: update API Reference assistants\\_id endpoint from DevDocs @avb-is-me (#2195)\r\n- docs: update API Reference assistants endpoint from DevDocs @avb-is-me (#2194)\r\n- docs: update API Reference threads endpoint from DevDocs @avb-is-me (#2182)\r\n- fix: wrong profile parameter in docker command @mooncool (#2159)\r\n- Sync release 0.4.7 to dev @louis-jan (#2151)\r\n- docs: add upstream acknowledgements @hieu-jan (#2136)\r\n- Sync dev branch to docs branch @hieu-jan (#2131)\r\n\r\n## 🚀 Features\r\n\r\n- feat: prompt user to download an update manually @louis-jan (#2261)\r\n- feat: Jan can see @hiro-v (#2069)\r\n- Revert feat: temporary remove dark mode @urmauur (#2221)\r\n- feat: add turborepo @louis-jan (#2220)\r\n- fix: change button import model on hub page @urmauur (#2178)\r\n- feat: temporary remove dark mode :( @urmauur (#2168)\r\n- feat: add import model feature @namchuai (#2104)\r\n- feat: restore docusaurus style @urmauur (#2152)\r\n- feat: add a simple way to convert Hugging Face model to GGUF @Helloyunho (#1972)\r\n\r\n## 🐛 Fixes\r\n\r\n- codesign script force sign @hiento09 (#2291)\r\n- fix: should not attach error messages to the completion request @louis-jan (#2258)\r\n- fix: image upload button and drag event are not enabled @louis-jan (#2248)\r\n- fix: error message being sent along with conversation when inference @namchuai (#2242)\r\n- fix: replaced user path from app log @namchuai (#2238)\r\n- fix: drag and drop support image format to support vision model @urmauur (#2237)\r\n- fix: re-configure changelog sections @hieu-jan (#2230)\r\n- fix: import from HuggingFace with random string is causing app crash @louis-jan (#2214)\r\n- fix: comment from QA regarding import model @namchuai (#2213)\r\n- fix: download model error does not reset state in model hub @namchuai (#2199)\r\n- fix: minor ui missing secondary background @urmauur (#2198)\r\n- docs: update docker command @hieu-jan (#2180)\r\n- fix: some bugs for import model @namchuai (#2181)\r\n- fix: change button import model on hub page @urmauur (#2178)\r\n- fix space between progress bar and title list of gpu @urmauur (#2177)\r\n- fix: disabled prompt user using dangerouslySetInnerHTML @urmauur (#2176)\r\n- fix: style list of gpus on system monitor @urmauur (#2172)\r\n- fix: system monitor expand overlap tooltip ribbon @urmauur (#2158)\r\n- Huggingface extension add codesign step for building on darwin @hiento09 (#2166)\r\n- Add run codesign for huggingface extension @hiento09 (#2163)\r\n- fix: system monitor ui @urmauur (#2135)\r\n\r\n## 🧰 Maintenance\r\n\r\n- chore: temporary remove convert model @namchuai (#2266)\r\n- docs: sync slug fix from dev branch to docs branch @hieu-jan (#2264)\r\n- docs: Update broken link and fix the slug @aindrajaya (#2260)\r\n- docs: Fix navbar issues. Keep stay when clicked other menu items from the sidebar @aindrajaya (#2253)\r\n- docs: sync docs hub fixes from dev to docs branch @hieu-jan (#2247)\r\n- docs: Update content for Hub page and Guides section @aindrajaya (#2245)\r\n- docs: Fix Dark Mode on the Hub page and Update the Navbar functionality @aindrajaya (#2243)\r\n- chore: sync dev branch to docs branch @hieu-jan (#2239)\r\n- Chore: add prefix latest for task clean r2 bucket @hiento09 (#2233)\r\n- fix: re-configure changelog sections @hieu-jan (#2230)\r\n- docs: add command run API server without frontend @hieu-jan (#2231)\r\n- docs: revamp entire Jan guides @hieu-jan (#2139)\r\n- chore: clean up some redundant code @namchuai (#2215)\r\n- docs: update API Reference chatCompletions from DevDocs @avb-is-me (#2171)\r\n- docs: update API Reference download model from DevDocs @avb-is-me (#2170)\r\n- docs: update API Reference model\\_id from DevDocs @avb-is-me (#2169)\r\n- docs: update API Reference listModel from DevDocs @avb-is-me (#2161)\r\n- docs: Update 08-antivirus-compatibility-testing.md @0xSage (#2186)\r\n- docs: adding new feature for v0.4.7 to release checklist @Van-QA (#2189)\r\n- docs: Update 01-integrate-continue.mdx @0xSage (#2187)\r\n- chore: bump nitro 0.3.14 @louis-jan (#2183)\r\n- docs: Sync dev branch to docs branch @hieu-jan (#2185)\r\n- docs: update docker command @hieu-jan (#2180)\r\n- docs: update wall of love @hieu-jan (#2179)\r\n- docs: add Jan newsletter @hieu-jan (#2174)\r\n- chore: make convert gguf as experimental feature @namchuai (#2156)\r\n- docs: update acknowledgements @hieu-jan (#2147)\r\n- feat: restore docusaurus style @urmauur (#2152)\r\n- docs: update run Jan in Docker mode @hieu-jan (#2150)\r\n- Docs pena team - Add Quickstart Docs @aindrajaya (#2138)\r\n- docs: hide incomplete pages @hieu-jan (#2127)\r\n\r\n## Contributor\r\n\r\n@0xSage, @Helloyunho, @Van-QA, @aindrajaya, @avb-is-me, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @mooncool, @namchuai and @urmauur\r\n", + "reactions": { + "url": "https://api.github.com/repos/janhq/jan/releases/145763492/reactions", + "total_count": 5, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 5, + "rocket": 0, + "eyes": 0 + }, + "mentions_count": 14 + }, { "url": "https://api.github.com/repos/janhq/jan/releases/143551170", "assets_url": "https://api.github.com/repos/janhq/jan/releases/143551170/assets", @@ -64,7 +627,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 100168358, - "download_count": 922, + "download_count": 1492, "created_at": "2024-02-26T02:39:48Z", "updated_at": "2024-02-26T02:39:51Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-linux-amd64-0.4.7.deb" @@ -98,7 +661,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 135683130, - "download_count": 802, + "download_count": 1323, "created_at": "2024-02-26T02:38:38Z", "updated_at": "2024-02-26T02:38:42Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-linux-x86_64-0.4.7.AppImage" @@ -132,7 +695,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 116705772, - "download_count": 1535, + "download_count": 2655, "created_at": "2024-02-26T02:41:58Z", "updated_at": "2024-02-26T02:42:09Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-mac-arm64-0.4.7.dmg" @@ -200,7 +763,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 112429002, - "download_count": 1127, + "download_count": 1568, "created_at": "2024-02-26T02:42:14Z", "updated_at": "2024-02-26T02:42:30Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-mac-arm64-0.4.7.zip" @@ -268,7 +831,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 123302141, - "download_count": 604, + "download_count": 1019, "created_at": "2024-02-26T02:45:43Z", "updated_at": "2024-02-26T02:45:48Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-mac-x64-0.4.7.dmg" @@ -336,7 +899,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 119095882, - "download_count": 224, + "download_count": 328, "created_at": "2024-02-26T02:45:59Z", "updated_at": "2024-02-26T02:46:04Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-mac-x64-0.4.7.zip" @@ -370,7 +933,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 125044, - "download_count": 5, + "download_count": 7, "created_at": "2024-02-26T02:45:59Z", "updated_at": "2024-02-26T02:45:59Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-mac-x64-0.4.7.zip.blockmap" @@ -404,7 +967,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 109668960, - "download_count": 9184, + "download_count": 14681, "created_at": "2024-02-26T02:48:10Z", "updated_at": "2024-02-26T02:48:12Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-win-x64-0.4.7.exe" @@ -438,7 +1001,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 116340, - "download_count": 3216, + "download_count": 5853, "created_at": "2024-02-26T02:48:10Z", "updated_at": "2024-02-26T02:48:10Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/jan-win-x64-0.4.7.exe.blockmap" @@ -472,7 +1035,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 540, - "download_count": 2590, + "download_count": 4866, "created_at": "2024-02-26T02:39:52Z", "updated_at": "2024-02-26T02:39:52Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/latest-linux.yml" @@ -506,7 +1069,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 842, - "download_count": 6297, + "download_count": 11436, "created_at": "2024-02-26T02:47:00Z", "updated_at": "2024-02-26T02:47:00Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/latest-mac.yml" @@ -540,7 +1103,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 339, - "download_count": 20077, + "download_count": 35170, "created_at": "2024-02-26T02:48:12Z", "updated_at": "2024-02-26T02:48:12Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.7/latest.yml" @@ -551,13 +1114,13 @@ "body": "## Changes\r\n\r\n- Release cut v0.4.7 @louis-jan (#2121)\r\n- chore: update models @hahuyhoang411 (#1829)\r\n- add docs for entire advanced settings @hieu-jan (#2063)\r\n- docs: Fix #2040 : added /v1 path to apiBase @ldebs (#2041)\r\n- fix: ui for disabled state of gpu acceleration @namchuai (#2034)\r\n- feat: Initialize POM structure with fixtures on Playwright @Van-QA (#2015)\r\n- Alternative solution for `Thread titles should auto-summarize Topic` @0xgokuz (#1976)\r\n- Update authors.yml Rex @hahuyhoang411 (#1956)\r\n- Update authors.yml Louis @louis-jan (#1955)\r\n- Change env Dockerfile.gpu and update README @hiento09 (#1963)\r\n- chore: Update authors.yml for Van Pham @Van-QA (#1954)\r\n- Sync dev branch to docs branch @hieu-jan (#1948)\r\n- sync current docs branch to dev branch @hieu-jan (#1947)\r\n- feat: Playwright capture screenshot of Electron desktop app (Jan) on failures @Van-QA (#1934)\r\n- Sync main to dev after release 0.4.6 @hiento09 (#1929)\r\n\r\n## 🚀 Features\r\n\r\n- feat: Add nitro vulkan to support AMD GPU/ APU and Intel Arc GPU @hiro-v (#2056)\r\n- fix: flow edit message @urmauur (#2113)\r\n- Feature helmchart and ci jan server @hiento09 (#2106)\r\n- feat: improvementUI GPU acceleration @urmauur (#1990)\r\n- feat: add edit messages users @urmauur (#1974)\r\n- feat: revamp ui dropdown list model option @urmauur (#1977)\r\n- feat: add modal troubleshooting guideline @urmauur (#1968)\r\n- feat: integrate umami script locally @hieu-jan (#1958)\r\n- feat: User Selectable GPUs and GPU-based Model Recommendations @hiento09 (#1730)\r\n\r\n## 🐛 Fixes\r\n\r\n- fix: correct vulkan settings @louis-jan (#2128)\r\n- fix: chore UI @louis-jan (#2125)\r\n- Regression: bump nitro to 0.3.13 @hiento09 (#2124)\r\n- Regression: Linux vulkan binary path @hiento09 (#2123)\r\n- fix: revert back menu actions @louis-jan (#2120)\r\n- fix: mismatching between nightly build and version - jan about @louis-jan (#2114)\r\n- fix: flow edit message @urmauur (#2113)\r\n- fix: tools section should be expanded by default @louis-jan (#2110)\r\n- fix: failed to bind port - nitro error message copy @louis-jan (#2101)\r\n- fix: remove caret down icon when tab selected into remote model @urmauur (#2102)\r\n- fix: openai client sdk compatible @louis-jan (#2096)\r\n- Fix bug #2005 docker blank website @hiento09 (#2093)\r\n- fix: check if port is occupied before start local server @namchuai (#2098)\r\n- fix: broken model.json update @louis-jan (#2099)\r\n- fix: make text input scrollable @urmauur (#2083)\r\n- fix: failed to send message blocks thread creation @louis-jan (#2091)\r\n- fix: server crashes on missing module @louis-jan (#2089)\r\n- fix: expand assistant and model settings by default @louis-jan (#2081)\r\n- fix: move jan data folder - error handling for no write permission granted @louis-jan (#2077)\r\n- fix: check for updates should show no update are available on the latest build @louis-jan (#2075)\r\n- fix: infinity showed when haven't get total size @namchuai (#2066)\r\n- fix: should stop running the model when GPU settings are changed @louis-jan (#2067)\r\n- fix: settings page state loop and dark theme @louis-jan (#2065)\r\n- fix: Fix Nitro windows with error 3221225781 @hiro-v (#2057)\r\n- fix: message should only be interrupted when i start another thread @louis-jan (#2053)\r\n- fix: local server start error should not change to started state @louis-jan (#2052)\r\n- fix: update copy of message queue @louis-jan (#2051)\r\n- fix: download mutilple binaries @namchuai (#2043)\r\n- fix: disable gpu drop down box if there's no GPU ready @namchuai (#2046)\r\n- fix: app should generate thread title with length restriction @louis-jan (#2037)\r\n- fix: factory reset not remove jan data folder @namchuai (#2027)\r\n- fix: content setting right panel default to collapse @urmauur (#2026)\r\n- fix: local server blank parameters if there is no thread selected @louis-jan (#2028)\r\n- fix: model path backward compatible @louis-jan (#2018)\r\n- fix: resolve state update loop infinitive rerendering @louis-jan (#2017)\r\n- fix: lack of auto-cleaning mechanism for logs @louis-jan (#2003)\r\n- fix: app stuck regenerating assistant response @louis-jan (#2001)\r\n- fix: decouple thread summary update @louis-jan (#1994)\r\n- fix: app fails gracefully with clear error messages @louis-jan (#1993)\r\n- fix: retrieval stuck at generating response @louis-jan (#1988)\r\n- Fix macos auto update failed on nightly build @hiento09 (#1991)\r\n- fix: model downloads broken on nightly @louis-jan (#1984)\r\n- fix: RAG enhancements @urmauur (#1965)\r\n- Update docs run Jan Server in Docker mode @hiento09 (#1960)\r\n- fix: update conditional check last status message @urmauur (#1951)\r\n- fix: markdown render for chat completion role user @urmauur (#1944)\r\n- fix: avoid users to create so many threads at the same time @urmauur (#1930)\r\n- fix: download model will close panel item hub @urmauur (#1923)\r\n\r\n## 🧰 Maintenance\r\n\r\n- docs: improve integrations guide \\& import model using absolute path @hieu-jan (#2076)\r\n- chore: add app version into log @namchuai (#2116)\r\n- docs: add integration docs Mistral AI API @hieu-jan (#2070)\r\n- docs:add-advanced-settings-https-proxy @hieu-jan (#2054)\r\n- chore: refactor watch system resource hook @louis-jan (#2048)\r\n- docs: Updates Guide Using the Local Server @SamPatt (#1924)\r\n- server install core using link instead of file @hiento09 (#2025)\r\n- chore: prettier fix @louis-jan (#2019)\r\n- chore: bump nitro 0.3.9 @louis-jan (#2016)\r\n- refactor: reduce IPC \\& API handlers - shared node logics @louis-jan (#2011)\r\n- docs: update 03-gpu-not-used with RTX issues @hieu-jan (#1992)\r\n- docs: add Jan installation using Docker @hieu-jan (#1981)\r\n- chore: reduce bundle size @louis-jan (#1970)\r\n- docs: add author.yml @hieu-jan (#1973)\r\n- Update authors.yml hien @hiento09 (#1953)\r\n- chore: server download progress + S3 @louis-jan (#1925)\r\n- chore: add author james @namchuai (#1952)\r\n- chore: Add author - Ashley @imtuyethan (#1950)\r\n- chore: Add Author - Hiro @hiro-v (#1949)\r\n- docs: adding new feature for v0.4.6 to release checklist @Van-QA (#1927)\r\n\r\n## Contributor\r\n\r\n@0xSage, @0xgokuz, @SamPatt, @Van-QA, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @imtuyethan, @jan-service-account, @ldebs, @louis-jan, @namchuai, @urmauur and James\r\n", "reactions": { "url": "https://api.github.com/repos/janhq/jan/releases/143551170/reactions", - "total_count": 9, - "+1": 9, + "total_count": 12, + "+1": 11, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, - "heart": 0, + "heart": 1, "rocket": 0, "eyes": 0 }, @@ -695,7 +1258,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 149608360, - "download_count": 5259, + "download_count": 5271, "created_at": "2024-02-05T09:12:39Z", "updated_at": "2024-02-05T09:13:19Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.6/jan-mac-arm64-0.4.6.dmg" @@ -899,7 +1462,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 151601089, - "download_count": 422, + "download_count": 423, "created_at": "2024-02-05T09:07:54Z", "updated_at": "2024-02-05T09:07:58Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.6/jan-mac-x64-0.4.6.zip" @@ -933,7 +1496,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 159770, - "download_count": 15, + "download_count": 16, "created_at": "2024-02-05T09:07:54Z", "updated_at": "2024-02-05T09:07:55Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.6/jan-mac-x64-0.4.6.zip.blockmap" @@ -967,7 +1530,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 136684856, - "download_count": 29466, + "download_count": 29516, "created_at": "2024-02-05T09:05:31Z", "updated_at": "2024-02-05T09:05:36Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.6/jan-win-x64-0.4.6.exe" @@ -1001,7 +1564,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 145259, - "download_count": 7033, + "download_count": 8189, "created_at": "2024-02-05T09:05:31Z", "updated_at": "2024-02-05T09:05:31Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.6/jan-win-x64-0.4.6.exe.blockmap" @@ -1190,7 +1753,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 100526314, - "download_count": 1105, + "download_count": 1107, "created_at": "2024-01-29T04:42:56Z", "updated_at": "2024-01-29T04:42:59Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.5/jan-linux-amd64-0.4.5.deb" @@ -1224,7 +1787,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 139479533, - "download_count": 989, + "download_count": 991, "created_at": "2024-01-29T04:41:42Z", "updated_at": "2024-01-29T04:41:47Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.5/jan-linux-x86_64-0.4.5.AppImage" @@ -1258,7 +1821,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 127455536, - "download_count": 1479, + "download_count": 1481, "created_at": "2024-01-29T05:04:02Z", "updated_at": "2024-01-29T05:04:16Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.5/jan-mac-arm64-0.4.5.dmg" @@ -1428,7 +1991,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 140125, - "download_count": 3, + "download_count": 4, "created_at": "2024-01-29T05:00:45Z", "updated_at": "2024-01-29T05:00:46Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.5/jan-mac-x64-0.4.5.dmg.blockmap" @@ -1530,7 +2093,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 112164048, - "download_count": 9305, + "download_count": 9315, "created_at": "2024-01-29T04:51:58Z", "updated_at": "2024-01-29T04:52:00Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.5/jan-win-x64-0.4.5.exe" @@ -1564,7 +2127,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 119750, - "download_count": 4987, + "download_count": 5169, "created_at": "2024-01-29T04:51:58Z", "updated_at": "2024-01-29T04:51:58Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.5/jan-win-x64-0.4.5.exe.blockmap" @@ -1598,7 +2161,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 540, - "download_count": 3297, + "download_count": 3298, "created_at": "2024-01-29T04:42:59Z", "updated_at": "2024-01-29T04:42:59Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.5/latest-linux.yml" @@ -1889,7 +2452,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 122737615, - "download_count": 1060, + "download_count": 1061, "created_at": "2024-01-16T01:52:40Z", "updated_at": "2024-01-16T01:52:44Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.4/jan-mac-arm64-0.4.4.zip" @@ -1923,7 +2486,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 129515, - "download_count": 4, + "download_count": 5, "created_at": "2024-01-16T01:52:40Z", "updated_at": "2024-01-16T01:52:40Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.4/jan-mac-arm64-0.4.4.zip.blockmap" @@ -1957,7 +2520,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 133785404, - "download_count": 1927, + "download_count": 1929, "created_at": "2024-01-16T01:49:55Z", "updated_at": "2024-01-16T01:50:00Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.4/jan-mac-x64-0.4.4.dmg" @@ -2093,7 +2656,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 111766336, - "download_count": 23160, + "download_count": 23199, "created_at": "2024-01-16T01:49:06Z", "updated_at": "2024-01-16T01:49:10Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.4/jan-win-x64-0.4.4.exe" @@ -2127,7 +2690,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 118550, - "download_count": 6681, + "download_count": 7013, "created_at": "2024-01-16T01:49:11Z", "updated_at": "2024-01-16T01:49:11Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.4/jan-win-x64-0.4.4.exe.blockmap" @@ -2316,7 +2879,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 95840002, - "download_count": 5031, + "download_count": 5036, "created_at": "2023-12-21T14:11:45Z", "updated_at": "2023-12-21T14:11:49Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.3/jan-linux-amd64-0.4.3.deb" @@ -2350,7 +2913,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 121463938, - "download_count": 9213, + "download_count": 9215, "created_at": "2023-12-21T14:19:40Z", "updated_at": "2023-12-21T14:19:45Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.3/jan-mac-arm64-0.4.3.dmg" @@ -2384,7 +2947,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 126494, - "download_count": 14, + "download_count": 15, "created_at": "2023-12-21T14:19:40Z", "updated_at": "2023-12-21T14:19:40Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.3/jan-mac-arm64-0.4.3.dmg.blockmap" @@ -2622,7 +3185,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 105609992, - "download_count": 28117, + "download_count": 28147, "created_at": "2023-12-21T14:18:19Z", "updated_at": "2023-12-21T14:18:22Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.3/jan-win-x64-0.4.3.exe" @@ -2656,7 +3219,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 110786, - "download_count": 3890, + "download_count": 4082, "created_at": "2023-12-21T14:18:23Z", "updated_at": "2023-12-21T14:18:23Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.3/jan-win-x64-0.4.3.exe.blockmap" @@ -2913,7 +3476,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 125700, - "download_count": 1, + "download_count": 2, "created_at": "2023-12-15T14:27:06Z", "updated_at": "2023-12-15T14:27:07Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.2/jan-mac-arm64-0.4.2.dmg.blockmap" @@ -3015,7 +3578,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 126174829, - "download_count": 34, + "download_count": 35, "created_at": "2023-12-15T14:21:56Z", "updated_at": "2023-12-15T14:22:02Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.2/jan-mac-x64-0.4.2.dmg" @@ -3049,7 +3612,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 131844, - "download_count": 1, + "download_count": 2, "created_at": "2023-12-15T14:21:56Z", "updated_at": "2023-12-15T14:21:57Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.2/jan-mac-x64-0.4.2.dmg.blockmap" @@ -3117,7 +3680,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 128437, - "download_count": 1, + "download_count": 2, "created_at": "2023-12-15T14:22:45Z", "updated_at": "2023-12-15T14:22:45Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.2/jan-mac-x64-0.4.2.zip.blockmap" @@ -3185,7 +3748,7 @@ "content_type": "text/xml", "state": "uploaded", "size": 110511, - "download_count": 212, + "download_count": 217, "created_at": "2023-12-15T14:19:41Z", "updated_at": "2023-12-15T14:19:42Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.2/jan-win-x64-0.4.2.exe.blockmap" @@ -3464,7 +4027,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 112560272, - "download_count": 7, + "download_count": 8, "created_at": "2023-12-14T02:45:00Z", "updated_at": "2023-12-14T02:45:04Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.1/jan-mac-arm64-0.4.1.zip" @@ -3532,7 +4095,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 123218066, - "download_count": 8, + "download_count": 9, "created_at": "2023-12-14T02:41:40Z", "updated_at": "2023-12-14T02:41:44Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.1/jan-mac-x64-0.4.1.dmg" @@ -3566,7 +4129,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 130326, - "download_count": 1, + "download_count": 2, "created_at": "2023-12-14T02:41:40Z", "updated_at": "2023-12-14T02:41:40Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.1/jan-mac-x64-0.4.1.dmg.blockmap" @@ -3600,7 +4163,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 119172042, - "download_count": 2, + "download_count": 3, "created_at": "2023-12-14T02:42:31Z", "updated_at": "2023-12-14T02:42:36Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.1/jan-mac-x64-0.4.1.zip" @@ -3702,7 +4265,7 @@ "content_type": "text/xml", "state": "uploaded", "size": 106791, - "download_count": 39, + "download_count": 40, "created_at": "2023-12-14T02:42:33Z", "updated_at": "2023-12-14T02:42:34Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.1/jan-win-x64-0.4.1.exe.blockmap" @@ -3736,7 +4299,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 346, - "download_count": 29, + "download_count": 30, "created_at": "2023-12-14T02:36:02Z", "updated_at": "2023-12-14T02:36:02Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.4.1/latest-linux.yml" @@ -4396,7 +4959,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 82300876, - "download_count": 32, + "download_count": 33, "created_at": "2023-11-28T14:33:55Z", "updated_at": "2023-11-28T14:33:57Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.3/jan-linux-amd64-0.3.3.deb" @@ -4464,7 +5027,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 106938, - "download_count": 2, + "download_count": 3, "created_at": "2023-11-28T14:43:02Z", "updated_at": "2023-11-28T14:43:02Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.3/jan-mac-arm64-0.3.3.dmg.blockmap" @@ -4600,7 +5163,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 113751, - "download_count": 2, + "download_count": 3, "created_at": "2023-11-28T14:40:08Z", "updated_at": "2023-11-28T14:40:08Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.3/jan-mac-x64-0.3.3.dmg.blockmap" @@ -4668,7 +5231,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 110645, - "download_count": 2, + "download_count": 3, "created_at": "2023-11-28T14:41:16Z", "updated_at": "2023-11-28T14:41:16Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.3/jan-mac-x64-0.3.3.zip.blockmap" @@ -4702,7 +5265,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 81157168, - "download_count": 100, + "download_count": 101, "created_at": "2023-11-28T14:35:42Z", "updated_at": "2023-11-28T14:35:45Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.3/jan-win-x64-0.3.3.exe" @@ -4736,7 +5299,7 @@ "content_type": "text/xml", "state": "uploaded", "size": 85522, - "download_count": 15, + "download_count": 16, "created_at": "2023-11-28T14:35:46Z", "updated_at": "2023-11-28T14:35:46Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.3/jan-win-x64-0.3.3.exe.blockmap" @@ -4804,7 +5367,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 798, - "download_count": 145, + "download_count": 146, "created_at": "2023-11-28T14:43:57Z", "updated_at": "2023-11-28T14:43:58Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.3/latest-mac.yml" @@ -5151,7 +5714,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 103806500, - "download_count": 2, + "download_count": 3, "created_at": "2023-11-15T06:36:56Z", "updated_at": "2023-11-15T06:37:00Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.2/jan-mac-x64-0.3.2.zip" @@ -5219,7 +5782,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 81017298, - "download_count": 71, + "download_count": 73, "created_at": "2023-11-15T06:35:18Z", "updated_at": "2023-11-15T06:35:21Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.2/jan-win-x64-0.3.2.exe" @@ -5253,7 +5816,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 85408, - "download_count": 7, + "download_count": 8, "created_at": "2023-11-15T06:35:18Z", "updated_at": "2023-11-15T06:35:19Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.2/jan-win-x64-0.3.2.exe.blockmap" @@ -5430,7 +5993,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 88473890, - "download_count": 18, + "download_count": 19, "created_at": "2023-11-10T10:32:29Z", "updated_at": "2023-11-10T10:32:32Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.1/jan-linux-amd64-0.3.1.deb" @@ -5464,7 +6027,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 111212160, - "download_count": 38, + "download_count": 39, "created_at": "2023-11-10T10:37:02Z", "updated_at": "2023-11-10T10:37:08Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.1/jan-mac-arm64-0.3.1.dmg" @@ -5981,7 +6544,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 122527047, - "download_count": 45, + "download_count": 46, "created_at": "2023-10-27T08:39:24Z", "updated_at": "2023-10-27T08:39:29Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.0/jan-mac-arm64-0.3.0.dmg" @@ -6185,7 +6748,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 123901017, - "download_count": 5, + "download_count": 6, "created_at": "2023-10-27T08:35:56Z", "updated_at": "2023-10-27T08:36:02Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.3.0/jan-mac-x64-0.3.0.zip" @@ -6532,7 +7095,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 130923, - "download_count": 2, + "download_count": 3, "created_at": "2023-10-27T08:04:30Z", "updated_at": "2023-10-27T08:04:30Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.3/jan-mac-arm64-0.2.3.dmg.blockmap" @@ -6566,7 +7129,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 118596651, - "download_count": 10, + "download_count": 11, "created_at": "2023-10-27T08:05:09Z", "updated_at": "2023-10-27T08:05:15Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.3/jan-mac-arm64-0.2.3.zip" @@ -6634,7 +7197,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 127748199, - "download_count": 2, + "download_count": 3, "created_at": "2023-10-27T08:00:23Z", "updated_at": "2023-10-27T08:00:31Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.3/jan-mac-x64-0.2.3.dmg" @@ -6668,7 +7231,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 134400, - "download_count": 2, + "download_count": 3, "created_at": "2023-10-27T08:00:23Z", "updated_at": "2023-10-27T08:00:23Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.3/jan-mac-x64-0.2.3.dmg.blockmap" @@ -6872,7 +7435,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 799, - "download_count": 21, + "download_count": 22, "created_at": "2023-10-27T08:05:15Z", "updated_at": "2023-10-27T08:05:15Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.3/latest-mac.yml" @@ -6906,7 +7469,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 338, - "download_count": 9, + "download_count": 10, "created_at": "2023-10-27T07:55:19Z", "updated_at": "2023-10-27T07:55:19Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.3/latest.yml" @@ -7049,7 +7612,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 130321, - "download_count": 2, + "download_count": 3, "created_at": "2023-10-26T10:55:21Z", "updated_at": "2023-10-26T10:55:22Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.2/jan-mac-arm64-0.2.2.dmg.blockmap" @@ -7083,7 +7646,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 118590874, - "download_count": 6, + "download_count": 7, "created_at": "2023-10-26T10:55:40Z", "updated_at": "2023-10-26T10:55:47Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.2/jan-mac-arm64-0.2.2.zip" @@ -7117,7 +7680,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 124759, - "download_count": 2, + "download_count": 3, "created_at": "2023-10-26T10:55:40Z", "updated_at": "2023-10-26T10:55:41Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.2/jan-mac-arm64-0.2.2.zip.blockmap" @@ -7151,7 +7714,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 127735305, - "download_count": 3, + "download_count": 4, "created_at": "2023-10-26T10:52:32Z", "updated_at": "2023-10-26T10:52:38Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.2/jan-mac-x64-0.2.2.dmg" @@ -7219,7 +7782,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 123895826, - "download_count": 3, + "download_count": 4, "created_at": "2023-10-26T10:53:03Z", "updated_at": "2023-10-26T10:53:09Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.2/jan-mac-x64-0.2.2.zip" @@ -7321,7 +7884,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 103420, - "download_count": 5, + "download_count": 6, "created_at": "2023-10-26T10:52:08Z", "updated_at": "2023-10-26T10:52:08Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.2/jan-win-x64-0.2.2.exe.blockmap" @@ -7423,7 +7986,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 338, - "download_count": 30, + "download_count": 31, "created_at": "2023-10-26T10:52:10Z", "updated_at": "2023-10-26T10:52:11Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.2/latest.yml" @@ -7566,7 +8129,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 125173, - "download_count": 2, + "download_count": 3, "created_at": "2023-10-25T09:15:35Z", "updated_at": "2023-10-25T09:15:41Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.1/jan-mac-arm64-0.2.1.dmg.blockmap" @@ -7668,7 +8231,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 125739334, - "download_count": 3, + "download_count": 4, "created_at": "2023-10-25T09:13:07Z", "updated_at": "2023-10-25T09:13:14Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.1/jan-mac-x64-0.2.1.dmg" @@ -7838,7 +8401,7 @@ "content_type": "application/octet-stream", "state": "uploaded", "size": 104940, - "download_count": 3, + "download_count": 4, "created_at": "2023-10-25T09:05:10Z", "updated_at": "2023-10-25T09:05:11Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.1/jan-win-x64-0.2.1.exe.blockmap" @@ -8117,7 +8680,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 113497245, - "download_count": 5, + "download_count": 6, "created_at": "2023-10-13T10:43:10Z", "updated_at": "2023-10-13T10:43:13Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.0/jan-mac-arm64-0.2.0.zip" @@ -8253,7 +8816,7 @@ "content_type": "application/zip", "state": "uploaded", "size": 118802191, - "download_count": 2, + "download_count": 3, "created_at": "2023-10-13T10:40:10Z", "updated_at": "2023-10-13T10:40:13Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.0/jan-mac-x64-0.2.0.zip" @@ -8457,7 +9020,7 @@ "content_type": "text/yaml", "state": "uploaded", "size": 338, - "download_count": 167, + "download_count": 168, "created_at": "2023-10-13T10:39:45Z", "updated_at": "2023-10-13T10:39:45Z", "browser_download_url": "https://github.com/janhq/jan/releases/download/v0.2.0/latest.yml" @@ -8469,4 +9032,4 @@ "mentions_count": 8 } ] -} +} \ No newline at end of file diff --git a/docs/docs/releases/changelog/changelog-v0.4.8.mdx b/docs/docs/releases/changelog/changelog-v0.4.8.mdx new file mode 100644 index 000000000..d5bb266fb --- /dev/null +++ b/docs/docs/releases/changelog/changelog-v0.4.8.mdx @@ -0,0 +1,98 @@ +--- +sidebar_position: 1 +slug: /changelog/changelog-v0.4.8 +--- +# v0.4.8 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.4.8) + +Highlighted Issue: [Issue #2267: Release cut v0.4.8](https://github.com/janhq/jan/pull/2267) + +## Changes + +- Release cut v0.4.8 @louis-jan (#2267) +- Add modify notary team in CI @hiento09 (#2265) +- Chore: Update new models to model hub @hahuyhoang411 (#2192) +- Macos Notarize migrage to new Team ID @hiento09 (#2228) +- docs: update API Reference assistants\_id endpoint from DevDocs @avb-is-me (#2195) +- docs: update API Reference assistants endpoint from DevDocs @avb-is-me (#2194) +- docs: update API Reference threads endpoint from DevDocs @avb-is-me (#2182) +- fix: wrong profile parameter in docker command @mooncool (#2159) +- Sync release 0.4.7 to dev @louis-jan (#2151) +- docs: add upstream acknowledgements @hieu-jan (#2136) +- Sync dev branch to docs branch @hieu-jan (#2131) + +## 🚀 Features + +- feat: prompt user to download an update manually @louis-jan (#2261) +- feat: Jan can see @hiro-v (#2069) +- Revert feat: temporary remove dark mode @urmauur (#2221) +- feat: add turborepo @louis-jan (#2220) +- fix: change button import model on hub page @urmauur (#2178) +- feat: temporary remove dark mode :( @urmauur (#2168) +- feat: add import model feature @namchuai (#2104) +- feat: restore docusaurus style @urmauur (#2152) +- feat: add a simple way to convert Hugging Face model to GGUF @Helloyunho (#1972) + +## 🐛 Fixes + +- codesign script force sign @hiento09 (#2291) +- fix: should not attach error messages to the completion request @louis-jan (#2258) +- fix: image upload button and drag event are not enabled @louis-jan (#2248) +- fix: error message being sent along with conversation when inference @namchuai (#2242) +- fix: replaced user path from app log @namchuai (#2238) +- fix: drag and drop support image format to support vision model @urmauur (#2237) +- fix: re-configure changelog sections @hieu-jan (#2230) +- fix: import from HuggingFace with random string is causing app crash @louis-jan (#2214) +- fix: comment from QA regarding import model @namchuai (#2213) +- fix: download model error does not reset state in model hub @namchuai (#2199) +- fix: minor ui missing secondary background @urmauur (#2198) +- docs: update docker command @hieu-jan (#2180) +- fix: some bugs for import model @namchuai (#2181) +- fix: change button import model on hub page @urmauur (#2178) +- fix space between progress bar and title list of gpu @urmauur (#2177) +- fix: disabled prompt user using dangerouslySetInnerHTML @urmauur (#2176) +- fix: style list of gpus on system monitor @urmauur (#2172) +- fix: system monitor expand overlap tooltip ribbon @urmauur (#2158) +- Huggingface extension add codesign step for building on darwin @hiento09 (#2166) +- Add run codesign for huggingface extension @hiento09 (#2163) +- fix: system monitor ui @urmauur (#2135) + +## 🧰 Maintenance + +- chore: temporary remove convert model @namchuai (#2266) +- docs: sync slug fix from dev branch to docs branch @hieu-jan (#2264) +- docs: Update broken link and fix the slug @aindrajaya (#2260) +- docs: Fix navbar issues. Keep stay when clicked other menu items from the sidebar @aindrajaya (#2253) +- docs: sync docs hub fixes from dev to docs branch @hieu-jan (#2247) +- docs: Update content for Hub page and Guides section @aindrajaya (#2245) +- docs: Fix Dark Mode on the Hub page and Update the Navbar functionality @aindrajaya (#2243) +- chore: sync dev branch to docs branch @hieu-jan (#2239) +- Chore: add prefix latest for task clean r2 bucket @hiento09 (#2233) +- fix: re-configure changelog sections @hieu-jan (#2230) +- docs: add command run API server without frontend @hieu-jan (#2231) +- docs: revamp entire Jan guides @hieu-jan (#2139) +- chore: clean up some redundant code @namchuai (#2215) +- docs: update API Reference chatCompletions from DevDocs @avb-is-me (#2171) +- docs: update API Reference download model from DevDocs @avb-is-me (#2170) +- docs: update API Reference model\_id from DevDocs @avb-is-me (#2169) +- docs: update API Reference listModel from DevDocs @avb-is-me (#2161) +- docs: Update 08-antivirus-compatibility-testing.md @0xSage (#2186) +- docs: adding new feature for v0.4.7 to release checklist @Van-QA (#2189) +- docs: Update 01-integrate-continue.mdx @0xSage (#2187) +- chore: bump nitro 0.3.14 @louis-jan (#2183) +- docs: Sync dev branch to docs branch @hieu-jan (#2185) +- docs: update docker command @hieu-jan (#2180) +- docs: update wall of love @hieu-jan (#2179) +- docs: add Jan newsletter @hieu-jan (#2174) +- chore: make convert gguf as experimental feature @namchuai (#2156) +- docs: update acknowledgements @hieu-jan (#2147) +- feat: restore docusaurus style @urmauur (#2152) +- docs: update run Jan in Docker mode @hieu-jan (#2150) +- Docs pena team - Add Quickstart Docs @aindrajaya (#2138) +- docs: hide incomplete pages @hieu-jan (#2127) + +## Contributor + +@0xSage, @Helloyunho, @Van-QA, @aindrajaya, @avb-is-me, @hahuyhoang411, @hiento09, @hieu-jan, @hiro-v, @jan-service-account, @louis-jan, @mooncool, @namchuai and @urmauur + diff --git a/docs/plugins/changelog-plugin/fetchData.js b/docs/plugins/changelog-plugin/fetchData.js index a9b970b3a..3e2dffbfe 100644 --- a/docs/plugins/changelog-plugin/fetchData.js +++ b/docs/plugins/changelog-plugin/fetchData.js @@ -2,7 +2,7 @@ const fs = require('fs'); const path = require('path'); const fetch = require('node-fetch'); -async function fetchData(siteConfig) { +async function fetchData(siteConfig, forceRefresh = false) { const owner = siteConfig.organizationName; const repo = siteConfig.projectName; const apiUrl = `https://api.github.com/repos/${owner}/${repo}/releases`; @@ -17,7 +17,7 @@ async function fetchData(siteConfig) { const cacheFilePath = path.join(outputDirectory, 'cache.json'); let cachedData = {}; - if (fs.existsSync(cacheFilePath)) { + if (fs.existsSync(cacheFilePath) && !forceRefresh) { cachedData = JSON.parse(fs.readFileSync(cacheFilePath, 'utf-8')); } @@ -41,7 +41,7 @@ async function fetchData(siteConfig) { // Fetch releases from GitHub API or load from cache let releases = []; try { - if (cachedData.releases) { + if (cachedData.releases && !forceRefresh) { console.log('Loading releases from cache...'); releases = cachedData.releases; } else { diff --git a/docs/plugins/changelog-plugin/index.js b/docs/plugins/changelog-plugin/index.js index 4d4c28615..574b582e5 100644 --- a/docs/plugins/changelog-plugin/index.js +++ b/docs/plugins/changelog-plugin/index.js @@ -24,7 +24,7 @@ module.exports = function (context, options) { async onPostBuild() { // If you need additional actions after the build, you can include them here. - await fetchData(siteConfig); + await fetchData(siteConfig, true); }, }; }; From b53541b2a4c9f817fe0a5e82b272ad2086d8b16b Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 15 Mar 2024 09:11:16 +0900 Subject: [PATCH 118/131] chore: bump changelog sidebar --- .../releases/changelog/changelog-v0.2.0.mdx | 22 +++++++------- .../releases/changelog/changelog-v0.2.1.mdx | 22 +++++++------- .../releases/changelog/changelog-v0.2.2.mdx | 22 +++++++------- .../releases/changelog/changelog-v0.2.3.mdx | 2 +- .../releases/changelog/changelog-v0.3.0.mdx | 2 +- .../releases/changelog/changelog-v0.3.1.mdx | 2 +- .../releases/changelog/changelog-v0.3.2.mdx | 2 +- .../releases/changelog/changelog-v0.3.3.mdx | 2 +- .../releases/changelog/changelog-v0.4.0.mdx | 2 +- .../releases/changelog/changelog-v0.4.1.mdx | 2 +- .../releases/changelog/changelog-v0.4.2.mdx | 2 +- .../releases/changelog/changelog-v0.4.3.mdx | 2 +- .../releases/changelog/changelog-v0.4.4.mdx | 2 +- .../releases/changelog/changelog-v0.4.5.mdx | 2 +- .../releases/changelog/changelog-v0.4.6.mdx | 2 +- .../releases/changelog/changelog-v0.4.7.mdx | 2 +- docs/plugins/changelog-plugin/fetchData.js | 30 +++++++++++++++++++ 17 files changed, 76 insertions(+), 46 deletions(-) diff --git a/docs/docs/releases/changelog/changelog-v0.2.0.mdx b/docs/docs/releases/changelog/changelog-v0.2.0.mdx index 5e2225cf3..55a64bc48 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.0.mdx @@ -1,13 +1,13 @@ ---- -sidebar_position: 16 -slug: /changelog/changelog-v0.2.0 ---- -# v0.2.0 - -For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.0) - -Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs](https://github.com/janhq/jan/pull/342) - +--- +sidebar_position: 17 +slug: /changelog/changelog-v0.2.0 +--- +# v0.2.0 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.0) + +Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs](https://github.com/janhq/jan/pull/342) + ## Changes - feat: Add Jan Hacker House event page to Docs @dan-jan (#342) @@ -44,4 +44,4 @@ Highlighted Issue: [Issue #342: feat: Add Jan Hacker House event page to Docs]( ## Contributor @0xSage, @Its-Alamin-H, @dan-jan, @drakehere, @hiento09, @hientominh, @louis-jan, @namchuai, Hien To and James - + diff --git a/docs/docs/releases/changelog/changelog-v0.2.1.mdx b/docs/docs/releases/changelog/changelog-v0.2.1.mdx index 97e1052a3..e4e8960f6 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.1.mdx @@ -1,13 +1,13 @@ ---- -sidebar_position: 15 -slug: /changelog/changelog-v0.2.1 ---- -# v0.2.1 - -For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.1) - -Highlighted Issue: [Issue #446: fix: model is started but the indicator is not stopped loading](https://github.com/janhq/jan/pull/446) - +--- +sidebar_position: 16 +slug: /changelog/changelog-v0.2.1 +--- +# v0.2.1 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.1) + +Highlighted Issue: [Issue #446: fix: model is started but the indicator is not stopped loading](https://github.com/janhq/jan/pull/446) + ## Changes - fix: model is started but the indicator is not stopped loading @louis-jan (#446) @@ -90,4 +90,4 @@ Highlighted Issue: [Issue #446: fix: model is started but the indicator is not ## Contributor @0xSage, @dan-jan, @hiento09, @jan-service-account, @louis-jan, @nam-john-ho, @namchuai, @tikikun, @urmauur, @vuonghoainam and Hien To - + diff --git a/docs/docs/releases/changelog/changelog-v0.2.2.mdx b/docs/docs/releases/changelog/changelog-v0.2.2.mdx index 54d1a8bbf..6546033cd 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.2.mdx @@ -1,13 +1,13 @@ ---- -sidebar_position: 14 -slug: /changelog/changelog-v0.2.2 ---- -# v0.2.2 - -For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.2) - -Highlighted Issue: [Issue #469: chore: plugin and app version dependency](https://github.com/janhq/jan/pull/469) - +--- +sidebar_position: 15 +slug: /changelog/changelog-v0.2.2 +--- +# v0.2.2 + +For more details, [GitHub Issues](https://github.com/janhq/jan/releases/tag/v0.2.2) + +Highlighted Issue: [Issue #469: chore: plugin and app version dependency](https://github.com/janhq/jan/pull/469) + ## Changes - chore: plugin and app version dependency @louis-jan (#469) @@ -40,4 +40,4 @@ Highlighted Issue: [Issue #469: chore: plugin and app version dependency](https ## Contributor @hiento09, @jan-service-account, @louis-jan, @namchuai, @urmauur and @vuonghoainam - + diff --git a/docs/docs/releases/changelog/changelog-v0.2.3.mdx b/docs/docs/releases/changelog/changelog-v0.2.3.mdx index 72dfbbd8a..e450bffc5 100644 --- a/docs/docs/releases/changelog/changelog-v0.2.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.2.3.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 13 +sidebar_position: 14 slug: /changelog/changelog-v0.2.3 --- # v0.2.3 diff --git a/docs/docs/releases/changelog/changelog-v0.3.0.mdx b/docs/docs/releases/changelog/changelog-v0.3.0.mdx index 603cc8f29..6ef6acb42 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.0.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 12 +sidebar_position: 13 slug: /changelog/changelog-v0.3.0 --- # v0.3.0 diff --git a/docs/docs/releases/changelog/changelog-v0.3.1.mdx b/docs/docs/releases/changelog/changelog-v0.3.1.mdx index 531882196..b83bc88a7 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.1.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 11 +sidebar_position: 12 slug: /changelog/changelog-v0.3.1 --- # v0.3.1 diff --git a/docs/docs/releases/changelog/changelog-v0.3.2.mdx b/docs/docs/releases/changelog/changelog-v0.3.2.mdx index b62a878d1..acc19cc1a 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.2.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 10 +sidebar_position: 11 slug: /changelog/changelog-v0.3.2 --- # v0.3.2 diff --git a/docs/docs/releases/changelog/changelog-v0.3.3.mdx b/docs/docs/releases/changelog/changelog-v0.3.3.mdx index 66a871186..bdf4d1ec3 100644 --- a/docs/docs/releases/changelog/changelog-v0.3.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.3.3.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 9 +sidebar_position: 10 slug: /changelog/changelog-v0.3.3 --- # v0.3.3 diff --git a/docs/docs/releases/changelog/changelog-v0.4.0.mdx b/docs/docs/releases/changelog/changelog-v0.4.0.mdx index 142d55a60..c0225cc25 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.0.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.0.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 8 +sidebar_position: 9 slug: /changelog/changelog-v0.4.0 --- # v0.4.0 diff --git a/docs/docs/releases/changelog/changelog-v0.4.1.mdx b/docs/docs/releases/changelog/changelog-v0.4.1.mdx index 38be38b74..9e0300a4b 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.1.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.1.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 8 slug: /changelog/changelog-v0.4.1 --- # v0.4.1 diff --git a/docs/docs/releases/changelog/changelog-v0.4.2.mdx b/docs/docs/releases/changelog/changelog-v0.4.2.mdx index 77b15a555..7b2a1b81c 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.2.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.2.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 6 +sidebar_position: 7 slug: /changelog/changelog-v0.4.2 --- # v0.4.2 diff --git a/docs/docs/releases/changelog/changelog-v0.4.3.mdx b/docs/docs/releases/changelog/changelog-v0.4.3.mdx index d34c85f60..5703dbb6e 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.3.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.3.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 slug: /changelog/changelog-v0.4.3 --- # v0.4.3 diff --git a/docs/docs/releases/changelog/changelog-v0.4.4.mdx b/docs/docs/releases/changelog/changelog-v0.4.4.mdx index ea85cb2de..e21359e67 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.4.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.4.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 5 slug: /changelog/changelog-v0.4.4 --- # v0.4.4 diff --git a/docs/docs/releases/changelog/changelog-v0.4.5.mdx b/docs/docs/releases/changelog/changelog-v0.4.5.mdx index 4c9163dc7..370d37cc7 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.5.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.5.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 4 slug: /changelog/changelog-v0.4.5 --- # v0.4.5 diff --git a/docs/docs/releases/changelog/changelog-v0.4.6.mdx b/docs/docs/releases/changelog/changelog-v0.4.6.mdx index 58bbe258b..d836551e7 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.6.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.6.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 3 slug: /changelog/changelog-v0.4.6 --- # v0.4.6 diff --git a/docs/docs/releases/changelog/changelog-v0.4.7.mdx b/docs/docs/releases/changelog/changelog-v0.4.7.mdx index 57e5cfa16..b73ea828c 100644 --- a/docs/docs/releases/changelog/changelog-v0.4.7.mdx +++ b/docs/docs/releases/changelog/changelog-v0.4.7.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 1 +sidebar_position: 2 slug: /changelog/changelog-v0.4.7 --- # v0.4.7 diff --git a/docs/plugins/changelog-plugin/fetchData.js b/docs/plugins/changelog-plugin/fetchData.js index 3e2dffbfe..7c3620a53 100644 --- a/docs/plugins/changelog-plugin/fetchData.js +++ b/docs/plugins/changelog-plugin/fetchData.js @@ -68,6 +68,36 @@ async function fetchData(siteConfig, forceRefresh = false) { return; } + // Check if there are new releases + const newReleases = releases.filter(release => { + const version = release.tag_name; + const existingChangelogPath = path.join(outputDirectory, `changelog-${version}.mdx`); + return !fs.existsSync(existingChangelogPath); + }); + + // If there are new releases, update existing changelog files' sidebar positions + if (newReleases.length > 0) { + console.log(`Updating sidebar positions for ${newReleases.length} new releases...`); + const existingChangelogFiles = fs.readdirSync(outputDirectory) + .filter(file => file.startsWith('changelog-')); + + existingChangelogFiles.forEach((filename, index) => { + const version = filename.substring(10, filename.length - 4); + const existingChangelogPath = path.join(outputDirectory, filename); + const content = fs.readFileSync(existingChangelogPath, 'utf-8'); + const sidebarPositionMatch = content.match(/sidebar_position: (\d+)/); + let sidebarPosition = index + 1; + + if (sidebarPositionMatch) { + sidebarPosition = parseInt(sidebarPositionMatch[1]); + } + + const updatedContent = content.replace(/sidebar_position: (\d+)/, `sidebar_position: ${sidebarPosition}`); + fs.writeFileSync(existingChangelogPath, updatedContent, 'utf-8'); + console.log(`Sidebar position updated for changelog-${version}`); + }); + } + // Process the GitHub releases data here for (const release of releases) { const version = release.tag_name; From cb30cc5ce9fb2a3e4e4864df59af794b8ca653b5 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Fri, 15 Mar 2024 09:18:58 +0700 Subject: [PATCH 119/131] docs: api-reference fix the openapi-spec --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 6816def77..14b92fbce 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -113,7 +113,7 @@ const config = { ], //To input custom Plugin - // path.resolve(__dirname, 'plugins', 'changelog-plugin'), + path.resolve(__dirname, 'plugins', 'changelog-plugin'), [ '@scalar/docusaurus', { From 3e27e9711021fa7a996040c9e88266f9fb054cea Mon Sep 17 00:00:00 2001 From: NamH Date: Fri, 15 Mar 2024 10:33:59 +0700 Subject: [PATCH 120/131] fix: use model from model hub not load correct model in thread screen (#2368) Signed-off-by: James Co-authored-by: James --- web/hooks/useCreateNewThread.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/web/hooks/useCreateNewThread.ts b/web/hooks/useCreateNewThread.ts index 247c65c55..55faded37 100644 --- a/web/hooks/useCreateNewThread.ts +++ b/web/hooks/useCreateNewThread.ts @@ -74,11 +74,15 @@ export const useCreateNewThread = () => { const defaultModel = model ?? recommendedModel ?? downloadedModels[0] - // check last thread message, if there empty last message use can not create thread - const lastMessage = threads[0]?.metadata?.lastMessage + if (!model) { + // if we have model, which means user wants to create new thread from Model hub. Allow them. - if (!lastMessage && threads.length) { - return null + // check last thread message, if there empty last message use can not create thread + const lastMessage = threads[0]?.metadata?.lastMessage + + if (!lastMessage && threads.length) { + return null + } } // modify assistant tools when experimental on, retieval toggle enabled in default From 0a544a1ebb8dddf60a767e31fafef54ab2dfe19b Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:16:01 +0900 Subject: [PATCH 121/131] docs: update sidebar and faq --- docs/docs/about/faq.md | 8 ++++---- docs/sidebars.js | 15 +++++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/docs/about/faq.md b/docs/docs/about/faq.md index 0ab0944cc..29832e211 100644 --- a/docs/docs/about/faq.md +++ b/docs/docs/about/faq.md @@ -10,7 +10,7 @@ Download Jan to your computer, choose a compatible LLM, or connect to a remote A ## Is Jan compatible with my operating system? -Jan is available for Mac, Windows, Linux, ensuring wide compatibility. +Jan is available for Mac, Windows, and Linux, ensuring wide compatibility. ## Do you use my data? @@ -56,10 +56,10 @@ Joining [Jan's Discord server](https://discord.gg/qSwXFx6Krr) is a great way to For troubleshooting, you should reach out on Discord and check GitHub for assistance and support from the community and the development team. -## Can I self host? +## Can I self-host? -Yes! We love the self-hosted movement. Jan is available as a Helm chart / docker composes which can be run across home servers or even production level environments. +Yes! We love the self-hosted movement. Jan is available as a Helm chart/ Docker composes which can be run across home servers or even production-level environments. ## Are you hiring? -We often hire directly from our community. If you are interested to apply, please see our careers page [here](https://janai.bamboohr.com/careers). +We often hire directly from our community. If you are interested in applying, please see our careers page [here](https://janai.bamboohr.com/careers). diff --git a/docs/sidebars.js b/docs/sidebars.js index b95e4044f..beb7856a9 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -29,6 +29,13 @@ const sidebars = { link: { type: "doc", id: "team/team" }, items: ["team/join-us", "team/contributor-program"], }, + { + type: "category", + label: "FAQ", + link: { type: "doc", id: "about/faq" }, + items: + [], + }, "wall-of-love", { type: "category", @@ -222,10 +229,10 @@ const sidebars = { }, items: [ "guides/extensions/import-ext", - "guides/extensions/setup-ext", + "guides/extensions/setup-ext", ] }, - { + { type: "category", label: "Integrations", className: "head_SubMenu", @@ -233,7 +240,7 @@ const sidebars = { type: 'doc', id: "guides/integration/README", }, - items: [ + items: [ "guides/integration/azure", "guides/integration/discord", "guides/integration/groq", @@ -243,7 +250,7 @@ const sidebars = { "guides/integration/openinterpreter", "guides/integration/openrouter", "guides/integration/raycast", - "guides/integration/vscode", + "guides/integration/vscode", ] }, ] From a571c8be28ebebf00bd9f08b826ad333ad2ac922 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:26:59 +0900 Subject: [PATCH 122/131] docs: change order --- docs/sidebars.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/sidebars.js b/docs/sidebars.js index beb7856a9..a9eba0015 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -29,13 +29,6 @@ const sidebars = { link: { type: "doc", id: "team/team" }, items: ["team/join-us", "team/contributor-program"], }, - { - type: "category", - label: "FAQ", - link: { type: "doc", id: "about/faq" }, - items: - [], - }, "wall-of-love", { type: "category", @@ -59,6 +52,13 @@ const sidebars = { ], }, "acknowledgements", + { + type: "category", + label: "FAQ", + link: { type: "doc", id: "about/faq" }, + items: + [], + }, ], productSidebar: [ { From c1781c0be8274f1543b00da668081fcb7d5dfa94 Mon Sep 17 00:00:00 2001 From: Arista Indrajaya Date: Fri, 15 Mar 2024 15:56:26 +0700 Subject: [PATCH 123/131] docs: fix broken link by redirecting to the right paths --- docs/docusaurus.config.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 43334c988..dbbcbf064 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -108,6 +108,14 @@ const config = { from: "/install/", to: "/guides/install/", }, + { + from: "/guides/using-models/", + to: "/guides/models-setup/", + }, + { + from: "/guides/using-extensions/", + to: "/guides/extensions/", + }, ], }, ], From 8edb2ebb72b5b18c2ee2ec4c4f4645d3b460ea82 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 15 Mar 2024 18:33:15 +0900 Subject: [PATCH 124/131] feat: add jan.json --- docs/docusaurus.config.js | 6 +- docs/openapi/jan.json | 2486 +++++++++++++++++++++++++++++++++++++ 2 files changed, 2489 insertions(+), 3 deletions(-) create mode 100644 docs/openapi/jan.json diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 14b92fbce..72e90adf0 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -104,7 +104,7 @@ const config = { { from: "/troubleshooting/undefined-issue/", to: "/guides/error-codes/undefined-issue/", - }, { + }, { from: "/install/", to: "/guides/install/", }, @@ -121,10 +121,10 @@ const config = { route: '/api-reference', configuration: { spec: { - url: 'https://aindrajaya.github.io/openapi-spec/openapi.json', + url: 'https://raw.githubusercontent.com/janhq/jan/dev/docs/openapi/jan.json', }, }, - } + }, ], ], diff --git a/docs/openapi/jan.json b/docs/openapi/jan.json new file mode 100644 index 000000000..f4f511a18 --- /dev/null +++ b/docs/openapi/jan.json @@ -0,0 +1,2486 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "API Reference", + "description": "# Introduction\nJan API is compatible with the [OpenAI API](https://platform.openai.com/docs/api-reference).\n", + "version": "0.1.8", + "contact": { + "name": "Jan Discord", + "url": "https://discord.gg/7EcEz7MrvA" + }, + "license": { + "name": "AGPLv3", + "url": "https://github.com/janhq/nitro/blob/main/LICENSE" + } + }, + "servers": [ + { + "url": "http://localhost:1337/v1" + } + ], + "tags": [ + { + "name": "Models", + "description": "List and describe the various models available in the API." + }, + { + "name": "Chat", + "description": "Given a list of messages comprising a conversation, the model will return a response.\n" + }, + { + "name": "Messages", + "description": "Messages capture a conversation's content. This can include the content from LLM responses and other metadata from [chat completions](/specs/chats).\n" + }, + { + "name": "Threads" + }, + { + "name": "Assistants", + "description": "Configures and utilizes different AI assistants for varied tasks" + } + ], + "x-tagGroups": [ + { + "name": "Endpoints", + "tags": [ + "Models", + "Chat" + ] + }, + { + "name": "Chat", + "tags": [ + "Assistants", + "Messages", + "Threads" + ] + } + ], + "paths": { + "/chat/completions": { + "post": { + "operationId": "createChatCompletion", + "tags": [ + "Chat" + ], + "summary": "Create chat completion\n", + "description": "Creates a model response for the given chat conversation. Equivalent to OpenAI's create chat completion. \n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatCompletionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatCompletionResponse" + } + } + } + } + } + } + }, + "/models": { + "get": { + "operationId": "listModels", + "tags": [ + "Models" + ], + "summary": "List models", + "description": "Lists the currently available models, and provides basic information about each one such as the owner and availability. Equivalent to OpenAI's list model. \n", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListModelsResponse" + } + } + } + } + } + } + }, + "/models/download/{model_id}": { + "get": { + "operationId": "downloadModel", + "tags": [ + "Models" + ], + "summary": "Download a specific model.", + "description": "Download a model.\n", + "parameters": [ + { + "in": "path", + "name": "model_id", + "required": true, + "schema": { + "type": "string", + "example": "mistral-ins-7b-q4" + }, + "description": "The ID of the model to use for this request.\n" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DownloadModelResponse" + } + } + } + } + } + } + }, + "/models/{model_id}": { + "get": { + "operationId": "retrieveModel", + "tags": [ + "Models" + ], + "summary": "Retrieve model", + "description": "Get a model instance, providing basic information about the model such as the owner and permissioning. Equivalent to OpenAI's retrieve model. \n", + "parameters": [ + { + "in": "path", + "name": "model_id", + "required": true, + "schema": { + "type": "string", + "example": "mistral-ins-7b-q4" + }, + "description": "The ID of the model to use for this request.\n" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetModelResponse" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteModel", + "tags": [ + "Models" + ], + "summary": "Delete model", + "description": "Delete a model. Equivalent to OpenAI's delete model. \n", + "parameters": [ + { + "in": "path", + "name": "model_id", + "required": true, + "schema": { + "type": "string", + "example": "mistral-ins-7b-q4" + }, + "description": "The model id to delete\n" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteModelResponse" + } + } + } + } + } + } + }, + "/threads": { + "post": { + "operationId": "createThread", + "tags": [ + "Threads" + ], + "summary": "Create thread", + "description": "Create a thread. Equivalent to OpenAI's create thread. \n", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateThreadObject" + } + } + } + }, + "responses": { + "200": { + "description": "Thread created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateThreadResponse" + } + } + } + } + } + }, + "get": { + "operationId": "listThreads", + "tags": [ + "Threads" + ], + "summary": "List threads", + "description": "Retrieves a list of all threads available in the system.\n", + "responses": { + "200": { + "description": "List of threads retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ThreadObject" + }, + "example": [ + { + "id": "thread_abc123", + "object": "thread", + "created_at": 1699014083, + "assistants": [ + "assistant-001" + ], + "metadata": {}, + "messages": [] + }, + { + "id": "thread_abc456", + "object": "thread", + "created_at": 1699014083, + "assistants": [ + "assistant-002", + "assistant-003" + ], + "metadata": {} + } + ] + } + } + } + } + } + } + }, + "/threads/{thread_id}": { + "get": { + "operationId": "getThread", + "tags": [ + "Threads" + ], + "summary": "Retrieve thread", + "description": "Retrieves detailed information about a specific thread using its thread_id. Equivalent to OpenAI's retrieve thread. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to retrieve.\n" + } + ], + "responses": { + "200": { + "description": "Thread details retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetThreadResponse" + } + } + } + } + } + }, + "patch": { + "operationId": "modifyThread", + "tags": [ + "Threads" + ], + "summary": "Modify thread", + "description": "Modifies a thread. Equivalent to OpenAI's modify thread. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to be modified.\n" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Set the title of the thread", + "items": { + "$ref": "#/components/schemas/ThreadMessageObject" + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Thread modified successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModifyThreadResponse" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteThread", + "tags": [ + "Threads" + ], + "summary": "Delete thread", + "description": "Delete a thread. Equivalent to OpenAI's delete thread. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to be deleted.\n" + } + ], + "responses": { + "200": { + "description": "Thread deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteThreadResponse" + } + } + } + } + } + } + }, + "/assistants": { + "get": { + "operationId": "listAssistants", + "tags": [ + "Assistants" + ], + "summary": "List assistants", + "description": "Return a list of assistants. Equivalent to OpenAI's list assistants. \n", + "responses": { + "200": { + "description": "List of assistants retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "object": { + "type": "string" + }, + "version": { + "type": "integer" + }, + "created_at": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "avatar": { + "type": "string", + "format": "uri" + }, + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string" + } + } + } + }, + "instructions": { + "type": "string" + }, + "events": { + "type": "object", + "properties": { + "in": { + "type": "array", + "items": {} + }, + "out": { + "type": "array", + "items": {} + } + } + }, + "metadata": { + "type": "object" + }, + "x-codeSamples": { + "type": "object", + "properties": { + "cURL": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "example": "cURL" + }, + "source": { + "type": "string", + "example": "curl http://localhost:1337/v1/assistants \\\n -H \"Content-Type: application/json\"\n" + } + } + }, + "JavaScript": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "example": "JavaScript" + }, + "source": { + "type": "string", + "example": "fetch('http://localhost:1337/v1/assistants', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n})\n" + } + } + }, + "Node.js": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "example": "Node.js" + }, + "source": { + "type": "string", + "example": "const fetch = require('node-fetch');\n\nfetch('http://localhost:1337/v1/assistants', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n})\n" + } + } + }, + "Python": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "example": "Python" + }, + "source": { + "type": "string", + "example": "import requests\n\nurl = 'http://localhost:1337/v1/assistants'\nheaders = {'Content-Type': 'application/json'}\n\nresponse = requests.get(url, headers=headers)\n" + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/assistants/{assistant_id}": { + "get": { + "operationId": "getAssistant", + "tags": [ + "Assistants" + ], + "summary": "Retrieve assistant", + "description": "Retrieves an assistant. Equivalent to OpenAI's retrieve assistants. \n", + "parameters": [ + { + "in": "path", + "name": "assistant_id", + "required": true, + "schema": { + "type": "string", + "example": "jan" + }, + "description": "The ID of the assistant to retrieve.\n" + } + ], + "responses": { + "200": { + "description": "string", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RetrieveAssistantResponse" + } + } + } + } + } + } + }, + "/threads/{thread_id}/messages": { + "get": { + "operationId": "listMessages", + "tags": [ + "Messages" + ], + "summary": "List messages", + "description": "Retrieves all messages from the given thread. Equivalent to OpenAI's list messages. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread from which to retrieve messages.\n" + } + ], + "responses": { + "200": { + "description": "List of messages retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListMessagesResponse" + } + } + } + } + } + }, + "post": { + "operationId": "createMessage", + "tags": [ + "Messages" + ], + "summary": "Create message", + "description": "Create a message. Equivalent to OpenAI's list messages. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to which the message will be posted.\n" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.\n", + "example": "user", + "enum": [ + "user", + "assistant" + ] + }, + "content": { + "type": "string", + "description": "Text content of the message.\n", + "example": "How does AI work? Explain it in simple terms." + } + }, + "required": [ + "role", + "content" + ] + } + } + } + }, + "responses": { + "200": { + "description": "Message created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMessageResponse" + } + } + } + } + } + } + }, + "/threads/{thread_id}/messages/{message_id}": { + "get": { + "operationId": "retrieveMessage", + "tags": [ + "Messages" + ], + "summary": "Retrieve message", + "description": "Retrieve a specific message from a thread using its thread_id and message_id. Equivalent to OpenAI's retrieve messages. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread containing the message.\n" + }, + { + "in": "path", + "name": "message_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the message to retrieve.\n" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetMessageResponse" + } + } + } + } + } + } + } + }, + "x-webhooks": { + "ModelObject": { + "post": { + "summary": "The model object", + "description": "Describe a model offering that can be used with the API. Equivalent to OpenAI's model object. \n", + "operationId": "ModelObject", + "tags": [ + "Models" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelObject" + } + } + } + } + } + }, + "AssistantObject": { + "post": { + "summary": "The assistant object", + "description": "Build assistants that can call models and use tools to perform tasks. Equivalent to OpenAI's assistants object. \n", + "operationId": "AssistantObjects", + "tags": [ + "Assistants" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssistantObject" + } + } + } + } + } + }, + "MessageObject": { + "post": { + "summary": "The message object", + "description": "Information about a message in the thread. Equivalent to OpenAI's message object. \n", + "operationId": "MessageObject", + "tags": [ + "Messages" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": null + } + } + } + } + } + }, + "ThreadObject": { + "post": { + "summary": "The thread object", + "description": "Represents a thread that contains messages. Equivalent to OpenAI's thread object. ", + "operationId": "ThreadObject", + "tags": [ + "Threads" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": null + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ThreadObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the thread, defaults to foldername.\n", + "example": "thread_...." + }, + "object": { + "type": "string", + "description": "Type of the object, defaults to thread.\n", + "example": "thread" + }, + "title": { + "type": "string", + "description": "A brief summary or description of the thread, defaults to an empty string.\n", + "example": "funny physics joke" + }, + "assistants": { + "type": "array", + "description": "", + "items": { + "properties": { + "assistant_id": { + "type": "string", + "description": "The identifier of assistant, defaults to \"jan\"\n", + "example": "jan" + }, + "model": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "", + "example": "..." + }, + "settings": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"settings\" (and if none, then model.json \"settings\")\n" + }, + "parameters": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"parameters\" (and if none, then model.json \"parameters\")\n" + } + } + } + } + } + }, + "created": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread, defaults to file creation time.\n", + "example": 1231231 + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the thread, defaults to an empty object.\n", + "example": {} + } + } + }, + "GetThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the thread.", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object", + "example": "thread" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread.", + "example": 1699014083 + }, + "assistants": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of assistants involved in the thread.", + "example": [ + "assistant-001" + ] + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the thread.", + "example": {} + }, + "messages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of messages within the thread.", + "example": [] + } + } + }, + "CreateThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the newly created thread.", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread.", + "example": "thread" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread.", + "example": 1699014083 + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the newly created thread.", + "example": {} + } + } + }, + "CreateThreadObject": { + "type": "object", + "properties": { + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread.", + "example": "thread" + }, + "title": { + "type": "string", + "description": "A brief summary or description of the thread, defaults to an empty string.\n", + "example": "funny physics joke" + }, + "assistants": { + "type": "array", + "description": "assistant involved in the thread", + "items": { + "properties": { + "assistant_id": { + "type": "string", + "description": "The identifier of assistant, defaults to \"jan\"\n", + "example": "jan" + }, + "assistant_name": { + "type": "string", + "description": "The name of assistant, defaults to \"Jan\"\n", + "example": "Jan" + }, + "instructions": { + "type": "string", + "description": "The instruction of assistant, defaults to \"Be my grammar corrector\"\n" + }, + "model": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Model id", + "example": "mistral-ins-7b-q4" + }, + "settings": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"settings\" (and if none, then model.json \"settings\")\n" + }, + "parameters": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"parameters\" (and if none, then model.json \"parameters\")\n" + }, + "engine": { + "type": "string", + "description": "Engine id", + "example": "nitro" + } + } + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the thread, defaults to an empty object.\n" + } + } + }, + "ThreadMessageObject": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "\"Role of the sender, either 'user' or 'assistant'.\"\n", + "enum": [ + "user", + "assistant" + ] + }, + "content": { + "type": "string", + "description": "\"Text content of the message.\"\n" + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\"Array of file IDs associated with the message, if any.\"\n" + } + } + }, + "ModifyThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "\"The identifier of the modified thread.\"\n", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread.", + "example": "thread" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread.", + "example": 1699014083 + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the modified thread.", + "example": {} + } + } + }, + "DeleteThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the deleted thread.", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating the thread has been deleted.", + "example": "thread.deleted" + }, + "deleted": { + "type": "boolean", + "description": "Indicates whether the thread was successfully deleted.", + "example": true + } + } + }, + "ListModelsResponse": { + "type": "object", + "properties": { + "object": { + "type": "string", + "enum": [ + "list" + ] + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Model" + } + } + }, + "required": [ + "object", + "data" + ] + }, + "Model": { + "type": "object", + "properties": { + "source_url": { + "type": "string", + "format": "uri", + "description": "URL to the source of the model.", + "example": "https://huggingface.co/janhq/trinity-v1.2-GGUF/resolve/main/trinity-v1.2.Q4_K_M.gguf" + }, + "id": { + "type": "string", + "description": "Unique identifier used in chat-completions model_name, matches folder name.", + "example": "trinity-v1.2-7b" + }, + "object": { + "type": "string", + "example": "model" + }, + "name": { + "type": "string", + "description": "Name of the model.", + "example": "Trinity-v1.2 7B Q4" + }, + "version": { + "type": "string", + "default": "1.0", + "description": "The version number of the model." + }, + "description": { + "type": "string", + "description": "Description of the model.", + "example": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes." + }, + "format": { + "type": "string", + "description": "State format of the model, distinct from the engine.", + "example": "gguf" + }, + "settings": { + "type": "object", + "properties": { + "ctx_len": { + "type": "integer", + "description": "Context length.", + "example": 4096 + }, + "prompt_template": { + "type": "string", + "example": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" + } + }, + "additionalProperties": false + }, + "parameters": { + "type": "object", + "properties": { + "temperature": { + "example": 0.7 + }, + "top_p": { + "example": 0.95 + }, + "stream": { + "example": true + }, + "max_tokens": { + "example": 4096 + }, + "stop": { + "example": [] + }, + "frequency_penalty": { + "example": 0 + }, + "presence_penalty": { + "example": 0 + } + }, + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "author": { + "type": "string", + "example": "Jan" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "7B", + "Merged", + "Featured" + ] + }, + "size": { + "type": "integer", + "example": 4370000000 + }, + "cover": { + "type": "string", + "format": "uri", + "example": "https://raw.githubusercontent.com/janhq/jan/main/models/trinity-v1.2-7b/cover.png" + } + }, + "additionalProperties": false + }, + "engine": { + "example": "nitro" + } + } + }, + "ModelObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model.\n", + "example": "trinity-v1.2-7b" + }, + "object": { + "type": "string", + "description": "The type of the object, indicating it's a model.\n", + "default": "model" + }, + "created": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the model.\n", + "example": 1253935178 + }, + "owned_by": { + "type": "string", + "description": "The entity that owns the model.\n", + "example": "_" + } + } + }, + "GetModelResponse": { + "type": "object", + "properties": { + "source_url": { + "type": "string", + "format": "uri", + "description": "URL to the source of the model.", + "example": "https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf" + }, + "id": { + "type": "string", + "description": "Unique identifier used in chat-completions model_name, matches folder name.", + "example": "mistral-ins-7b-q4" + }, + "object": { + "type": "string", + "example": "model" + }, + "name": { + "type": "string", + "description": "Name of the model.", + "example": "Mistral Instruct 7B Q4" + }, + "version": { + "type": "string", + "default": "1.0", + "description": "The version number of the model." + }, + "description": { + "type": "string", + "description": "Description of the model.", + "example": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes." + }, + "format": { + "type": "string", + "description": "State format of the model, distinct from the engine.", + "example": "gguf" + }, + "settings": { + "type": "object", + "properties": { + "ctx_len": { + "type": "integer", + "description": "Context length.", + "example": 4096 + }, + "prompt_template": { + "type": "string", + "example": "[INST] {prompt} [/INST]" + } + }, + "additionalProperties": false + }, + "parameters": { + "type": "object", + "properties": { + "temperature": { + "example": 0.7 + }, + "top_p": { + "example": 0.95 + }, + "stream": { + "example": true + }, + "max_tokens": { + "example": 4096 + }, + "stop": { + "example": [] + }, + "frequency_penalty": { + "example": 0 + }, + "presence_penalty": { + "example": 0 + } + }, + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "author": { + "type": "string", + "example": "MistralAI" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "7B", + "Featured", + "Foundation Model" + ] + }, + "size": { + "example": 4370000000, + "type": "integer" + }, + "cover": { + "example": "https://raw.githubusercontent.com/janhq/jan/main/models/mistral-ins-7b-q4/cover.png", + "type": "string" + } + }, + "additionalProperties": false + }, + "engine": { + "example": "nitro" + } + } + }, + "DeleteModelResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model that was deleted.", + "example": "mistral-ins-7b-q4" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a model.", + "default": "model" + }, + "deleted": { + "type": "boolean", + "description": "Indicates whether the model was successfully deleted.", + "example": true + } + } + }, + "StartModelResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model that was started.", + "example": "model-zephyr-7B" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a model.", + "default": "model" + }, + "state": { + "type": "string", + "description": "The current state of the model after the start operation.", + "example": "running" + } + }, + "required": [ + "id", + "object", + "state" + ] + }, + "StopModelResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model that was started.", + "example": "model-zephyr-7B" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a model.", + "default": "model" + }, + "state": { + "type": "string", + "description": "The current state of the model after the start operation.", + "example": "stopped" + } + }, + "required": [ + "id", + "object", + "state" + ] + }, + "DownloadModelResponse": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message indicates Jan starting download corresponding model.", + "example": "Starting download mistral-ins-7b-q4" + } + } + }, + "MessageObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Sequential or UUID identifier of the message.\n", + "example": 0 + }, + "object": { + "type": "string", + "description": "Type of the object, defaults to 'thread.message'.\n", + "example": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.\n" + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs. Defaults to parent thread.\n", + "example": "thread_asdf" + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message. Defaults to parent thread.\n", + "example": "jan" + }, + "role": { + "type": "string", + "enum": [ + "user", + "assistant" + ], + "description": "Role of the sender, either 'user' or 'assistant'.\n" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'.\n" + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.\n", + "example": "Hi!?" + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any.\n", + "example": [] + } + } + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message, defaults to an empty object.\n", + "example": {} + } + } + }, + "GetMessageResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the message.", + "example": "msg_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message.", + "default": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.", + "example": 1699017614 + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs.", + "example": "thread_abc123" + }, + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.", + "example": "user" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'.", + "example": "text" + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.", + "example": "How does AI work? Explain it in simple terms." + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any.", + "example": [] + } + } + } + } + } + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of file IDs associated with the message, if any.", + "example": [] + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message, if applicable.", + "example": null + }, + "run_id": { + "type": "string", + "description": "Run ID associated with the message, if applicable.", + "example": null + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message.", + "example": {} + } + } + }, + "CreateMessageResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the created message.", + "example": "msg_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message.", + "example": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.", + "example": 1699017614 + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs.", + "example": "thread_abc123" + }, + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.", + "example": "user" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'.", + "example": "text" + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.", + "example": "How does AI work? Explain it in simple terms." + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any.", + "example": [] + } + } + } + } + } + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of file IDs associated with the message, if any.", + "example": [] + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message, if applicable.", + "example": null + }, + "run_id": { + "type": "string", + "description": "Run ID associated with the message, if applicable.", + "example": null + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message.", + "example": {} + } + } + }, + "ListMessagesResponse": { + "type": "object", + "properties": { + "object": { + "type": "string", + "description": "Type of the object, indicating it's a list.", + "default": "list" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ListMessageObject" + } + }, + "first_id": { + "type": "string", + "description": "Identifier of the first message in the list.", + "example": "msg_abc123" + }, + "last_id": { + "type": "string", + "description": "Identifier of the last message in the list.", + "example": "msg_abc456" + }, + "has_more": { + "type": "boolean", + "description": "Indicates whether there are more messages to retrieve.", + "example": false + } + } + }, + "ListMessageObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the message.", + "example": "msg_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message.", + "example": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.", + "example": 1699017614 + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs.", + "example": "thread_abc123" + }, + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.", + "example": "user" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'." + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.", + "example": "How does AI work? Explain it in simple terms." + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any." + } + } + } + } + } + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of file IDs associated with the message, if any.", + "example": [] + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message, if applicable.", + "example": null + }, + "run_id": { + "type": "string", + "description": "Run ID associated with the message, if applicable.", + "example": null + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message.", + "example": {} + } + } + }, + "MessageFileObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the file.", + "example": "file-abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message file.", + "example": "thread.message.file" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the file.", + "example": 1699061776 + }, + "message_id": { + "type": "string", + "description": "Identifier of the message to which this file is associated.", + "example": "msg_abc123" + } + } + }, + "ListMessageFilesResponse": { + "type": "object", + "properties": { + "object": { + "type": "string", + "description": "Type of the object, indicating it's a list.", + "default": "list" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageFileObject" + } + } + } + }, + "ChatObject": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Contains input data or prompts for the model to process.\n", + "items": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "role": { + "type": "string" + } + } + }, + "example": [ + { + "content": "Hello there :wave:", + "role": "assistant" + }, + { + "content": "Can you write a long story", + "role": "user" + } + ] + }, + "stream": { + "type": "boolean", + "default": true, + "description": "Enables continuous output generation, allowing for streaming of model responses." + }, + "model": { + "type": "string", + "example": "gpt-3.5-turbo", + "description": "Specifies the model being used for inference or processing tasks." + }, + "max_tokens": { + "type": "number", + "default": 2048, + "description": "The maximum number of tokens the model will generate in a single response." + }, + "stop": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines specific tokens or phrases at which the model will stop generating further output.", + "example": [ + "hello" + ] + }, + "frequency_penalty": { + "type": "number", + "default": 0, + "description": "Adjusts the likelihood of the model repeating words or phrases in its output." + }, + "presence_penalty": { + "type": "number", + "default": 0, + "description": "Influences the generation of new and varied concepts in the model's output." + }, + "temperature": { + "type": "number", + "default": 0.7, + "description": "Controls the randomness of the model's output." + }, + "top_p": { + "type": "number", + "default": 0.95, + "description": "Set probability threshold for more relevant outputs." + }, + "cache_prompt": { + "type": "boolean", + "default": true, + "description": "Optimize performance in repeated or similar requests." + } + } + }, + "ChatCompletionRequest": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Contains input data or prompts for the model to process.\n", + "items": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "role": { + "type": "string" + } + } + }, + "example": [ + { + "content": "You are a helpful assistant.", + "role": "system" + }, + { + "content": "Hello!", + "role": "user" + } + ] + }, + "model": { + "type": "string", + "example": "tinyllama-1.1b", + "description": "Specifies the model being used for inference or processing tasks.\n" + }, + "stream": { + "type": "boolean", + "default": true, + "description": "Enables continuous output generation, allowing for streaming of model responses.\n" + }, + "max_tokens": { + "type": "number", + "default": 2048, + "description": "The maximum number of tokens the model will generate in a single response.\n" + }, + "stop": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines specific tokens or phrases at which the model will stop generating further output.\n", + "example": [ + "hello" + ] + }, + "frequency_penalty": { + "type": "number", + "default": 0, + "description": "Adjusts the likelihood of the model repeating words or phrases in its output.\n" + }, + "presence_penalty": { + "type": "number", + "default": 0, + "description": "Influences the generation of new and varied concepts in the model's output.\n" + }, + "temperature": { + "type": "number", + "default": 0.7, + "description": "Controls the randomness of the model's output.\n" + }, + "top_p": { + "type": "number", + "default": 0.95, + "description": "Set probability threshold for more relevant outputs.\n" + } + } + }, + "ChatCompletionResponse": { + "type": "object", + "description": "Description of the response structure", + "properties": { + "choices": { + "type": "array", + "description": "Array of choice objects", + "items": { + "type": "object", + "properties": { + "finish_reason": { + "type": "string", + "nullable": true, + "example": null, + "description": "Reason for finishing the response, if applicable" + }, + "index": { + "type": "integer", + "example": 0, + "description": "Index of the choice" + }, + "message": { + "type": "object", + "properties": { + "content": { + "type": "string", + "example": "Hello user. What can I help you with?", + "description": "Content of the message" + }, + "role": { + "type": "string", + "example": "assistant", + "description": "Role of the sender" + } + } + } + } + } + }, + "created": { + "type": "integer", + "example": 1700193928, + "description": "Timestamp of when the response was created" + }, + "id": { + "type": "string", + "example": "ebwd2niJvJB1Q2Whyvkz", + "description": "Unique identifier of the response" + }, + "model": { + "type": "string", + "nullable": true, + "example": "_", + "description": "Model used for generating the response" + }, + "object": { + "type": "string", + "example": "chat.completion", + "description": "Type of the response object" + }, + "system_fingerprint": { + "type": "string", + "nullable": true, + "example": "_", + "description": "System fingerprint" + }, + "usage": { + "type": "object", + "description": "Information about the usage of tokens", + "properties": { + "completion_tokens": { + "type": "integer", + "example": 500, + "description": "Number of tokens used for completion" + }, + "prompt_tokens": { + "type": "integer", + "example": 33, + "description": "Number of tokens used in the prompt" + }, + "total_tokens": { + "type": "integer", + "example": 533, + "description": "Total number of tokens used" + } + } + } + } + }, + "AssistantObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string", + "example": "model_0" + } + } + } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "ListAssistantsResponse": { + "type": "object" + }, + "CreateAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string", + "example": "model_0" + } + } + } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "RetrieveAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string", + "example": "model_0" + } + } + } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "ModifyAssistantObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string", + "example": "model_0" + } + } + } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "ModifyAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Physics Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string", + "example": "model_0" + } + } + } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise!" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "DeleteAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the deleted assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating the assistant has been deleted.", + "example": "assistant.deleted" + }, + "deleted": { + "type": "boolean", + "description": "Indicates whether the assistant was successfully deleted.", + "example": true + } + } + } + } + } + } \ No newline at end of file From 2d622614bfdc9b734bf2a78282b2cf59eac52c7e Mon Sep 17 00:00:00 2001 From: Louis Date: Fri, 15 Mar 2024 16:37:00 +0700 Subject: [PATCH 125/131] Update models.json (#2382) --- extensions/tensorrt-llm-extension/models.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/tensorrt-llm-extension/models.json b/extensions/tensorrt-llm-extension/models.json index 30f345f47..7f95940b7 100644 --- a/extensions/tensorrt-llm-extension/models.json +++ b/extensions/tensorrt-llm-extension/models.json @@ -50,27 +50,27 @@ "sources": [ { "filename": "config.json", - "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/config.json" + "url": "https://delta.jan.ai/dist/models///TinyJensen-1.1B-Chat-fp16/config.json" }, { "filename": "rank0.engine", - "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/rank0.engine" + "url": "https://delta.jan.ai/dist/models///TinyJensen-1.1B-Chat-fp16/rank0.engine" }, { "filename": "tokenizer.model", - "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/tokenizer.model" + "url": "https://delta.jan.ai/dist/models///TinyJensen-1.1B-Chat-fp16/tokenizer.model" }, { "filename": "special_tokens_map.json", - "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/special_tokens_map.json" + "url": "https://delta.jan.ai/dist/models///TinyJensen-1.1B-Chat-fp16/special_tokens_map.json" }, { "filename": "tokenizer.json", - "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/tokenizer.json" + "url": "https://delta.jan.ai/dist/models///TinyJensen-1.1B-Chat-fp16/tokenizer.json" }, { "filename": "tokenizer_config.json", - "url": "https://delta.jan.ai/dist/models/turing/windows/TinyJensen-1.1B-Chat-fp16/tokenizer_config.json" + "url": "https://delta.jan.ai/dist/models///TinyJensen-1.1B-Chat-fp16/tokenizer_config.json" } ], "id": "tinyjensen-1.1b-chat-fp16", From 6bb9c1f5f998c5c54c79be144c89a29173c2a541 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Fri, 15 Mar 2024 18:46:06 +0900 Subject: [PATCH 126/131] chore: format json file --- docs/openapi/jan.json | 4760 ++++++++++++++++++++--------------------- 1 file changed, 2380 insertions(+), 2380 deletions(-) diff --git a/docs/openapi/jan.json b/docs/openapi/jan.json index f4f511a18..5cca59813 100644 --- a/docs/openapi/jan.json +++ b/docs/openapi/jan.json @@ -1,529 +1,528 @@ { - "openapi": "3.0.0", - "info": { - "title": "API Reference", - "description": "# Introduction\nJan API is compatible with the [OpenAI API](https://platform.openai.com/docs/api-reference).\n", - "version": "0.1.8", - "contact": { - "name": "Jan Discord", - "url": "https://discord.gg/7EcEz7MrvA" - }, - "license": { - "name": "AGPLv3", - "url": "https://github.com/janhq/nitro/blob/main/LICENSE" + "openapi": "3.0.0", + "info": { + "title": "API Reference", + "description": "# Introduction\nJan API is compatible with the [OpenAI API](https://platform.openai.com/docs/api-reference).\n", + "version": "0.1.8", + "contact": { + "name": "Jan Discord", + "url": "https://discord.gg/7EcEz7MrvA" + }, + "license": { + "name": "AGPLv3", + "url": "https://github.com/janhq/nitro/blob/main/LICENSE" + } + }, + "servers": [ + { + "url": "http://localhost:1337/v1" + } + ], + "tags": [ + { + "name": "Models", + "description": "List and describe the various models available in the API." + }, + { + "name": "Chat", + "description": "Given a list of messages comprising a conversation, the model will return a response.\n" + }, + { + "name": "Messages", + "description": "Messages capture a conversation's content. This can include the content from LLM responses and other metadata from [chat completions](/specs/chats).\n" + }, + { + "name": "Threads" + }, + { + "name": "Assistants", + "description": "Configures and utilizes different AI assistants for varied tasks" + } + ], + "x-tagGroups": [ + { + "name": "Endpoints", + "tags": [ + "Models", + "Chat" + ] + }, + { + "name": "Chat", + "tags": [ + "Assistants", + "Messages", + "Threads" + ] + } + ], + "paths": { + "/chat/completions": { + "post": { + "operationId": "createChatCompletion", + "tags": [ + "Chat" + ], + "summary": "Create chat completion\n", + "description": "Creates a model response for the given chat conversation. Equivalent to OpenAI's create chat completion. \n", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatCompletionRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatCompletionResponse" + } + } + } + } + } } }, - "servers": [ - { - "url": "http://localhost:1337/v1" - } - ], - "tags": [ - { - "name": "Models", - "description": "List and describe the various models available in the API." - }, - { - "name": "Chat", - "description": "Given a list of messages comprising a conversation, the model will return a response.\n" - }, - { - "name": "Messages", - "description": "Messages capture a conversation's content. This can include the content from LLM responses and other metadata from [chat completions](/specs/chats).\n" - }, - { - "name": "Threads" - }, - { - "name": "Assistants", - "description": "Configures and utilizes different AI assistants for varied tasks" - } - ], - "x-tagGroups": [ - { - "name": "Endpoints", + "/models": { + "get": { + "operationId": "listModels", "tags": [ - "Models", - "Chat" - ] - }, - { - "name": "Chat", - "tags": [ - "Assistants", - "Messages", - "Threads" - ] - } - ], - "paths": { - "/chat/completions": { - "post": { - "operationId": "createChatCompletion", - "tags": [ - "Chat" - ], - "summary": "Create chat completion\n", - "description": "Creates a model response for the given chat conversation. Equivalent to OpenAI's create chat completion. \n", - "requestBody": { + "Models" + ], + "summary": "List models", + "description": "Lists the currently available models, and provides basic information about each one such as the owner and availability. Equivalent to OpenAI's list model. \n", + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ChatCompletionRequest" - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChatCompletionResponse" - } + "$ref": "#/components/schemas/ListModelsResponse" } } } } } - }, - "/models": { - "get": { - "operationId": "listModels", - "tags": [ - "Models" - ], - "summary": "List models", - "description": "Lists the currently available models, and provides basic information about each one such as the owner and availability. Equivalent to OpenAI's list model. \n", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListModelsResponse" - } - } - } - } - } - } - }, - "/models/download/{model_id}": { - "get": { - "operationId": "downloadModel", - "tags": [ - "Models" - ], - "summary": "Download a specific model.", - "description": "Download a model.\n", - "parameters": [ - { - "in": "path", - "name": "model_id", - "required": true, - "schema": { - "type": "string", - "example": "mistral-ins-7b-q4" - }, - "description": "The ID of the model to use for this request.\n" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DownloadModelResponse" - } - } - } - } - } - } - }, - "/models/{model_id}": { - "get": { - "operationId": "retrieveModel", - "tags": [ - "Models" - ], - "summary": "Retrieve model", - "description": "Get a model instance, providing basic information about the model such as the owner and permissioning. Equivalent to OpenAI's retrieve model. \n", - "parameters": [ - { - "in": "path", - "name": "model_id", - "required": true, - "schema": { - "type": "string", - "example": "mistral-ins-7b-q4" - }, - "description": "The ID of the model to use for this request.\n" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetModelResponse" - } - } - } - } - } - }, - "delete": { - "operationId": "deleteModel", - "tags": [ - "Models" - ], - "summary": "Delete model", - "description": "Delete a model. Equivalent to OpenAI's delete model. \n", - "parameters": [ - { - "in": "path", - "name": "model_id", - "required": true, - "schema": { - "type": "string", - "example": "mistral-ins-7b-q4" - }, - "description": "The model id to delete\n" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteModelResponse" - } - } - } - } - } - } - }, - "/threads": { - "post": { - "operationId": "createThread", - "tags": [ - "Threads" - ], - "summary": "Create thread", - "description": "Create a thread. Equivalent to OpenAI's create thread. \n", - "requestBody": { - "required": false, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateThreadObject" - } - } - } - }, - "responses": { - "200": { - "description": "Thread created successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateThreadResponse" - } - } - } - } - } - }, - "get": { - "operationId": "listThreads", - "tags": [ - "Threads" - ], - "summary": "List threads", - "description": "Retrieves a list of all threads available in the system.\n", - "responses": { - "200": { - "description": "List of threads retrieved successfully", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ThreadObject" - }, - "example": [ - { - "id": "thread_abc123", - "object": "thread", - "created_at": 1699014083, - "assistants": [ - "assistant-001" - ], - "metadata": {}, - "messages": [] - }, - { - "id": "thread_abc456", - "object": "thread", - "created_at": 1699014083, - "assistants": [ - "assistant-002", - "assistant-003" - ], - "metadata": {} - } - ] - } - } - } - } - } - } - }, - "/threads/{thread_id}": { - "get": { - "operationId": "getThread", - "tags": [ - "Threads" - ], - "summary": "Retrieve thread", - "description": "Retrieves detailed information about a specific thread using its thread_id. Equivalent to OpenAI's retrieve thread. \n", - "parameters": [ - { - "in": "path", - "name": "thread_id", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the thread to retrieve.\n" - } - ], - "responses": { - "200": { - "description": "Thread details retrieved successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetThreadResponse" - } - } - } - } - } - }, - "patch": { - "operationId": "modifyThread", - "tags": [ - "Threads" - ], - "summary": "Modify thread", - "description": "Modifies a thread. Equivalent to OpenAI's modify thread. \n", - "parameters": [ - { - "in": "path", - "name": "thread_id", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the thread to be modified.\n" - } - ], - "requestBody": { + } + }, + "/models/download/{model_id}": { + "get": { + "operationId": "downloadModel", + "tags": [ + "Models" + ], + "summary": "Download a specific model.", + "description": "Download a model.\n", + "parameters": [ + { + "in": "path", + "name": "model_id", "required": true, + "schema": { + "type": "string", + "example": "mistral-ins-7b-q4" + }, + "description": "The ID of the model to use for this request.\n" + } + ], + "responses": { + "200": { + "description": "OK", "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "title": { - "type": "string", - "description": "Set the title of the thread", - "items": { - "$ref": "#/components/schemas/ThreadMessageObject" - } + "$ref": "#/components/schemas/DownloadModelResponse" + } + } + } + } + } + } + }, + "/models/{model_id}": { + "get": { + "operationId": "retrieveModel", + "tags": [ + "Models" + ], + "summary": "Retrieve model", + "description": "Get a model instance, providing basic information about the model such as the owner and permissioning. Equivalent to OpenAI's retrieve model. \n", + "parameters": [ + { + "in": "path", + "name": "model_id", + "required": true, + "schema": { + "type": "string", + "example": "mistral-ins-7b-q4" + }, + "description": "The ID of the model to use for this request.\n" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetModelResponse" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteModel", + "tags": [ + "Models" + ], + "summary": "Delete model", + "description": "Delete a model. Equivalent to OpenAI's delete model. \n", + "parameters": [ + { + "in": "path", + "name": "model_id", + "required": true, + "schema": { + "type": "string", + "example": "mistral-ins-7b-q4" + }, + "description": "The model id to delete\n" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteModelResponse" + } + } + } + } + } + } + }, + "/threads": { + "post": { + "operationId": "createThread", + "tags": [ + "Threads" + ], + "summary": "Create thread", + "description": "Create a thread. Equivalent to OpenAI's create thread. \n", + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateThreadObject" + } + } + } + }, + "responses": { + "200": { + "description": "Thread created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateThreadResponse" + } + } + } + } + } + }, + "get": { + "operationId": "listThreads", + "tags": [ + "Threads" + ], + "summary": "List threads", + "description": "Retrieves a list of all threads available in the system.\n", + "responses": { + "200": { + "description": "List of threads retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ThreadObject" + }, + "example": [ + { + "id": "thread_abc123", + "object": "thread", + "created_at": 1699014083, + "assistants": [ + "assistant-001" + ], + "metadata": {}, + "messages": [] + }, + { + "id": "thread_abc456", + "object": "thread", + "created_at": 1699014083, + "assistants": [ + "assistant-002", + "assistant-003" + ], + "metadata": {} + } + ] + } + } + } + } + } + } + }, + "/threads/{thread_id}": { + "get": { + "operationId": "getThread", + "tags": [ + "Threads" + ], + "summary": "Retrieve thread", + "description": "Retrieves detailed information about a specific thread using its thread_id. Equivalent to OpenAI's retrieve thread. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to retrieve.\n" + } + ], + "responses": { + "200": { + "description": "Thread details retrieved successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetThreadResponse" + } + } + } + } + } + }, + "patch": { + "operationId": "modifyThread", + "tags": [ + "Threads" + ], + "summary": "Modify thread", + "description": "Modifies a thread. Equivalent to OpenAI's modify thread. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to be modified.\n" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Set the title of the thread", + "items": { + "$ref": "#/components/schemas/ThreadMessageObject" } } } } } - }, - "responses": { - "200": { - "description": "Thread modified successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModifyThreadResponse" - } - } - } - } } }, - "delete": { - "operationId": "deleteThread", - "tags": [ - "Threads" - ], - "summary": "Delete thread", - "description": "Delete a thread. Equivalent to OpenAI's delete thread. \n", - "parameters": [ - { - "in": "path", - "name": "thread_id", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the thread to be deleted.\n" - } - ], - "responses": { - "200": { - "description": "Thread deleted successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteThreadResponse" - } + "responses": { + "200": { + "description": "Thread modified successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModifyThreadResponse" } } } } } }, - "/assistants": { - "get": { - "operationId": "listAssistants", - "tags": [ - "Assistants" - ], - "summary": "List assistants", - "description": "Return a list of assistants. Equivalent to OpenAI's list assistants. \n", - "responses": { - "200": { - "description": "List of assistants retrieved successfully", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "object": { - "type": "string" - }, - "version": { - "type": "integer" - }, - "created_at": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "avatar": { - "type": "string", - "format": "uri" - }, - "models": { - "type": "array", - "items": { + "delete": { + "operationId": "deleteThread", + "tags": [ + "Threads" + ], + "summary": "Delete thread", + "description": "Delete a thread. Equivalent to OpenAI's delete thread. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to be deleted.\n" + } + ], + "responses": { + "200": { + "description": "Thread deleted successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteThreadResponse" + } + } + } + } + } + } + }, + "/assistants": { + "get": { + "operationId": "listAssistants", + "tags": [ + "Assistants" + ], + "summary": "List assistants", + "description": "Return a list of assistants. Equivalent to OpenAI's list assistants. \n", + "responses": { + "200": { + "description": "List of assistants retrieved successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "object": { + "type": "string" + }, + "version": { + "type": "integer" + }, + "created_at": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "avatar": { + "type": "string", + "format": "uri" + }, + "models": { + "type": "array", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string" + } + } + } + }, + "instructions": { + "type": "string" + }, + "events": { + "type": "object", + "properties": { + "in": { + "type": "array", + "items": {} + }, + "out": { + "type": "array", + "items": {} + } + } + }, + "metadata": { + "type": "object" + }, + "x-codeSamples": { + "type": "object", + "properties": { + "cURL": { "type": "object", "properties": { - "model_id": { - "type": "string" + "lang": { + "type": "string", + "example": "cURL" + }, + "source": { + "type": "string", + "example": "curl http://localhost:1337/v1/assistants \\\n -H \"Content-Type: application/json\"\n" } } - } - }, - "instructions": { - "type": "string" - }, - "events": { - "type": "object", - "properties": { - "in": { - "type": "array", - "items": {} - }, - "out": { - "type": "array", - "items": {} + }, + "JavaScript": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "example": "JavaScript" + }, + "source": { + "type": "string", + "example": "fetch('http://localhost:1337/v1/assistants', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n})\n" + } } - } - }, - "metadata": { - "type": "object" - }, - "x-codeSamples": { - "type": "object", - "properties": { - "cURL": { - "type": "object", - "properties": { - "lang": { - "type": "string", - "example": "cURL" - }, - "source": { - "type": "string", - "example": "curl http://localhost:1337/v1/assistants \\\n -H \"Content-Type: application/json\"\n" - } + }, + "Node.js": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "example": "Node.js" + }, + "source": { + "type": "string", + "example": "const fetch = require('node-fetch');\n\nfetch('http://localhost:1337/v1/assistants', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n})\n" } - }, - "JavaScript": { - "type": "object", - "properties": { - "lang": { - "type": "string", - "example": "JavaScript" - }, - "source": { - "type": "string", - "example": "fetch('http://localhost:1337/v1/assistants', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n})\n" - } - } - }, - "Node.js": { - "type": "object", - "properties": { - "lang": { - "type": "string", - "example": "Node.js" - }, - "source": { - "type": "string", - "example": "const fetch = require('node-fetch');\n\nfetch('http://localhost:1337/v1/assistants', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n }\n})\n" - } - } - }, - "Python": { - "type": "object", - "properties": { - "lang": { - "type": "string", - "example": "Python" - }, - "source": { - "type": "string", - "example": "import requests\n\nurl = 'http://localhost:1337/v1/assistants'\nheaders = {'Content-Type': 'application/json'}\n\nresponse = requests.get(url, headers=headers)\n" - } + } + }, + "Python": { + "type": "object", + "properties": { + "lang": { + "type": "string", + "example": "Python" + }, + "source": { + "type": "string", + "example": "import requests\n\nurl = 'http://localhost:1337/v1/assistants'\nheaders = {'Content-Type': 'application/json'}\n\nresponse = requests.get(url, headers=headers)\n" } } } @@ -536,171 +535,35 @@ } } } - }, - "/assistants/{assistant_id}": { - "get": { - "operationId": "getAssistant", - "tags": [ - "Assistants" - ], - "summary": "Retrieve assistant", - "description": "Retrieves an assistant. Equivalent to OpenAI's retrieve assistants. \n", - "parameters": [ - { - "in": "path", - "name": "assistant_id", - "required": true, - "schema": { - "type": "string", - "example": "jan" - }, - "description": "The ID of the assistant to retrieve.\n" - } - ], - "responses": { - "200": { - "description": "string", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RetrieveAssistantResponse" - } - } - } - } - } - } - }, - "/threads/{thread_id}/messages": { - "get": { - "operationId": "listMessages", - "tags": [ - "Messages" - ], - "summary": "List messages", - "description": "Retrieves all messages from the given thread. Equivalent to OpenAI's list messages. \n", - "parameters": [ - { - "in": "path", - "name": "thread_id", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the thread from which to retrieve messages.\n" - } - ], - "responses": { - "200": { - "description": "List of messages retrieved successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListMessagesResponse" - } - } - } - } - } - }, - "post": { - "operationId": "createMessage", - "tags": [ - "Messages" - ], - "summary": "Create message", - "description": "Create a message. Equivalent to OpenAI's list messages. \n", - "parameters": [ - { - "in": "path", - "name": "thread_id", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the thread to which the message will be posted.\n" - } - ], - "requestBody": { + } + }, + "/assistants/{assistant_id}": { + "get": { + "operationId": "getAssistant", + "tags": [ + "Assistants" + ], + "summary": "Retrieve assistant", + "description": "Retrieves an assistant. Equivalent to OpenAI's retrieve assistants. \n", + "parameters": [ + { + "in": "path", + "name": "assistant_id", "required": true, + "schema": { + "type": "string", + "example": "jan" + }, + "description": "The ID of the assistant to retrieve.\n" + } + ], + "responses": { + "200": { + "description": "string", "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "role": { - "type": "string", - "description": "Role of the sender, either 'user' or 'assistant'.\n", - "example": "user", - "enum": [ - "user", - "assistant" - ] - }, - "content": { - "type": "string", - "description": "Text content of the message.\n", - "example": "How does AI work? Explain it in simple terms." - } - }, - "required": [ - "role", - "content" - ] - } - } - } - }, - "responses": { - "200": { - "description": "Message created successfully", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateMessageResponse" - } - } - } - } - } - } - }, - "/threads/{thread_id}/messages/{message_id}": { - "get": { - "operationId": "retrieveMessage", - "tags": [ - "Messages" - ], - "summary": "Retrieve message", - "description": "Retrieve a specific message from a thread using its thread_id and message_id. Equivalent to OpenAI's retrieve messages. \n", - "parameters": [ - { - "in": "path", - "name": "thread_id", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the thread containing the message.\n" - }, - { - "in": "path", - "name": "message_id", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the message to retrieve.\n" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetMessageResponse" - } + "$ref": "#/components/schemas/RetrieveAssistantResponse" } } } @@ -708,1779 +571,1916 @@ } } }, - "x-webhooks": { - "ModelObject": { - "post": { - "summary": "The model object", - "description": "Describe a model offering that can be used with the API. Equivalent to OpenAI's model object. \n", - "operationId": "ModelObject", - "tags": [ - "Models" - ], - "requestBody": { + "/threads/{thread_id}/messages": { + "get": { + "operationId": "listMessages", + "tags": [ + "Messages" + ], + "summary": "List messages", + "description": "Retrieves all messages from the given thread. Equivalent to OpenAI's list messages. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread from which to retrieve messages.\n" + } + ], + "responses": { + "200": { + "description": "List of messages retrieved successfully", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ModelObject" + "$ref": "#/components/schemas/ListMessagesResponse" } } } } } }, + "post": { + "operationId": "createMessage", + "tags": [ + "Messages" + ], + "summary": "Create message", + "description": "Create a message. Equivalent to OpenAI's list messages. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread to which the message will be posted.\n" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.\n", + "example": "user", + "enum": [ + "user", + "assistant" + ] + }, + "content": { + "type": "string", + "description": "Text content of the message.\n", + "example": "How does AI work? Explain it in simple terms." + } + }, + "required": [ + "role", + "content" + ] + } + } + } + }, + "responses": { + "200": { + "description": "Message created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMessageResponse" + } + } + } + } + } + } + }, + "/threads/{thread_id}/messages/{message_id}": { + "get": { + "operationId": "retrieveMessage", + "tags": [ + "Messages" + ], + "summary": "Retrieve message", + "description": "Retrieve a specific message from a thread using its thread_id and message_id. Equivalent to OpenAI's retrieve messages. \n", + "parameters": [ + { + "in": "path", + "name": "thread_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the thread containing the message.\n" + }, + { + "in": "path", + "name": "message_id", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the message to retrieve.\n" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetMessageResponse" + } + } + } + } + } + } + } + }, + "x-webhooks": { + "ModelObject": { + "post": { + "summary": "The model object", + "description": "Describe a model offering that can be used with the API. Equivalent to OpenAI's model object. \n", + "operationId": "ModelObject", + "tags": [ + "Models" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelObject" + } + } + } + } + } + }, + "AssistantObject": { + "post": { + "summary": "The assistant object", + "description": "Build assistants that can call models and use tools to perform tasks. Equivalent to OpenAI's assistants object. \n", + "operationId": "AssistantObjects", + "tags": [ + "Assistants" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AssistantObject" + } + } + } + } + } + }, + "MessageObject": { + "post": { + "summary": "The message object", + "description": "Information about a message in the thread. Equivalent to OpenAI's message object. \n", + "operationId": "MessageObject", + "tags": [ + "Messages" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": null + } + } + } + } + } + }, + "ThreadObject": { + "post": { + "summary": "The thread object", + "description": "Represents a thread that contains messages. Equivalent to OpenAI's thread object. ", + "operationId": "ThreadObject", + "tags": [ + "Threads" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": null + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ThreadObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the thread, defaults to foldername.\n", + "example": "thread_...." + }, + "object": { + "type": "string", + "description": "Type of the object, defaults to thread.\n", + "example": "thread" + }, + "title": { + "type": "string", + "description": "A brief summary or description of the thread, defaults to an empty string.\n", + "example": "funny physics joke" + }, + "assistants": { + "type": "array", + "description": "", + "items": { + "properties": { + "assistant_id": { + "type": "string", + "description": "The identifier of assistant, defaults to \"jan\"\n", + "example": "jan" + }, + "model": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "", + "example": "..." + }, + "settings": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"settings\" (and if none, then model.json \"settings\")\n" + }, + "parameters": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"parameters\" (and if none, then model.json \"parameters\")\n" + } + } + } + } + } + }, + "created": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread, defaults to file creation time.\n", + "example": 1231231 + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the thread, defaults to an empty object.\n", + "example": {} + } + } + }, + "GetThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the thread.", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object", + "example": "thread" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread.", + "example": 1699014083 + }, + "assistants": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of assistants involved in the thread.", + "example": [ + "assistant-001" + ] + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the thread.", + "example": {} + }, + "messages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of messages within the thread.", + "example": [] + } + } + }, + "CreateThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the newly created thread.", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread.", + "example": "thread" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread.", + "example": 1699014083 + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the newly created thread.", + "example": {} + } + } + }, + "CreateThreadObject": { + "type": "object", + "properties": { + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread.", + "example": "thread" + }, + "title": { + "type": "string", + "description": "A brief summary or description of the thread, defaults to an empty string.\n", + "example": "funny physics joke" + }, + "assistants": { + "type": "array", + "description": "assistant involved in the thread", + "items": { + "properties": { + "assistant_id": { + "type": "string", + "description": "The identifier of assistant, defaults to \"jan\"\n", + "example": "jan" + }, + "assistant_name": { + "type": "string", + "description": "The name of assistant, defaults to \"Jan\"\n", + "example": "Jan" + }, + "instructions": { + "type": "string", + "description": "The instruction of assistant, defaults to \"Be my grammar corrector\"\n" + }, + "model": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Model id", + "example": "mistral-ins-7b-q4" + }, + "settings": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"settings\" (and if none, then model.json \"settings\")\n" + }, + "parameters": { + "type": "object", + "description": "Defaults to and overrides assistant.json's \"parameters\" (and if none, then model.json \"parameters\")\n" + }, + "engine": { + "type": "string", + "description": "Engine id", + "example": "nitro" + } + } + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the thread, defaults to an empty object.\n" + } + } + }, + "ThreadMessageObject": { + "type": "object", + "properties": { + "role": { + "type": "string", + "description": "\"Role of the sender, either 'user' or 'assistant'.\"\n", + "enum": [ + "user", + "assistant" + ] + }, + "content": { + "type": "string", + "description": "\"Text content of the message.\"\n" + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\"Array of file IDs associated with the message, if any.\"\n" + } + } + }, + "ModifyThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "\"The identifier of the modified thread.\"\n", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread.", + "example": "thread" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the thread.", + "example": 1699014083 + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the modified thread.", + "example": {} + } + } + }, + "DeleteThreadResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the deleted thread.", + "example": "thread_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating the thread has been deleted.", + "example": "thread.deleted" + }, + "deleted": { + "type": "boolean", + "description": "Indicates whether the thread was successfully deleted.", + "example": true + } + } + }, + "ListModelsResponse": { + "type": "object", + "properties": { + "object": { + "type": "string", + "enum": [ + "list" + ] + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Model" + } + } + }, + "required": [ + "object", + "data" + ] + }, + "Model": { + "type": "object", + "properties": { + "source_url": { + "type": "string", + "format": "uri", + "description": "URL to the source of the model.", + "example": "https://huggingface.co/janhq/trinity-v1.2-GGUF/resolve/main/trinity-v1.2.Q4_K_M.gguf" + }, + "id": { + "type": "string", + "description": "Unique identifier used in chat-completions model_name, matches folder name.", + "example": "trinity-v1.2-7b" + }, + "object": { + "type": "string", + "example": "model" + }, + "name": { + "type": "string", + "description": "Name of the model.", + "example": "Trinity-v1.2 7B Q4" + }, + "version": { + "type": "string", + "default": "1.0", + "description": "The version number of the model." + }, + "description": { + "type": "string", + "description": "Description of the model.", + "example": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes." + }, + "format": { + "type": "string", + "description": "State format of the model, distinct from the engine.", + "example": "gguf" + }, + "settings": { + "type": "object", + "properties": { + "ctx_len": { + "type": "integer", + "description": "Context length.", + "example": 4096 + }, + "prompt_template": { + "type": "string", + "example": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" + } + }, + "additionalProperties": false + }, + "parameters": { + "type": "object", + "properties": { + "temperature": { + "example": 0.7 + }, + "top_p": { + "example": 0.95 + }, + "stream": { + "example": true + }, + "max_tokens": { + "example": 4096 + }, + "stop": { + "example": [] + }, + "frequency_penalty": { + "example": 0 + }, + "presence_penalty": { + "example": 0 + } + }, + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "author": { + "type": "string", + "example": "Jan" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "7B", + "Merged", + "Featured" + ] + }, + "size": { + "type": "integer", + "example": 4370000000 + }, + "cover": { + "type": "string", + "format": "uri", + "example": "https://raw.githubusercontent.com/janhq/jan/main/models/trinity-v1.2-7b/cover.png" + } + }, + "additionalProperties": false + }, + "engine": { + "example": "nitro" + } + } + }, + "ModelObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model.\n", + "example": "trinity-v1.2-7b" + }, + "object": { + "type": "string", + "description": "The type of the object, indicating it's a model.\n", + "default": "model" + }, + "created": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the model.\n", + "example": 1253935178 + }, + "owned_by": { + "type": "string", + "description": "The entity that owns the model.\n", + "example": "_" + } + } + }, + "GetModelResponse": { + "type": "object", + "properties": { + "source_url": { + "type": "string", + "format": "uri", + "description": "URL to the source of the model.", + "example": "https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf" + }, + "id": { + "type": "string", + "description": "Unique identifier used in chat-completions model_name, matches folder name.", + "example": "mistral-ins-7b-q4" + }, + "object": { + "type": "string", + "example": "model" + }, + "name": { + "type": "string", + "description": "Name of the model.", + "example": "Mistral Instruct 7B Q4" + }, + "version": { + "type": "string", + "default": "1.0", + "description": "The version number of the model." + }, + "description": { + "type": "string", + "description": "Description of the model.", + "example": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes." + }, + "format": { + "type": "string", + "description": "State format of the model, distinct from the engine.", + "example": "gguf" + }, + "settings": { + "type": "object", + "properties": { + "ctx_len": { + "type": "integer", + "description": "Context length.", + "example": 4096 + }, + "prompt_template": { + "type": "string", + "example": "[INST] {prompt} [/INST]" + } + }, + "additionalProperties": false + }, + "parameters": { + "type": "object", + "properties": { + "temperature": { + "example": 0.7 + }, + "top_p": { + "example": 0.95 + }, + "stream": { + "example": true + }, + "max_tokens": { + "example": 4096 + }, + "stop": { + "example": [] + }, + "frequency_penalty": { + "example": 0 + }, + "presence_penalty": { + "example": 0 + } + }, + "additionalProperties": false + }, + "metadata": { + "type": "object", + "properties": { + "author": { + "type": "string", + "example": "MistralAI" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "7B", + "Featured", + "Foundation Model" + ] + }, + "size": { + "example": 4370000000, + "type": "integer" + }, + "cover": { + "example": "https://raw.githubusercontent.com/janhq/jan/main/models/mistral-ins-7b-q4/cover.png", + "type": "string" + } + }, + "additionalProperties": false + }, + "engine": { + "example": "nitro" + } + } + }, + "DeleteModelResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model that was deleted.", + "example": "mistral-ins-7b-q4" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a model.", + "default": "model" + }, + "deleted": { + "type": "boolean", + "description": "Indicates whether the model was successfully deleted.", + "example": true + } + } + }, + "StartModelResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model that was started.", + "example": "model-zephyr-7B" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a model.", + "default": "model" + }, + "state": { + "type": "string", + "description": "The current state of the model after the start operation.", + "example": "running" + } + }, + "required": [ + "id", + "object", + "state" + ] + }, + "StopModelResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the model that was started.", + "example": "model-zephyr-7B" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a model.", + "default": "model" + }, + "state": { + "type": "string", + "description": "The current state of the model after the start operation.", + "example": "stopped" + } + }, + "required": [ + "id", + "object", + "state" + ] + }, + "DownloadModelResponse": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Message indicates Jan starting download corresponding model.", + "example": "Starting download mistral-ins-7b-q4" + } + } + }, + "MessageObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Sequential or UUID identifier of the message.\n", + "example": 0 + }, + "object": { + "type": "string", + "description": "Type of the object, defaults to 'thread.message'.\n", + "example": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.\n" + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs. Defaults to parent thread.\n", + "example": "thread_asdf" + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message. Defaults to parent thread.\n", + "example": "jan" + }, + "role": { + "type": "string", + "enum": [ + "user", + "assistant" + ], + "description": "Role of the sender, either 'user' or 'assistant'.\n" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'.\n" + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.\n", + "example": "Hi!?" + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any.\n", + "example": [] + } + } + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message, defaults to an empty object.\n", + "example": {} + } + } + }, + "GetMessageResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the message.", + "example": "msg_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message.", + "default": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.", + "example": 1699017614 + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs.", + "example": "thread_abc123" + }, + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.", + "example": "user" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'.", + "example": "text" + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.", + "example": "How does AI work? Explain it in simple terms." + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any.", + "example": [] + } + } + } + } + } + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of file IDs associated with the message, if any.", + "example": [] + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message, if applicable.", + "example": null + }, + "run_id": { + "type": "string", + "description": "Run ID associated with the message, if applicable.", + "example": null + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message.", + "example": {} + } + } + }, + "CreateMessageResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the created message.", + "example": "msg_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message.", + "example": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.", + "example": 1699017614 + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs.", + "example": "thread_abc123" + }, + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.", + "example": "user" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'.", + "example": "text" + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.", + "example": "How does AI work? Explain it in simple terms." + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any.", + "example": [] + } + } + } + } + } + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of file IDs associated with the message, if any.", + "example": [] + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message, if applicable.", + "example": null + }, + "run_id": { + "type": "string", + "description": "Run ID associated with the message, if applicable.", + "example": null + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message.", + "example": {} + } + } + }, + "ListMessagesResponse": { + "type": "object", + "properties": { + "object": { + "type": "string", + "description": "Type of the object, indicating it's a list.", + "default": "list" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ListMessageObject" + } + }, + "first_id": { + "type": "string", + "description": "Identifier of the first message in the list.", + "example": "msg_abc123" + }, + "last_id": { + "type": "string", + "description": "Identifier of the last message in the list.", + "example": "msg_abc456" + }, + "has_more": { + "type": "boolean", + "description": "Indicates whether there are more messages to retrieve.", + "example": false + } + } + }, + "ListMessageObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the message.", + "example": "msg_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message.", + "example": "thread.message" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the message.", + "example": 1699017614 + }, + "thread_id": { + "type": "string", + "description": "Identifier of the thread to which this message belongs.", + "example": "thread_abc123" + }, + "role": { + "type": "string", + "description": "Role of the sender, either 'user' or 'assistant'.", + "example": "user" + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of content, e.g., 'text'." + }, + "text": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "Text content of the message.", + "example": "How does AI work? Explain it in simple terms." + }, + "annotations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Annotations for the text content, if any." + } + } + } + } + } + }, + "file_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of file IDs associated with the message, if any.", + "example": [] + }, + "assistant_id": { + "type": "string", + "description": "Identifier of the assistant involved in the message, if applicable.", + "example": null + }, + "run_id": { + "type": "string", + "description": "Run ID associated with the message, if applicable.", + "example": null + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the message.", + "example": {} + } + } + }, + "MessageFileObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the file.", + "example": "file-abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's a thread message file.", + "example": "thread.message.file" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the file.", + "example": 1699061776 + }, + "message_id": { + "type": "string", + "description": "Identifier of the message to which this file is associated.", + "example": "msg_abc123" + } + } + }, + "ListMessageFilesResponse": { + "type": "object", + "properties": { + "object": { + "type": "string", + "description": "Type of the object, indicating it's a list.", + "default": "list" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MessageFileObject" + } + } + } + }, + "ChatObject": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Contains input data or prompts for the model to process.\n", + "items": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "role": { + "type": "string" + } + } + }, + "example": [ + { + "content": "Hello there :wave:", + "role": "assistant" + }, + { + "content": "Can you write a long story", + "role": "user" + } + ] + }, + "stream": { + "type": "boolean", + "default": true, + "description": "Enables continuous output generation, allowing for streaming of model responses." + }, + "model": { + "type": "string", + "example": "gpt-3.5-turbo", + "description": "Specifies the model being used for inference or processing tasks." + }, + "max_tokens": { + "type": "number", + "default": 2048, + "description": "The maximum number of tokens the model will generate in a single response." + }, + "stop": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines specific tokens or phrases at which the model will stop generating further output.", + "example": [ + "hello" + ] + }, + "frequency_penalty": { + "type": "number", + "default": 0, + "description": "Adjusts the likelihood of the model repeating words or phrases in its output." + }, + "presence_penalty": { + "type": "number", + "default": 0, + "description": "Influences the generation of new and varied concepts in the model's output." + }, + "temperature": { + "type": "number", + "default": 0.7, + "description": "Controls the randomness of the model's output." + }, + "top_p": { + "type": "number", + "default": 0.95, + "description": "Set probability threshold for more relevant outputs." + }, + "cache_prompt": { + "type": "boolean", + "default": true, + "description": "Optimize performance in repeated or similar requests." + } + } + }, + "ChatCompletionRequest": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "description": "Contains input data or prompts for the model to process.\n", + "items": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "role": { + "type": "string" + } + } + }, + "example": [ + { + "content": "You are a helpful assistant.", + "role": "system" + }, + { + "content": "Hello!", + "role": "user" + } + ] + }, + "model": { + "type": "string", + "example": "tinyllama-1.1b", + "description": "Specifies the model being used for inference or processing tasks.\n" + }, + "stream": { + "type": "boolean", + "default": true, + "description": "Enables continuous output generation, allowing for streaming of model responses.\n" + }, + "max_tokens": { + "type": "number", + "default": 2048, + "description": "The maximum number of tokens the model will generate in a single response.\n" + }, + "stop": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Defines specific tokens or phrases at which the model will stop generating further output.\n", + "example": [ + "hello" + ] + }, + "frequency_penalty": { + "type": "number", + "default": 0, + "description": "Adjusts the likelihood of the model repeating words or phrases in its output.\n" + }, + "presence_penalty": { + "type": "number", + "default": 0, + "description": "Influences the generation of new and varied concepts in the model's output.\n" + }, + "temperature": { + "type": "number", + "default": 0.7, + "description": "Controls the randomness of the model's output.\n" + }, + "top_p": { + "type": "number", + "default": 0.95, + "description": "Set probability threshold for more relevant outputs.\n" + } + } + }, + "ChatCompletionResponse": { + "type": "object", + "description": "Description of the response structure", + "properties": { + "choices": { + "type": "array", + "description": "Array of choice objects", + "items": { + "type": "object", + "properties": { + "finish_reason": { + "type": "string", + "nullable": true, + "example": null, + "description": "Reason for finishing the response, if applicable" + }, + "index": { + "type": "integer", + "example": 0, + "description": "Index of the choice" + }, + "message": { + "type": "object", + "properties": { + "content": { + "type": "string", + "example": "Hello user. What can I help you with?", + "description": "Content of the message" + }, + "role": { + "type": "string", + "example": "assistant", + "description": "Role of the sender" + } + } + } + } + } + }, + "created": { + "type": "integer", + "example": 1700193928, + "description": "Timestamp of when the response was created" + }, + "id": { + "type": "string", + "example": "ebwd2niJvJB1Q2Whyvkz", + "description": "Unique identifier of the response" + }, + "model": { + "type": "string", + "nullable": true, + "example": "_", + "description": "Model used for generating the response" + }, + "object": { + "type": "string", + "example": "chat.completion", + "description": "Type of the response object" + }, + "system_fingerprint": { + "type": "string", + "nullable": true, + "example": "_", + "description": "System fingerprint" + }, + "usage": { + "type": "object", + "description": "Information about the usage of tokens", + "properties": { + "completion_tokens": { + "type": "integer", + "example": 500, + "description": "Number of tokens used for completion" + }, + "prompt_tokens": { + "type": "integer", + "example": 33, + "description": "Number of tokens used in the prompt" + }, + "total_tokens": { + "type": "integer", + "example": 533, + "description": "Total number of tokens used" + } + } + } + } + }, "AssistantObject": { - "post": { - "summary": "The assistant object", - "description": "Build assistants that can call models and use tools to perform tasks. Equivalent to OpenAI's assistants object. \n", - "operationId": "AssistantObjects", - "tags": [ - "Assistants" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AssistantObject" - } - } - } - } - } - }, - "MessageObject": { - "post": { - "summary": "The message object", - "description": "Information about a message in the thread. Equivalent to OpenAI's message object. \n", - "operationId": "MessageObject", - "tags": [ - "Messages" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": null - } - } - } - } - } - }, - "ThreadObject": { - "post": { - "summary": "The thread object", - "description": "Represents a thread that contains messages. Equivalent to OpenAI's thread object. ", - "operationId": "ThreadObject", - "tags": [ - "Threads" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": null - } - } - } - } - } - } - }, - "components": { - "schemas": { - "ThreadObject": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the thread, defaults to foldername.\n", - "example": "thread_...." - }, - "object": { - "type": "string", - "description": "Type of the object, defaults to thread.\n", - "example": "thread" - }, - "title": { - "type": "string", - "description": "A brief summary or description of the thread, defaults to an empty string.\n", - "example": "funny physics joke" - }, - "assistants": { - "type": "array", - "description": "", - "items": { - "properties": { - "assistant_id": { - "type": "string", - "description": "The identifier of assistant, defaults to \"jan\"\n", - "example": "jan" - }, - "model": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "", - "example": "..." - }, - "settings": { - "type": "object", - "description": "Defaults to and overrides assistant.json's \"settings\" (and if none, then model.json \"settings\")\n" - }, - "parameters": { - "type": "object", - "description": "Defaults to and overrides assistant.json's \"parameters\" (and if none, then model.json \"parameters\")\n" - } - } - } - } - } - }, - "created": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the thread, defaults to file creation time.\n", - "example": 1231231 - }, - "metadata": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { "type": "object", - "description": "Metadata associated with the thread, defaults to an empty object.\n", - "example": {} - } - } - }, - "GetThreadResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the thread.", - "example": "thread_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object", - "example": "thread" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the thread.", - "example": 1699014083 - }, - "assistants": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of assistants involved in the thread.", - "example": [ - "assistant-001" - ] - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the thread.", - "example": {} - }, - "messages": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of messages within the thread.", - "example": [] - } - } - }, - "CreateThreadResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the newly created thread.", - "example": "thread_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a thread.", - "example": "thread" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the thread.", - "example": 1699014083 - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the newly created thread.", - "example": {} - } - } - }, - "CreateThreadObject": { - "type": "object", - "properties": { - "object": { - "type": "string", - "description": "Type of the object, indicating it's a thread.", - "example": "thread" - }, - "title": { - "type": "string", - "description": "A brief summary or description of the thread, defaults to an empty string.\n", - "example": "funny physics joke" - }, - "assistants": { - "type": "array", - "description": "assistant involved in the thread", - "items": { - "properties": { - "assistant_id": { - "type": "string", - "description": "The identifier of assistant, defaults to \"jan\"\n", - "example": "jan" - }, - "assistant_name": { - "type": "string", - "description": "The name of assistant, defaults to \"Jan\"\n", - "example": "Jan" - }, - "instructions": { - "type": "string", - "description": "The instruction of assistant, defaults to \"Be my grammar corrector\"\n" - }, - "model": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Model id", - "example": "mistral-ins-7b-q4" - }, - "settings": { - "type": "object", - "description": "Defaults to and overrides assistant.json's \"settings\" (and if none, then model.json \"settings\")\n" - }, - "parameters": { - "type": "object", - "description": "Defaults to and overrides assistant.json's \"parameters\" (and if none, then model.json \"parameters\")\n" - }, - "engine": { - "type": "string", - "description": "Engine id", - "example": "nitro" - } - } - } + "properties": { + "model_id": { + "type": "string", + "example": "model_0" } } - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the thread, defaults to an empty object.\n" - } - } - }, - "ThreadMessageObject": { - "type": "object", - "properties": { - "role": { - "type": "string", - "description": "\"Role of the sender, either 'user' or 'assistant'.\"\n", - "enum": [ - "user", - "assistant" - ] - }, - "content": { - "type": "string", - "description": "\"Text content of the message.\"\n" - }, - "file_ids": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\"Array of file IDs associated with the message, if any.\"\n" - } - } - }, - "ModifyThreadResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "\"The identifier of the modified thread.\"\n", - "example": "thread_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a thread.", - "example": "thread" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the thread.", - "example": 1699014083 - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the modified thread.", - "example": {} - } - } - }, - "DeleteThreadResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the deleted thread.", - "example": "thread_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating the thread has been deleted.", - "example": "thread.deleted" - }, - "deleted": { - "type": "boolean", - "description": "Indicates whether the thread was successfully deleted.", - "example": true - } - } - }, - "ListModelsResponse": { - "type": "object", - "properties": { - "object": { - "type": "string", - "enum": [ - "list" - ] - }, - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Model" - } } }, - "required": [ - "object", - "data" - ] - }, - "Model": { - "type": "object", - "properties": { - "source_url": { - "type": "string", - "format": "uri", - "description": "URL to the source of the model.", - "example": "https://huggingface.co/janhq/trinity-v1.2-GGUF/resolve/main/trinity-v1.2.Q4_K_M.gguf" - }, - "id": { - "type": "string", - "description": "Unique identifier used in chat-completions model_name, matches folder name.", - "example": "trinity-v1.2-7b" - }, - "object": { - "type": "string", - "example": "model" - }, - "name": { - "type": "string", - "description": "Name of the model.", - "example": "Trinity-v1.2 7B Q4" - }, - "version": { - "type": "string", - "default": "1.0", - "description": "The version number of the model." - }, - "description": { - "type": "string", - "description": "Description of the model.", - "example": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes." - }, - "format": { - "type": "string", - "description": "State format of the model, distinct from the engine.", - "example": "gguf" - }, - "settings": { - "type": "object", - "properties": { - "ctx_len": { - "type": "integer", - "description": "Context length.", - "example": 4096 - }, - "prompt_template": { - "type": "string", - "example": "<|im_start|>system\n{system_message}<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant" - } - }, - "additionalProperties": false - }, - "parameters": { - "type": "object", - "properties": { - "temperature": { - "example": 0.7 - }, - "top_p": { - "example": 0.95 - }, - "stream": { - "example": true - }, - "max_tokens": { - "example": 4096 - }, - "stop": { - "example": [] - }, - "frequency_penalty": { - "example": 0 - }, - "presence_penalty": { - "example": 0 - } - }, - "additionalProperties": false - }, - "metadata": { - "type": "object", - "properties": { - "author": { - "type": "string", - "example": "Jan" - }, - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "7B", - "Merged", - "Featured" - ] - }, - "size": { - "type": "integer", - "example": 4370000000 - }, - "cover": { - "type": "string", - "format": "uri", - "example": "https://raw.githubusercontent.com/janhq/jan/main/models/trinity-v1.2-7b/cover.png" - } - }, - "additionalProperties": false - }, - "engine": { - "example": "nitro" - } - } - }, - "ModelObject": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the model.\n", - "example": "trinity-v1.2-7b" - }, - "object": { - "type": "string", - "description": "The type of the object, indicating it's a model.\n", - "default": "model" - }, - "created": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the model.\n", - "example": 1253935178 - }, - "owned_by": { - "type": "string", - "description": "The entity that owns the model.\n", - "example": "_" - } - } - }, - "GetModelResponse": { - "type": "object", - "properties": { - "source_url": { - "type": "string", - "format": "uri", - "description": "URL to the source of the model.", - "example": "https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf" - }, - "id": { - "type": "string", - "description": "Unique identifier used in chat-completions model_name, matches folder name.", - "example": "mistral-ins-7b-q4" - }, - "object": { - "type": "string", - "example": "model" - }, - "name": { - "type": "string", - "description": "Name of the model.", - "example": "Mistral Instruct 7B Q4" - }, - "version": { - "type": "string", - "default": "1.0", - "description": "The version number of the model." - }, - "description": { - "type": "string", - "description": "Description of the model.", - "example": "Trinity is an experimental model merge using the Slerp method. Recommended for daily assistance purposes." - }, - "format": { - "type": "string", - "description": "State format of the model, distinct from the engine.", - "example": "gguf" - }, - "settings": { - "type": "object", - "properties": { - "ctx_len": { - "type": "integer", - "description": "Context length.", - "example": 4096 - }, - "prompt_template": { - "type": "string", - "example": "[INST] {prompt} [/INST]" - } - }, - "additionalProperties": false - }, - "parameters": { - "type": "object", - "properties": { - "temperature": { - "example": 0.7 - }, - "top_p": { - "example": 0.95 - }, - "stream": { - "example": true - }, - "max_tokens": { - "example": 4096 - }, - "stop": { - "example": [] - }, - "frequency_penalty": { - "example": 0 - }, - "presence_penalty": { - "example": 0 - } - }, - "additionalProperties": false - }, - "metadata": { - "type": "object", - "properties": { - "author": { - "type": "string", - "example": "MistralAI" - }, - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "example": [ - "7B", - "Featured", - "Foundation Model" - ] - }, - "size": { - "example": 4370000000, - "type": "integer" - }, - "cover": { - "example": "https://raw.githubusercontent.com/janhq/jan/main/models/mistral-ins-7b-q4/cover.png", + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { "type": "string" } }, - "additionalProperties": false - }, - "engine": { - "example": "nitro" - } - } - }, - "DeleteModelResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the model that was deleted.", - "example": "mistral-ins-7b-q4" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a model.", - "default": "model" - }, - "deleted": { - "type": "boolean", - "description": "Indicates whether the model was successfully deleted.", - "example": true - } - } - }, - "StartModelResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the model that was started.", - "example": "model-zephyr-7B" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a model.", - "default": "model" - }, - "state": { - "type": "string", - "description": "The current state of the model after the start operation.", - "example": "running" + "out": { + "type": "array", + "items": { + "type": "string" + } + } } }, - "required": [ - "id", - "object", - "state" - ] - }, - "StopModelResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the model that was started.", - "example": "model-zephyr-7B" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a model.", - "default": "model" - }, - "state": { - "type": "string", - "description": "The current state of the model after the start operation.", - "example": "stopped" + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "ListAssistantsResponse": { + "type": "object" + }, + "CreateAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { + "type": "object", + "properties": { + "model_id": { + "type": "string", + "example": "model_0" + } + } } }, - "required": [ - "id", - "object", - "state" - ] - }, - "DownloadModelResponse": { - "type": "object", - "properties": { - "message": { - "type": "string", - "description": "Message indicates Jan starting download corresponding model.", - "example": "Starting download mistral-ins-7b-q4" - } - } - }, - "MessageObject": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Sequential or UUID identifier of the message.\n", - "example": 0 - }, - "object": { - "type": "string", - "description": "Type of the object, defaults to 'thread.message'.\n", - "example": "thread.message" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the message.\n" - }, - "thread_id": { - "type": "string", - "description": "Identifier of the thread to which this message belongs. Defaults to parent thread.\n", - "example": "thread_asdf" - }, - "assistant_id": { - "type": "string", - "description": "Identifier of the assistant involved in the message. Defaults to parent thread.\n", - "example": "jan" - }, - "role": { - "type": "string", - "enum": [ - "user", - "assistant" - ], - "description": "Role of the sender, either 'user' or 'assistant'.\n" - }, - "content": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "Type of content, e.g., 'text'.\n" - }, - "text": { - "type": "object", - "properties": { - "value": { - "type": "string", - "description": "Text content of the message.\n", - "example": "Hi!?" - }, - "annotations": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Annotations for the text content, if any.\n", - "example": [] - } - } - } + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" } } - }, - "metadata": { + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "RetrieveAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { "type": "object", - "description": "Metadata associated with the message, defaults to an empty object.\n", - "example": {} - } - } - }, - "GetMessageResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the message.", - "example": "msg_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a thread message.", - "default": "thread.message" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the message.", - "example": 1699017614 - }, - "thread_id": { - "type": "string", - "description": "Identifier of the thread to which this message belongs.", - "example": "thread_abc123" - }, - "role": { - "type": "string", - "description": "Role of the sender, either 'user' or 'assistant'.", - "example": "user" - }, - "content": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "Type of content, e.g., 'text'.", - "example": "text" - }, - "text": { - "type": "object", - "properties": { - "value": { - "type": "string", - "description": "Text content of the message.", - "example": "How does AI work? Explain it in simple terms." - }, - "annotations": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Annotations for the text content, if any.", - "example": [] - } - } - } - } - } - }, - "file_ids": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of file IDs associated with the message, if any.", - "example": [] - }, - "assistant_id": { - "type": "string", - "description": "Identifier of the assistant involved in the message, if applicable.", - "example": null - }, - "run_id": { - "type": "string", - "description": "Run ID associated with the message, if applicable.", - "example": null - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the message.", - "example": {} - } - } - }, - "CreateMessageResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the created message.", - "example": "msg_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a thread message.", - "example": "thread.message" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the message.", - "example": 1699017614 - }, - "thread_id": { - "type": "string", - "description": "Identifier of the thread to which this message belongs.", - "example": "thread_abc123" - }, - "role": { - "type": "string", - "description": "Role of the sender, either 'user' or 'assistant'.", - "example": "user" - }, - "content": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "Type of content, e.g., 'text'.", - "example": "text" - }, - "text": { - "type": "object", - "properties": { - "value": { - "type": "string", - "description": "Text content of the message.", - "example": "How does AI work? Explain it in simple terms." - }, - "annotations": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Annotations for the text content, if any.", - "example": [] - } - } - } - } - } - }, - "file_ids": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of file IDs associated with the message, if any.", - "example": [] - }, - "assistant_id": { - "type": "string", - "description": "Identifier of the assistant involved in the message, if applicable.", - "example": null - }, - "run_id": { - "type": "string", - "description": "Run ID associated with the message, if applicable.", - "example": null - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the message.", - "example": {} - } - } - }, - "ListMessagesResponse": { - "type": "object", - "properties": { - "object": { - "type": "string", - "description": "Type of the object, indicating it's a list.", - "default": "list" - }, - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ListMessageObject" - } - }, - "first_id": { - "type": "string", - "description": "Identifier of the first message in the list.", - "example": "msg_abc123" - }, - "last_id": { - "type": "string", - "description": "Identifier of the last message in the list.", - "example": "msg_abc456" - }, - "has_more": { - "type": "boolean", - "description": "Indicates whether there are more messages to retrieve.", - "example": false - } - } - }, - "ListMessageObject": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the message.", - "example": "msg_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a thread message.", - "example": "thread.message" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the message.", - "example": 1699017614 - }, - "thread_id": { - "type": "string", - "description": "Identifier of the thread to which this message belongs.", - "example": "thread_abc123" - }, - "role": { - "type": "string", - "description": "Role of the sender, either 'user' or 'assistant'.", - "example": "user" - }, - "content": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string", - "description": "Type of content, e.g., 'text'." - }, - "text": { - "type": "object", - "properties": { - "value": { - "type": "string", - "description": "Text content of the message.", - "example": "How does AI work? Explain it in simple terms." - }, - "annotations": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Annotations for the text content, if any." - } - } - } - } - } - }, - "file_ids": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of file IDs associated with the message, if any.", - "example": [] - }, - "assistant_id": { - "type": "string", - "description": "Identifier of the assistant involved in the message, if applicable.", - "example": null - }, - "run_id": { - "type": "string", - "description": "Run ID associated with the message, if applicable.", - "example": null - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the message.", - "example": {} - } - } - }, - "MessageFileObject": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the file.", - "example": "file-abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's a thread message file.", - "example": "thread.message.file" - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the file.", - "example": 1699061776 - }, - "message_id": { - "type": "string", - "description": "Identifier of the message to which this file is associated.", - "example": "msg_abc123" - } - } - }, - "ListMessageFilesResponse": { - "type": "object", - "properties": { - "object": { - "type": "string", - "description": "Type of the object, indicating it's a list.", - "default": "list" - }, - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/MessageFileObject" - } - } - } - }, - "ChatObject": { - "type": "object", - "properties": { - "messages": { - "type": "array", - "description": "Contains input data or prompts for the model to process.\n", - "items": { - "type": "object", - "properties": { - "content": { - "type": "string" - }, - "role": { - "type": "string" - } - } - }, - "example": [ - { - "content": "Hello there :wave:", - "role": "assistant" - }, - { - "content": "Can you write a long story", - "role": "user" - } - ] - }, - "stream": { - "type": "boolean", - "default": true, - "description": "Enables continuous output generation, allowing for streaming of model responses." - }, - "model": { - "type": "string", - "example": "gpt-3.5-turbo", - "description": "Specifies the model being used for inference or processing tasks." - }, - "max_tokens": { - "type": "number", - "default": 2048, - "description": "The maximum number of tokens the model will generate in a single response." - }, - "stop": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Defines specific tokens or phrases at which the model will stop generating further output.", - "example": [ - "hello" - ] - }, - "frequency_penalty": { - "type": "number", - "default": 0, - "description": "Adjusts the likelihood of the model repeating words or phrases in its output." - }, - "presence_penalty": { - "type": "number", - "default": 0, - "description": "Influences the generation of new and varied concepts in the model's output." - }, - "temperature": { - "type": "number", - "default": 0.7, - "description": "Controls the randomness of the model's output." - }, - "top_p": { - "type": "number", - "default": 0.95, - "description": "Set probability threshold for more relevant outputs." - }, - "cache_prompt": { - "type": "boolean", - "default": true, - "description": "Optimize performance in repeated or similar requests." - } - } - }, - "ChatCompletionRequest": { - "type": "object", - "properties": { - "messages": { - "type": "array", - "description": "Contains input data or prompts for the model to process.\n", - "items": { - "type": "object", - "properties": { - "content": { - "type": "string" - }, - "role": { - "type": "string" - } - } - }, - "example": [ - { - "content": "You are a helpful assistant.", - "role": "system" - }, - { - "content": "Hello!", - "role": "user" - } - ] - }, - "model": { - "type": "string", - "example": "tinyllama-1.1b", - "description": "Specifies the model being used for inference or processing tasks.\n" - }, - "stream": { - "type": "boolean", - "default": true, - "description": "Enables continuous output generation, allowing for streaming of model responses.\n" - }, - "max_tokens": { - "type": "number", - "default": 2048, - "description": "The maximum number of tokens the model will generate in a single response.\n" - }, - "stop": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Defines specific tokens or phrases at which the model will stop generating further output.\n", - "example": [ - "hello" - ] - }, - "frequency_penalty": { - "type": "number", - "default": 0, - "description": "Adjusts the likelihood of the model repeating words or phrases in its output.\n" - }, - "presence_penalty": { - "type": "number", - "default": 0, - "description": "Influences the generation of new and varied concepts in the model's output.\n" - }, - "temperature": { - "type": "number", - "default": 0.7, - "description": "Controls the randomness of the model's output.\n" - }, - "top_p": { - "type": "number", - "default": 0.95, - "description": "Set probability threshold for more relevant outputs.\n" - } - } - }, - "ChatCompletionResponse": { - "type": "object", - "description": "Description of the response structure", - "properties": { - "choices": { - "type": "array", - "description": "Array of choice objects", - "items": { - "type": "object", - "properties": { - "finish_reason": { - "type": "string", - "nullable": true, - "example": null, - "description": "Reason for finishing the response, if applicable" - }, - "index": { - "type": "integer", - "example": 0, - "description": "Index of the choice" - }, - "message": { - "type": "object", - "properties": { - "content": { - "type": "string", - "example": "Hello user. What can I help you with?", - "description": "Content of the message" - }, - "role": { - "type": "string", - "example": "assistant", - "description": "Role of the sender" - } - } - } - } - } - }, - "created": { - "type": "integer", - "example": 1700193928, - "description": "Timestamp of when the response was created" - }, - "id": { - "type": "string", - "example": "ebwd2niJvJB1Q2Whyvkz", - "description": "Unique identifier of the response" - }, - "model": { - "type": "string", - "nullable": true, - "example": "_", - "description": "Model used for generating the response" - }, - "object": { - "type": "string", - "example": "chat.completion", - "description": "Type of the response object" - }, - "system_fingerprint": { - "type": "string", - "nullable": true, - "example": "_", - "description": "System fingerprint" - }, - "usage": { - "type": "object", - "description": "Information about the usage of tokens", "properties": { - "completion_tokens": { - "type": "integer", - "example": 500, - "description": "Number of tokens used for completion" - }, - "prompt_tokens": { - "type": "integer", - "example": 33, - "description": "Number of tokens used in the prompt" - }, - "total_tokens": { - "type": "integer", - "example": 533, - "description": "Total number of tokens used" + "model_id": { + "type": "string", + "example": "model_0" } } } - } - }, - "AssistantObject": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the assistant.", - "example": "asst_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's an assistant.", - "default": "assistant" - }, - "version": { - "type": "integer", - "description": "Version number of the assistant.", - "example": 1 - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the assistant.", - "example": 1698984975 - }, - "name": { - "type": "string", - "description": "Name of the assistant.", - "example": "Math Tutor" - }, - "description": { - "type": "string", - "description": "Description of the assistant. Can be null.", - "example": null - }, - "avatar": { - "type": "string", - "description": "URL of the assistant's avatar. Jan-specific property.", - "example": "https://pic.png" - }, - "models": { - "type": "array", - "description": "List of models associated with the assistant. Jan-specific property.", - "items": { - "type": "object", - "properties": { - "model_id": { - "type": "string", - "example": "model_0" - } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" } } - }, - "instructions": { - "type": "string", - "description": "A system prompt for the assistant.", - "example": "Be concise" - }, - "events": { + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "ModifyAssistantObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Math Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { "type": "object", - "description": "Event subscription settings for the assistant.", "properties": { - "in": { - "type": "array", - "items": { - "type": "string" - } - }, - "out": { - "type": "array", - "items": { - "type": "string" - } + "model_id": { + "type": "string", + "example": "model_0" } } - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the assistant." } - } - }, - "ListAssistantsResponse": { - "type": "object" - }, - "CreateAssistantResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the assistant.", - "example": "asst_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's an assistant.", - "default": "assistant" - }, - "version": { - "type": "integer", - "description": "Version number of the assistant.", - "example": 1 - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the assistant.", - "example": 1698984975 - }, - "name": { - "type": "string", - "description": "Name of the assistant.", - "example": "Math Tutor" - }, - "description": { - "type": "string", - "description": "Description of the assistant. Can be null.", - "example": null - }, - "avatar": { - "type": "string", - "description": "URL of the assistant's avatar. Jan-specific property.", - "example": "https://pic.png" - }, - "models": { - "type": "array", - "description": "List of models associated with the assistant. Jan-specific property.", - "items": { - "type": "object", - "properties": { - "model_id": { - "type": "string", - "example": "model_0" - } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" } } - }, - "instructions": { - "type": "string", - "description": "A system prompt for the assistant.", - "example": "Be concise" - }, - "events": { + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." + } + } + }, + "ModifyAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating it's an assistant.", + "default": "assistant" + }, + "version": { + "type": "integer", + "description": "Version number of the assistant.", + "example": 1 + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp representing the creation time of the assistant.", + "example": 1698984975 + }, + "name": { + "type": "string", + "description": "Name of the assistant.", + "example": "Physics Tutor" + }, + "description": { + "type": "string", + "description": "Description of the assistant. Can be null.", + "example": null + }, + "avatar": { + "type": "string", + "description": "URL of the assistant's avatar. Jan-specific property.", + "example": "https://pic.png" + }, + "models": { + "type": "array", + "description": "List of models associated with the assistant. Jan-specific property.", + "items": { "type": "object", - "description": "Event subscription settings for the assistant.", "properties": { - "in": { - "type": "array", - "items": { - "type": "string" - } - }, - "out": { - "type": "array", - "items": { - "type": "string" - } + "model_id": { + "type": "string", + "example": "model_0" } } - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the assistant." } + }, + "instructions": { + "type": "string", + "description": "A system prompt for the assistant.", + "example": "Be concise!" + }, + "events": { + "type": "object", + "description": "Event subscription settings for the assistant.", + "properties": { + "in": { + "type": "array", + "items": { + "type": "string" + } + }, + "out": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "metadata": { + "type": "object", + "description": "Metadata associated with the assistant." } - }, - "RetrieveAssistantResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the assistant.", - "example": "asst_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's an assistant.", - "default": "assistant" - }, - "version": { - "type": "integer", - "description": "Version number of the assistant.", - "example": 1 - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the assistant.", - "example": 1698984975 - }, - "name": { - "type": "string", - "description": "Name of the assistant.", - "example": "Math Tutor" - }, - "description": { - "type": "string", - "description": "Description of the assistant. Can be null.", - "example": null - }, - "avatar": { - "type": "string", - "description": "URL of the assistant's avatar. Jan-specific property.", - "example": "https://pic.png" - }, - "models": { - "type": "array", - "description": "List of models associated with the assistant. Jan-specific property.", - "items": { - "type": "object", - "properties": { - "model_id": { - "type": "string", - "example": "model_0" - } - } - } - }, - "instructions": { - "type": "string", - "description": "A system prompt for the assistant.", - "example": "Be concise" - }, - "events": { - "type": "object", - "description": "Event subscription settings for the assistant.", - "properties": { - "in": { - "type": "array", - "items": { - "type": "string" - } - }, - "out": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the assistant." - } - } - }, - "ModifyAssistantObject": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the assistant.", - "example": "asst_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's an assistant.", - "default": "assistant" - }, - "version": { - "type": "integer", - "description": "Version number of the assistant.", - "example": 1 - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the assistant.", - "example": 1698984975 - }, - "name": { - "type": "string", - "description": "Name of the assistant.", - "example": "Math Tutor" - }, - "description": { - "type": "string", - "description": "Description of the assistant. Can be null.", - "example": null - }, - "avatar": { - "type": "string", - "description": "URL of the assistant's avatar. Jan-specific property.", - "example": "https://pic.png" - }, - "models": { - "type": "array", - "description": "List of models associated with the assistant. Jan-specific property.", - "items": { - "type": "object", - "properties": { - "model_id": { - "type": "string", - "example": "model_0" - } - } - } - }, - "instructions": { - "type": "string", - "description": "A system prompt for the assistant.", - "example": "Be concise" - }, - "events": { - "type": "object", - "description": "Event subscription settings for the assistant.", - "properties": { - "in": { - "type": "array", - "items": { - "type": "string" - } - }, - "out": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the assistant." - } - } - }, - "ModifyAssistantResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the assistant.", - "example": "asst_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating it's an assistant.", - "default": "assistant" - }, - "version": { - "type": "integer", - "description": "Version number of the assistant.", - "example": 1 - }, - "created_at": { - "type": "integer", - "format": "int64", - "description": "Unix timestamp representing the creation time of the assistant.", - "example": 1698984975 - }, - "name": { - "type": "string", - "description": "Name of the assistant.", - "example": "Physics Tutor" - }, - "description": { - "type": "string", - "description": "Description of the assistant. Can be null.", - "example": null - }, - "avatar": { - "type": "string", - "description": "URL of the assistant's avatar. Jan-specific property.", - "example": "https://pic.png" - }, - "models": { - "type": "array", - "description": "List of models associated with the assistant. Jan-specific property.", - "items": { - "type": "object", - "properties": { - "model_id": { - "type": "string", - "example": "model_0" - } - } - } - }, - "instructions": { - "type": "string", - "description": "A system prompt for the assistant.", - "example": "Be concise!" - }, - "events": { - "type": "object", - "description": "Event subscription settings for the assistant.", - "properties": { - "in": { - "type": "array", - "items": { - "type": "string" - } - }, - "out": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "metadata": { - "type": "object", - "description": "Metadata associated with the assistant." - } - } - }, - "DeleteAssistantResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "The identifier of the deleted assistant.", - "example": "asst_abc123" - }, - "object": { - "type": "string", - "description": "Type of the object, indicating the assistant has been deleted.", - "example": "assistant.deleted" - }, - "deleted": { - "type": "boolean", - "description": "Indicates whether the assistant was successfully deleted.", - "example": true - } + } + }, + "DeleteAssistantResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The identifier of the deleted assistant.", + "example": "asst_abc123" + }, + "object": { + "type": "string", + "description": "Type of the object, indicating the assistant has been deleted.", + "example": "assistant.deleted" + }, + "deleted": { + "type": "boolean", + "description": "Indicates whether the assistant was successfully deleted.", + "example": true } } } } - } \ No newline at end of file + } +} \ No newline at end of file From 86f8004c50f72fe001664eb2c3718e4dce7a1e01 Mon Sep 17 00:00:00 2001 From: Nicole Zhu <69952136+0xSage@users.noreply.github.com> Date: Fri, 15 Mar 2024 18:22:46 +0800 Subject: [PATCH 127/131] docs: Update broken-build.mdx --- docs/docs/guides/common-error/broken-build.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/guides/common-error/broken-build.mdx b/docs/docs/guides/common-error/broken-build.mdx index f388257ac..0e41d0b4d 100644 --- a/docs/docs/guides/common-error/broken-build.mdx +++ b/docs/docs/guides/common-error/broken-build.mdx @@ -68,8 +68,8 @@ This guide provides you steps to troubleshoot and to resolve the issue where you ```sh # You can delete the `/Jan` directory in Windows's AppData Directory by visiting the following path `%APPDATA%\Jan` - cd C:\Users\%USERNAME%\AppData\Roaming - rmdir /S jan + cd C:\Users\YOUR_USERNAME\AppData\Roaming + rm -r ./Jan ``` ### 3. Additional Step for Versions Before 0.4.2 @@ -156,4 +156,4 @@ By following these steps, you can cleanly uninstall and reinstall Jan, ensuring Before reinstalling Jan, ensure it's completely removed from all shared spaces if it's installed on multiple user accounts on your device. -::: \ No newline at end of file +::: From 9229773610f460f2d447a1451c2010ad0d250eaa Mon Sep 17 00:00:00 2001 From: Service Account Date: Fri, 15 Mar 2024 10:26:38 +0000 Subject: [PATCH 128/131] janhq/jan: Update README.md with nightly build artifact URL --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index adebb8ea1..2ce60c655 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 From 5f19983de17261529ac4b6450ddbf879b65f53ea Mon Sep 17 00:00:00 2001 From: NamH Date: Fri, 15 Mar 2024 17:45:56 +0700 Subject: [PATCH 129/131] fix: some regressions for tensorrt nightly build (#2380) * fix: some regressions for tensorrt nightly build Signed-off-by: James --------- Signed-off-by: hiro Signed-off-by: James Co-authored-by: hiro Co-authored-by: James --- extensions/model-extension/src/index.ts | 2 +- .../tensorrt-llm-extension/package.json | 2 +- web/screens/Settings/Advanced/index.tsx | 5 ++-- .../CoreExtensions/TensorRtExtensionItem.tsx | 24 +++++++++++++++---- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/extensions/model-extension/src/index.ts b/extensions/model-extension/src/index.ts index d05e7d07f..e2970b8f9 100644 --- a/extensions/model-extension/src/index.ts +++ b/extensions/model-extension/src/index.ts @@ -321,7 +321,7 @@ export default class JanModelExtension extends ModelExtension { .toLowerCase() .includes(JanModelExtension._tensorRtEngineFormat) ) - })?.length > 0 // TODO: NamH find better way (can use basename to check the file name with source url) + })?.length > 0 // TODO: find better way (can use basename to check the file name with source url) ) }) diff --git a/extensions/tensorrt-llm-extension/package.json b/extensions/tensorrt-llm-extension/package.json index 96ede4a56..95a06cf8c 100644 --- a/extensions/tensorrt-llm-extension/package.json +++ b/extensions/tensorrt-llm-extension/package.json @@ -1,7 +1,7 @@ { "name": "@janhq/tensorrt-llm-extension", "version": "0.0.3", - "description": "Enables accelerated inference leveraging Nvidia's TensorRT-LLM for optimal GPU hardware optimizations. Compatible with models in TensorRT-LLM format. Requires Nvidia GPU driver and CUDA Toolkit installation.", + "description": "This extension enables Nvidia's TensorRT-LLM for the fastest GPU acceleration. See the [setup guide](https://jan.ai/guides/providers/tensorrt-llm/) for next steps.", "main": "dist/index.js", "node": "dist/node/index.cjs.js", "author": "Jan ", diff --git a/web/screens/Settings/Advanced/index.tsx b/web/screens/Settings/Advanced/index.tsx index 6853a5104..3cc43e744 100644 --- a/web/screens/Settings/Advanced/index.tsx +++ b/web/screens/Settings/Advanced/index.tsx @@ -246,7 +246,8 @@ const Advanced = () => { setGpuEnabled(true) setShowNotification(false) snackbar({ - description: 'Successfully turned on GPU Accelertion', + description: + 'Successfully turned on GPU Acceleration', type: 'success', }) setTimeout(() => { @@ -257,7 +258,7 @@ const Advanced = () => { setGpuEnabled(false) snackbar({ description: - 'Successfully turned off GPU Accelertion', + 'Successfully turned off GPU Acceleration', type: 'success', }) } diff --git a/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx index 8033cd588..c11041ffe 100644 --- a/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx +++ b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx @@ -8,6 +8,7 @@ import { systemInformations, } from '@janhq/core' import { + Badge, Button, Progress, Tooltip, @@ -20,6 +21,8 @@ import { import { InfoCircledIcon } from '@radix-ui/react-icons' import { useAtomValue } from 'jotai' +import { Marked, Renderer } from 'marked' + import { extensionManager } from '@/extension' import Extension from '@/extension/Extension' import { installingExtensionAtom } from '@/helpers/atoms/Extension.atom' @@ -108,6 +111,8 @@ const TensorRtExtensionItem: React.FC = ({ item }) => { } } + const description = marked.parse(item.description ?? '', { async: false }) + console.log(description) return (
    @@ -118,10 +123,12 @@ const TensorRtExtensionItem: React.FC = ({ item }) => {

    v{item.version}

    + Experimental
    -

    - {item.description} -

    + { + // eslint-disable-next-line @typescript-eslint/naming-convention +
    + }
    {(!compatibility || compatibility['platform']?.includes(PLATFORM)) && @@ -204,7 +211,6 @@ const InstallStateIndicator: React.FC = ({ ) } - // TODO: NamH check for dark mode here switch (installState) { case 'Installed': return ( @@ -223,4 +229,14 @@ const InstallStateIndicator: React.FC = ({ } } +const marked: Marked = new Marked({ + renderer: { + link: (href, title, text) => { + return Renderer.prototype.link + ?.apply(this, [href, title, text]) + .replace(' Date: Fri, 15 Mar 2024 23:02:42 +0700 Subject: [PATCH 130/131] chore: temporary remove linux from tensorrt support (#2386) Signed-off-by: James Co-authored-by: James --- extensions/tensorrt-llm-extension/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/tensorrt-llm-extension/package.json b/extensions/tensorrt-llm-extension/package.json index 95a06cf8c..af1dba853 100644 --- a/extensions/tensorrt-llm-extension/package.json +++ b/extensions/tensorrt-llm-extension/package.json @@ -12,8 +12,7 @@ }, "compatibility": { "platform": [ - "win32", - "linux" + "win32" ], "app": [ "0.1.0" From 82a751bdf4f62bae8bfe0a3a390e2dec9598f3f7 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Sat, 16 Mar 2024 20:33:58 +0700 Subject: [PATCH 131/131] fix: line height typography blog and docs (#2390) * fix: line height typography * fix: remove all custom line height for paragraph, span and link tag * fix: apply line height with leading relaxed * fix: margin bottom paragraph 16px --- docs/docusaurus.config.js | 317 +++++++++++---------- docs/src/styles/components/typography.scss | 12 - docs/src/styles/tweaks/markdown.scss | 15 +- 3 files changed, 169 insertions(+), 175 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index bb39dcd1c..4e7e91baf 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,36 +1,36 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion -require("dotenv").config(); +require('dotenv').config() -const darkCodeTheme = require("prism-react-renderer/themes/dracula"); -const path = require('path'); +const darkCodeTheme = require('prism-react-renderer/themes/dracula') +const path = require('path') /** @type {import('@docusaurus/types').Config} */ const config = { - title: "Jan", - tagline: "Run your own AI", - favicon: "img/favicon.ico", + title: 'Jan', + tagline: 'Run your own AI', + favicon: 'img/favicon.ico', // Set the production url of your site here - url: "https://jan.ai", + url: 'https://jan.ai', // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: "/", + baseUrl: '/', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. - organizationName: "janhq", // Usually your GitHub org/user name. - projectName: "jan", // Usually your repo name. + organizationName: 'janhq', // Usually your GitHub org/user name. + projectName: 'jan', // Usually your repo name. - onBrokenLinks: "warn", - onBrokenMarkdownLinks: "warn", + onBrokenLinks: 'warn', + onBrokenMarkdownLinks: 'warn', trailingSlash: true, // Even if you don't use internalization, you can use this field to set useful // metadata like html lang. For example, if your site is Chinese, you may want // to replace "en" with "zh-Hans". i18n: { - defaultLocale: "en", - locales: ["en"], + defaultLocale: 'en', + locales: ['en'], }, markdown: { @@ -41,80 +41,81 @@ const config = { // Plugins we added plugins: [ - "docusaurus-plugin-sass", + 'docusaurus-plugin-sass', async function myPlugin(context, options) { return { - name: "docusaurus-tailwindcss", + name: 'docusaurus-tailwindcss', configurePostCss(postcssOptions) { // Appends TailwindCSS and AutoPrefixer. - postcssOptions.plugins.push(require("tailwindcss")); - postcssOptions.plugins.push(require("autoprefixer")); - return postcssOptions; + postcssOptions.plugins.push(require('tailwindcss')) + postcssOptions.plugins.push(require('autoprefixer')) + return postcssOptions }, - }; + } }, [ - "posthog-docusaurus", + 'posthog-docusaurus', { - apiKey: process.env.POSTHOG_PROJECT_API_KEY || "XXX", - appUrl: process.env.POSTHOG_APP_URL || "XXX", // optional + apiKey: process.env.POSTHOG_PROJECT_API_KEY || 'XXX', + appUrl: process.env.POSTHOG_APP_URL || 'XXX', // optional enableInDevelopment: false, // optional }, ], [ - "@docusaurus/plugin-client-redirects", + '@docusaurus/plugin-client-redirects', { redirects: [ { - from: "/troubleshooting/failed-to-fetch", - to: "/guides/error-codes/something-amiss/", + from: '/troubleshooting/failed-to-fetch', + to: '/guides/error-codes/something-amiss/', }, { - from: "/guides/troubleshooting/gpu-not-used/", - to: "/guides/common-error/not-using-gpu/", + from: '/guides/troubleshooting/gpu-not-used/', + to: '/guides/common-error/not-using-gpu/', }, { - from: "/guides/troubleshooting/", - to: "/guides/error-codes/", + from: '/guides/troubleshooting/', + to: '/guides/error-codes/', }, { - from: "/troubleshooting/stuck-on-broken-build/", - to: "/guides/common-error/broken-build/", + from: '/troubleshooting/stuck-on-broken-build/', + to: '/guides/common-error/broken-build/', }, { - from: "/guides/troubleshooting/", - to: "/guides/error-codes/", + from: '/guides/troubleshooting/', + to: '/guides/error-codes/', }, { - from: "/troubleshooting/somethings-amiss/", - to: "/guides/error-codes/something-amiss/", + from: '/troubleshooting/somethings-amiss/', + to: '/guides/error-codes/something-amiss/', }, { - from: "/troubleshooting/how-to-get-error-logs/", - to: "/guides/error-codes/how-to-get-error-logs/", + from: '/troubleshooting/how-to-get-error-logs/', + to: '/guides/error-codes/how-to-get-error-logs/', }, { - from: "/troubleshooting/permission-denied/", - to: "/guides/error-codes/permission-denied/", + from: '/troubleshooting/permission-denied/', + to: '/guides/error-codes/permission-denied/', }, { - from: "/troubleshooting/unexpected-token/", - to: "/guides/error-codes/unexpected-token/", + from: '/troubleshooting/unexpected-token/', + to: '/guides/error-codes/unexpected-token/', }, { - from: "/troubleshooting/undefined-issue/", - to: "/guides/error-codes/undefined-issue/", - }, { - from: "/install/", - to: "/guides/install/", + from: '/troubleshooting/undefined-issue/', + to: '/guides/error-codes/undefined-issue/', }, { - from: "/guides/using-models/", - to: "/guides/models-setup/", + from: '/install/', + to: '/guides/install/', }, { - from: "/guides/using-extensions/", - to: "/guides/extensions/", + from: '/guides/using-models/', + to: '/guides/models-setup/', + }, + { + from: '/guides/using-extensions/', + to: '/guides/extensions/', }, ], }, @@ -139,35 +140,35 @@ const config = { // The classic preset will relay each option entry to the respective sub plugin/theme. presets: [ [ - "@docusaurus/preset-classic", + '@docusaurus/preset-classic', { // Will be passed to @docusaurus/plugin-content-docs (false to disable) docs: { - routeBasePath: "/", - sidebarPath: require.resolve("./sidebars.js"), - editUrl: "https://github.com/janhq/jan/tree/dev/docs", + routeBasePath: '/', + sidebarPath: require.resolve('./sidebars.js'), + editUrl: 'https://github.com/janhq/jan/tree/dev/docs', showLastUpdateAuthor: true, showLastUpdateTime: true, }, // Will be passed to @docusaurus/plugin-content-sitemap (false to disable) sitemap: { - changefreq: "daily", + changefreq: 'daily', priority: 1.0, - ignorePatterns: ["/tags/**"], - filename: "sitemap.xml", + ignorePatterns: ['/tags/**'], + filename: 'sitemap.xml', }, // Will be passed to @docusaurus/plugin-content-blog (false to disable) blog: { - blogSidebarTitle: "All Posts", - blogSidebarCount: "ALL", + blogSidebarTitle: 'All Posts', + blogSidebarCount: 'ALL', }, // Will be passed to @docusaurus/theme-classic. theme: { - customCss: require.resolve("./src/styles/main.scss"), + customCss: require.resolve('./src/styles/main.scss'), }, // GTM is always inactive in development and only active in production to avoid polluting the analytics statistics. googleTagManager: { - containerId: process.env.GTM_ID || "XXX", + containerId: process.env.GTM_ID || 'XXX', }, // Will be passed to @docusaurus/plugin-content-pages (false to disable) // pages: {}, @@ -175,17 +176,17 @@ const config = { ], // Redoc preset [ - "redocusaurus", + 'redocusaurus', { specs: [ { - spec: "openapi/jan.yaml", // can be local file, url, or parsed json object - route: "/api-reference-1.0/", // path where to render docs + spec: 'openapi/jan.yaml', // can be local file, url, or parsed json object + route: '/api-reference-1.0/', // path where to render docs }, ], theme: { - primaryColor: "#1a73e8", - primaryColorDark: "#1a73e8", + primaryColor: '#1a73e8', + primaryColorDark: '#1a73e8', options: { requiredPropsFirst: true, noAutoAuth: true, @@ -198,10 +199,10 @@ const config = { // Docs: https://docusaurus.io/docs/api/themes/configuration themeConfig: { - image: "img/og-image.png", + image: 'img/og-image.png', // Only for react live liveCodeBlock: { - playgroundPosition: "bottom", + playgroundPosition: 'bottom', }, docs: { sidebar: { @@ -211,89 +212,89 @@ const config = { }, // Algolia Search Configuration algolia: { - appId: process.env.ALGOLIA_APP_ID || "XXX", - apiKey: process.env.ALGOLIA_API_KEY || "XXX", - indexName: "jan_docs", + appId: process.env.ALGOLIA_APP_ID || 'XXX', + apiKey: process.env.ALGOLIA_API_KEY || 'XXX', + indexName: 'jan_docs', contextualSearch: true, insights: true, }, // SEO Docusarus metadata: [ { - name: "description", + name: 'description', content: - "Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.", + 'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.', }, { - name: "keywords", + name: 'keywords', content: - "Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model ", + 'Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model ', }, - { name: "robots", content: "index, follow" }, + { name: 'robots', content: 'index, follow' }, { - property: "og:title", - content: "Jan | Open-source ChatGPT Alternative", + property: 'og:title', + content: 'Jan | Open-source ChatGPT Alternative', }, { - property: "og:description", + property: 'og:description', content: - "Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.", + 'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.', }, { - property: "og:image", - content: "https://jan.ai/img/og-image.png", + property: 'og:image', + content: 'https://jan.ai/img/og-image.png', }, - { property: "og:type", content: "website" }, - { property: "twitter:card", content: "summary_large_image" }, - { property: "twitter:site", content: "@janframework" }, + { property: 'og:type', content: 'website' }, + { property: 'twitter:card', content: 'summary_large_image' }, + { property: 'twitter:site', content: '@janframework' }, { - property: "twitter:title", - content: "Jan | Open-source ChatGPT Alternative", + property: 'twitter:title', + content: 'Jan | Open-source ChatGPT Alternative', }, { - property: "twitter:description", + property: 'twitter:description', content: - "Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.", + 'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.', }, { - property: "twitter:image", - content: "https://jan.ai/img/og-image.png", + property: 'twitter:image', + content: 'https://jan.ai/img/og-image.png', }, ], headTags: [ // Declare a preconnect tag { - tagName: "link", + tagName: 'link', attributes: { - rel: "preconnect", - href: "https://jan.ai/", + rel: 'preconnect', + href: 'https://jan.ai/', }, }, // Declare some json-ld structured data { - tagName: "script", + tagName: 'script', attributes: { - type: "application/ld+json", + type: 'application/ld+json', }, innerHTML: JSON.stringify({ - "@context": "https://schema.org/", - "@type": "localAI", - name: "Jan", - description: - "Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.", - keywords: - "Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model ", - applicationCategory: "BusinessApplication", - operatingSystem: "Multiple", - url: "https://jan.ai/", + '@context': 'https://schema.org/', + '@type': 'localAI', + 'name': 'Jan', + 'description': + 'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.', + 'keywords': + 'Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model ', + 'applicationCategory': 'BusinessApplication', + 'operatingSystem': 'Multiple', + 'url': 'https://jan.ai/', }), }, ], navbar: { - title: "Jan", + title: 'Jan', logo: { - alt: "Jan Logo", - src: "img/logo.svg", + alt: 'Jan Logo', + src: 'img/logo.svg', }, items: [ // Navbar Left @@ -304,38 +305,38 @@ const config = { // label: "About", // }, { - type: "dropdown", - label: "About", - position: "left", + type: 'dropdown', + label: 'About', + position: 'left', items: [ { - type: "doc", - label: "What is Jan?", - docId: "about/about", + type: 'doc', + label: 'What is Jan?', + docId: 'about/about', }, { - type: "doc", - label: "Who we are", - docId: "team/team", + type: 'doc', + label: 'Who we are', + docId: 'team/team', }, { - type: "doc", - label: "Wall of love", - docId: "wall-of-love", + type: 'doc', + label: 'Wall of love', + docId: 'wall-of-love', }, ], }, { - type: "docSidebar", - sidebarId: "productSidebar", - positionL: "left", - label: "Product", + type: 'docSidebar', + sidebarId: 'productSidebar', + positionL: 'left', + label: 'Product', }, { - type: "docSidebar", - sidebarId: "ecosystemSidebar", - position: "left", - label: "Ecosystem", + type: 'docSidebar', + sidebarId: 'ecosystemSidebar', + position: 'left', + label: 'Ecosystem', }, // { // type: "docSidebar", @@ -345,29 +346,29 @@ const config = { // }, // Navbar right { - type: "dropdown", - label: "Docs", - to: "docs", - position: "right", + type: 'dropdown', + label: 'Docs', + to: 'docs', + position: 'right', items: [ { - type: "docSidebar", - sidebarId: "guidesSidebar", - label: "Guides", + type: 'docSidebar', + sidebarId: 'guidesSidebar', + label: 'Guides', }, { - type: "docSidebar", - sidebarId: "developerSidebar", - label: "Developer", + type: 'docSidebar', + sidebarId: 'developerSidebar', + label: 'Developer', }, { - to: "/api-reference", - label: "API Reference", + to: '/api-reference', + label: 'API Reference', }, { - type: "docSidebar", - sidebarId: "releasesSidebar", - label: "Changelog", + type: 'docSidebar', + sidebarId: 'releasesSidebar', + label: 'Changelog', }, // { // type: "docSidebar", @@ -377,9 +378,9 @@ const config = { ], }, { - to: "blog", - label: "Blog", - position: "right", + to: 'blog', + label: 'Blog', + position: 'right', }, ], }, @@ -387,22 +388,22 @@ const config = { theme: darkCodeTheme, darkTheme: darkCodeTheme, additionalLanguages: [ - "python", - "powershell", - "bash", - "json", - "javascript", - "jsx", + 'python', + 'powershell', + 'bash', + 'json', + 'javascript', + 'jsx', ], }, colorMode: { - defaultMode: "light", + defaultMode: 'light', disableSwitch: false, respectPrefersColorScheme: false, }, }, - themes: ["@docusaurus/theme-live-codeblock", "@docusaurus/theme-mermaid"], -}; + themes: ['@docusaurus/theme-live-codeblock', '@docusaurus/theme-mermaid'], +} -module.exports = config; +module.exports = config diff --git a/docs/src/styles/components/typography.scss b/docs/src/styles/components/typography.scss index 42953ac2b..c8b85a3fb 100644 --- a/docs/src/styles/components/typography.scss +++ b/docs/src/styles/components/typography.scss @@ -1,6 +1,5 @@ h1, .h1 { - line-height: 48px; font-size: 40px; @apply font-bold text-black dark:text-white; } @@ -8,35 +7,24 @@ h2, .h2 { font-size: 32px; @apply font-bold text-black dark:text-white; - line-height: 40px; } h3, .h3 { font-size: 28px; @apply font-bold text-black dark:text-white; - line-height: 40px; } h4, .h4 { font-size: 24px; @apply font-bold text-black dark:text-white; - line-height: 32px; } h5, .h5 { font-size: 20px; @apply font-bold text-black dark:text-white; - line-height: 28px; } h6, .h6 { font-size: 16px; @apply font-bold text-black dark:text-white; - line-height: 24px; -} -p { - line-height: 24px; -} -.paragraph { - line-height: 24px; } diff --git a/docs/src/styles/tweaks/markdown.scss b/docs/src/styles/tweaks/markdown.scss index ade07e35b..7ae2772d2 100644 --- a/docs/src/styles/tweaks/markdown.scss +++ b/docs/src/styles/tweaks/markdown.scss @@ -1,9 +1,10 @@ -.theme-doc-markdown { +.theme-doc-markdown, +.markdown { a, p, span, li { - @apply leading-loose; + @apply leading-relaxed; } a { @apply text-blue-600 dark:text-blue-400; @@ -18,7 +19,6 @@ ol { padding-left: 28px; li { - @apply leading-loose; p { margin-bottom: 0; } @@ -34,14 +34,19 @@ } h1, - h2 { - @apply mb-3; + h2, + h3 { + @apply mb-2; } table { width: 100%; display: table; } + + p { + margin-bottom: 16px; + } } .task-list-item {