diff --git a/Dockerfile b/Dockerfile index 913a93a11..48b2d254f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,9 +14,6 @@ COPY . ./ RUN export NITRO_VERSION=$(cat extensions/inference-nitro-extension/bin/version.txt) && \ jq --arg nitroVersion $NITRO_VERSION '(.scripts."downloadnitro:linux" | gsub("\\${NITRO_VERSION}"; $nitroVersion)) | gsub("\r"; "")' extensions/inference-nitro-extension/package.json > /tmp/newcommand.txt && export NEW_COMMAND=$(sed 's/^"//;s/"$//' /tmp/newcommand.txt) && jq --arg newCommand "$NEW_COMMAND" '.scripts."downloadnitro:linux" = $newCommand' extensions/inference-nitro-extension/package.json > /tmp/package.json && mv /tmp/package.json extensions/inference-nitro-extension/package.json RUN make install-and-build -RUN yarn workspace jan-web install - -RUN export NODE_ENV=production && yarn workspace jan-web build # # 2. Rebuild the source code only when needed FROM base AS runner @@ -42,12 +39,13 @@ COPY --from=builder /app/docs/openapi ./docs/openapi/ COPY --from=builder /app/pre-install ./pre-install/ # Copy the package.json, yarn.lock, and output of web yarn space to leverage Docker cache -COPY --from=builder /app/web/out ./web/out/ -COPY --from=builder /app/web/.next ./web/.next/ -COPY --from=builder /app/web/package.json ./web/package.json -COPY --from=builder /app/web/yarn.lock ./web/yarn.lock +COPY --from=builder /app/uikit ./uikit/ +COPY --from=builder /app/web ./web/ COPY --from=builder /app/models ./models/ +RUN yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit build +RUN yarn workspace jan-web install + RUN npm install -g serve@latest EXPOSE 1337 3000 3928 @@ -55,7 +53,9 @@ EXPOSE 1337 3000 3928 ENV JAN_API_HOST 0.0.0.0 ENV JAN_API_PORT 1337 -CMD ["sh", "-c", "cd server && node build/main.js & cd web && npx serve out"] +ENV API_BASE_URL http://localhost:1337 + +CMD ["sh", "-c", "export NODE_ENV=production && yarn workspace jan-web build && cd web && npx serve out & cd server && node build/main.js"] # docker build -t jan . # docker run -p 1337:1337 -p 3000:3000 -p 3928:3928 jan diff --git a/Dockerfile.gpu b/Dockerfile.gpu index d5ea70499..832e2c18c 100644 --- a/Dockerfile.gpu +++ b/Dockerfile.gpu @@ -28,9 +28,6 @@ COPY . ./ RUN export NITRO_VERSION=$(cat extensions/inference-nitro-extension/bin/version.txt) && \ jq --arg nitroVersion $NITRO_VERSION '(.scripts."downloadnitro:linux" | gsub("\\${NITRO_VERSION}"; $nitroVersion)) | gsub("\r"; "")' extensions/inference-nitro-extension/package.json > /tmp/newcommand.txt && export NEW_COMMAND=$(sed 's/^"//;s/"$//' /tmp/newcommand.txt) && jq --arg newCommand "$NEW_COMMAND" '.scripts."downloadnitro:linux" = $newCommand' extensions/inference-nitro-extension/package.json > /tmp/package.json && mv /tmp/package.json extensions/inference-nitro-extension/package.json RUN make install-and-build -RUN yarn workspace jan-web install - -RUN export NODE_ENV=production && yarn workspace jan-web build # # 2. Rebuild the source code only when needed FROM base AS runner @@ -66,12 +63,13 @@ COPY --from=builder /app/docs/openapi ./docs/openapi/ COPY --from=builder /app/pre-install ./pre-install/ # Copy the package.json, yarn.lock, and output of web yarn space to leverage Docker cache -COPY --from=builder /app/web/out ./web/out/ -COPY --from=builder /app/web/.next ./web/.next/ -COPY --from=builder /app/web/package.json ./web/package.json -COPY --from=builder /app/web/yarn.lock ./web/yarn.lock +COPY --from=builder /app/uikit ./uikit/ +COPY --from=builder /app/web ./web/ COPY --from=builder /app/models ./models/ +RUN yarn workspace @janhq/uikit install && yarn workspace @janhq/uikit build +RUN yarn workspace jan-web install + RUN npm install -g serve@latest EXPOSE 1337 3000 3928 @@ -81,7 +79,9 @@ ENV LD_LIBRARY_PATH=/usr/local/cuda/targets/x86_64-linux/lib:/usr/local/cuda-12. ENV JAN_API_HOST 0.0.0.0 ENV JAN_API_PORT 1337 -CMD ["sh", "-c", "cd server && node build/main.js & cd web && npx serve out"] +ENV API_BASE_URL http://localhost:1337 + +CMD ["sh", "-c", "export NODE_ENV=production && yarn workspace jan-web build && cd web && npx serve out & cd server && node build/main.js"] # pre-requisites: nvidia-docker # docker build -t jan-gpu . -f Dockerfile.gpu diff --git a/Makefile b/Makefile index ffb1abee2..a45477b29 100644 --- a/Makefile +++ b/Makefile @@ -52,18 +52,28 @@ build: check-file-counts clean: ifeq ($(OS),Windows_NT) - powershell -Command "Get-ChildItem -Path . -Include node_modules, .next, dist -Recurse -Directory | Remove-Item -Recurse -Force" + powershell -Command "Get-ChildItem -Path . -Include node_modules, .next, dist, build, out -Recurse -Directory | Remove-Item -Recurse -Force" + powershell -Command "Remove-Item -Recurse -Force ./pre-install/*.tgz" + powershell -Command "Remove-Item -Recurse -Force ./electron/pre-install/*.tgz" rmdir /s /q "%USERPROFILE%\jan\extensions" else ifeq ($(shell uname -s),Linux) find . -name "node_modules" -type d -prune -exec rm -rf '{}' + find . -name ".next" -type d -exec rm -rf '{}' + find . -name "dist" -type d -exec rm -rf '{}' + + find . -name "build" -type d -exec rm -rf '{}' + + find . -name "out" -type d -exec rm -rf '{}' + + rm -rf ./pre-install/*.tgz + rm -rf ./electron/pre-install/*.tgz rm -rf "~/jan/extensions" rm -rf "~/.cache/jan*" else find . -name "node_modules" -type d -prune -exec rm -rf '{}' + find . -name ".next" -type d -exec rm -rf '{}' + find . -name "dist" -type d -exec rm -rf '{}' + + find . -name "build" -type d -exec rm -rf '{}' + + find . -name "out" -type d -exec rm -rf '{}' + + rm -rf ./pre-install/*.tgz + rm -rf ./electron/pre-install/*.tgz rm -rf ~/jan/extensions rm -rf ~/Library/Caches/jan* endif diff --git a/README.md b/README.md index 762d82dba..ed3d18985 100644 --- a/README.md +++ b/README.md @@ -76,31 +76,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute
jan.exe
Intel
M1/M2
jan.deb
jan.AppImage
@@ -235,61 +235,84 @@ This will build the app MacOS m1/m2 for production (with code signing already do
- Run Jan in Docker mode
- - **Option 1**: Run Jan in CPU mode
+| Docker compose Profile | Description |
+| ---------------------- | -------------------------------------------- |
+| `cpu-fs` | Run Jan in CPU mode with default file system |
+| `cpu-s3fs` | Run Jan in CPU mode with S3 file system |
+| `gpu-fs` | Run Jan in GPU mode with default file system |
+| `gpu-s3fs` | Run Jan in GPU mode with S3 file system |
+
+| Environment Variable | Description |
+| ----------------------- | ------------------------------------------------------------------------------------------------------- |
+| `S3_BUCKET_NAME` | S3 bucket name - leave blank for default file system |
+| `AWS_ACCESS_KEY_ID` | AWS access key ID - leave blank for default file system |
+| `AWS_SECRET_ACCESS_KEY` | AWS secret access key - leave blank for default file system |
+| `AWS_ENDPOINT` | AWS endpoint URL - leave blank for default file system |
+| `AWS_REGION` | AWS region - leave blank for default file system |
+| `API_BASE_URL` | Jan Server URL, please modify it as your public ip address or domain name default http://localhost:1377 |
+
+- **Option 1**: Run Jan in CPU mode
+
+ ```bash
+ # cpu mode with default file system
+ docker compose --profile cpu-fs up -d
+
+ # cpu mode with S3 file system
+ docker compose --profile cpu-s3fs up -d
+ ```
+
+- **Option 2**: Run Jan in GPU mode
+
+ - **Step 1**: Check CUDA compatibility with your NVIDIA driver by running `nvidia-smi` and check the CUDA version in the output
```bash
- docker compose --profile cpu up -d
+ nvidia-smi
+
+ # Output
+ +---------------------------------------------------------------------------------------+
+ | NVIDIA-SMI 531.18 Driver Version: 531.18 CUDA Version: 12.1 |
+ |-----------------------------------------+----------------------+----------------------+
+ | GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
+ | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
+ | | | MIG M. |
+ |=========================================+======================+======================|
+ | 0 NVIDIA GeForce RTX 4070 Ti WDDM | 00000000:01:00.0 On | N/A |
+ | 0% 44C P8 16W / 285W| 1481MiB / 12282MiB | 2% Default |
+ | | | N/A |
+ +-----------------------------------------+----------------------+----------------------+
+ | 1 NVIDIA GeForce GTX 1660 Ti WDDM | 00000000:02:00.0 Off | N/A |
+ | 0% 49C P8 14W / 120W| 0MiB / 6144MiB | 0% Default |
+ | | | N/A |
+ +-----------------------------------------+----------------------+----------------------+
+ | 2 NVIDIA GeForce GTX 1660 Ti WDDM | 00000000:05:00.0 Off | N/A |
+ | 29% 38C P8 11W / 120W| 0MiB / 6144MiB | 0% Default |
+ | | | N/A |
+ +-----------------------------------------+----------------------+----------------------+
+
+ +---------------------------------------------------------------------------------------+
+ | Processes: |
+ | GPU GI CI PID Type Process name GPU Memory |
+ | ID ID Usage |
+ |=======================================================================================|
```
- - **Option 2**: Run Jan in GPU mode
+ - **Step 2**: Visit [NVIDIA NGC Catalog ](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda/tags) and find the smallest minor version of image tag that matches your CUDA version (e.g., 12.1 -> 12.1.0)
- - **Step 1**: Check CUDA compatibility with your NVIDIA driver by running `nvidia-smi` and check the CUDA version in the output
+ - **Step 3**: Update the `Dockerfile.gpu` line number 5 with the latest minor version of the image tag from step 2 (e.g. change `FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 AS base` to `FROM nvidia/cuda:12.1.0-runtime-ubuntu22.04 AS base`)
- ```bash
- nvidia-smi
+ - **Step 4**: Run command to start Jan in GPU mode
- # Output
- +---------------------------------------------------------------------------------------+
- | NVIDIA-SMI 531.18 Driver Version: 531.18 CUDA Version: 12.1 |
- |-----------------------------------------+----------------------+----------------------+
- | GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
- | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
- | | | MIG M. |
- |=========================================+======================+======================|
- | 0 NVIDIA GeForce RTX 4070 Ti WDDM | 00000000:01:00.0 On | N/A |
- | 0% 44C P8 16W / 285W| 1481MiB / 12282MiB | 2% Default |
- | | | N/A |
- +-----------------------------------------+----------------------+----------------------+
- | 1 NVIDIA GeForce GTX 1660 Ti WDDM | 00000000:02:00.0 Off | N/A |
- | 0% 49C P8 14W / 120W| 0MiB / 6144MiB | 0% Default |
- | | | N/A |
- +-----------------------------------------+----------------------+----------------------+
- | 2 NVIDIA GeForce GTX 1660 Ti WDDM | 00000000:05:00.0 Off | N/A |
- | 29% 38C P8 11W / 120W| 0MiB / 6144MiB | 0% Default |
- | | | N/A |
- +-----------------------------------------+----------------------+----------------------+
+ ```bash
+ # GPU mode with default file system
+ docker compose --profile gpu up -d
- +---------------------------------------------------------------------------------------+
- | Processes: |
- | GPU GI CI PID Type Process name GPU Memory |
- | ID ID Usage |
- |=======================================================================================|
- ```
+ # GPU mode with S3 file system
+ docker compose --profile gpu-s3fs up -d
+ ```
- - **Step 2**: Visit [NVIDIA NGC Catalog ](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda/tags) and find the smallest minor version of image tag that matches your CUDA version (e.g., 12.1 -> 12.1.0)
+This will start the web server and you can access Jan at `http://localhost:3000`.
- - **Step 3**: Update the `Dockerfile.gpu` line number 5 with the latest minor version of the image tag from step 2 (e.g. change `FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04 AS base` to `FROM nvidia/cuda:12.1.0-runtime-ubuntu22.04 AS base`)
-
- - **Step 4**: Run command to start Jan in GPU mode
-
- ```bash
- # GPU mode
- docker compose --profile gpu up -d
- ```
-
- This will start the web server and you can access Jan at `http://localhost:3000`.
-
- > Note: Currently, Docker mode is only work for development and localhost, production is not supported yet. RAG feature is not supported in Docker mode yet.
+> Note: RAG feature is not supported in Docker mode with s3fs yet.
## Acknowledgements
diff --git a/core/src/node/api/processors/app.ts b/core/src/node/api/processors/app.ts
index a4b1a5a06..c62b5011d 100644
--- a/core/src/node/api/processors/app.ts
+++ b/core/src/node/api/processors/app.ts
@@ -1,6 +1,5 @@
import { basename, isAbsolute, join, relative } from 'path'
-import { AppRoute } from '../../../api'
import { Processor } from './Processor'
import { getAppConfigurations as appConfiguration, updateAppConfiguration } from '../../helper'
import { log as writeLog, logServer as writeServerLog } from '../../helper/log'
diff --git a/core/src/node/api/restful/common.ts b/core/src/node/api/restful/common.ts
index b87bc946d..433632989 100644
--- a/core/src/node/api/restful/common.ts
+++ b/core/src/node/api/restful/common.ts
@@ -8,7 +8,7 @@ import {
createMessage,
createThread,
getMessages,
- retrieveMesasge,
+ retrieveMessage,
updateThread,
} from './helper/builder'
@@ -17,10 +17,18 @@ import { startModel, stopModel } from './helper/startStopModel'
import { ModelSettingParams } from '../../../types'
export const commonRouter = async (app: HttpServer) => {
+ const normalizeData = (data: any) => {
+ return {
+ object: 'list',
+ data,
+ }
+ }
// Common Routes
// Read & Delete :: Threads | Models | Assistants
Object.keys(JanApiRouteConfiguration).forEach((key) => {
- app.get(`/${key}`, async (_request) => getBuilder(JanApiRouteConfiguration[key]))
+ app.get(`/${key}`, async (_request) =>
+ getBuilder(JanApiRouteConfiguration[key]).then(normalizeData)
+ )
app.get(`/${key}/:id`, async (request: any) =>
retrieveBuilder(JanApiRouteConfiguration[key], request.params.id)
@@ -34,10 +42,12 @@ export const commonRouter = async (app: HttpServer) => {
// Threads
app.post(`/threads/`, async (req, res) => createThread(req.body))
- app.get(`/threads/:threadId/messages`, async (req, res) => getMessages(req.params.threadId))
+ app.get(`/threads/:threadId/messages`, async (req, res) =>
+ getMessages(req.params.threadId).then(normalizeData)
+ )
app.get(`/threads/:threadId/messages/:messageId`, async (req, res) =>
- retrieveMesasge(req.params.threadId, req.params.messageId)
+ retrieveMessage(req.params.threadId, req.params.messageId)
)
app.post(`/threads/:threadId/messages`, async (req, res) =>
diff --git a/core/src/node/api/restful/helper/builder.ts b/core/src/node/api/restful/helper/builder.ts
index b7753fcb0..7001c0c76 100644
--- a/core/src/node/api/restful/helper/builder.ts
+++ b/core/src/node/api/restful/helper/builder.ts
@@ -125,7 +125,7 @@ export const getMessages = async (threadId: string): Promise