Skip to content

Commit 73b316c

Browse files
authored
Add chat-ui and chat-ui-db docker images (#613)
* Add a `Dockerfile.local` image to build * Add a build & publish workflow * fix workflow * Add support for local mongoDB * Fix problem with POST requests * use slim image * Set mistral to be the default model in .env * Fix entrypoint * Revert change regarding config folder * replace env variable by build arg for DB and update work * old mention of `conf` folder in readme * env to .env * Revert readme changes * lint
1 parent e0c0b0e commit 73b316c

File tree

9 files changed

+191
-35
lines changed

9 files changed

+191
-35
lines changed

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ LICENSE
66
README.md
77
node_modules/
88
.svelte-kit/
9+
.env*
10+
!.env

.env

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -44,39 +44,39 @@ REJECT_UNAUTHORIZED=true
4444

4545
# 'name', 'userMessageToken', 'assistantMessageToken' are required
4646
MODELS=`[
47-
{
48-
"name": "OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5",
49-
"datasetName": "OpenAssistant/oasst1",
50-
"description": "A good alternative to ChatGPT",
51-
"websiteUrl": "https://open-assistant.io",
52-
"userMessageToken": "<|prompter|>",
53-
"assistantMessageToken": "<|assistant|>",
54-
"messageEndToken": "</s>",
55-
"preprompt": "Below are a series of dialogues between various people and an AI assistant. The AI tries to be helpful, polite, honest, sophisticated, emotionally aware, and humble-but-knowledgeable. The assistant is happy to help with almost anything, and will do its best to understand exactly what is needed. It also tries to avoid giving false or misleading information, and it caveats when it isn't entirely sure about the right answer. That said, the assistant is practical and really does its best, and doesn't let caution get too much in the way of being useful.\n-----\n",
56-
"promptExamples": [
57-
{
58-
"title": "Write an email from bullet list",
59-
"prompt": "As a restaurant owner, write a professional email to the supplier to get these products every week: \n\n- Wine (x10)\n- Eggs (x24)\n- Bread (x12)"
60-
}, {
61-
"title": "Code a snake game",
62-
"prompt": "Code a basic snake game in python, give explanations for each step."
63-
}, {
64-
"title": "Assist in a task",
65-
"prompt": "How do I make a delicious lemon cheesecake?"
66-
}
67-
],
68-
"parameters": {
69-
"temperature": 0.9,
70-
"top_p": 0.95,
71-
"repetition_penalty": 1.2,
72-
"top_k": 50,
73-
"truncate": 1000,
74-
"max_new_tokens": 1024
47+
{
48+
"name": "mistralai/Mistral-7B-Instruct-v0.1",
49+
"displayName": "mistralai/Mistral-7B-Instruct-v0.1",
50+
"description": "Mistral 7B is a new Apache 2.0 model, released by Mistral AI that outperforms Llama2 13B in benchmarks.",
51+
"websiteUrl": "https://mistral.ai/news/announcing-mistral-7b/",
52+
"preprompt": "",
53+
"chatPromptTemplate" : "<s>{{#each messages}}{{#ifUser}}[INST] {{#if @first}}{{#if @root.preprompt}}{{@root.preprompt}}\n{{/if}}{{/if}}{{content}} [/INST]{{/ifUser}}{{#ifAssistant}}{{content}}</s>{{/ifAssistant}}{{/each}}",
54+
"parameters": {
55+
"temperature": 0.1,
56+
"top_p": 0.95,
57+
"repetition_penalty": 1.2,
58+
"top_k": 50,
59+
"truncate": 3072,
60+
"max_new_tokens": 1024,
61+
"stop": ["</s>"]
62+
},
63+
"promptExamples": [
64+
{
65+
"title": "Write an email from bullet list",
66+
"prompt": "As a restaurant owner, write a professional email to the supplier to get these products every week: \n\n- Wine (x10)\n- Eggs (x24)\n- Bread (x12)"
67+
}, {
68+
"title": "Code a snake game",
69+
"prompt": "Code a basic snake game in python, give explanations for each step."
70+
}, {
71+
"title": "Assist in a task",
72+
"prompt": "How do I make a delicious lemon cheesecake?"
73+
}
74+
]
7575
}
76-
}
7776
]`
77+
7878
OLD_MODELS=`[]`# any removed models, `{ name: string, displayName?: string, id?: string }`
79-
TASK_MODEL='' # name of the model used for tasks such as summarizing title, creating query, etc.
79+
TASK_MODEL= # name of the model used for tasks such as summarizing title, creating query, etc.
8080

8181
PUBLIC_ORIGIN=#https://huggingface.co
8282
PUBLIC_SHARE_PREFIX=#https://hf.co/chat

conf/.env.ci renamed to .env.ci

File renamed without changes.

.github/workflows/build-image.yml

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
name: Buid and Publish Image
2+
3+
on:
4+
push:
5+
branches:
6+
- "main"
7+
pull_request:
8+
branches:
9+
- "*"
10+
paths:
11+
- "Dockerfile.local"
12+
- "entrypoint.sh"
13+
workflow_dispatch:
14+
release:
15+
types: [published, edited]
16+
17+
jobs:
18+
build-and-publish-image-with-db:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
- name: Docker metadata
24+
id: meta
25+
uses: docker/metadata-action@v5
26+
with:
27+
images: |
28+
ghcr.io/huggingface/chat-ui-db
29+
tags: |
30+
type=ref,event=branch
31+
type=ref,event=pr
32+
type=semver,pattern={{version}}
33+
type=semver,pattern={{major}}
34+
type=semver,pattern={{major}}.{{minor}}
35+
36+
- name: Set up QEMU
37+
uses: docker/setup-qemu-action@v3
38+
39+
- name: Set up Docker Buildx
40+
uses: docker/setup-buildx-action@v3
41+
42+
- name: Login to GitHub Container Registry
43+
if: github.event_name != 'pull_request'
44+
uses: docker/login-action@v3
45+
with:
46+
registry: ghcr.io
47+
username: ${{ github.repository_owner }}
48+
password: ${{ secrets.GITHUB_TOKEN }}
49+
50+
- name: Build and Publish Docker Image
51+
uses: docker/build-push-action@v5
52+
with:
53+
context: .
54+
file: Dockerfile.local
55+
push: ${{ github.event_name != 'pull_request' }}
56+
tags: ${{ steps.meta.outputs.tags }}
57+
labels: ${{ steps.meta.outputs.labels }}
58+
platforms: linux/amd64,linux/arm64
59+
build-args: |
60+
- INCLUDE_DB=true
61+
build-and-publish-image-nodb:
62+
runs-on: ubuntu-latest
63+
steps:
64+
- name: Checkout
65+
uses: actions/checkout@v4
66+
- name: Docker metadata
67+
id: meta
68+
uses: docker/metadata-action@v5
69+
with:
70+
images: |
71+
ghcr.io/huggingface/chat-ui
72+
tags: |
73+
type=ref,event=branch
74+
type=ref,event=pr
75+
type=semver,pattern={{version}}
76+
type=semver,pattern={{major}}
77+
type=semver,pattern={{major}}.{{minor}}
78+
79+
- name: Set up QEMU
80+
uses: docker/setup-qemu-action@v3
81+
82+
- name: Set up Docker Buildx
83+
uses: docker/setup-buildx-action@v3
84+
85+
- name: Login to GitHub Container Registry
86+
if: github.event_name != 'pull_request'
87+
uses: docker/login-action@v3
88+
with:
89+
registry: ghcr.io
90+
username: ${{ github.repository_owner }}
91+
password: ${{ secrets.GITHUB_TOKEN }}
92+
93+
- name: Build and Publish Docker Image
94+
uses: docker/build-push-action@v5
95+
with:
96+
context: .
97+
file: Dockerfile.local
98+
push: ${{ github.event_name != 'pull_request' }}
99+
tags: ${{ steps.meta.outputs.tags }}
100+
labels: ${{ steps.meta.outputs.labels }}
101+
platforms: linux/amd64,linux/arm64
102+
build-args: |
103+
- INCLUDE_DB=false

.github/workflows/lint-and-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,4 @@ jobs:
5353
steps:
5454
- uses: actions/checkout@v3
5555
- name: Build Docker image
56-
run: docker build --secret id=DOTENV_LOCAL,src=conf/.env.ci -t chat-ui:latest .
56+
run: docker build --secret id=DOTENV_LOCAL,src=.env.ci -t chat-ui:latest .

.gitignore

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ node_modules
55
/package
66
.env
77
.env.*
8-
!.env.example
9-
!.env.template
108
vite.config.js.timestamp-*
119
vite.config.ts.timestamp-*
1210
SECRET_CONFIG
1311
.idea
14-
!conf/.env.ci
12+
!.env.ci
13+
!.env
14+
!.env.template

Dockerfile.local

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
ARG INCLUDE_DB=false
2+
FROM mongo:latest as mongo
3+
4+
FROM node:20-slim as local_db_false
5+
6+
FROM node:20-slim as local_db_true
7+
8+
RUN apt-get update
9+
RUN apt-get install gnupg curl -y
10+
11+
COPY --from=mongo /usr/bin/mongo* /usr/bin/
12+
13+
FROM local_db_${INCLUDE_DB} as final
14+
ARG INCLUDE_DB=false
15+
ENV INCLUDE_DB=${INCLUDE_DB}
16+
17+
WORKDIR /app
18+
19+
COPY --link --chown=1000 package-lock.json package.json ./
20+
RUN --mount=type=cache,target=/app/.npm \
21+
npm set cache /app/.npm && \
22+
npm ci
23+
24+
# copy the rest of the files, run regardless of
25+
COPY --chown=1000 --link . .
26+
RUN chmod +x /app/entrypoint.sh
27+
28+
CMD ["/bin/bash", "-c", "/app/entrypoint.sh"]

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ A chat interface using open source models, eg OpenAssistant or Llama. It is a Sv
2424
5. [Deploying to a HF Space](#deploying-to-a-hf-space)
2525
6. [Building](#building)
2626

27-
##  No Setup Deploy
27+
## No Setup Deploy
2828

2929
If you don't want to configure, setup, and launch your own Chat UI yourself, you can use this option as a fast deploy alternative.
3030

entrypoint.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
if test -z "${DOTENV_LOCAL}" ; then
2+
if ! test -f "/app/.env.local" ; then
3+
echo "DOTENV_LOCAL was not found in the ENV variables and .env.local is not set using a bind volume. We are using the default .env config."
4+
fi;
5+
else
6+
echo "DOTENV_LOCAL was found in the ENV variables. Creating .env.local file."
7+
cat <<< "$DOTENV_LOCAL" > /app/.env.local
8+
fi;
9+
10+
if [ "$INCLUDE_DB" = "true" ] ; then
11+
echo "INCLUDE_DB is set to true. Appending MONGODB_URL"
12+
13+
touch /app/.env.local
14+
echo -e "\nMONGODB_URL=mongodb://localhost:27017" >> /app/.env.local
15+
16+
mkdir -p /data/db
17+
mongod &
18+
echo "Starting local MongoDB instance"
19+
20+
fi;
21+
22+
npm run build
23+
npm run preview -- --host 0.0.0.0 --port 3000

0 commit comments

Comments
 (0)