Compare commits
339 Commits
feat/add-v
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
154301b3ad | ||
|
|
e7b7ac9e94 | ||
|
|
e531eaa4ad | ||
|
|
23b03da714 | ||
|
|
22be93807d | ||
|
|
653ecdb494 | ||
|
|
15c426aefc | ||
|
|
2fa153ac34 | ||
|
|
62bd91a1e1 | ||
|
|
f7e0e790b6 | ||
|
|
c854c54c0c | ||
|
|
a14872666a | ||
|
|
e9f469b623 | ||
|
|
5a016860aa | ||
|
|
c773abb688 | ||
|
|
2561fcd78a | ||
|
|
28ed5e2af2 | ||
|
|
4c5c8e6aed | ||
|
|
f07e43cfe0 | ||
|
|
e46200868e | ||
|
|
147cab94a8 | ||
|
|
2fb956ccaf | ||
|
|
4dee0a4ba1 | ||
|
|
418a48ab39 | ||
|
|
9bc56f6e30 | ||
|
|
f0ca9cce35 | ||
|
|
746dbc632b | ||
|
|
462b05e612 | ||
|
|
946b347f44 | ||
|
|
b23e88f078 | ||
|
|
476fdd6040 | ||
|
|
fa8b3664cb | ||
|
|
8b687619b2 | ||
|
|
176ad07f1d | ||
|
|
7b5060c9be | ||
|
|
584daa9682 | ||
|
|
31f9501d8e | ||
|
|
c096929d8b | ||
|
|
01050f3103 | ||
|
|
45d57dd34d | ||
|
|
f4066e6e5a | ||
|
|
a2fbce698f | ||
|
|
fc784620e0 | ||
|
|
340042682a | ||
|
|
6dd2d2d6c1 | ||
|
|
7762cea10a | ||
|
|
610b741db2 | ||
|
|
814034d3d7 | ||
|
|
839672b82f | ||
|
|
03762c3634 | ||
|
|
59c76bcb1c | ||
|
|
1905f9a9ce | ||
|
|
ff93dc3c5c | ||
|
|
510c4a5188 | ||
|
|
c7d1a3c65d | ||
|
|
999b7b3cd8 | ||
|
|
f224d18d7f | ||
|
|
1bf5c770cf | ||
|
|
613bc85a13 | ||
|
|
b1abc97bda | ||
|
|
eec94c47dd | ||
|
|
b2632a005c | ||
|
|
706dad2687 | ||
|
|
e5be683a97 | ||
|
|
e7fcc809e7 | ||
|
|
26006c143e | ||
|
|
28afafaad7 | ||
|
|
dd1b3c98bf | ||
|
|
3919cd0306 | ||
|
|
7d615b4163 | ||
|
|
4828f34fec | ||
|
|
61c3fd4b5a | ||
|
|
816d60b22a | ||
|
|
310ca7cb23 | ||
|
|
fa397038ef | ||
|
|
dabc49567c | ||
|
|
d8dcba3552 | ||
|
|
f4efd479d5 | ||
|
|
a72c74dbf9 | ||
|
|
6c4dd85e6f | ||
|
|
9bfec5c7b3 | ||
|
|
fe2c2a8687 | ||
|
|
b23aa68254 | ||
|
|
0588cb34c6 | ||
|
|
b32e3ebd60 | ||
|
|
cc77ae3430 | ||
|
|
ac6eda063a | ||
|
|
f160d83ca9 | ||
|
|
13c7ad707e | ||
|
|
17dced03c0 | ||
|
|
39b1ba4691 | ||
|
|
8c7ad408a9 | ||
|
|
f0c4784b7b | ||
|
|
83fc68e27d | ||
|
|
be9a6c0254 | ||
|
|
1acdb77ad1 | ||
|
|
51e7a08118 | ||
|
|
aa0c4b0d1b | ||
|
|
80ee8fd2b2 | ||
|
|
291482cc16 | ||
|
|
154bc17778 | ||
|
|
cc5130c1af | ||
|
|
2d9f20ffb6 | ||
|
|
3e332eceae | ||
|
|
73b241c16f | ||
|
|
8ed68d9c19 | ||
|
|
b5e57a429a | ||
|
|
62fa0ffa57 | ||
|
|
481e9c1130 | ||
|
|
93652ce884 | ||
|
|
fa61163350 | ||
|
|
cb9eb6d238 | ||
|
|
41a93690a1 | ||
|
|
b309d34274 | ||
|
|
ca485b4a35 | ||
|
|
252336d95c | ||
|
|
1d620df625 | ||
|
|
e346b293f6 | ||
|
|
8b448d1c0b | ||
|
|
b628b3d9ab | ||
|
|
cef351bfd0 | ||
|
|
5adaf62975 | ||
|
|
c797283409 | ||
|
|
c4af638a17 | ||
|
|
4da0fd1ca3 | ||
|
|
bdd8549d3e | ||
|
|
24ff36d424 | ||
|
|
524ac11294 | ||
|
|
1747e0ad41 | ||
|
|
08d527366e | ||
|
|
70c6582a58 | ||
|
|
9720ad368e | ||
|
|
d3b4144c5b | ||
|
|
e6f366d373 | ||
|
|
4fbc7873ca | ||
|
|
f537429d2c | ||
|
|
f6f9813ef2 | ||
|
|
eccaa282e0 | ||
|
|
87db633b7d | ||
|
|
ab2bc11465 | ||
|
|
df145d63a9 | ||
|
|
8e10f27cc2 | ||
|
|
9f72debc17 | ||
|
|
1b9efee52c | ||
|
|
d5110de67b | ||
|
|
870c12af9b | ||
|
|
fb8b61c567 | ||
|
|
0f0ba43b7f | ||
|
|
6a4aaaec87 | ||
|
|
a5574eaacb | ||
|
|
247db95bad | ||
|
|
771d097309 | ||
|
|
157ecacb20 | ||
|
|
e0ab77cb24 | ||
|
|
7a36ed238c | ||
|
|
99d1713517 | ||
|
|
d102165028 | ||
|
|
199623b414 | ||
|
|
2679b19e32 | ||
|
|
0de5f17071 | ||
|
|
262a1a9544 | ||
|
|
4cb3c46f89 | ||
|
|
46d55030f0 | ||
|
|
9a72a2d5d5 | ||
|
|
c5a5968bf8 | ||
|
|
d50226b4dd | ||
|
|
817680565e | ||
|
|
84f46dc997 | ||
|
|
3c7eb64353 | ||
|
|
191e6f9714 | ||
|
|
e6bc1182a6 | ||
|
|
82d29e7a7d | ||
|
|
f33c2c205a | ||
|
|
7eacee26d0 | ||
|
|
631a95e018 | ||
|
|
f7be59e99c | ||
|
|
6bd623c020 | ||
|
|
a62852f384 | ||
|
|
508cbe16f8 | ||
|
|
dcb511023d | ||
|
|
4718203960 | ||
|
|
b3fc64049a | ||
|
|
0b8f3e01fb | ||
|
|
2a9166c9f8 | ||
|
|
43d20e2a32 | ||
|
|
6c0fa46784 | ||
|
|
de9c04474e | ||
|
|
c3184bd233 | ||
|
|
334b160012 | ||
|
|
04fcd788a3 | ||
|
|
a3fcd28c12 | ||
|
|
cb02809ffb | ||
|
|
34b254e2d8 | ||
|
|
d315522c5a | ||
|
|
a300a46707 | ||
|
|
c53d8c09c4 | ||
|
|
1c9890649d | ||
|
|
3cbf348585 | ||
|
|
2101242530 | ||
|
|
f718b0f96b | ||
|
|
ccf378f2c6 | ||
|
|
e3e809753c | ||
|
|
8b9aca27bf | ||
|
|
e6d34623b0 | ||
|
|
b69330ffca | ||
|
|
549c962248 | ||
|
|
54d17c9c72 | ||
|
|
5e57caee43 | ||
|
|
70ac13e536 | ||
|
|
eb79642863 | ||
|
|
b062e6840a | ||
|
|
987063fede | ||
|
|
5fd249c72d | ||
|
|
3c4c6d1c50 | ||
|
|
cf8ada5e8e | ||
|
|
e8666ee5ec | ||
|
|
e065e56f5c | ||
|
|
e09c1f0316 | ||
|
|
13aa72a51f | ||
|
|
38ed873de0 | ||
|
|
a9737a1541 | ||
|
|
7f002409e3 | ||
|
|
0ac667d99c | ||
|
|
4166b93e75 | ||
|
|
dda46f30c2 | ||
|
|
0dbf3b1652 | ||
|
|
1504533246 | ||
|
|
f2a3861410 | ||
|
|
a5eb7ea894 | ||
|
|
03ee9c14a3 | ||
|
|
75dee86375 | ||
|
|
ed661bf4a3 | ||
|
|
103681ef98 | ||
|
|
f73e1c4618 | ||
|
|
0cf1b830cf | ||
|
|
b4df56e0d8 | ||
|
|
4d5cc0033a | ||
|
|
a3153ee4cd | ||
|
|
5403e58681 | ||
|
|
311b79fe13 | ||
|
|
86c7496a70 | ||
|
|
abb0da491b | ||
|
|
97cb7c45a5 | ||
|
|
183645c637 | ||
|
|
12012232ac | ||
|
|
03a53cbed3 | ||
|
|
bfbd198202 | ||
|
|
ae171574e8 | ||
|
|
da38384be2 | ||
|
|
220cb3ae0a | ||
|
|
d47a3efe89 | ||
|
|
0c5ccea9d4 | ||
|
|
c091b8cd77 | ||
|
|
7d6e0c22ac | ||
|
|
c6be66e595 | ||
|
|
b422970369 | ||
|
|
580bdc511a | ||
|
|
191c0eec83 | ||
|
|
eeaaf5ce0d | ||
|
|
1dd9adf8d4 | ||
|
|
b7dae19756 | ||
|
|
3d224f8cff | ||
|
|
453df559b5 | ||
|
|
39e3a02b3e | ||
|
|
ea124f7fd4 | ||
|
|
d1c8cd2dc9 | ||
|
|
c12bef55e9 | ||
|
|
1bbea4b30f | ||
|
|
39aa1c4f7e | ||
|
|
32df9fda0f | ||
|
|
55c42ba526 | ||
|
|
cc218b1b40 | ||
|
|
fb9bbb66b0 | ||
|
|
ba3e49928d | ||
|
|
e8cac2823f | ||
|
|
b0ad2a6b7a | ||
|
|
a0aa0074f4 | ||
|
|
c4228855b5 | ||
|
|
0a82fdd784 | ||
|
|
fdf9f40aef | ||
|
|
75396dbd06 | ||
|
|
20c8991f55 | ||
|
|
d806c4719e | ||
|
|
978565e7f0 | ||
|
|
9fb3171d82 | ||
|
|
9923c6028e | ||
|
|
d690e0fa87 | ||
|
|
0fb6413368 | ||
|
|
a8b9e1f147 | ||
|
|
374a1f9771 | ||
|
|
97af43cadb | ||
|
|
2aead28c9b | ||
|
|
11b3a60675 | ||
|
|
ba768d46e6 | ||
|
|
7fe58d6bee | ||
|
|
8479b7c105 | ||
|
|
d994bc8f6a | ||
|
|
45590e3188 | ||
|
|
e0781677ad | ||
|
|
1b120712d4 | ||
|
|
8205c33176 | ||
|
|
b0bca2ac1f | ||
|
|
d0f62fa634 | ||
|
|
e7a1a06395 | ||
|
|
814024982e | ||
|
|
3dcf522224 | ||
|
|
23f14ebbb7 | ||
|
|
e322e46e4b | ||
|
|
57110d2bd7 | ||
|
|
b2c5063e0b | ||
|
|
7780fb3edd | ||
|
|
6747a0e9e2 | ||
|
|
b8da32c14e | ||
|
|
6373625206 | ||
|
|
47b7509d2e | ||
|
|
04e81ba20e | ||
|
|
5c4ce729f7 | ||
|
|
e3c29277f3 | ||
|
|
f639ec70d4 | ||
|
|
a418574841 | ||
|
|
6d131f8cbb | ||
|
|
8e1654961a | ||
|
|
003598204e | ||
|
|
f90398e29a | ||
|
|
f76387ac6a | ||
|
|
15d56e8e7e | ||
|
|
21d0943aa4 | ||
|
|
4205b2a479 | ||
|
|
1cddc4be25 | ||
|
|
adfcb35ca6 | ||
|
|
aae1936620 | ||
|
|
8fa79aa394 | ||
|
|
a49d488ae1 | ||
|
|
224bee5c66 | ||
|
|
fd046a2d08 | ||
|
|
633a6ac032 | ||
|
|
854cc69414 | ||
|
|
e5dccf741a | ||
|
|
fa0ed11258 |
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
blank_issues_enabled: true
|
blank_issues_enabled: true
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Jan Discussions
|
- name: Jan Discussions
|
||||||
url: https://github.com/orgs/menloresearch/discussions/categories/q-a
|
url: https://github.com/orgs/janhq/discussions/categories/q-a
|
||||||
about: Get help, discuss features & roadmap, and share your projects
|
about: Get help, discuss features & roadmap, and share your projects
|
||||||
|
|||||||
4
.github/workflows/jan-server-web-ci-dev.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
|||||||
build-and-preview:
|
build-and-preview:
|
||||||
runs-on: [ubuntu-24-04-docker]
|
runs-on: [ubuntu-24-04-docker]
|
||||||
env:
|
env:
|
||||||
JAN_API_BASE: "https://api-dev.jan.ai/v1"
|
MENLO_PLATFORM_BASE_URL: "https://api-dev.jan.ai/v1"
|
||||||
permissions:
|
permissions:
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
contents: write
|
contents: write
|
||||||
@ -52,7 +52,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build docker image
|
- name: Build docker image
|
||||||
run: |
|
run: |
|
||||||
docker build --build-arg JAN_API_BASE=${{ env.JAN_API_BASE }} -t ${{ steps.vars.outputs.FULL_IMAGE }} .
|
docker build --build-arg MENLO_PLATFORM_BASE_URL=${{ env.MENLO_PLATFORM_BASE_URL }} -t ${{ steps.vars.outputs.FULL_IMAGE }} .
|
||||||
|
|
||||||
- name: Push docker image
|
- name: Push docker image
|
||||||
if: github.event_name == 'push'
|
if: github.event_name == 'push'
|
||||||
|
|||||||
4
.github/workflows/jan-server-web-ci-prod.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
deployments: write
|
deployments: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
env:
|
env:
|
||||||
JAN_API_BASE: "https://api.jan.ai/v1"
|
MENLO_PLATFORM_BASE_URL: "https://api.jan.ai/v1"
|
||||||
GA_MEASUREMENT_ID: "G-YK53MX8M8M"
|
GA_MEASUREMENT_ID: "G-YK53MX8M8M"
|
||||||
CLOUDFLARE_PROJECT_NAME: "jan-server-web"
|
CLOUDFLARE_PROJECT_NAME: "jan-server-web"
|
||||||
steps:
|
steps:
|
||||||
@ -43,7 +43,7 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: make config-yarn && yarn install && yarn build:core && make build-web-app
|
run: make config-yarn && yarn install && yarn build:core && make build-web-app
|
||||||
env:
|
env:
|
||||||
JAN_API_BASE: ${{ env.JAN_API_BASE }}
|
MENLO_PLATFORM_BASE_URL: ${{ env.MENLO_PLATFORM_BASE_URL }}
|
||||||
GA_MEASUREMENT_ID: ${{ env.GA_MEASUREMENT_ID }}
|
GA_MEASUREMENT_ID: ${{ env.GA_MEASUREMENT_ID }}
|
||||||
|
|
||||||
- name: Publish to Cloudflare Pages Production
|
- name: Publish to Cloudflare Pages Production
|
||||||
|
|||||||
4
.github/workflows/jan-server-web-ci-stag.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
|||||||
build-and-preview:
|
build-and-preview:
|
||||||
runs-on: [ubuntu-24-04-docker]
|
runs-on: [ubuntu-24-04-docker]
|
||||||
env:
|
env:
|
||||||
JAN_API_BASE: "https://api-stag.jan.ai/v1"
|
MENLO_PLATFORM_BASE_URL: "https://api-stag.jan.ai/v1"
|
||||||
permissions:
|
permissions:
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
contents: write
|
contents: write
|
||||||
@ -52,7 +52,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Build docker image
|
- name: Build docker image
|
||||||
run: |
|
run: |
|
||||||
docker build --build-arg JAN_API_BASE=${{ env.JAN_API_BASE }} -t ${{ steps.vars.outputs.FULL_IMAGE }} .
|
docker build --build-arg MENLO_PLATFORM_BASE_URL=${{ env.MENLO_PLATFORM_BASE_URL }} -t ${{ steps.vars.outputs.FULL_IMAGE }} .
|
||||||
|
|
||||||
- name: Push docker image
|
- name: Push docker image
|
||||||
if: github.event_name == 'push'
|
if: github.event_name == 'push'
|
||||||
|
|||||||
@ -15,7 +15,6 @@ on:
|
|||||||
- 'pre-install/**'
|
- 'pre-install/**'
|
||||||
- 'Makefile'
|
- 'Makefile'
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'mise.toml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
get-update-version:
|
get-update-version:
|
||||||
|
|||||||
109
.github/workflows/jan-tauri-build-nightly.yaml
vendored
@ -35,7 +35,6 @@ on:
|
|||||||
- 'pre-install/**'
|
- 'pre-install/**'
|
||||||
- 'Makefile'
|
- 'Makefile'
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'mise.toml'
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -169,62 +168,62 @@ jobs:
|
|||||||
AWS_DEFAULT_REGION: ${{ secrets.DELTA_AWS_REGION }}
|
AWS_DEFAULT_REGION: ${{ secrets.DELTA_AWS_REGION }}
|
||||||
AWS_EC2_METADATA_DISABLED: 'true'
|
AWS_EC2_METADATA_DISABLED: 'true'
|
||||||
|
|
||||||
noti-discord-nightly-and-update-url-readme:
|
# noti-discord-nightly-and-update-url-readme:
|
||||||
needs:
|
# needs:
|
||||||
[
|
# [
|
||||||
build-macos,
|
# build-macos,
|
||||||
build-windows-x64,
|
# build-windows-x64,
|
||||||
build-linux-x64,
|
# build-linux-x64,
|
||||||
get-update-version,
|
# get-update-version,
|
||||||
set-public-provider,
|
# set-public-provider,
|
||||||
sync-temp-to-latest,
|
# sync-temp-to-latest,
|
||||||
]
|
# ]
|
||||||
secrets: inherit
|
# secrets: inherit
|
||||||
if: github.event_name == 'schedule'
|
# if: github.event_name == 'schedule'
|
||||||
uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml
|
# uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml
|
||||||
with:
|
# with:
|
||||||
ref: refs/heads/dev
|
# ref: refs/heads/dev
|
||||||
build_reason: Nightly
|
# build_reason: Nightly
|
||||||
push_to_branch: dev
|
# push_to_branch: dev
|
||||||
new_version: ${{ needs.get-update-version.outputs.new_version }}
|
# new_version: ${{ needs.get-update-version.outputs.new_version }}
|
||||||
|
|
||||||
noti-discord-pre-release-and-update-url-readme:
|
# noti-discord-pre-release-and-update-url-readme:
|
||||||
needs:
|
# needs:
|
||||||
[
|
# [
|
||||||
build-macos,
|
# build-macos,
|
||||||
build-windows-x64,
|
# build-windows-x64,
|
||||||
build-linux-x64,
|
# build-linux-x64,
|
||||||
get-update-version,
|
# get-update-version,
|
||||||
set-public-provider,
|
# set-public-provider,
|
||||||
sync-temp-to-latest,
|
# sync-temp-to-latest,
|
||||||
]
|
# ]
|
||||||
secrets: inherit
|
# secrets: inherit
|
||||||
if: github.event_name == 'push'
|
# if: github.event_name == 'push'
|
||||||
uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml
|
# uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml
|
||||||
with:
|
# with:
|
||||||
ref: refs/heads/dev
|
# ref: refs/heads/dev
|
||||||
build_reason: Pre-release
|
# build_reason: Pre-release
|
||||||
push_to_branch: dev
|
# push_to_branch: dev
|
||||||
new_version: ${{ needs.get-update-version.outputs.new_version }}
|
# new_version: ${{ needs.get-update-version.outputs.new_version }}
|
||||||
|
|
||||||
noti-discord-manual-and-update-url-readme:
|
# noti-discord-manual-and-update-url-readme:
|
||||||
needs:
|
# needs:
|
||||||
[
|
# [
|
||||||
build-macos,
|
# build-macos,
|
||||||
build-windows-x64,
|
# build-windows-x64,
|
||||||
build-linux-x64,
|
# build-linux-x64,
|
||||||
get-update-version,
|
# get-update-version,
|
||||||
set-public-provider,
|
# set-public-provider,
|
||||||
sync-temp-to-latest,
|
# sync-temp-to-latest,
|
||||||
]
|
# ]
|
||||||
secrets: inherit
|
# secrets: inherit
|
||||||
if: github.event_name == 'workflow_dispatch' && github.event.inputs.public_provider == 'aws-s3'
|
# if: github.event_name == 'workflow_dispatch' && github.event.inputs.public_provider == 'aws-s3'
|
||||||
uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml
|
# uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml
|
||||||
with:
|
# with:
|
||||||
ref: refs/heads/dev
|
# ref: refs/heads/dev
|
||||||
build_reason: Manual
|
# build_reason: Manual
|
||||||
push_to_branch: dev
|
# push_to_branch: dev
|
||||||
new_version: ${{ needs.get-update-version.outputs.new_version }}
|
# new_version: ${{ needs.get-update-version.outputs.new_version }}
|
||||||
|
|
||||||
comment-pr-build-url:
|
comment-pr-build-url:
|
||||||
needs:
|
needs:
|
||||||
|
|||||||
6
.github/workflows/jan-tauri-build.yaml
vendored
@ -82,11 +82,11 @@ jobs:
|
|||||||
VERSION=${{ needs.get-update-version.outputs.new_version }}
|
VERSION=${{ needs.get-update-version.outputs.new_version }}
|
||||||
PUB_DATE=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")
|
PUB_DATE=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")
|
||||||
LINUX_SIGNATURE="${{ needs.build-linux-x64.outputs.APPIMAGE_SIG }}"
|
LINUX_SIGNATURE="${{ needs.build-linux-x64.outputs.APPIMAGE_SIG }}"
|
||||||
LINUX_URL="https://github.com/menloresearch/jan/releases/download/v${{ needs.get-update-version.outputs.new_version }}/${{ needs.build-linux-x64.outputs.APPIMAGE_FILE_NAME }}"
|
LINUX_URL="https://github.com/janhq/jan/releases/download/v${{ needs.get-update-version.outputs.new_version }}/${{ needs.build-linux-x64.outputs.APPIMAGE_FILE_NAME }}"
|
||||||
WINDOWS_SIGNATURE="${{ needs.build-windows-x64.outputs.WIN_SIG }}"
|
WINDOWS_SIGNATURE="${{ needs.build-windows-x64.outputs.WIN_SIG }}"
|
||||||
WINDOWS_URL="https://github.com/menloresearch/jan/releases/download/v${{ needs.get-update-version.outputs.new_version }}/${{ needs.build-windows-x64.outputs.FILE_NAME }}"
|
WINDOWS_URL="https://github.com/janhq/jan/releases/download/v${{ needs.get-update-version.outputs.new_version }}/${{ needs.build-windows-x64.outputs.FILE_NAME }}"
|
||||||
DARWIN_SIGNATURE="${{ needs.build-macos.outputs.MAC_UNIVERSAL_SIG }}"
|
DARWIN_SIGNATURE="${{ needs.build-macos.outputs.MAC_UNIVERSAL_SIG }}"
|
||||||
DARWIN_URL="https://github.com/menloresearch/jan/releases/download/v${{ needs.get-update-version.outputs.new_version }}/${{ needs.build-macos.outputs.TAR_NAME }}"
|
DARWIN_URL="https://github.com/janhq/jan/releases/download/v${{ needs.get-update-version.outputs.new_version }}/${{ needs.build-macos.outputs.TAR_NAME }}"
|
||||||
|
|
||||||
jq --arg version "$VERSION" \
|
jq --arg version "$VERSION" \
|
||||||
--arg pub_date "$PUB_DATE" \
|
--arg pub_date "$PUB_DATE" \
|
||||||
|
|||||||
@ -29,7 +29,7 @@ jobs:
|
|||||||
local max_retries=3
|
local max_retries=3
|
||||||
local tag
|
local tag
|
||||||
while [ $retries -lt $max_retries ]; do
|
while [ $retries -lt $max_retries ]; do
|
||||||
tag=$(curl -s https://api.github.com/repos/menloresearch/jan/releases/latest | jq -r .tag_name)
|
tag=$(curl -s https://api.github.com/repos/janhq/jan/releases/latest | jq -r .tag_name)
|
||||||
if [ -n "$tag" ] && [ "$tag" != "null" ]; then
|
if [ -n "$tag" ] && [ "$tag" != "null" ]; then
|
||||||
echo $tag
|
echo $tag
|
||||||
return
|
return
|
||||||
|
|||||||
@ -50,6 +50,6 @@ jobs:
|
|||||||
- macOS Universal: https://delta.jan.ai/nightly/Jan-nightly_{{ VERSION }}_universal.dmg
|
- macOS Universal: https://delta.jan.ai/nightly/Jan-nightly_{{ VERSION }}_universal.dmg
|
||||||
- Linux Deb: https://delta.jan.ai/nightly/Jan-nightly_{{ VERSION }}_amd64.deb
|
- Linux Deb: https://delta.jan.ai/nightly/Jan-nightly_{{ VERSION }}_amd64.deb
|
||||||
- Linux AppImage: https://delta.jan.ai/nightly/Jan-nightly_{{ VERSION }}_amd64.AppImage
|
- Linux AppImage: https://delta.jan.ai/nightly/Jan-nightly_{{ VERSION }}_amd64.AppImage
|
||||||
- Github action run: https://github.com/menloresearch/jan/actions/runs/{{ GITHUB_RUN_ID }}
|
- Github action run: https://github.com/janhq/jan/actions/runs/{{ GITHUB_RUN_ID }}
|
||||||
env:
|
env:
|
||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
|
|||||||
@ -70,17 +70,41 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "Version: ${{ inputs.new_version }}"
|
echo "Version: ${{ inputs.new_version }}"
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = false' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = false' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
if [ "${{ inputs.channel }}" != "stable" ]; then
|
if [ "${{ inputs.channel }}" != "stable" ]; then
|
||||||
jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun",
|
jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun"}' ./src-tauri/tauri.linux.conf.json > /tmp/tauri.linux.conf.json
|
||||||
"usr/lib/Jan-${{ inputs.channel }}/resources/lib/libvulkan.so": "resources/lib/libvulkan.so"}' ./src-tauri/tauri.linux.conf.json > /tmp/tauri.linux.conf.json
|
|
||||||
mv /tmp/tauri.linux.conf.json ./src-tauri/tauri.linux.conf.json
|
mv /tmp/tauri.linux.conf.json ./src-tauri/tauri.linux.conf.json
|
||||||
fi
|
fi
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web-app/package.json
|
mv /tmp/package.json web-app/package.json
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
# Update tauri plugin versions
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-hardware/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-llamacpp/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
||||||
|
|
||||||
if [ "${{ inputs.channel }}" != "stable" ]; then
|
if [ "${{ inputs.channel }}" != "stable" ]; then
|
||||||
jq '.plugins.updater.endpoints = ["https://delta.jan.ai/${{ inputs.channel }}/latest.json"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq '.plugins.updater.endpoints = ["https://delta.jan.ai/${{ inputs.channel }}/latest.json"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
@ -100,7 +124,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
RELEASE_CHANNEL: '${{ inputs.channel }}'
|
RELEASE_CHANNEL: '${{ inputs.channel }}'
|
||||||
AUTO_UPDATER_DISABLED: ${{ inputs.disable_updater && 'true' || 'false' }}
|
AUTO_UPDATER_DISABLED: ${{ inputs.disable_updater && 'true' || 'false' }}
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@ -111,4 +135,4 @@ jobs:
|
|||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: jan-linux-amd64-${{ inputs.new_version }}-AppImage
|
name: jan-linux-amd64-${{ inputs.new_version }}-AppImage
|
||||||
path: ./src-tauri/target/release/bundle/appimage/*.AppImage
|
path: ./src-tauri/target/release/bundle/appimage/*.AppImage
|
||||||
|
|||||||
@ -91,20 +91,42 @@ jobs:
|
|||||||
echo "Version: ${{ inputs.new_version }}"
|
echo "Version: ${{ inputs.new_version }}"
|
||||||
# Update tauri.conf.json
|
# Update tauri.conf.json
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
if [ "${{ inputs.channel }}" != "stable" ]; then
|
if [ "${{ inputs.channel }}" != "stable" ]; then
|
||||||
jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun",
|
jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun"}' ./src-tauri/tauri.linux.conf.json > /tmp/tauri.linux.conf.json
|
||||||
"usr/lib/Jan-${{ inputs.channel }}/resources/lib/libvulkan.so": "resources/lib/libvulkan.so"}' ./src-tauri/tauri.linux.conf.json > /tmp/tauri.linux.conf.json
|
|
||||||
mv /tmp/tauri.linux.conf.json ./src-tauri/tauri.linux.conf.json
|
mv /tmp/tauri.linux.conf.json ./src-tauri/tauri.linux.conf.json
|
||||||
fi
|
fi
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web-app/package.json
|
mv /tmp/package.json web-app/package.json
|
||||||
|
|
||||||
# Temporarily enable devtool on prod build
|
# Update tauri plugin versions
|
||||||
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
|
||||||
cat ./src-tauri/Cargo.toml
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-hardware/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-llamacpp/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
|
# Temporarily enable devtool on prod build
|
||||||
|
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
||||||
cat ./src-tauri/Cargo.toml
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
# Change app name for beta and nightly builds
|
# Change app name for beta and nightly builds
|
||||||
@ -116,7 +138,7 @@ jobs:
|
|||||||
.github/scripts/rename-tauri-app.sh ./src-tauri/tauri.conf.json ${{ inputs.channel }}
|
.github/scripts/rename-tauri-app.sh ./src-tauri/tauri.conf.json ${{ inputs.channel }}
|
||||||
|
|
||||||
cat ./src-tauri/tauri.conf.json
|
cat ./src-tauri/tauri.conf.json
|
||||||
|
|
||||||
# Update Cargo.toml
|
# Update Cargo.toml
|
||||||
ctoml ./src-tauri/Cargo.toml package.name "Jan-${{ inputs.channel }}"
|
ctoml ./src-tauri/Cargo.toml package.name "Jan-${{ inputs.channel }}"
|
||||||
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
||||||
@ -161,4 +183,3 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: jan-linux-amd64-flatpak-${{ inputs.new_version }}-AppImage
|
name: jan-linux-amd64-flatpak-${{ inputs.new_version }}-AppImage
|
||||||
path: ./src-tauri/target/release/bundle/appimage/*.AppImage
|
path: ./src-tauri/target/release/bundle/appimage/*.AppImage
|
||||||
|
|
||||||
|
|||||||
@ -53,7 +53,7 @@ on:
|
|||||||
value: ${{ jobs.build-linux-x64.outputs.APPIMAGE_FILE_NAME }}
|
value: ${{ jobs.build-linux-x64.outputs.APPIMAGE_FILE_NAME }}
|
||||||
jobs:
|
jobs:
|
||||||
build-linux-x64:
|
build-linux-x64:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
DEB_SIG: ${{ steps.packageinfo.outputs.DEB_SIG }}
|
DEB_SIG: ${{ steps.packageinfo.outputs.DEB_SIG }}
|
||||||
APPIMAGE_SIG: ${{ steps.packageinfo.outputs.APPIMAGE_SIG }}
|
APPIMAGE_SIG: ${{ steps.packageinfo.outputs.APPIMAGE_SIG }}
|
||||||
@ -108,20 +108,42 @@ jobs:
|
|||||||
echo "Version: ${{ inputs.new_version }}"
|
echo "Version: ${{ inputs.new_version }}"
|
||||||
# Update tauri.conf.json
|
# Update tauri.conf.json
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
if [ "${{ inputs.channel }}" != "stable" ]; then
|
if [ "${{ inputs.channel }}" != "stable" ]; then
|
||||||
jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun",
|
jq '.bundle.linux.deb.files = {"usr/bin/bun": "resources/bin/bun"}' ./src-tauri/tauri.linux.conf.json > /tmp/tauri.linux.conf.json
|
||||||
"usr/lib/Jan-${{ inputs.channel }}/resources/lib/libvulkan.so": "resources/lib/libvulkan.so"}' ./src-tauri/tauri.linux.conf.json > /tmp/tauri.linux.conf.json
|
|
||||||
mv /tmp/tauri.linux.conf.json ./src-tauri/tauri.linux.conf.json
|
mv /tmp/tauri.linux.conf.json ./src-tauri/tauri.linux.conf.json
|
||||||
fi
|
fi
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web-app/package.json
|
mv /tmp/package.json web-app/package.json
|
||||||
|
|
||||||
# Temporarily enable devtool on prod build
|
# Update tauri plugin versions
|
||||||
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
|
||||||
cat ./src-tauri/Cargo.toml
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-hardware/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-llamacpp/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
|
# Temporarily enable devtool on prod build
|
||||||
|
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
||||||
cat ./src-tauri/Cargo.toml
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
# Change app name for beta and nightly builds
|
# Change app name for beta and nightly builds
|
||||||
@ -133,7 +155,7 @@ jobs:
|
|||||||
.github/scripts/rename-tauri-app.sh ./src-tauri/tauri.conf.json ${{ inputs.channel }}
|
.github/scripts/rename-tauri-app.sh ./src-tauri/tauri.conf.json ${{ inputs.channel }}
|
||||||
|
|
||||||
cat ./src-tauri/tauri.conf.json
|
cat ./src-tauri/tauri.conf.json
|
||||||
|
|
||||||
# Update Cargo.toml
|
# Update Cargo.toml
|
||||||
ctoml ./src-tauri/Cargo.toml package.name "Jan-${{ inputs.channel }}"
|
ctoml ./src-tauri/Cargo.toml package.name "Jan-${{ inputs.channel }}"
|
||||||
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
||||||
|
|||||||
@ -42,31 +42,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cargo install ctoml
|
cargo install ctoml
|
||||||
|
|
||||||
- name: Create bun and uv universal
|
|
||||||
run: |
|
|
||||||
mkdir -p ./src-tauri/resources/bin/
|
|
||||||
cd ./src-tauri/resources/bin/
|
|
||||||
curl -L -o bun-darwin-x64.zip https://github.com/oven-sh/bun/releases/download/bun-v1.2.10/bun-darwin-x64.zip
|
|
||||||
curl -L -o bun-darwin-aarch64.zip https://github.com/oven-sh/bun/releases/download/bun-v1.2.10/bun-darwin-aarch64.zip
|
|
||||||
unzip bun-darwin-x64.zip
|
|
||||||
unzip bun-darwin-aarch64.zip
|
|
||||||
lipo -create -output bun-universal-apple-darwin bun-darwin-x64/bun bun-darwin-aarch64/bun
|
|
||||||
cp -f bun-darwin-aarch64/bun bun-aarch64-apple-darwin
|
|
||||||
cp -f bun-darwin-x64/bun bun-x86_64-apple-darwin
|
|
||||||
cp -f bun-universal-apple-darwin bun
|
|
||||||
|
|
||||||
curl -L -o uv-x86_64.tar.gz https://github.com/astral-sh/uv/releases/download/0.6.17/uv-x86_64-apple-darwin.tar.gz
|
|
||||||
curl -L -o uv-arm64.tar.gz https://github.com/astral-sh/uv/releases/download/0.6.17/uv-aarch64-apple-darwin.tar.gz
|
|
||||||
tar -xzf uv-x86_64.tar.gz
|
|
||||||
tar -xzf uv-arm64.tar.gz
|
|
||||||
mv uv-x86_64-apple-darwin uv-x86_64
|
|
||||||
mv uv-aarch64-apple-darwin uv-aarch64
|
|
||||||
lipo -create -output uv-universal-apple-darwin uv-x86_64/uv uv-aarch64/uv
|
|
||||||
cp -f uv-x86_64/uv uv-x86_64-apple-darwin
|
|
||||||
cp -f uv-aarch64/uv uv-aarch64-apple-darwin
|
|
||||||
cp -f uv-universal-apple-darwin uv
|
|
||||||
ls -la
|
|
||||||
|
|
||||||
- name: Update app version
|
- name: Update app version
|
||||||
run: |
|
run: |
|
||||||
echo "Version: ${{ inputs.new_version }}"
|
echo "Version: ${{ inputs.new_version }}"
|
||||||
@ -74,8 +49,35 @@ jobs:
|
|||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web-app/package.json
|
mv /tmp/package.json web-app/package.json
|
||||||
|
|
||||||
|
# Update tauri plugin versions
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-hardware/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-llamacpp/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
ctoml ./src-tauri/Cargo.toml dependencies.tauri.features[] "devtools"
|
||||||
|
|
||||||
if [ "${{ inputs.channel }}" != "stable" ]; then
|
if [ "${{ inputs.channel }}" != "stable" ]; then
|
||||||
jq '.plugins.updater.endpoints = ["https://delta.jan.ai/${{ inputs.channel }}/latest.json"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq '.plugins.updater.endpoints = ["https://delta.jan.ai/${{ inputs.channel }}/latest.json"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
|
|||||||
23
.github/workflows/template-tauri-build-macos.yml
vendored
@ -101,7 +101,30 @@ jobs:
|
|||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web-app/package.json
|
mv /tmp/package.json web-app/package.json
|
||||||
|
|
||||||
|
# Update tauri plugin versions
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-hardware/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-llamacpp/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/Cargo.toml---------"
|
||||||
cat ./src-tauri/Cargo.toml
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
# Temporarily enable devtool on prod build
|
# Temporarily enable devtool on prod build
|
||||||
|
|||||||
@ -49,14 +49,69 @@ jobs:
|
|||||||
# Update tauri.conf.json
|
# Update tauri.conf.json
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = false' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = false' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
|
jq '.bundle.windows.nsis.template = "tauri.bundle.windows.nsis.template"' ./src-tauri/tauri.windows.conf.json > /tmp/tauri.windows.conf.json
|
||||||
|
mv /tmp/tauri.windows.conf.json ./src-tauri/tauri.windows.conf.json
|
||||||
jq '.bundle.windows.signCommand = "echo External build - skipping signature: %1"' ./src-tauri/tauri.windows.conf.json > /tmp/tauri.windows.conf.json
|
jq '.bundle.windows.signCommand = "echo External build - skipping signature: %1"' ./src-tauri/tauri.windows.conf.json > /tmp/tauri.windows.conf.json
|
||||||
mv /tmp/tauri.windows.conf.json ./src-tauri/tauri.windows.conf.json
|
mv /tmp/tauri.windows.conf.json ./src-tauri/tauri.windows.conf.json
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web-app/package.json
|
mv /tmp/package.json web-app/package.json
|
||||||
|
|
||||||
|
# Update tauri plugin versions
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-hardware/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-llamacpp/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
echo "---------Cargo.toml---------"
|
echo "---------./src-tauri/Cargo.toml---------"
|
||||||
cat ./src-tauri/Cargo.toml
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
|
generate_build_version() {
|
||||||
|
### Examble
|
||||||
|
### input 0.5.6 output will be 0.5.6 and 0.5.6.0
|
||||||
|
### input 0.5.6-rc2-beta output will be 0.5.6 and 0.5.6.2
|
||||||
|
### input 0.5.6-1213 output will be 0.5.6 and and 0.5.6.1213
|
||||||
|
local new_version="$1"
|
||||||
|
local base_version
|
||||||
|
local t_value
|
||||||
|
# Check if it has a "-"
|
||||||
|
if [[ "$new_version" == *-* ]]; then
|
||||||
|
base_version="${new_version%%-*}" # part before -
|
||||||
|
suffix="${new_version#*-}" # part after -
|
||||||
|
# Check if it is rcX-beta
|
||||||
|
if [[ "$suffix" =~ ^rc([0-9]+)-beta$ ]]; then
|
||||||
|
t_value="${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
t_value="$suffix"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
base_version="$new_version"
|
||||||
|
t_value="0"
|
||||||
|
fi
|
||||||
|
# Export two values
|
||||||
|
new_base_version="$base_version"
|
||||||
|
new_build_version="${base_version}.${t_value}"
|
||||||
|
}
|
||||||
|
generate_build_version ${{ inputs.new_version }}
|
||||||
|
sed -i "s/jan_version/$new_base_version/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
sed -i "s/jan_build/$new_build_version/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
|
||||||
if [ "${{ inputs.channel }}" != "stable" ]; then
|
if [ "${{ inputs.channel }}" != "stable" ]; then
|
||||||
jq '.plugins.updater.endpoints = ["https://delta.jan.ai/${{ inputs.channel }}/latest.json"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq '.plugins.updater.endpoints = ["https://delta.jan.ai/${{ inputs.channel }}/latest.json"]' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
@ -80,7 +135,14 @@ jobs:
|
|||||||
chmod +x .github/scripts/rename-workspace.sh
|
chmod +x .github/scripts/rename-workspace.sh
|
||||||
.github/scripts/rename-workspace.sh ./package.json ${{ inputs.channel }}
|
.github/scripts/rename-workspace.sh ./package.json ${{ inputs.channel }}
|
||||||
cat ./package.json
|
cat ./package.json
|
||||||
|
sed -i "s/jan_productname/Jan-${{ inputs.channel }}/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
sed -i "s/jan_mainbinaryname/jan-${{ inputs.channel }}/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
else
|
||||||
|
sed -i "s/jan_productname/Jan/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
sed -i "s/jan_mainbinaryname/jan/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
fi
|
fi
|
||||||
|
echo "---------nsis.template---------"
|
||||||
|
cat ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
- name: Build app
|
- name: Build app
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@ -54,6 +54,8 @@ on:
|
|||||||
value: ${{ jobs.build-windows-x64.outputs.WIN_SIG }}
|
value: ${{ jobs.build-windows-x64.outputs.WIN_SIG }}
|
||||||
FILE_NAME:
|
FILE_NAME:
|
||||||
value: ${{ jobs.build-windows-x64.outputs.FILE_NAME }}
|
value: ${{ jobs.build-windows-x64.outputs.FILE_NAME }}
|
||||||
|
MSI_FILE_NAME:
|
||||||
|
value: ${{ jobs.build-windows-x64.outputs.MSI_FILE_NAME }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-windows-x64:
|
build-windows-x64:
|
||||||
@ -61,6 +63,7 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
WIN_SIG: ${{ steps.metadata.outputs.WIN_SIG }}
|
WIN_SIG: ${{ steps.metadata.outputs.WIN_SIG }}
|
||||||
FILE_NAME: ${{ steps.metadata.outputs.FILE_NAME }}
|
FILE_NAME: ${{ steps.metadata.outputs.FILE_NAME }}
|
||||||
|
MSI_FILE_NAME: ${{ steps.metadata.outputs.MSI_FILE_NAME }}
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
@ -95,16 +98,70 @@ jobs:
|
|||||||
# Update tauri.conf.json
|
# Update tauri.conf.json
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version | .bundle.createUpdaterArtifacts = true' ./src-tauri/tauri.conf.json > /tmp/tauri.conf.json
|
||||||
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
mv /tmp/tauri.conf.json ./src-tauri/tauri.conf.json
|
||||||
|
jq '.bundle.windows.nsis.template = "tauri.bundle.windows.nsis.template"' ./src-tauri/tauri.windows.conf.json > /tmp/tauri.windows.conf.json
|
||||||
|
mv /tmp/tauri.windows.conf.json ./src-tauri/tauri.windows.conf.json
|
||||||
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' web-app/package.json > /tmp/package.json
|
||||||
mv /tmp/package.json web-app/package.json
|
mv /tmp/package.json web-app/package.json
|
||||||
|
|
||||||
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
|
||||||
echo "---------Cargo.toml---------"
|
|
||||||
cat ./src-tauri/Cargo.toml
|
|
||||||
|
|
||||||
# Add sign commands to tauri.windows.conf.json
|
# Add sign commands to tauri.windows.conf.json
|
||||||
jq '.bundle.windows.signCommand = "powershell -ExecutionPolicy Bypass -File ./sign.ps1 %1"' ./src-tauri/tauri.windows.conf.json > /tmp/tauri.windows.conf.json
|
jq '.bundle.windows.signCommand = "powershell -ExecutionPolicy Bypass -File ./sign.ps1 %1"' ./src-tauri/tauri.windows.conf.json > /tmp/tauri.windows.conf.json
|
||||||
mv /tmp/tauri.windows.conf.json ./src-tauri/tauri.windows.conf.json
|
mv /tmp/tauri.windows.conf.json ./src-tauri/tauri.windows.conf.json
|
||||||
|
|
||||||
|
# Update tauri plugin versions
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-hardware/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/package.json
|
||||||
|
|
||||||
|
jq --arg version "${{ inputs.new_version }}" '.version = $version' ./src-tauri/plugins/tauri-plugin-llamacpp/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/package.json---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/package.json
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-hardware/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/plugins/tauri-plugin-llamacpp/Cargo.toml
|
||||||
|
|
||||||
|
ctoml ./src-tauri/Cargo.toml package.version "${{ inputs.new_version }}"
|
||||||
|
echo "---------./src-tauri/Cargo.toml---------"
|
||||||
|
cat ./src-tauri/Cargo.toml
|
||||||
|
|
||||||
|
generate_build_version() {
|
||||||
|
### Example
|
||||||
|
### input 0.5.6 output will be 0.5.6 and 0.5.6.0
|
||||||
|
### input 0.5.6-rc2-beta output will be 0.5.6 and 0.5.6.2
|
||||||
|
### input 0.5.6-1213 output will be 0.5.6 and and 0.5.6.1213
|
||||||
|
local new_version="$1"
|
||||||
|
local base_version
|
||||||
|
local t_value
|
||||||
|
# Check if it has a "-"
|
||||||
|
if [[ "$new_version" == *-* ]]; then
|
||||||
|
base_version="${new_version%%-*}" # part before -
|
||||||
|
suffix="${new_version#*-}" # part after -
|
||||||
|
# Check if it is rcX-beta
|
||||||
|
if [[ "$suffix" =~ ^rc([0-9]+)-beta$ ]]; then
|
||||||
|
t_value="${BASH_REMATCH[1]}"
|
||||||
|
else
|
||||||
|
t_value="$suffix"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
base_version="$new_version"
|
||||||
|
t_value="0"
|
||||||
|
fi
|
||||||
|
# Export two values
|
||||||
|
new_base_version="$base_version"
|
||||||
|
new_build_version="${base_version}.${t_value}"
|
||||||
|
}
|
||||||
|
generate_build_version ${{ inputs.new_version }}
|
||||||
|
sed -i "s/jan_version/$new_base_version/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
sed -i "s/jan_build/$new_build_version/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
|
||||||
echo "---------tauri.windows.conf.json---------"
|
echo "---------tauri.windows.conf.json---------"
|
||||||
cat ./src-tauri/tauri.windows.conf.json
|
cat ./src-tauri/tauri.windows.conf.json
|
||||||
@ -138,7 +195,14 @@ jobs:
|
|||||||
chmod +x .github/scripts/rename-workspace.sh
|
chmod +x .github/scripts/rename-workspace.sh
|
||||||
.github/scripts/rename-workspace.sh ./package.json ${{ inputs.channel }}
|
.github/scripts/rename-workspace.sh ./package.json ${{ inputs.channel }}
|
||||||
cat ./package.json
|
cat ./package.json
|
||||||
|
sed -i "s/jan_productname/Jan-${{ inputs.channel }}/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
sed -i "s/jan_mainbinaryname/jan-${{ inputs.channel }}/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
else
|
||||||
|
sed -i "s/jan_productname/Jan/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
sed -i "s/jan_mainbinaryname/jan/g" ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
fi
|
fi
|
||||||
|
echo "---------nsis.template---------"
|
||||||
|
cat ./src-tauri/tauri.bundle.windows.nsis.template
|
||||||
|
|
||||||
- name: Install AzureSignTool
|
- name: Install AzureSignTool
|
||||||
run: |
|
run: |
|
||||||
@ -167,9 +231,15 @@ jobs:
|
|||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: jan-windows-${{ inputs.new_version }}
|
name: jan-windows-exe-${{ inputs.new_version }}
|
||||||
path: |
|
path: |
|
||||||
./src-tauri/target/release/bundle/nsis/*.exe
|
./src-tauri/target/release/bundle/nsis/*.exe
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: jan-windows-msi-${{ inputs.new_version }}
|
||||||
|
path: |
|
||||||
|
./src-tauri/target/release/bundle/msi/*.msi
|
||||||
|
|
||||||
## Set output filename for windows
|
## Set output filename for windows
|
||||||
- name: Set output filename for windows
|
- name: Set output filename for windows
|
||||||
@ -179,13 +249,18 @@ jobs:
|
|||||||
if [ "${{ inputs.channel }}" != "stable" ]; then
|
if [ "${{ inputs.channel }}" != "stable" ]; then
|
||||||
FILE_NAME=Jan-${{ inputs.channel }}_${{ inputs.new_version }}_x64-setup.exe
|
FILE_NAME=Jan-${{ inputs.channel }}_${{ inputs.new_version }}_x64-setup.exe
|
||||||
WIN_SIG=$(cat Jan-${{ inputs.channel }}_${{ inputs.new_version }}_x64-setup.exe.sig)
|
WIN_SIG=$(cat Jan-${{ inputs.channel }}_${{ inputs.new_version }}_x64-setup.exe.sig)
|
||||||
|
|
||||||
|
MSI_FILE="Jan-${{ inputs.channel }}_${{ inputs.new_version }}_x64_en-US.msi"
|
||||||
else
|
else
|
||||||
FILE_NAME=Jan_${{ inputs.new_version }}_x64-setup.exe
|
FILE_NAME=Jan_${{ inputs.new_version }}_x64-setup.exe
|
||||||
WIN_SIG=$(cat Jan_${{ inputs.new_version }}_x64-setup.exe.sig)
|
WIN_SIG=$(cat Jan_${{ inputs.new_version }}_x64-setup.exe.sig)
|
||||||
|
|
||||||
|
MSI_FILE="Jan_${{ inputs.new_version }}_x64_en-US.msi"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "::set-output name=WIN_SIG::$WIN_SIG"
|
echo "::set-output name=WIN_SIG::$WIN_SIG"
|
||||||
echo "::set-output name=FILE_NAME::$FILE_NAME"
|
echo "::set-output name=FILE_NAME::$FILE_NAME"
|
||||||
|
echo "::set-output name=MSI_FILE_NAME::$MSI_FILE"
|
||||||
id: metadata
|
id: metadata
|
||||||
|
|
||||||
## Upload to s3 for nightly and beta
|
## Upload to s3 for nightly and beta
|
||||||
|
|||||||
3
.gitignore
vendored
@ -21,11 +21,13 @@ src-tauri/resources/lib
|
|||||||
src-tauri/icons
|
src-tauri/icons
|
||||||
!src-tauri/icons/icon.png
|
!src-tauri/icons/icon.png
|
||||||
src-tauri/gen/apple
|
src-tauri/gen/apple
|
||||||
|
src-tauri/gen/android
|
||||||
src-tauri/resources/bin
|
src-tauri/resources/bin
|
||||||
|
|
||||||
# Helper tools
|
# Helper tools
|
||||||
.opencode
|
.opencode
|
||||||
OpenCode.md
|
OpenCode.md
|
||||||
|
Claude.md
|
||||||
archive/
|
archive/
|
||||||
.cache/
|
.cache/
|
||||||
|
|
||||||
@ -60,3 +62,4 @@ src-tauri/resources/
|
|||||||
## test
|
## test
|
||||||
test-data
|
test-data
|
||||||
llm-docs
|
llm-docs
|
||||||
|
.claude/agents
|
||||||
|
|||||||
@ -126,8 +126,7 @@ jan/
|
|||||||
├── scripts/ # Build utilities
|
├── scripts/ # Build utilities
|
||||||
│
|
│
|
||||||
├── package.json # Root workspace configuration
|
├── package.json # Root workspace configuration
|
||||||
├── Makefile # Build automation commands
|
├── Makefile # Build automation commands
|
||||||
├── mise.toml # Mise tool configuration
|
|
||||||
├── LICENSE # Apache 2.0 license
|
├── LICENSE # Apache 2.0 license
|
||||||
└── README.md # Project overview
|
└── README.md # Project overview
|
||||||
```
|
```
|
||||||
@ -144,30 +143,17 @@ jan/
|
|||||||
|
|
||||||
**Option 1: The Easy Way (Make)**
|
**Option 1: The Easy Way (Make)**
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/menloresearch/jan
|
git clone https://github.com/janhq/jan
|
||||||
cd jan
|
cd jan
|
||||||
make dev
|
make dev
|
||||||
```
|
```
|
||||||
|
|
||||||
**Option 2: The Easier Way (Mise)**
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/menloresearch/jan
|
|
||||||
cd jan
|
|
||||||
|
|
||||||
# Install mise
|
|
||||||
curl https://mise.run | sh
|
|
||||||
|
|
||||||
# Let mise handle everything
|
|
||||||
mise install # installs Node.js, Rust, and other tools
|
|
||||||
mise dev # runs the full development setup
|
|
||||||
```
|
|
||||||
|
|
||||||
## How Can I Contribute?
|
## How Can I Contribute?
|
||||||
|
|
||||||
### Reporting Bugs
|
### Reporting Bugs
|
||||||
|
|
||||||
- **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/menloresearch/jan/issues)
|
- **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/janhq/jan/issues)
|
||||||
- If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/menloresearch/jan/issues/new)
|
- If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/janhq/jan/issues/new)
|
||||||
- Include your system specs and error logs - it helps a ton
|
- Include your system specs and error logs - it helps a ton
|
||||||
|
|
||||||
### Suggesting Enhancements
|
### Suggesting Enhancements
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
# Stage 1: Build stage with Node.js and Yarn v4
|
# Stage 1: Build stage with Node.js and Yarn v4
|
||||||
FROM node:20-alpine AS builder
|
FROM node:20-alpine AS builder
|
||||||
|
|
||||||
ARG JAN_API_BASE=https://api-dev.jan.ai/v1
|
ARG MENLO_PLATFORM_BASE_URL=https://api-dev.menlo.ai/v1
|
||||||
ENV JAN_API_BASE=$JAN_API_BASE
|
ENV MENLO_PLATFORM_BASE_URL=$MENLO_PLATFORM_BASE_URL
|
||||||
|
|
||||||
# Install build dependencies
|
# Install build dependencies
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
|
|||||||
52
Makefile
@ -41,9 +41,25 @@ else
|
|||||||
@echo "Not macOS; skipping Rust target installation."
|
@echo "Not macOS; skipping Rust target installation."
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Install required Rust targets for Android builds
|
||||||
|
install-android-rust-targets:
|
||||||
|
@echo "Checking and installing Android Rust targets..."
|
||||||
|
@rustup target list --installed | grep -q "aarch64-linux-android" || rustup target add aarch64-linux-android
|
||||||
|
@rustup target list --installed | grep -q "armv7-linux-androideabi" || rustup target add armv7-linux-androideabi
|
||||||
|
@rustup target list --installed | grep -q "i686-linux-android" || rustup target add i686-linux-android
|
||||||
|
@rustup target list --installed | grep -q "x86_64-linux-android" || rustup target add x86_64-linux-android
|
||||||
|
@echo "Android Rust targets ready!"
|
||||||
|
|
||||||
|
# Install required Rust targets for iOS builds
|
||||||
|
install-ios-rust-targets:
|
||||||
|
@echo "Checking and installing iOS Rust targets..."
|
||||||
|
@rustup target list --installed | grep -q "aarch64-apple-ios" || rustup target add aarch64-apple-ios
|
||||||
|
@rustup target list --installed | grep -q "aarch64-apple-ios-sim" || rustup target add aarch64-apple-ios-sim
|
||||||
|
@rustup target list --installed | grep -q "x86_64-apple-ios" || rustup target add x86_64-apple-ios
|
||||||
|
@echo "iOS Rust targets ready!"
|
||||||
|
|
||||||
dev: install-and-build
|
dev: install-and-build
|
||||||
yarn download:bin
|
yarn download:bin
|
||||||
yarn download:lib
|
|
||||||
yarn dev
|
yarn dev
|
||||||
|
|
||||||
# Web application targets
|
# Web application targets
|
||||||
@ -58,12 +74,41 @@ build-web-app: install-web-app
|
|||||||
yarn build:core
|
yarn build:core
|
||||||
yarn build:web-app
|
yarn build:web-app
|
||||||
|
|
||||||
serve-web-app:
|
serve-web-app:
|
||||||
yarn serve:web-app
|
yarn serve:web-app
|
||||||
|
|
||||||
build-serve-web-app: build-web-app
|
build-serve-web-app: build-web-app
|
||||||
yarn serve:web-app
|
yarn serve:web-app
|
||||||
|
|
||||||
|
# Mobile
|
||||||
|
dev-android: install-and-build install-android-rust-targets
|
||||||
|
@echo "Setting up Android development environment..."
|
||||||
|
@if [ ! -d "src-tauri/gen/android" ]; then \
|
||||||
|
echo "Android app not initialized. Initializing..."; \
|
||||||
|
yarn tauri android init; \
|
||||||
|
fi
|
||||||
|
@echo "Sourcing Android environment setup..."
|
||||||
|
@bash autoqa/scripts/setup-android-env.sh echo "Android environment ready"
|
||||||
|
@echo "Starting Android development server..."
|
||||||
|
yarn dev:android
|
||||||
|
|
||||||
|
dev-ios: install-and-build install-ios-rust-targets
|
||||||
|
@echo "Setting up iOS development environment..."
|
||||||
|
ifeq ($(shell uname -s),Darwin)
|
||||||
|
@if [ ! -d "src-tauri/gen/ios" ]; then \
|
||||||
|
echo "iOS app not initialized. Initializing..."; \
|
||||||
|
yarn tauri ios init; \
|
||||||
|
fi
|
||||||
|
@echo "Checking iOS development requirements..."
|
||||||
|
@xcrun --version > /dev/null 2>&1 || (echo "❌ Xcode command line tools not found. Install with: xcode-select --install" && exit 1)
|
||||||
|
@xcrun simctl list devices available | grep -q "iPhone\|iPad" || (echo "❌ No iOS simulators found. Install simulators through Xcode." && exit 1)
|
||||||
|
@echo "Starting iOS development server..."
|
||||||
|
yarn dev:ios
|
||||||
|
else
|
||||||
|
@echo "❌ iOS development is only supported on macOS"
|
||||||
|
@exit 1
|
||||||
|
endif
|
||||||
|
|
||||||
# Linting
|
# Linting
|
||||||
lint: install-and-build
|
lint: install-and-build
|
||||||
yarn lint
|
yarn lint
|
||||||
@ -71,7 +116,8 @@ lint: install-and-build
|
|||||||
# Testing
|
# Testing
|
||||||
test: lint
|
test: lint
|
||||||
yarn download:bin
|
yarn download:bin
|
||||||
yarn download:lib
|
ifeq ($(OS),Windows_NT)
|
||||||
|
endif
|
||||||
yarn test
|
yarn test
|
||||||
yarn copy:assets:tauri
|
yarn copy:assets:tauri
|
||||||
yarn build:icon
|
yarn build:icon
|
||||||
|
|||||||
64
README.md
@ -1,26 +1,24 @@
|
|||||||
# Jan - Local AI Assistant
|
# Jan - Open-source ChatGPT replacement
|
||||||
|
|
||||||

|
<img width="2048" height="280" alt="github jan banner" src="https://github.com/user-attachments/assets/f3f87889-c133-433b-b250-236218150d3f" />
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||||
<img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/menloresearch/jan"/>
|
<img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/janhq/jan"/>
|
||||||
<img alt="Github Last Commit" src="https://img.shields.io/github/last-commit/menloresearch/jan"/>
|
<img alt="Github Last Commit" src="https://img.shields.io/github/last-commit/janhq/jan"/>
|
||||||
<img alt="Github Contributors" src="https://img.shields.io/github/contributors/menloresearch/jan"/>
|
<img alt="Github Contributors" src="https://img.shields.io/github/contributors/janhq/jan"/>
|
||||||
<img alt="GitHub closed issues" src="https://img.shields.io/github/issues-closed/menloresearch/jan"/>
|
<img alt="GitHub closed issues" src="https://img.shields.io/github/issues-closed/janhq/jan"/>
|
||||||
<img alt="Discord" src="https://img.shields.io/discord/1107178041848909847?label=discord"/>
|
<img alt="Discord" src="https://img.shields.io/discord/1107178041848909847?label=discord"/>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://jan.ai/docs/quickstart">Getting Started</a>
|
<a href="https://www.jan.ai/docs/desktop">Getting Started</a>
|
||||||
- <a href="https://jan.ai/docs">Docs</a>
|
- <a href="https://discord.gg/Exe46xPMbK">Community</a>
|
||||||
- <a href="https://jan.ai/changelog">Changelog</a>
|
- <a href="https://jan.ai/changelog">Changelog</a>
|
||||||
- <a href="https://github.com/menloresearch/jan/issues">Bug reports</a>
|
- <a href="https://github.com/janhq/jan/issues">Bug reports</a>
|
||||||
- <a href="https://discord.gg/AsJ8krTT3N">Discord</a>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
Jan is an AI assistant that can run 100% offline on your device. Download and run LLMs with
|
Jan is bringing the best of open-source AI in an easy-to-use product. Download and run LLMs with **full control** and **privacy**.
|
||||||
**full control** and **privacy**.
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@ -29,41 +27,36 @@ The easiest way to get started is by downloading one of the following versions f
|
|||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Platform</b></td>
|
<td><b>Platform</b></td>
|
||||||
<td><b>Stable</b></td>
|
<td><b>Download</b></td>
|
||||||
<td><b>Nightly</b></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Windows</b></td>
|
<td><b>Windows</b></td>
|
||||||
<td><a href='https://app.jan.ai/download/latest/win-x64'>jan.exe</a></td>
|
<td><a href='https://app.jan.ai/download/latest/win-x64'>jan.exe</a></td>
|
||||||
<td><a href='https://app.jan.ai/download/nightly/win-x64'>jan.exe</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>macOS</b></td>
|
<td><b>macOS</b></td>
|
||||||
<td><a href='https://app.jan.ai/download/latest/mac-universal'>jan.dmg</a></td>
|
<td><a href='https://app.jan.ai/download/latest/mac-universal'>jan.dmg</a></td>
|
||||||
<td><a href='https://app.jan.ai/download/nightly/mac-universal'>jan.dmg</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Linux (deb)</b></td>
|
<td><b>Linux (deb)</b></td>
|
||||||
<td><a href='https://app.jan.ai/download/latest/linux-amd64-deb'>jan.deb</a></td>
|
<td><a href='https://app.jan.ai/download/latest/linux-amd64-deb'>jan.deb</a></td>
|
||||||
<td><a href='https://app.jan.ai/download/nightly/linux-amd64-deb'>jan.deb</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>Linux (AppImage)</b></td>
|
<td><b>Linux (AppImage)</b></td>
|
||||||
<td><a href='https://app.jan.ai/download/latest/linux-amd64-appimage'>jan.AppImage</a></td>
|
<td><a href='https://app.jan.ai/download/latest/linux-amd64-appimage'>jan.AppImage</a></td>
|
||||||
<td><a href='https://app.jan.ai/download/nightly/linux-amd64-appimage'>jan.AppImage</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
Download from [jan.ai](https://jan.ai/) or [GitHub Releases](https://github.com/menloresearch/jan/releases).
|
|
||||||
|
|
||||||
|
Download from [jan.ai](https://jan.ai/) or [GitHub Releases](https://github.com/janhq/jan/releases).
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **Local AI Models**: Download and run LLMs (Llama, Gemma, Qwen, etc.) from HuggingFace
|
- **Local AI Models**: Download and run LLMs (Llama, Gemma, Qwen, GPT-oss etc.) from HuggingFace
|
||||||
- **Cloud Integration**: Connect to OpenAI, Anthropic, Mistral, Groq, and others
|
- **Cloud Integration**: Connect to GPT models via OpenAI, Claude models via Anthropic, Mistral, Groq, and others
|
||||||
- **Custom Assistants**: Create specialized AI assistants for your tasks
|
- **Custom Assistants**: Create specialized AI assistants for your tasks
|
||||||
- **OpenAI-Compatible API**: Local server at `localhost:1337` for other applications
|
- **OpenAI-Compatible API**: Local server at `localhost:1337` for other applications
|
||||||
- **Model Context Protocol**: MCP integration for enhanced capabilities
|
- **Model Context Protocol**: MCP integration for agentic capabilities
|
||||||
- **Privacy First**: Everything runs locally when you want it to
|
- **Privacy First**: Everything runs locally when you want it to
|
||||||
|
|
||||||
## Build from Source
|
## Build from Source
|
||||||
@ -80,7 +73,7 @@ For those who enjoy the scenic route:
|
|||||||
### Run with Make
|
### Run with Make
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/menloresearch/jan
|
git clone https://github.com/janhq/jan
|
||||||
cd jan
|
cd jan
|
||||||
make dev
|
make dev
|
||||||
```
|
```
|
||||||
@ -93,29 +86,6 @@ This handles everything: installs dependencies, builds core components, and laun
|
|||||||
- `make test` - Run tests and linting
|
- `make test` - Run tests and linting
|
||||||
- `make clean` - Delete everything and start fresh
|
- `make clean` - Delete everything and start fresh
|
||||||
|
|
||||||
### Run with Mise (easier)
|
|
||||||
|
|
||||||
You can also run with [mise](https://mise.jdx.dev/), which is a bit easier as it ensures Node.js, Rust, and other dependency versions are automatically managed:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/menloresearch/jan
|
|
||||||
cd jan
|
|
||||||
|
|
||||||
# Install mise (if not already installed)
|
|
||||||
curl https://mise.run | sh
|
|
||||||
|
|
||||||
# Install tools and start development
|
|
||||||
mise install # installs Node.js, Rust, and other tools
|
|
||||||
mise dev # runs the full development setup
|
|
||||||
```
|
|
||||||
|
|
||||||
**Available mise commands:**
|
|
||||||
- `mise dev` - Full development setup and launch
|
|
||||||
- `mise build` - Production build
|
|
||||||
- `mise test` - Run tests and linting
|
|
||||||
- `mise clean` - Delete everything and start fresh
|
|
||||||
- `mise tasks` - List all available tasks
|
|
||||||
|
|
||||||
### Manual Commands
|
### Manual Commands
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -158,7 +128,7 @@ Contributions welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full spiel
|
|||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
- **Bugs**: [GitHub Issues](https://github.com/menloresearch/jan/issues)
|
- **Bugs**: [GitHub Issues](https://github.com/janhq/jan/issues)
|
||||||
- **Business**: hello@jan.ai
|
- **Business**: hello@jan.ai
|
||||||
- **Jobs**: hr@jan.ai
|
- **Jobs**: hr@jan.ai
|
||||||
- **General Discussion**: [Discord](https://discord.gg/FTk2MvZwJH)
|
- **General Discussion**: [Discord](https://discord.gg/FTk2MvZwJH)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
# Core dependencies
|
# Core dependencies
|
||||||
cua-computer[all]~=0.3.5
|
cua-computer[all]~=0.3.5
|
||||||
cua-agent[all]~=0.3.0
|
cua-agent[all]~=0.3.0
|
||||||
cua-agent @ git+https://github.com/menloresearch/cua.git@compute-agent-0.3.0-patch#subdirectory=libs/python/agent
|
cua-agent @ git+https://github.com/janhq/cua.git@compute-agent-0.3.0-patch#subdirectory=libs/python/agent
|
||||||
|
|
||||||
# ReportPortal integration
|
# ReportPortal integration
|
||||||
reportportal-client~=5.6.5
|
reportportal-client~=5.6.5
|
||||||
|
|||||||
80
autoqa/scripts/setup-android-env.sh
Executable file
@ -0,0 +1,80 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Android Development Environment Setup for Jan
|
||||||
|
|
||||||
|
# Ensure rustup's Rust toolchain is used instead of Homebrew's
|
||||||
|
export PATH="$HOME/.cargo/bin:$PATH"
|
||||||
|
|
||||||
|
# Set JAVA_HOME for Android builds
|
||||||
|
export JAVA_HOME=/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home
|
||||||
|
export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"
|
||||||
|
|
||||||
|
export ANDROID_HOME="$HOME/Library/Android/sdk"
|
||||||
|
export ANDROID_NDK_ROOT="$HOME/Library/Android/sdk/ndk/29.0.14033849"
|
||||||
|
export NDK_HOME="$HOME/Library/Android/sdk/ndk/29.0.14033849"
|
||||||
|
|
||||||
|
# Add Android tools to PATH
|
||||||
|
export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin
|
||||||
|
|
||||||
|
# Set up CC and CXX for Android compilation
|
||||||
|
export CC_aarch64_linux_android="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang"
|
||||||
|
export CXX_aarch64_linux_android="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang++"
|
||||||
|
export AR_aarch64_linux_android="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar"
|
||||||
|
export RANLIB_aarch64_linux_android="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib"
|
||||||
|
|
||||||
|
# Additional environment variables for Rust cross-compilation
|
||||||
|
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang"
|
||||||
|
|
||||||
|
# Only set global CC and AR for Android builds (when IS_ANDROID is set)
|
||||||
|
if [ "$IS_ANDROID" = "true" ]; then
|
||||||
|
export CC="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang"
|
||||||
|
export AR="$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar"
|
||||||
|
echo "Global CC and AR set for Android build"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create symlinks for Android tools if they don't exist
|
||||||
|
mkdir -p ~/.local/bin
|
||||||
|
if [ ! -f ~/.local/bin/aarch64-linux-android-ranlib ]; then
|
||||||
|
ln -sf $NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib ~/.local/bin/aarch64-linux-android-ranlib
|
||||||
|
fi
|
||||||
|
if [ ! -f ~/.local/bin/aarch64-linux-android-clang ]; then
|
||||||
|
ln -sf $NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang ~/.local/bin/aarch64-linux-android-clang
|
||||||
|
fi
|
||||||
|
if [ ! -f ~/.local/bin/aarch64-linux-android-clang++ ]; then
|
||||||
|
ln -sf $NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android21-clang++ ~/.local/bin/aarch64-linux-android-clang++
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fix the broken clang symlinks by ensuring base clang is available
|
||||||
|
if [ ! -f ~/.local/bin/clang ]; then
|
||||||
|
ln -sf $NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang ~/.local/bin/clang
|
||||||
|
fi
|
||||||
|
if [ ! -f ~/.local/bin/clang++ ]; then
|
||||||
|
ln -sf $NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ ~/.local/bin/clang++
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create symlinks for target-specific ar tools
|
||||||
|
if [ ! -f ~/.local/bin/aarch64-linux-android-ar ]; then
|
||||||
|
ln -sf $NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar ~/.local/bin/aarch64-linux-android-ar
|
||||||
|
fi
|
||||||
|
export PATH="$HOME/.local/bin:$PATH"
|
||||||
|
|
||||||
|
echo "Android environment configured:"
|
||||||
|
echo "ANDROID_HOME: $ANDROID_HOME"
|
||||||
|
echo "ANDROID_NDK_ROOT: $ANDROID_NDK_ROOT"
|
||||||
|
echo "PATH includes NDK toolchain: $(echo $PATH | grep -o "ndk.*bin" || echo "NOT FOUND")"
|
||||||
|
|
||||||
|
# Verify required tools
|
||||||
|
echo -e "\nChecking required tools:"
|
||||||
|
which adb && echo "✅ adb found" || echo "❌ adb not found"
|
||||||
|
which emulator && echo "✅ emulator found" || echo "❌ emulator not found"
|
||||||
|
which $CC_aarch64_linux_android && echo "✅ Android clang found" || echo "❌ Android clang not found"
|
||||||
|
|
||||||
|
# Show available AVDs
|
||||||
|
echo -e "\nAvailable Android Virtual Devices:"
|
||||||
|
emulator -list-avds 2>/dev/null || echo "No AVDs found"
|
||||||
|
|
||||||
|
# Execute the provided command
|
||||||
|
if [ "$1" ]; then
|
||||||
|
echo -e "\nExecuting: $@"
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
@ -13,7 +13,7 @@ import * as core from '@janhq/core'
|
|||||||
|
|
||||||
## Build an Extension
|
## Build an Extension
|
||||||
|
|
||||||
1. Download an extension template, for example, [https://github.com/menloresearch/extension-template](https://github.com/menloresearch/extension-template).
|
1. Download an extension template, for example, [https://github.com/janhq/extension-template](https://github.com/janhq/extension-template).
|
||||||
|
|
||||||
2. Update the source code:
|
2. Update the source code:
|
||||||
|
|
||||||
|
|||||||
@ -27,11 +27,13 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@npmcli/arborist": "^7.1.0",
|
"@npmcli/arborist": "^7.1.0",
|
||||||
"@types/node": "^22.10.0",
|
"@types/node": "^22.10.0",
|
||||||
|
"@types/react": "19.1.2",
|
||||||
"@vitest/coverage-v8": "^2.1.8",
|
"@vitest/coverage-v8": "^2.1.8",
|
||||||
"@vitest/ui": "^2.1.8",
|
"@vitest/ui": "^2.1.8",
|
||||||
"eslint": "8.57.0",
|
"eslint": "8.57.0",
|
||||||
"happy-dom": "^15.11.6",
|
"happy-dom": "^20.0.0",
|
||||||
"pacote": "^21.0.0",
|
"pacote": "^21.0.0",
|
||||||
|
"react": "19.0.0",
|
||||||
"request": "^2.88.2",
|
"request": "^2.88.2",
|
||||||
"request-progress": "^3.0.0",
|
"request-progress": "^3.0.0",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
@ -44,5 +46,8 @@
|
|||||||
"rxjs": "^7.8.1",
|
"rxjs": "^7.8.1",
|
||||||
"ulidx": "^2.3.0"
|
"ulidx": "^2.3.0"
|
||||||
},
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "19.0.0"
|
||||||
|
},
|
||||||
"packageManager": "yarn@4.5.3"
|
"packageManager": "yarn@4.5.3"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ export default defineConfig([
|
|||||||
sourcemap: true,
|
sourcemap: true,
|
||||||
},
|
},
|
||||||
platform: 'browser',
|
platform: 'browser',
|
||||||
external: ['path'],
|
external: ['path', 'react', 'react-dom', 'react/jsx-runtime'],
|
||||||
define: {
|
define: {
|
||||||
NODE: JSON.stringify(`${pkgJson.name}/${pkgJson.node}`),
|
NODE: JSON.stringify(`${pkgJson.name}/${pkgJson.node}`),
|
||||||
VERSION: JSON.stringify(pkgJson.version),
|
VERSION: JSON.stringify(pkgJson.version),
|
||||||
|
|||||||
@ -11,6 +11,8 @@ export enum ExtensionTypeEnum {
|
|||||||
HuggingFace = 'huggingFace',
|
HuggingFace = 'huggingFace',
|
||||||
Engine = 'engine',
|
Engine = 'engine',
|
||||||
Hardware = 'hardware',
|
Hardware = 'hardware',
|
||||||
|
RAG = 'rag',
|
||||||
|
VectorDB = 'vectorDB',
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExtensionType {
|
export interface ExtensionType {
|
||||||
|
|||||||
@ -250,4 +250,4 @@ describe('ConversationalExtension', () => {
|
|||||||
|
|
||||||
expect(retrievedAssistant.modelId).toBe('')
|
expect(retrievedAssistant.modelId).toBe('')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -182,6 +182,7 @@ export interface SessionInfo {
|
|||||||
port: number // llama-server output port (corrected from portid)
|
port: number // llama-server output port (corrected from portid)
|
||||||
model_id: string //name of the model
|
model_id: string //name of the model
|
||||||
model_path: string // path of the loaded model
|
model_path: string // path of the loaded model
|
||||||
|
is_embedding: boolean
|
||||||
api_key: string
|
api_key: string
|
||||||
mmproj_path?: string
|
mmproj_path?: string
|
||||||
}
|
}
|
||||||
@ -240,6 +241,12 @@ export abstract class AIEngine extends BaseExtension {
|
|||||||
EngineManager.instance().register(this)
|
EngineManager.instance().register(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets model info
|
||||||
|
* @param modelId
|
||||||
|
*/
|
||||||
|
abstract get(modelId: string): Promise<modelInfo | undefined>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lists available models
|
* Lists available models
|
||||||
*/
|
*/
|
||||||
@ -268,6 +275,10 @@ export abstract class AIEngine extends BaseExtension {
|
|||||||
*/
|
*/
|
||||||
abstract delete(modelId: string): Promise<void>
|
abstract delete(modelId: string): Promise<void>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates a model
|
||||||
|
*/
|
||||||
|
abstract update(modelId: string, model: Partial<modelInfo>): Promise<void>
|
||||||
/**
|
/**
|
||||||
* Imports a model
|
* Imports a model
|
||||||
*/
|
*/
|
||||||
@ -283,11 +294,6 @@ export abstract class AIEngine extends BaseExtension {
|
|||||||
*/
|
*/
|
||||||
abstract getLoadedModels(): Promise<string[]>
|
abstract getLoadedModels(): Promise<string[]>
|
||||||
|
|
||||||
/**
|
|
||||||
* Optional method to get the underlying chat client
|
|
||||||
*/
|
|
||||||
getChatClient?(sessionId: string): any
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a tool is supported by the model
|
* Check if a tool is supported by the model
|
||||||
* @param modelId
|
* @param modelId
|
||||||
|
|||||||
@ -131,4 +131,4 @@ describe('LocalOAIEngine', () => {
|
|||||||
expect(engine.loadedModel).toBeUndefined()
|
expect(engine.loadedModel).toBeUndefined()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -23,3 +23,8 @@ export { MCPExtension } from './mcp'
|
|||||||
* Base AI Engines.
|
* Base AI Engines.
|
||||||
*/
|
*/
|
||||||
export * from './engines'
|
export * from './engines'
|
||||||
|
|
||||||
|
export { RAGExtension, RAG_INTERNAL_SERVER } from './rag'
|
||||||
|
export type { AttachmentInput, IngestAttachmentsResult } from './rag'
|
||||||
|
export { VectorDBExtension } from './vector-db'
|
||||||
|
export type { SearchMode, VectorDBStatus, VectorChunkInput, VectorSearchResult, AttachmentFileInfo, VectorDBFileInput, VectorDBIngestOptions } from './vector-db'
|
||||||
|
|||||||
@ -96,4 +96,4 @@ describe('MCPExtension', () => {
|
|||||||
expect(healthy).toBe(true)
|
expect(healthy).toBe(true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { MCPInterface, MCPTool, MCPToolCallResult } from '../../types'
|
import { MCPInterface, MCPTool, MCPToolCallResult, MCPToolComponentProps } from '../../types'
|
||||||
import { BaseExtension, ExtensionTypeEnum } from '../extension'
|
import { BaseExtension, ExtensionTypeEnum } from '../extension'
|
||||||
|
import type { ComponentType } from 'react'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MCP (Model Context Protocol) extension for managing tools and server communication.
|
* MCP (Model Context Protocol) extension for managing tools and server communication.
|
||||||
@ -18,4 +19,16 @@ export abstract class MCPExtension extends BaseExtension implements MCPInterface
|
|||||||
abstract getConnectedServers(): Promise<string[]>
|
abstract getConnectedServers(): Promise<string[]>
|
||||||
abstract refreshTools(): Promise<void>
|
abstract refreshTools(): Promise<void>
|
||||||
abstract isHealthy(): Promise<boolean>
|
abstract isHealthy(): Promise<boolean>
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Optional method to provide a custom UI component for tools
|
||||||
|
* @returns A React component or null if no custom component is provided
|
||||||
|
*/
|
||||||
|
getToolComponent?(): ComponentType<MCPToolComponentProps> | null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional method to get the list of tool names that should be disabled by default
|
||||||
|
* @returns Array of tool names that should be disabled by default for new users
|
||||||
|
*/
|
||||||
|
getDefaultDisabledTools?(): Promise<string[]>
|
||||||
|
}
|
||||||
|
|||||||
36
core/src/browser/extensions/rag.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { BaseExtension, ExtensionTypeEnum } from '../extension'
|
||||||
|
import type { MCPTool, MCPToolCallResult } from '../../types'
|
||||||
|
import type { AttachmentFileInfo } from './vector-db'
|
||||||
|
|
||||||
|
export interface AttachmentInput {
|
||||||
|
path: string
|
||||||
|
name?: string
|
||||||
|
type?: string
|
||||||
|
size?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IngestAttachmentsResult {
|
||||||
|
filesProcessed: number
|
||||||
|
chunksInserted: number
|
||||||
|
files: AttachmentFileInfo[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const RAG_INTERNAL_SERVER = 'rag-internal'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RAG extension base: exposes RAG tools and orchestration API.
|
||||||
|
*/
|
||||||
|
export abstract class RAGExtension extends BaseExtension {
|
||||||
|
type(): ExtensionTypeEnum | undefined {
|
||||||
|
return ExtensionTypeEnum.RAG
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract getTools(): Promise<MCPTool[]>
|
||||||
|
/**
|
||||||
|
* Lightweight list of tool names for quick routing/lookup.
|
||||||
|
*/
|
||||||
|
abstract getToolNames(): Promise<string[]>
|
||||||
|
abstract callTool(toolName: string, args: Record<string, unknown>): Promise<MCPToolCallResult>
|
||||||
|
|
||||||
|
abstract ingestAttachments(threadId: string, files: AttachmentInput[]): Promise<IngestAttachmentsResult>
|
||||||
|
}
|
||||||
82
core/src/browser/extensions/vector-db.ts
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
import { BaseExtension, ExtensionTypeEnum } from '../extension'
|
||||||
|
|
||||||
|
export type SearchMode = 'auto' | 'ann' | 'linear'
|
||||||
|
|
||||||
|
export interface VectorDBStatus {
|
||||||
|
ann_available: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface VectorChunkInput {
|
||||||
|
text: string
|
||||||
|
embedding: number[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface VectorSearchResult {
|
||||||
|
id: string
|
||||||
|
text: string
|
||||||
|
score?: number
|
||||||
|
file_id: string
|
||||||
|
chunk_file_order: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AttachmentFileInfo {
|
||||||
|
id: string
|
||||||
|
name?: string
|
||||||
|
path?: string
|
||||||
|
type?: string
|
||||||
|
size?: number
|
||||||
|
chunk_count: number
|
||||||
|
}
|
||||||
|
|
||||||
|
// High-level input types for file ingestion
|
||||||
|
export interface VectorDBFileInput {
|
||||||
|
path: string
|
||||||
|
name?: string
|
||||||
|
type?: string
|
||||||
|
size?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface VectorDBIngestOptions {
|
||||||
|
chunkSize: number
|
||||||
|
chunkOverlap: number
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vector DB extension base: abstraction over local vector storage and search.
|
||||||
|
*/
|
||||||
|
export abstract class VectorDBExtension extends BaseExtension {
|
||||||
|
type(): ExtensionTypeEnum | undefined {
|
||||||
|
return ExtensionTypeEnum.VectorDB
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract getStatus(): Promise<VectorDBStatus>
|
||||||
|
abstract createCollection(threadId: string, dimension: number): Promise<void>
|
||||||
|
abstract insertChunks(
|
||||||
|
threadId: string,
|
||||||
|
fileId: string,
|
||||||
|
chunks: VectorChunkInput[]
|
||||||
|
): Promise<void>
|
||||||
|
abstract ingestFile(
|
||||||
|
threadId: string,
|
||||||
|
file: VectorDBFileInput,
|
||||||
|
opts: VectorDBIngestOptions
|
||||||
|
): Promise<AttachmentFileInfo>
|
||||||
|
abstract searchCollection(
|
||||||
|
threadId: string,
|
||||||
|
query_embedding: number[],
|
||||||
|
limit: number,
|
||||||
|
threshold: number,
|
||||||
|
mode?: SearchMode,
|
||||||
|
fileIds?: string[]
|
||||||
|
): Promise<VectorSearchResult[]>
|
||||||
|
abstract deleteChunks(threadId: string, ids: string[]): Promise<void>
|
||||||
|
abstract deleteFile(threadId: string, fileId: string): Promise<void>
|
||||||
|
abstract deleteCollection(threadId: string): Promise<void>
|
||||||
|
abstract listAttachments(threadId: string, limit?: number): Promise<AttachmentFileInfo[]>
|
||||||
|
abstract getChunks(
|
||||||
|
threadId: string,
|
||||||
|
fileId: string,
|
||||||
|
startOrder: number,
|
||||||
|
endOrder: number
|
||||||
|
): Promise<VectorSearchResult[]>
|
||||||
|
}
|
||||||
@ -43,6 +43,12 @@ const mkdir = (...args: any[]) => globalThis.core.api?.mkdir({ args })
|
|||||||
*/
|
*/
|
||||||
const rm = (...args: any[]) => globalThis.core.api?.rm({ args })
|
const rm = (...args: any[]) => globalThis.core.api?.rm({ args })
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves a file from the source path to the destination path.
|
||||||
|
* @returns {Promise<any>} A Promise that resolves when the file is moved successfully.
|
||||||
|
*/
|
||||||
|
const mv = (...args: any[]) => globalThis.core.api?.mv({ args })
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes a file from the local file system.
|
* Deletes a file from the local file system.
|
||||||
* @param {string} path - The path of the file to delete.
|
* @param {string} path - The path of the file to delete.
|
||||||
@ -92,6 +98,7 @@ export const fs = {
|
|||||||
readdirSync,
|
readdirSync,
|
||||||
mkdir,
|
mkdir,
|
||||||
rm,
|
rm,
|
||||||
|
mv,
|
||||||
unlinkSync,
|
unlinkSync,
|
||||||
appendFileSync,
|
appendFileSync,
|
||||||
copyFile,
|
copyFile,
|
||||||
|
|||||||
@ -131,4 +131,4 @@ describe('ModelManager', () => {
|
|||||||
expect(modelManager.models.get('model-2')).toEqual(model2)
|
expect(modelManager.models.get('model-2')).toEqual(model2)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -16,4 +16,4 @@ if (!window.core) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add any other global mocks needed for core tests
|
// Add any other global mocks needed for core tests
|
||||||
|
|||||||
@ -91,6 +91,7 @@ export enum FileSystemRoute {
|
|||||||
existsSync = 'existsSync',
|
existsSync = 'existsSync',
|
||||||
readdirSync = 'readdirSync',
|
readdirSync = 'readdirSync',
|
||||||
rm = 'rm',
|
rm = 'rm',
|
||||||
|
mv = 'mv',
|
||||||
mkdir = 'mkdir',
|
mkdir = 'mkdir',
|
||||||
readFileSync = 'readFileSync',
|
readFileSync = 'readFileSync',
|
||||||
writeFileSync = 'writeFileSync',
|
writeFileSync = 'writeFileSync',
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
export * from './mcpEntity'
|
export * from './mcpEntity'
|
||||||
export * from './mcpInterface'
|
export * from './mcpInterface'
|
||||||
|
|||||||
@ -21,4 +21,18 @@ export interface MCPServerInfo {
|
|||||||
name: string
|
name: string
|
||||||
connected: boolean
|
connected: boolean
|
||||||
tools?: MCPTool[]
|
tools?: MCPTool[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Props for MCP tool UI components
|
||||||
|
*/
|
||||||
|
export interface MCPToolComponentProps {
|
||||||
|
/** List of available MCP tools */
|
||||||
|
tools: MCPTool[]
|
||||||
|
|
||||||
|
/** Function to check if a specific tool is currently enabled */
|
||||||
|
isToolEnabled: (toolName: string) => boolean
|
||||||
|
|
||||||
|
/** Function to toggle a tool's enabled/disabled state */
|
||||||
|
onToolToggle: (toolName: string, enabled: boolean) => void
|
||||||
|
}
|
||||||
|
|||||||
@ -29,4 +29,4 @@ export interface MCPInterface {
|
|||||||
* Check if MCP service is healthy
|
* Check if MCP service is healthy
|
||||||
*/
|
*/
|
||||||
isHealthy(): Promise<boolean>
|
isHealthy(): Promise<boolean>
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,8 @@ export type SettingComponentProps = {
|
|||||||
extensionName?: string
|
extensionName?: string
|
||||||
requireModelReload?: boolean
|
requireModelReload?: boolean
|
||||||
configType?: ConfigType
|
configType?: ConfigType
|
||||||
|
titleKey?: string
|
||||||
|
descriptionKey?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ConfigType = 'runtime' | 'setting'
|
export type ConfigType = 'runtime' | 'setting'
|
||||||
|
|||||||
@ -18,7 +18,7 @@ We try to **keep routes consistent** to maintain SEO.
|
|||||||
|
|
||||||
## How to Contribute
|
## How to Contribute
|
||||||
|
|
||||||
Refer to the [Contributing Guide](https://github.com/menloresearch/jan/blob/main/CONTRIBUTING.md) for more comprehensive information on how to contribute to the Jan project.
|
Refer to the [Contributing Guide](https://github.com/janhq/jan/blob/main/CONTRIBUTING.md) for more comprehensive information on how to contribute to the Jan project.
|
||||||
|
|
||||||
### Pre-requisites and Installation
|
### Pre-requisites and Installation
|
||||||
|
|
||||||
|
|||||||
139
docs/_redirects
@ -0,0 +1,139 @@
|
|||||||
|
/about /handbook 302
|
||||||
|
/about/ /handbook 302
|
||||||
|
/about/community /handbook 302
|
||||||
|
/about/handbook /handbook 302
|
||||||
|
/about/handbook/analytics /handbook 302
|
||||||
|
/about/handbook/project-management /handbook 302
|
||||||
|
/about/handbook/strategy /handbook 302
|
||||||
|
/about/handbook/website-docs /handbook 302
|
||||||
|
/about/how-we-work/product-design /handbook 302
|
||||||
|
/about/how-we-work/strategy /handbook 302
|
||||||
|
/about/investors /handbook 302
|
||||||
|
/about/roadmap /handbook 302
|
||||||
|
/about/team /handbook 302
|
||||||
|
/about/vision /handbook 302
|
||||||
|
/about/wall-of-love /handbook 302
|
||||||
|
/handbook/contributing-to-jan/ /handbook 302
|
||||||
|
/handbook/core-contributors/how-we-hire/ /handbook 302
|
||||||
|
/handbook/engineering-excellence/ /handbook 302
|
||||||
|
/handbook/engineering/ /handbook 302
|
||||||
|
/handbook/product-and-community/ /handbook 302
|
||||||
|
/handbook/products-and-innovations/ /handbook 302
|
||||||
|
/handbook/what-we-do/our-approach-to-design/ /handbook 302
|
||||||
|
/how-we-work/product-design /handbook 302
|
||||||
|
/handbook/product-and-community/approaches-to-beta-testing-and-user-engagement/ /handbook 302
|
||||||
|
/cortex/assistants /docs/ 302
|
||||||
|
/cortex/build-extension /docs/ 302
|
||||||
|
/cortex/built-in/tensorrt-llm /docs/ 302
|
||||||
|
/cortex/cli/kill /docs/ 302
|
||||||
|
/cortex/command-line /docs/ 302
|
||||||
|
/cortex/cortex-openvino /docs/ 302
|
||||||
|
/cortex/cortex-python /docs/ 302
|
||||||
|
/cortex/cortex-tensorrt-llm /docs/ 302
|
||||||
|
/cortex/desktop-installation/linux /docs/ 302
|
||||||
|
/cortex/embeddings /docs/ 302
|
||||||
|
/cortex/ext-architecture /docs/ 302
|
||||||
|
/cortex/fine-tuning /docs/ 302
|
||||||
|
/cortex/fine-tuning/overview /docs/ 302
|
||||||
|
/cortex/function-calling /docs/ 302
|
||||||
|
/cortex/installation/linux /docs/ 302
|
||||||
|
/cortex/installation/mac /docs/ 302
|
||||||
|
/cortex/model-operations /docs/ 302
|
||||||
|
/cortex/model-operations/overview /docs/ 302
|
||||||
|
/cortex/rag/overview /docs/ 302
|
||||||
|
/cortex/server /docs/ 302
|
||||||
|
/docs/tools/retrieval /docs/ 302
|
||||||
|
/developer/framework/engineering/chats /docs/ 302
|
||||||
|
/developer/framework/engineering/threads/ /docs/ 302
|
||||||
|
/developer/framework/product/chat /docs/ 302
|
||||||
|
/docs/extensions /docs/ 302
|
||||||
|
/docs/shortcuts /docs/ 302
|
||||||
|
/docs/models /docs/ 302
|
||||||
|
/integrations/function-calling/interpreter /docs/ 302
|
||||||
|
/docs/desktop/built-in/tensorrt-llm /docs 302
|
||||||
|
/docs/desktop/beta /docs/desktop 302
|
||||||
|
/platforms /docs/desktop 302
|
||||||
|
/docs/built-in/llama-cpp /docs/desktop/llama-cpp 302
|
||||||
|
/docs/install-engines /docs/desktop/llama-cpp 302
|
||||||
|
/docs/local-api /docs/desktop/api-server 302
|
||||||
|
/docs/local-engines/llama-cpp /docs/desktop/llama-cpp 302
|
||||||
|
/docs/api-server /docs/desktop/api-server 302
|
||||||
|
/docs/assistants /docs/desktop/assistants 302
|
||||||
|
/docs/models/manage-models /docs/desktop/manage-models 302
|
||||||
|
/docs/data-folder /docs/desktop/data-folder 302
|
||||||
|
/cortex/vision /handbook/open-superintelligence 302
|
||||||
|
/docs/models/model-parameters /docs/desktop/model-parameters 302
|
||||||
|
/docs/remote-models/generic-openai /docs/desktop/remote-models/openai 302
|
||||||
|
/docs/threads /changelog/2024-01-16-settings-options-right-panel 302
|
||||||
|
/docs/desktop/docs/data-folder /docs/desktop/data-folder 302
|
||||||
|
/docs/desktop/docs/desktop/install/linux /docs/desktop/install/linux 302
|
||||||
|
/docs/desktop/docs/desktop/troubleshooting /docs/desktop/troubleshooting 302
|
||||||
|
/docs/desktop/linux /docs/desktop/install/linux 302
|
||||||
|
/docs/desktop/local-engines/llama-cpp /docs/desktop/llama-cpp-server 302
|
||||||
|
/docs/desktop/models/model-parameters /docs/desktop/model-parameters 302
|
||||||
|
/docs/desktop/windows /docs/desktop/install/windows 302
|
||||||
|
/docs/docs/data-folder /docs/desktop/data-folder 302
|
||||||
|
/docs/docs/desktop/linux /docs/desktop/install/linux 302
|
||||||
|
/docs/docs/troubleshooting /docs/desktop/troubleshooting 302
|
||||||
|
/docs/jan-models/jan-nano-32 /docs/desktop/jan-models/jan-nano-32 302
|
||||||
|
/docs/jan-models/jan-v1 /docs/desktop/jan-models/jan-v1 302
|
||||||
|
/docs/jan-models/lucy /docs/desktop/jan-models/lucy 302
|
||||||
|
/docs/llama-cpp /docs/desktop/llama-cpp 302
|
||||||
|
/docs/manage-models /docs/desktop/manage-models 302
|
||||||
|
/docs/mcp /docs/desktop/mcp 302
|
||||||
|
/docs/mcp-examples/data-analysis/e2b /docs/desktop/mcp-examples/data-analysis/e2b 302
|
||||||
|
/docs/mcp-examples/deepresearch/octagon /docs/desktop/mcp-examples/deepresearch/octagon 302
|
||||||
|
/docs/mcp-examples/design/canva /docs/desktop/mcp-examples/design/canva 302
|
||||||
|
/docs/mcp-examples/productivity/linear /docs/desktop/mcp-examples/productivity/linear 302
|
||||||
|
/docs/mcp-examples/search/exa /docs/desktop/mcp-examples/search/exa 302
|
||||||
|
/docs/model-parameters /docs/desktop/model-parameters 302
|
||||||
|
/docs/remote-models/cohere /docs/desktop/remote-models/cohere 302
|
||||||
|
/docs/remote-models/google /docs/desktop/remote-models/google 302
|
||||||
|
/docs/remote-models/groq /docs/desktop/remote-models/groq 302
|
||||||
|
/docs/remote-models/huggingface /docs/desktop/remote-models/huggingface 302
|
||||||
|
/docs/remote-models/mistralai /docs/desktop/remote-models/mistralai 302
|
||||||
|
/docs/remote-models/openai /docs/desktop/remote-models/openai 302
|
||||||
|
/docs/server-examples/continue-dev /docs/desktop/server-examples/continue-dev 302
|
||||||
|
/docs/server-examples/n8n /docs/desktop/server-examples/n8n 302
|
||||||
|
/docs/server-troubleshooting /docs/desktop/troubleshooting 302
|
||||||
|
/docs/privacy-policy /privacy 302
|
||||||
|
/docs/server-settings /docs/desktop/server-settings 302
|
||||||
|
/docs/settings /docs/desktop/settings 302
|
||||||
|
/docs/llama-cpp-server /docs/desktop/llama-cpp-server 302
|
||||||
|
/docs/install/linux /docs/desktop/install/linux 302
|
||||||
|
/docs/install/macos /docs/desktop/install/mac 302
|
||||||
|
/docs/install/windows /docs/desktop/install/windows 302
|
||||||
|
/docs/mcp-examples/browser/browserbase /docs/desktop/mcp-examples/browser/browserbase 302
|
||||||
|
/docs/jan-models/jan-nano-128 /docs/desktop/jan-models/jan-nano-128 302
|
||||||
|
/docs/mcp-examples/search/serper /docs/desktop/mcp-examples/search/serper 302
|
||||||
|
/docs/mcp-examples/data-analysis/jupyter /docs/desktop/mcp-examples/data-analysis/jupyter 302
|
||||||
|
/docs/mcp-examples/productivity/todoist /docs/desktop/mcp-examples/productivity/todoist 302
|
||||||
|
/docs/remote-models/anthropic /docs/desktop/remote-models/anthropic 302
|
||||||
|
/docs/remote-models/openrouter /docs/desktop/remote-models/openrouter 302
|
||||||
|
/docs/server-examples/llmcord /docs/desktop/server-examples/llmcord 302
|
||||||
|
/docs/server-examples/tabby /docs/desktop/server-examples/tabby 302
|
||||||
|
/docs/built-in/tensorrt-llm /docs/desktop/llama-cpp 302
|
||||||
|
/docs/desktop/docs/desktop/linux /docs/desktop/install/linux 302
|
||||||
|
/windows /docs/desktop/install/windows 302
|
||||||
|
/docs/quickstart /docs/ 302
|
||||||
|
/docs/desktop/mac /docs/desktop/install/mac 302
|
||||||
|
/handbook/open-superintelligence /handbook/why/open-superintelligence 302
|
||||||
|
|
||||||
|
/guides/integrations/continue/ /docs/desktop/server-examples/continue-dev 302
|
||||||
|
/continue-dev /docs/desktop/server-examples/continue-dev 302
|
||||||
|
/integrations /docs/desktop/server-examples/continue-dev 302
|
||||||
|
/integrations/coding/continue-dev /docs/desktop/server-examples/continue-dev 302
|
||||||
|
/integrations/continue/ /docs/desktop/server-examples/continue-dev 302
|
||||||
|
/integrations/coding/tabby /docs/desktop/server-examples/tabby 302
|
||||||
|
/integrations/messaging/llmcord /docs/desktop/server-examples/llmcord 302
|
||||||
|
/integrations/workflow-automation/n8n /docs/desktop/server-examples/n8n 302
|
||||||
|
/local-server/continue-dev /docs/desktop/server-examples/continue-dev 302
|
||||||
|
/local-server/data-folder /docs/desktop/desktop/data-folder 302
|
||||||
|
/local-server/llama-cpp /docs/desktop/desktop/llama-cpp 302
|
||||||
|
/local-server/n8n /docs/desktop/server-examples/n8n 302
|
||||||
|
/local-server/settings /docs/desktop/server-settings 302
|
||||||
|
/local-server/tabby /docs/desktop/server-examples/tabby 302
|
||||||
|
/local-server/troubleshooting /docs/desktop/troubleshooting 302
|
||||||
|
/mcp /docs/desktop/mcp 302
|
||||||
|
/quickstart /docs/desktop/quickstart 302
|
||||||
|
/server-examples/continue-dev /docs/desktop/server-examples/continue-dev 302
|
||||||
@ -6,7 +6,7 @@ const camelCase = (str) => {
|
|||||||
return str.replace(/[-_](\w)/g, (_, c) => c.toUpperCase())
|
return str.replace(/[-_](\w)/g, (_, c) => c.toUpperCase())
|
||||||
}
|
}
|
||||||
|
|
||||||
const categories = ['building-jan', 'research']
|
const categories = ['building-jan', 'research', 'guides']
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {import("plop").NodePlopAPI} plop
|
* @param {import("plop").NodePlopAPI} plop
|
||||||
|
|||||||
BIN
docs/public/assets/images/changelog/jan-release-v0.7.0.jpeg
Normal file
|
After Width: | Height: | Size: 262 KiB |
BIN
docs/public/assets/images/general/ai-for-teacher.jpeg
Normal file
|
After Width: | Height: | Size: 325 KiB |
|
After Width: | Height: | Size: 355 KiB |
BIN
docs/public/assets/images/general/chatgpt-alternative-jan.jpeg
Normal file
|
After Width: | Height: | Size: 328 KiB |
BIN
docs/public/assets/images/general/cover-kernel-benchmarking.png
Normal file
|
After Width: | Height: | Size: 634 KiB |
|
Before Width: | Height: | Size: 725 KiB After Width: | Height: | Size: 725 KiB |
|
Before Width: | Height: | Size: 235 KiB After Width: | Height: | Size: 235 KiB |
BIN
docs/public/assets/images/general/is-chatgpt-down.jpg
Normal file
|
After Width: | Height: | Size: 402 KiB |
BIN
docs/public/assets/images/general/jan-ai-for-teacher.mp4
Normal file
|
After Width: | Height: | Size: 320 KiB |
|
After Width: | Height: | Size: 395 KiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
|
Before Width: | Height: | Size: 673 KiB After Width: | Height: | Size: 673 KiB |
@ -1581,7 +1581,7 @@
|
|||||||
},
|
},
|
||||||
"cover": {
|
"cover": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"example": "https://raw.githubusercontent.com/menloresearch/jan/main/models/trinity-v1.2-7b/cover.png"
|
"example": "https://raw.githubusercontent.com/janhq/jan/main/models/trinity-v1.2-7b/cover.png"
|
||||||
},
|
},
|
||||||
"engine": {
|
"engine": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
|||||||
@ -1,125 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
|
|
||||||
<url><loc>https://jan.ai</loc><lastmod>2025-09-24T03:40:05.491Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/api-reference</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/api-reference/api-reference</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/api-reference/architecture</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/api-reference/configuration</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/api-reference/development</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/api-reference/installation</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/blog</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2023-12-21-faster-inference-across-platform</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-01-16-settings-options-right-panel</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-01-29-local-api-server</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-02-05-jan-data-folder</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-02-10-jan-is-more-stable</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-02-26-home-servers-with-helm</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-03-06-ui-revamp-settings</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-03-11-import-models</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-03-19-nitro-tensorrt-llm-extension</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-04-02-groq-api-integration</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-04-15-new-mistral-extension</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-04-25-llama3-command-r-hugginface</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-05-20-llamacpp-upgrade-new-remote-models</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-05-28-cohere-aya-23-8b-35b-phi-3-medium</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-06-21-nvidia-nim-support</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-07-15-claude-3-5-support</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-09-01-llama3-1-gemma2-support</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-09-17-improved-cpu-performance</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-10-24-jan-stable</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-11-22-jan-bugs</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-11.14-jan-supports-qwen-coder</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-12-03-jan-is-faster</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-12-05-jan-hot-fix-mac</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2024-12-30-jan-new-privacy</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-01-06-key-issues-resolved</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-01-23-deepseek-r1-jan</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-02-18-advanced-llama.cpp-settings</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-03-14-jan-security-patch</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-05-14-jan-qwen3-patch</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-06-19-jan-ui-revamp</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-06-26-jan-nano-mcp</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-07-17-responsive-ui</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-07-31-llamacpp-tutorials</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-08-07-gpt-oss</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-08-14-general-improvs</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-08-28-image-support</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/changelog/2025-09-18-auto-optimize-vision-imports</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/api-server</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/assistants</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/data-folder</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/install/linux</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/install/mac</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/install/windows</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/jan-models/jan-nano-128</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/jan-models/jan-nano-32</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/jan-models/jan-v1</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/jan-models/lucy</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/llama-cpp</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/llama-cpp-server</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/manage-models</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/browser/browserbase</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/data-analysis/e2b</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/data-analysis/jupyter</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/deepresearch/octagon</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/design/canva</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/productivity/linear</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/productivity/todoist</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/search/exa</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/mcp-examples/search/serper</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/model-parameters</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/privacy</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/privacy-policy</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/quickstart</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/anthropic</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/cohere</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/google</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/groq</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/huggingface</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/mistralai</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/openai</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/remote-models/openrouter</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/server-examples/continue-dev</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/server-examples/llmcord</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/server-examples/n8n</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/server-examples/tabby</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/server-settings</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/server-troubleshooting</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/settings</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/desktop/troubleshooting</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference-administration</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference-authentication</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference-chat</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference-chat-conversations</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference-conversations</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference-jan-responses</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/api-reference-jan-server</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/architecture</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/configuration</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/development</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/installation</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/docs/server/overview</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/download</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/handbook</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/handbook/betting-on-open-source</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/handbook/open-superintelligence</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/benchmarking-nvidia-tensorrt-llm</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/bitdefender</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/data-is-moat</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/deepresearch</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/deepseek-r1-locally</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/jan-v1-for-research</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/offline-chatgpt-alternative</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/qwen3-settings</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/rag-is-not-enough</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/run-ai-models-locally</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/post/run-gpt-oss-locally</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/privacy</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
<url><loc>https://jan.ai/support</loc><lastmod>2025-09-24T03:40:05.492Z</lastmod><changefreq>daily</changefreq><priority>1</priority></url>
|
|
||||||
</urlset>
|
|
||||||
@ -27,7 +27,7 @@ export const APIReference = () => {
|
|||||||
<ApiReferenceReact
|
<ApiReferenceReact
|
||||||
configuration={{
|
configuration={{
|
||||||
spec: {
|
spec: {
|
||||||
url: 'https://raw.githubusercontent.com/menloresearch/docs/main/public/openapi/jan.json',
|
url: 'https://raw.githubusercontent.com/janhq/docs/main/public/openapi/jan.json',
|
||||||
},
|
},
|
||||||
theme: 'alternate',
|
theme: 'alternate',
|
||||||
hideModels: true,
|
hideModels: true,
|
||||||
|
|||||||
@ -19,6 +19,10 @@ const Blog = () => {
|
|||||||
name: 'Research',
|
name: 'Research',
|
||||||
id: 'research',
|
id: 'research',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Guides',
|
||||||
|
id: 'guides',
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -57,7 +57,7 @@ const Changelog = () => {
|
|||||||
<p className="text-base mt-2 leading-relaxed">
|
<p className="text-base mt-2 leading-relaxed">
|
||||||
Latest release updates from the Jan team. Check out our
|
Latest release updates from the Jan team. Check out our
|
||||||
<a
|
<a
|
||||||
href="https://github.com/orgs/menloresearch/projects/30"
|
href="https://github.com/orgs/janhq/projects/30"
|
||||||
className="text-blue-600 dark:text-blue-400 cursor-pointer"
|
className="text-blue-600 dark:text-blue-400 cursor-pointer"
|
||||||
>
|
>
|
||||||
Roadmap
|
Roadmap
|
||||||
@ -150,7 +150,7 @@ const Changelog = () => {
|
|||||||
|
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<Link
|
<Link
|
||||||
href="https://github.com/menloresearch/jan/releases"
|
href="https://github.com/janhq/jan/releases"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
className="dark:nx-bg-neutral-900 dark:text-white bg-black text-white hover:text-white justify-center dark:border dark:border-neutral-800 flex-shrink-0 px-4 py-3 rounded-xl inline-flex items-center"
|
className="dark:nx-bg-neutral-900 dark:text-white bg-black text-white hover:text-white justify-center dark:border dark:border-neutral-800 flex-shrink-0 px-4 py-3 rounded-xl inline-flex items-center"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -72,7 +72,7 @@ export default function CardDownload({ lastRelease }: Props) {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
...system,
|
...system,
|
||||||
href: `https://github.com/menloresearch/jan/releases/download/${lastRelease.tag_name}/${downloadUrl}`,
|
href: `https://github.com/janhq/jan/releases/download/${lastRelease.tag_name}/${downloadUrl}`,
|
||||||
size: asset ? formatFileSize(asset.size) : undefined,
|
size: asset ? formatFileSize(asset.size) : undefined,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -139,7 +139,7 @@ const DropdownDownload = ({ lastRelease }: Props) => {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
...system,
|
...system,
|
||||||
href: `https://github.com/menloresearch/jan/releases/download/${lastRelease.tag_name}/${downloadUrl}`,
|
href: `https://github.com/janhq/jan/releases/download/${lastRelease.tag_name}/${downloadUrl}`,
|
||||||
size: asset ? formatFileSize(asset.size) : undefined,
|
size: asset ? formatFileSize(asset.size) : undefined,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -16,7 +16,10 @@ const FOOTER_MENUS: FooterMenu[] = [
|
|||||||
{
|
{
|
||||||
title: 'Company',
|
title: 'Company',
|
||||||
links: [
|
links: [
|
||||||
{ name: 'Vision', href: '/', comingSoon: true },
|
{
|
||||||
|
name: 'Open Superintelligence',
|
||||||
|
href: '/handbook/why/open-superintelligence',
|
||||||
|
},
|
||||||
{ name: 'Handbook', href: '/handbook' },
|
{ name: 'Handbook', href: '/handbook' },
|
||||||
{ name: 'Community', href: 'https://discord.com/invite/FTk2MvZwJH' },
|
{ name: 'Community', href: 'https://discord.com/invite/FTk2MvZwJH' },
|
||||||
{ name: 'Careers', href: 'https://menlo.bamboohr.com/careers' },
|
{ name: 'Careers', href: 'https://menlo.bamboohr.com/careers' },
|
||||||
@ -77,9 +80,9 @@ export default function Footer() {
|
|||||||
return (
|
return (
|
||||||
<footer className="py-4 w-full">
|
<footer className="py-4 w-full">
|
||||||
<div className="mx-auto">
|
<div className="mx-auto">
|
||||||
<div className="grid grid-cols-1 md:grid-cols-6 gap-8">
|
<div className="grid grid-cols-1 lg:grid-cols-6 gap-8">
|
||||||
{/* Jan Logo and Newsletter */}
|
{/* Jan Logo and Newsletter */}
|
||||||
<div className="md:col-span-2">
|
<div className="md:col-span-1 lg:col-span-2">
|
||||||
<h2 className="text-[52px] font-bold mb-6">Jan</h2>
|
<h2 className="text-[52px] font-bold mb-6">Jan</h2>
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center gap-2 mb-3">
|
<div className="flex items-center gap-2 mb-3">
|
||||||
@ -138,7 +141,7 @@ export default function Footer() {
|
|||||||
{/* Menu Columns */}
|
{/* Menu Columns */}
|
||||||
{FOOTER_MENUS.map((menu) => (
|
{FOOTER_MENUS.map((menu) => (
|
||||||
<div key={menu.title} className="">
|
<div key={menu.title} className="">
|
||||||
<h3 className="text-lg mb-4 font-bold">{menu.title}</h3>
|
<h3 className="text-base mb-4 font-bold">{menu.title}</h3>
|
||||||
<ul className="space-y-2">
|
<ul className="space-y-2">
|
||||||
{menu.links.map((link) => (
|
{menu.links.map((link) => (
|
||||||
<li key={link.name}>
|
<li key={link.name}>
|
||||||
|
|||||||
@ -23,7 +23,7 @@ const BuiltWithLove = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col lg:flex-row gap-8 mt-8 items-center justify-center">
|
<div className="flex flex-col lg:flex-row gap-8 mt-8 items-center justify-center">
|
||||||
<a
|
<a
|
||||||
href="https://github.com/menloresearch/jan"
|
href="https://github.com/janhq/jan"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
className="dark:bg-white bg-black inline-flex w-56 px-4 py-3 rounded-xl cursor-pointer justify-center items-start space-x-4 "
|
className="dark:bg-white bg-black inline-flex w-56 px-4 py-3 rounded-xl cursor-pointer justify-center items-start space-x-4 "
|
||||||
>
|
>
|
||||||
|
|||||||
@ -44,7 +44,7 @@ const Hero = () => {
|
|||||||
<div className="mt-10 text-center">
|
<div className="mt-10 text-center">
|
||||||
<div>
|
<div>
|
||||||
<Link
|
<Link
|
||||||
href="https://github.com/menloresearch/jan/releases"
|
href="https://github.com/janhq/jan/releases"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
className="hidden lg:inline-block"
|
className="hidden lg:inline-block"
|
||||||
>
|
>
|
||||||
|
|||||||
@ -95,7 +95,7 @@ const Home = () => {
|
|||||||
<div className="container mx-auto relative z-10">
|
<div className="container mx-auto relative z-10">
|
||||||
<div className="flex justify-center items-center mt-14 lg:mt-20 px-4">
|
<div className="flex justify-center items-center mt-14 lg:mt-20 px-4">
|
||||||
<a
|
<a
|
||||||
href=""
|
href={`https://github.com/janhq/jan/releases/tag/${lastVersion}`}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="bg-black/40 px-3 lg:px-4 rounded-full h-10 inline-flex items-center max-w-full animate-fade-in delay-100"
|
className="bg-black/40 px-3 lg:px-4 rounded-full h-10 inline-flex items-center max-w-full animate-fade-in delay-100"
|
||||||
@ -109,7 +109,7 @@ const Home = () => {
|
|||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-10">
|
<div className="mt-4">
|
||||||
<div className="text-center relative lg:w-1/2 mx-auto">
|
<div className="text-center relative lg:w-1/2 mx-auto">
|
||||||
<div className="flex flex-col lg:flex-row items-center justify-center gap-4 animate-fade-in-up delay-300">
|
<div className="flex flex-col lg:flex-row items-center justify-center gap-4 animate-fade-in-up delay-300">
|
||||||
<span>
|
<span>
|
||||||
@ -124,15 +124,20 @@ const Home = () => {
|
|||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<p className="px-4 lg:px-0 mt-2 text-lg lg:text-2xl font-medium leading-relaxed text-white animate-fade-in-up delay-500 -tracking-[0.6px]">
|
<p className="px-4 lg:px-0 mt-2 text-lg lg:text-2xl font-medium leading-relaxed text-white animate-fade-in-up delay-500 -tracking-[0.6px]">
|
||||||
Jan is the open-source ChatGPT replacement.
|
The best of open-source AI in an easy-to-use product.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex px-4 flex-col lg:flex-row items-center gap-4 w-full justify-center text-center animate-fade-in-up delay-600 mt-8 lg:mt-10">
|
<div className="flex px-4 flex-col lg:flex-row items-start gap-4 w-full justify-center text-center animate-fade-in-up delay-600 mt-8 lg:mt-10">
|
||||||
<DropdownButton
|
<div>
|
||||||
size="xxl"
|
<DropdownButton
|
||||||
className="w-full !rounded-[20px] lg:w-auto"
|
size="xxl"
|
||||||
lastRelease={lastRelease}
|
className="w-full !rounded-[20px] lg:w-auto"
|
||||||
/>
|
lastRelease={lastRelease}
|
||||||
|
/>
|
||||||
|
<div className="font-medium text-center mt-2 text-white">
|
||||||
|
+{totalDownload(release)} downloads
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<a
|
<a
|
||||||
href="https://discord.com/invite/FTk2MvZwJH"
|
href="https://discord.com/invite/FTk2MvZwJH"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@ -189,7 +194,8 @@ const Home = () => {
|
|||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
||||||
<span className="text-sm">
|
<span className="text-sm">
|
||||||
{formatCompactNumber(discordWidget.presence_count)}
|
15k+
|
||||||
|
{/* {formatCompactNumber(discordWidget.presence_count)} */}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</Button>
|
</Button>
|
||||||
@ -198,7 +204,7 @@ const Home = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="absolute w-full bottom-0 left-0 flex justify-center">
|
<div className="absolute w-full -bottom-10 left-0 flex justify-center">
|
||||||
<img
|
<img
|
||||||
className="abs animate-float scale-[175%] md:scale-100"
|
className="abs animate-float scale-[175%] md:scale-100"
|
||||||
src={CuteRobotFlyingPNG.src}
|
src={CuteRobotFlyingPNG.src}
|
||||||
@ -264,7 +270,7 @@ const Home = () => {
|
|||||||
data-delay="600"
|
data-delay="600"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
href="https://github.com/menloresearch/jan"
|
href="https://github.com/janhq/jan"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
@ -381,7 +387,7 @@ const Home = () => {
|
|||||||
</div>
|
</div>
|
||||||
<a
|
<a
|
||||||
className="hidden md:block"
|
className="hidden md:block"
|
||||||
href="https://github.com/menloresearch/jan"
|
href="https://github.com/janhq/jan"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
@ -407,7 +413,7 @@ const Home = () => {
|
|||||||
</p>
|
</p>
|
||||||
<a
|
<a
|
||||||
className="md:hidden mt-4 block w-full"
|
className="md:hidden mt-4 block w-full"
|
||||||
href="https://github.com/menloresearch/jan"
|
href="https://github.com/janhq/jan"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
@ -448,9 +454,10 @@ const Home = () => {
|
|||||||
<div className="flex items-center gap-1 ml-3">
|
<div className="flex items-center gap-1 ml-3">
|
||||||
<IoMdPeople className="size-5" />
|
<IoMdPeople className="size-5" />
|
||||||
<span className="text-sm">
|
<span className="text-sm">
|
||||||
{formatCompactNumber(
|
15k+
|
||||||
|
{/* {formatCompactNumber(
|
||||||
discordWidget.presence_count
|
discordWidget.presence_count
|
||||||
)}
|
)} */}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</Button>
|
</Button>
|
||||||
@ -483,9 +490,10 @@ const Home = () => {
|
|||||||
<div className="flex items-center gap-1 ml-3">
|
<div className="flex items-center gap-1 ml-3">
|
||||||
<IoMdPeople className="size-5" />
|
<IoMdPeople className="size-5" />
|
||||||
<span className="text-sm">
|
<span className="text-sm">
|
||||||
{formatCompactNumber(
|
15k+
|
||||||
|
{/* {formatCompactNumber(
|
||||||
discordWidget.presence_count
|
discordWidget.presence_count
|
||||||
)}
|
)} */}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { useRouter } from 'next/router'
|
|||||||
import { cn } from '@/lib/utils'
|
import { cn } from '@/lib/utils'
|
||||||
import { FaDiscord, FaGithub } from 'react-icons/fa'
|
import { FaDiscord, FaGithub } from 'react-icons/fa'
|
||||||
import { FiDownload } from 'react-icons/fi'
|
import { FiDownload } from 'react-icons/fi'
|
||||||
import { FaXTwitter } from 'react-icons/fa6'
|
import { FaXTwitter, FaLinkedinIn } from 'react-icons/fa6'
|
||||||
import { Button } from './ui/button'
|
import { Button } from './ui/button'
|
||||||
import LogoJanSVG from '@/assets/icons/logo-jan.svg'
|
import LogoJanSVG from '@/assets/icons/logo-jan.svg'
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ const Navbar = ({ noScroll }: { noScroll?: boolean }) => {
|
|||||||
})}
|
})}
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
href="https://github.com/menloresearch/jan/releases/latest"
|
href="https://github.com/janhq/jan/releases/latest"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
@ -113,13 +113,50 @@ const Navbar = ({ noScroll }: { noScroll?: boolean }) => {
|
|||||||
</Button>
|
</Button>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<div className={cn('flex gap-4', !isLanding && '!text-black')}>
|
||||||
|
<a
|
||||||
|
href="https://discord.com/invite/FTk2MvZwJH"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="rounded-lg flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<FaDiscord className="size-5" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://twitter.com/jandotai"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="rounded-lg flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<FaXTwitter className="size-5" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://linkedin.com/company/opensuperintelligence"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="rounded-lg flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<FaLinkedinIn className="size-5" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://github.com/janhq/jan"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="rounded-lg flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<FaGithub className="size-5" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
{/* Mobile Download Button and Hamburger */}
|
{/* Mobile Download Button and Hamburger */}
|
||||||
<div className="lg:hidden flex items-center gap-3">
|
<div className="lg:hidden flex items-center gap-3">
|
||||||
<a
|
<a
|
||||||
href="https://github.com/menloresearch/jan/releases/latest"
|
href="https://github.com/janhq/jan/releases/latest"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
@ -233,7 +270,15 @@ const Navbar = ({ noScroll }: { noScroll?: boolean }) => {
|
|||||||
<FaXTwitter className="size-5" />
|
<FaXTwitter className="size-5" />
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
href="https://github.com/menloresearch/jan"
|
href="https://linkedin.com/company/opensuperintelligence"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-black rounded-lg flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<FaLinkedinIn className="size-5" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://github.com/janhq/jan"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="text-black rounded-lg flex items-center justify-center"
|
className="text-black rounded-lg flex items-center justify-center"
|
||||||
@ -251,7 +296,7 @@ const Navbar = ({ noScroll }: { noScroll?: boolean }) => {
|
|||||||
asChild
|
asChild
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
href="https://github.com/menloresearch/jan/releases/latest"
|
href="https://github.com/janhq/jan/releases/latest"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
|
|||||||
283
docs/src/components/OpenAIStatusChecker.tsx
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
import React, { useState, useEffect, useCallback } from 'react'
|
||||||
|
import { AlertCircle, CheckCircle, Clock, RefreshCw } from 'lucide-react'
|
||||||
|
|
||||||
|
interface StatusData {
|
||||||
|
status:
|
||||||
|
| 'operational'
|
||||||
|
| 'degraded'
|
||||||
|
| 'partial_outage'
|
||||||
|
| 'major_outage'
|
||||||
|
| 'under_maintenance'
|
||||||
|
| 'unknown'
|
||||||
|
lastUpdated: string
|
||||||
|
incidents: Array<{
|
||||||
|
name: string
|
||||||
|
status: string
|
||||||
|
impact: string
|
||||||
|
}>
|
||||||
|
}
|
||||||
|
|
||||||
|
const StatusIcon = ({ status }: { status: string }) => {
|
||||||
|
switch (status) {
|
||||||
|
case 'operational':
|
||||||
|
return <CheckCircle className="w-5 h-5 text-green-500" />
|
||||||
|
case 'degraded':
|
||||||
|
case 'partial_outage':
|
||||||
|
return <AlertCircle className="w-5 h-5 text-yellow-500" />
|
||||||
|
case 'major_outage':
|
||||||
|
return <AlertCircle className="w-5 h-5 text-red-500" />
|
||||||
|
case 'under_maintenance':
|
||||||
|
return <Clock className="w-5 h-5 text-blue-500" />
|
||||||
|
default:
|
||||||
|
return <AlertCircle className="w-5 h-5 text-gray-500" />
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const getStatusColor = (status: string) => {
|
||||||
|
switch (status) {
|
||||||
|
case 'operational':
|
||||||
|
return 'bg-green-100 text-green-800 border-green-200 dark:bg-green-900/20 dark:text-green-300 dark:border-green-800'
|
||||||
|
case 'degraded':
|
||||||
|
case 'partial_outage':
|
||||||
|
return 'bg-yellow-100 text-yellow-800 border-yellow-200 dark:bg-yellow-900/20 dark:text-yellow-300 dark:border-yellow-800'
|
||||||
|
case 'major_outage':
|
||||||
|
return 'bg-red-100 text-red-800 border-red-200 dark:bg-red-900/20 dark:text-red-300 dark:border-red-800'
|
||||||
|
case 'under_maintenance':
|
||||||
|
return 'bg-blue-100 text-blue-800 border-blue-200 dark:bg-blue-900/20 dark:text-blue-300 dark:border-blue-800'
|
||||||
|
default:
|
||||||
|
return 'bg-gray-100 text-gray-800 border-gray-200 dark:bg-gray-900/20 dark:text-gray-300 dark:border-gray-800'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const getStatusText = (status: string) => {
|
||||||
|
switch (status) {
|
||||||
|
case 'operational':
|
||||||
|
return 'All Systems Operational'
|
||||||
|
case 'degraded':
|
||||||
|
return 'Degraded Performance'
|
||||||
|
case 'partial_outage':
|
||||||
|
return 'Partial Service Outage'
|
||||||
|
case 'major_outage':
|
||||||
|
return 'Major Service Outage'
|
||||||
|
case 'under_maintenance':
|
||||||
|
return 'Under Maintenance'
|
||||||
|
default:
|
||||||
|
return 'Status Unknown'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const OpenAIStatusChecker: React.FC = () => {
|
||||||
|
const [statusData, setStatusData] = useState<StatusData | null>(null)
|
||||||
|
const [loading, setLoading] = useState(true)
|
||||||
|
const [error, setError] = useState<string | null>(null)
|
||||||
|
const [lastRefresh, setLastRefresh] = useState<Date>(new Date())
|
||||||
|
|
||||||
|
const fetchStatus = useCallback(async () => {
|
||||||
|
setLoading(true)
|
||||||
|
setError(null)
|
||||||
|
|
||||||
|
try {
|
||||||
|
console.log('Fetching real OpenAI status...')
|
||||||
|
|
||||||
|
// Use CORS proxy to fetch real OpenAI status
|
||||||
|
const proxyUrl = 'https://api.allorigins.win/get?url='
|
||||||
|
const targetUrl = 'https://status.openai.com/api/v2/status.json'
|
||||||
|
|
||||||
|
const response = await fetch(proxyUrl + encodeURIComponent(targetUrl))
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Proxy returned ${response.status}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const proxyData = await response.json()
|
||||||
|
const openaiData = JSON.parse(proxyData.contents)
|
||||||
|
|
||||||
|
console.log('Real OpenAI data received:', openaiData)
|
||||||
|
|
||||||
|
// Transform real OpenAI data to our format
|
||||||
|
const transformedData: StatusData = {
|
||||||
|
status: mapOpenAIStatusClient(
|
||||||
|
openaiData.status?.indicator || 'operational'
|
||||||
|
),
|
||||||
|
lastUpdated: openaiData.page?.updated_at || new Date().toISOString(),
|
||||||
|
incidents: (openaiData.incidents || []).slice(0, 3),
|
||||||
|
}
|
||||||
|
|
||||||
|
setStatusData(transformedData)
|
||||||
|
setLastRefresh(new Date())
|
||||||
|
console.log('✅ Real OpenAI status loaded successfully!')
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Failed to fetch real status:', err)
|
||||||
|
|
||||||
|
// Fallback: try alternative proxy
|
||||||
|
try {
|
||||||
|
console.log('Trying alternative proxy...')
|
||||||
|
const altResponse = await fetch(
|
||||||
|
`https://cors-anywhere.herokuapp.com/https://status.openai.com/api/v2/summary.json`
|
||||||
|
)
|
||||||
|
|
||||||
|
if (altResponse.ok) {
|
||||||
|
const altData = await altResponse.json()
|
||||||
|
setStatusData({
|
||||||
|
status: mapOpenAIStatusClient(
|
||||||
|
altData.status?.indicator || 'operational'
|
||||||
|
),
|
||||||
|
lastUpdated: new Date().toISOString(),
|
||||||
|
incidents: [],
|
||||||
|
})
|
||||||
|
setLastRefresh(new Date())
|
||||||
|
console.log('✅ Alternative proxy worked!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} catch (altErr) {
|
||||||
|
console.log('Alternative proxy also failed')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final fallback
|
||||||
|
setError('Unable to fetch real-time status')
|
||||||
|
setStatusData({
|
||||||
|
status: 'operational' as const,
|
||||||
|
lastUpdated: new Date().toISOString(),
|
||||||
|
incidents: [],
|
||||||
|
})
|
||||||
|
setLastRefresh(new Date())
|
||||||
|
console.log('Using fallback status')
|
||||||
|
} finally {
|
||||||
|
setLoading(false)
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
// Client-side status mapping function
|
||||||
|
const mapOpenAIStatusClient = (indicator: string): StatusData['status'] => {
|
||||||
|
switch (indicator.toLowerCase()) {
|
||||||
|
case 'none':
|
||||||
|
case 'operational':
|
||||||
|
return 'operational'
|
||||||
|
case 'minor':
|
||||||
|
return 'degraded'
|
||||||
|
case 'major':
|
||||||
|
return 'partial_outage'
|
||||||
|
case 'critical':
|
||||||
|
return 'major_outage'
|
||||||
|
case 'maintenance':
|
||||||
|
return 'under_maintenance'
|
||||||
|
default:
|
||||||
|
return 'operational' as const // Default to operational
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetchStatus()
|
||||||
|
// Refresh every 2 minutes for more real-time updates
|
||||||
|
const interval = setInterval(fetchStatus, 2 * 60 * 1000)
|
||||||
|
return () => clearInterval(interval)
|
||||||
|
}, [fetchStatus])
|
||||||
|
|
||||||
|
const handleRefresh = () => {
|
||||||
|
fetchStatus()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loading && !statusData) {
|
||||||
|
return (
|
||||||
|
<div className="bg-white dark:bg-gray-800 rounded-xl shadow-lg p-6 border border-gray-200 dark:border-gray-700">
|
||||||
|
<div className="flex items-center justify-center space-x-3">
|
||||||
|
<RefreshCw className="w-6 h-6 text-blue-500 animate-spin" />
|
||||||
|
<span className="text-lg font-medium text-gray-700 dark:text-gray-300">
|
||||||
|
Checking OpenAI Status...
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return (
|
||||||
|
<div className="bg-white dark:bg-gray-800 rounded-xl shadow-lg p-6 border border-red-200 dark:border-red-800">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<div className="flex items-center space-x-3">
|
||||||
|
<AlertCircle className="w-6 h-6 text-red-500" />
|
||||||
|
<div>
|
||||||
|
<h3 className="text-lg font-semibold text-red-800 dark:text-red-300">
|
||||||
|
Unable to Check Status
|
||||||
|
</h3>
|
||||||
|
<p className="text-red-600 dark:text-red-400">{error}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={handleRefresh}
|
||||||
|
className="px-4 py-2 bg-red-100 hover:bg-red-200 dark:bg-red-900/20 dark:hover:bg-red-900/40 text-red-700 dark:text-red-300 rounded-lg font-medium transition-colors"
|
||||||
|
>
|
||||||
|
Retry
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="bg-white dark:bg-gray-800 rounded-xl shadow-lg p-6 border border-gray-200 dark:border-gray-700 my-6">
|
||||||
|
<div className="flex items-center justify-between mb-4">
|
||||||
|
<div className="flex items-center space-x-3">
|
||||||
|
<StatusIcon status={statusData?.status || 'unknown'} />
|
||||||
|
<div>
|
||||||
|
<h3 className="text-xl font-bold text-gray-900 dark:text-gray-100">
|
||||||
|
OpenAI Services
|
||||||
|
</h3>
|
||||||
|
<p className="text-sm text-gray-600 dark:text-gray-400">
|
||||||
|
Last updated: {new Date(lastRefresh).toLocaleTimeString()}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={handleRefresh}
|
||||||
|
disabled={loading}
|
||||||
|
className="p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors disabled:opacity-50"
|
||||||
|
>
|
||||||
|
<RefreshCw
|
||||||
|
className={`w-5 h-5 text-gray-600 dark:text-gray-400 ${loading ? 'animate-spin' : ''}`}
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className={`inline-flex items-center px-4 py-2 rounded-full text-sm font-semibold border ${getStatusColor(statusData?.status || 'unknown')}`}
|
||||||
|
>
|
||||||
|
{getStatusText(statusData?.status || 'unknown')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="mt-4 p-4 bg-gray-50 dark:bg-gray-700 rounded-lg">
|
||||||
|
<h4 className="font-semibold text-gray-900 dark:text-gray-100 mb-2">
|
||||||
|
Quick Status Check
|
||||||
|
</h4>
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-3 gap-3 text-sm">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span className="text-gray-600 dark:text-gray-400">ChatGPT</span>
|
||||||
|
<StatusIcon status={statusData?.status || 'unknown'} />
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span className="text-gray-600 dark:text-gray-400">API</span>
|
||||||
|
<StatusIcon status={statusData?.status || 'unknown'} />
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span className="text-gray-600 dark:text-gray-400">Playground</span>
|
||||||
|
<StatusIcon status={statusData?.status || 'unknown'} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="mt-4 text-xs text-gray-500 dark:text-gray-400 text-center">
|
||||||
|
{error
|
||||||
|
? 'Using fallback status • '
|
||||||
|
: '🟢 Real-time data from OpenAI • '}
|
||||||
|
Updated: {new Date(lastRefresh).toLocaleTimeString()}
|
||||||
|
<br />
|
||||||
|
<a
|
||||||
|
href="/post/is-chatgpt-down-use-jan#-is-chatgpt-down"
|
||||||
|
className="text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300 underline"
|
||||||
|
>
|
||||||
|
View detailed status guide
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@ -120,7 +120,7 @@ export function DropdownButton({
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
...option,
|
...option,
|
||||||
href: `https://github.com/menloresearch/jan/releases/download/${lastRelease.tag_name}/${fileName}`,
|
href: `https://github.com/janhq/jan/releases/download/${lastRelease.tag_name}/${fileName}`,
|
||||||
size: asset ? formatFileSize(asset.size) : 'N/A',
|
size: asset ? formatFileSize(asset.size) : 'N/A',
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -18,7 +18,7 @@ description: Development setup, workflow, and contribution guidelines for Jan Se
|
|||||||
|
|
||||||
1. **Clone Repository**
|
1. **Clone Repository**
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/menloresearch/jan-server
|
git clone https://github.com/janhq/jan-server
|
||||||
cd jan-server
|
cd jan-server
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ title: Installation
|
|||||||
description: Install and deploy Jan Server on Kubernetes using minikube and Helm.
|
description: Install and deploy Jan Server on Kubernetes using minikube and Helm.
|
||||||
---
|
---
|
||||||
|
|
||||||
## Prerequisites
|
# Prerequisites
|
||||||
|
|
||||||
Jan Server requires the following tools installed on your system:
|
Jan Server requires the following tools installed on your system:
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ Jan Server currently supports minikube for local development. Production Kuberne
|
|||||||
|
|
||||||
1. **Clone the repository**
|
1. **Clone the repository**
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/menloresearch/jan-server
|
git clone https://github.com/janhq/jan-server
|
||||||
cd jan-server
|
cd jan-server
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -24,4 +24,4 @@ Fixes 💫
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.5).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.5).
|
||||||
@ -24,4 +24,4 @@ Jan now supports Mistral's new model Codestral. Thanks [Bartowski](https://huggi
|
|||||||
|
|
||||||
More GGUF models can run in Jan - we rebased to llama.cpp b3012.Big thanks to [ggerganov](https://github.com/ggerganov)
|
More GGUF models can run in Jan - we rebased to llama.cpp b3012.Big thanks to [ggerganov](https://github.com/ggerganov)
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.0).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.0).
|
||||||
|
|||||||
@ -28,4 +28,4 @@ Jan now understands LaTeX, allowing users to process and understand complex math
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.4.12).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.4.12).
|
||||||
|
|||||||
@ -28,4 +28,4 @@ Users can now connect to OpenAI's new model GPT-4o.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
For more details, see the [GitHub release notes.](https://github.com/menloresearch/jan/releases/tag/v0.4.13)
|
For more details, see the [GitHub release notes.](https://github.com/janhq/jan/releases/tag/v0.4.13)
|
||||||
|
|||||||
@ -16,4 +16,4 @@ More GGUF models can run in Jan - we rebased to llama.cpp b2961.
|
|||||||
|
|
||||||
Huge shoutouts to [ggerganov](https://github.com/ggerganov) and contributors for llama.cpp, and [Bartowski](https://huggingface.co/bartowski) for GGUF models.
|
Huge shoutouts to [ggerganov](https://github.com/ggerganov) and contributors for llama.cpp, and [Bartowski](https://huggingface.co/bartowski) for GGUF models.
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.4.14).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.4.14).
|
||||||
|
|||||||
@ -26,4 +26,4 @@ We've updated to llama.cpp b3088 for better performance - thanks to [GG](https:/
|
|||||||
- Reduced chat font weight (back to normal!)
|
- Reduced chat font weight (back to normal!)
|
||||||
- Restored the maximize button
|
- Restored the maximize button
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.1).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.1).
|
||||||
|
|||||||
@ -32,4 +32,4 @@ We've restored the tooltip hover functionality, which makes it easier to access
|
|||||||
|
|
||||||
The right-click options for thread settings are now fully operational again. You can now manage your threads with this fix.
|
The right-click options for thread settings are now fully operational again. You can now manage your threads with this fix.
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.2).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.2).
|
||||||
|
|||||||
@ -23,4 +23,4 @@ We've been working on stability issues over the last few weeks. Jan is now more
|
|||||||
- Fixed the GPU memory utilization bar
|
- Fixed the GPU memory utilization bar
|
||||||
- Some UX and copy improvements
|
- Some UX and copy improvements
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.3).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.3).
|
||||||
|
|||||||
@ -32,4 +32,4 @@ Switching between threads used to reset your instruction settings. That’s fixe
|
|||||||
### Minor UI Tweaks & Bug Fixes
|
### Minor UI Tweaks & Bug Fixes
|
||||||
We’ve also resolved issues with the input slider on the right panel and tackled several smaller bugs to keep everything running smoothly.
|
We’ve also resolved issues with the input slider on the right panel and tackled several smaller bugs to keep everything running smoothly.
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.4).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.4).
|
||||||
|
|||||||
@ -23,4 +23,4 @@ Fixes 💫
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.7).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.7).
|
||||||
@ -22,4 +22,4 @@ Jan v0.5.9 is here: fixing what needed fixing
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.9).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.9).
|
||||||
@ -22,4 +22,4 @@ and various UI/UX enhancements 💫
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.8).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.8).
|
||||||
@ -19,4 +19,4 @@ Jan v0.5.10 is live: Jan is faster, smoother, and more reliable.
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.10).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.10).
|
||||||
@ -23,4 +23,4 @@ Jan v0.5.11 is here - critical issues fixed, Mac installation updated.
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.11).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.11).
|
||||||
@ -25,4 +25,4 @@ Jan v0.5.11 is here - critical issues fixed, Mac installation updated.
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.12).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.12).
|
||||||
@ -20,4 +20,4 @@ import ChangelogHeader from "@/components/Changelog/ChangelogHeader"
|
|||||||
|
|
||||||
Update your product or download the latest: https://jan.ai
|
Update your product or download the latest: https://jan.ai
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.13).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.13).
|
||||||
|
|||||||
@ -33,4 +33,4 @@ Llama
|
|||||||
|
|
||||||
Update your Jan or [download the latest](https://jan.ai/).
|
Update your Jan or [download the latest](https://jan.ai/).
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.14).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.14).
|
||||||
|
|||||||
@ -25,4 +25,4 @@ import ChangelogHeader from "@/components/Changelog/ChangelogHeader"
|
|||||||
|
|
||||||
Update your Jan or [download the latest](https://jan.ai/).
|
Update your Jan or [download the latest](https://jan.ai/).
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.15).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.15).
|
||||||
|
|||||||
@ -26,4 +26,4 @@ import ChangelogHeader from "@/components/Changelog/ChangelogHeader"
|
|||||||
|
|
||||||
Update your Jan or [download the latest](https://jan.ai/).
|
Update your Jan or [download the latest](https://jan.ai/).
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.16).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.16).
|
||||||
|
|||||||
@ -20,4 +20,4 @@ import ChangelogHeader from "@/components/Changelog/ChangelogHeader"
|
|||||||
|
|
||||||
Update your Jan or [download the latest](https://jan.ai/).
|
Update your Jan or [download the latest](https://jan.ai/).
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.5.17).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.5.17).
|
||||||
|
|||||||
@ -18,4 +18,4 @@ import ChangelogHeader from "@/components/Changelog/ChangelogHeader"
|
|||||||
|
|
||||||
Update your Jan or [download the latest](https://jan.ai/).
|
Update your Jan or [download the latest](https://jan.ai/).
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.6.1).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.6.1).
|
||||||
@ -18,4 +18,4 @@ import ChangelogHeader from "@/components/Changelog/ChangelogHeader"
|
|||||||
|
|
||||||
Update your Jan or [download the latest](https://jan.ai/).
|
Update your Jan or [download the latest](https://jan.ai/).
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.6.3).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.6.3).
|
||||||
@ -23,4 +23,4 @@ new MCP examples.
|
|||||||
|
|
||||||
Update your Jan or [download the latest](https://jan.ai/).
|
Update your Jan or [download the latest](https://jan.ai/).
|
||||||
|
|
||||||
For more details, see the [GitHub release notes](https://github.com/menloresearch/jan/releases/tag/v0.6.5).
|
For more details, see the [GitHub release notes](https://github.com/janhq/jan/releases/tag/v0.6.5).
|
||||||