From c9f17ecb3a03ba5e8d0c4bd15c28be1eda8b8346 Mon Sep 17 00:00:00 2001 From: Joseph C Wang Date: Fri, 29 Mar 2024 01:44:37 +0800 Subject: [PATCH 01/68] allow version to work with -rc tag --- backend/apps/ollama/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/apps/ollama/main.py b/backend/apps/ollama/main.py index f8701c43e..39106ac17 100644 --- a/backend/apps/ollama/main.py +++ b/backend/apps/ollama/main.py @@ -203,7 +203,7 @@ async def get_ollama_versions(url_idx: Optional[int] = None): if len(responses) > 0: lowest_version = min( - responses, key=lambda x: tuple(map(int, x["version"].split("."))) + responses, key=lambda x: tuple(map(int, x["version"].replace("-rc", ".").split("."))) ) return {"version": lowest_version["version"]} From 40e1e212d41ac88e05e9f65ecac020d780d6c1cc Mon Sep 17 00:00:00 2001 From: Danny Liu Date: Mon, 1 Apr 2024 16:11:28 -0700 Subject: [PATCH 02/68] feat: default profile image with user initials --- .../components/chat/Settings/Account.svelte | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/Settings/Account.svelte b/src/lib/components/chat/Settings/Account.svelte index 3a2259a79..ba33056ec 100644 --- a/src/lib/components/chat/Settings/Account.svelte +++ b/src/lib/components/chat/Settings/Account.svelte @@ -19,6 +19,25 @@ let JWTTokenCopied = false; let profileImageInputElement: HTMLInputElement; + const generateInitialsImage = (name) => { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.width = 100; + canvas.height = 100; + + ctx.fillStyle = '#F39C12'; + ctx.fillRect(0, 0, canvas.width, canvas.height); + + ctx.fillStyle = '#FFFFFF'; + ctx.font = '40px Helvetica'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + const initials = name.split(' ').map(word => word[0]).join(''); + ctx.fillText(initials.toUpperCase(), canvas.width / 2, canvas.height / 2); + + return canvas.toDataURL(); + }; + const submitHandler = async () => { const updatedUser = await updateUserProfile(localStorage.token, name, profileImageUrl).catch( (error) => { @@ -116,7 +135,7 @@ }} > profile @@ -142,9 +161,7 @@ From a0a064f4c8a3bd8414c953379331668be4f5f2ab Mon Sep 17 00:00:00 2001 From: Danny Liu Date: Mon, 1 Apr 2024 16:23:54 -0700 Subject: [PATCH 03/68] update initals avatar if user changes name --- src/lib/components/chat/Settings/Account.svelte | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/components/chat/Settings/Account.svelte b/src/lib/components/chat/Settings/Account.svelte index ba33056ec..36d2d6320 100644 --- a/src/lib/components/chat/Settings/Account.svelte +++ b/src/lib/components/chat/Settings/Account.svelte @@ -39,6 +39,11 @@ }; const submitHandler = async () => { + const isInitialsImage: boolean = profileImageUrl === generateInitialsImage($user.name) || profileImageUrl === ''; + if (isInitialsImage && name !== $user.name) { + profileImageUrl = generateInitialsImage(name); + } + const updatedUser = await updateUserProfile(localStorage.token, name, profileImageUrl).catch( (error) => { toast.error(error); From 6bb299ae25434b9b3aea642dd77d75778dc70ce5 Mon Sep 17 00:00:00 2001 From: Danny Liu Date: Mon, 1 Apr 2024 16:26:05 -0700 Subject: [PATCH 04/68] run npm run format --- .../components/chat/Settings/Account.svelte | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/lib/components/chat/Settings/Account.svelte b/src/lib/components/chat/Settings/Account.svelte index 36d2d6320..85a14cd48 100644 --- a/src/lib/components/chat/Settings/Account.svelte +++ b/src/lib/components/chat/Settings/Account.svelte @@ -20,29 +20,33 @@ let profileImageInputElement: HTMLInputElement; const generateInitialsImage = (name) => { - const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d'); - canvas.width = 100; - canvas.height = 100; + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.width = 100; + canvas.height = 100; - ctx.fillStyle = '#F39C12'; - ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.fillStyle = '#F39C12'; + ctx.fillRect(0, 0, canvas.width, canvas.height); - ctx.fillStyle = '#FFFFFF'; - ctx.font = '40px Helvetica'; - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - const initials = name.split(' ').map(word => word[0]).join(''); - ctx.fillText(initials.toUpperCase(), canvas.width / 2, canvas.height / 2); + ctx.fillStyle = '#FFFFFF'; + ctx.font = '40px Helvetica'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + const initials = name + .split(' ') + .map((word) => word[0]) + .join(''); + ctx.fillText(initials.toUpperCase(), canvas.width / 2, canvas.height / 2); - return canvas.toDataURL(); - }; + return canvas.toDataURL(); + }; const submitHandler = async () => { - const isInitialsImage: boolean = profileImageUrl === generateInitialsImage($user.name) || profileImageUrl === ''; - if (isInitialsImage && name !== $user.name) { - profileImageUrl = generateInitialsImage(name); - } + const isInitialsImage: boolean = + profileImageUrl === generateInitialsImage($user.name) || profileImageUrl === ''; + if (isInitialsImage && name !== $user.name) { + profileImageUrl = generateInitialsImage(name); + } const updatedUser = await updateUserProfile(localStorage.token, name, profileImageUrl).catch( (error) => { From 83ad488e314dff5c0eceb700221c4374229b31e9 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 2 Apr 2024 15:55:00 -0300 Subject: [PATCH 05/68] Do not use hardcoded manifest.json Generate manifest.json dynamically, using MANIFEST_NAME and MANIFEST_SHORT_NAME from the environment. --- .env.example | 5 ++++- Dockerfile | 3 +++ backend/config.py | 8 ++++++++ backend/main.py | 24 ++++++++++++++++++++++++ static/manifest.json | 16 ---------------- 5 files changed, 39 insertions(+), 17 deletions(-) delete mode 100644 static/manifest.json diff --git a/.env.example b/.env.example index 3d2aafc09..689d5a19a 100644 --- a/.env.example +++ b/.env.example @@ -9,4 +9,7 @@ OPENAI_API_KEY='' # DO NOT TRACK SCARF_NO_ANALYTICS=true -DO_NOT_TRACK=true \ No newline at end of file +DO_NOT_TRACK=true + +MANIFEST_NAME='Open WebUI' +MANIFEST_SHORT_NAME='Open WebUI' diff --git a/Dockerfile b/Dockerfile index de501838f..87820311b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,6 +30,9 @@ ENV WEBUI_SECRET_KEY "" ENV SCARF_NO_ANALYTICS true ENV DO_NOT_TRACK true +ENV MANIFEST_NAME "Open WebUI" +ENV MANIFEST_SHORT_NAME "Open WebUI" + ######## Preloaded models ######## # whisper TTS Settings ENV WHISPER_MODEL="base" diff --git a/backend/config.py b/backend/config.py index 04778f9f0..df1d024cf 100644 --- a/backend/config.py +++ b/backend/config.py @@ -424,3 +424,11 @@ WHISPER_MODEL_DIR = os.getenv("WHISPER_MODEL_DIR", f"{CACHE_DIR}/whisper/models" AUTOMATIC1111_BASE_URL = os.getenv("AUTOMATIC1111_BASE_URL", "") COMFYUI_BASE_URL = os.getenv("COMFYUI_BASE_URL", "") + + +#################################### +# Manifest +#################################### + +MANIFEST_NAME = os.getenv("MANIFEST_NAME", "Open WebUI") +MANIFEST_SHORT_NAME = os.getenv("MANIFEST_SHORT_NAME", "Open WebUI") diff --git a/backend/main.py b/backend/main.py index 8cc704a26..7307b54ff 100644 --- a/backend/main.py +++ b/backend/main.py @@ -43,6 +43,8 @@ from config import ( GLOBAL_LOG_LEVEL, SRC_LOG_LEVELS, WEBHOOK_URL, + MANIFEST_NAME, + MANIFEST_SHORT_NAME ) from constants import ERROR_MESSAGES @@ -69,6 +71,8 @@ app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST app.state.WEBHOOK_URL = WEBHOOK_URL +app.state.MANIFEST_NAME = MANIFEST_NAME +app.state.MANIFEST_SHORT_NAME = MANIFEST_SHORT_NAME origins = ["*"] @@ -268,6 +272,26 @@ async def get_app_latest_release_version(): ) +@app.get("/manifest.json") +async def get_manifest_json(): + return { + "name": app.state.MANIFEST_NAME, + "short_name": app.state.MANIFEST_SHORT_NAME, + "start_url": "/", + "display": "standalone", + "background_color": "#343541", + "theme_color": "#343541", + "orientation": "portrait-primary", + "icons": [ + { + "src": "/favicon.png", + "type": "image/png", + "sizes": "844x884" + } + ] + } + + app.mount("/static", StaticFiles(directory="static"), name="static") app.mount("/cache", StaticFiles(directory="data/cache"), name="cache") diff --git a/static/manifest.json b/static/manifest.json deleted file mode 100644 index ee019bd90..000000000 --- a/static/manifest.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "Open WebUI", - "short_name": "Open WebUI", - "start_url": "/", - "display": "standalone", - "background_color": "#343541", - "theme_color": "#343541", - "orientation": "portrait-primary", - "icons": [ - { - "src": "/favicon.png", - "type": "image/png", - "sizes": "844x884" - } - ] -} From 14fcf4d26736ccdec25268b3fe92a8b8102a0809 Mon Sep 17 00:00:00 2001 From: Ofer Helman Date: Wed, 3 Apr 2024 11:44:01 +0300 Subject: [PATCH 06/68] Update requirements.txt In case of using bedrock with litellm import boto3 exception is raised --- backend/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/requirements.txt b/backend/requirements.txt index df8fcfec3..3e423516c 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -17,6 +17,7 @@ peewee bcrypt litellm==1.30.7 +boto3 argon2-cffi apscheduler google-generativeai From a3d6343dbec597795a13d18aaec02f181bc69c42 Mon Sep 17 00:00:00 2001 From: Ofer Helman Date: Wed, 3 Apr 2024 16:27:49 +0300 Subject: [PATCH 07/68] Update requirements.txt --- backend/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/requirements.txt b/backend/requirements.txt index 3e423516c..4fa43e62c 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -18,6 +18,7 @@ bcrypt litellm==1.30.7 boto3 + argon2-cffi apscheduler google-generativeai From 15d24a6a116b60334ffa54006fb406166965b522 Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Wed, 3 Apr 2024 16:00:06 +0200 Subject: [PATCH 08/68] Fix hover in whitemode --- src/lib/components/layout/Sidebar.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index 445dc927b..9537eed9b 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -581,7 +581,7 @@
{#if $user.role === 'admin'}
-
- v{WEBUI_VERSION} +
+ + v{WEBUI_VERSION} + Date: Wed, 3 Apr 2024 10:57:58 -0700 Subject: [PATCH 11/68] feat: sanitise response content --- .../chat/Messages/ResponseMessage.svelte | 14 ++++++++++---- src/lib/utils/index.ts | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 3888d764e..aa2fab2c0 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -17,7 +17,11 @@ import { config, settings } from '$lib/stores'; import { synthesizeOpenAISpeech } from '$lib/apis/openai'; import { imageGenerations } from '$lib/apis/images'; - import { extractSentences } from '$lib/utils'; + import { + extractSentences, + revertSanitizedResponseContent, + sanitizeResponseContent + } from '$lib/utils'; import Name from './Name.svelte'; import ProfileImage from './ProfileImage.svelte'; @@ -56,7 +60,7 @@ let loadingSpeech = false; let generatingImage = false; - $: tokens = marked.lexer(message.content); + $: tokens = marked.lexer(sanitizeResponseContent(message.content)); const renderer = new marked.Renderer(); @@ -405,8 +409,10 @@ {:else} {#each tokens as token} {#if token.type === 'code'} - - + {:else} {@html marked.parse(token.raw, { ...defaults, diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 90d5d3c38..9ee8b6fc1 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -31,6 +31,21 @@ export const getModels = async (token: string) => { // Helper functions ////////////////////////// +export const sanitizeResponseContent = (content: string) => { + return content + .replace(/<\|[a-z]*$/, '') + .replace(/<\|[a-z]+\|$/, '') + .replace(/<$/, '') + .replaceAll(/<\|[a-z]+\|>/g, ' ') + .replaceAll(//gi, '\n') + .replaceAll('<', '<') + .trim(); +}; + +export const revertSanitizedResponseContent = (content: string) => { + return content.replaceAll('<', '<'); +}; + export const capitalizeFirstLetter = (string) => { return string.charAt(0).toUpperCase() + string.slice(1); }; From 000bea84aec97b835a8f02c059c6604ddba1ceb2 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Wed, 3 Apr 2024 19:30:25 -0700 Subject: [PATCH 12/68] feat: chat pdf download --- src/lib/components/chat/ShareChatModal.svelte | 31 ------ src/lib/components/layout/Navbar.svelte | 63 +---------- src/lib/components/layout/Navbar/Menu.svelte | 105 ++++++++++++++++-- src/routes/(app)/+page.svelte | 1 + src/routes/(app)/c/[id]/+page.svelte | 1 + 5 files changed, 104 insertions(+), 97 deletions(-) diff --git a/src/lib/components/chat/ShareChatModal.svelte b/src/lib/components/chat/ShareChatModal.svelte index 14945ab9d..30ef72e7a 100644 --- a/src/lib/components/chat/ShareChatModal.svelte +++ b/src/lib/components/chat/ShareChatModal.svelte @@ -1,9 +1,6 @@ -