From 5df474abb997f0fb50493a4a0620a6546828bee3 Mon Sep 17 00:00:00 2001 From: Tristan Morris Date: Sun, 2 Feb 2025 07:58:59 -0600 Subject: [PATCH 001/117] Add support for Deepgram STT --- backend/open_webui/config.py | 6 ++ backend/open_webui/main.py | 2 + backend/open_webui/routers/audio.py | 64 +++++++++++++++++++ .../components/admin/Settings/Audio.svelte | 37 ++++++++++- 4 files changed, 108 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index c37b831dec..4b85d51943 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1954,6 +1954,12 @@ WHISPER_MODEL_AUTO_UPDATE = ( and os.environ.get("WHISPER_MODEL_AUTO_UPDATE", "").lower() == "true" ) +# Add Deepgram configuration +DEEPGRAM_API_KEY = PersistentConfig( + "DEEPGRAM_API_KEY", + "audio.stt.deepgram.api_key", + os.getenv("DEEPGRAM_API_KEY", ""), +) AUDIO_STT_OPENAI_API_BASE_URL = PersistentConfig( "AUDIO_STT_OPENAI_API_BASE_URL", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 00270aabc4..6323f34c33 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -130,6 +130,7 @@ from open_webui.config import ( AUDIO_TTS_AZURE_SPEECH_REGION, AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT, WHISPER_MODEL, + DEEPGRAM_API_KEY, WHISPER_MODEL_AUTO_UPDATE, WHISPER_MODEL_DIR, # Retrieval @@ -609,6 +610,7 @@ app.state.config.STT_ENGINE = AUDIO_STT_ENGINE app.state.config.STT_MODEL = AUDIO_STT_MODEL app.state.config.WHISPER_MODEL = WHISPER_MODEL +app.state.config.DEEPGRAM_API_KEY = DEEPGRAM_API_KEY app.state.config.TTS_OPENAI_API_BASE_URL = AUDIO_TTS_OPENAI_API_BASE_URL app.state.config.TTS_OPENAI_API_KEY = AUDIO_TTS_OPENAI_API_KEY diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index c1b15772bd..7242042e2a 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -11,6 +11,7 @@ from pydub.silence import split_on_silence import aiohttp import aiofiles import requests +import mimetypes from fastapi import ( Depends, @@ -138,6 +139,7 @@ class STTConfigForm(BaseModel): ENGINE: str MODEL: str WHISPER_MODEL: str + DEEPGRAM_API_KEY: str class AudioConfigUpdateForm(BaseModel): @@ -165,6 +167,7 @@ async def get_audio_config(request: Request, user=Depends(get_admin_user)): "ENGINE": request.app.state.config.STT_ENGINE, "MODEL": request.app.state.config.STT_MODEL, "WHISPER_MODEL": request.app.state.config.WHISPER_MODEL, + "DEEPGRAM_API_KEY": request.app.state.config.DEEPGRAM_API_KEY, }, } @@ -190,6 +193,7 @@ async def update_audio_config( request.app.state.config.STT_ENGINE = form_data.stt.ENGINE request.app.state.config.STT_MODEL = form_data.stt.MODEL request.app.state.config.WHISPER_MODEL = form_data.stt.WHISPER_MODEL + request.app.state.config.DEEPGRAM_API_KEY = form_data.stt.DEEPGRAM_API_KEY if request.app.state.config.STT_ENGINE == "": request.app.state.faster_whisper_model = set_faster_whisper_model( @@ -214,6 +218,7 @@ async def update_audio_config( "ENGINE": request.app.state.config.STT_ENGINE, "MODEL": request.app.state.config.STT_MODEL, "WHISPER_MODEL": request.app.state.config.WHISPER_MODEL, + "DEEPGRAM_API_KEY": request.app.state.config.DEEPGRAM_API_KEY, }, } @@ -521,6 +526,65 @@ def transcribe(request: Request, file_path): raise Exception(detail if detail else "Open WebUI: Server Connection Error") + elif request.app.state.config.STT_ENGINE == "deepgram": + try: + # Determine the MIME type of the file + mime, _ = mimetypes.guess_type(file_path) + if not mime: + mime = "audio/wav" # fallback to wav if undetectable + + # Read the audio file + with open(file_path, "rb") as f: + file_data = f.read() + + # Build headers and parameters + headers = { + "Authorization": f"Token {request.app.state.config.DEEPGRAM_API_KEY}", + "Content-Type": mime, + } + + # Add model if specified + params = {} + if request.app.state.config.STT_MODEL: + params["model"] = request.app.state.config.STT_MODEL + + # Make request to Deepgram API + r = requests.post( + "https://api.deepgram.com/v1/listen", + headers=headers, + params=params, + data=file_data, + ) + r.raise_for_status() + response_data = r.json() + + # Extract transcript from Deepgram response + try: + transcript = response_data["results"]["channels"][0]["alternatives"][0].get("transcript", "") + except (KeyError, IndexError) as e: + log.error(f"Malformed response from Deepgram: {str(e)}") + raise Exception("Failed to parse Deepgram response - unexpected response format") + data = {"text": transcript.strip()} + + # Save transcript + transcript_file = f"{file_dir}/{id}.json" + with open(transcript_file, "w") as f: + json.dump(data, f) + + return data + + except Exception as e: + log.exception(e) + detail = None + if r is not None: + try: + res = r.json() + if "error" in res: + detail = f"External: {res['error'].get('message', '')}" + except Exception: + detail = f"External: {e}" + raise Exception(detail if detail else "Open WebUI: Server Connection Error") + def compress_audio(file_path): if os.path.getsize(file_path) > MAX_FILE_SIZE: diff --git a/src/lib/components/admin/Settings/Audio.svelte b/src/lib/components/admin/Settings/Audio.svelte index a7a0300276..f3f3f3bb69 100644 --- a/src/lib/components/admin/Settings/Audio.svelte +++ b/src/lib/components/admin/Settings/Audio.svelte @@ -39,6 +39,7 @@ let STT_ENGINE = ''; let STT_MODEL = ''; let STT_WHISPER_MODEL = ''; + let STT_DEEPGRAM_API_KEY = ''; let STT_WHISPER_MODEL_LOADING = false; @@ -103,7 +104,8 @@ OPENAI_API_KEY: STT_OPENAI_API_KEY, ENGINE: STT_ENGINE, MODEL: STT_MODEL, - WHISPER_MODEL: STT_WHISPER_MODEL + WHISPER_MODEL: STT_WHISPER_MODEL, + DEEPGRAM_API_KEY: STT_DEEPGRAM_API_KEY } }); @@ -143,6 +145,7 @@ STT_ENGINE = res.stt.ENGINE; STT_MODEL = res.stt.MODEL; STT_WHISPER_MODEL = res.stt.WHISPER_MODEL; + STT_DEEPGRAM_API_KEY = res.stt.DEEPGRAM_API_KEY; } await getVoices(); @@ -173,6 +176,7 @@ + @@ -210,6 +214,37 @@ + {:else if STT_ENGINE === 'deepgram'} +
+
+ +
+
+ +
+ +
+
{$i18n.t('STT Model')}
+
+
+ +
+
+
+ {$i18n.t('Leave model field empty to use the default model.')} + + {$i18n.t('Click here to see available models.')} + +
+
{:else if STT_ENGINE === ''}
{$i18n.t('STT Model')}
From 98ba0c37b9862c1f893a4eb078a7f37588ebdcff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:25:26 +0000 Subject: [PATCH 002/117] build(deps-dev): bump vitest Bumps the npm_and_yarn group with 1 update in the / directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest). Updates `vitest` from 1.6.0 to 1.6.1 - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v1.6.1/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package-lock.json | 122 ++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 75 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 074ff21c12..3483729283 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,7 +91,7 @@ "tslib": "^2.4.1", "typescript": "^5.5.4", "vite": "^5.4.14", - "vitest": "^1.6.0" + "vitest": "^1.6.1" }, "engines": { "node": ">=18.13.0 <=22.x.x", @@ -1558,6 +1558,7 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -2210,7 +2211,8 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", @@ -3146,13 +3148,14 @@ "integrity": "sha512-g7f0IkJdPW2xhY7H4iE72DAsIyfuwEFc6JWc2tYFwKDMWWAF699vGjrM348cwQuOXgHpe1gWFe+Eiyjx/ewvvw==" }, "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", "chai": "^4.3.10" }, "funding": { @@ -3160,12 +3163,13 @@ } }, "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "1.6.0", + "@vitest/utils": "1.6.1", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -3178,6 +3182,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -3189,10 +3194,11 @@ } }, "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -3201,10 +3207,11 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", "dev": true, + "license": "MIT", "dependencies": { "magic-string": "^0.30.5", "pathe": "^1.1.1", @@ -3215,10 +3222,11 @@ } }, "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", "dev": true, + "license": "MIT", "dependencies": { "tinyspy": "^2.2.0" }, @@ -3227,10 +3235,11 @@ } }, "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", "dev": true, + "license": "MIT", "dependencies": { "diff-sequences": "^29.6.3", "estree-walker": "^3.0.3", @@ -3246,6 +3255,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -3496,6 +3506,7 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -3895,6 +3906,7 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3972,10 +3984,11 @@ "dev": true }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -3983,7 +3996,7 @@ "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" }, "engines": { "node": ">=4" @@ -4019,6 +4032,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.2" }, @@ -5135,10 +5149,11 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -5257,6 +5272,7 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -6238,6 +6254,7 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -7464,6 +7481,7 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -8686,6 +8704,7 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -9064,6 +9083,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -9078,6 +9098,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9504,7 +9525,8 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/read-cache": { "version": "1.0.0", @@ -11247,6 +11269,7 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -11406,10 +11429,11 @@ "integrity": "sha512-fLIydlJy7IG9XL4wjRwEcKhxx/ekLXiWiMvcGo01cOMF+TN+5ZqajM1mRNRz2bNNi1bzou2yofhjZEQi7kgl9A==" }, "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -11749,10 +11773,11 @@ } }, "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", + "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", @@ -12166,16 +12191,17 @@ } }, "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", + "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -12189,7 +12215,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.6.0", + "vite-node": "1.6.1", "why-is-node-running": "^2.2.2" }, "bin": { @@ -12204,8 +12230,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index d2c4795c64..bfad6ef6ea 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "tslib": "^2.4.1", "typescript": "^5.5.4", "vite": "^5.4.14", - "vitest": "^1.6.0" + "vitest": "^1.6.1" }, "type": "module", "dependencies": { From 68703951e8abbdbed469953ad9beaa22806b5da2 Mon Sep 17 00:00:00 2001 From: "M.Abdulrahman Alnaseer" <20760062+abdalrohman@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:14:40 +0300 Subject: [PATCH 003/117] feat(ui): implement domain filter list for web search settings --- backend/open_webui/routers/retrieval.py | 6 +++++ .../admin/Settings/WebSearch.svelte | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 35cea62376..434f392c32 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -392,6 +392,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "exa_api_key": request.app.state.config.EXA_API_KEY, "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, + "domain_filter_list": request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, }, }, } @@ -441,6 +442,7 @@ class WebSearchConfig(BaseModel): exa_api_key: Optional[str] = None result_count: Optional[int] = None concurrent_requests: Optional[int] = None + domain_filter_list: Optional[List[str]] = [] class WebConfig(BaseModel): @@ -553,6 +555,9 @@ async def update_rag_config( request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = ( form_data.web.search.concurrent_requests ) + request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = ( + form_data.web.search.domain_filter_list + ) return { "status": True, @@ -599,6 +604,7 @@ async def update_rag_config( "exa_api_key": request.app.state.config.EXA_API_KEY, "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, + "domain_filter_list": request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, }, }, } diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index b2accbf1d7..927086d5d4 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -34,6 +34,14 @@ let youtubeProxyUrl = ''; const submitHandler = async () => { + // Convert domain filter string to array before sending + if (webConfig?.search?.domain_filter_list) { + webConfig.search.domain_filter_list = webConfig.search.domain_filter_list + .split(',') + .map(domain => domain.trim()) + .filter(domain => domain.length > 0); + } + const res = await updateRAGConfig(localStorage.token, { web: webConfig, youtube: { @@ -49,6 +57,10 @@ if (res) { webConfig = res.web; + // Convert array back to comma-separated string for display + if (webConfig?.search?.domain_filter_list) { + webConfig.search.domain_filter_list = webConfig.search.domain_filter_list.join(', '); + } youtubeLanguage = res.youtube.language.join(','); youtubeTranslation = res.youtube.translation; @@ -334,6 +346,18 @@ />
+ +
+
+ {$i18n.t('Domain Filter List')} +
+ + +
{/if} From 34b62e71cc1b0c3d98e7bc2b9d1091e2fbf1f0d2 Mon Sep 17 00:00:00 2001 From: "D. MacAlpine" Date: Wed, 5 Feb 2025 21:31:55 -0500 Subject: [PATCH 004/117] fix: check for email claim before skipping userinfo endpoint --- backend/open_webui/utils/oauth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 7c0c53c2d5..83e0ca1d6d 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -193,7 +193,7 @@ class OAuthManager: log.warning(f"OAuth callback error: {e}") raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED) user_data: UserInfo = token.get("userinfo") - if not user_data: + if not user_data or "email" not in user_data: user_data: UserInfo = await client.userinfo(token=token) if not user_data: log.warning(f"OAuth callback failed, user data is missing: {token}") From c676303a55b9c78800efbd7fd70c84b4ccc356ed Mon Sep 17 00:00:00 2001 From: Rory <16675082+roryeckel@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:26:13 -0600 Subject: [PATCH 005/117] enh: automatically remove incorrect backticks before code_interpreter tags --- backend/open_webui/utils/middleware.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 06763483cb..402b699c16 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1188,6 +1188,23 @@ async def process_chat_response( output = block.get("output", None) lang = attributes.get("lang", "") + # Separate content from ending whitespace but preserve it + original_whitespace = '' + content_stripped = content.rstrip() + if len(content) > len(content_stripped): + original_whitespace = content[len(content_stripped):] + + # Count the number of backticks to identify if we are in an opening code block + backtick_segments = content_stripped.split('```') + # Odd number of ``` segments -> the last backticks are closing a block + # Even number -> the last backticks are opening a new block + if len(backtick_segments) > 1 and len(backtick_segments) % 2 == 0: + # The trailing backticks are opening a new block, they need to be removed or it will break the code interpreter markdown + content = content_stripped.rstrip('`').rstrip() + original_whitespace + else: + # The trailing backticks are closing a block (or there are no backticks), so it won't cause issues + content = content_stripped + original_whitespace + if output: output = html.escape(json.dumps(output)) From 74b971b88861b26c9be76cd11c068de4336187b0 Mon Sep 17 00:00:00 2001 From: Rory <16675082+roryeckel@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:38:35 -0600 Subject: [PATCH 006/117] refac: clean up solution for correcting code_interpreter backticks --- backend/open_webui/utils/middleware.py | 27 +++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 402b699c16..331b850ff3 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1122,6 +1122,16 @@ async def process_chat_response( }, ) + def split_content_and_whitespace(content): + content_stripped = content.rstrip() + original_whitespace = content[len(content_stripped):] if len(content) > len(content_stripped) else '' + return content_stripped, original_whitespace + + def is_opening_code_block(content): + backtick_segments = content.split('```') + # Even number of segments means the last backticks are opening a new block + return len(backtick_segments) > 1 and len(backtick_segments) % 2 == 0 + # Handle as a background task async def post_response_handler(response, events): def serialize_content_blocks(content_blocks, raw=False): @@ -1188,21 +1198,12 @@ async def process_chat_response( output = block.get("output", None) lang = attributes.get("lang", "") - # Separate content from ending whitespace but preserve it - original_whitespace = '' - content_stripped = content.rstrip() - if len(content) > len(content_stripped): - original_whitespace = content[len(content_stripped):] - - # Count the number of backticks to identify if we are in an opening code block - backtick_segments = content_stripped.split('```') - # Odd number of ``` segments -> the last backticks are closing a block - # Even number -> the last backticks are opening a new block - if len(backtick_segments) > 1 and len(backtick_segments) % 2 == 0: - # The trailing backticks are opening a new block, they need to be removed or it will break the code interpreter markdown + content_stripped, original_whitespace = split_content_and_whitespace(content) + if is_opening_code_block(content_stripped): + # Remove trailing backticks that would open a new block content = content_stripped.rstrip('`').rstrip() + original_whitespace else: - # The trailing backticks are closing a block (or there are no backticks), so it won't cause issues + # Keep content as is - either closing backticks or no backticks content = content_stripped + original_whitespace if output: From fd6b0398591aa59b31879bef1f701ec18cb93fd8 Mon Sep 17 00:00:00 2001 From: Vineeth B V <37930821+vinsdragonis@users.noreply.github.com> Date: Thu, 6 Feb 2025 12:04:14 +0530 Subject: [PATCH 007/117] Added a query method for OpenSearch vector db. - This PR aims to address the error 400: "**'OpenSearchClient' object has no attribute 'query'**". - With the implemented query() method, this issue should be resolved and allow uploaded documents to be vectorized and retrieved based on the given query. --- .../retrieval/vector/dbs/opensearch.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/backend/open_webui/retrieval/vector/dbs/opensearch.py b/backend/open_webui/retrieval/vector/dbs/opensearch.py index b3d8b5eb8a..c4732e1bc0 100644 --- a/backend/open_webui/retrieval/vector/dbs/opensearch.py +++ b/backend/open_webui/retrieval/vector/dbs/opensearch.py @@ -113,6 +113,40 @@ class OpenSearchClient: return self._result_to_search_result(result) + def query( + self, index_name: str, filter: dict, limit: Optional[int] = None + ) -> Optional[GetResult]: + if not self.has_collection(index_name): + return None + + query_body = { + "query": { + "bool": { + "filter": [] + } + }, + "_source": ["text", "metadata"], + } + + for field, value in filter.items(): + query_body["query"]["bool"]["filter"].append({ + "term": {field: value} + }) + + size = limit if limit else 10 + + try: + result = self.client.search( + index=f"{self.index_prefix}_{index_name}", + body=query_body, + size=size + ) + + return self._result_to_get_result(result) + + except Exception as e: + return None + def get_or_create_index(self, index_name: str, dimension: int): if not self.has_index(index_name): self._create_index(index_name, dimension) From 80e123f58f1c8c807aad29489e394be38a73f393 Mon Sep 17 00:00:00 2001 From: hurxxxx Date: Thu, 6 Feb 2025 16:41:24 +0900 Subject: [PATCH 008/117] fix : O3 also does not support the max_tokens parameter, so title generation is not possible when using the O3 model --- backend/open_webui/routers/openai.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index d18f2a8ffc..96ed50ceb3 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -75,9 +75,9 @@ async def cleanup_response( await session.close() -def openai_o1_handler(payload): +def openai_o1_o3_handler(payload): """ - Handle O1 specific parameters + Handle o1, o3 specific parameters """ if "max_tokens" in payload: # Remove "max_tokens" from the payload @@ -621,10 +621,10 @@ async def generate_chat_completion( url = request.app.state.config.OPENAI_API_BASE_URLS[idx] key = request.app.state.config.OPENAI_API_KEYS[idx] - # Fix: O1 does not support the "max_tokens" parameter, Modify "max_tokens" to "max_completion_tokens" - is_o1 = payload["model"].lower().startswith("o1-") - if is_o1: - payload = openai_o1_handler(payload) + # Fix: o1,o3 does not support the "max_tokens" parameter, Modify "max_tokens" to "max_completion_tokens" + is_o1_o3 = payload["model"].lower().startswith(("o1-", "o3-")) + if is_o1_o3: + payload = openai_o1_o3_handler(payload) elif "api.openai.com" not in url: # Remove "max_completion_tokens" from the payload for backward compatibility if "max_completion_tokens" in payload: From b9480c0e8a16aee5ec0919aa973db75389ae5b54 Mon Sep 17 00:00:00 2001 From: hurxxxx Date: Thu, 6 Feb 2025 16:53:04 +0900 Subject: [PATCH 009/117] fix : o1 should also be applied --- backend/open_webui/routers/openai.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index 96ed50ceb3..afda362373 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -622,7 +622,7 @@ async def generate_chat_completion( key = request.app.state.config.OPENAI_API_KEYS[idx] # Fix: o1,o3 does not support the "max_tokens" parameter, Modify "max_tokens" to "max_completion_tokens" - is_o1_o3 = payload["model"].lower().startswith(("o1-", "o3-")) + is_o1_o3 = payload["model"].lower().startswith(("o1", "o3-")) if is_o1_o3: payload = openai_o1_o3_handler(payload) elif "api.openai.com" not in url: From 7c78facfd9ae16c69df93dcf7e8ce3e2ea5744be Mon Sep 17 00:00:00 2001 From: Vineeth B V <37930821+vinsdragonis@users.noreply.github.com> Date: Thu, 6 Feb 2025 13:36:11 +0530 Subject: [PATCH 010/117] Update opensearch.py --- backend/open_webui/retrieval/vector/dbs/opensearch.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/retrieval/vector/dbs/opensearch.py b/backend/open_webui/retrieval/vector/dbs/opensearch.py index c4732e1bc0..41d6343912 100644 --- a/backend/open_webui/retrieval/vector/dbs/opensearch.py +++ b/backend/open_webui/retrieval/vector/dbs/opensearch.py @@ -114,9 +114,9 @@ class OpenSearchClient: return self._result_to_search_result(result) def query( - self, index_name: str, filter: dict, limit: Optional[int] = None + self, collection_name: str, filter: dict, limit: Optional[int] = None ) -> Optional[GetResult]: - if not self.has_collection(index_name): + if not self.has_collection(collection_name): return None query_body = { @@ -137,7 +137,7 @@ class OpenSearchClient: try: result = self.client.search( - index=f"{self.index_prefix}_{index_name}", + index=f"{self.index_prefix}_{collection_name}", body=query_body, size=size ) From a023667e1ee2e8ff00cc6aaa46f5106252937241 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 6 Feb 2025 00:37:10 -0800 Subject: [PATCH 011/117] fix: user params save issue --- src/lib/components/chat/Settings/General.svelte | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/components/chat/Settings/General.svelte b/src/lib/components/chat/Settings/General.svelte index ce8ed80e22..cb7843c694 100644 --- a/src/lib/components/chat/Settings/General.svelte +++ b/src/lib/components/chat/Settings/General.svelte @@ -49,6 +49,7 @@ function_calling: null, seed: null, temperature: null, + reasoning_effort: null, frequency_penalty: null, repeat_last_n: null, mirostat: null, @@ -333,9 +334,13 @@ system: system !== '' ? system : undefined, params: { stream_response: params.stream_response !== null ? params.stream_response : undefined, + function_calling: + params.function_calling !== null ? params.function_calling : undefined, seed: (params.seed !== null ? params.seed : undefined) ?? undefined, stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined, temperature: params.temperature !== null ? params.temperature : undefined, + reasoning_effort: + params.reasoning_effort !== null ? params.reasoning_effort : undefined, frequency_penalty: params.frequency_penalty !== null ? params.frequency_penalty : undefined, repeat_last_n: params.repeat_last_n !== null ? params.repeat_last_n : undefined, From feffdf197f91e1c03a60d88288a538edb1829fc6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 6 Feb 2025 00:38:06 -0800 Subject: [PATCH 012/117] doc: readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fb03537df..56ab09b05d 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,7 @@ docker run --rm --volume /var/run/docker.sock:/var/run/docker.sock containrrr/wa In the last part of the command, replace `open-webui` with your container name if it is different. -Check our Migration Guide available in our [Open WebUI Documentation](https://docs.openwebui.com/tutorials/migration/). +Check our Updating Guide available in our [Open WebUI Documentation](https://docs.openwebui.com/getting-started/updating). ### Using the Dev Branch 🌙 From a1e26016bb288464e6d2518dee71570963f4a270 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 6 Feb 2025 00:52:22 -0800 Subject: [PATCH 013/117] fix: new connections config --- src/lib/components/admin/Settings/Connections.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/components/admin/Settings/Connections.svelte b/src/lib/components/admin/Settings/Connections.svelte index 35e6e0293a..c7145464cf 100644 --- a/src/lib/components/admin/Settings/Connections.svelte +++ b/src/lib/components/admin/Settings/Connections.svelte @@ -101,14 +101,17 @@ const addOpenAIConnectionHandler = async (connection) => { OPENAI_API_BASE_URLS = [...OPENAI_API_BASE_URLS, connection.url]; OPENAI_API_KEYS = [...OPENAI_API_KEYS, connection.key]; - OPENAI_API_CONFIGS[OPENAI_API_BASE_URLS.length] = connection.config; + OPENAI_API_CONFIGS[OPENAI_API_BASE_URLS.length - 1] = connection.config; await updateOpenAIHandler(); }; const addOllamaConnectionHandler = async (connection) => { OLLAMA_BASE_URLS = [...OLLAMA_BASE_URLS, connection.url]; - OLLAMA_API_CONFIGS[OLLAMA_BASE_URLS.length] = connection.config; + OLLAMA_API_CONFIGS[OLLAMA_BASE_URLS.length - 1] = { + ...connection.config, + key: connection.key + }; await updateOllamaHandler(); }; From 159578dfd41a5fc68ac6c7cfdcf0db837600fe35 Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Thu, 6 Feb 2025 17:59:59 +0900 Subject: [PATCH 014/117] Enable usage of the DB to store generated images --- backend/open_webui/routers/images.py | 63 ++++++++++------------------ 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index 7afd9d106d..68465e191c 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -7,26 +7,21 @@ import re import uuid from pathlib import Path from typing import Optional +import io import requests - - -from fastapi import Depends, FastAPI, HTTPException, Request, APIRouter -from fastapi.middleware.cors import CORSMiddleware -from pydantic import BaseModel - - +from fastapi import APIRouter, Depends, UploadFile, HTTPException, Request from open_webui.config import CACHE_DIR from open_webui.constants import ERROR_MESSAGES -from open_webui.env import ENV, SRC_LOG_LEVELS, ENABLE_FORWARD_USER_INFO_HEADERS - +from open_webui.env import ENABLE_FORWARD_USER_INFO_HEADERS, SRC_LOG_LEVELS +from open_webui.routers.files import upload_file from open_webui.utils.auth import get_admin_user, get_verified_user from open_webui.utils.images.comfyui import ( ComfyUIGenerateImageForm, ComfyUIWorkflow, comfyui_generate_image, ) - +from pydantic import BaseModel log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["IMAGES"]) @@ -39,7 +34,7 @@ router = APIRouter() @router.get("/config") -async def get_config(request: Request, user=Depends(get_admin_user)): +async def get_def(request: Request, user=Depends(get_admin_user)): return { "enabled": request.app.state.config.ENABLE_IMAGE_GENERATION, "engine": request.app.state.config.IMAGE_GENERATION_ENGINE, @@ -271,7 +266,6 @@ async def get_image_config(request: Request, user=Depends(get_admin_user)): async def update_image_config( request: Request, form_data: ImageConfigForm, user=Depends(get_admin_user) ): - set_image_model(request, form_data.MODEL) pattern = r"^\d+x\d+$" @@ -383,35 +377,18 @@ class GenerateImageForm(BaseModel): negative_prompt: Optional[str] = None -def save_b64_image(b64_str): +def load_b64_image_data(b64_str): try: - image_id = str(uuid.uuid4()) - if "," in b64_str: header, encoded = b64_str.split(",", 1) mime_type = header.split(";")[0] - img_data = base64.b64decode(encoded) - image_format = mimetypes.guess_extension(mime_type) - - image_filename = f"{image_id}{image_format}" - file_path = IMAGE_CACHE_DIR / f"{image_filename}" - with open(file_path, "wb") as f: - f.write(img_data) - return image_filename else: - image_filename = f"{image_id}.png" - file_path = IMAGE_CACHE_DIR.joinpath(image_filename) - + mime_type = "image/png" img_data = base64.b64decode(b64_str) - - # Write the image data to a file - with open(file_path, "wb") as f: - f.write(img_data) - return image_filename - + return img_data, mime_type except Exception as e: - log.exception(f"Error saving image: {e}") + log.exception(f"Error loading image data: {e}") return None @@ -500,13 +477,17 @@ async def image_generations( images = [] for image in res["data"]: - image_filename = save_b64_image(image["b64_json"]) - images.append({"url": f"/cache/image/generations/{image_filename}"}) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}.json") - - with open(file_body_path, "w") as f: - json.dump(data, f) - + image_data, content_type = load_b64_image_data(image["b64_json"]) + file = UploadFile( + file=io.BytesIO(image_data), + filename="image", # will be converted to a unique ID on upload_file + headers={ + "content-type": content_type, + }, + ) + file_item = upload_file(request, file, user) + url = request.app.url_path_for("get_file_content_by_id", id=file_item.id) + images.append({"url": url}) return images elif request.app.state.config.IMAGE_GENERATION_ENGINE == "comfyui": @@ -618,4 +599,4 @@ async def image_generations( data = r.json() if "error" in data: error = data["error"]["message"] - raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(error)) + raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(error)) \ No newline at end of file From 8ca21ea83830107e5842a91487276aa414fddcab Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 6 Feb 2025 01:07:01 -0800 Subject: [PATCH 015/117] refac: styling --- src/routes/(app)/admin/+layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(app)/admin/+layout.svelte b/src/routes/(app)/admin/+layout.svelte index 2d10ae64b7..bc3caa338b 100644 --- a/src/routes/(app)/admin/+layout.svelte +++ b/src/routes/(app)/admin/+layout.svelte @@ -26,7 +26,7 @@ {#if loaded}
From 8d43fdadc17c6db83df4f474a505fae1f509e6ea Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Thu, 6 Feb 2025 18:24:57 +0900 Subject: [PATCH 016/117] Add functionality in other image generation types --- backend/open_webui/routers/images.py | 64 +++++++++++++++++----------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index 68465e191c..a26c06c611 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -1,5 +1,6 @@ import asyncio import base64 +import io import json import logging import mimetypes @@ -7,10 +8,9 @@ import re import uuid from pathlib import Path from typing import Optional -import io import requests -from fastapi import APIRouter, Depends, UploadFile, HTTPException, Request +from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile from open_webui.config import CACHE_DIR from open_webui.constants import ERROR_MESSAGES from open_webui.env import ENABLE_FORWARD_USER_INFO_HEADERS, SRC_LOG_LEVELS @@ -392,8 +392,7 @@ def load_b64_image_data(b64_str): return None -def save_url_image(url, headers=None): - image_id = str(uuid.uuid4()) +def load_url_image_data(url, headers=None): try: if headers: r = requests.get(url, headers=headers) @@ -403,18 +402,7 @@ def save_url_image(url, headers=None): r.raise_for_status() if r.headers["content-type"].split("/")[0] == "image": mime_type = r.headers["content-type"] - image_format = mimetypes.guess_extension(mime_type) - - if not image_format: - raise ValueError("Could not determine image type from MIME type") - - image_filename = f"{image_id}{image_format}" - - file_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}") - with open(file_path, "wb") as image_file: - for chunk in r.iter_content(chunk_size=8192): - image_file.write(chunk) - return image_filename + return r.content, mime_type else: log.error("Url does not point to an image.") return None @@ -486,8 +474,14 @@ async def image_generations( }, ) file_item = upload_file(request, file, user) - url = request.app.url_path_for("get_file_content_by_id", id=file_item.id) + url = request.app.url_path_for( + "get_file_content_by_id", id=file_item.id + ) images.append({"url": url}) + file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") + + with open(file_body_path, "w") as f: + json.dump(data, f) return images elif request.app.state.config.IMAGE_GENERATION_ENGINE == "comfyui": @@ -533,9 +527,20 @@ async def image_generations( "Authorization": f"Bearer {request.app.state.config.COMFYUI_API_KEY}" } - image_filename = save_url_image(image["url"], headers) - images.append({"url": f"/cache/image/generations/{image_filename}"}) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}.json") + image_data, content_type = load_url_image_data(image["url"], headers) + file = UploadFile( + file=io.BytesIO(image_data), + filename="image", # will be converted to a unique ID on upload_file + headers={ + "content-type": content_type, + }, + ) + file_item = upload_file(request, file, user) + url = request.app.url_path_for( + "get_file_content_by_id", id=file_item.id + ) + images.append({"url": url}) + file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") with open(file_body_path, "w") as f: json.dump(form_data.model_dump(exclude_none=True), f) @@ -585,9 +590,20 @@ async def image_generations( images = [] for image in res["images"]: - image_filename = save_b64_image(image) - images.append({"url": f"/cache/image/generations/{image_filename}"}) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{image_filename}.json") + image_data, content_type = load_b64_image_data(image) + file = UploadFile( + file=io.BytesIO(image_data), + filename="image", # will be converted to a unique ID on upload_file + headers={ + "content-type": content_type, + }, + ) + file_item = upload_file(request, file, user) + url = request.app.url_path_for( + "get_file_content_by_id", id=file_item.id + ) + images.append({"url": url}) + file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") with open(file_body_path, "w") as f: json.dump({**data, "info": res["info"]}, f) @@ -599,4 +615,4 @@ async def image_generations( data = r.json() if "error" in data: error = data["error"]["message"] - raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(error)) \ No newline at end of file + raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(error)) From 14398ab62847c1840a9413efa0a34cf12df89dad Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 6 Feb 2025 01:28:33 -0800 Subject: [PATCH 017/117] refac: styling --- .../components/chat/Messages/Citations.svelte | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index b434b15db1..232d8abb1c 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -97,7 +97,7 @@ {#if citations.length > 0}
{#if citations.length <= 3} -
+
{#each citations as citation, idx}
{:else} - +
-
- -
+
+ +
{#each citations.slice(0, 2) as citation, idx} {/each}
-
+
{citations.length - 2} {$i18n.t('more')} @@ -167,7 +175,7 @@
-
+
{#each citations as citation, idx} From 88db4ca7babc232f9bbb2962bb078178deb038b6 Mon Sep 17 00:00:00 2001 From: binxn <78713335+binxn@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:30:27 +0100 Subject: [PATCH 018/117] Update jina_search.py Updated Jina's search function in order to use POST and make use of the result count passed by the user Note: Jina supports a max of 10 result count --- .../open_webui/retrieval/web/jina_search.py | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/retrieval/web/jina_search.py b/backend/open_webui/retrieval/web/jina_search.py index 3de6c18077..02af42ea64 100644 --- a/backend/open_webui/retrieval/web/jina_search.py +++ b/backend/open_webui/retrieval/web/jina_search.py @@ -20,14 +20,26 @@ def search_jina(api_key: str, query: str, count: int) -> list[SearchResult]: list[SearchResult]: A list of search results """ jina_search_endpoint = "https://s.jina.ai/" - headers = {"Accept": "application/json", "Authorization": f"Bearer {api_key}"} - url = str(URL(jina_search_endpoint + query)) - response = requests.get(url, headers=headers) + + headers = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": api_key, + "X-Retain-Images": "none" + } + + payload = { + "q": query, + "count": count if count <= 10 else 10 + } + + url = str(URL(jina_search_endpoint)) + response = requests.post(url, headers=headers, json=payload) response.raise_for_status() data = response.json() results = [] - for result in data["data"][:count]: + for result in data["data"]: results.append( SearchResult( link=result["url"], From 8215aa36d00be0d003267a3e2f6d24a046dfc5f5 Mon Sep 17 00:00:00 2001 From: Girish Ramakrishnan Date: Thu, 6 Feb 2025 17:57:00 +0100 Subject: [PATCH 019/117] oidc: pick up username correctly --- backend/open_webui/utils/oauth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 83e0ca1d6d..b98e6e585b 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -281,7 +281,7 @@ class OAuthManager: username_claim = auth_manager_config.OAUTH_USERNAME_CLAIM name = user_data.get(username_claim) - if not isinstance(user, str): + if not isinstance(name, str): name = email role = self.get_user_role(None, user_data) From ac3338265d224bbff2ed80310a7bd1bd4d763bed Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Fri, 7 Feb 2025 07:30:58 +0900 Subject: [PATCH 020/117] Set get_config as the name of the function --- backend/open_webui/routers/images.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index a26c06c611..a437149560 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -34,7 +34,7 @@ router = APIRouter() @router.get("/config") -async def get_def(request: Request, user=Depends(get_admin_user)): +async def get_config(request: Request, user=Depends(get_admin_user)): return { "enabled": request.app.state.config.ENABLE_IMAGE_GENERATION, "engine": request.app.state.config.IMAGE_GENERATION_ENGINE, @@ -456,7 +456,7 @@ async def image_generations( requests.post, url=f"{request.app.state.config.IMAGES_OPENAI_API_BASE_URL}/images/generations", json=data, - headers=headers, + headers=headers, ) r.raise_for_status() From 7e97e9dcc925dbe969190a510cf1b34bf9fdd1d7 Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Fri, 7 Feb 2025 07:37:18 +0900 Subject: [PATCH 021/117] Improve style --- backend/open_webui/routers/images.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index a437149560..df69485c2e 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -3,9 +3,7 @@ import base64 import io import json import logging -import mimetypes import re -import uuid from pathlib import Path from typing import Optional @@ -456,7 +454,7 @@ async def image_generations( requests.post, url=f"{request.app.state.config.IMAGES_OPENAI_API_BASE_URL}/images/generations", json=data, - headers=headers, + headers=headers, ) r.raise_for_status() From 89669a21fc4859e1a5dfb30778a7e3ce3791d0aa Mon Sep 17 00:00:00 2001 From: Xingjian Xie Date: Thu, 6 Feb 2025 23:01:43 +0000 Subject: [PATCH 022/117] Refactor common code between inlet and outlet --- backend/open_webui/utils/chat.py | 141 ++++++------------------- backend/open_webui/utils/filter.py | 100 ++++++++++++++++++ backend/open_webui/utils/middleware.py | 105 ++---------------- 3 files changed, 143 insertions(+), 203 deletions(-) create mode 100644 backend/open_webui/utils/filter.py diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index 0719f6af5b..ebd5bb5e34 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -44,6 +44,10 @@ from open_webui.utils.response import ( convert_response_ollama_to_openai, convert_streaming_response_ollama_to_openai, ) +from open_webui.utils.filter import ( + get_sorted_filter_ids, + process_filter_functions, +) from open_webui.env import SRC_LOG_LEVELS, GLOBAL_LOG_LEVEL, BYPASS_MODEL_ACCESS_CONTROL @@ -177,116 +181,37 @@ async def chat_completed(request: Request, form_data: dict, user: Any): except Exception as e: return Exception(f"Error: {e}") - __event_emitter__ = get_event_emitter( - { - "chat_id": data["chat_id"], - "message_id": data["id"], - "session_id": data["session_id"], - "user_id": user.id, - } - ) + metadata = { + "chat_id": data["chat_id"], + "message_id": data["id"], + "session_id": data["session_id"], + "user_id": user.id, + } - __event_call__ = get_event_call( - { - "chat_id": data["chat_id"], - "message_id": data["id"], - "session_id": data["session_id"], - "user_id": user.id, - } - ) + extra_params = { + "__event_emitter__": get_event_emitter(metadata), + "__event_call__": get_event_call(metadata), + "__user__": { + "id": user.id, + "email": user.email, + "name": user.name, + "role": user.role, + }, + "__metadata__": metadata, + "__request__": request, + } - def get_priority(function_id): - function = Functions.get_function_by_id(function_id) - if function is not None and hasattr(function, "valves"): - # TODO: Fix FunctionModel to include vavles - return (function.valves if function.valves else {}).get("priority", 0) - return 0 - - filter_ids = [function.id for function in Functions.get_global_filter_functions()] - if "info" in model and "meta" in model["info"]: - filter_ids.extend(model["info"]["meta"].get("filterIds", [])) - filter_ids = list(set(filter_ids)) - - enabled_filter_ids = [ - function.id - for function in Functions.get_functions_by_type("filter", active_only=True) - ] - filter_ids = [ - filter_id for filter_id in filter_ids if filter_id in enabled_filter_ids - ] - - # Sort filter_ids by priority, using the get_priority function - filter_ids.sort(key=get_priority) - - for filter_id in filter_ids: - filter = Functions.get_function_by_id(filter_id) - if not filter: - continue - - if filter_id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[filter_id] - else: - function_module, _, _ = load_function_module_by_id(filter_id) - request.app.state.FUNCTIONS[filter_id] = function_module - - if hasattr(function_module, "valves") and hasattr(function_module, "Valves"): - valves = Functions.get_function_valves_by_id(filter_id) - function_module.valves = function_module.Valves( - **(valves if valves else {}) - ) - - if not hasattr(function_module, "outlet"): - continue - try: - outlet = function_module.outlet - - # Get the signature of the function - sig = inspect.signature(outlet) - params = {"body": data} - - # Extra parameters to be passed to the function - extra_params = { - "__model__": model, - "__id__": filter_id, - "__event_emitter__": __event_emitter__, - "__event_call__": __event_call__, - "__request__": request, - } - - # Add extra params in contained in function signature - for key, value in extra_params.items(): - if key in sig.parameters: - params[key] = value - - if "__user__" in sig.parameters: - __user__ = { - "id": user.id, - "email": user.email, - "name": user.name, - "role": user.role, - } - - try: - if hasattr(function_module, "UserValves"): - __user__["valves"] = function_module.UserValves( - **Functions.get_user_valves_by_id_and_user_id( - filter_id, user.id - ) - ) - except Exception as e: - print(e) - - params = {**params, "__user__": __user__} - - if inspect.iscoroutinefunction(outlet): - data = await outlet(**params) - else: - data = outlet(**params) - - except Exception as e: - return Exception(f"Error: {e}") - - return data + try: + result, _ = await process_filter_functions( + handler_type="outlet", + filter_ids=get_sorted_filter_ids(model), + request=request, + data=data, + extra_params=extra_params, + ) + return result + except Exception as e: + return Exception(f"Error: {e}") async def chat_action(request: Request, action_id: str, form_data: dict, user: Any): diff --git a/backend/open_webui/utils/filter.py b/backend/open_webui/utils/filter.py new file mode 100644 index 0000000000..2ad0c025e6 --- /dev/null +++ b/backend/open_webui/utils/filter.py @@ -0,0 +1,100 @@ +import inspect +from open_webui.utils.plugin import load_function_module_by_id +from open_webui.models.functions import Functions + +def get_sorted_filter_ids(model): + def get_priority(function_id): + function = Functions.get_function_by_id(function_id) + if function is not None and hasattr(function, "valves"): + # TODO: Fix FunctionModel to include vavles + return (function.valves if function.valves else {}).get("priority", 0) + return 0 + + filter_ids = [function.id for function in Functions.get_global_filter_functions()] + if "info" in model and "meta" in model["info"]: + filter_ids.extend(model["info"]["meta"].get("filterIds", [])) + filter_ids = list(set(filter_ids)) + + enabled_filter_ids = [ + function.id + for function in Functions.get_functions_by_type("filter", active_only=True) + ] + + filter_ids = [fid for fid in filter_ids if fid in enabled_filter_ids] + filter_ids.sort(key=get_priority) + return filter_ids + +async def process_filter_functions( + handler_type, + filter_ids, + request, + data, + extra_params +): + skip_files = None + + for filter_id in filter_ids: + filter = Functions.get_function_by_id(filter_id) + if not filter: + continue + + if filter_id in request.app.state.FUNCTIONS: + function_module = request.app.state.FUNCTIONS[filter_id] + else: + function_module, _, _ = load_function_module_by_id(filter_id) + request.app.state.FUNCTIONS[filter_id] = function_module + + # Check if the function has a file_handler variable + if handler_type == "inlet" and hasattr(function_module, "file_handler"): + skip_files = function_module.file_handler + + # Apply valves to the function + if hasattr(function_module, "valves") and hasattr(function_module, "Valves"): + valves = Functions.get_function_valves_by_id(filter_id) + function_module.valves = function_module.Valves( + **(valves if valves else {}) + ) + + # Prepare handler function + handler = getattr(function_module, handler_type, None) + if not handler: + continue + + try: + # Prepare parameters + sig = inspect.signature(handler) + params = {"body": data} + + # Add extra parameters that exist in the handler's signature + for key in list(extra_params.keys()): + if key in sig.parameters: + params[key] = extra_params[key] + + # Handle user parameters + if "__user__" in sig.parameters: + if hasattr(function_module, "UserValves"): + try: + params["__user__"]["valves"] = function_module.UserValves( + **Functions.get_user_valves_by_id_and_user_id( + filter_id, params["__user__"]["id"] + ) + ) + except Exception as e: + print(e) + + + # Execute handler + if inspect.iscoroutinefunction(handler): + data = await handler(**params) + else: + data = handler(**params) + + except Exception as e: + print(f"Error in {handler_type} handler {filter_id}: {e}") + raise e + + # Handle file cleanup for inlet + if skip_files and "files" in data.get("metadata", {}): + del data["metadata"]["files"] + + return data, {} \ No newline at end of file diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 331b850ff3..c69d0c909d 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -68,6 +68,10 @@ from open_webui.utils.misc import ( ) from open_webui.utils.tools import get_tools from open_webui.utils.plugin import load_function_module_by_id +from open_webui.utils.filter import ( + get_sorted_filter_ids, + process_filter_functions, +) from open_webui.tasks import create_task @@ -91,99 +95,6 @@ log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["MAIN"]) -async def chat_completion_filter_functions_handler(request, body, model, extra_params): - skip_files = None - - def get_filter_function_ids(model): - def get_priority(function_id): - function = Functions.get_function_by_id(function_id) - if function is not None and hasattr(function, "valves"): - # TODO: Fix FunctionModel - return (function.valves if function.valves else {}).get("priority", 0) - return 0 - - filter_ids = [ - function.id for function in Functions.get_global_filter_functions() - ] - if "info" in model and "meta" in model["info"]: - filter_ids.extend(model["info"]["meta"].get("filterIds", [])) - filter_ids = list(set(filter_ids)) - - enabled_filter_ids = [ - function.id - for function in Functions.get_functions_by_type("filter", active_only=True) - ] - - filter_ids = [ - filter_id for filter_id in filter_ids if filter_id in enabled_filter_ids - ] - - filter_ids.sort(key=get_priority) - return filter_ids - - filter_ids = get_filter_function_ids(model) - for filter_id in filter_ids: - filter = Functions.get_function_by_id(filter_id) - if not filter: - continue - - if filter_id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[filter_id] - else: - function_module, _, _ = load_function_module_by_id(filter_id) - request.app.state.FUNCTIONS[filter_id] = function_module - - # Check if the function has a file_handler variable - if hasattr(function_module, "file_handler"): - skip_files = function_module.file_handler - - # Apply valves to the function - if hasattr(function_module, "valves") and hasattr(function_module, "Valves"): - valves = Functions.get_function_valves_by_id(filter_id) - function_module.valves = function_module.Valves( - **(valves if valves else {}) - ) - - if hasattr(function_module, "inlet"): - try: - inlet = function_module.inlet - - # Create a dictionary of parameters to be passed to the function - params = {"body": body} | { - k: v - for k, v in { - **extra_params, - "__model__": model, - "__id__": filter_id, - }.items() - if k in inspect.signature(inlet).parameters - } - - if "__user__" in params and hasattr(function_module, "UserValves"): - try: - params["__user__"]["valves"] = function_module.UserValves( - **Functions.get_user_valves_by_id_and_user_id( - filter_id, params["__user__"]["id"] - ) - ) - except Exception as e: - print(e) - - if inspect.iscoroutinefunction(inlet): - body = await inlet(**params) - else: - body = inlet(**params) - - except Exception as e: - print(f"Error: {e}") - raise e - - if skip_files and "files" in body.get("metadata", {}): - del body["metadata"]["files"] - - return body, {} - - async def chat_completion_tools_handler( request: Request, body: dict, user: UserModel, models, tools ) -> tuple[dict, dict]: @@ -782,8 +693,12 @@ async def process_chat_payload(request, form_data, metadata, user, model): ) try: - form_data, flags = await chat_completion_filter_functions_handler( - request, form_data, model, extra_params + form_data, flags = await process_filter_functions( + handler_type="inlet", + filter_ids=get_sorted_filter_ids(model), + request=request, + data=form_data, + extra_params=extra_params, ) except Exception as e: raise Exception(f"Error: {e}") From 4974c9cbb08eb9efd998c5eeb5ba75af827306b3 Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Fri, 7 Feb 2025 08:12:04 +0900 Subject: [PATCH 023/117] Refactor upload function --- backend/open_webui/routers/images.py | 77 +++++++++++----------------- 1 file changed, 31 insertions(+), 46 deletions(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index df69485c2e..2d608c1339 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -410,6 +410,24 @@ def load_url_image_data(url, headers=None): return None +def upload_image(request, data, image_data, content_type, user): + file = UploadFile( + file=io.BytesIO(image_data), + filename="image", # will be converted to a unique ID on upload_file + headers={ + "content-type": content_type, + }, + ) + file_item = upload_file(request, file, user) + file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") + + with open(file_body_path, "w") as f: + json.dump(data, f) + + url = request.app.url_path_for("get_file_content_by_id", id=file_item.id) + return url + + @router.post("/generations") async def image_generations( request: Request, @@ -464,22 +482,8 @@ async def image_generations( for image in res["data"]: image_data, content_type = load_b64_image_data(image["b64_json"]) - file = UploadFile( - file=io.BytesIO(image_data), - filename="image", # will be converted to a unique ID on upload_file - headers={ - "content-type": content_type, - }, - ) - file_item = upload_file(request, file, user) - url = request.app.url_path_for( - "get_file_content_by_id", id=file_item.id - ) + url = upload_image(request, data, image_data, content_type, user) images.append({"url": url}) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") - - with open(file_body_path, "w") as f: - json.dump(data, f) return images elif request.app.state.config.IMAGE_GENERATION_ENGINE == "comfyui": @@ -526,24 +530,14 @@ async def image_generations( } image_data, content_type = load_url_image_data(image["url"], headers) - file = UploadFile( - file=io.BytesIO(image_data), - filename="image", # will be converted to a unique ID on upload_file - headers={ - "content-type": content_type, - }, - ) - file_item = upload_file(request, file, user) - url = request.app.url_path_for( - "get_file_content_by_id", id=file_item.id + url = upload_image( + request, + form_data.model_dump(exclude_none=True), + image_data, + content_type, + user, ) images.append({"url": url}) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") - - with open(file_body_path, "w") as f: - json.dump(form_data.model_dump(exclude_none=True), f) - - log.debug(f"images: {images}") return images elif ( request.app.state.config.IMAGE_GENERATION_ENGINE == "automatic1111" @@ -589,23 +583,14 @@ async def image_generations( for image in res["images"]: image_data, content_type = load_b64_image_data(image) - file = UploadFile( - file=io.BytesIO(image_data), - filename="image", # will be converted to a unique ID on upload_file - headers={ - "content-type": content_type, - }, - ) - file_item = upload_file(request, file, user) - url = request.app.url_path_for( - "get_file_content_by_id", id=file_item.id + url = upload_image( + request, + {**data, "info": res["info"]}, + image_data, + content_type, + user, ) images.append({"url": url}) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") - - with open(file_body_path, "w") as f: - json.dump({**data, "info": res["info"]}, f) - return images except Exception as e: error = e From 312f273a1bf60f66089fbcd9f7ad225466419d30 Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Fri, 7 Feb 2025 08:22:20 +0900 Subject: [PATCH 024/117] Add extension to image filename --- backend/open_webui/routers/images.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index 2d608c1339..da4bf8a17e 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -3,6 +3,7 @@ import base64 import io import json import logging +import mimetypes import re from pathlib import Path from typing import Optional @@ -411,15 +412,16 @@ def load_url_image_data(url, headers=None): def upload_image(request, data, image_data, content_type, user): + image_format = mimetypes.guess_extension(content_type) file = UploadFile( file=io.BytesIO(image_data), - filename="image", # will be converted to a unique ID on upload_file + filename=f"generated{image_format}", # will be converted to a unique ID on upload_file headers={ "content-type": content_type, }, ) file_item = upload_file(request, file, user) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.id}.json") + file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.filename}.json") with open(file_body_path, "w") as f: json.dump(data, f) From ffb9e739753f1d096531d5084fc524e642744266 Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Fri, 7 Feb 2025 08:32:06 +0900 Subject: [PATCH 025/117] Save image metadata to DB --- backend/open_webui/routers/files.py | 36 +++++++++++++--------------- backend/open_webui/routers/images.py | 9 ++----- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 7160c2e86e..7cf7a942f4 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -3,30 +3,22 @@ import os import uuid from pathlib import Path from typing import Optional -from pydantic import BaseModel -import mimetypes from urllib.parse import quote -from open_webui.storage.provider import Storage - +from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile, status +from fastapi.responses import FileResponse, StreamingResponse +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import SRC_LOG_LEVELS from open_webui.models.files import ( FileForm, FileModel, FileModelResponse, Files, ) -from open_webui.routers.retrieval import process_file, ProcessFileForm - -from open_webui.config import UPLOAD_DIR -from open_webui.env import SRC_LOG_LEVELS -from open_webui.constants import ERROR_MESSAGES - - -from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status, Request -from fastapi.responses import FileResponse, StreamingResponse - - +from open_webui.routers.retrieval import ProcessFileForm, process_file +from open_webui.storage.provider import Storage from open_webui.utils.auth import get_admin_user, get_verified_user +from pydantic import BaseModel log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["MODELS"]) @@ -41,7 +33,10 @@ router = APIRouter() @router.post("/", response_model=FileModelResponse) def upload_file( - request: Request, file: UploadFile = File(...), user=Depends(get_verified_user) + request: Request, + file: UploadFile = File(...), + user=Depends(get_verified_user), + file_metadata: dict = {}, ): log.info(f"file.content_type: {file.content_type}") try: @@ -61,6 +56,7 @@ def upload_file( "id": id, "filename": name, "path": file_path, + "data": file_metadata, "meta": { "name": name, "content_type": file.content_type, @@ -126,7 +122,7 @@ async def delete_all_files(user=Depends(get_admin_user)): Storage.delete_all_files() except Exception as e: log.exception(e) - log.error(f"Error deleting files") + log.error("Error deleting files") raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT("Error deleting files"), @@ -248,7 +244,7 @@ async def get_file_content_by_id(id: str, user=Depends(get_verified_user)): ) except Exception as e: log.exception(e) - log.error(f"Error getting file content") + log.error("Error getting file content") raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT("Error getting file content"), @@ -279,7 +275,7 @@ async def get_html_file_content_by_id(id: str, user=Depends(get_verified_user)): ) except Exception as e: log.exception(e) - log.error(f"Error getting file content") + log.error("Error getting file content") raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT("Error getting file content"), @@ -355,7 +351,7 @@ async def delete_file_by_id(id: str, user=Depends(get_verified_user)): Storage.delete_file(file.path) except Exception as e: log.exception(e) - log.error(f"Error deleting files") + log.error("Error deleting files") raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT("Error deleting files"), diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index da4bf8a17e..1dcaca866b 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -411,7 +411,7 @@ def load_url_image_data(url, headers=None): return None -def upload_image(request, data, image_data, content_type, user): +def upload_image(request, image_metadata, image_data, content_type, user): image_format = mimetypes.guess_extension(content_type) file = UploadFile( file=io.BytesIO(image_data), @@ -420,12 +420,7 @@ def upload_image(request, data, image_data, content_type, user): "content-type": content_type, }, ) - file_item = upload_file(request, file, user) - file_body_path = IMAGE_CACHE_DIR.joinpath(f"{file_item.filename}.json") - - with open(file_body_path, "w") as f: - json.dump(data, f) - + file_item = upload_file(request, file, user, file_metadata=image_metadata) url = request.app.url_path_for("get_file_content_by_id", id=file_item.id) return url From 3a2d964d393008d53fe10a2994b61a3d4879ad0d Mon Sep 17 00:00:00 2001 From: EntropyYue Date: Fri, 7 Feb 2025 07:43:39 +0800 Subject: [PATCH 026/117] enh: optimize time display --- src/lib/components/common/Collapsible.svelte | 12 +++++++++--- src/lib/i18n/locales/en-US/translation.json | 1 + src/lib/i18n/locales/zh-CN/translation.json | 3 ++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/lib/components/common/Collapsible.svelte b/src/lib/components/common/Collapsible.svelte index 4f6b1ea958..4ee4c1b11e 100644 --- a/src/lib/components/common/Collapsible.svelte +++ b/src/lib/components/common/Collapsible.svelte @@ -74,9 +74,15 @@
{#if attributes?.type === 'reasoning'} {#if attributes?.done === 'true' && attributes?.duration} - {$i18n.t('Thought for {{DURATION}}', { - DURATION: dayjs.duration(attributes.duration, 'seconds').humanize() - })} + {#if attributes.duration < 60} + {$i18n.t('Thought for {{DURATION}} seconds', { + DURATION: attributes.duration + })} + {:else} + {$i18n.t('Thought for {{DURATION}}', { + DURATION: dayjs.duration(attributes.duration, 'seconds').humanize() + })} + {/if} {:else} {$i18n.t('Thinking...')} {/if} diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index cca4e14687..2b46c3a6e3 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -944,6 +944,7 @@ "This will reset the knowledge base and sync all files. Do you wish to continue?": "", "Thorough explanation": "", "Thought for {{DURATION}}": "", + "Thought for {{DURATION}} seconds": "", "Tika": "", "Tika Server URL required.": "", "Tiktoken": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 2e06bc61fc..a114fd0120 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -943,7 +943,8 @@ "This will delete all models including custom models and cannot be undone.": "这将删除所有模型,包括自定义模型,且无法撤销。", "This will reset the knowledge base and sync all files. Do you wish to continue?": "这将重置知识库并替换所有文件为目录下文件。确认继续?", "Thorough explanation": "解释较为详细", - "Thought for {{DURATION}}": "思考时间 {{DURATION}}", + "Thought for {{DURATION}}": "已推理 持续 {{DURATION}}", + "Thought for {{DURATION}} seconds": "已推理 持续 {{DURATION}} 秒", "Tika": "Tika", "Tika Server URL required.": "请输入 Tika 服务器地址。", "Tiktoken": "Tiktoken", From 5ef00dece96d8ccea448e32193749a26dfa328b3 Mon Sep 17 00:00:00 2001 From: Tiancong Li Date: Fri, 7 Feb 2025 19:13:51 +0800 Subject: [PATCH 027/117] i18n: update zh-TW --- src/lib/i18n/locales/zh-TW/translation.json | 38 ++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index aa505a2e73..f4503ca7c9 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -63,11 +63,11 @@ "Allowed Endpoints": "允許的端點", "Already have an account?": "已經有帳號了嗎?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "作為 top_p 的替代方案,旨在確保質量和多樣性的平衡。相對於最可能的 token 機率而言,參數 p 代表一個 token 被考慮在内的最低機率。例如,當 p=0.05 且最可能的 token 機率為 0.9 時,數值低於 0.045 的對數機率會被過濾掉。(預設值:0.0)", - "Always": "", + "Always": "總是", "Amazing": "很棒", "an assistant": "一位助手", - "Analyzed": "", - "Analyzing...": "", + "Analyzed": "分析完畢", + "Analyzing...": "分析中……", "and": "和", "and {{COUNT}} more": "和另外 {{COUNT}} 個", "and create a new shared link.": "並建立新的共用連結。", @@ -172,11 +172,11 @@ "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "剪貼簿寫入權限遭拒。請檢查您的瀏覽器設定,授予必要的存取權限。", "Clone": "複製", "Clone Chat": "複製對話", - "Clone of {{TITLE}}": "", + "Clone of {{TITLE}}": "{{TITLE}} 的副本", "Close": "關閉", "Code execution": "程式碼執行", "Code formatted successfully": "程式碼格式化成功", - "Code Interpreter": "", + "Code Interpreter": "程式碼解釋器", "Collection": "收藏", "Color": "顏色", "ComfyUI": "ComfyUI", @@ -238,7 +238,7 @@ "Default": "預設", "Default (Open AI)": "預設 (OpenAI)", "Default (SentenceTransformers)": "預設 (SentenceTransformers)", - "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "", + "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "預設模式透過在執行前呼叫工具一次,來與更廣泛的模型相容。原生模式則利用模型內建的工具呼叫能力,但需要模型本身就支援此功能。", "Default Model": "預設模型", "Default model updated": "預設模型已更新", "Default Models": "預設模型", @@ -349,7 +349,7 @@ "Enter Chunk Overlap": "輸入區塊重疊", "Enter Chunk Size": "輸入區塊大小", "Enter description": "輸入描述", - "Enter Exa API Key": "", + "Enter Exa API Key": "輸入 Exa API 金鑰", "Enter Github Raw URL": "輸入 GitHub Raw URL", "Enter Google PSE API Key": "輸入 Google PSE API 金鑰", "Enter Google PSE Engine Id": "輸入 Google PSE 引擎 ID", @@ -398,14 +398,14 @@ "Error accessing Google Drive: {{error}}": "存取 Google Drive 時發生錯誤:{{error}}", "Error uploading file: {{error}}": "上傳檔案時發生錯誤:{{error}}", "Evaluations": "評估", - "Exa API Key": "", + "Exa API Key": "Exa API 金鑰", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "範例:(&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "範例:ALL", "Example: mail": "範例:mail", "Example: ou=users,dc=foo,dc=example": "範例:ou=users,dc=foo,dc=example", "Example: sAMAccountName or uid or userPrincipalName": "範例:sAMAccountName 或 uid 或 userPrincipalName", "Exclude": "排除", - "Execute code for analysis": "", + "Execute code for analysis": "執行程式碼以進行分析", "Experimental": "實驗性功能", "Explore the cosmos": "探索宇宙", "Export": "匯出", @@ -458,7 +458,7 @@ "Format your variables using brackets like this:": "使用方括號格式化您的變數,如下所示:", "Frequency Penalty": "頻率懲罰", "Function": "函式", - "Function Calling": "", + "Function Calling": "函式呼叫", "Function created successfully": "成功建立函式", "Function deleted successfully": "成功刪除函式", "Function Description": "函式描述", @@ -473,7 +473,7 @@ "Functions imported successfully": "成功匯入函式", "General": "一般", "General Settings": "一般設定", - "Generate an image": "", + "Generate an image": "產生圖片", "Generate Image": "產生圖片", "Generating search query": "正在產生搜尋查詢", "Get started": "開始使用", @@ -630,7 +630,7 @@ "More": "更多", "Name": "名稱", "Name your knowledge base": "命名您的知識庫", - "Native": "", + "Native": "原生", "New Chat": "新增對話", "New Folder": "新增資料夾", "New Password": "新密碼", @@ -725,7 +725,7 @@ "Please enter a prompt": "請輸入提示詞", "Please fill in all fields.": "請填寫所有欄位。", "Please select a model first.": "請先選擇型號。", - "Please select a model.": "", + "Please select a model.": "請選擇一個模型。", "Please select a reason": "請選擇原因", "Port": "連接埠", "Positive attitude": "積極的態度", @@ -734,7 +734,7 @@ "Previous 30 days": "過去 30 天", "Previous 7 days": "過去 7 天", "Profile Image": "個人檔案圖片", - "Prompt": "", + "Prompt": "提示詞", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示詞(例如:告訴我關於羅馬帝國的一些趣事)", "Prompt Content": "提示詞內容", "Prompt created successfully": "提示詞建立成功", @@ -810,7 +810,7 @@ "Search options": "搜尋選項", "Search Prompts": "搜尋提示詞", "Search Result Count": "搜尋結果數量", - "Search the internet": "", + "Search the internet": "搜尋網際網路", "Search Tools": "搜尋工具", "SearchApi API Key": "SearchApi API 金鑰", "SearchApi Engine": "SearchApi 引擎", @@ -980,7 +980,7 @@ "Tools": "工具", "Tools Access": "工具存取", "Tools are a function calling system with arbitrary code execution": "工具是一個具有任意程式碼執行功能的函式呼叫系統", - "Tools Function Calling Prompt": "", + "Tools Function Calling Prompt": "工具函式呼叫提示詞", "Tools have a function calling system that allows arbitrary code execution": "工具具有允許執行任意程式碼的函式呼叫系統", "Tools have a function calling system that allows arbitrary code execution.": "工具具有允許執行任意程式碼的函式呼叫系統。", "Top K": "Top K", @@ -1051,7 +1051,7 @@ "Web Loader Settings": "網頁載入器設定", "Web Search": "網頁搜尋", "Web Search Engine": "網頁搜尋引擎", - "Web Search in Chat": "", + "Web Search in Chat": "在對話中進行網路搜尋", "Web Search Query Generation": "網頁搜尋查詢生成", "Webhook URL": "Webhook URL", "WebUI Settings": "WebUI 設定", @@ -1081,8 +1081,8 @@ "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "您可以透過下方的「管理」按鈕新增記憶,將您與大型語言模型的互動個人化,讓它們更有幫助並更符合您的需求。", "You cannot upload an empty file.": "您無法上傳空檔案", "You do not have permission to access this feature.": "您沒有權限訪問此功能", - "You do not have permission to upload files": "", - "You do not have permission to upload files.": "您沒有權限上傳檔案", + "You do not have permission to upload files": "您沒有權限上傳檔案", + "You do not have permission to upload files.": "您沒有權限上傳檔案。", "You have no archived conversations.": "您沒有已封存的對話。", "You have shared this chat": "您已分享此對話", "You're a helpful assistant.": "您是一位樂於助人的助手。", From 5ca6afc0fc853411316e6db498498243e565ab81 Mon Sep 17 00:00:00 2001 From: Patrick Deniso Date: Fri, 7 Feb 2025 12:15:54 -0500 Subject: [PATCH 028/117] add s3 key prefix support --- backend/open_webui/config.py | 1 + backend/open_webui/storage/provider.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index bf6f1d0256..17f53be74b 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -660,6 +660,7 @@ S3_ACCESS_KEY_ID = os.environ.get("S3_ACCESS_KEY_ID", None) S3_SECRET_ACCESS_KEY = os.environ.get("S3_SECRET_ACCESS_KEY", None) S3_REGION_NAME = os.environ.get("S3_REGION_NAME", None) S3_BUCKET_NAME = os.environ.get("S3_BUCKET_NAME", None) +S3_KEY_PREFIX = os.environ.get("S3_KEY_PREFIX", None) S3_ENDPOINT_URL = os.environ.get("S3_ENDPOINT_URL", None) GCS_BUCKET_NAME = os.environ.get("GCS_BUCKET_NAME", None) diff --git a/backend/open_webui/storage/provider.py b/backend/open_webui/storage/provider.py index 0c0a8aacfc..60fdf77b5b 100644 --- a/backend/open_webui/storage/provider.py +++ b/backend/open_webui/storage/provider.py @@ -10,6 +10,7 @@ from open_webui.config import ( S3_ACCESS_KEY_ID, S3_BUCKET_NAME, S3_ENDPOINT_URL, + S3_KEY_PREFIX, S3_REGION_NAME, S3_SECRET_ACCESS_KEY, GCS_BUCKET_NAME, @@ -98,7 +99,8 @@ class S3StorageProvider(StorageProvider): """Handles uploading of the file to S3 storage.""" _, file_path = LocalStorageProvider.upload_file(file, filename) try: - self.s3_client.upload_file(file_path, self.bucket_name, filename) + s3_key = os.path.join(S3_KEY_PREFIX, filename) + self.s3_client.upload_file(file_path, self.bucket_name, s3_key) return ( open(file_path, "rb").read(), "s3://" + self.bucket_name + "/" + filename, From 94f56db5eeb6645d5b660bc24f9fe70355419362 Mon Sep 17 00:00:00 2001 From: Mistrick Date: Sat, 8 Feb 2025 01:10:18 +0700 Subject: [PATCH 029/117] fix max seed for comfyui --- backend/open_webui/utils/images/comfyui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/images/comfyui.py b/backend/open_webui/utils/images/comfyui.py index 679fff9f64..b86c257591 100644 --- a/backend/open_webui/utils/images/comfyui.py +++ b/backend/open_webui/utils/images/comfyui.py @@ -161,7 +161,7 @@ async def comfyui_generate_image( seed = ( payload.seed if payload.seed - else random.randint(0, 18446744073709551614) + else random.randint(0, 1125899906842624) ) for node_id in node.node_ids: workflow[node_id]["inputs"][node.key] = seed From 7f8247692685ef23e54bef781a83c96c9943876a Mon Sep 17 00:00:00 2001 From: Patrick Deniso Date: Fri, 7 Feb 2025 13:56:57 -0500 Subject: [PATCH 030/117] use key_prefix in rest of S3StorageProvider --- backend/open_webui/storage/provider.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/storage/provider.py b/backend/open_webui/storage/provider.py index 60fdf77b5b..f287daf2ff 100644 --- a/backend/open_webui/storage/provider.py +++ b/backend/open_webui/storage/provider.py @@ -94,35 +94,36 @@ class S3StorageProvider(StorageProvider): aws_secret_access_key=S3_SECRET_ACCESS_KEY, ) self.bucket_name = S3_BUCKET_NAME + self.key_prefix = S3_KEY_PREFIX def upload_file(self, file: BinaryIO, filename: str) -> Tuple[bytes, str]: """Handles uploading of the file to S3 storage.""" _, file_path = LocalStorageProvider.upload_file(file, filename) try: - s3_key = os.path.join(S3_KEY_PREFIX, filename) + s3_key = os.path.join(self.key_prefix, filename) self.s3_client.upload_file(file_path, self.bucket_name, s3_key) return ( open(file_path, "rb").read(), - "s3://" + self.bucket_name + "/" + filename, + "s3://" + self.bucket_name + "/" + s3_key, ) except ClientError as e: raise RuntimeError(f"Error uploading file to S3: {e}") - + def get_file(self, file_path: str) -> str: """Handles downloading of the file from S3 storage.""" try: - bucket_name, key = file_path.split("//")[1].split("/") - local_file_path = f"{UPLOAD_DIR}/{key}" - self.s3_client.download_file(bucket_name, key, local_file_path) + s3_key = self._extract_s3_key(file_path) + local_file_path = self._get_local_file_path(s3_key) + self.s3_client.download_file(self.bucket_name, s3_key, local_file_path) return local_file_path except ClientError as e: raise RuntimeError(f"Error downloading file from S3: {e}") def delete_file(self, file_path: str) -> None: """Handles deletion of the file from S3 storage.""" - filename = file_path.split("/")[-1] try: - self.s3_client.delete_object(Bucket=self.bucket_name, Key=filename) + s3_key = self._extract_s3_key(file_path) + self.s3_client.delete_object(Bucket=self.bucket_name, Key=s3_key) except ClientError as e: raise RuntimeError(f"Error deleting file from S3: {e}") @@ -135,6 +136,9 @@ class S3StorageProvider(StorageProvider): response = self.s3_client.list_objects_v2(Bucket=self.bucket_name) if "Contents" in response: for content in response["Contents"]: + # Skip objects that were not uploaded from open-webui in the first place + if not content["Key"].startswith(self.key_prefix): continue + self.s3_client.delete_object( Bucket=self.bucket_name, Key=content["Key"] ) @@ -144,6 +148,12 @@ class S3StorageProvider(StorageProvider): # Always delete from local storage LocalStorageProvider.delete_all_files() + # The s3 key is the name assigned to an object. It excludes the bucket name, but includes the internal path and the file name. + def _extract_s3_key(self, full_file_path: str) -> str: + return ''.join(full_file_path.split("//")[1].split("/")[1:]) + + def _get_local_file_path(self, s3_key: str) -> str: + return f"{UPLOAD_DIR}/{s3_key.split('/')[-1]}" class GCSStorageProvider(StorageProvider): def __init__(self): From c092db379e79964c15ecb8d744ce66d8f98886c9 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 7 Feb 2025 11:23:04 -0800 Subject: [PATCH 031/117] fix --- backend/open_webui/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index bf6f1d0256..01f91ec648 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1645,7 +1645,7 @@ RAG_WEB_SEARCH_ENGINE = PersistentConfig( # This ensures the highest level of safety and reliability of the information sources. RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig( "RAG_WEB_SEARCH_DOMAIN_FILTER_LIST", - "rag.rag.web.search.domain.filter_list", + "rag.web.search.domain.filter_list", [ # "wikipedia.com", # "wikimedia.org", From f8a8218149d106e173cd152fd0d07479afcc17e8 Mon Sep 17 00:00:00 2001 From: Patrick Deniso Date: Fri, 7 Feb 2025 14:42:16 -0500 Subject: [PATCH 032/117] fix bug where '/' was not properly inserted in s3 key strings --- backend/open_webui/storage/provider.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/storage/provider.py b/backend/open_webui/storage/provider.py index f287daf2ff..afc50b3973 100644 --- a/backend/open_webui/storage/provider.py +++ b/backend/open_webui/storage/provider.py @@ -94,7 +94,7 @@ class S3StorageProvider(StorageProvider): aws_secret_access_key=S3_SECRET_ACCESS_KEY, ) self.bucket_name = S3_BUCKET_NAME - self.key_prefix = S3_KEY_PREFIX + self.key_prefix = S3_KEY_PREFIX if S3_KEY_PREFIX else "" def upload_file(self, file: BinaryIO, filename: str) -> Tuple[bytes, str]: """Handles uploading of the file to S3 storage.""" @@ -150,7 +150,7 @@ class S3StorageProvider(StorageProvider): # The s3 key is the name assigned to an object. It excludes the bucket name, but includes the internal path and the file name. def _extract_s3_key(self, full_file_path: str) -> str: - return ''.join(full_file_path.split("//")[1].split("/")[1:]) + return '/'.join(full_file_path.split("//")[1].split("/")[1:]) def _get_local_file_path(self, s3_key: str) -> str: return f"{UPLOAD_DIR}/{s3_key.split('/')[-1]}" From 4b4a86d4e7a49149de3e6daeee7fa9b79e9148e5 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 7 Feb 2025 11:51:27 -0800 Subject: [PATCH 033/117] chore: dependencies --- backend/requirements.txt | 2 ++ pyproject.toml | 3 +++ 2 files changed, 5 insertions(+) diff --git a/backend/requirements.txt b/backend/requirements.txt index 14ad4b9cdf..92d9c7f22f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -32,6 +32,8 @@ boto3==1.35.53 argon2-cffi==23.1.0 APScheduler==3.10.4 +RestrictedPython==8.0 + # AI libraries openai anthropic diff --git a/pyproject.toml b/pyproject.toml index f121089e8f..076e58b7c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,9 @@ dependencies = [ "argon2-cffi==23.1.0", "APScheduler==3.10.4", + + "RestrictedPython==8.0", + "openai", "anthropic", "google-generativeai==0.7.2", From 85912d726e759e83a42f03497175b08a2a421a1a Mon Sep 17 00:00:00 2001 From: tarmst Date: Fri, 7 Feb 2025 19:53:25 +0000 Subject: [PATCH 034/117] Adding debug logs for oauth role & group management --- backend/open_webui/env.py | 1 + backend/open_webui/utils/oauth.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 00605e15dc..0be3887f82 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -92,6 +92,7 @@ log_sources = [ "RAG", "WEBHOOK", "SOCKET", + "OAUTH", ] SRC_LOG_LEVELS = {} diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 83e0ca1d6d..3adbac20ea 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -1,6 +1,7 @@ import base64 import logging import mimetypes +import sys import uuid import aiohttp @@ -40,7 +41,11 @@ from open_webui.utils.misc import parse_duration from open_webui.utils.auth import get_password_hash, create_token from open_webui.utils.webhook import post_webhook +from open_webui.env import SRC_LOG_LEVELS, GLOBAL_LOG_LEVEL + +logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) log = logging.getLogger(__name__) +log.setLevel(SRC_LOG_LEVELS["OAUTH"]) auth_manager_config = AppConfig() auth_manager_config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE @@ -72,12 +77,15 @@ class OAuthManager: def get_user_role(self, user, user_data): if user and Users.get_num_users() == 1: # If the user is the only user, assign the role "admin" - actually repairs role for single user on login + log.debug("Assigning the only user the admin role") return "admin" if not user and Users.get_num_users() == 0: # If there are no users, assign the role "admin", as the first user will be an admin + log.debug("Assigning the first user the admin role") return "admin" if auth_manager_config.ENABLE_OAUTH_ROLE_MANAGEMENT: + log.debug("Running OAUTH Role management") oauth_claim = auth_manager_config.OAUTH_ROLES_CLAIM oauth_allowed_roles = auth_manager_config.OAUTH_ALLOWED_ROLES oauth_admin_roles = auth_manager_config.OAUTH_ADMIN_ROLES @@ -93,17 +101,24 @@ class OAuthManager: claim_data = claim_data.get(nested_claim, {}) oauth_roles = claim_data if isinstance(claim_data, list) else None + log.debug(f"Oauth Roles claim: {oauth_claim}") + log.debug(f"User roles from oauth: {oauth_roles}") + log.debug(f"Accepted user roles: {oauth_allowed_roles}") + log.debug(f"Accepted admin roles: {oauth_admin_roles}") + # If any roles are found, check if they match the allowed or admin roles if oauth_roles: # If role management is enabled, and matching roles are provided, use the roles for allowed_role in oauth_allowed_roles: # If the user has any of the allowed roles, assign the role "user" if allowed_role in oauth_roles: + log.debug("Assigned user the user role") role = "user" break for admin_role in oauth_admin_roles: # If the user has any of the admin roles, assign the role "admin" if admin_role in oauth_roles: + log.debug("Assigned user the admin role") role = "admin" break else: @@ -117,16 +132,23 @@ class OAuthManager: return role def update_user_groups(self, user, user_data, default_permissions): + log.debug("Running OAUTH Group management") oauth_claim = auth_manager_config.OAUTH_GROUPS_CLAIM user_oauth_groups: list[str] = user_data.get(oauth_claim, list()) user_current_groups: list[GroupModel] = Groups.get_groups_by_member_id(user.id) all_available_groups: list[GroupModel] = Groups.get_groups() + log.debug(f"Oauth Groups claim: {oauth_claim}") + log.debug(f"User oauth groups: {user_oauth_groups}") + log.debug(f"User's current groups: {[g.name for g in user_current_groups]}") + log.debug(f"All groups available in OpenWebUI: {[g.name for g in all_available_groups]}") + # Remove groups that user is no longer a part of for group_model in user_current_groups: if group_model.name not in user_oauth_groups: # Remove group from user + log.debug(f"Removing user from group {group_model.name} as it is no longer in their oauth groups") user_ids = group_model.user_ids user_ids = [i for i in user_ids if i != user.id] @@ -152,6 +174,7 @@ class OAuthManager: gm.name == group_model.name for gm in user_current_groups ): # Add user to group + log.debug(f"Adding user to group {group_model.name} as it was found in their oauth groups") user_ids = group_model.user_ids user_ids.append(user.id) From c56bedc5ffa81967270da44b2f76f5a7d51a7b16 Mon Sep 17 00:00:00 2001 From: Xingjian Xie Date: Fri, 7 Feb 2025 20:15:54 +0000 Subject: [PATCH 035/117] Fix tag_content_handler issue: after_tag should be remove from the current content_blocks --- backend/open_webui/utils/middleware.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 331b850ff3..79210030d1 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1260,10 +1260,10 @@ async def process_chat_response( match.end() : ] # Content after opening tag - # Remove the start tag from the currently handling text block + # Remove the start tag and after from the currently handling text block content_blocks[-1]["content"] = content_blocks[-1][ "content" - ].replace(match.group(0), "") + ].replace(match.group(0) + after_tag, "") if before_tag: content_blocks[-1]["content"] = before_tag From 546ef6ab42c2fcc59aeae8e03bf9b67ec74f28e1 Mon Sep 17 00:00:00 2001 From: Rodrigo Agundez Date: Sat, 8 Feb 2025 09:49:16 +0900 Subject: [PATCH 036/117] Check is response is OK from retrieve the picture if not then default --- backend/open_webui/utils/oauth.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 83e0ca1d6d..5e52937f41 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -261,15 +261,18 @@ class OAuthManager: } async with aiohttp.ClientSession() as session: async with session.get(picture_url, **get_kwargs) as resp: - picture = await resp.read() - base64_encoded_picture = base64.b64encode( - picture - ).decode("utf-8") - guessed_mime_type = mimetypes.guess_type(picture_url)[0] - if guessed_mime_type is None: - # assume JPG, browsers are tolerant enough of image formats - guessed_mime_type = "image/jpeg" - picture_url = f"data:{guessed_mime_type};base64,{base64_encoded_picture}" + if resp.ok: + picture = await resp.read() + base64_encoded_picture = base64.b64encode( + picture + ).decode("utf-8") + guessed_mime_type = mimetypes.guess_type(picture_url)[0] + if guessed_mime_type is None: + # assume JPG, browsers are tolerant enough of image formats + guessed_mime_type = "image/jpeg" + picture_url = f"data:{guessed_mime_type};base64,{base64_encoded_picture}" + else: + picture_url = "/user.png" except Exception as e: log.error( f"Error downloading profile image '{picture_url}': {e}" From d39a274ef89eb8381fc85d1775d8c167077a3a32 Mon Sep 17 00:00:00 2001 From: zoupingshi Date: Sat, 8 Feb 2025 12:14:01 +0800 Subject: [PATCH 037/117] chore: fix some typos Signed-off-by: zoupingshi --- backend/open_webui/models/chats.py | 2 +- backend/open_webui/utils/middleware.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/models/chats.py b/backend/open_webui/models/chats.py index 73ff6c102d..9e0a5865e9 100644 --- a/backend/open_webui/models/chats.py +++ b/backend/open_webui/models/chats.py @@ -470,7 +470,7 @@ class ChatTable: try: with get_db() as db: # it is possible that the shared link was deleted. hence, - # we check if the chat is still shared by checkng if a chat with the share_id exists + # we check if the chat is still shared by checking if a chat with the share_id exists chat = db.query(Chat).filter_by(share_id=id).first() if chat: diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 79210030d1..984359869b 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -572,13 +572,13 @@ async def chat_image_generation_handler( { "type": "status", "data": { - "description": f"An error occured while generating an image", + "description": f"An error occurred while generating an image", "done": True, }, } ) - system_message_content = "Unable to generate an image, tell the user that an error occured" + system_message_content = "Unable to generate an image, tell the user that an error occurred" if system_message_content: form_data["messages"] = add_or_update_system_message( From 95aaacfeb494a659be2b488a9237e20bec18d273 Mon Sep 17 00:00:00 2001 From: SentinalMax Date: Fri, 7 Feb 2025 22:52:24 -0600 Subject: [PATCH 038/117] fixed GGUF model upload instability --- backend/open_webui/routers/ollama.py | 119 +++++++++++++++++---------- backend/open_webui/utils/misc.py | 9 +- 2 files changed, 79 insertions(+), 49 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 2ab06eb95e..1c63656839 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -11,10 +11,8 @@ import re import time from typing import Optional, Union from urllib.parse import urlparse - import aiohttp from aiocache import cached - import requests from fastapi import ( @@ -990,6 +988,8 @@ async def generate_chat_completion( ) payload = {**form_data.model_dump(exclude_none=True)} + if "metadata" in payload: + del payload["metadata"] model_id = payload["model"] model_info = Models.get_model_by_id(model_id) @@ -1408,9 +1408,10 @@ async def download_model( return None +# TODO: Progress bar does not reflect size & duration of upload. @router.post("/models/upload") @router.post("/models/upload/{url_idx}") -def upload_model( +async def upload_model( request: Request, file: UploadFile = File(...), url_idx: Optional[int] = None, @@ -1419,62 +1420,90 @@ def upload_model( if url_idx is None: url_idx = 0 ollama_url = request.app.state.config.OLLAMA_BASE_URLS[url_idx] + file_path = os.path.join(UPLOAD_DIR, file.filename) + os.makedirs(UPLOAD_DIR, exist_ok=True) - file_path = f"{UPLOAD_DIR}/{file.filename}" + # --- P1: save file locally --- + chunk_size = 1024 * 1024 * 2 # 2 MB chunks + with open(file_path, "wb") as out_f: + while True: + chunk = file.file.read(chunk_size) + #log.info(f"Chunk: {str(chunk)}") # DEBUG + if not chunk: + break + out_f.write(chunk) - # Save file in chunks - with open(file_path, "wb+") as f: - for chunk in file.file: - f.write(chunk) - - def file_process_stream(): + async def file_process_stream(): nonlocal ollama_url total_size = os.path.getsize(file_path) - chunk_size = 1024 * 1024 + log.info(f"Total Model Size: {str(total_size)}") # DEBUG + + # --- P2: SSE progress + calculate sha256 hash --- + file_hash = calculate_sha256(file_path, chunk_size) + log.info(f"Model Hash: {str(file_hash)}") # DEBUG try: with open(file_path, "rb") as f: - total = 0 - done = False - - while not done: - chunk = f.read(chunk_size) - if not chunk: - done = True - continue - - total += len(chunk) - progress = round((total / total_size) * 100, 2) - - res = { + bytes_read = 0 + while chunk := f.read(chunk_size): + bytes_read += len(chunk) + progress = round(bytes_read / total_size * 100, 2) + data_msg = { "progress": progress, "total": total_size, - "completed": total, + "completed": bytes_read, } - yield f"data: {json.dumps(res)}\n\n" + yield f"data: {json.dumps(data_msg)}\n\n" - if done: - f.seek(0) - hashed = calculate_sha256(f) - f.seek(0) + # --- P3: Upload to ollama /api/blobs --- + with open(file_path, "rb") as f: + url = f"{ollama_url}/api/blobs/sha256:{file_hash}" + response = requests.post(url, data=f) - url = f"{ollama_url}/api/blobs/sha256:{hashed}" - response = requests.post(url, data=f) + if response.ok: + log.info(f"Uploaded to /api/blobs") # DEBUG + # Remove local file + os.remove(file_path) - if response.ok: - res = { - "done": done, - "blob": f"sha256:{hashed}", - "name": file.filename, - } - os.remove(file_path) - yield f"data: {json.dumps(res)}\n\n" - else: - raise Exception( - "Ollama: Could not create blob, Please try again." - ) + # Create model in ollama + model_name, ext = os.path.splitext(file.filename) + log.info(f"Created Model: {model_name}") # DEBUG + + create_payload = { + "model": model_name, + # Reference the file by its original name => the uploaded blob's digest + "files": { + file.filename: f"sha256:{file_hash}" + }, + } + log.info(f"Model Payload: {create_payload}") # DEBUG + + # Call ollama /api/create + #https://github.com/ollama/ollama/blob/main/docs/api.md#create-a-model + create_resp = requests.post( + url=f"{ollama_url}/api/create", + headers={"Content-Type": "application/json"}, + data=json.dumps(create_payload), + ) + + if create_resp.ok: + log.info(f"API SUCCESS!") # DEBUG + done_msg = { + "done": True, + "blob": f"sha256:{file_hash}", + "name": file.filename, + "model_created": model_name, + } + yield f"data: {json.dumps(done_msg)}\n\n" + else: + raise Exception( + f"Failed to create model in Ollama. {create_resp.text}" + ) + + else: + raise Exception("Ollama: Could not create blob, Please try again.") except Exception as e: res = {"error": str(e)} yield f"data: {json.dumps(res)}\n\n" - return StreamingResponse(file_process_stream(), media_type="text/event-stream") + return StreamingResponse(file_process_stream(), media_type="text/event-stream") \ No newline at end of file diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index b073939219..eb90ea5ead 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -244,11 +244,12 @@ def get_gravatar_url(email): return f"https://www.gravatar.com/avatar/{hash_hex}?d=mp" -def calculate_sha256(file): +def calculate_sha256(file_path, chunk_size): + #Compute SHA-256 hash of a file efficiently in chunks sha256 = hashlib.sha256() - # Read the file in chunks to efficiently handle large files - for chunk in iter(lambda: file.read(8192), b""): - sha256.update(chunk) + with open(file_path, "rb") as f: + while chunk := f.read(chunk_size): + sha256.update(chunk) return sha256.hexdigest() From 3dde2f67cfaa938b9b25cf549deb9249793835d8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 7 Feb 2025 22:57:39 -0800 Subject: [PATCH 039/117] refac --- backend/open_webui/utils/chat.py | 6 +++--- backend/open_webui/utils/filter.py | 29 ++++++++++++-------------- backend/open_webui/utils/middleware.py | 23 +++++++++++++------- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index ebd5bb5e34..f0b52eca27 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -203,10 +203,10 @@ async def chat_completed(request: Request, form_data: dict, user: Any): try: result, _ = await process_filter_functions( - handler_type="outlet", - filter_ids=get_sorted_filter_ids(model), request=request, - data=data, + filter_ids=get_sorted_filter_ids(model), + filter_type="outlet", + form_data=data, extra_params=extra_params, ) return result diff --git a/backend/open_webui/utils/filter.py b/backend/open_webui/utils/filter.py index 2ad0c025e6..88fe703535 100644 --- a/backend/open_webui/utils/filter.py +++ b/backend/open_webui/utils/filter.py @@ -2,6 +2,7 @@ import inspect from open_webui.utils.plugin import load_function_module_by_id from open_webui.models.functions import Functions + def get_sorted_filter_ids(model): def get_priority(function_id): function = Functions.get_function_by_id(function_id) @@ -19,17 +20,14 @@ def get_sorted_filter_ids(model): function.id for function in Functions.get_functions_by_type("filter", active_only=True) ] - + filter_ids = [fid for fid in filter_ids if fid in enabled_filter_ids] filter_ids.sort(key=get_priority) return filter_ids + async def process_filter_functions( - handler_type, - filter_ids, - request, - data, - extra_params + request, filter_ids, filter_type, form_data, extra_params ): skip_files = None @@ -45,7 +43,7 @@ async def process_filter_functions( request.app.state.FUNCTIONS[filter_id] = function_module # Check if the function has a file_handler variable - if handler_type == "inlet" and hasattr(function_module, "file_handler"): + if filter_type == "inlet" and hasattr(function_module, "file_handler"): skip_files = function_module.file_handler # Apply valves to the function @@ -56,14 +54,14 @@ async def process_filter_functions( ) # Prepare handler function - handler = getattr(function_module, handler_type, None) + handler = getattr(function_module, filter_type, None) if not handler: continue try: # Prepare parameters sig = inspect.signature(handler) - params = {"body": data} + params = {"body": form_data} # Add extra parameters that exist in the handler's signature for key in list(extra_params.keys()): @@ -82,19 +80,18 @@ async def process_filter_functions( except Exception as e: print(e) - # Execute handler if inspect.iscoroutinefunction(handler): - data = await handler(**params) + form_data = await handler(**params) else: - data = handler(**params) + form_data = handler(**params) except Exception as e: - print(f"Error in {handler_type} handler {filter_id}: {e}") + print(f"Error in {filter_type} handler {filter_id}: {e}") raise e # Handle file cleanup for inlet - if skip_files and "files" in data.get("metadata", {}): - del data["metadata"]["files"] + if skip_files and "files" in form_data.get("metadata", {}): + del form_data["metadata"]["files"] - return data, {} \ No newline at end of file + return form_data, {} diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index c69d0c909d..14d01221c4 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -694,10 +694,10 @@ async def process_chat_payload(request, form_data, metadata, user, model): try: form_data, flags = await process_filter_functions( - handler_type="inlet", - filter_ids=get_sorted_filter_ids(model), request=request, - data=form_data, + filter_ids=get_sorted_filter_ids(model), + filter_type="inlet", + form_data=form_data, extra_params=extra_params, ) except Exception as e: @@ -1039,11 +1039,15 @@ async def process_chat_response( def split_content_and_whitespace(content): content_stripped = content.rstrip() - original_whitespace = content[len(content_stripped):] if len(content) > len(content_stripped) else '' + original_whitespace = ( + content[len(content_stripped) :] + if len(content) > len(content_stripped) + else "" + ) return content_stripped, original_whitespace def is_opening_code_block(content): - backtick_segments = content.split('```') + backtick_segments = content.split("```") # Even number of segments means the last backticks are opening a new block return len(backtick_segments) > 1 and len(backtick_segments) % 2 == 0 @@ -1113,10 +1117,15 @@ async def process_chat_response( output = block.get("output", None) lang = attributes.get("lang", "") - content_stripped, original_whitespace = split_content_and_whitespace(content) + content_stripped, original_whitespace = ( + split_content_and_whitespace(content) + ) if is_opening_code_block(content_stripped): # Remove trailing backticks that would open a new block - content = content_stripped.rstrip('`').rstrip() + original_whitespace + content = ( + content_stripped.rstrip("`").rstrip() + + original_whitespace + ) else: # Keep content as is - either closing backticks or no backticks content = content_stripped + original_whitespace From 9be8bea6f4046ec828686ec3dc0728363d3117fc Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 8 Feb 2025 01:07:05 -0800 Subject: [PATCH 040/117] fix: filter --- backend/open_webui/utils/chat.py | 1 + backend/open_webui/utils/filter.py | 14 ++++++++------ backend/open_webui/utils/middleware.py | 1 + 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index f0b52eca27..3b6d5ea042 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -199,6 +199,7 @@ async def chat_completed(request: Request, form_data: dict, user: Any): }, "__metadata__": metadata, "__request__": request, + "__model__": model, } try: diff --git a/backend/open_webui/utils/filter.py b/backend/open_webui/utils/filter.py index 88fe703535..de51bd46e5 100644 --- a/backend/open_webui/utils/filter.py +++ b/backend/open_webui/utils/filter.py @@ -61,12 +61,14 @@ async def process_filter_functions( try: # Prepare parameters sig = inspect.signature(handler) - params = {"body": form_data} - - # Add extra parameters that exist in the handler's signature - for key in list(extra_params.keys()): - if key in sig.parameters: - params[key] = extra_params[key] + params = {"body": form_data} | { + k: v + for k, v in { + **extra_params, + "__id__": filter_id, + }.items() + if k in sig.parameters + } # Handle user parameters if "__user__" in sig.parameters: diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 39033a92ab..29bfb2ba1b 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -617,6 +617,7 @@ async def process_chat_payload(request, form_data, metadata, user, model): }, "__metadata__": metadata, "__request__": request, + "__model__": model, } # Initialize events to store additional event to be sent to the client From 181fca4707dda3222b29b3d6de40dad7fe3b2260 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 8 Feb 2025 02:34:30 -0800 Subject: [PATCH 041/117] refac: transformer.js --- package-lock.json | 184 +++++++++++------- package.json | 4 +- .../admin/Evaluations/Leaderboard.svelte | 4 +- vite.config.ts | 15 +- 4 files changed, 132 insertions(+), 75 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47856e4c0a..e5c18101bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "idb": "^7.1.1", "js-sha256": "^0.10.1", "katex": "^0.16.21", + "kokoro-js": "^1.1.1", "marked": "^9.1.0", "mermaid": "^10.9.3", "paneforge": "^0.0.6", @@ -62,7 +63,8 @@ "svelte-sonner": "^0.3.19", "tippy.js": "^6.3.7", "turndown": "^7.2.0", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "vite-plugin-static-copy": "^2.2.0" }, "devDependencies": { "@sveltejs/adapter-auto": "3.2.2", @@ -1078,21 +1080,23 @@ } }, "node_modules/@huggingface/jinja": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.1.tgz", - "integrity": "sha512-SbcBWUKDQ76lzlVYOloscUk0SJjuL1LcbZsfQv/Bxxc7dwJMYuS+DAQ+HhVw6ZkTFXArejaX5HQRuCuleYwYdA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.3.3.tgz", + "integrity": "sha512-vQQr2JyWvVFba3Lj9es4q9vCl1sAc74fdgnEMoX8qHrXtswap9ge9uO3ONDzQB0cQ0PUyaKY2N6HaVbTBvSXvw==", + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@huggingface/transformers": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.0.0.tgz", - "integrity": "sha512-OWIPnTijAw4DQ+IFHBOrej2SDdYyykYlTtpTLCEt5MZq/e9Cb65RS2YVhdGcgbaW/6JAL3i8ZA5UhDeWGm4iRQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.3.3.tgz", + "integrity": "sha512-OcMubhBjW6u1xnp0zSt5SvCxdGHuhP2k+w2Vlm3i0vNcTJhJTZWxxYQmPBfcb7PX+Q6c43lGSzWD6tsJFwka4Q==", + "license": "Apache-2.0", "dependencies": { - "@huggingface/jinja": "^0.3.0", - "onnxruntime-node": "1.19.2", - "onnxruntime-web": "1.20.0-dev.20241016-2b8fc5529b", + "@huggingface/jinja": "^0.3.3", + "onnxruntime-node": "1.20.1", + "onnxruntime-web": "1.21.0-dev.20250206-d981b153d3", "sharp": "^0.33.5" } }, @@ -1546,6 +1550,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -1799,7 +1804,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1812,7 +1816,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1821,7 +1824,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1857,27 +1859,32 @@ "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -1886,27 +1893,32 @@ "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" }, "node_modules/@pyscript/core": { "version": "0.4.32", @@ -3426,7 +3438,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3655,7 +3666,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -3731,7 +3741,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -4091,7 +4100,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4115,7 +4123,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4127,6 +4134,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -5915,7 +5923,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5931,7 +5938,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5955,7 +5961,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -6014,7 +6019,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6053,9 +6057,10 @@ } }, "node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" + "version": "25.1.24", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.1.24.tgz", + "integrity": "sha512-Ni+KCqYquU30UEgGkrrwpbYtUcUmNuLFcQ5Xdy9DK7WUaji+AAov+Bf12FEYmu0eI15y31oD38utnBexe0cAYA==", + "license": "Apache-2.0" }, "node_modules/flatted": { "version": "3.3.1", @@ -6126,7 +6131,6 @@ "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6446,8 +6450,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -6458,7 +6461,8 @@ "node_modules/guid-typescript": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==" + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" }, "node_modules/gulp-sort": { "version": "2.0.0", @@ -6826,7 +6830,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6875,7 +6878,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6892,7 +6894,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6934,7 +6935,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -7114,7 +7114,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -7189,6 +7188,16 @@ "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", "dev": true }, + "node_modules/kokoro-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/kokoro-js/-/kokoro-js-1.1.1.tgz", + "integrity": "sha512-cyLO34iI8nBJXPnd3fI4fGeQGS+a6Uatg7eXNL6QS8TLSxaa30WD6Fj7/XoIZYaHg8q6d+TCrui/f74MTY2g1g==", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/transformers": "^3.3.3", + "phonemizer": "^1.2.1" + } + }, "node_modules/layout-base": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", @@ -7472,9 +7481,10 @@ } }, "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", + "license": "Apache-2.0" }, "node_modules/loupe": { "version": "2.3.7", @@ -7627,7 +7637,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -8084,7 +8093,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -8168,6 +8176,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "license": "MIT", "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" @@ -8180,6 +8189,7 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -8199,6 +8209,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -8213,6 +8224,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8227,6 +8239,7 @@ "version": "5.0.10", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", "dependencies": { "glob": "^10.3.7" }, @@ -8347,7 +8360,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8451,42 +8463,46 @@ } }, "node_modules/onnxruntime-common": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.19.2.tgz", - "integrity": "sha512-a4R7wYEVFbZBlp0BfhpbFWqe4opCor3KM+5Wm22Az3NGDcQMiU2hfG/0MfnBs+1ZrlSGmlgWeMcXQkDk1UFb8Q==" + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.20.1.tgz", + "integrity": "sha512-YiU0s0IzYYC+gWvqD1HzLc46Du1sXpSiwzKb63PACIJr6LfL27VsXSXQvt68EzD3V0D5Bc0vyJTjmMxp0ylQiw==", + "license": "MIT" }, "node_modules/onnxruntime-node": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.19.2.tgz", - "integrity": "sha512-9eHMP/HKbbeUcqte1JYzaaRC8JPn7ojWeCeoyShO86TOR97OCyIyAIOGX3V95ErjslVhJRXY8Em/caIUc0hm1Q==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.20.1.tgz", + "integrity": "sha512-di/I4HDXRw+FLgq+TyHmQEDd3cEp9iFFZm0r4uJ1Wd7b/WE1VXtKWo8yemex347c6GNF/3Pv86ZfPhIWxORr0w==", "hasInstallScript": true, + "license": "MIT", "os": [ "win32", "darwin", "linux" ], "dependencies": { - "onnxruntime-common": "1.19.2", + "onnxruntime-common": "1.20.1", "tar": "^7.0.1" } }, "node_modules/onnxruntime-web": { - "version": "1.20.0-dev.20241016-2b8fc5529b", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.20.0-dev.20241016-2b8fc5529b.tgz", - "integrity": "sha512-1XovqtgqeEFtupuyzdDQo7Tqj4GRyNHzOoXjapCEo4rfH3JrXok5VtqucWfRXHPsOI5qoNxMQ9VE+drDIp6woQ==", + "version": "1.21.0-dev.20250206-d981b153d3", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.21.0-dev.20250206-d981b153d3.tgz", + "integrity": "sha512-esDVQdRic6J44VBMFLumYvcGfioMh80ceLmzF1yheJyuLKq/Th8VT2aj42XWQst+2bcWnAhw4IKmRQaqzU8ugg==", + "license": "MIT", "dependencies": { - "flatbuffers": "^1.12.0", + "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", - "onnxruntime-common": "1.20.0-dev.20241016-2b8fc5529b", + "onnxruntime-common": "1.21.0-dev.20250206-d981b153d3", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { - "version": "1.20.0-dev.20241016-2b8fc5529b", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.20.0-dev.20241016-2b8fc5529b.tgz", - "integrity": "sha512-KZK8b6zCYGZFjd4ANze0pqBnqnFTS3GIVeclQpa2qseDpXrCQJfkWBixRcrZShNhm3LpFOZ8qJYFC5/qsJK9WQ==" + "version": "1.21.0-dev.20250206-d981b153d3", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0-dev.20250206-d981b153d3.tgz", + "integrity": "sha512-TwaE51xV9q2y8pM61q73rbywJnusw9ivTEHAJ39GVWNZqxCoDBpe/tQkh/w9S+o/g+zS7YeeL0I/2mEWd+dgyA==", + "license": "MIT" }, "node_modules/optionator": { "version": "0.9.3", @@ -8564,7 +8580,8 @@ "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" }, "node_modules/paneforge": { "version": "0.0.6", @@ -8747,6 +8764,12 @@ "@types/estree": "*" } }, + "node_modules/phonemizer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/phonemizer/-/phonemizer-1.2.1.tgz", + "integrity": "sha512-v0KJ4mi2T4Q7eJQ0W15Xd4G9k4kICSXE8bpDeJ8jisL4RyJhNWsweKTOi88QXFc4r4LZlz5jVL5lCHhkpdT71A==", + "license": "Apache-2.0" + }, "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", @@ -8800,7 +8823,8 @@ "node_modules/platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" }, "node_modules/polyscript": { "version": "0.12.8", @@ -9335,6 +9359,7 @@ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -9434,7 +9459,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -9556,7 +9580,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -9659,7 +9682,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -9785,7 +9807,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -11153,6 +11174,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -11169,6 +11191,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -11300,7 +11323,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -11508,7 +11530,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -11795,6 +11816,24 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-plugin-static-copy": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.2.0.tgz", + "integrity": "sha512-ytMrKdR9iWEYHbUxs6x53m+MRl4SJsOSoMu1U1+Pfg0DjPeMlsRVx3RR5jvoonineDquIue83Oq69JvNsFSU5w==", + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + } + }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -12593,6 +12632,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } diff --git a/package.json b/package.json index 7754eacce8..aa43f6a754 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,7 @@ "idb": "^7.1.1", "js-sha256": "^0.10.1", "katex": "^0.16.21", + "kokoro-js": "^1.1.1", "marked": "^9.1.0", "mermaid": "^10.9.3", "paneforge": "^0.0.6", @@ -105,7 +106,8 @@ "svelte-sonner": "^0.3.19", "tippy.js": "^6.3.7", "turndown": "^7.2.0", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "vite-plugin-static-copy": "^2.2.0" }, "engines": { "node": ">=18.13.0 <=22.x.x", diff --git a/src/lib/components/admin/Evaluations/Leaderboard.svelte b/src/lib/components/admin/Evaluations/Leaderboard.svelte index 59f6df916a..07e19e9792 100644 --- a/src/lib/components/admin/Evaluations/Leaderboard.svelte +++ b/src/lib/components/admin/Evaluations/Leaderboard.svelte @@ -1,6 +1,8 @@
From 205ce635f6f678e8cd5f5aa3ab1dac6325f784fb Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 9 Feb 2025 23:42:27 -0800 Subject: [PATCH 060/117] feat: Kokoro-js TTS support --- .../chat/Messages/ResponseMessage.svelte | 165 +++++++++------- src/lib/components/chat/Settings/Audio.svelte | 176 ++++++++++++++++-- src/lib/stores/index.ts | 2 + src/lib/workers/KokoroWorker.ts | 70 +++++++ src/lib/workers/kokoro.worker.ts | 53 ++++++ 5 files changed, 388 insertions(+), 78 deletions(-) create mode 100644 src/lib/workers/KokoroWorker.ts create mode 100644 src/lib/workers/kokoro.worker.ts diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index f6a4b0bc0a..c839804823 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -4,12 +4,18 @@ import { createEventDispatcher } from 'svelte'; import { onMount, tick, getContext } from 'svelte'; + import type { Writable } from 'svelte/store'; + import type { i18n as i18nType } from 'i18next'; const i18n = getContext>('i18n'); const dispatch = createEventDispatcher(); - import { config, models, settings, user } from '$lib/stores'; + import { createNewFeedback, getFeedbackById, updateFeedbackById } from '$lib/apis/evaluations'; + import { getChatById } from '$lib/apis/chats'; + import { generateTags } from '$lib/apis'; + + import { config, models, settings, TTSWorker, user } from '$lib/stores'; import { synthesizeOpenAISpeech } from '$lib/apis/audio'; import { imageGenerations } from '$lib/apis/images'; import { @@ -34,13 +40,8 @@ import Error from './Error.svelte'; import Citations from './Citations.svelte'; import CodeExecutions from './CodeExecutions.svelte'; - - import type { Writable } from 'svelte/store'; - import type { i18n as i18nType } from 'i18next'; import ContentRenderer from './ContentRenderer.svelte'; - import { createNewFeedback, getFeedbackById, updateFeedbackById } from '$lib/apis/evaluations'; - import { getChatById } from '$lib/apis/chats'; - import { generateTags } from '$lib/apis'; + import { KokoroWorker } from '$lib/workers/KokoroWorker'; interface MessageType { id: string; @@ -193,62 +194,7 @@ speaking = true; - if ($config.audio.tts.engine !== '') { - loadingSpeech = true; - - const messageContentParts: string[] = getMessageContentParts( - message.content, - $config?.audio?.tts?.split_on ?? 'punctuation' - ); - - if (!messageContentParts.length) { - console.log('No content to speak'); - toast.info($i18n.t('No content to speak')); - - speaking = false; - loadingSpeech = false; - return; - } - - console.debug('Prepared message content for TTS', messageContentParts); - - audioParts = messageContentParts.reduce( - (acc, _sentence, idx) => { - acc[idx] = null; - return acc; - }, - {} as typeof audioParts - ); - - let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately - - for (const [idx, sentence] of messageContentParts.entries()) { - const res = await synthesizeOpenAISpeech( - localStorage.token, - $settings?.audio?.tts?.defaultVoice === $config.audio.tts.voice - ? ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice) - : $config?.audio?.tts?.voice, - sentence - ).catch((error) => { - console.error(error); - toast.error(`${error}`); - - speaking = false; - loadingSpeech = false; - }); - - if (res) { - const blob = await res.blob(); - const blobUrl = URL.createObjectURL(blob); - const audio = new Audio(blobUrl); - audio.playbackRate = $settings.audio?.tts?.playbackRate ?? 1; - - audioParts[idx] = audio; - loadingSpeech = false; - lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx)); - } - } - } else { + if ($config.audio.tts.engine === '') { let voices = []; const getVoicesLoop = setInterval(() => { voices = speechSynthesis.getVoices(); @@ -283,6 +229,99 @@ speechSynthesis.speak(speak); } }, 100); + } else { + loadingSpeech = true; + + const messageContentParts: string[] = getMessageContentParts( + message.content, + $config?.audio?.tts?.split_on ?? 'punctuation' + ); + + if (!messageContentParts.length) { + console.log('No content to speak'); + toast.info($i18n.t('No content to speak')); + + speaking = false; + loadingSpeech = false; + return; + } + + console.debug('Prepared message content for TTS', messageContentParts); + + audioParts = messageContentParts.reduce( + (acc, _sentence, idx) => { + acc[idx] = null; + return acc; + }, + {} as typeof audioParts + ); + + let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately + + if ($settings.audio?.tts?.engine === 'browser-kokoro') { + if (!$TTSWorker) { + await TTSWorker.set( + new KokoroWorker({ + dtype: $settings.audio?.tts?.engineConfig?.dtype ?? 'fp32' + }) + ); + + await $TTSWorker.init(); + } + + console.log($TTSWorker); + + for (const [idx, sentence] of messageContentParts.entries()) { + const blob = await $TTSWorker + .generate({ + text: sentence, + voice: $settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice + }) + .catch((error) => { + console.error(error); + toast.error(`${error}`); + + speaking = false; + loadingSpeech = false; + }); + + if (blob) { + const audio = new Audio(blob); + audio.playbackRate = $settings.audio?.tts?.playbackRate ?? 1; + + audioParts[idx] = audio; + loadingSpeech = false; + lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx)); + } + } + } else { + for (const [idx, sentence] of messageContentParts.entries()) { + const res = await synthesizeOpenAISpeech( + localStorage.token, + $settings?.audio?.tts?.defaultVoice === $config.audio.tts.voice + ? ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice) + : $config?.audio?.tts?.voice, + sentence + ).catch((error) => { + console.error(error); + toast.error(`${error}`); + + speaking = false; + loadingSpeech = false; + }); + + if (res) { + const blob = await res.blob(); + const blobUrl = URL.createObjectURL(blob); + const audio = new Audio(blobUrl); + audio.playbackRate = $settings.audio?.tts?.playbackRate ?? 1; + + audioParts[idx] = audio; + loadingSpeech = false; + lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx)); + } + } + } } }; diff --git a/src/lib/components/chat/Settings/Audio.svelte b/src/lib/components/chat/Settings/Audio.svelte index 3f9fa9335b..ce9cae7717 100644 --- a/src/lib/components/chat/Settings/Audio.svelte +++ b/src/lib/components/chat/Settings/Audio.svelte @@ -1,11 +1,14 @@
{$i18n.t('TTS Settings')}
+
+
{$i18n.t('Text-to-Speech Engine')}
+
+ +
+
+ + {#if TTSEngine === 'browser-kokoro'} +
+
{$i18n.t('Kokoro.js Dtype')}
+
+ +
+
+ {/if} +
{$i18n.t('Auto-playback response')}
@@ -178,7 +285,46 @@
- {#if $config.audio.tts.engine === ''} + {#if TTSEngine === 'browser-kokoro'} + {#if TTSModel} +
+
{$i18n.t('Set Voice')}
+
+
+ + + + {#each voices as voice} + + {/each} + +
+
+
+ {:else} +
+
+ + +
+ {$i18n.t('Loading Kokoro.js...')} + {TTSModelProgress && TTSModelProgress.status === 'progress' + ? `(${Math.round(TTSModelProgress.progress * 10) / 10}%)` + : ''} +
+
+ +
+ {$i18n.t('Please do not close the settings page while loading the model.')} +
+
+ {/if} + {:else if $config.audio.tts.engine === ''}
{$i18n.t('Set Voice')}
diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index 1b88395567..f96670cb62 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -41,6 +41,8 @@ export const shortCodesToEmojis = writable( }, {}) ); +export const TTSWorker = writable(null); + export const chatId = writable(''); export const chatTitle = writable(''); diff --git a/src/lib/workers/KokoroWorker.ts b/src/lib/workers/KokoroWorker.ts new file mode 100644 index 0000000000..e5cc4b930f --- /dev/null +++ b/src/lib/workers/KokoroWorker.ts @@ -0,0 +1,70 @@ +import WorkerInstance from '$lib/workers/kokoro.worker?worker'; + +export class KokoroWorker { + private worker: Worker | null = null; + private initialized: boolean = false; + private dtype: string; + + constructor(dtype: string = 'fp32') { + this.dtype = dtype; + } + + public async init() { + if (this.worker) { + console.warn('KokoroWorker is already initialized.'); + return; + } + + this.worker = new WorkerInstance(); + + return new Promise((resolve, reject) => { + this.worker!.onmessage = (event) => { + const { status, error } = event.data; + + if (status === 'init:complete') { + this.initialized = true; + resolve(); + } else if (status === 'init:error') { + console.error(error); + this.initialized = false; + reject(new Error(error)); + } + }; + + this.worker!.postMessage({ + type: 'init', + payload: { dtype: this.dtype } + }); + }); + } + + public async generate({ text, voice }: { text: string; voice: string }): Promise { + if (!this.initialized || !this.worker) { + throw new Error('KokoroTTS Worker is not initialized yet.'); + } + + return new Promise((resolve, reject) => { + this.worker.postMessage({ type: 'generate', payload: { text, voice } }); + + const handleMessage = (event: MessageEvent) => { + if (event.data.status === 'generate:complete') { + this.worker!.removeEventListener('message', handleMessage); + resolve(event.data.audioUrl); + } else if (event.data.status === 'generate:error') { + this.worker!.removeEventListener('message', handleMessage); + reject(new Error(event.data.error)); + } + }; + + this.worker.addEventListener('message', handleMessage); + }); + } + + public terminate() { + if (this.worker) { + this.worker.terminate(); + this.worker = null; + this.initialized = false; + } + } +} diff --git a/src/lib/workers/kokoro.worker.ts b/src/lib/workers/kokoro.worker.ts new file mode 100644 index 0000000000..39277330fd --- /dev/null +++ b/src/lib/workers/kokoro.worker.ts @@ -0,0 +1,53 @@ +import { KokoroTTS } from 'kokoro-js'; + +let tts; +let isInitialized = false; // Flag to track initialization status +const DEFAULT_MODEL_ID = 'onnx-community/Kokoro-82M-v1.0-ONNX'; // Default model + +self.onmessage = async (event) => { + const { type, payload } = event.data; + + if (type === 'init') { + let { model_id, dtype } = payload; + model_id = model_id || DEFAULT_MODEL_ID; // Use default model if none provided + + self.postMessage({ status: 'init:start' }); + + try { + tts = await KokoroTTS.from_pretrained(model_id, { + dtype, + device: !!navigator?.gpu ? 'webgpu' : 'wasm' // Detect WebGPU + }); + isInitialized = true; // Mark as initialized after successful loading + self.postMessage({ status: 'init:complete' }); + } catch (error) { + isInitialized = false; // Ensure it's marked as false on failure + self.postMessage({ status: 'init:error', error: error.message }); + } + } + + if (type === 'generate') { + if (!isInitialized || !tts) { + // Ensure model is initialized + self.postMessage({ status: 'generate:error', error: 'TTS model not initialized' }); + return; + } + + const { text, voice } = payload; + self.postMessage({ status: 'generate:start' }); + + try { + const rawAudio = await tts.generate(text, { voice }); + const blob = await rawAudio.toBlob(); + const blobUrl = URL.createObjectURL(blob); + self.postMessage({ status: 'generate:complete', audioUrl: blobUrl }); + } catch (error) { + self.postMessage({ status: 'generate:error', error: error.message }); + } + } + + if (type === 'status') { + // Respond with the current initialization status + self.postMessage({ status: 'status:check', initialized: isInitialized }); + } +}; From d95e5e0ba5dd8ce9b2b94866ca6ee4fcb720e57a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 9 Feb 2025 23:54:24 -0800 Subject: [PATCH 061/117] enh: kokorojs call support --- src/lib/components/chat/MessageInput.svelte | 14 +++- .../chat/MessageInput/CallOverlay.svelte | 19 ++++- .../chat/Messages/ResponseMessage.svelte | 2 - src/lib/workers/KokoroWorker.ts | 84 +++++++++++++------ 4 files changed, 90 insertions(+), 29 deletions(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 261be72ede..f9c6786f6c 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -16,7 +16,8 @@ showCallOverlay, tools, user as _user, - showControls + showControls, + TTSWorker } from '$lib/stores'; import { blobToFile, compressImage, createMessagesList, findWordIndices } from '$lib/utils'; @@ -43,6 +44,7 @@ import PhotoSolid from '../icons/PhotoSolid.svelte'; import Photo from '../icons/Photo.svelte'; import CommandLine from '../icons/CommandLine.svelte'; + import { KokoroWorker } from '$lib/workers/KokoroWorker'; const i18n = getContext('i18n'); @@ -1281,6 +1283,16 @@ stream = null; + if (!$TTSWorker) { + await TTSWorker.set( + new KokoroWorker({ + dtype: $settings.audio?.tts?.engineConfig?.dtype ?? 'fp32' + }) + ); + + await $TTSWorker.init(); + } + showCallOverlay.set(true); showControls.set(true); } catch (err) { diff --git a/src/lib/components/chat/MessageInput/CallOverlay.svelte b/src/lib/components/chat/MessageInput/CallOverlay.svelte index 466fe7950d..c7a2d4d1e4 100644 --- a/src/lib/components/chat/MessageInput/CallOverlay.svelte +++ b/src/lib/components/chat/MessageInput/CallOverlay.svelte @@ -1,5 +1,5 @@ + + { + await submitHandler(); + saveHandler(); + }} +> +
+ {#if config} +
+
+ {$i18n.t('Code Interpreter')} +
+ +
+
+
+ {$i18n.t('Enable Code Interpreter')} +
+ + +
+
+ +
+
{$i18n.t('Code Interpreter Engine')}
+
+ +
+
+ + {#if config.CODE_INTERPRETER_ENGINE === 'jupyter'} +
+
+ {$i18n.t('Jupyter Kernel Gateway URL')} +
+ +
+
+ +
+
+
+ +
+
+ {$i18n.t('Jupyter Kernel Gateway Auth')} +
+ +
+ +
+
+ + {#if config.CODE_INTERPRETER_JUPYTER_AUTH} +
+
+ {#if config.CODE_INTERPRETER_JUPYTER_AUTH === 'password'} + + {:else} + + {/if} +
+
+ {/if} + {/if} +
+ + + {/if} +
+
+ +
+ From abfe8687327d2f0e1558fe46af0e335f0a1ae546 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 10 Feb 2025 02:28:01 -0800 Subject: [PATCH 066/117] enh: code interpreter global toggle --- backend/open_webui/main.py | 5 +++-- src/lib/components/chat/Chat.svelte | 3 ++- src/lib/components/chat/MessageInput.svelte | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index d9f1408ba4..2b741a2bce 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1040,13 +1040,14 @@ async def get_app_config(request: Request): { "enable_channels": app.state.config.ENABLE_CHANNELS, "enable_web_search": app.state.config.ENABLE_RAG_WEB_SEARCH, - "enable_google_drive_integration": app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION, + "enable_code_interpreter": app.state.config.ENABLE_CODE_INTERPRETER, "enable_image_generation": app.state.config.ENABLE_IMAGE_GENERATION, + "enable_autocomplete_generation": app.state.config.ENABLE_AUTOCOMPLETE_GENERATION, "enable_community_sharing": app.state.config.ENABLE_COMMUNITY_SHARING, "enable_message_rating": app.state.config.ENABLE_MESSAGE_RATING, - "enable_autocomplete_generation": app.state.config.ENABLE_AUTOCOMPLETE_GENERATION, "enable_admin_export": ENABLE_ADMIN_EXPORT, "enable_admin_chat_access": ENABLE_ADMIN_CHAT_ACCESS, + "enable_google_drive_integration": app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION, } if user is not None else {} diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index cc14f2c6fe..2348d42fe4 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1556,7 +1556,8 @@ ? imageGenerationEnabled : false, code_interpreter: - $user.role === 'admin' || $user?.permissions?.features?.code_interpreter + $config?.features?.enable_code_interpreter && + ($user.role === 'admin' || $user?.permissions?.features?.code_interpreter) ? codeInterpreterEnabled : false, web_search: diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index f9c6786f6c..3ab5d05fed 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1171,7 +1171,7 @@ {/if} - {#if $_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter} + {#if $config?.features?.enable_code_interpreter && ($_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter)}
- {:else if $mobile && ($user.role === 'admin' || $user?.permissions.chat?.controls)} + {:else if $mobile && ($user.role === 'admin' || $user?.permissions?.chat?.controls)} + +
+ +
+ {#each config?.OPENAI_API_BASE_URLS ?? [] as url, idx} + { + updateHandler(); + }} + onDelete={() => { + config.OPENAI_API_BASE_URLS = config.OPENAI_API_BASE_URLS.filter( + (url, urlIdx) => idx !== urlIdx + ); + config.OPENAI_API_KEYS = config.OPENAI_API_KEYS.filter( + (key, keyIdx) => idx !== keyIdx + ); + + let newConfig = {}; + config.OPENAI_API_BASE_URLS.forEach((url, newIdx) => { + newConfig[newIdx] = + config.OPENAI_API_CONFIGS[newIdx < idx ? newIdx : newIdx + 1]; + }); + config.OPENAI_API_CONFIGS = newConfig; + }} + /> + {/each} +
+
+ {/if} +
+
+ +
+
+ +
+ +
+ diff --git a/src/lib/components/chat/Settings/Connections/Connection.svelte b/src/lib/components/chat/Settings/Connections/Connection.svelte new file mode 100644 index 0000000000..6c8475b4b2 --- /dev/null +++ b/src/lib/components/chat/Settings/Connections/Connection.svelte @@ -0,0 +1,106 @@ + + + { + url = connection.url; + key = connection.key; + config = connection.config; + onSubmit(connection); + }} +/> + +
+ + {#if !(config?.enable ?? true)} +
+ {/if} +
+
+ + + {#if pipeline} +
+ + + + + + + +
+ {/if} +
+ + +
+
+ +
+ + + +
+
diff --git a/src/lib/components/chat/SettingsModal.svelte b/src/lib/components/chat/SettingsModal.svelte index 93ed327c1e..fdf6d7ace6 100644 --- a/src/lib/components/chat/SettingsModal.svelte +++ b/src/lib/components/chat/SettingsModal.svelte @@ -1,7 +1,7 @@ - +
-
-
-
{$i18n.t('Direct Connections')}
+
+
+
+
{$i18n.t('Manage Direct Connections')}
+ + + + +
+ +
+ {#each config?.OPENAI_API_BASE_URLS ?? [] as url, idx} + { + updateHandler(); + }} + onDelete={() => { + config.OPENAI_API_BASE_URLS = config.OPENAI_API_BASE_URLS.filter( + (url, urlIdx) => idx !== urlIdx + ); + config.OPENAI_API_KEYS = config.OPENAI_API_KEYS.filter( + (key, keyIdx) => idx !== keyIdx + ); + + let newConfig = {}; + config.OPENAI_API_BASE_URLS.forEach((url, newIdx) => { + newConfig[newIdx] = + config.OPENAI_API_CONFIGS[newIdx < idx ? newIdx : newIdx + 1]; + }); + config.OPENAI_API_CONFIGS = newConfig; + }} + /> + {/each} +
+
+
{$i18n.t('Connect to your own OpenAI compatible API endpoints.')}
- - {#if false} -
- -
-
-
{$i18n.t('Manage Connections')}
- - - - -
- -
- {#each config?.OPENAI_API_BASE_URLS ?? [] as url, idx} - { - updateHandler(); - }} - onDelete={() => { - config.OPENAI_API_BASE_URLS = config.OPENAI_API_BASE_URLS.filter( - (url, urlIdx) => idx !== urlIdx - ); - config.OPENAI_API_KEYS = config.OPENAI_API_KEYS.filter( - (key, keyIdx) => idx !== keyIdx - ); - - let newConfig = {}; - config.OPENAI_API_BASE_URLS.forEach((url, newIdx) => { - newConfig[newIdx] = - config.OPENAI_API_CONFIGS[newIdx < idx ? newIdx : newIdx + 1]; - }); - config.OPENAI_API_CONFIGS = newConfig; - }} - /> - {/each} -
-
- {/if}
- -
From cd2f4142d55709e5b09fae0c0ff11f49ac1643ae Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 11 Feb 2025 23:42:31 -0800 Subject: [PATCH 091/117] fix: user settings save issue --- backend/open_webui/models/users.py | 18 ++++++++++++++++++ backend/open_webui/routers/users.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/models/users.py b/backend/open_webui/models/users.py index 5c196281f7..605299528d 100644 --- a/backend/open_webui/models/users.py +++ b/backend/open_webui/models/users.py @@ -271,6 +271,24 @@ class UsersTable: except Exception: return None + def update_user_settings_by_id(self, id: str, updated: dict) -> Optional[UserModel]: + try: + with get_db() as db: + user_settings = db.query(User).filter_by(id=id).first().settings + + if user_settings is None: + user_settings = {} + + user_settings.update(updated) + + db.query(User).filter_by(id=id).update({"settings": user_settings}) + db.commit() + + user = db.query(User).filter_by(id=id).first() + return UserModel.model_validate(user) + except Exception: + return None + def delete_user_by_id(self, id: str) -> bool: try: # Remove User from Groups diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index ddcaef7674..872212d3ce 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -153,7 +153,7 @@ async def get_user_settings_by_session_user(user=Depends(get_verified_user)): async def update_user_settings_by_session_user( form_data: UserSettings, user=Depends(get_verified_user) ): - user = Users.update_user_by_id(user.id, {"settings": form_data.model_dump()}) + user = Users.update_user_settings_by_id(user.id, form_data.model_dump()) if user: return user.settings else: From 982b1fb7e205d145e940aaae5aca87b4811c9f6b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 00:08:51 -0800 Subject: [PATCH 092/117] wip: direct connections --- .../chat/Settings/Connections.svelte | 168 +++++++++++------- .../Settings/Connections/Connection.svelte | 23 --- 2 files changed, 108 insertions(+), 83 deletions(-) diff --git a/src/lib/components/chat/Settings/Connections.svelte b/src/lib/components/chat/Settings/Connections.svelte index 3700f90e4c..4c0d54595b 100644 --- a/src/lib/components/chat/Settings/Connections.svelte +++ b/src/lib/components/chat/Settings/Connections.svelte @@ -6,7 +6,7 @@ const dispatch = createEventDispatcher(); const i18n = getContext('i18n'); - import { models, user } from '$lib/stores'; + import { models, settings, user } from '$lib/stores'; import Switch from '$lib/components/common/Switch.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; @@ -16,84 +16,132 @@ import AddConnectionModal from '$lib/components/AddConnectionModal.svelte'; - const getModels = async () => { - const models = await _getModels(localStorage.token); - return models; - }; + export let saveSettings: Function; let config = null; let showConnectionModal = false; - onMount(async () => {}); + const addConnectionHandler = async (connection) => { + config.OPENAI_API_BASE_URLS.push(connection.url); + config.OPENAI_API_KEYS.push(connection.key); + config.OPENAI_API_CONFIGS[config.OPENAI_API_BASE_URLS.length - 1] = connection.config; - const addConnectionHandler = async (connection) => {}; + await updateHandler(); + }; - const submitHandler = async () => {}; - const updateHandler = async () => {}; + const updateHandler = async () => { + // Remove trailing slashes + config.OPENAI_API_BASE_URLS = config.OPENAI_API_BASE_URLS.map((url) => url.replace(/\/$/, '')); + + // Check if API KEYS length is same than API URLS length + if (config.OPENAI_API_KEYS.length !== config.OPENAI_API_BASE_URLS.length) { + // if there are more keys than urls, remove the extra keys + if (config.OPENAI_API_KEYS.length > config.OPENAI_API_BASE_URLS.length) { + config.OPENAI_API_KEYS = config.OPENAI_API_KEYS.slice( + 0, + config.OPENAI_API_BASE_URLS.length + ); + } + + // if there are more urls than keys, add empty keys + if (config.OPENAI_API_KEYS.length < config.OPENAI_API_BASE_URLS.length) { + const diff = config.OPENAI_API_BASE_URLS.length - config.OPENAI_API_KEYS.length; + for (let i = 0; i < diff; i++) { + config.OPENAI_API_KEYS.push(''); + } + } + } + + await saveSettings({ + directConnections: config + }); + }; + + const submitHandler = async () => { + await updateHandler(); + + await saveSettings({ + directConnections: config + }); + }; + + onMount(async () => { + config = $settings?.directConnections ?? { + OPENAI_API_BASE_URLS: [], + OPENAI_API_KEYS: [], + OPENAI_API_CONFIGS: {} + }; + });
-
-
-
-
-
{$i18n.t('Manage Direct Connections')}
+ {#if config !== null} +
+
+
+
+
{$i18n.t('Manage Direct Connections')}
- - - + + + +
+ +
+ {#each config?.OPENAI_API_BASE_URLS ?? [] as url, idx} + { + updateHandler(); + }} + onDelete={() => { + config.OPENAI_API_BASE_URLS = config.OPENAI_API_BASE_URLS.filter( + (url, urlIdx) => idx !== urlIdx + ); + config.OPENAI_API_KEYS = config.OPENAI_API_KEYS.filter( + (key, keyIdx) => idx !== keyIdx + ); + + let newConfig = {}; + config.OPENAI_API_BASE_URLS.forEach((url, newIdx) => { + newConfig[newIdx] = + config.OPENAI_API_CONFIGS[newIdx < idx ? newIdx : newIdx + 1]; + }); + config.OPENAI_API_CONFIGS = newConfig; + }} + /> + {/each} +
-
- {#each config?.OPENAI_API_BASE_URLS ?? [] as url, idx} - { - updateHandler(); - }} - onDelete={() => { - config.OPENAI_API_BASE_URLS = config.OPENAI_API_BASE_URLS.filter( - (url, urlIdx) => idx !== urlIdx - ); - config.OPENAI_API_KEYS = config.OPENAI_API_KEYS.filter( - (key, keyIdx) => idx !== keyIdx - ); - - let newConfig = {}; - config.OPENAI_API_BASE_URLS.forEach((url, newIdx) => { - newConfig[newIdx] = - config.OPENAI_API_CONFIGS[newIdx < idx ? newIdx : newIdx + 1]; - }); - config.OPENAI_API_CONFIGS = newConfig; - }} - /> - {/each} -
-
- -
- -
-
- {$i18n.t('Connect to your own OpenAI compatible API endpoints.')} +
+
+ {$i18n.t('Connect to your own OpenAI compatible API endpoints.')} +
-
+ {:else} +
+
+ +
+
+ {/if}
diff --git a/src/lib/components/chat/Settings/Connections/Connection.svelte b/src/lib/components/chat/Settings/Connections/Connection.svelte index 6c8475b4b2..ef605876ec 100644 --- a/src/lib/components/chat/Settings/Connections/Connection.svelte +++ b/src/lib/components/chat/Settings/Connections/Connection.svelte @@ -57,29 +57,6 @@ bind:value={url} autocomplete="off" /> - - {#if pipeline} -
- - - - - - - -
- {/if}
Date: Wed, 12 Feb 2025 09:11:26 +0100 Subject: [PATCH 093/117] added support for API tool_calls if stream false --- backend/open_webui/utils/misc.py | 9 ++++++- backend/open_webui/utils/response.py | 39 +++++++++++++++++----------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 99e6d9c392..42559a4312 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -217,12 +217,19 @@ def openai_chat_chunk_message_template( def openai_chat_completion_message_template( - model: str, message: Optional[str] = None, usage: Optional[dict] = None + model: str, + message: Optional[str] = None, + tool_calls: Optional[list[dict]] = None, + usage: Optional[dict] = None ) -> dict: template = openai_chat_message_template(model) template["object"] = "chat.completion" if message is not None: template["choices"][0]["message"] = {"content": message, "role": "assistant"} + + if tool_calls: + template["choices"][0]["tool_calls"] = tool_calls + template["choices"][0]["finish_reason"] = "stop" if usage: diff --git a/backend/open_webui/utils/response.py b/backend/open_webui/utils/response.py index 4917d3852f..9e9e932328 100644 --- a/backend/open_webui/utils/response.py +++ b/backend/open_webui/utils/response.py @@ -6,9 +6,31 @@ from open_webui.utils.misc import ( ) +def conver_ollama_tool_call_to_openai(tool_calls: dict) -> dict: + openai_tool_calls = [] + for tool_call in tool_calls: + openai_tool_call = { + "index": tool_call.get("index", 0), + "id": tool_call.get("id", f"call_{str(uuid4())}"), + "type": "function", + "function": { + "name": tool_call.get("function", {}).get("name", ""), + "arguments": json.dumps( + tool_call.get('function', {}).get('arguments', {}) + ), + }, + } + openai_tool_calls.append(openai_tool_call) + return openai_tool_calls + def convert_response_ollama_to_openai(ollama_response: dict) -> dict: model = ollama_response.get("model", "ollama") message_content = ollama_response.get("message", {}).get("content", "") + tool_calls = ollama_response.get("message", {}).get("tool_calls", None) + openai_tool_calls = None + + if tool_calls: + openai_tool_calls = conver_ollama_tool_call_to_openai(tool_calls) data = ollama_response usage = { @@ -51,7 +73,7 @@ def convert_response_ollama_to_openai(ollama_response: dict) -> dict: ), } - response = openai_chat_completion_message_template(model, message_content, usage) + response = openai_chat_completion_message_template(model, message_content, openai_tool_calls, usage) return response @@ -65,20 +87,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response) openai_tool_calls = None if tool_calls: - openai_tool_calls = [] - for tool_call in tool_calls: - openai_tool_call = { - "index": tool_call.get("index", 0), - "id": tool_call.get("id", f"call_{str(uuid4())}"), - "type": "function", - "function": { - "name": tool_call.get("function", {}).get("name", ""), - "arguments": json.dumps( - tool_call.get("function", {}).get("arguments", {}) - ), - }, - } - openai_tool_calls.append(openai_tool_call) + openai_tool_calls = conver_ollama_tool_call_to_openai(tool_calls) done = data.get("done", False) From 431e97b03abe366c26bfd3fb44d250869590b0cd Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 01:17:30 -0800 Subject: [PATCH 094/117] wip: direct models --- src/lib/apis/index.ts | 77 ++++++++++++++++++- src/lib/apis/openai/index.ts | 27 +++++++ src/lib/components/admin/Functions.svelte | 14 ++-- .../components/admin/Settings/Audio.svelte | 10 ++- .../admin/Settings/Connections.svelte | 4 +- .../admin/Settings/Evaluations.svelte | 10 +-- .../components/admin/Settings/Models.svelte | 10 ++- .../Models/Manage/ManageOllama.svelte | 10 +-- .../admin/Settings/Pipelines.svelte | 10 +-- .../chat/ModelSelector/Selector.svelte | 30 +++++++- .../chat/Settings/Connections.svelte | 15 ++-- src/lib/components/chat/SettingsModal.svelte | 6 +- src/lib/components/workspace/Models.svelte | 12 ++- src/routes/(app)/+layout.svelte | 2 +- .../(app)/admin/functions/create/+page.svelte | 4 +- .../(app)/admin/functions/edit/+page.svelte | 4 +- .../(app)/workspace/models/+page.svelte | 4 +- .../workspace/models/create/+page.svelte | 2 +- .../(app)/workspace/models/edit/+page.svelte | 2 +- src/routes/s/[id]/+page.svelte | 2 +- 20 files changed, 194 insertions(+), 61 deletions(-) diff --git a/src/lib/apis/index.ts b/src/lib/apis/index.ts index c7fd78819c..d1be9c2105 100644 --- a/src/lib/apis/index.ts +++ b/src/lib/apis/index.ts @@ -1,6 +1,11 @@ import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants'; +import { getOpenAIModelsDirect } from './openai'; -export const getModels = async (token: string = '', base: boolean = false) => { +export const getModels = async ( + token: string = '', + connections: object | null = null, + base: boolean = false +) => { let error = null; const res = await fetch(`${WEBUI_BASE_URL}/api/models${base ? '/base' : ''}`, { method: 'GET', @@ -25,6 +30,76 @@ export const getModels = async (token: string = '', base: boolean = false) => { } let models = res?.data ?? []; + + if (connections && !base) { + let localModels = []; + + if (connections) { + const OPENAI_API_BASE_URLS = connections.OPENAI_API_BASE_URLS; + const OPENAI_API_KEYS = connections.OPENAI_API_KEYS; + const OPENAI_API_CONFIGS = connections.OPENAI_API_CONFIGS; + + const requests = []; + for (const idx in OPENAI_API_BASE_URLS) { + const url = OPENAI_API_BASE_URLS[idx]; + + if (idx.toString() in OPENAI_API_CONFIGS) { + const apiConfig = OPENAI_API_CONFIGS[idx.toString()] ?? {}; + + const enable = apiConfig?.enable ?? true; + const modelIds = apiConfig?.model_ids ?? []; + + if (enable) { + if (modelIds.length > 0) { + const modelList = { + object: 'list', + data: modelIds.map((modelId) => ({ + id: modelId, + name: modelId, + owned_by: 'openai', + openai: { id: modelId }, + urlIdx: idx + })) + }; + + requests.push(() => modelList); + } else { + requests.push(getOpenAIModelsDirect(url, OPENAI_API_KEYS[idx])); + } + } else { + requests.push(() => {}); + } + } + } + const responses = await Promise.all(requests); + + for (const idx in responses) { + const response = responses[idx]; + const apiConfig = OPENAI_API_CONFIGS[idx.toString()] ?? {}; + + let models = Array.isArray(response) ? response : (response?.data ?? []); + models = models.map((model) => ({ ...model, openai: { id: model.id }, urlIdx: idx })); + + const prefixId = apiConfig.prefix_id; + if (prefixId) { + for (const model of models) { + model.id = `${prefixId}.${model.id}`; + } + } + + localModels = localModels.concat(models); + } + } + + models = models.concat( + localModels.map((model) => ({ + ...model, + name: model?.name ?? model?.id, + direct: true + })) + ); + } + return models; }; diff --git a/src/lib/apis/openai/index.ts b/src/lib/apis/openai/index.ts index 53f369e017..bab2d6e36a 100644 --- a/src/lib/apis/openai/index.ts +++ b/src/lib/apis/openai/index.ts @@ -208,6 +208,33 @@ export const updateOpenAIKeys = async (token: string = '', keys: string[]) => { return res.OPENAI_API_KEYS; }; +export const getOpenAIModelsDirect = async (url: string, key: string) => { + let error = null; + + const res = await fetch(`${url}/models`, { + method: 'GET', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + ...(key && { authorization: `Bearer ${key}` }) + } + }) + .then(async (res) => { + if (!res.ok) throw await res.json(); + return res.json(); + }) + .catch((err) => { + error = `OpenAI: ${err?.error?.message ?? 'Network Problem'}`; + return []; + }); + + if (error) { + throw error; + } + + return res; +}; + export const getOpenAIModels = async (token: string, urlIdx?: number) => { let error = null; diff --git a/src/lib/components/admin/Functions.svelte b/src/lib/components/admin/Functions.svelte index f7814ce91a..67bfc0499e 100644 --- a/src/lib/components/admin/Functions.svelte +++ b/src/lib/components/admin/Functions.svelte @@ -3,7 +3,7 @@ import fileSaver from 'file-saver'; const { saveAs } = fileSaver; - import { WEBUI_NAME, config, functions, models } from '$lib/stores'; + import { WEBUI_NAME, config, functions, models, settings } from '$lib/stores'; import { onMount, getContext, tick } from 'svelte'; import { goto } from '$app/navigation'; @@ -126,7 +126,7 @@ toast.success($i18n.t('Function deleted successfully')); functions.set(await getFunctions(localStorage.token)); - models.set(await getModels(localStorage.token)); + models.set(await getModels(localStorage.token, $settings?.directConnections ?? null)); } }; @@ -147,7 +147,7 @@ } functions.set(await getFunctions(localStorage.token)); - models.set(await getModels(localStorage.token)); + models.set(await getModels(localStorage.token, $settings?.directConnections ?? null)); } }; @@ -359,7 +359,9 @@ bind:state={func.is_active} on:change={async (e) => { toggleFunctionById(localStorage.token, func.id); - models.set(await getModels(localStorage.token)); + models.set( + await getModels(localStorage.token, $settings?.directConnections ?? null) + ); }} /> @@ -496,7 +498,7 @@ id={selectedFunction?.id ?? null} on:save={async () => { await tick(); - models.set(await getModels(localStorage.token)); + models.set(await getModels(localStorage.token, $settings?.directConnections ?? null)); }} /> @@ -517,7 +519,7 @@ toast.success($i18n.t('Functions imported successfully')); functions.set(await getFunctions(localStorage.token)); - models.set(await getModels(localStorage.token)); + models.set(await getModels(localStorage.token, $settings?.directConnections ?? null)); }; reader.readAsText(importFiles[0]); diff --git a/src/lib/components/admin/Settings/Audio.svelte b/src/lib/components/admin/Settings/Audio.svelte index 69dcb55fad..ca4401029e 100644 --- a/src/lib/components/admin/Settings/Audio.svelte +++ b/src/lib/components/admin/Settings/Audio.svelte @@ -10,7 +10,7 @@ getModels as _getModels, getVoices as _getVoices } from '$lib/apis/audio'; - import { config } from '$lib/stores'; + import { config, settings } from '$lib/stores'; import SensitiveInput from '$lib/components/common/SensitiveInput.svelte'; @@ -51,9 +51,11 @@ if (TTS_ENGINE === '') { models = []; } else { - const res = await _getModels(localStorage.token).catch((e) => { - toast.error(`${e}`); - }); + const res = await _getModels(localStorage.token, $settings?.directConnections ?? null).catch( + (e) => { + toast.error(`${e}`); + } + ); if (res) { console.log(res); diff --git a/src/lib/components/admin/Settings/Connections.svelte b/src/lib/components/admin/Settings/Connections.svelte index 893f45602b..a4254ae4cf 100644 --- a/src/lib/components/admin/Settings/Connections.svelte +++ b/src/lib/components/admin/Settings/Connections.svelte @@ -9,7 +9,7 @@ import { getModels as _getModels } from '$lib/apis'; import { getDirectConnectionsConfig, setDirectConnectionsConfig } from '$lib/apis/configs'; - import { models, user } from '$lib/stores'; + import { models, settings, user } from '$lib/stores'; import Switch from '$lib/components/common/Switch.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; @@ -23,7 +23,7 @@ const i18n = getContext('i18n'); const getModels = async () => { - const models = await _getModels(localStorage.token); + const models = await _getModels(localStorage.token, $settings?.directConnections ?? null); return models; }; diff --git a/src/lib/components/admin/Settings/Evaluations.svelte b/src/lib/components/admin/Settings/Evaluations.svelte index c0d1b4f32f..41c76d94ae 100644 --- a/src/lib/components/admin/Settings/Evaluations.svelte +++ b/src/lib/components/admin/Settings/Evaluations.svelte @@ -1,6 +1,6 @@ -
+
{#if title !== null} From 361a98980e7cc7763d16f5522a05c7188bab4c0e Mon Sep 17 00:00:00 2001 From: Feynman Liang Date: Wed, 12 Feb 2025 13:49:37 -0800 Subject: [PATCH 100/117] Retab collapsible --- src/lib/components/common/Collapsible.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/common/Collapsible.svelte b/src/lib/components/common/Collapsible.svelte index c2290a6dce..c06b525b8d 100644 --- a/src/lib/components/common/Collapsible.svelte +++ b/src/lib/components/common/Collapsible.svelte @@ -34,7 +34,7 @@ import Spinner from './Spinner.svelte'; export let open = false; - export let id = ''; + export let id = ''; export let className = ''; export let buttonClassName = 'w-fit text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition'; From 9f9adce72caa8f7490ca9784919f70e8494e7c50 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 14:23:53 -0800 Subject: [PATCH 101/117] fix --- src/routes/(app)/workspace/models/create/+page.svelte | 2 +- src/routes/(app)/workspace/models/edit/+page.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(app)/workspace/models/create/+page.svelte b/src/routes/(app)/workspace/models/create/+page.svelte index 2518db7607..fddf8277be 100644 --- a/src/routes/(app)/workspace/models/create/+page.svelte +++ b/src/routes/(app)/workspace/models/create/+page.svelte @@ -2,7 +2,7 @@ import { v4 as uuidv4 } from 'uuid'; import { toast } from 'svelte-sonner'; import { goto } from '$app/navigation'; - import { models } from '$lib/stores'; + import { config, models, settings } from '$lib/stores'; import { onMount, tick, getContext } from 'svelte'; import { createNewModel, getModelById } from '$lib/apis/models'; diff --git a/src/routes/(app)/workspace/models/edit/+page.svelte b/src/routes/(app)/workspace/models/edit/+page.svelte index df2ff21d7f..1ff9652c6f 100644 --- a/src/routes/(app)/workspace/models/edit/+page.svelte +++ b/src/routes/(app)/workspace/models/edit/+page.svelte @@ -6,7 +6,7 @@ const i18n = getContext('i18n'); import { page } from '$app/stores'; - import { config, models } from '$lib/stores'; + import { config, models, settings } from '$lib/stores'; import { getModelById, updateModelById } from '$lib/apis/models'; From 67958c02b4a48bef3bc3f22847fbb4fe1c486aac Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 14:29:43 -0800 Subject: [PATCH 102/117] refac --- src/lib/components/admin/Settings/General.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte index 0dea5a1e81..7423a314ff 100644 --- a/src/lib/components/admin/Settings/General.svelte +++ b/src/lib/components/admin/Settings/General.svelte @@ -144,7 +144,7 @@
From b0ade6c04c2b52f97c8c80990e923ad8353f038e Mon Sep 17 00:00:00 2001 From: Simone Date: Thu, 13 Feb 2025 07:04:02 +0100 Subject: [PATCH 103/117] Fixed typo --- backend/open_webui/utils/response.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/utils/response.py b/backend/open_webui/utils/response.py index 9e9e932328..90e84fa81a 100644 --- a/backend/open_webui/utils/response.py +++ b/backend/open_webui/utils/response.py @@ -6,7 +6,7 @@ from open_webui.utils.misc import ( ) -def conver_ollama_tool_call_to_openai(tool_calls: dict) -> dict: +def convert_ollama_tool_call_to_openai(tool_calls: dict) -> dict: openai_tool_calls = [] for tool_call in tool_calls: openai_tool_call = { @@ -30,7 +30,7 @@ def convert_response_ollama_to_openai(ollama_response: dict) -> dict: openai_tool_calls = None if tool_calls: - openai_tool_calls = conver_ollama_tool_call_to_openai(tool_calls) + openai_tool_calls = convert_ollama_tool_call_to_openai(tool_calls) data = ollama_response usage = { @@ -87,7 +87,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response) openai_tool_calls = None if tool_calls: - openai_tool_calls = conver_ollama_tool_call_to_openai(tool_calls) + openai_tool_calls = convert_ollama_tool_call_to_openai(tool_calls) done = data.get("done", False) From c83e68282d4f099d478a3f413d598219ff042292 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 22:56:33 -0800 Subject: [PATCH 104/117] feat: direct connections integration --- backend/open_webui/main.py | 49 +++-- backend/open_webui/routers/tasks.py | 62 +++++- backend/open_webui/utils/chat.py | 263 ++++++++++++++++++------- backend/open_webui/utils/middleware.py | 11 +- src/lib/components/chat/Chat.svelte | 3 + src/routes/+layout.svelte | 93 ++++++++- 6 files changed, 387 insertions(+), 94 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 1de0348c32..0311e82d84 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -900,20 +900,30 @@ async def chat_completion( if not request.app.state.MODELS: await get_all_models(request) + model_item = form_data.pop("model_item", {}) tasks = form_data.pop("background_tasks", None) - try: - model_id = form_data.get("model", None) - if model_id not in request.app.state.MODELS: - raise Exception("Model not found") - model = request.app.state.MODELS[model_id] - model_info = Models.get_model_by_id(model_id) - # Check if user has access to the model - if not BYPASS_MODEL_ACCESS_CONTROL and user.role == "user": - try: - check_model_access(user, model) - except Exception as e: - raise e + try: + if not model_item.get("direct", False): + model_id = form_data.get("model", None) + if model_id not in request.app.state.MODELS: + raise Exception("Model not found") + + model = request.app.state.MODELS[model_id] + model_info = Models.get_model_by_id(model_id) + + # Check if user has access to the model + if not BYPASS_MODEL_ACCESS_CONTROL and user.role == "user": + try: + check_model_access(user, model) + except Exception as e: + raise e + else: + model = model_item + model_info = None + + request.state.direct = True + request.state.model = model metadata = { "user_id": user.id, @@ -925,6 +935,7 @@ async def chat_completion( "features": form_data.get("features", None), "variables": form_data.get("variables", None), "model": model_info, + "direct": model_item.get("direct", False), **( {"function_calling": "native"} if form_data.get("params", {}).get("function_calling") == "native" @@ -936,6 +947,7 @@ async def chat_completion( else {} ), } + request.state.metadata = metadata form_data["metadata"] = metadata form_data, metadata, events = await process_chat_payload( @@ -943,6 +955,7 @@ async def chat_completion( ) except Exception as e: + log.debug(f"Error processing chat payload: {e}") raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=str(e), @@ -971,6 +984,12 @@ async def chat_completed( request: Request, form_data: dict, user=Depends(get_verified_user) ): try: + model_item = form_data.pop("model_item", {}) + + if model_item.get("direct", False): + request.state.direct = True + request.state.model = model_item + return await chat_completed_handler(request, form_data, user) except Exception as e: raise HTTPException( @@ -984,6 +1003,12 @@ async def chat_action( request: Request, action_id: str, form_data: dict, user=Depends(get_verified_user) ): try: + model_item = form_data.pop("model_item", {}) + + if model_item.get("direct", False): + request.state.direct = True + request.state.model = model_item + return await chat_action_handler(request, action_id, form_data, user) except Exception as e: raise HTTPException( diff --git a/backend/open_webui/routers/tasks.py b/backend/open_webui/routers/tasks.py index f56a0232dd..c885d764b2 100644 --- a/backend/open_webui/routers/tasks.py +++ b/backend/open_webui/routers/tasks.py @@ -139,7 +139,12 @@ async def update_task_config( async def generate_title( request: Request, form_data: dict, user=Depends(get_verified_user) ): - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS model_id = form_data["model"] if model_id not in models: @@ -198,6 +203,7 @@ async def generate_title( } ), "metadata": { + **(request.state.metadata if request.state.metadata else {}), "task": str(TASKS.TITLE_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -225,7 +231,12 @@ async def generate_chat_tags( content={"detail": "Tags generation is disabled"}, ) - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS model_id = form_data["model"] if model_id not in models: @@ -261,6 +272,7 @@ async def generate_chat_tags( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { + **(request.state.metadata if request.state.metadata else {}), "task": str(TASKS.TAGS_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -281,7 +293,12 @@ async def generate_chat_tags( async def generate_image_prompt( request: Request, form_data: dict, user=Depends(get_verified_user) ): - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS model_id = form_data["model"] if model_id not in models: @@ -321,6 +338,7 @@ async def generate_image_prompt( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { + **(request.state.metadata if request.state.metadata else {}), "task": str(TASKS.IMAGE_PROMPT_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -356,7 +374,12 @@ async def generate_queries( detail=f"Query generation is disabled", ) - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS model_id = form_data["model"] if model_id not in models: @@ -392,6 +415,7 @@ async def generate_queries( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { + **(request.state.metadata if request.state.metadata else {}), "task": str(TASKS.QUERY_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -431,7 +455,12 @@ async def generate_autocompletion( detail=f"Input prompt exceeds maximum length of {request.app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH}", ) - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS model_id = form_data["model"] if model_id not in models: @@ -467,6 +496,7 @@ async def generate_autocompletion( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { + **(request.state.metadata if request.state.metadata else {}), "task": str(TASKS.AUTOCOMPLETE_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -488,7 +518,12 @@ async def generate_emoji( request: Request, form_data: dict, user=Depends(get_verified_user) ): - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS model_id = form_data["model"] if model_id not in models: @@ -531,7 +566,11 @@ async def generate_emoji( } ), "chat_id": form_data.get("chat_id", None), - "metadata": {"task": str(TASKS.EMOJI_GENERATION), "task_body": form_data}, + "metadata": { + **(request.state.metadata if request.state.metadata else {}), + "task": str(TASKS.EMOJI_GENERATION), + "task_body": form_data, + }, } try: @@ -548,7 +587,13 @@ async def generate_moa_response( request: Request, form_data: dict, user=Depends(get_verified_user) ): - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS + model_id = form_data["model"] if model_id not in models: @@ -581,6 +626,7 @@ async def generate_moa_response( "messages": [{"role": "user", "content": content}], "stream": form_data.get("stream", False), "metadata": { + **(request.state.metadata if request.state.metadata else {}), "chat_id": form_data.get("chat_id", None), "task": str(TASKS.MOA_RESPONSE_GENERATION), "task_body": form_data, diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index 3b6d5ea042..97e1aae74f 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -7,6 +7,8 @@ from typing import Any, Optional import random import json import inspect +import uuid +import asyncio from fastapi import Request from starlette.responses import Response, StreamingResponse @@ -15,6 +17,7 @@ from starlette.responses import Response, StreamingResponse from open_webui.models.users import UserModel from open_webui.socket.main import ( + sio, get_event_call, get_event_emitter, ) @@ -57,6 +60,93 @@ log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["MAIN"]) +async def generate_direct_chat_completion( + request: Request, + form_data: dict, + user: Any, + models: dict, +): + print("generate_direct_chat_completion") + + metadata = form_data.pop("metadata", {}) + + user_id = metadata.get("user_id") + session_id = metadata.get("session_id") + request_id = str(uuid.uuid4()) # Generate a unique request ID + + event_emitter = get_event_emitter(metadata) + event_caller = get_event_call(metadata) + + channel = f"{user_id}:{session_id}:{request_id}" + + if form_data.get("stream"): + q = asyncio.Queue() + + # Define a generator to stream responses + async def event_generator(): + nonlocal q + + async def message_listener(sid, data): + """ + Handle received socket messages and push them into the queue. + """ + await q.put(data) + + # Register the listener + sio.on(channel, message_listener) + + # Start processing chat completion in background + await event_emitter( + { + "type": "request:chat:completion", + "data": { + "form_data": form_data, + "model": models[form_data["model"]], + "channel": channel, + "session_id": session_id, + }, + } + ) + + try: + while True: + data = await q.get() # Wait for new messages + if isinstance(data, dict): + if "error" in data: + raise Exception(data["error"]) + + if "done" in data and data["done"]: + break # Stop streaming when 'done' is received + + yield f"data: {json.dumps(data)}\n\n" + elif isinstance(data, str): + yield data + finally: + del sio.handlers["/"][channel] # Remove the listener + + # Return the streaming response + return StreamingResponse(event_generator(), media_type="text/event-stream") + else: + res = await event_caller( + { + "type": "request:chat:completion", + "data": { + "form_data": form_data, + "model": models[form_data["model"]], + "channel": channel, + "session_id": session_id, + }, + } + ) + + print(res) + + if "error" in res: + raise Exception(res["error"]) + + return res + + async def generate_chat_completion( request: Request, form_data: dict, @@ -66,7 +156,12 @@ async def generate_chat_completion( if BYPASS_MODEL_ACCESS_CONTROL: bypass_filter = True - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS model_id = form_data["model"] if model_id not in models: @@ -87,78 +182,90 @@ async def generate_chat_completion( except Exception as e: raise e - if model["owned_by"] == "arena": - model_ids = model.get("info", {}).get("meta", {}).get("model_ids") - filter_mode = model.get("info", {}).get("meta", {}).get("filter_mode") - if model_ids and filter_mode == "exclude": - model_ids = [ - model["id"] - for model in list(request.app.state.MODELS.values()) - if model.get("owned_by") != "arena" and model["id"] not in model_ids - ] - - selected_model_id = None - if isinstance(model_ids, list) and model_ids: - selected_model_id = random.choice(model_ids) - else: - model_ids = [ - model["id"] - for model in list(request.app.state.MODELS.values()) - if model.get("owned_by") != "arena" - ] - selected_model_id = random.choice(model_ids) - - form_data["model"] = selected_model_id - - if form_data.get("stream") == True: - - async def stream_wrapper(stream): - yield f"data: {json.dumps({'selected_model_id': selected_model_id})}\n\n" - async for chunk in stream: - yield chunk - - response = await generate_chat_completion( - request, form_data, user, bypass_filter=True - ) - return StreamingResponse( - stream_wrapper(response.body_iterator), - media_type="text/event-stream", - background=response.background, - ) - else: - return { - **( - await generate_chat_completion( - request, form_data, user, bypass_filter=True - ) - ), - "selected_model_id": selected_model_id, - } - - if model.get("pipe"): - # Below does not require bypass_filter because this is the only route the uses this function and it is already bypassing the filter - return await generate_function_chat_completion( + if request.state.direct: + return await generate_direct_chat_completion( request, form_data, user=user, models=models ) - if model["owned_by"] == "ollama": - # Using /ollama/api/chat endpoint - form_data = convert_payload_openai_to_ollama(form_data) - response = await generate_ollama_chat_completion( - request=request, form_data=form_data, user=user, bypass_filter=bypass_filter - ) - if form_data.get("stream"): - response.headers["content-type"] = "text/event-stream" - return StreamingResponse( - convert_streaming_response_ollama_to_openai(response), - headers=dict(response.headers), - background=response.background, - ) - else: - return convert_response_ollama_to_openai(response) + else: - return await generate_openai_chat_completion( - request=request, form_data=form_data, user=user, bypass_filter=bypass_filter - ) + if model["owned_by"] == "arena": + model_ids = model.get("info", {}).get("meta", {}).get("model_ids") + filter_mode = model.get("info", {}).get("meta", {}).get("filter_mode") + if model_ids and filter_mode == "exclude": + model_ids = [ + model["id"] + for model in list(request.app.state.MODELS.values()) + if model.get("owned_by") != "arena" and model["id"] not in model_ids + ] + + selected_model_id = None + if isinstance(model_ids, list) and model_ids: + selected_model_id = random.choice(model_ids) + else: + model_ids = [ + model["id"] + for model in list(request.app.state.MODELS.values()) + if model.get("owned_by") != "arena" + ] + selected_model_id = random.choice(model_ids) + + form_data["model"] = selected_model_id + + if form_data.get("stream") == True: + + async def stream_wrapper(stream): + yield f"data: {json.dumps({'selected_model_id': selected_model_id})}\n\n" + async for chunk in stream: + yield chunk + + response = await generate_chat_completion( + request, form_data, user, bypass_filter=True + ) + return StreamingResponse( + stream_wrapper(response.body_iterator), + media_type="text/event-stream", + background=response.background, + ) + else: + return { + **( + await generate_chat_completion( + request, form_data, user, bypass_filter=True + ) + ), + "selected_model_id": selected_model_id, + } + + if model.get("pipe"): + # Below does not require bypass_filter because this is the only route the uses this function and it is already bypassing the filter + return await generate_function_chat_completion( + request, form_data, user=user, models=models + ) + if model["owned_by"] == "ollama": + # Using /ollama/api/chat endpoint + form_data = convert_payload_openai_to_ollama(form_data) + response = await generate_ollama_chat_completion( + request=request, + form_data=form_data, + user=user, + bypass_filter=bypass_filter, + ) + if form_data.get("stream"): + response.headers["content-type"] = "text/event-stream" + return StreamingResponse( + convert_streaming_response_ollama_to_openai(response), + headers=dict(response.headers), + background=response.background, + ) + else: + return convert_response_ollama_to_openai(response) + else: + return await generate_openai_chat_completion( + request=request, + form_data=form_data, + user=user, + bypass_filter=bypass_filter, + ) chat_completion = generate_chat_completion @@ -167,7 +274,13 @@ chat_completion = generate_chat_completion async def chat_completed(request: Request, form_data: dict, user: Any): if not request.app.state.MODELS: await get_all_models(request) - models = request.app.state.MODELS + + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS data = form_data model_id = data["model"] @@ -227,7 +340,13 @@ async def chat_action(request: Request, action_id: str, form_data: dict, user: A if not request.app.state.MODELS: await get_all_models(request) - models = request.app.state.MODELS + + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS data = form_data model_id = data["model"] diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 5de8f8193c..e630af6878 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -622,7 +622,13 @@ async def process_chat_payload(request, form_data, metadata, user, model): # Initialize events to store additional event to be sent to the client # Initialize contexts and citation - models = request.app.state.MODELS + if request.state.direct and request.state.model: + models = { + request.state.model["id"]: request.state.model, + } + else: + models = request.app.state.MODELS + task_model_id = get_task_model_id( form_data["model"], request.app.state.config.TASK_MODEL, @@ -1677,6 +1683,9 @@ async def process_chat_response( "data": { "id": str(uuid4()), "code": code, + "session_id": metadata.get( + "session_id", None + ), }, } ) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index da966d90d7..d3986ca043 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -838,6 +838,7 @@ timestamp: m.timestamp, ...(m.sources ? { sources: m.sources } : {}) })), + model_item: $models.find((m) => m.id === modelId), chat_id: chatId, session_id: $socket?.id, id: responseMessageId @@ -896,6 +897,7 @@ ...(m.sources ? { sources: m.sources } : {}) })), ...(event ? { event: event } : {}), + model_item: $models.find((m) => m.id === modelId), chat_id: chatId, session_id: $socket?.id, id: responseMessageId @@ -1574,6 +1576,7 @@ $settings?.userLocation ? await getAndUpdateUserLocation(localStorage.token) : undefined ) }, + model_item: $models.find((m) => m.id === model.id), session_id: $socket?.id, chat_id: $chatId, diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 76323f772f..4d08b3e3d5 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -45,6 +45,7 @@ import { getAllTags, getChatList } from '$lib/apis/chats'; import NotificationToast from '$lib/components/NotificationToast.svelte'; import AppSidebar from '$lib/components/app/AppSidebar.svelte'; + import { chatCompletion } from '$lib/apis/openai'; setContext('i18n', i18n); @@ -251,10 +252,100 @@ } else if (type === 'chat:tags') { tags.set(await getAllTags(localStorage.token)); } - } else { + } else if (data?.session_id === $socket.id) { if (type === 'execute:python') { console.log('execute:python', data); executePythonAsWorker(data.id, data.code, cb); + } else if (type === 'request:chat:completion') { + console.log(data, $socket.id); + const { session_id, channel, form_data, model } = data; + + try { + const directConnections = $settings?.directConnections ?? {}; + + if (directConnections) { + const urlIdx = model?.urlIdx; + + console.log(model, directConnections); + + const OPENAI_API_URL = directConnections.OPENAI_API_BASE_URLS[urlIdx]; + const OPENAI_API_KEY = directConnections.OPENAI_API_KEYS[urlIdx]; + const API_CONFIG = directConnections.OPENAI_API_CONFIGS[urlIdx]; + + try { + const [res, controller] = await chatCompletion( + OPENAI_API_KEY, + form_data, + OPENAI_API_URL + ); + + if (res && res.ok) { + if (form_data?.stream ?? false) { + // res will either be SSE or JSON + const reader = res.body.getReader(); + const decoder = new TextDecoder(); + + const processStream = async () => { + while (true) { + // Read data chunks from the response stream + const { done, value } = await reader.read(); + if (done) { + break; + } + + // Decode the received chunk + const chunk = decoder.decode(value, { stream: true }); + + // Process lines within the chunk + const lines = chunk.split('\n').filter((line) => line.trim() !== ''); + + for (const line of lines) { + $socket?.emit(channel, line); + } + } + }; + + // Process the stream in the background + await processStream(); + } else { + const data = await res.json(); + cb(data); + } + } else { + throw new Error('An error occurred while fetching the completion'); + } + } catch (error) { + console.error('chatCompletion', error); + + if (form_data?.stream ?? false) { + $socket.emit(channel, { + error: error + }); + } else { + cb({ + error: error + }); + } + } + } + } catch (error) { + console.error('chatCompletion', error); + if (form_data?.stream ?? false) { + $socket.emit(channel, { + error: error + }); + } else { + cb({ + error: error + }); + } + } finally { + $socket.emit(channel, { + done: true + }); + } + } else { + console.log('chatEventHandler', event); } } }; From 2b7f9d14d0290cd897d1791c35aa7f6a7054a60f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 23:21:16 -0800 Subject: [PATCH 105/117] refac --- backend/open_webui/utils/chat.py | 101 +++++++++++++++++-------------- src/routes/+layout.svelte | 32 ++++------ 2 files changed, 67 insertions(+), 66 deletions(-) diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index 97e1aae74f..72f8eafe3b 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -10,8 +10,8 @@ import inspect import uuid import asyncio -from fastapi import Request -from starlette.responses import Response, StreamingResponse +from fastapi import Request, status +from starlette.responses import Response, StreamingResponse, JSONResponse from open_webui.models.users import UserModel @@ -82,51 +82,16 @@ async def generate_direct_chat_completion( if form_data.get("stream"): q = asyncio.Queue() - # Define a generator to stream responses - async def event_generator(): - nonlocal q + async def message_listener(sid, data): + """ + Handle received socket messages and push them into the queue. + """ + await q.put(data) - async def message_listener(sid, data): - """ - Handle received socket messages and push them into the queue. - """ - await q.put(data) + # Register the listener + sio.on(channel, message_listener) - # Register the listener - sio.on(channel, message_listener) - - # Start processing chat completion in background - await event_emitter( - { - "type": "request:chat:completion", - "data": { - "form_data": form_data, - "model": models[form_data["model"]], - "channel": channel, - "session_id": session_id, - }, - } - ) - - try: - while True: - data = await q.get() # Wait for new messages - if isinstance(data, dict): - if "error" in data: - raise Exception(data["error"]) - - if "done" in data and data["done"]: - break # Stop streaming when 'done' is received - - yield f"data: {json.dumps(data)}\n\n" - elif isinstance(data, str): - yield data - finally: - del sio.handlers["/"][channel] # Remove the listener - - # Return the streaming response - return StreamingResponse(event_generator(), media_type="text/event-stream") - else: + # Start processing chat completion in background res = await event_caller( { "type": "request:chat:completion", @@ -139,7 +104,51 @@ async def generate_direct_chat_completion( } ) - print(res) + print("res", res) + + if res.get("status", False): + # Define a generator to stream responses + async def event_generator(): + nonlocal q + try: + while True: + data = await q.get() # Wait for new messages + if isinstance(data, dict): + if "done" in data and data["done"]: + break # Stop streaming when 'done' is received + + yield f"data: {json.dumps(data)}\n\n" + elif isinstance(data, str): + yield data + except Exception as e: + log.debug(f"Error in event generator: {e}") + pass + + # Define a background task to run the event generator + async def background(): + try: + del sio.handlers["/"][channel] + except Exception as e: + pass + + # Return the streaming response + return StreamingResponse( + event_generator(), media_type="text/event-stream", background=background + ) + else: + raise Exception(str(res)) + else: + res = await event_caller( + { + "type": "request:chat:completion", + "data": { + "form_data": form_data, + "model": models[form_data["model"]], + "channel": channel, + "session_id": session_id, + }, + } + ) if "error" in res: raise Exception(res["error"]) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 4d08b3e3d5..bef581e74b 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -279,8 +279,17 @@ OPENAI_API_URL ); - if (res && res.ok) { + if (res) { + // raise if the response is not ok + if (!res.ok) { + throw await res.json(); + } + if (form_data?.stream ?? false) { + cb({ + status: true + }); + // res will either be SSE or JSON const reader = res.body.getReader(); const decoder = new TextDecoder(); @@ -316,29 +325,12 @@ } } catch (error) { console.error('chatCompletion', error); - - if (form_data?.stream ?? false) { - $socket.emit(channel, { - error: error - }); - } else { - cb({ - error: error - }); - } + cb(error); } } } catch (error) { console.error('chatCompletion', error); - if (form_data?.stream ?? false) { - $socket.emit(channel, { - error: error - }); - } else { - cb({ - error: error - }); - } + cb(error); } finally { $socket.emit(channel, { done: true From 83e5db7be74879cdc97460cb7ef2763543e744d9 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 23:26:47 -0800 Subject: [PATCH 106/117] refac --- backend/open_webui/routers/tasks.py | 14 +++++++------- backend/open_webui/utils/chat.py | 6 +++--- backend/open_webui/utils/middleware.py | 2 +- src/routes/+layout.svelte | 5 +++++ 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/backend/open_webui/routers/tasks.py b/backend/open_webui/routers/tasks.py index c885d764b2..3fcca0e07b 100644 --- a/backend/open_webui/routers/tasks.py +++ b/backend/open_webui/routers/tasks.py @@ -139,7 +139,7 @@ async def update_task_config( async def generate_title( request: Request, form_data: dict, user=Depends(get_verified_user) ): - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -231,7 +231,7 @@ async def generate_chat_tags( content={"detail": "Tags generation is disabled"}, ) - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -293,7 +293,7 @@ async def generate_chat_tags( async def generate_image_prompt( request: Request, form_data: dict, user=Depends(get_verified_user) ): - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -374,7 +374,7 @@ async def generate_queries( detail=f"Query generation is disabled", ) - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -455,7 +455,7 @@ async def generate_autocompletion( detail=f"Input prompt exceeds maximum length of {request.app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH}", ) - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -518,7 +518,7 @@ async def generate_emoji( request: Request, form_data: dict, user=Depends(get_verified_user) ): - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -587,7 +587,7 @@ async def generate_moa_response( request: Request, form_data: dict, user=Depends(get_verified_user) ): - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index 72f8eafe3b..03b5d589c6 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -165,7 +165,7 @@ async def generate_chat_completion( if BYPASS_MODEL_ACCESS_CONTROL: bypass_filter = True - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -284,7 +284,7 @@ async def chat_completed(request: Request, form_data: dict, user: Any): if not request.app.state.MODELS: await get_all_models(request) - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } @@ -350,7 +350,7 @@ async def chat_action(request: Request, action_id: str, form_data: dict, user: A if not request.app.state.MODELS: await get_all_models(request) - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index e630af6878..7195990011 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -622,7 +622,7 @@ async def process_chat_payload(request, form_data, metadata, user, model): # Initialize events to store additional event to be sent to the client # Initialize contexts and citation - if request.state.direct and request.state.model: + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index bef581e74b..cae8fba3a2 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -273,6 +273,11 @@ const API_CONFIG = directConnections.OPENAI_API_CONFIGS[urlIdx]; try { + if (API_CONFIG?.prefix_id) { + const prefixId = API_CONFIG.prefix_id; + form_data['model'] = form_data['model'].replace(`${prefixId}.`, ``); + } + const [res, controller] = await chatCompletion( OPENAI_API_KEY, form_data, From 5626426c31c4d75e8b5c7d99da0f43282747b766 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 23:28:57 -0800 Subject: [PATCH 107/117] chore: format --- backend/open_webui/retrieval/web/bocha.py | 27 +++++++------------ .../open_webui/retrieval/web/google_pse.py | 11 +++++--- .../chat/Messages/ResponseMessage.svelte | 6 +++-- .../chat/Settings/Connections.svelte | 4 +++ src/lib/components/common/Collapsible.svelte | 2 +- src/lib/i18n/locales/ar-BH/translation.json | 19 +++++++++++++ src/lib/i18n/locales/bg-BG/translation.json | 19 +++++++++++++ src/lib/i18n/locales/bn-BD/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ca-ES/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ceb-PH/translation.json | 19 +++++++++++++ src/lib/i18n/locales/cs-CZ/translation.json | 19 +++++++++++++ src/lib/i18n/locales/da-DK/translation.json | 19 +++++++++++++ src/lib/i18n/locales/de-DE/translation.json | 19 +++++++++++++ src/lib/i18n/locales/dg-DG/translation.json | 19 +++++++++++++ src/lib/i18n/locales/el-GR/translation.json | 19 +++++++++++++ src/lib/i18n/locales/en-GB/translation.json | 19 +++++++++++++ src/lib/i18n/locales/en-US/translation.json | 19 +++++++++++++ src/lib/i18n/locales/es-ES/translation.json | 19 +++++++++++++ src/lib/i18n/locales/eu-ES/translation.json | 19 +++++++++++++ src/lib/i18n/locales/fa-IR/translation.json | 19 +++++++++++++ src/lib/i18n/locales/fi-FI/translation.json | 19 +++++++++++++ src/lib/i18n/locales/fr-CA/translation.json | 19 +++++++++++++ src/lib/i18n/locales/fr-FR/translation.json | 19 +++++++++++++ src/lib/i18n/locales/he-IL/translation.json | 19 +++++++++++++ src/lib/i18n/locales/hi-IN/translation.json | 19 +++++++++++++ src/lib/i18n/locales/hr-HR/translation.json | 19 +++++++++++++ src/lib/i18n/locales/hu-HU/translation.json | 19 +++++++++++++ src/lib/i18n/locales/id-ID/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ie-GA/translation.json | 19 +++++++++++++ src/lib/i18n/locales/it-IT/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ja-JP/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ka-GE/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ko-KR/translation.json | 19 +++++++++++++ src/lib/i18n/locales/lt-LT/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ms-MY/translation.json | 19 +++++++++++++ src/lib/i18n/locales/nb-NO/translation.json | 19 +++++++++++++ src/lib/i18n/locales/nl-NL/translation.json | 19 +++++++++++++ src/lib/i18n/locales/pa-IN/translation.json | 19 +++++++++++++ src/lib/i18n/locales/pl-PL/translation.json | 19 +++++++++++++ src/lib/i18n/locales/pt-BR/translation.json | 19 +++++++++++++ src/lib/i18n/locales/pt-PT/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ro-RO/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ru-RU/translation.json | 19 +++++++++++++ src/lib/i18n/locales/sk-SK/translation.json | 19 +++++++++++++ src/lib/i18n/locales/sr-RS/translation.json | 19 +++++++++++++ src/lib/i18n/locales/sv-SE/translation.json | 19 +++++++++++++ src/lib/i18n/locales/th-TH/translation.json | 19 +++++++++++++ src/lib/i18n/locales/tk-TW/translation.json | 19 +++++++++++++ src/lib/i18n/locales/tr-TR/translation.json | 19 +++++++++++++ src/lib/i18n/locales/uk-UA/translation.json | 19 +++++++++++++ src/lib/i18n/locales/ur-PK/translation.json | 19 +++++++++++++ src/lib/i18n/locales/vi-VN/translation.json | 19 +++++++++++++ src/lib/i18n/locales/zh-CN/translation.json | 21 +++++++++++++-- src/lib/i18n/locales/zh-TW/translation.json | 19 +++++++++++++ 54 files changed, 957 insertions(+), 26 deletions(-) diff --git a/backend/open_webui/retrieval/web/bocha.py b/backend/open_webui/retrieval/web/bocha.py index 98bdae704f..f26da36f84 100644 --- a/backend/open_webui/retrieval/web/bocha.py +++ b/backend/open_webui/retrieval/web/bocha.py @@ -9,6 +9,7 @@ from open_webui.env import SRC_LOG_LEVELS log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["RAG"]) + def _parse_response(response): result = {} if "data" in response: @@ -25,7 +26,8 @@ def _parse_response(response): "summary": item.get("summary", ""), "siteName": item.get("siteName", ""), "siteIcon": item.get("siteIcon", ""), - "datePublished": item.get("datePublished", "") or item.get("dateLastCrawled", ""), + "datePublished": item.get("datePublished", "") + or item.get("dateLastCrawled", ""), } for item in webPages["value"] ] @@ -42,17 +44,11 @@ def search_bocha( query (str): The query to search for """ url = "https://api.bochaai.com/v1/web-search?utm_source=ollama" - headers = { - "Authorization": f"Bearer {api_key}", - "Content-Type": "application/json" - } - - payload = json.dumps({ - "query": query, - "summary": True, - "freshness": "noLimit", - "count": count - }) + headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"} + + payload = json.dumps( + {"query": query, "summary": True, "freshness": "noLimit", "count": count} + ) response = requests.post(url, headers=headers, data=payload, timeout=5) response.raise_for_status() @@ -63,10 +59,7 @@ def search_bocha( return [ SearchResult( - link=result["url"], - title=result.get("name"), - snippet=result.get("summary") + link=result["url"], title=result.get("name"), snippet=result.get("summary") ) - for result in results.get("webpage", [])[:count] + for result in results.get("webpage", [])[:count] ] - diff --git a/backend/open_webui/retrieval/web/google_pse.py b/backend/open_webui/retrieval/web/google_pse.py index ea82252620..2d2b863b42 100644 --- a/backend/open_webui/retrieval/web/google_pse.py +++ b/backend/open_webui/retrieval/web/google_pse.py @@ -8,6 +8,7 @@ from open_webui.env import SRC_LOG_LEVELS log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["RAG"]) + def search_google_pse( api_key: str, search_engine_id: str, @@ -46,12 +47,14 @@ def search_google_pse( response.raise_for_status() json_response = response.json() results = json_response.get("items", []) - if results: # check if results are returned. If not, no more pages to fetch. + if results: # check if results are returned. If not, no more pages to fetch. all_results.extend(results) - count -= len(results) # Decrement count by the number of results fetched in this page. - start_index += 10 # Increment start index for the next page + count -= len( + results + ) # Decrement count by the number of results fetched in this page. + start_index += 10 # Increment start index for the next page else: - break # No more results from Google PSE, break the loop + break # No more results from Google PSE, break the loop if filter_list: all_results = get_filtered_results(all_results, filter_list) diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 9526053526..990a17a969 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -725,10 +725,12 @@ sourceButton.click(); } else if (sourcesCollapsible) { // Open sources collapsible so we can click the source button - sourcesCollapsible.querySelector("div:first-child").dispatchEvent(new PointerEvent('pointerup', {})) + sourcesCollapsible + .querySelector('div:first-child') + .dispatchEvent(new PointerEvent('pointerup', {})); // Wait for next frame to ensure DOM updates - await new Promise(resolve => { + await new Promise((resolve) => { requestAnimationFrame(() => { requestAnimationFrame(resolve); }); diff --git a/src/lib/components/chat/Settings/Connections.svelte b/src/lib/components/chat/Settings/Connections.svelte index dceed6e9a2..051171d7f1 100644 --- a/src/lib/components/chat/Settings/Connections.svelte +++ b/src/lib/components/chat/Settings/Connections.svelte @@ -128,6 +128,10 @@
{$i18n.t('Connect to your own OpenAI compatible API endpoints.')} +
+ {$i18n.t( + 'Ensure that CORS is properly configured to allow requests from Open WebUI.' + )}
diff --git a/src/lib/components/common/Collapsible.svelte b/src/lib/components/common/Collapsible.svelte index c06b525b8d..cc52494093 100644 --- a/src/lib/components/common/Collapsible.svelte +++ b/src/lib/components/common/Collapsible.svelte @@ -47,7 +47,7 @@ export let hide = false; -
+
{#if title !== null} diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index ebd9f93a78..358bb6eca0 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع", "By {{name}}": "", "Bypass SSL verification for Websites": "تجاوز التحقق من SSL للموقع", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "مجموعة", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "تأكيد كلمة المرور", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "اتصالات", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "وصف", "Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "اكتشف نموذجا", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "تم تعيين نموذج التضمين على \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "تمكين مشاركة المجتمع", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "تمكين بحث الويب", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.", "Enter {{role}} message here": "أدخل رسالة {{role}} هنا", "Enter a detail about yourself for your LLMs to recall": "ادخل معلومات عنك تريد أن يتذكرها الموديل", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "أدخل مفتاح واجهة برمجة تطبيقات البحث الشجاع", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "أدخل معرف محرك PSE من Google", "Enter Image Size (e.g. 512x512)": "(e.g. 512x512) أدخل حجم الصورة ", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "أدخل كود اللغة", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "معاينة JSON", "July": "يوليو", "June": "يونيو", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT تجريبي", "JWT Token": "JWT Token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "يمكن أن تصدر بعض الأخطاء. لذلك يجب التحقق من المعلومات المهمة", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "نص عادي (.txt)", "Playground": "مكان التجربة", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "حدد مسارا", "Select a pipeline url": "حدد عنوان URL لخط الأنابيب", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 4062c97ea0..9c997e87ef 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Смел ключ за API за търсене", "By {{name}}": "", "Bypass SSL verification for Websites": "Изключване на SSL проверката за сайтове", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Колекция", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Потвърди Парола", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Връзки", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Описание", "Didn't fully follow instructions": "Не следва инструкциите", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "Открийте модел", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Модел за вграждане е настроен на \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Разрешаване на споделяне в общност", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Разрешаване на търсене в уеб", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.", "Enter {{role}} message here": "Въведете съобщение за {{role}} тук", "Enter a detail about yourself for your LLMs to recall": "Въведете подробности за себе си, за да се herinnerат вашите LLMs", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Въведете Brave Search API ключ", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Въведете идентификатор на двигателя на Google PSE", "Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Въведете кодове на езика", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON Преглед", "July": "Июл", "June": "Июн", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT Expiration", "JWT Token": "JWT Token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Plain text (.txt)", "Playground": "Плейграунд", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Изберете тръбопровод", "Select a pipeline url": "Избор на URL адрес на канал", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index 96d990f928..fd90ba7516 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "সাহসী অনুসন্ধান API কী", "By {{name}}": "", "Bypass SSL verification for Websites": "ওয়েবসাইটের জন্য SSL যাচাই বাতিল করুন", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "সংগ্রহ", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "পাসওয়ার্ড নিশ্চিত করুন", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "কানেকশনগুলো", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "বিবরণ", "Didn't fully follow instructions": "ইনস্ট্রাকশন সম্পূর্ণ অনুসরণ করা হয়নি", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "একটি মডেল আবিষ্কার করুন", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "ইমেজ ইমেবডিং মডেল সেট করা হয়েছে - \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.", "Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন", "Enter a detail about yourself for your LLMs to recall": "আপনার এলএলএমগুলি স্মরণ করার জন্য নিজের সম্পর্কে একটি বিশদ লিখুন", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "সাহসী অনুসন্ধান API কী লিখুন", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "গুগল পিএসই ইঞ্জিন আইডি লিখুন", "Enter Image Size (e.g. 512x512)": "ছবির মাপ লিখুন (যেমন 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "ল্যাঙ্গুয়েজ কোড লিখুন", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON প্রিভিউ", "July": "জুলাই", "June": "জুন", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT-র মেয়াদ", "JWT Token": "JWT টোকেন", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM ভুল করতে পারে। গুরুত্বপূর্ণ তথ্য যাচাই করে নিন।", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "প্লায়েন টেক্সট (.txt)", "Playground": "খেলাঘর", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "একটি পাইপলাইন নির্বাচন করুন", "Select a pipeline url": "একটি পাইপলাইন URL নির্বাচন করুন", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 3fe34d0673..a6ab9320c1 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -122,6 +122,7 @@ "Beta": "Beta", "Bing Search V7 Endpoint": "Punt de connexió a Bing Search V7", "Bing Search V7 Subscription Key": "Clau de subscripció a Bing Search V7", + "Bocha Search API Key": "", "Brave Search API Key": "Clau API de Brave Search", "By {{name}}": "Per {{name}}", "Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a Internet", @@ -178,6 +179,8 @@ "Code execution": "Execució de codi", "Code formatted successfully": "Codi formatat correctament", "Code Interpreter": "Intèrpret de codi", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Col·lecció", "Color": "Color", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Confirmar la contrasenya", "Confirm your action": "Confirma la teva acció", "Confirm your new password": "Confirma la teva nova contrasenya", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Connexions", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Restringeix l'esforç de raonament dels models de raonament. Només aplicable a models de raonament de proveïdors específics que donen suport a l'esforç de raonament. (Per defecte: mitjà)", "Contact Admin for WebUI Access": "Posat en contacte amb l'administrador per accedir a WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius", "Description": "Descripció", "Didn't fully follow instructions": "No s'han seguit les instruccions completament", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Deshabilitat", "Discover a function": "Descobrir una funció", "Discover a model": "Descobrir un model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Model d'incrustació configurat a \"{{embedding_model}}\"", "Enable API Key": "Activar la Clau API", "Enable autocomplete generation for chat messages": "Activar la generació automàtica per als missatges del xat", + "Enable Code Interpreter": "", "Enable Community Sharing": "Activar l'ús compartit amb la comunitat", "Enable Google Drive": "Activar Google Drive", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Activar el bloqueig de memòria (mlock) per evitar que les dades del model s'intercanviïn fora de la memòria RAM. Aquesta opció bloqueja el conjunt de pàgines de treball del model a la memòria RAM, assegurant-se que no s'intercanviaran al disc. Això pot ajudar a mantenir el rendiment evitant errors de pàgina i garantint un accés ràpid a les dades.", @@ -337,6 +345,7 @@ "Enable Web Search": "Activar la cerca web", "Enabled": "Habilitat", "Engine": "Motor", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.", "Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}", "Enter a detail about yourself for your LLMs to recall": "Introdueix un detall sobre tu què els teus models de llenguatge puguin recordar", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Introdueix la contrasenya del DN d'aplicació", "Enter Bing Search V7 Endpoint": "Introdueix el punt de connexió de Bing Search V7", "Enter Bing Search V7 Subscription Key": "Introdueix la clau de subscripció de Bing Search V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Introdueix la clau API de Brave Search", "Enter certificate path": "Introdueix el camí del certificat", "Enter CFG Scale (e.g. 7.0)": "Entra l'escala CFG (p.ex. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Introdueix l'identificador del motor PSE de Google", "Enter Image Size (e.g. 512x512)": "Introdueix la mida de la imatge (p. ex. 512x512)", "Enter Jina API Key": "Introdueix la clau API de Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Introdueix la clau API de Kagi Search", "Enter language codes": "Introdueix els codis de llenguatge", "Enter Model ID": "Introdueix l'identificador del model", @@ -543,6 +556,8 @@ "JSON Preview": "Vista prèvia del document JSON", "July": "Juliol", "June": "Juny", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Caducitat del JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "Clau API de Kagi Search", @@ -576,6 +591,7 @@ "Listening...": "Escoltant...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Els models de llenguatge poden cometre errors. Verifica la informació important.", + "Loading Kokoro.js...": "", "Local": "Local", "Local Models": "Models locals", "Lost": "Perdut", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Assegura't d'exportar un fitxer workflow.json com a format API des de ComfyUI.", "Manage": "Gestionar", "Manage Arena Models": "Gestionar els models de l'Arena", + "Manage Direct Connections": "", "Manage Models": "Gestionar els models", "Manage Ollama": "Gestionar Ollama", "Manage Ollama API Connections": "Gestionar les connexions a l'API d'Ollama", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Text pla (.txt)", "Playground": "Zona de jocs", "Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Si us plau, entra una indicació", "Please fill in all fields.": "Emplena tots els camps, si us plau.", "Please select a model first.": "Si us plau, selecciona un model primer", @@ -835,6 +853,7 @@ "Select a pipeline": "Seleccionar una Pipeline", "Select a pipeline url": "Seleccionar l'URL d'una Pipeline", "Select a tool": "Seleccionar una eina", + "Select an auth method": "", "Select an Ollama instance": "Seleccionar una instància d'Ollama", "Select Engine": "Seleccionar el motor", "Select Knowledge": "Seleccionar coneixement", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index 92147e3817..5a1b7cf8b7 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "", "By {{name}}": "", "Bypass SSL verification for Websites": "", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Koleksyon", "Color": "", "ComfyUI": "", @@ -194,6 +197,7 @@ "Confirm Password": "Kumpirma ang password", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Mga koneksyon", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Deskripsyon", "Didn't fully follow instructions": "", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi", "Enter a detail about yourself for your LLMs to recall": "", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "", "Enter Image Size (e.g. 512x512)": "Pagsulod sa gidak-on sa hulagway (pananglitan 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "", "July": "", "June": "", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Pag-expire sa JWT", "JWT Token": "JWT token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Ang mga LLM mahimong masayop. ", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "", "Playground": "Dulaanan", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "", "Select a pipeline url": "", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 39f96a325d..678977dc96 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Klíč API pro Brave Search", "By {{name}}": "", "Bypass SSL verification for Websites": "Obcházení ověření SSL pro webové stránky", @@ -178,6 +179,8 @@ "Code execution": "Provádění kódu", "Code formatted successfully": "Kód byl úspěšně naformátován.", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "", "Color": "Barva", "ComfyUI": "ComfyUI.", @@ -194,6 +197,7 @@ "Confirm Password": "Potvrzení hesla", "Confirm your action": "Potvrďte svoji akci", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Připojení", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Kontaktujte administrátora pro přístup k webovému rozhraní.", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Popis", "Didn't fully follow instructions": "Nenásledovali jste přesně všechny instrukce.", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Zakázáno", "Discover a function": "Objevit funkci", "Discover a model": "Objevte model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Model vkládání nastaven na \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Povolit sdílení komunity", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Povolit webové vyhledávání", "Enabled": "Povoleno", "Engine": "Engine", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ujistěte se, že váš CSV soubor obsahuje 4 sloupce v tomto pořadí: Name, Email, Password, Role.", "Enter {{role}} message here": "Zadejte zprávu {{role}} sem", "Enter a detail about yourself for your LLMs to recall": "Zadejte podrobnost o sobě, kterou si vaše LLM mají pamatovat.", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Zadejte API klíč pro Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "Zadejte měřítko CFG (např. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Zadejte ID vyhledávacího mechanismu Google PSE", "Enter Image Size (e.g. 512x512)": "Zadejte velikost obrázku (např. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Zadejte kódy jazyků", "Enter Model ID": "Zadejte ID modelu", @@ -543,6 +556,8 @@ "JSON Preview": "Náhled JSON", "July": "Červenec", "June": "červen", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Vypršení JWT", "JWT Token": "JWT Token (JSON Web Token)", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Poslouchání...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM mohou dělat chyby. Ověřte si důležité informace.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Lokální modely", "Lost": "Ztracený", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Ujistěte se, že exportujete soubor workflow.json ve formátu API z ComfyUI.", "Manage": "Spravovat", "Manage Arena Models": "Správa modelů v Arena", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Čistý text (.txt)", "Playground": "", "Please carefully review the following warnings:": "Prosím, pečlivě si přečtěte následující upozornění:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Prosím, zadejte zadání.", "Please fill in all fields.": "Prosím, vyplňte všechna pole.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Vyberte pipeline", "Select a pipeline url": "Vyberte URL adresu kanálu", "Select a tool": "Vyberte nástroj", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Vyberte engine", "Select Knowledge": "Vybrat znalosti", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index f2851e361d..a4d1176b23 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API nøgle", "By {{name}}": "", "Bypass SSL verification for Websites": "Forbigå SSL verifikation på websider", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "Kode formateret korrekt", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Samling", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Bekræft password", "Confirm your action": "Bekræft din handling", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Forbindelser", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Kontakt din administrator for adgang til WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Beskrivelse", "Didn't fully follow instructions": "Fulgte ikke instruktioner", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Inaktiv", "Discover a function": "Find en funktion", "Discover a model": "Find en model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Embedding model sat til \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Aktiver deling til Community", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Aktiver websøgning", "Enabled": "Aktiveret", "Engine": "engine", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at din CSV-fil indeholder 4 kolonner in denne rækkefølge: Name, Email, Password, Role.", "Enter {{role}} message here": "Indtast {{role}} besked her", "Enter a detail about yourself for your LLMs to recall": "Indtast en detalje om dig selv, som dine LLMs kan huske", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Indtast Brave Search API-nøgle", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "Indtast CFG-skala (f.eks. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Indtast Google PSE Engine ID", "Enter Image Size (e.g. 512x512)": "Indtast billedstørrelse (f.eks. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Indtast sprogkoder", "Enter Model ID": "Indtast model-ID", @@ -543,6 +556,8 @@ "JSON Preview": "JSON-forhåndsvisning", "July": "Juli", "June": "Juni", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT-udløb", "JWT Token": "JWT-token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Lytter...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM'er kan lave fejl. Bekræft vigtige oplysninger.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Lokale modeller", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Sørg for at eksportere en workflow.json-fil som API-format fra ComfyUI.", "Manage": "Administrer", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Almindelig tekst (.txt)", "Playground": "Legeplads", "Please carefully review the following warnings:": "Gennemgå omhyggeligt følgende advarsler:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "Udfyld alle felter.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Vælg en pipeline", "Select a pipeline url": "Vælg en pipeline-URL", "Select a tool": "Vælg et værktøj", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Vælg engine", "Select Knowledge": "Vælg viden", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 0951a4485d..e795e3dcb3 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -122,6 +122,7 @@ "Beta": "Beta", "Bing Search V7 Endpoint": "Bing Search V7-Endpunkt", "Bing Search V7 Subscription Key": "Bing Search V7-Abonnement-Schlüssel", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API-Schlüssel", "By {{name}}": "Von {{name}}", "Bypass SSL verification for Websites": "SSL-Überprüfung für Webseiten umgehen", @@ -178,6 +179,8 @@ "Code execution": "Codeausführung", "Code formatted successfully": "Code erfolgreich formatiert", "Code Interpreter": "Code-Interpreter", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Kollektion", "Color": "Farbe", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Passwort bestätigen", "Confirm your action": "Bestätigen Sie Ihre Aktion.", "Confirm your new password": "Neues Passwort bestätigen", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Verbindungen", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Beschränkt den Aufwand für das Schlussfolgern bei Schlussfolgerungsmodellen. Nur anwendbar auf Schlussfolgerungsmodelle von spezifischen Anbietern, die den Schlussfolgerungsaufwand unterstützen. (Standard: medium)", "Contact Admin for WebUI Access": "Kontaktieren Sie den Administrator für den Zugriff auf die Weboberfläche", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Beschreibe deinen Wissensspeicher und deine Ziele", "Description": "Beschreibung", "Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Deaktiviert", "Discover a function": "Entdecken Sie weitere Funktionen", "Discover a model": "Entdecken Sie weitere Modelle", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt", "Enable API Key": "API-Schlüssel aktivieren", "Enable autocomplete generation for chat messages": "Automatische Vervollständigung für Chat-Nachrichten aktivieren", + "Enable Code Interpreter": "", "Enable Community Sharing": "Community-Freigabe aktivieren", "Enable Google Drive": "Google Drive aktivieren", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiviere Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.", @@ -337,6 +345,7 @@ "Enable Web Search": "Websuche aktivieren", "Enabled": "Aktiviert", "Engine": "Engine", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.", "Enter {{role}} message here": "Geben Sie die {{role}}-Nachricht hier ein", "Enter a detail about yourself for your LLMs to recall": "Geben Sie ein Detail über sich selbst ein, das Ihre Sprachmodelle (LLMs) sich merken sollen", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Geben Sie das Anwendungs-DN-Passwort ein", "Enter Bing Search V7 Endpoint": "Geben Sie den Bing Search V7-Endpunkt ein", "Enter Bing Search V7 Subscription Key": "Geben Sie den Bing Search V7-Abonnement-Schlüssel ein", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Geben Sie den Brave Search API-Schlüssel ein", "Enter certificate path": "Geben Sie den Zertifikatpfad ein", "Enter CFG Scale (e.g. 7.0)": "Geben Sie die CFG-Skala ein (z. B. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein", "Enter Image Size (e.g. 512x512)": "Geben Sie die Bildgröße ein (z. B. 512x512)", "Enter Jina API Key": "Geben Sie den Jina-API-Schlüssel ein", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Geben sie den Kagi Search API-Schlüssel ein", "Enter language codes": "Geben Sie die Sprachcodes ein", "Enter Model ID": "Geben Sie die Modell-ID ein", @@ -543,6 +556,8 @@ "JSON Preview": "JSON-Vorschau", "July": "Juli", "June": "Juni", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT-Ablauf", "JWT Token": "JWT-Token", "Kagi Search API Key": "Kagi Search API-Schlüssel", @@ -576,6 +591,7 @@ "Listening...": "Höre zu...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.", + "Loading Kokoro.js...": "", "Local": "Lokal", "Local Models": "Lokale Modelle", "Lost": "Verloren", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Stellen Sie sicher, dass sie eine workflow.json-Datei im API-Format von ComfyUI exportieren.", "Manage": "Verwalten", "Manage Arena Models": "Arena-Modelle verwalten", + "Manage Direct Connections": "", "Manage Models": "Modelle verwalten", "Manage Ollama": "Ollama verwalten", "Manage Ollama API Connections": "Ollama-API-Verbindungen verwalten", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Nur Text (.txt)", "Playground": "Testumgebung", "Please carefully review the following warnings:": "Bitte überprüfen Sie die folgenden Warnungen sorgfältig:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Bitte geben Sie einen Prompt ein", "Please fill in all fields.": "Bitte füllen Sie alle Felder aus.", "Please select a model first.": "Bitte wählen Sie zuerst ein Modell aus.", @@ -835,6 +853,7 @@ "Select a pipeline": "Wählen Sie eine Pipeline", "Select a pipeline url": "Wählen Sie eine Pipeline-URL", "Select a tool": "Wählen Sie ein Werkzeug", + "Select an auth method": "", "Select an Ollama instance": "Wählen Sie eine Ollama-Instanz", "Select Engine": "Engine auswählen", "Select Knowledge": "Wissensdatenbank auswählen", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index e77b9dbe23..55bc9f8f4a 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "", "By {{name}}": "", "Bypass SSL verification for Websites": "", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Collection", "Color": "", "ComfyUI": "", @@ -194,6 +197,7 @@ "Confirm Password": "Confirm Password", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Connections", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Description", "Didn't fully follow instructions": "", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "Enter {{role}} bork here", "Enter a detail about yourself for your LLMs to recall": "", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "", "Enter Image Size (e.g. 512x512)": "Enter Size of Wow (e.g. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "", "July": "", "June": "", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT Expire", "JWT Token": "JWT Borken", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs can make borks. Verify important info.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Plain text (.txt)", "Playground": "Playground", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "", "Select a pipeline url": "", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 724843fa91..f220a77beb 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "Τέλος Bing Search V7", "Bing Search V7 Subscription Key": "Κλειδί Συνδρομής Bing Search V7", + "Bocha Search API Key": "", "Brave Search API Key": "Κλειδί API Brave Search", "By {{name}}": "Από {{name}}", "Bypass SSL verification for Websites": "Παράκαμψη επαλήθευσης SSL για Ιστότοπους", @@ -178,6 +179,8 @@ "Code execution": "Εκτέλεση κώδικα", "Code formatted successfully": "Ο κώδικας μορφοποιήθηκε επιτυχώς", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Συλλογή", "Color": "Χρώμα", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Επιβεβαίωση Κωδικού", "Confirm your action": "Επιβεβαιώστε την ενέργειά σας", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Συνδέσεις", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Επικοινωνήστε με τον Διαχειριστή για Πρόσβαση στο WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Περιγράψτε τη βάση γνώσης και τους στόχους σας", "Description": "Περιγραφή", "Didn't fully follow instructions": "Δεν ακολούθησε πλήρως τις οδηγίες", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Απενεργοποιημένο", "Discover a function": "Ανακάλυψη λειτουργίας", "Discover a model": "Ανακάλυψη μοντέλου", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Το μοντέλο ενσωμάτωσης έχει οριστεί σε \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Ενεργοποίηση Κοινοτικής Κοινής Χρήσης", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Ενεργοποίηση Κλείδωσης Μνήμης (mlock) για την αποτροπή της ανταλλαγής δεδομένων του μοντέλου από τη μνήμη RAM. Αυτή η επιλογή κλειδώνει το σύνολο εργασίας των σελίδων του μοντέλου στη μνήμη RAM, διασφαλίζοντας ότι δεν θα ανταλλαχθούν στο δίσκο. Αυτό μπορεί να βοηθήσει στη διατήρηση της απόδοσης αποφεύγοντας σφάλματα σελίδων και διασφαλίζοντας γρήγορη πρόσβαση στα δεδομένα.", @@ -337,6 +345,7 @@ "Enable Web Search": "Ενεργοποίηση Αναζήτησης στο Διαδίκτυο", "Enabled": "Ενεργοποιημένο", "Engine": "Μηχανή", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Βεβαιωθείτε ότι το αρχείο CSV σας περιλαμβάνει 4 στήλες με αυτή τη σειρά: Όνομα, Email, Κωδικός, Ρόλος.", "Enter {{role}} message here": "Εισάγετε το μήνυμα {{role}} εδώ", "Enter a detail about yourself for your LLMs to recall": "Εισάγετε μια λεπτομέρεια για τον εαυτό σας ώστε τα LLMs να την ανακαλούν", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Εισάγετε Κωδικό DN Εφαρμογής", "Enter Bing Search V7 Endpoint": "Εισάγετε το Τέλος Bing Search V7", "Enter Bing Search V7 Subscription Key": "Εισάγετε το Κλειδί Συνδρομής Bing Search V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Εισάγετε το Κλειδί API Brave Search", "Enter certificate path": "Εισάγετε τη διαδρομή πιστοποιητικού", "Enter CFG Scale (e.g. 7.0)": "Εισάγετε το CFG Scale (π.χ. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Εισάγετε το Αναγνωριστικό Μηχανής Google PSE", "Enter Image Size (e.g. 512x512)": "Εισάγετε το Μέγεθος Εικόνας (π.χ. 512x512)", "Enter Jina API Key": "Εισάγετε το Κλειδί API Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Εισάγετε κωδικούς γλώσσας", "Enter Model ID": "Εισάγετε το ID Μοντέλου", @@ -543,6 +556,8 @@ "JSON Preview": "Προεπισκόπηση JSON", "July": "Ιούλιος", "June": "Ιούνιος", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Λήξη JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Ακούγεται...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Τα LLM μπορούν να κάνουν λάθη. Επαληθεύστε σημαντικές πληροφορίες.", + "Loading Kokoro.js...": "", "Local": "Τοπικό", "Local Models": "Τοπικά Μοντέλα", "Lost": "Χαμένος", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Βεβαιωθείτε ότι εξάγετε ένα αρχείο workflow.json ως μορφή API από το ComfyUI.", "Manage": "Διαχείριση", "Manage Arena Models": "Διαχείριση Μοντέλων Arena", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Διαχείριση Ollama", "Manage Ollama API Connections": "Διαχείριση Συνδέσεων API Ollama", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Απλό κείμενο (.txt)", "Playground": "Γήπεδο παιχνιδιών", "Please carefully review the following warnings:": "Παρακαλώ αναθεωρήστε προσεκτικά τις ακόλουθες προειδοποιήσεις:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Παρακαλώ εισάγετε μια προτροπή", "Please fill in all fields.": "Παρακαλώ συμπληρώστε όλα τα πεδία.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Επιλέξτε ένα pipeline", "Select a pipeline url": "Επιλέξτε ένα pipeline url", "Select a tool": "Επιλέξτε ένα εργαλείο", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Επιλέξτε Μηχανή", "Select Knowledge": "Επιλέξτε Γνώση", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index cef4f22f33..84c9ceba07 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "", "By {{name}}": "", "Bypass SSL verification for Websites": "", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "", "Color": "", "ComfyUI": "", @@ -194,6 +197,7 @@ "Confirm Password": "", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "", "Didn't fully follow instructions": "", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "", "Enter a detail about yourself for your LLMs to recall": "", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "", "Enter Image Size (e.g. 512x512)": "", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "", "July": "", "June": "", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "", "JWT Token": "", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "", "Playground": "", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "", "Select a pipeline url": "", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index cef4f22f33..84c9ceba07 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "", "By {{name}}": "", "Bypass SSL verification for Websites": "", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "", "Color": "", "ComfyUI": "", @@ -194,6 +197,7 @@ "Confirm Password": "", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "", "Didn't fully follow instructions": "", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "", "Enter a detail about yourself for your LLMs to recall": "", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "", "Enter Image Size (e.g. 512x512)": "", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "", "July": "", "June": "", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "", "JWT Token": "", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "", "Playground": "", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "", "Select a pipeline url": "", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index ff29789308..c7919b3824 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -122,6 +122,7 @@ "Beta": "Beta", "Bing Search V7 Endpoint": "Endpoint de Bing Search V7", "Bing Search V7 Subscription Key": "Clave de suscripción de Bing Search V7", + "Bocha Search API Key": "", "Brave Search API Key": "Clave de API de Brave Search", "By {{name}}": "Por {{name}}", "Bypass SSL verification for Websites": "Desactivar la verificación SSL para sitios web", @@ -178,6 +179,8 @@ "Code execution": "Ejecución de código", "Code formatted successfully": "Se ha formateado correctamente el código.", "Code Interpreter": "Interprete de Código", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Colección", "Color": "Color", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Confirmar Contraseña", "Confirm your action": "Confirma tu acción", "Confirm your new password": "Confirmar tu nueva contraseña", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Conexiones", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": " Restringe el esfuerzo en la razonamiento para los modelos de razonamiento. Solo aplicable a los modelos de razonamiento de proveedores específicos que admiten el esfuerzo de razonamiento. (Por defecto: medio)", "Contact Admin for WebUI Access": "Contacta el administrador para obtener acceso al WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Describe tu base de conocimientos y objetivos", "Description": "Descripción", "Didn't fully follow instructions": "No siguió las instrucciones", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Desactivado", "Discover a function": "Descubre una función", "Discover a model": "Descubrir un modelo", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding configurado a \"{{embedding_model}}\"", "Enable API Key": "Habilitar clave de API", "Enable autocomplete generation for chat messages": "Habilitar generación de autocompletado para mensajes de chat", + "Enable Code Interpreter": "", "Enable Community Sharing": "Habilitar el uso compartido de la comunidad", "Enable Google Drive": "Habilitar Google Drive", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Habilitar bloqueo de memoria (mlock) para evitar que los datos del modelo se intercambien fuera de la RAM. Esta opción bloquea el conjunto de páginas de trabajo del modelo en la RAM, asegurando que no se intercambiarán fuera del disco. Esto puede ayudar a mantener el rendimiento evitando fallos de página y asegurando un acceso rápido a los datos.", @@ -337,6 +345,7 @@ "Enable Web Search": "Habilitar la búsqueda web", "Enabled": "Activado", "Engine": "Motor", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asegúrese de que su archivo CSV incluya 4 columnas en este orden: Nombre, Correo Electrónico, Contraseña, Rol.", "Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí", "Enter a detail about yourself for your LLMs to recall": "Ingrese un detalle sobre usted para que sus LLMs recuerden", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Ingrese la contraseña de la DN de la aplicación", "Enter Bing Search V7 Endpoint": "Ingrese el endpoint de Bing Search V7", "Enter Bing Search V7 Subscription Key": "Ingrese la clave de suscripción de Bing Search V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Ingresa la clave de API de Brave Search", "Enter certificate path": "Ingrese la ruta del certificado", "Enter CFG Scale (e.g. 7.0)": "Ingresa la escala de CFG (p.ej., 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Introduzca el ID del motor PSE de Google", "Enter Image Size (e.g. 512x512)": "Ingrese el tamaño de la imagen (p.ej. 512x512)", "Enter Jina API Key": "Ingrese la clave API de Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Ingrese la clave API de Kagi Search", "Enter language codes": "Ingrese códigos de idioma", "Enter Model ID": "Ingresa el ID del modelo", @@ -543,6 +556,8 @@ "JSON Preview": "Vista previa de JSON", "July": "Julio", "June": "Junio", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Expiración del JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "Clave API de Kagi Search", @@ -576,6 +591,7 @@ "Listening...": "Escuchando...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Los LLM pueden cometer errores. Verifica la información importante.", + "Loading Kokoro.js...": "", "Local": "Local", "Local Models": "Modelos locales", "Lost": "Perdido", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Asegúrese de exportar un archivo workflow.json en formato API desde ComfyUI.", "Manage": "Gestionar", "Manage Arena Models": "Gestionar modelos de Arena", + "Manage Direct Connections": "", "Manage Models": "Gestionar modelos", "Manage Ollama": "Gestionar Ollama", "Manage Ollama API Connections": "Gestionar conexiones API de Ollama", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Texto plano (.txt)", "Playground": "Patio de juegos", "Please carefully review the following warnings:": "Por favor revise con cuidado los siguientes avisos:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Por favor ingrese un prompt", "Please fill in all fields.": "Por favor llene todos los campos.", "Please select a model first.": "Por favor seleccione un modelo primero.", @@ -835,6 +853,7 @@ "Select a pipeline": "Selección de una Pipeline", "Select a pipeline url": "Selección de una dirección URL de Pipeline", "Select a tool": "Busca una herramienta", + "Select an auth method": "", "Select an Ollama instance": "Seleccionar una instancia de Ollama", "Select Engine": "Selecciona Motor", "Select Knowledge": "Selecciona Conocimiento", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index 0c856b0943..d5c448f79e 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "Bing Bilaketa V7 Endpointua", "Bing Search V7 Subscription Key": "Bing Bilaketa V7 Harpidetza Gakoa", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Bilaketa API Gakoa", "By {{name}}": "{{name}}-k", "Bypass SSL verification for Websites": "Saihestu SSL egiaztapena Webguneentzat", @@ -178,6 +179,8 @@ "Code execution": "Kodearen exekuzioa", "Code formatted successfully": "Kodea ongi formateatu da", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Bilduma", "Color": "Kolorea", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Berretsi Pasahitza", "Confirm your action": "Berretsi zure ekintza", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Konexioak", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Jarri harremanetan Administratzailearekin WebUI Sarbiderako", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Deskribatu zure ezagutza-basea eta helburuak", "Description": "Deskribapena", "Didn't fully follow instructions": "Ez ditu jarraibideak guztiz jarraitu", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Desgaituta", "Discover a function": "Aurkitu funtzio bat", "Discover a model": "Aurkitu eredu bat", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Embedding eredua \"{{embedding_model}}\"-ra ezarri da", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Gaitu Komunitatearen Partekatzea", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Gaitu Memoria Blokeatzea (mlock) ereduaren datuak RAM memoriatik kanpo ez trukatzeko. Aukera honek ereduaren lan-orri multzoa RAMean blokatzen du, diskora ez direla trukatuko ziurtatuz. Honek errendimendua mantentzen lagun dezake, orri-hutsegiteak saihestuz eta datuen sarbide azkarra bermatuz.", @@ -337,6 +345,7 @@ "Enable Web Search": "Gaitu Web Bilaketa", "Enabled": "Gaituta", "Engine": "Motorea", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ziurtatu zure CSV fitxategiak 4 zutabe dituela ordena honetan: Izena, Posta elektronikoa, Pasahitza, Rola.", "Enter {{role}} message here": "Sartu {{role}} mezua hemen", "Enter a detail about yourself for your LLMs to recall": "Sartu zure buruari buruzko xehetasun bat LLMek gogoratzeko", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Sartu Aplikazioaren DN Pasahitza", "Enter Bing Search V7 Endpoint": "Sartu Bing Bilaketa V7 Endpointua", "Enter Bing Search V7 Subscription Key": "Sartu Bing Bilaketa V7 Harpidetza Gakoa", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Sartu Brave Bilaketa API Gakoa", "Enter certificate path": "Sartu ziurtagiriaren bidea", "Enter CFG Scale (e.g. 7.0)": "Sartu CFG Eskala (adib. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Sartu Google PSE Motor IDa", "Enter Image Size (e.g. 512x512)": "Sartu Irudi Tamaina (adib. 512x512)", "Enter Jina API Key": "Sartu Jina API Gakoa", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Sartu hizkuntza kodeak", "Enter Model ID": "Sartu Eredu IDa", @@ -543,6 +556,8 @@ "JSON Preview": "JSON Aurrebista", "July": "Uztaila", "June": "Ekaina", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT Iraungitzea", "JWT Token": "JWT Tokena", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Entzuten...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMek akatsak egin ditzakete. Egiaztatu informazio garrantzitsua.", + "Loading Kokoro.js...": "", "Local": "Lokala", "Local Models": "Modelo lokalak", "Lost": "Galduta", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Ziurtatu workflow.json fitxategia API formatu gisa esportatzen duzula ComfyUI-tik.", "Manage": "Kudeatu", "Manage Arena Models": "Kudeatu Arena Modeloak", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Kudeatu Ollama", "Manage Ollama API Connections": "Kudeatu Ollama API Konexioak", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Testu laua (.txt)", "Playground": "Jolaslekua", "Please carefully review the following warnings:": "Mesedez, berrikusi arretaz hurrengo oharrak:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Mesedez, sartu prompt bat", "Please fill in all fields.": "Mesedez, bete eremu guztiak.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Hautatu pipeline bat", "Select a pipeline url": "Hautatu pipeline url bat", "Select a tool": "Hautatu tresna bat", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Hautatu motorra", "Select Knowledge": "Hautatu ezagutza", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index 0a21a004c3..c2e726b0ee 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "کلید API جستجوی شجاع", "By {{name}}": "", "Bypass SSL verification for Websites": "عبور از تأیید SSL برای وب سایت ها", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "مجموعه", "Color": "", "ComfyUI": "کومیوآی", @@ -194,6 +197,7 @@ "Confirm Password": "تایید رمز عبور", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "ارتباطات", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "برای دسترسی به WebUI با مدیر تماس بگیرید", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "توضیحات", "Didn't fully follow instructions": "نمی تواند دستورالعمل را کامل پیگیری کند", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "کشف یک مدل", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "مدل پیدائش را به \"{{embedding_model}}\" تنظیم کنید", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "فعالسازی اشتراک انجمن", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "فعالسازی جستجوی وب", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "اطمینان حاصل کنید که فایل CSV شما شامل چهار ستون در این ترتیب است: نام، ایمیل، رمز عبور، نقش.", "Enter {{role}} message here": "پیام {{role}} را اینجا وارد کنید", "Enter a detail about yourself for your LLMs to recall": "برای ذخیره سازی اطلاعات خود، یک توضیح کوتاه درباره خود را وارد کنید", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "کلید API جستجوی شجاع را وارد کنید", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "شناسه موتور PSE گوگل را وارد کنید", "Enter Image Size (e.g. 512x512)": "اندازه تصویر را وارد کنید (مثال: 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "کد زبان را وارد کنید", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "پیش نمایش JSON", "July": "ژوئن", "June": "جولای", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT انقضای", "JWT Token": "JWT توکن", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "مدل\u200cهای زبانی بزرگ می\u200cتوانند اشتباه کنند. اطلاعات مهم را راستی\u200cآزمایی کنید.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "متن ساده (.txt)", "Playground": "زمین بازی", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "انتخاب یک خط لوله", "Select a pipeline url": "یک ادرس خط لوله را انتخاب کنید", "Select a tool": "انتخاب یک ابقزار", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "انتخاب موتور", "Select Knowledge": "انتخاب دانش", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 8153ebe624..7c6a52d244 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "Bing Search V7 -päätepisteen osoite", "Bing Search V7 Subscription Key": "Bing Search V7 -tilauskäyttäjäavain", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API -avain", "By {{name}}": "Tekijä {{name}}", "Bypass SSL verification for Websites": "Ohita SSL-varmennus verkkosivustoille", @@ -178,6 +179,8 @@ "Code execution": "Koodin suorittaminen", "Code formatted successfully": "Koodin muotoilu onnistui", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Kokoelma", "Color": "Väri", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Vahvista salasana", "Confirm your action": "Vahvista toimintasi", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Yhteydet", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Ota yhteyttä ylläpitäjään WebUI-käyttöä varten", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi", "Description": "Kuvaus", "Didn't fully follow instructions": "Ei noudattanut ohjeita täysin", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Ei käytössä", "Discover a function": "Löydä toiminto", "Discover a model": "Tutustu malliin", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "\"{{embedding_model}}\" valittu upotusmalliksi", "Enable API Key": "", "Enable autocomplete generation for chat messages": "Ota automaattinen täydennys käyttöön keskusteluviesteissä", + "Enable Code Interpreter": "", "Enable Community Sharing": "Ota yhteisön jakaminen käyttöön", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Ota Memory Locking (mlock) käyttöön estääksesi mallidatan vaihtamisen pois RAM-muistista. Tämä lukitsee mallin työsivut RAM-muistiin, varmistaen että niitä ei vaihdeta levylle. Tämä voi parantaa suorituskykyä välttämällä sivuvikoja ja varmistamalla nopean tietojen käytön.", @@ -337,6 +345,7 @@ "Enable Web Search": "Ota verkkohaku käyttöön", "Enabled": "Käytössä", "Engine": "Moottori", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta tässä järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.", "Enter {{role}} message here": "Kirjoita {{role}}-viesti tähän", "Enter a detail about yourself for your LLMs to recall": "Kirjoita yksityiskohta itsestäsi, jonka LLM-ohjelmat voivat muistaa", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Kirjoita sovelluksen DN-salasana", "Enter Bing Search V7 Endpoint": "Kirjoita Bing Search V7 -päätepisteen osoite", "Enter Bing Search V7 Subscription Key": "Kirjoita Bing Search V7 -tilauskäyttäjäavain", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Kirjoita Brave Search API -avain", "Enter certificate path": "Kirjoita varmennepolku", "Enter CFG Scale (e.g. 7.0)": "Kirjoita CFG-mitta (esim. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Kirjoita Google PSE -moottorin tunnus", "Enter Image Size (e.g. 512x512)": "Kirjoita kuvan koko (esim. 512x512)", "Enter Jina API Key": "Kirjoita Jina API -avain", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Kirjoita kielikoodit", "Enter Model ID": "Kirjoita mallitunnus", @@ -543,6 +556,8 @@ "JSON Preview": "JSON-esikatselu", "July": "heinäkuu", "June": "kesäkuu", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT-vanheneminen", "JWT Token": "JWT-token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Kuuntelee...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Tarkista tärkeät tiedot.", + "Loading Kokoro.js...": "", "Local": "Paikallinen", "Local Models": "Paikalliset mallit", "Lost": "Mennyt", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Muista viedä workflow.json-tiedosto API-muodossa ComfyUI:sta.", "Manage": "Hallitse", "Manage Arena Models": "Hallitse Arena-malleja", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Hallitse Ollamaa", "Manage Ollama API Connections": "Hallitse Ollama API -yhteyksiä", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Pelkkä teksti (.txt)", "Playground": "Leikkipaikka", "Please carefully review the following warnings:": "Tarkista huolellisesti seuraavat varoitukset:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Kirjoita kehote", "Please fill in all fields.": "Täytä kaikki kentät.", "Please select a model first.": "Valitse ensin malli.", @@ -835,6 +853,7 @@ "Select a pipeline": "Valitse putki", "Select a pipeline url": "Valitse putken URL-osoite", "Select a tool": "Valitse työkalu", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Valitse moottori", "Select Knowledge": "Valitse tietämys", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index e3503edebe..86b72982b5 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Clé API Brave Search", "By {{name}}": "", "Bypass SSL verification for Websites": "Bypasser la vérification SSL pour les sites web", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "Le code a été formaté avec succès", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Collection", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Confirmer le mot de passe", "Confirm your action": "Confirmez votre action", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Connexions", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Contacter l'administrateur pour l'accès à l'interface Web", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Description", "Didn't fully follow instructions": "N'a pas entièrement respecté les instructions", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "Découvrez une fonction", "Discover a model": "Découvrir un modèle", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Modèle d'encodage défini sur « {{embedding_model}} »", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Activer le partage communautaire", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Activer la recherche sur le Web", "Enabled": "", "Engine": "Moteur", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.", "Enter {{role}} message here": "Entrez le message {{role}} ici", "Enter a detail about yourself for your LLMs to recall": "Saisissez un détail sur vous-même que vos LLMs pourront se rappeler", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Entrez la clé API Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE", "Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (par ex. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Entrez les codes de langue", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "Aperçu JSON", "July": "Juillet", "June": "Juin", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Expiration du jeton JWT", "JWT Token": "Jeton JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "En train d'écouter...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Les LLM peuvent faire des erreurs. Vérifiez les informations importantes.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Modèles locaux", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Gérer", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Texte simple (.txt)", "Playground": "Aire de jeux", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Sélectionnez un pipeline", "Select a pipeline url": "Sélectionnez l'URL du pipeline", "Select a tool": "Sélectionnez un outil", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index 4ba053a171..85de3954da 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -122,6 +122,7 @@ "Beta": "Bêta", "Bing Search V7 Endpoint": "Point de terminaison Bing Search V7", "Bing Search V7 Subscription Key": "Clé d'abonnement Bing Search V7", + "Bocha Search API Key": "", "Brave Search API Key": "Clé API Brave Search", "By {{name}}": "Par {{name}}", "Bypass SSL verification for Websites": "Bypasser la vérification SSL pour les sites web", @@ -178,6 +179,8 @@ "Code execution": "Exécution de code", "Code formatted successfully": "Le code a été formaté avec succès", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Collection", "Color": "Couleur", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Confirmer le mot de passe", "Confirm your action": "Confirmer votre action", "Confirm your new password": "Confirmer votre nouveau mot de passe", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Connexions", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Contraint l'effort de raisonnement pour les modèles de raisonnement. Applicable uniquement aux modèles de raisonnement de fournisseurs spécifiques qui prennent en charge l'effort de raisonnement. (Par défaut : medium)", "Contact Admin for WebUI Access": "Contacter l'administrateur pour obtenir l'accès à WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Décrivez votre base de connaissances et vos objectifs", "Description": "Description", "Didn't fully follow instructions": "N'a pas entièrement respecté les instructions", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Désactivé", "Discover a function": "Trouvez une fonction", "Discover a model": "Trouvez un modèle", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Modèle d'embedding défini sur « {{embedding_model}} »", "Enable API Key": "Activer la clé API", "Enable autocomplete generation for chat messages": "Activer la génération des suggestions pour les messages", + "Enable Code Interpreter": "", "Enable Community Sharing": "Activer le partage communautaire", "Enable Google Drive": "Activer Google Drive", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Activer le verrouillage de la mémoire (mlock) pour empêcher les données du modèle d'être échangées de la RAM. Cette option verrouille l'ensemble de pages de travail du modèle en RAM, garantissant qu'elles ne seront pas échangées vers le disque. Cela peut aider à maintenir les performances en évitant les défauts de page et en assurant un accès rapide aux données.", @@ -337,6 +345,7 @@ "Enable Web Search": "Activer la recherche Web", "Enabled": "Activé", "Engine": "Moteur", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.", "Enter {{role}} message here": "Entrez le message {{role}} ici", "Enter a detail about yourself for your LLMs to recall": "Saisissez un détail sur vous-même que vos LLMs pourront se rappeler", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Entrez le mot de passe DN de l'application", "Enter Bing Search V7 Endpoint": "Entrez le point de terminaison Bing Search V7", "Enter Bing Search V7 Subscription Key": "Entrez la clé d'abonnement Bing Search V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Entrez la clé API Brave Search", "Enter certificate path": "Entrez le chemin du certificat", "Enter CFG Scale (e.g. 7.0)": "Entrez l'échelle CFG (par ex. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Entrez l'identifiant du moteur Google PSE", "Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (par ex. 512x512)", "Enter Jina API Key": "Entrez la clé API Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Entrez la clé API Kagi Search", "Enter language codes": "Entrez les codes de langue", "Enter Model ID": "Entrez l'ID du modèle", @@ -543,6 +556,8 @@ "JSON Preview": "Aperçu JSON", "July": "Juillet", "June": "Juin", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Expiration du token JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "Clé API Kagi Search", @@ -576,6 +591,7 @@ "Listening...": "Écoute en cours...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Les LLM peuvent faire des erreurs. Vérifiez les informations importantes.", + "Loading Kokoro.js...": "", "Local": "Local", "Local Models": "Modèles locaux", "Lost": "Perdu", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Veillez à exporter un fichier workflow.json au format API depuis ComfyUI.", "Manage": "Gérer", "Manage Arena Models": "Gérer les modèles d'arène", + "Manage Direct Connections": "", "Manage Models": "Gérer les modèles", "Manage Ollama": "Gérer Ollama", "Manage Ollama API Connections": "Gérer les connexions API Ollama", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Texte simple (.txt)", "Playground": "Playground", "Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Veuillez saisir un prompt", "Please fill in all fields.": "Veuillez remplir tous les champs.", "Please select a model first.": "Veuillez d'abord sélectionner un modèle.", @@ -835,6 +853,7 @@ "Select a pipeline": "Sélectionnez un pipeline", "Select a pipeline url": "Sélectionnez l'URL du pipeline", "Select a tool": "Sélectionnez un outil", + "Select an auth method": "", "Select an Ollama instance": "Sélectionnez une instance Ollama", "Select Engine": "Sélectionnez le moteur", "Select Knowledge": "Sélectionnez une connaissance", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index e2434b0f02..5c48448504 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "מפתח API של חיפוש אמיץ", "By {{name}}": "", "Bypass SSL verification for Websites": "עקוף אימות SSL עבור אתרים", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "אוסף", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "אשר סיסמה", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "חיבורים", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "תיאור", "Didn't fully follow instructions": "לא עקב אחרי ההוראות באופן מלא", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "גלה מודל", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "מודל ההטמעה הוגדר ל-\"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "הפיכת שיתוף קהילה לזמין", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "הפיכת חיפוש באינטרנט לזמין", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.", "Enter {{role}} message here": "הזן הודעת {{role}} כאן", "Enter a detail about yourself for your LLMs to recall": "הזן פרטים על עצמך כדי שLLMs יזכור", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "הזן מפתח API של חיפוש אמיץ", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "הזן את מזהה מנוע PSE של Google", "Enter Image Size (e.g. 512x512)": "הזן גודל תמונה (למשל 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "הזן קודי שפה", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "תצוגה מקדימה של JSON", "July": "יולי", "June": "יוני", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "תפוגת JWT", "JWT Token": "אסימון JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "מודלים בשפה טבעית יכולים לטעות. אמת מידע חשוב.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "טקסט פשוט (.txt)", "Playground": "אזור משחקים", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "בחר קו צינור", "Select a pipeline url": "בחר כתובת URL של קו צינור", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index 5e1c3ee750..bf915fcbf9 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Brave सर्च एपीआई कुंजी", "By {{name}}": "", "Bypass SSL verification for Websites": "वेबसाइटों के लिए SSL सुनिश्चिती को छोड़ें", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "संग्रह", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "पासवर्ड की पुष्टि कीजिये", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "सम्बन्ध", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "विवरण", "Didn't fully follow instructions": "निर्देशों का पूरी तरह से पालन नहीं किया", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "एक मॉडल की खोज करें", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "एम्बेडिंग मॉडल को \"{{embedding_model}}\" पर सेट किया गया", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "समुदाय साझाकरण सक्षम करें", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "वेब खोज सक्षम करें", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।", "Enter {{role}} message here": "यहां {{role}} संदेश दर्ज करें", "Enter a detail about yourself for your LLMs to recall": "अपने एलएलएम को याद करने के लिए अपने बारे में एक विवरण दर्ज करें", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Brave सर्च एपीआई कुंजी डालें", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Google PSE इंजन आईडी दर्ज करें", "Enter Image Size (e.g. 512x512)": "छवि का आकार दर्ज करें (उदा. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "भाषा कोड दर्ज करें", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON पूर्वावलोकन", "July": "जुलाई", "June": "जुन", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT समाप्ति", "JWT Token": "जट टोकन", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "एलएलएम गलतियाँ कर सकते हैं। महत्वपूर्ण जानकारी सत्यापित करें.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "सादा पाठ (.txt)", "Playground": "कार्यक्षेत्र", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "एक पाइपलाइन का चयन करें", "Select a pipeline url": "एक पाइपलाइन url चुनें", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index 53c4beeb82..34a0e587ca 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Brave tražilica - API ključ", "By {{name}}": "", "Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Kolekcija", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Potvrdite lozinku", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Povezivanja", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Kontaktirajte admina za WebUI pristup", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Opis", "Didn't fully follow instructions": "Nije u potpunosti slijedio upute", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "Otkrijte model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Omogući zajedničko korištenje zajednice", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Omogući pretraživanje weba", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.", "Enter {{role}} message here": "Unesite {{role}} poruku ovdje", "Enter a detail about yourself for your LLMs to recall": "Unesite pojedinosti o sebi da bi učitali memoriju u LLM", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Unesite Brave Search API ključ", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Unesite ID Google PSE motora", "Enter Image Size (e.g. 512x512)": "Unesite veličinu slike (npr. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Unesite kodove jezika", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON pretpregled", "July": "Srpanj", "June": "Lipanj", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Isticanje JWT-a", "JWT Token": "JWT token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Slušam...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM-ovi mogu pogriješiti. Provjerite važne informacije.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Lokalni modeli", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Upravljaj", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Običan tekst (.txt)", "Playground": "Igralište", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Odabir kanala", "Select a pipeline url": "Odabir URL-a kanala", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 198fbcd2b3..7c7599f978 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API kulcs", "By {{name}}": "", "Bypass SSL verification for Websites": "SSL ellenőrzés kihagyása weboldalakhoz", @@ -178,6 +179,8 @@ "Code execution": "Kód végrehajtás", "Code formatted successfully": "Kód sikeresen formázva", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Gyűjtemény", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Jelszó megerősítése", "Confirm your action": "Erősítsd meg a műveletet", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Kapcsolatok", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Lépj kapcsolatba az adminnal a WebUI hozzáférésért", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Leírás", "Didn't fully follow instructions": "Nem követte teljesen az utasításokat", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Letiltva", "Discover a function": "Funkció felfedezése", "Discover a model": "Modell felfedezése", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Beágyazási modell beállítva: \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Közösségi megosztás engedélyezése", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Webes keresés engedélyezése", "Enabled": "Engedélyezve", "Engine": "Motor", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Győződj meg róla, hogy a CSV fájl tartalmazza ezt a 4 oszlopot ebben a sorrendben: Név, Email, Jelszó, Szerep.", "Enter {{role}} message here": "Írd ide a {{role}} üzenetet", "Enter a detail about yourself for your LLMs to recall": "Adj meg egy részletet magadról, amit az LLM-ek megjegyezhetnek", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Add meg a Brave Search API kulcsot", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "Add meg a CFG skálát (pl. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Add meg a Google PSE motor azonosítót", "Enter Image Size (e.g. 512x512)": "Add meg a kép méretet (pl. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Add meg a nyelvi kódokat", "Enter Model ID": "Add meg a modell azonosítót", @@ -543,6 +556,8 @@ "JSON Preview": "JSON előnézet", "July": "Július", "June": "Június", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT lejárat", "JWT Token": "JWT token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Hallgatás...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Az LLM-ek hibázhatnak. Ellenőrizze a fontos információkat.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Helyi modellek", "Lost": "Elveszett", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Győződjön meg róla, hogy exportál egy workflow.json fájlt API formátumban a ComfyUI-ból.", "Manage": "Kezelés", "Manage Arena Models": "Arena modellek kezelése", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Egyszerű szöveg (.txt)", "Playground": "Játszótér", "Please carefully review the following warnings:": "Kérjük, gondosan tekintse át a következő figyelmeztetéseket:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Kérjük, adjon meg egy promptot", "Please fill in all fields.": "Kérjük, töltse ki az összes mezőt.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Válasszon egy folyamatot", "Select a pipeline url": "Válasszon egy folyamat URL-t", "Select a tool": "Válasszon egy eszközt", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Motor kiválasztása", "Select Knowledge": "Tudásbázis kiválasztása", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 0fefd426c3..817d116b48 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Kunci API Pencarian Berani", "By {{name}}": "", "Bypass SSL verification for Websites": "Lewati verifikasi SSL untuk Situs Web", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "Kode berhasil diformat", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Koleksi", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Konfirmasi Kata Sandi", "Confirm your action": "Konfirmasi tindakan Anda", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Koneksi", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Hubungi Admin untuk Akses WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Deskripsi", "Didn't fully follow instructions": "Tidak sepenuhnya mengikuti instruksi", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "Menemukan sebuah fungsi", "Discover a model": "Menemukan sebuah model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Model penyematan diatur ke \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Aktifkan Berbagi Komunitas", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Aktifkan Pencarian Web", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Pastikan file CSV Anda menyertakan 4 kolom dengan urutan sebagai berikut: Nama, Email, Kata Sandi, Peran.", "Enter {{role}} message here": "Masukkan pesan {{role}} di sini", "Enter a detail about yourself for your LLMs to recall": "Masukkan detail tentang diri Anda untuk diingat oleh LLM Anda", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Masukkan Kunci API Pencarian Berani", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Masukkan Id Mesin Google PSE", "Enter Image Size (e.g. 512x512)": "Masukkan Ukuran Gambar (mis. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Masukkan kode bahasa", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "Pratinjau JSON", "July": "Juli", "June": "Juni", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Kedaluwarsa JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Mendengarkan", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM dapat membuat kesalahan. Verifikasi informasi penting.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Model Lokal", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Mengelola", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Teks biasa (.txt)", "Playground": "Taman bermain", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Pilih saluran pipa", "Select a pipeline url": "Pilih url saluran pipa", "Select a tool": "Pilih alat", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index d6563feb5e..5005927005 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -122,6 +122,7 @@ "Beta": "Béite", "Bing Search V7 Endpoint": "Cuardach Bing V7 Críochphointe", "Bing Search V7 Subscription Key": "Eochair Síntiúis Bing Cuardach V7", + "Bocha Search API Key": "", "Brave Search API Key": "Eochair API Cuardaigh Brave", "By {{name}}": "Le {{name}}", "Bypass SSL verification for Websites": "Seachbhachtar fíorú SSL do Láithreáin", @@ -178,6 +179,8 @@ "Code execution": "Cód a fhorghníomhú", "Code formatted successfully": "Cód formáidithe go rathúil", "Code Interpreter": "Ateangaire Cód", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Bailiúchán", "Color": "Dath", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Deimhnigh Pasfhocal", "Confirm your action": "Deimhnigh do ghníomh", "Confirm your new password": "Deimhnigh do phasfhocal nua", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Naisc", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Srianann iarracht ar réasúnaíocht a dhéanamh ar shamhlacha réasúnaíochta. Ní bhaineann ach le samhlacha réasúnaíochta ó sholáthraithe sonracha a thacaíonn le hiarracht réasúnaíochta. (Réamhshocrú: meánach)", "Contact Admin for WebUI Access": "Déan teagmháil le Riarachán le haghaidh Rochtana WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Déan cur síos ar do bhunachar eolais agus do chuspóirí", "Description": "Cur síos", "Didn't fully follow instructions": "Níor lean sé treoracha go hiomlán", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Díchumasaithe", "Discover a function": "Faigh amach feidhm", "Discover a model": "Faigh amach múnla", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Samhail leabaithe atá socraithe go \"{{embedding_model}}\"", "Enable API Key": "Cumasaigh Eochair API", "Enable autocomplete generation for chat messages": "Cumasaigh giniúint uathchríochnaithe le haghaidh teachtaireachtaí comhrá", + "Enable Code Interpreter": "", "Enable Community Sharing": "Cumasaigh Comhroinnt Pobail", "Enable Google Drive": "Cumasaigh Google Drive", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Cumasaigh Glasáil Cuimhne (mlock) chun sonraí samhaltaithe a chosc ó RAM. Glasálann an rogha seo sraith oibre leathanaigh an mhúnla isteach i RAM, ag cinntiú nach ndéanfar iad a mhalartú go diosca. Is féidir leis seo cabhrú le feidhmíocht a choinneáil trí lochtanna leathanaigh a sheachaint agus rochtain tapa ar shonraí a chinntiú.", @@ -337,6 +345,7 @@ "Enable Web Search": "Cumasaigh Cuardach Gréasáin", "Enabled": "Cumasaithe", "Engine": "Inneall", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Déan cinnte go bhfuil 4 cholún san ord seo i do chomhad CSV: Ainm, Ríomhphost, Pasfhocal, Ról.", "Enter {{role}} message here": "Cuir isteach teachtaireacht {{role}} anseo", "Enter a detail about yourself for your LLMs to recall": "Cuir isteach mionsonraí fút féin chun do LLManna a mheabhrú", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Iontráil Feidhmchlár DN Pasfhocal", "Enter Bing Search V7 Endpoint": "Cuir isteach Cuardach Bing V7 Críochphointe", "Enter Bing Search V7 Subscription Key": "Cuir isteach Eochair Síntiúis Bing Cuardach V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Cuir isteach Eochair API Brave Cuardach", "Enter certificate path": "Cuir isteach cosán an teastais", "Enter CFG Scale (e.g. 7.0)": "Cuir isteach Scála CFG (m.sh. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Cuir isteach ID Inneall Google PSE", "Enter Image Size (e.g. 512x512)": "Iontráil Méid Íomhá (m.sh. 512x512)", "Enter Jina API Key": "Cuir isteach Eochair API Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Cuir isteach Eochair Kagi Search API", "Enter language codes": "Cuir isteach cóid teanga", "Enter Model ID": "Iontráil ID Mhúnla", @@ -543,6 +556,8 @@ "JSON Preview": "Réamhamharc JSON", "July": "Lúil", "June": "Meitheamh", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Éag JWT", "JWT Token": "Comhartha JWT", "Kagi Search API Key": "Eochair API Chuardaigh Kagi", @@ -576,6 +591,7 @@ "Listening...": "Éisteacht...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Is féidir le LLManna botúin a dhéanamh. Fíoraigh faisnéis thábhachtach.", + "Loading Kokoro.js...": "", "Local": "Áitiúil", "Local Models": "Múnlaí Áitiúla", "Lost": "Cailleadh", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Déan cinnte comhad workflow.json a onnmhairiú mar fhormáid API ó ComfyUI.", "Manage": "Bainistiú", "Manage Arena Models": "Bainistigh Múnlaí Airéine", + "Manage Direct Connections": "", "Manage Models": "Samhlacha a bhainistiú", "Manage Ollama": "Bainistigh Ollama", "Manage Ollama API Connections": "Bainistigh Naisc API Ollama", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Téacs simplí (.txt)", "Playground": "Clós súgartha", "Please carefully review the following warnings:": "Déan athbhreithniú cúramach ar na rabhaidh seo a leanas le do thoil:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Cuir isteach leid", "Please fill in all fields.": "Líon isteach gach réimse le do thoil.", "Please select a model first.": "Roghnaigh munla ar dtús le do thoil.", @@ -835,6 +853,7 @@ "Select a pipeline": "Roghnaigh píblíne", "Select a pipeline url": "Roghnaigh url píblíne", "Select a tool": "Roghnaigh uirlis", + "Select an auth method": "", "Select an Ollama instance": "Roghnaigh sampla Olama", "Select Engine": "Roghnaigh Inneall", "Select Knowledge": "Roghnaigh Eolais", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index b7d9aaa49f..647d641e33 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Chiave API di ricerca Brave", "By {{name}}": "", "Bypass SSL verification for Websites": "Aggira la verifica SSL per i siti web", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Collezione", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Conferma password", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Connessioni", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Descrizione", "Didn't fully follow instructions": "Non ha seguito completamente le istruzioni", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "Scopri un modello", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Modello di embedding impostato su \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Abilita la condivisione della community", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Abilita ricerca Web", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.", "Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui", "Enter a detail about yourself for your LLMs to recall": "Inserisci un dettaglio su di te per che i LLM possano ricordare", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Inserisci la chiave API di Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Inserisci l'ID motore PSE di Google", "Enter Image Size (e.g. 512x512)": "Inserisci la dimensione dell'immagine (ad esempio 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Inserisci i codici lingua", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "Anteprima JSON", "July": "Luglio", "June": "Giugno", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Scadenza JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Gli LLM possono commettere errori. Verifica le informazioni importanti.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Testo normale (.txt)", "Playground": "Terreno di gioco", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Selezionare una tubazione", "Select a pipeline url": "Selezionare l'URL di una pipeline", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index a1611d0c66..9edb91bd0d 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search APIキー", "By {{name}}": "", "Bypass SSL verification for Websites": "SSL 検証をバイパスする", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "コードフォーマットに成功しました", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "コレクション", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "パスワードの確認", "Confirm your action": "あなたのアクションの確認", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "接続", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "WEBUIへの接続について管理者に問い合わせ下さい。", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "説明", "Didn't fully follow instructions": "説明に沿って操作していませんでした", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "無効", "Discover a function": "Functionを探す", "Discover a model": "モデルを探す", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "埋め込みモデルを\"{{embedding_model}}\"に設定しました", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "コミュニティ共有を有効にする", "Enable Google Drive": "Google Driveの有効化", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "ウェブ検索を有効にする", "Enabled": "有効", "Engine": "エンジン", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSVファイルに4つの列が含まれていることを確認してください: Name, Email, Password, Role.", "Enter {{role}} message here": "{{role}} メッセージをここに入力してください", "Enter a detail about yourself for your LLMs to recall": "LLM が記憶するために、自分についての詳細を入力してください", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Brave Search APIキーの入力", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "CFGスケースを入力してください (例: 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Google PSE エンジン ID を入力します。", "Enter Image Size (e.g. 512x512)": "画像サイズを入力してください (例: 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "言語コードを入力してください", "Enter Model ID": "モデルIDを入力してください。", @@ -543,6 +556,8 @@ "JSON Preview": "JSON プレビュー", "July": "7月", "June": "6月", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT 有効期限", "JWT Token": "JWT トークン", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM は間違いを犯す可能性があります。重要な情報を検証してください。", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "ローカルモデル", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "管理", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "プレーンテキスト (.txt)", "Playground": "プレイグラウンド", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "パイプラインの選択", "Select a pipeline url": "パイプラインの URL を選択する", "Select a tool": "ツールの選択", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "エンジンの選択", "Select Knowledge": "ナレッジベースの選択", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 446e9ba35f..51f71afc69 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API გასაღები", "By {{name}}": "", "Bypass SSL verification for Websites": "SSL-ის ვერიფიკაციის გააუქმება ვებსაიტებზე", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "ნაკრები", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "პაროლის დამოწმება", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "კავშირები", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "აღწერა", "Didn't fully follow instructions": "ვერ ყველა ინფორმაციისთვის ვერ ხელახლა ჩაწერე", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "გაიგეთ მოდელი", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "ჩასმის ძირითადი პროგრამა ჩართულია \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "ვებ ძიების ჩართვა", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "გთხოვთ, უზრუნველყოთ, რომთქვევის CSV-ფაილი შეიცავს 4 ველი, ჩაწერილი ორივე ველი უდრის პირველი ველით.", "Enter {{role}} message here": "შეიყვანე {{role}} შეტყობინება აქ", "Enter a detail about yourself for your LLMs to recall": "შეიყვანე დეტალი ჩემთათვის, რომ ჩვენი LLMs-ს შეიძლოს აღაქვს", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "შეიყვანეთ Brave Search API გასაღები", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "შეიყვანეთ Google PSE ძრავის ID", "Enter Image Size (e.g. 512x512)": "შეიყვანეთ სურათის ზომა (მაგ. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "შეიყვანეთ ენის კოდი", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON გადახედვა", "July": "ივნისი", "June": "ივლა", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT-ის ვადა", "JWT Token": "JWT ტოკენი", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "შესაძლოა LLM-ებმა შეცდომები დაუშვან. გადაამოწმეთ მნიშვნელოვანი ინფორმაცია.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "ტექსტი (.txt)", "Playground": "სათამაშო მოედანი", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "აირჩიეთ მილსადენი", "Select a pipeline url": "აირჩიეთ მილსადენის url", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 145645fcee..2e8c62bb80 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "Bing Search V7 엔드포인트", "Bing Search V7 Subscription Key": "Bing Search V7 구독 키", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API 키", "By {{name}}": "", "Bypass SSL verification for Websites": "웹 사이트에 대한 SSL 검증 무시: ", @@ -178,6 +179,8 @@ "Code execution": "코드 실행", "Code formatted successfully": "성공적으로 코드가 생성되었습니다", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "컬렉션", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "비밀번호 확인", "Confirm your action": "액션 확인", "Confirm your new password": "새로운 비밀번호를 한 번 더 입력해 주세요", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "연결", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "WebUI 접속을 위해서는 관리자에게 연락에 연락하십시오", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "지식 기반에 대한 설명과 목적을 입력하세요", "Description": "설명", "Didn't fully follow instructions": "완전히 지침을 따르지 않음", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "제한됨", "Discover a function": "함수 검색", "Discover a model": "모델 검색", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "임베딩 모델을 \"{{embedding_model}}\"로 설정함", "Enable API Key": "API 키 활성화", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "커뮤니티 공유 활성화", "Enable Google Drive": "Google Drive 활성화", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "웹 검색 활성화", "Enabled": "활성화됨", "Engine": "엔진", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV 파일에 이름, 이메일, 비밀번호, 역할 4개의 열이 순서대로 포함되어 있는지 확인하세요.", "Enter {{role}} message here": "여기에 {{role}} 메시지 입력", "Enter a detail about yourself for your LLMs to recall": "자신에 대한 세부사항을 입력하여 LLM들이 기억할 수 있도록 하세요.", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "Bing Search V7 엔드포인트 입력", "Enter Bing Search V7 Subscription Key": "Bing Search V7 구독 키 입력", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Brave Search API Key 입력", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "CFG Scale 입력 (예: 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Google PSE 엔진 ID 입력", "Enter Image Size (e.g. 512x512)": "이미지 크기 입력(예: 512x512)", "Enter Jina API Key": "Jina API 키 입력", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Kagi Search API 키 입력", "Enter language codes": "언어 코드 입력", "Enter Model ID": "모델 ID 입력", @@ -543,6 +556,8 @@ "JSON Preview": "JSON 미리 보기", "July": "7월", "June": "6월", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT 만료", "JWT Token": "JWT 토큰", "Kagi Search API Key": "Kagi Search API 키", @@ -576,6 +591,7 @@ "Listening...": "듣는 중...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM에 오류가 있을 수 있습니다. 중요한 정보는 확인이 필요합니다.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "로컬 모델", "Lost": "패배", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "꼭 workflow.json 파일을 ComfyUI의 API 형식대로 내보내세요", "Manage": "관리", "Manage Arena Models": "아레나 모델 관리", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "Ollama API 연결 관리", @@ -728,6 +745,7 @@ "Plain text (.txt)": "일반 텍스트(.txt)", "Playground": "놀이터", "Please carefully review the following warnings:": "다음 주의를 조심히 확인해주십시오", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "프롬프트를 입력해주세요", "Please fill in all fields.": "모두 빈칸없이 채워주세요", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "파이프라인 선택", "Select a pipeline url": "파이프라인 URL 선택", "Select a tool": "도구 선택", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "엔진 선택", "Select Knowledge": "지식 기반 선택", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 78d22dc00a..a7fd51ef9c 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API raktas", "By {{name}}": "", "Bypass SSL verification for Websites": "Išvengti SSL patikros puslapiams", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "Kodas suformatuotas sėkmingai", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Kolekcija", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Patvirtinkite slaptažodį", "Confirm your action": "Patvirtinkite veiksmą", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Ryšiai", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Susisiekite su administratoriumi dėl prieigos", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Aprašymas", "Didn't fully follow instructions": "Pilnai nesekė instrukcijų", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Išjungta", "Discover a function": "Atrasti funkciją", "Discover a model": "Atrasti modelį", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Embedding modelis nustatytas kaip\"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Leisti dalinimąsi su bendruomene", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Leisti paiešką internete", "Enabled": "Leisti", "Engine": "Variklis", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Įsitikinkite, kad CSV failas turi 4 kolonas šiuo eiliškumu: Name, Email, Password, Role.", "Enter {{role}} message here": "Įveskite {{role}} žinutę čia", "Enter a detail about yourself for your LLMs to recall": "Įveskite informaciją apie save jūsų modelio atminčiai", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Įveskite Bravo Search API raktą", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Įveskite Google PSE variklio ID", "Enter Image Size (e.g. 512x512)": "Įveskite paveiksliuko dydį (pvz. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Įveskite kalbos kodus", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON peržiūra", "July": "liepa", "June": "birželis", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT išėjimas iš galiojimo", "JWT Token": "JWT žetonas", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Klausoma...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Dideli kalbos modeliai gali klysti. Patikrinkite atsakymų teisingumą.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Lokalūs modeliai", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Tvarkyti", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Grynas tekstas (.txt)", "Playground": "Eksperimentavimo erdvė", "Please carefully review the following warnings:": "Peržiūrėkite šiuos perspėjimus:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Pasirinkite procesą", "Select a pipeline url": "Pasirinkite proceso nuorodą", "Select a tool": "Pasirinkite įrankį", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index e9550ed3ae..8a54f5be53 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Kunci API Carian Brave", "By {{name}}": "", "Bypass SSL verification for Websites": "Pintas pengesahan SSL untuk Laman Web", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "Kod berjaya diformatkan", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Koleksi", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Sahkan kata laluan", "Confirm your action": "Sahkan tindakan anda", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Sambungan", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Hubungi admin untuk akses WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Penerangan", "Didn't fully follow instructions": "Tidak mengikut arahan sepenuhnya", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Dilumpuhkan", "Discover a function": "Temui fungsi", "Discover a model": "Temui model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Model Benamkan ditetapkan kepada \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Benarkan Perkongsian Komuniti", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Benarkan Carian Web", "Enabled": "Dibenarkan", "Engine": "Enjin", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "astikan fail CSV anda mengandungi 4 lajur dalam susunan ini: Nama, E-mel, Kata Laluan, Peranan.", "Enter {{role}} message here": "Masukkan mesej {{role}} di sini", "Enter a detail about yourself for your LLMs to recall": "Masukkan butiran tentang diri anda untuk diingati oleh LLM anda", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Masukkan Kekunci API carian Brave", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Masukkan Id Enjin Google PSE", "Enter Image Size (e.g. 512x512)": "Masukkan Saiz Imej (cth 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Masukkan kod bahasa", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "Pratonton JSON", "July": "Julai", "June": "Jun", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Tempoh Tamat JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Mendengar...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM boleh membuat kesilapan. Sahkan maklumat penting", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Model Tempatan", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Urus", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Teks biasa (.txt)", "Playground": "Taman Permainan", "Please carefully review the following warnings:": "Sila semak dengan teliti amaran berikut:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Pilih 'pipeline'", "Select a pipeline url": "Pilih url 'pipeline'", "Select a tool": "Pilih alat", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index 45cbb0fc3a..9ec6ba6615 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "Endepunkt for Bing Search V7", "Bing Search V7 Subscription Key": "Abonnementsnøkkel for Bing Search V7", + "Bocha Search API Key": "", "Brave Search API Key": "API-nøkkel for Brave Search", "By {{name}}": "Etter {{name}}", "Bypass SSL verification for Websites": "Omgå SSL-verifisering for nettsteder", @@ -178,6 +179,8 @@ "Code execution": "Kodekjøring", "Code formatted successfully": "Koden er formatert", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Samling", "Color": "Farge", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Bekreft passordet", "Confirm your action": "Bekreft handlingen", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Tilkoblinger", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Kontakt administrator for å få tilgang til WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Beskriv kunnskapsbasen din og målene dine", "Description": "Beskrivelse", "Didn't fully follow instructions": "Fulgte ikke instruksjonene fullstendig", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Deaktivert", "Discover a function": "Oppdag en funksjon", "Discover a model": "Oppdag en modell", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Innbyggingsmodell angitt til \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "Aktiver automatisk utfylling av chatmeldinger", + "Enable Code Interpreter": "", "Enable Community Sharing": "Aktiver deling i fellesskap", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiver Memory Locking (mlock) for å forhindre at modelldata byttes ut av RAM. Dette alternativet låser modellens arbeidssett med sider i RAM-minnet, slik at de ikke byttes ut til disk. Dette kan bidra til å opprettholde ytelsen ved å unngå sidefeil og sikre rask datatilgang.", @@ -337,6 +345,7 @@ "Enable Web Search": "Aktiver websøk", "Enabled": "Aktivert", "Engine": "Motor", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at CSV-filen din inkluderer fire kolonner i denne rekkefølgen: Navn, E-post, Passord, Rolle.", "Enter {{role}} message here": "Skriv inn {{role}} melding her", "Enter a detail about yourself for your LLMs to recall": "Skriv inn en detalj om deg selv som språkmodellene dine kan huske", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Angi applikasjonens DN-passord", "Enter Bing Search V7 Endpoint": "Angi endepunkt for Bing Search V7", "Enter Bing Search V7 Subscription Key": "Angi abonnementsnøkkel for Bing Search V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Angi API-nøkkel for Brave Search", "Enter certificate path": "Angi sertifikatets bane", "Enter CFG Scale (e.g. 7.0)": "Angi CFG-skala (f.eks. 7,0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Angi motor-ID for Google PSE", "Enter Image Size (e.g. 512x512)": "Angi bildestørrelse (f.eks. 512x512)", "Enter Jina API Key": "Angi API-nøkkel for Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Angi språkkoder", "Enter Model ID": "Angi modellens ID", @@ -543,6 +556,8 @@ "JSON Preview": "Forhåndsvisning av JSON", "July": "juli", "June": "juni", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT-utløp", "JWT Token": "JWT-token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Lytter ...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Språkmodeller kan gjøre feil. Kontroller viktige opplysninger.", + "Loading Kokoro.js...": "", "Local": "Lokal", "Local Models": "Lokale modeller", "Lost": "Tapt", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Sørg for å eksportere en workflow.json-fil i API-formatet fra ComfyUI.", "Manage": "Administrer", "Manage Arena Models": "Behandle Arena-modeller", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Behandle Ollama", "Manage Ollama API Connections": "Behandle API-tilkoblinger for Ollama", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Ren tekst (.txt)", "Playground": "Lekeplass", "Please carefully review the following warnings:": "Les gjennom følgende advarsler grundig:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Angi en ledetekst", "Please fill in all fields.": "Fyll i alle felter", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Velg en pipeline", "Select a pipeline url": "Velg en pipeline-URL", "Select a tool": "Velg et verktøy", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Velg motor", "Select Knowledge": "Velg kunnskap", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 47d39d2c1e..12e2029e7a 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "Bing Search V7 Endpoint", "Bing Search V7 Subscription Key": "Bing Search V7 Subscription Key", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API-sleutel", "By {{name}}": "Op {{name}}", "Bypass SSL verification for Websites": "SSL-verificatie omzeilen voor websites", @@ -178,6 +179,8 @@ "Code execution": "Code uitvoeren", "Code formatted successfully": "Code succesvol geformateerd", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Verzameling", "Color": "Kleur", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Bevestig wachtwoord", "Confirm your action": "Bevestig uw actie", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Verbindingen", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Neem contact op met de beheerder voor WebUI-toegang", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Beschrijf je kennisbasis en doelstellingen", "Description": "Beschrijving", "Didn't fully follow instructions": "Heeft niet alle instructies gevolgt", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Uitgeschakeld", "Discover a function": "Ontdek een functie", "Discover a model": "Ontdek een model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Embedding model ingesteld op \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Delen via de community inschakelen", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Schakel Memory Locking (mlock) in om te voorkomen dat modelgegevens uit het RAM worden verwisseld. Deze optie vergrendelt de werkset pagina's van het model in het RAM, zodat ze niet naar de schijf worden uitgewisseld. Dit kan helpen om de prestaties op peil te houden door paginafouten te voorkomen en snelle gegevenstoegang te garanderen.", @@ -337,6 +345,7 @@ "Enable Web Search": "Zoeken op het web inschakelen", "Enabled": "Ingeschakeld", "Engine": "Engine", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Zorg ervoor dat uw CSV-bestand de volgende vier kolommen in deze volgorde bevat: Naam, E-mail, Wachtwoord, Rol.", "Enter {{role}} message here": "Voeg {{role}} bericht hier toe", "Enter a detail about yourself for your LLMs to recall": "Voer een detail over jezelf in zodat LLM's het kunnen onthouden", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Voer applicatie-DN wachtwoord in", "Enter Bing Search V7 Endpoint": "Voer Bing Search V7 Endpoint in", "Enter Bing Search V7 Subscription Key": "Voer Bing Search V7 abonnementscode in", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Voer de Brave Search API-sleutel in", "Enter certificate path": "Voer certificaatpad in", "Enter CFG Scale (e.g. 7.0)": "Voer CFG schaal in (bv. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Voer Google PSE Engine-ID in", "Enter Image Size (e.g. 512x512)": "Voeg afbeelding formaat toe (Bijv. 512x512)", "Enter Jina API Key": "Voer Jina API-sleutel in", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Voeg taal codes toe", "Enter Model ID": "Voer model-ID in", @@ -543,6 +556,8 @@ "JSON Preview": "JSON-voorbeeld", "July": "Juli", "June": "Juni", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT Expiration", "JWT Token": "JWT Token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Aan het luisteren...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.", + "Loading Kokoro.js...": "", "Local": "Lokaal", "Local Models": "Lokale modellen", "Lost": "Verloren", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Zorg ervoor dat je een workflow.json-bestand als API-formaat exporteert vanuit ComfyUI.", "Manage": "Beheren", "Manage Arena Models": "Beheer srenamodellen", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Beheer Ollama", "Manage Ollama API Connections": "Beheer Ollama API-verbindingen", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Platte tekst (.txt)", "Playground": "Speeltuin", "Please carefully review the following warnings:": "Beoordeel de volgende waarschuwingen nauwkeurig:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Voer een prompt in", "Please fill in all fields.": "Voer alle velden in", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Selecteer een pijplijn", "Select a pipeline url": "Selecteer een pijplijn-URL", "Select a tool": "Selecteer een tool", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Selecteer Engine", "Select Knowledge": "Selecteer kennis", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index a4d6980037..2475bcc4ad 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "ਬਹਾਦਰ ਖੋਜ API ਕੁੰਜੀ", "By {{name}}": "", "Bypass SSL verification for Websites": "ਵੈਬਸਾਈਟਾਂ ਲਈ SSL ਪ੍ਰਮਾਣਿਕਤਾ ਨੂੰ ਬਾਈਪਾਸ ਕਰੋ", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "ਸੰਗ੍ਰਹਿ", "Color": "", "ComfyUI": "ਕੰਫੀਯੂਆਈ", @@ -194,6 +197,7 @@ "Confirm Password": "ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "ਕਨੈਕਸ਼ਨ", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "ਵਰਣਨਾ", "Didn't fully follow instructions": "ਹਦਾਇਤਾਂ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਫਾਲੋ ਨਹੀਂ ਕੀਤਾ", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "ਇੱਕ ਮਾਡਲ ਲੱਭੋ", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਨੂੰ \"{{embedding_model}}\" 'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "ਕਮਿਊਨਿਟੀ ਸ਼ੇਅਰਿੰਗ ਨੂੰ ਸਮਰੱਥ ਕਰੋ", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "ਵੈੱਬ ਖੋਜ ਨੂੰ ਸਮਰੱਥ ਕਰੋ", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਤੁਹਾਡੀ CSV ਫਾਈਲ ਵਿੱਚ ਇਸ ਕ੍ਰਮ ਵਿੱਚ 4 ਕਾਲਮ ਹਨ: ਨਾਮ, ਈਮੇਲ, ਪਾਸਵਰਡ, ਭੂਮਿਕਾ।", "Enter {{role}} message here": "{{role}} ਸੁਨੇਹਾ ਇੱਥੇ ਦਰਜ ਕਰੋ", "Enter a detail about yourself for your LLMs to recall": "ਤੁਹਾਡੇ LLMs ਨੂੰ ਸੁਨੇਹਾ ਕਰਨ ਲਈ ਸੁਨੇਹਾ ਇੱਥੇ ਦਰਜ ਕਰੋ", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "ਬਹਾਦਰ ਖੋਜ API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Google PSE ਇੰਜਣ ID ਦਾਖਲ ਕਰੋ", "Enter Image Size (e.g. 512x512)": "ਚਿੱਤਰ ਆਕਾਰ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "ਭਾਸ਼ਾ ਕੋਡ ਦਰਜ ਕਰੋ", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON ਪੂਰਵ-ਦਰਸ਼ਨ", "July": "ਜੁਲਾਈ", "June": "ਜੂਨ", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT ਮਿਆਦ ਖਤਮ", "JWT Token": "JWT ਟੋਕਨ", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs ਗਲਤੀਆਂ ਕਰ ਸਕਦੇ ਹਨ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "ਸਧਾਰਨ ਪਾਠ (.txt)", "Playground": "ਖੇਡ ਦਾ ਮੈਦਾਨ", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "ਪਾਈਪਲਾਈਨ ਚੁਣੋ", "Select a pipeline url": "ਪਾਈਪਲਾਈਨ URL ਚੁਣੋ", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 31ae4dec66..a06fd69e73 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Klucz API wyszukiwania Brave", "By {{name}}": "", "Bypass SSL verification for Websites": "Pomiń weryfikację SSL dla stron webowych", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Kolekcja", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Potwierdź hasło", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Połączenia", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Opis", "Didn't fully follow instructions": "Nie postępował zgodnie z instrukcjami", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "Odkryj model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Model osadzania ustawiono na \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Włączanie udostępniania społecznościowego", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Włączanie wyszukiwania w Internecie", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Upewnij się, że twój plik CSV zawiera 4 kolumny w następującym porządku: Nazwa, Email, Hasło, Rola.", "Enter {{role}} message here": "Wprowadź wiadomość {{role}} tutaj", "Enter a detail about yourself for your LLMs to recall": "Wprowadź szczegóły o sobie, aby LLMs mogli pamiętać", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Wprowadź klucz API Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Wprowadź identyfikator aparatu Google PSE", "Enter Image Size (e.g. 512x512)": "Wprowadź rozmiar obrazu (np. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Wprowadź kody języków", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "JSON (wersja zapoznawcza)", "July": "Lipiec", "June": "Czerwiec", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Wygaśnięcie JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMy mogą popełniać błędy. Zweryfikuj ważne informacje.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Zwykły tekst (.txt)", "Playground": "Plac zabaw", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Wybieranie potoku", "Select a pipeline url": "Wybieranie adresu URL potoku", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index cfe0cb8e9f..d85e34d030 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Chave API do Brave Search", "By {{name}}": "Por {{name}}", "Bypass SSL verification for Websites": "Ignorar verificação SSL para Sites", @@ -178,6 +179,8 @@ "Code execution": "Execução de código", "Code formatted successfully": "Código formatado com sucesso", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Coleção", "Color": "Cor", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Confirmar Senha", "Confirm your action": "Confirme sua ação", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Conexões", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Contate o Admin para Acesso ao WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Descreva sua base de conhecimento e objetivos", "Description": "Descrição", "Didn't fully follow instructions": "Não seguiu completamente as instruções", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Desativado", "Discover a function": "Descubra uma função", "Discover a model": "Descubra um modelo", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Modelo de embedding definido para \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Ativar Compartilhamento com a Comunidade", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Habilite o bloqueio de memória (mlock) para evitar que os dados do modelo sejam transferidos da RAM para a área de troca (swap). Essa opção bloqueia o conjunto de páginas em uso pelo modelo na RAM, garantindo que elas não sejam transferidas para o disco. Isso pode ajudar a manter o desempenho, evitando falhas de página e garantindo acesso rápido aos dados.", @@ -337,6 +345,7 @@ "Enable Web Search": "Ativar Pesquisa na Web", "Enabled": "Ativado", "Engine": "Motor", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Certifique-se de que seu arquivo CSV inclua 4 colunas nesta ordem: Nome, Email, Senha, Função.", "Enter {{role}} message here": "Digite a mensagem de {{role}} aqui", "Enter a detail about yourself for your LLMs to recall": "Digite um detalhe sobre você para seus LLMs lembrarem", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Digite a Senha do DN da Aplicação", "Enter Bing Search V7 Endpoint": "Digite o Endpoint do Bing Search V7", "Enter Bing Search V7 Subscription Key": "Digite a Chave de Assinatura do Bing Search V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Digite a Chave API do Brave Search", "Enter certificate path": "Digite o caminho do certificado", "Enter CFG Scale (e.g. 7.0)": "Digite a escala de CFG (por exemplo, 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Digite o ID do Motor do Google PSE", "Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)", "Enter Jina API Key": "Digite a Chave API Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Digite os códigos de idioma", "Enter Model ID": "Digite o ID do modelo", @@ -543,6 +556,8 @@ "JSON Preview": "Pré-visualização JSON", "July": "Julho", "June": "Junho", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Expiração do JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Escutando...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Modelos Locais", "Lost": "Perdeu", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Certifique-se de exportar um arquivo workflow.json como o formato API do ComfyUI.", "Manage": "Gerenciar", "Manage Arena Models": "Gerenciar Arena de Modelos", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Gerenciar Ollama", "Manage Ollama API Connections": "Gerenciar Conexões Ollama API", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Texto simples (.txt)", "Playground": "Playground", "Please carefully review the following warnings:": "Por favor, revise cuidadosamente os seguintes avisos:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Por favor, digite um prompt", "Please fill in all fields.": "Por favor, preencha todos os campos.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Selecione um pipeline", "Select a pipeline url": "Selecione uma URL de pipeline", "Select a tool": "Selecione uma ferramenta", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Selecionar Motor", "Select Knowledge": "Selecionar Conhecimento", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index 8bc08b09f4..d323a70f5a 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Chave da API de Pesquisa Brave", "By {{name}}": "", "Bypass SSL verification for Websites": "Ignorar verificação SSL para sites", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Coleção", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Confirmar Senha", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Conexões", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Contatar Admin para acesso ao WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Descrição", "Didn't fully follow instructions": "Não seguiu instruções com precisão", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "Descubra um modelo", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding definido como \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Active a Partilha da Comunidade", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Ativar pesquisa na Web", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Confirme que o seu ficheiro CSV inclui 4 colunas nesta ordem: Nome, E-mail, Senha, Função.", "Enter {{role}} message here": "Escreva a mensagem de {{role}} aqui", "Enter a detail about yourself for your LLMs to recall": "Escreva um detalhe sobre você para que os seus LLMs possam lembrar-se", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Escreva a chave da API do Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Escreva o ID do mecanismo PSE do Google", "Enter Image Size (e.g. 512x512)": "Escreva o Tamanho da Imagem (por exemplo, 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Escreva os códigos de idioma", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "Pré-visualização JSON", "July": "Julho", "June": "Junho", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Expiração JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "A escutar...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Modelos Locais", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Gerir", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Texto sem formatação (.txt)", "Playground": "Recreio", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Selecione um pipeline", "Select a pipeline url": "Selecione um URL de pipeline", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 07233336d0..5e01a94ef2 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Cheie API Brave Search", "By {{name}}": "", "Bypass SSL verification for Websites": "Ocolește verificarea SSL pentru site-uri web", @@ -178,6 +179,8 @@ "Code execution": "Executarea codului", "Code formatted successfully": "Cod formatat cu succes", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Colecție", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Confirmă Parola", "Confirm your action": "Confirmă acțiunea ta", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Conexiuni", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Contactează administratorul pentru acces WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Descriere", "Didn't fully follow instructions": "Nu a urmat complet instrucțiunile", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Dezactivat", "Discover a function": "Descoperă o funcție", "Discover a model": "Descoperă un model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Modelul de încapsulare setat la \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Activează Partajarea Comunitară", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Activează Căutarea pe Web", "Enabled": "Activat", "Engine": "Motor", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asigurați-vă că fișierul CSV include 4 coloane în această ordine: Nume, Email, Parolă, Rol.", "Enter {{role}} message here": "Introduceți mesajul pentru {{role}} aici", "Enter a detail about yourself for your LLMs to recall": "Introduceți un detaliu despre dvs. pe care LLM-urile să-l rețină", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Introduceți Cheia API Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "Introduceți Scara CFG (de ex. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Introduceți ID-ul Motorului Google PSE", "Enter Image Size (e.g. 512x512)": "Introduceți Dimensiunea Imaginii (de ex. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Introduceți codurile limbilor", "Enter Model ID": "Introdu codul modelului", @@ -543,6 +556,8 @@ "JSON Preview": "Previzualizare JSON", "July": "Iulie", "June": "Iunie", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Expirarea JWT", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Ascult...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM-urile pot face greșeli. Verificați informațiile importante.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Modele Locale", "Lost": "Pierdut", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Asigură-te că exporți un fișier {{workflow.json}} în format API din {{ComfyUI}}.", "Manage": "Gestionează", "Manage Arena Models": "Gestionați Modelele Arena", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Text simplu (.txt)", "Playground": "Teren de Joacă", "Please carefully review the following warnings:": "Vă rugăm să revizuiți cu atenție următoarele avertismente:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Te rog să introduci un mesaj", "Please fill in all fields.": "Vă rugăm să completați toate câmpurile.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Selectează o conductă", "Select a pipeline url": "Selectează un URL de conductă", "Select a tool": "Selectează un instrument", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Selectează motorul", "Select Knowledge": "Selectarea cunoștințelor (Knowledge Selection) este un proces esențial în multiple domenii, incluzând inteligența artificială și învățarea automată. Aceasta presupune alegerea corectă a informațiilor sau datelor relevante dintr-un set mai mare pentru a le utiliza în analize, modele sau sisteme specifice. De exemplu, în învățarea automată, selectarea caracteristicilor este un aspect al selectării cunoștințelor și implică alegerea celor mai relevante date de intrare care contribuie la îmbunătățirea preciziei modelului.", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index e6c6931c75..251b8eb89f 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "Конечная точка поиска Bing V7", "Bing Search V7 Subscription Key": "Ключ API Bing Search V7", + "Bocha Search API Key": "", "Brave Search API Key": "Ключ API поиска Brave", "By {{name}}": "", "Bypass SSL verification for Websites": "Обход проверки SSL для веб-сайтов", @@ -178,6 +179,8 @@ "Code execution": "Выполнение кода", "Code formatted successfully": "Код успешно отформатирован", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Коллекция", "Color": "Цвет", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Подтвердите пароль", "Confirm your action": "Подтвердите свое действие", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Соединение", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Обратитесь к администратору для получения доступа к WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Опишите свою базу знаний и цели", "Description": "Описание", "Didn't fully follow instructions": "Не полностью следует инструкциям", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Отключено", "Discover a function": "Найти функцию", "Discover a model": "Найти модель", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Модель встраивания установлена в \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "Включить генерацию автозаполнения для сообщений чата", + "Enable Code Interpreter": "", "Enable Community Sharing": "Включить совместное использование", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Включите блокировку памяти (mlock), чтобы предотвратить выгрузку данных модели из ОЗУ. Эта опция блокирует рабочий набор страниц модели в оперативной памяти, гарантируя, что они не будут выгружены на диск. Это может помочь поддерживать производительность, избегая ошибок страниц и обеспечивая быстрый доступ к данным.", @@ -337,6 +345,7 @@ "Enable Web Search": "Включить поиск в Интернете", "Enabled": "Включено", "Engine": "Движок", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Убедитесь, что ваш CSV-файл включает в себя 4 столбца в следующем порядке: Имя, Электронная почта, Пароль, Роль.", "Enter {{role}} message here": "Введите сообщение {{role}} здесь", "Enter a detail about yourself for your LLMs to recall": "Введите детали о себе, чтобы LLMs могли запомнить", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Введите ключ API поиска Brave", "Enter certificate path": "Введите путь к сертификату", "Enter CFG Scale (e.g. 7.0)": "Введите CFG Scale (например, 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Введите Id движка Google PSE", "Enter Image Size (e.g. 512x512)": "Введите размер изображения (например, 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Введите коды языков", "Enter Model ID": "Введите ID модели", @@ -543,6 +556,8 @@ "JSON Preview": "Предварительный просмотр JSON", "July": "Июль", "June": "Июнь", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Истечение срока JWT", "JWT Token": "Токен JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Слушаю...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs могут допускать ошибки. Проверяйте важную информацию.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Локальные модели", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Убедитесь, что экспортируете файл workflow.json в формате API из ComfyUI.", "Manage": "Управлять", "Manage Arena Models": "Управление Ареной Моделей", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Управление Ollama", "Manage Ollama API Connections": "Управление соединениями API Ollama", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Текст в формате .txt", "Playground": "Песочница", "Please carefully review the following warnings:": "Пожалуйста, внимательно ознакомьтесь со следующими предупреждениями:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Пожалуйста, введите подсказку", "Please fill in all fields.": "Пожалуйста, заполните все поля.", "Please select a model first.": "Пожалуйста, сначала выберите модель.", @@ -835,6 +853,7 @@ "Select a pipeline": "Выберите конвейер", "Select a pipeline url": "Выберите URL-адрес конвейера", "Select a tool": "Выберите инструмент", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Выберите движок", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index a8fe4aa0b2..129417d7be 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "API kľúč pre Brave Search", "By {{name}}": "", "Bypass SSL verification for Websites": "Obísť overenie SSL pre webové stránky", @@ -178,6 +179,8 @@ "Code execution": "Vykonávanie kódu", "Code formatted successfully": "Kód bol úspešne naformátovaný.", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "", "Color": "Farba", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Potvrdenie hesla", "Confirm your action": "Potvrďte svoju akciu", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Pripojenia", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Kontaktujte administrátora pre prístup k webovému rozhraniu.", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Popis", "Didn't fully follow instructions": "Nenasledovali ste presne všetky inštrukcie.", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Zakázané", "Discover a function": "Objaviť funkciu", "Discover a model": "Objaviť model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Model vkladania nastavený na \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Povoliť zdieľanie komunity", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Povoliť webové vyhľadávanie", "Enabled": "Povolené", "Engine": "Engine", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Uistite sa, že váš CSV súbor obsahuje 4 stĺpce v tomto poradí: Name, Email, Password, Role.", "Enter {{role}} message here": "Zadajte správu {{role}} sem", "Enter a detail about yourself for your LLMs to recall": "Zadajte podrobnosť o sebe, ktorú si vaše LLM majú zapamätať.", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Zadajte API kľúč pre Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "Zadajte mierku CFG (napr. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Zadajte ID vyhľadávacieho mechanizmu Google PSE", "Enter Image Size (e.g. 512x512)": "Zadajte veľkosť obrázka (napr. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Zadajte kódy jazykov", "Enter Model ID": "Zadajte ID modelu", @@ -543,6 +556,8 @@ "JSON Preview": "Náhľad JSON", "July": "Júl", "June": "Jún", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Vypršanie platnosti JWT (JSON Web Token)", "JWT Token": "JWT Token (JSON Web Token)", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Počúvanie...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM môžu robiť chyby. Overte si dôležité informácie.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Lokálne modely", "Lost": "Stratený", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Uistite sa, že exportujete súbor workflow.json vo formáte API z ComfyUI.", "Manage": "Spravovať", "Manage Arena Models": "Správa modelov v Arena", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Čistý text (.txt)", "Playground": "", "Please carefully review the following warnings:": "Prosím, pozorne si prečítajte nasledujúce upozornenia:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Prosím, zadajte zadanie.", "Please fill in all fields.": "Prosím, vyplňte všetky polia.", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Vyberte pipeline", "Select a pipeline url": "Vyberte URL adresu kanála", "Select a tool": "Vyberte nástroj", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Vyberte engine", "Select Knowledge": "Vybrať znalosti", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 7bc4253aa8..4a2b4d307e 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -122,6 +122,7 @@ "Beta": "Бета", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Апи кључ за храбру претрагу", "By {{name}}": "Од {{name}}", "Bypass SSL verification for Websites": "Заобиђи SSL потврђивање за веб странице", @@ -178,6 +179,8 @@ "Code execution": "Извршавање кода", "Code formatted successfully": "Код форматиран успешно", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Колекција", "Color": "Боја", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Потврди лозинку", "Confirm your action": "Потврди радњу", "Confirm your new password": "Потврди нову лозинку", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Везе", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Пишите админима за приступ на WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Опишите вашу базу знања и циљеве", "Description": "Опис", "Didn't fully follow instructions": "Упутства нису праћена у потпуности", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Онемогућено", "Discover a function": "Откријте функцију", "Discover a model": "Откријте модел", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Модел уградње подешен на \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Омогући дељење заједнице", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Омогући Wеб претрагу", "Enabled": "Омогућено", "Engine": "Мотор", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверите се да ваша CSV датотека укључује 4 колоне у овом редоследу: Име, Е-пошта, Лозинка, Улога.", "Enter {{role}} message here": "Унесите {{role}} поруку овде", "Enter a detail about yourself for your LLMs to recall": "Унесите детаље за себе да ће LLMs преузимати", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Унесите БРАВЕ Сеарцх АПИ кључ", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Унесите Гоогле ПСЕ ИД машине", "Enter Image Size (e.g. 512x512)": "Унесите величину слике (нпр. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Унесите кодове језика", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "ЈСОН Преглед", "July": "Јул", "June": "Јун", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Истек JWT-а", "JWT Token": "JWT жетон", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Слушам...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "ВЈМ-ови (LLM-ови) могу правити грешке. Проверите важне податке.", + "Loading Kokoro.js...": "", "Local": "Локално", "Local Models": "Локални модели", "Lost": "Пораза", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Управљај", "Manage Arena Models": "Управљај моделима арене", + "Manage Direct Connections": "", "Manage Models": "Управљај моделима", "Manage Ollama": "Управљај Ollama-ом", "Manage Ollama API Connections": "Управљај Ollama АПИ везама", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Обичан текст (.txt)", "Playground": "Игралиште", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Избор цевовода", "Select a pipeline url": "Избор урл адресе цевовода", "Select a tool": "Изабери алат", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Изабери мотор", "Select Knowledge": "Изабери знање", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 6fda8fada5..67e4967df5 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "API-nyckel för Brave Search", "By {{name}}": "", "Bypass SSL verification for Websites": "Kringgå SSL-verifiering för webbplatser", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Samling", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Bekräfta lösenord", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Anslutningar", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Kontakta administratören för att få åtkomst till WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Beskrivning", "Didn't fully follow instructions": "Följde inte instruktionerna", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "Upptäck en modell", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Inbäddningsmodell inställd på \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Aktivera community-delning", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Aktivera webbsökning", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Se till att din CSV-fil innehåller fyra kolumner i denna ordning: Name, Email, Password, Role.", "Enter {{role}} message here": "Skriv {{role}} meddelande här", "Enter a detail about yourself for your LLMs to recall": "Skriv en detalj om dig själv för att dina LLMs ska komma ihåg", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Ange API-nyckel för Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Ange Google PSE Engine Id", "Enter Image Size (e.g. 512x512)": "Ange bildstorlek (t.ex. 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Skriv språkkoder", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "Förhandsversion av JSON", "July": "juli", "June": "juni", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT-utgångsdatum", "JWT Token": "JWT-token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Lyssnar...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM:er kan göra misstag. Granska viktig information.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "Lokala modeller", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "Hantera", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Text (.txt)", "Playground": "Lekplats", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Välj en rörledning", "Select a pipeline url": "Välj en URL för rörledningen", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 530a8e00d6..1fbfc17959 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "คีย์ API ของ Brave Search", "By {{name}}": "", "Bypass SSL verification for Websites": "ข้ามการตรวจสอบ SSL สำหรับเว็บไซต์", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "จัดรูปแบบโค้ดสำเร็จแล้ว", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "คอลเลคชัน", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "ยืนยันรหัสผ่าน", "Confirm your action": "ยืนยันการดำเนินการของคุณ", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "การเชื่อมต่อ", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "ติดต่อผู้ดูแลระบบสำหรับการเข้าถึง WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "คำอธิบาย", "Didn't fully follow instructions": "ไม่ได้ปฏิบัติตามคำแนะนำทั้งหมด", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "ปิดใช้งาน", "Discover a function": "ค้นหาฟังก์ชัน", "Discover a model": "ค้นหาโมเดล", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "ตั้งค่าโมเดลการฝังเป็น \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "เปิดใช้งานการแชร์ในชุมชน", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "เปิดใช้งานการค้นหาเว็บ", "Enabled": "เปิดใช้งาน", "Engine": "เครื่องยนต์", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ตรวจสอบว่าไฟล์ CSV ของคุณมี 4 คอลัมน์ในลำดับนี้: ชื่อ, อีเมล, รหัสผ่าน, บทบาท", "Enter {{role}} message here": "ใส่ข้อความ {{role}} ที่นี่", "Enter a detail about yourself for your LLMs to recall": "ใส่รายละเอียดเกี่ยวกับตัวคุณสำหรับ LLMs ของคุณให้จดจำ", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "ใส่คีย์ API ของ Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "ใส่รหัสเครื่องยนต์ของ Google PSE", "Enter Image Size (e.g. 512x512)": "ใส่ขนาดภาพ (เช่น 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "ใส่รหัสภาษา", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "ดูตัวอย่าง JSON", "July": "กรกฎาคม", "June": "มิถุนายน", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "การหมดอายุของ JWT", "JWT Token": "โทเค็น JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "กำลังฟัง...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs สามารถทำผิดพลาดได้ ตรวจสอบข้อมูลสำคัญ", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "โมเดลท้องถิ่น", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "จัดการ", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "ไฟล์ข้อความ (.txt)", "Playground": "สนามทดสอบ", "Please carefully review the following warnings:": "โปรดตรวจสอบคำเตือนต่อไปนี้อย่างละเอียด:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "เลือกไปป์ไลน์", "Select a pipeline url": "เลือก URL ไปป์ไลน์", "Select a tool": "เลือกเครื่องมือ", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/tk-TW/translation.json b/src/lib/i18n/locales/tk-TW/translation.json index cef4f22f33..84c9ceba07 100644 --- a/src/lib/i18n/locales/tk-TW/translation.json +++ b/src/lib/i18n/locales/tk-TW/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "", "By {{name}}": "", "Bypass SSL verification for Websites": "", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "", "Color": "", "ComfyUI": "", @@ -194,6 +197,7 @@ "Confirm Password": "", "Confirm your action": "", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "", "Didn't fully follow instructions": "", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "", "Discover a function": "", "Discover a model": "", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "", "Enter a detail about yourself for your LLMs to recall": "", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "", "Enter Image Size (e.g. 512x512)": "", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "", "July": "", "June": "", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "", "JWT Token": "", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "", "Manage": "", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "", "Playground": "", "Please carefully review the following warnings:": "", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "", "Select a pipeline url": "", "Select a tool": "", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 931aed1e5f..018ae5f2da 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -122,6 +122,7 @@ "Beta": "Beta", "Bing Search V7 Endpoint": "Bing Arama V7 Uç Noktası", "Bing Search V7 Subscription Key": "Bing Arama V7 Abonelik Anahtarı", + "Bocha Search API Key": "", "Brave Search API Key": "Brave Search API Anahtarı", "By {{name}}": "{{name}} Tarafından", "Bypass SSL verification for Websites": "Web Siteleri için SSL doğrulamasını atlayın", @@ -178,6 +179,8 @@ "Code execution": "Kod yürütme", "Code formatted successfully": "Kod başarıyla biçimlendirildi", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Koleksiyon", "Color": "Renk", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Parolayı Onayla", "Confirm your action": "İşleminizi onaylayın", "Confirm your new password": "Yeni parolanızı onaylayın", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Bağlantılar", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "WebUI Erişimi için Yöneticiyle İletişime Geçin", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Bilgi tabanınızı ve hedeflerinizi açıklayın", "Description": "Açıklama", "Didn't fully follow instructions": "Talimatları tam olarak takip etmedi", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Devre Dışı", "Discover a function": "Bir fonksiyon keşfedin", "Discover a model": "Bir model keşfedin", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Gömme modeli \"{{embedding_model}}\" olarak ayarlandı", "Enable API Key": "API Anahtarını Etkinleştir", "Enable autocomplete generation for chat messages": "Sohbet mesajları için otomatik tamamlama üretimini etkinleştir", + "Enable Code Interpreter": "", "Enable Community Sharing": "Topluluk Paylaşımını Etkinleştir", "Enable Google Drive": "Google Drive'ı Etkinleştir", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Web Aramasını Etkinleştir", "Enabled": "Etkin", "Engine": "Motor", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV dosyanızın şu sırayla 4 sütun içerdiğinden emin olun: İsim, E-posta, Şifre, Rol.", "Enter {{role}} message here": "Buraya {{role}} mesajını girin", "Enter a detail about yourself for your LLMs to recall": "LLM'lerinizin hatırlaması için kendiniz hakkında bir bilgi girin", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Uygulama DN Parolasını Girin", "Enter Bing Search V7 Endpoint": "Bing Arama V7 Uç Noktasını Girin", "Enter Bing Search V7 Subscription Key": "Bing Arama V7 Abonelik Anahtarını Girin", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Brave Search API Anahtarını Girin", "Enter certificate path": "Sertifika yolunu girin", "Enter CFG Scale (e.g. 7.0)": "CFG Ölçeğini Girin (örn. 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Google PSE Engine Id'sini Girin", "Enter Image Size (e.g. 512x512)": "Görüntü Boyutunu Girin (örn. 512x512)", "Enter Jina API Key": "Jina API Anahtarını Girin", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Kagi Search API Anahtarını Girin", "Enter language codes": "Dil kodlarını girin", "Enter Model ID": "Model ID'sini Girin", @@ -543,6 +556,8 @@ "JSON Preview": "JSON Önizlemesi", "July": "Temmuz", "June": "Haziran", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT Bitişi", "JWT Token": "JWT Token", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Dinleniyor...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLM'ler hata yapabilir. Önemli bilgileri doğrulayın.", + "Loading Kokoro.js...": "", "Local": "Yerel", "Local Models": "Yerel Modeller", "Lost": "Kayıp", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "ComfyUI'dan API formatında bir workflow.json dosyası olarak dışa aktardığınızdan emin olun.", "Manage": "Yönet", "Manage Arena Models": "Arena Modellerini Yönet", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "Ollama'yı Yönet", "Manage Ollama API Connections": "Ollama API Bağlantılarını Yönet", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Düz metin (.txt)", "Playground": "Oyun Alanı", "Please carefully review the following warnings:": "Lütfen aşağıdaki uyarıları dikkatlice inceleyin:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Lütfen bir prompt girin", "Please fill in all fields.": "Lütfen tüm alanları doldurun.", "Please select a model first.": "Lütfen önce bir model seçin.", @@ -835,6 +853,7 @@ "Select a pipeline": "Bir pipeline seç", "Select a pipeline url": "Bir pipeline URL'si seç", "Select a tool": "Bir araç seç", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Motor Seç", "Select Knowledge": "Bilgi Seç", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 1d59e415e3..5e15373b5f 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -122,6 +122,7 @@ "Beta": "Beta", "Bing Search V7 Endpoint": "Точка доступу Bing Search V7", "Bing Search V7 Subscription Key": "Ключ підписки Bing Search V7", + "Bocha Search API Key": "", "Brave Search API Key": "Ключ API пошуку Brave", "By {{name}}": "Від {{name}}", "Bypass SSL verification for Websites": "Обхід SSL-перевірки для веб-сайтів", @@ -178,6 +179,8 @@ "Code execution": "Виконання коду", "Code formatted successfully": "Код успішно відформатовано", "Code Interpreter": "Інтерпретатор коду", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Колекція", "Color": "Колір", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Підтвердіть пароль", "Confirm your action": "Підтвердіть свою дію", "Confirm your new password": "Підтвердіть свій новий пароль", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "З'єднання", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Обмежує зусилля на міркування для моделей міркування. Застосовується лише до моделей від певних постачальників, які підтримують зусилля на міркування. (За замовчуванням: середній)", "Contact Admin for WebUI Access": "Зверніться до адміна для отримання доступу до WebUI", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "Опишіть вашу базу знань та цілі", "Description": "Опис", "Didn't fully follow instructions": "Не повністю дотримувалися інструкцій", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Вимкнено", "Discover a function": "Знайдіть функцію", "Discover a model": "Знайдіть модель", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Встановлена модель вбудовування \"{{embedding_model}}\"", "Enable API Key": "Увімкнути ключ API", "Enable autocomplete generation for chat messages": "Увімкнути генерацію автозаповнення для повідомлень чату", + "Enable Code Interpreter": "", "Enable Community Sharing": "Увімкнути спільний доступ", "Enable Google Drive": "Увімкнути Google Drive", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Увімкнути блокування пам'яті (mlock), щоб запобігти виведенню даних моделі з оперативної пам'яті. Цей параметр блокує робочий набір сторінок моделі в оперативній пам'яті, гарантуючи, що вони не будуть виведені на диск. Це може допомогти підтримувати продуктивність, уникати помилок сторінок та забезпечувати швидкий доступ до даних.", @@ -337,6 +345,7 @@ "Enable Web Search": "Увімкнути веб-пошук", "Enabled": "Увімкнено", "Engine": "Рушій", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Переконайтеся, що ваш CSV-файл містить 4 колонки в такому порядку: Ім'я, Email, Пароль, Роль.", "Enter {{role}} message here": "Введіть повідомлення {{role}} тут", "Enter a detail about yourself for your LLMs to recall": "Введіть відомості про себе для запам'ятовування вашими LLM.", @@ -345,6 +354,7 @@ "Enter Application DN Password": "Введіть пароль DN застосунку", "Enter Bing Search V7 Endpoint": "Введіть точку доступу Bing Search V7", "Enter Bing Search V7 Subscription Key": "Введіть ключ підписки Bing Search V7", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Введіть ключ API для пошуку Brave", "Enter certificate path": "Введіть шлях до сертифіката", "Enter CFG Scale (e.g. 7.0)": "Введіть масштаб CFG (напр., 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Введіть Google PSE Engine Id", "Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)", "Enter Jina API Key": "Введіть ключ API Jina", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "Введіть ключ API Kagi Search", "Enter language codes": "Введіть мовні коди", "Enter Model ID": "Введіть ID моделі", @@ -543,6 +556,8 @@ "JSON Preview": "Перегляд JSON", "July": "Липень", "June": "Червень", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "Термін дії JWT", "JWT Token": "Токен JWT", "Kagi Search API Key": "Kagi Search API ключ", @@ -576,6 +591,7 @@ "Listening...": "Слухаю...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "LLMs можуть помилятися. Перевірте важливу інформацію.", + "Loading Kokoro.js...": "", "Local": "Локальний", "Local Models": "Локальні моделі", "Lost": "Втрачене", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Обов'язково експортуйте файл workflow.json у форматі API з ComfyUI.", "Manage": "Керувати", "Manage Arena Models": "Керувати моделями Arena", + "Manage Direct Connections": "", "Manage Models": "Керувати моделями", "Manage Ollama": "Керувати Ollama", "Manage Ollama API Connections": "Керувати з'єднаннями Ollama API", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Простий текст (.txt)", "Playground": "Майданчик", "Please carefully review the following warnings:": "Будь ласка, уважно ознайомтеся з наступними попередженнями:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "Будь ласка, введіть підказку", "Please fill in all fields.": "Будь ласка, заповніть всі поля.", "Please select a model first.": "Будь ласка, спочатку виберіть модель.", @@ -835,6 +853,7 @@ "Select a pipeline": "Оберіть конвеєр", "Select a pipeline url": "Оберіть адресу конвеєра", "Select a tool": "Оберіть інструмент", + "Select an auth method": "", "Select an Ollama instance": "Виберіть екземпляр Ollama", "Select Engine": "Виберіть двигун", "Select Knowledge": "Вибрати знання", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index 80f26500ac..79ce193609 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "بریو سرچ API کلید", "By {{name}}": "", "Bypass SSL verification for Websites": "ویب سائٹس کے لیے SSL تصدیق کو نظر انداز کریں", @@ -178,6 +179,8 @@ "Code execution": "کوڈ کا نفاذ", "Code formatted successfully": "کوڈ کامیابی سے فارمیٹ ہو گیا", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "کلیکشن", "Color": "", "ComfyUI": "کومفی یو آئی", @@ -194,6 +197,7 @@ "Confirm Password": "پاس ورڈ کی توثیق کریں", "Confirm your action": "اپنی کارروائی کی تصدیق کریں", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "کنکشنز", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "ویب یو آئی رسائی کے لیے ایڈمن سے رابطہ کریں", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "تفصیل", "Didn't fully follow instructions": "ہدایات کو مکمل طور پر نہیں سمجھا", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "غیر فعال", "Discover a function": "ایک فنکشن دریافت کریں", "Discover a model": "ایک ماڈل دریافت کریں", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "ایمبیڈنگ ماڈل \"{{embedding_model}}\" پر سیٹ کیا گیا ہے", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "کمیونٹی شیئرنگ فعال کریں", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "ویب تلاش فعال کریں", "Enabled": "فعال کردیا گیا ہے", "Engine": "انجن", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "یقینی بنائیں کہ آپ کی CSV فائل میں 4 کالم اس ترتیب میں شامل ہوں: نام، ای میل، پاس ورڈ، کردار", "Enter {{role}} message here": "یہاں {{کردار}} پیغام درج کریں", "Enter a detail about yourself for your LLMs to recall": "اپنی ذات کے بارے میں کوئی تفصیل درج کریں تاکہ آپ کے LLMs اسے یاد رکھ سکیں", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "بریو سرچ API کلید درج کریں", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "CFG اسکیل درج کریں (مثلاً 7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "گوگل پی ایس ای انجن آئی ڈی درج کریں", "Enter Image Size (e.g. 512x512)": "تصویر کا سائز درج کریں (مثال: 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "زبان کے کوڈ درج کریں", "Enter Model ID": "ماڈل آئی ڈی درج کریں", @@ -543,6 +556,8 @@ "JSON Preview": "JSON پیش منظر", "July": "جولائی", "June": "جون", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT کی میعاد ختم ہونا", "JWT Token": "JWT ٹوکن", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "سن رہے ہیں...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "ایل ایل ایم غلطیاں کر سکتے ہیں اہم معلومات کی تصدیق کریں", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "مقامی ماڈلز", "Lost": "گم شدہ", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "یقینی بنائیں کہ ComfyUI سے workflow.json فائل کو API فارمیٹ میں ایکسپورٹ کریں", "Manage": "مینیج کریں", "Manage Arena Models": "ایرینا ماڈلز کا نظم کریں", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "سادہ متن (.txt)", "Playground": "کھیل کا میدان", "Please carefully review the following warnings:": "براہ کرم درج ذیل انتباہات کو احتیاط سے پڑھیں:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "براہ کرم ایک پرامپٹ درج کریں", "Please fill in all fields.": "براہ کرم تمام فیلڈز مکمل کریں", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "ایک پائپ لائن منتخب کریں", "Select a pipeline url": "پائپ لائن یو آر ایل منتخب کریں", "Select a tool": "ایک ٹول منتخب کریں", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "انجن منتخب کریں", "Select Knowledge": "علم منتخب کریں", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index f9f6178f32..ee4bfe177b 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -122,6 +122,7 @@ "Beta": "", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "", + "Bocha Search API Key": "", "Brave Search API Key": "Khóa API tìm kiếm dũng cảm", "By {{name}}": "", "Bypass SSL verification for Websites": "Bỏ qua xác thực SSL cho các trang web", @@ -178,6 +179,8 @@ "Code execution": "", "Code formatted successfully": "Mã được định dạng thành công", "Code Interpreter": "", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "Tổng hợp mọi tài liệu", "Color": "", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "Xác nhận Mật khẩu", "Confirm your action": "Xác nhận hành động của bạn", "Confirm your new password": "", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "Kết nối", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "", "Contact Admin for WebUI Access": "Liên hệ với Quản trị viên để được cấp quyền truy cập", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "", "Description": "Mô tả", "Didn't fully follow instructions": "Không tuân theo chỉ dẫn một cách đầy đủ", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "Đã tắt", "Discover a function": "Khám phá function", "Discover a model": "Khám phá model", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "Mô hình embedding đã được thiết lập thành \"{{embedding_model}}\"", "Enable API Key": "", "Enable autocomplete generation for chat messages": "", + "Enable Code Interpreter": "", "Enable Community Sharing": "Cho phép Chia sẻ Cộng đồng", "Enable Google Drive": "", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "", @@ -337,6 +345,7 @@ "Enable Web Search": "Cho phép tìm kiếm Web", "Enabled": "Đã bật", "Engine": "", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Đảm bảo tệp CSV của bạn bao gồm 4 cột theo thứ tự sau: Name, Email, Password, Role.", "Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây", "Enter a detail about yourself for your LLMs to recall": "Nhập chi tiết về bản thân của bạn để LLMs có thể nhớ", @@ -345,6 +354,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "Nhập API key cho Brave Search", "Enter certificate path": "", "Enter CFG Scale (e.g. 7.0)": "", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "Nhập Google PSE Engine Id", "Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)", "Enter Jina API Key": "", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "", "Enter language codes": "Nhập mã ngôn ngữ", "Enter Model ID": "", @@ -543,6 +556,8 @@ "JSON Preview": "Xem trước JSON", "July": "Tháng 7", "June": "Tháng 6", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT Hết hạn", "JWT Token": "Token JWT", "Kagi Search API Key": "", @@ -576,6 +591,7 @@ "Listening...": "Đang nghe...", "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "Hệ thống có thể tạo ra nội dung không chính xác hoặc sai. Hãy kiểm chứng kỹ lưỡng thông tin trước khi tiếp nhận và sử dụng.", + "Loading Kokoro.js...": "", "Local": "", "Local Models": "", "Lost": "", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "Đảm bảo xuất tệp Workflow.json đúng format API của ComfyUI.", "Manage": "Quản lý", "Manage Arena Models": "", + "Manage Direct Connections": "", "Manage Models": "", "Manage Ollama": "", "Manage Ollama API Connections": "", @@ -728,6 +745,7 @@ "Plain text (.txt)": "Văn bản thô (.txt)", "Playground": "Thử nghiệm (Playground)", "Please carefully review the following warnings:": "Vui lòng xem xét cẩn thận các cảnh báo sau:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "", "Please fill in all fields.": "", "Please select a model first.": "", @@ -835,6 +853,7 @@ "Select a pipeline": "Chọn một quy trình", "Select a pipeline url": "Chọn url quy trình", "Select a tool": "Chọn tool", + "Select an auth method": "", "Select an Ollama instance": "", "Select Engine": "Chọn Engine", "Select Knowledge": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 186f3abfce..e48499024b 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -122,6 +122,7 @@ "Beta": "Beta", "Bing Search V7 Endpoint": "Bing 搜索 V7 Endpoint", "Bing Search V7 Subscription Key": "Bing 搜索 V7 订阅密钥", + "Bocha Search API Key": "Bocha Search API 密钥", "Brave Search API Key": "Brave Search API 密钥", "By {{name}}": "由 {{name}} 提供", "Bypass SSL verification for Websites": "绕过网站的 SSL 验证", @@ -178,6 +179,8 @@ "Code execution": "代码执行", "Code formatted successfully": "代码格式化成功", "Code Interpreter": "代码解释器", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "文件集", "Color": "颜色", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "确认密码", "Confirm your action": "确定吗?", "Confirm your new password": "确认新密码", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "外部连接", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "限制推理模型的推理努力。仅适用于支持推理努力的特定提供商的推理模型。(默认值:中等)", "Contact Admin for WebUI Access": "请联系管理员以获取访问权限", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "描述您的知识库和目标", "Description": "描述", "Didn't fully follow instructions": "没有完全遵照指示", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "禁用", "Discover a function": "发现更多函数", "Discover a model": "发现更多模型", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "语义向量模型设置为 \"{{embedding_model}}\"", "Enable API Key": "启用 API 密钥", "Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容猜测补全", + "Enable Code Interpreter": "", "Enable Community Sharing": "启用分享至社区", "Enable Google Drive": "启用 Google 云端硬盘", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "启用内存锁定(mlock)以防止模型数据被交换出RAM。此选项将模型的工作集页面锁定在RAM中,确保它们不会被交换到磁盘。这可以通过避免页面错误和确保快速数据访问来帮助维持性能。", @@ -337,6 +345,7 @@ "Enable Web Search": "启用联网搜索", "Enabled": "启用", "Engine": "引擎", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "确保您的 CSV 文件按以下顺序包含 4 列: 姓名、电子邮箱、密码、角色。", "Enter {{role}} message here": "在此处输入 {{role}} 的对话内容", "Enter a detail about yourself for your LLMs to recall": "输入一个关于你自己的详细信息,方便你的大语言模型记住这些内容", @@ -345,6 +354,7 @@ "Enter Application DN Password": "输入 Application DN 密码", "Enter Bing Search V7 Endpoint": "输入 Bing Search V7 端点", "Enter Bing Search V7 Subscription Key": "输入 Bing Search V7 订阅密钥", + "Enter Bocha Search API Key": "输入 Bocha Search API 密钥", "Enter Brave Search API Key": "输入 Brave Search API 密钥", "Enter certificate path": "输入证书路径", "Enter CFG Scale (e.g. 7.0)": "输入 CFG Scale (例如:7.0)", @@ -358,12 +368,14 @@ "Enter Google PSE Engine Id": "输入 Google PSE 引擎 ID", "Enter Image Size (e.g. 512x512)": "输入图像分辨率 (例如:512x512)", "Enter Jina API Key": "输入 Jina API 密钥", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "输入 Kagi Search API 密钥", "Enter language codes": "输入语言代码", "Enter Model ID": "输入模型 ID", "Enter model tag (e.g. {{modelTag}})": "输入模型标签 (例如:{{modelTag}})", "Enter Mojeek Search API Key": "输入 Mojeek Search API 密钥", - "Enter Bocha Search API Key": "输入 Bocha Search API 密钥", "Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps) (例如:50)", "Enter proxy URL (e.g. https://user:password@host:port)": "输入代理 URL (例如:https://用户名:密码@主机名:端口)", "Enter reasoning effort": "设置推理努力", @@ -544,6 +556,8 @@ "JSON Preview": "JSON 预览", "July": "七月", "June": "六月", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT 过期", "JWT Token": "JWT 令牌", "Kagi Search API Key": "Kagi 搜索 API 密钥", @@ -577,6 +591,7 @@ "Listening...": "正在倾听...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "大语言模型可能会生成误导性错误信息,请对关键信息加以验证。", + "Loading Kokoro.js...": "", "Local": "本地", "Local Models": "本地模型", "Lost": "落败", @@ -586,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "确保从 ComfyUI 导出 API 格式的 workflow.json 文件。", "Manage": "管理", "Manage Arena Models": "管理竞技场模型", + "Manage Direct Connections": "", "Manage Models": "管理模型", "Manage Ollama": "管理 Ollama", "Manage Ollama API Connections": "管理Ollama API连接", @@ -633,7 +649,6 @@ "Models Access": "访问模型列表", "Models configuration saved successfully": "模型配置保存成功", "Mojeek Search API Key": "Mojeek Search API 密钥", - "Bocha Search API Key": "Bocha Search API 密钥", "more": "更多", "More": "更多", "Name": "名称", @@ -730,6 +745,7 @@ "Plain text (.txt)": "TXT 文档 (.txt)", "Playground": "AI 对话游乐场", "Please carefully review the following warnings:": "请仔细阅读以下警告信息:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "请输出一个 prompt", "Please fill in all fields.": "请填写所有字段。", "Please select a model first.": "请先选择一个模型。", @@ -837,6 +853,7 @@ "Select a pipeline": "选择一个管道", "Select a pipeline url": "选择一个管道 URL", "Select a tool": "选择一个工具", + "Select an auth method": "", "Select an Ollama instance": "选择一个 Ollama 实例。", "Select Engine": "选择引擎", "Select Knowledge": "选择知识", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 1ecc0128a2..eb1c4c4b57 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -122,6 +122,7 @@ "Beta": "測試", "Bing Search V7 Endpoint": "Bing 搜尋 V7 端點", "Bing Search V7 Subscription Key": "Bing 搜尋 V7 訂閱金鑰", + "Bocha Search API Key": "", "Brave Search API Key": "Brave 搜尋 API 金鑰", "By {{name}}": "由 {{name}} 製作", "Bypass SSL verification for Websites": "略過網站的 SSL 驗證", @@ -178,6 +179,8 @@ "Code execution": "程式碼執行", "Code formatted successfully": "程式碼格式化成功", "Code Interpreter": "程式碼解釋器", + "Code Interpreter Engine": "", + "Code Interpreter Prompt Template": "", "Collection": "收藏", "Color": "顏色", "ComfyUI": "ComfyUI", @@ -194,6 +197,7 @@ "Confirm Password": "確認密碼", "Confirm your action": "確認您的操作", "Confirm your new password": "確認您的新密碼", + "Connect to your own OpenAI compatible API endpoints.": "", "Connections": "連線", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "限制用於推理模型的推理程度 。僅適用於特定供應商提供的、支援推理程度設定的推理模型。(預設:中等)", "Contact Admin for WebUI Access": "請聯絡管理員以取得 WebUI 存取權限", @@ -269,6 +273,9 @@ "Describe your knowledge base and objectives": "描述您的知識庫和目標", "Description": "描述", "Didn't fully follow instructions": "未完全遵循指示", + "Direct Connections": "", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", + "Direct Connections settings updated": "", "Disabled": "已停用", "Discover a function": "發掘函式", "Discover a model": "發掘模型", @@ -327,6 +334,7 @@ "Embedding model set to \"{{embedding_model}}\"": "嵌入模型已設定為 \"{{embedding_model}}\"", "Enable API Key": "啟用 API 金鑰", "Enable autocomplete generation for chat messages": "啟用聊天訊息的自動完成生成", + "Enable Code Interpreter": "", "Enable Community Sharing": "啟用社群分享", "Enable Google Drive": "啟用 Google Drive", "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "啟用記憶體鎖定(mlock)以防止模型資料被換出 RAM。此選項會將模型的工作頁面集鎖定在 RAM 中,確保它們不會被換出到磁碟。這可以透過避免頁面錯誤和確保快速資料存取來維持效能。", @@ -337,6 +345,7 @@ "Enable Web Search": "啟用網頁搜尋", "Enabled": "已啟用", "Engine": "引擎", + "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "請確認您的 CSV 檔案包含以下 4 個欄位,並按照此順序排列:姓名、電子郵件、密碼、角色。", "Enter {{role}} message here": "在此輸入 {{role}} 訊息", "Enter a detail about yourself for your LLMs to recall": "輸入有關您的詳細資訊,讓您的大型語言模型可以回想起來", @@ -345,6 +354,7 @@ "Enter Application DN Password": "輸入應用程式 DN 密碼", "Enter Bing Search V7 Endpoint": "輸入 Bing 搜尋 V7 端點", "Enter Bing Search V7 Subscription Key": "輸入 Bing 搜尋 V7 訂閱金鑰", + "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "輸入 Brave 搜尋 API 金鑰", "Enter certificate path": "輸入憑證路徑", "Enter CFG Scale (e.g. 7.0)": "輸入 CFG 比例(例如:7.0)", @@ -358,6 +368,9 @@ "Enter Google PSE Engine Id": "輸入 Google PSE 引擎 ID", "Enter Image Size (e.g. 512x512)": "輸入圖片大小(例如:512x512)", "Enter Jina API Key": "輸入 Jina API 金鑰", + "Enter Jupyter Password": "", + "Enter Jupyter Token": "", + "Enter Jupyter URL": "", "Enter Kagi Search API Key": "輸入 Kagi 搜尋 API 金鑰", "Enter language codes": "輸入語言代碼", "Enter Model ID": "輸入模型 ID", @@ -543,6 +556,8 @@ "JSON Preview": "JSON 預覽", "July": "7 月", "June": "6 月", + "Jupyter Auth": "", + "Jupyter URL": "", "JWT Expiration": "JWT 過期時間", "JWT Token": "JWT Token", "Kagi Search API Key": "Kagi 搜尋 API 金鑰", @@ -576,6 +591,7 @@ "Listening...": "正在聆聽...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "大型語言模型可能會出錯。請驗證重要資訊。", + "Loading Kokoro.js...": "", "Local": "本機", "Local Models": "本機模型", "Lost": "已遺失", @@ -585,6 +601,7 @@ "Make sure to export a workflow.json file as API format from ComfyUI.": "請確保從 ComfyUI 匯出 workflow.json 檔案為 API 格式。", "Manage": "管理", "Manage Arena Models": "管理競技模型", + "Manage Direct Connections": "", "Manage Models": "管理模型", "Manage Ollama": "管理 Ollama", "Manage Ollama API Connections": "管理 Ollama API 連線", @@ -728,6 +745,7 @@ "Plain text (.txt)": "純文字 (.txt)", "Playground": "遊樂場", "Please carefully review the following warnings:": "請仔細閱讀以下警告:", + "Please do not close the settings page while loading the model.": "", "Please enter a prompt": "請輸入提示詞", "Please fill in all fields.": "請填寫所有欄位。", "Please select a model first.": "請先選擇型號。", @@ -835,6 +853,7 @@ "Select a pipeline": "選擇管線", "Select a pipeline url": "選擇管線 URL", "Select a tool": "選擇工具", + "Select an auth method": "", "Select an Ollama instance": "選擇一個 Ollama 實例", "Select Engine": "選擇引擎", "Select Knowledge": "選擇知識庫", From 7e73790d6c136844d53efab490a64568786308b6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 23:33:53 -0800 Subject: [PATCH 108/117] refac --- src/lib/apis/index.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/lib/apis/index.ts b/src/lib/apis/index.ts index 53c577a457..3fb4a5d01b 100644 --- a/src/lib/apis/index.ts +++ b/src/lib/apis/index.ts @@ -68,7 +68,21 @@ export const getModels = async ( })() ); } else { - requests.push(getOpenAIModelsDirect(url, OPENAI_API_KEYS[idx])); + requests.push( + (async () => { + return await getOpenAIModelsDirect(url, OPENAI_API_KEYS[idx]) + .then((res) => { + return res; + }) + .catch((err) => { + return { + object: 'list', + data: [], + urlIdx: idx + }; + }); + })() + ); } } else { requests.push( From c5b92dbffa6de0dc3d9ee1aca9791721623cfb15 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 23:38:48 -0800 Subject: [PATCH 109/117] chore: bump --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5c18101bd..710ee7fcec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.5.10", + "version": "0.5.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.5.10", + "version": "0.5.11", "dependencies": { "@codemirror/lang-javascript": "^6.2.2", "@codemirror/lang-python": "^6.1.6", diff --git a/package.json b/package.json index aa43f6a754..9a481f0577 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.5.10", + "version": "0.5.11", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host", From a1dc2664c28517d515226f83f2630c7b8873b5e8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 23:49:00 -0800 Subject: [PATCH 110/117] refac --- backend/open_webui/utils/chat.py | 3 +-- backend/open_webui/utils/middleware.py | 12 +----------- src/routes/+layout.svelte | 1 + 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index 03b5d589c6..6e21d8ddb6 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -74,7 +74,6 @@ async def generate_direct_chat_completion( session_id = metadata.get("session_id") request_id = str(uuid.uuid4()) # Generate a unique request ID - event_emitter = get_event_emitter(metadata) event_caller = get_event_call(metadata) channel = f"{user_id}:{session_id}:{request_id}" @@ -191,7 +190,7 @@ async def generate_chat_completion( except Exception as e: raise e - if request.state.direct: + if getattr(request.state, "direct", False): return await generate_direct_chat_completion( request, form_data, user=user, models=models ) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 7195990011..8294c21aa6 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -778,17 +778,7 @@ async def process_chat_payload(request, form_data, metadata, user, model): if "document" in source: for doc_idx, doc_context in enumerate(source["document"]): - doc_metadata = source.get("metadata") - doc_source_id = None - - if doc_metadata: - doc_source_id = doc_metadata[doc_idx].get("source", source_id) - - if source_id: - context_string += f"{doc_source_id if doc_source_id is not None else source_id}{doc_context}\n" - else: - # If there is no source_id, then do not include the source_id tag - context_string += f"{doc_context}\n" + context_string += f"{doc_idx}{doc_context}\n" context_string = context_string.strip() prompt = get_last_user_message(form_data["messages"]) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index cae8fba3a2..ade3171442 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -294,6 +294,7 @@ cb({ status: true }); + console.log({ status: true }); // res will either be SSE or JSON const reader = res.body.getReader(); From 7ff719938a8878446036f7d141f65dd0cdd5d702 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 12 Feb 2025 23:55:14 -0800 Subject: [PATCH 111/117] refac: citations --- .../components/chat/Messages/Citations.svelte | 4 +-- .../chat/Messages/Markdown/Source.svelte | 25 ++++++++++++------- src/lib/utils/index.ts | 9 +++---- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index 041a419bf6..b09f514823 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -100,7 +100,7 @@
{#each citations as citation, idx} diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 0a5b72e362..4d1e92f04e 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -55,15 +55,12 @@ export const replaceTokens = (content, sourceIds, char, user) => { // Remove sourceIds from the content and replace them with ... if (Array.isArray(sourceIds)) { - sourceIds.forEach((sourceId) => { - // Escape special characters in the sourceId - const escapedSourceId = escapeRegExp(sourceId); - + sourceIds.forEach((sourceId, idx) => { // Create a token based on the exact `[sourceId]` string - const sourceToken = `\\[${escapedSourceId}\\]`; // Escape special characters for RegExp + const sourceToken = `\\[${idx}\\]`; // Escape special characters for RegExp const sourceRegex = new RegExp(sourceToken, 'g'); // Match all occurrences of [sourceId] - content = content.replace(sourceRegex, ``); + content = content.replace(sourceRegex, ``); }); } From eb568695e7c5a60db6eff7edea376d1b47f7cf67 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 13 Feb 2025 00:13:33 -0800 Subject: [PATCH 112/117] chore: format --- backend/open_webui/utils/misc.py | 4 ++-- backend/open_webui/utils/response.py | 7 +++++-- src/lib/components/chat/Settings/Connections.svelte | 2 +- src/lib/i18n/locales/ar-BH/translation.json | 2 +- src/lib/i18n/locales/bg-BG/translation.json | 2 +- src/lib/i18n/locales/bn-BD/translation.json | 2 +- src/lib/i18n/locales/ca-ES/translation.json | 2 +- src/lib/i18n/locales/ceb-PH/translation.json | 2 +- src/lib/i18n/locales/cs-CZ/translation.json | 2 +- src/lib/i18n/locales/da-DK/translation.json | 2 +- src/lib/i18n/locales/de-DE/translation.json | 2 +- src/lib/i18n/locales/dg-DG/translation.json | 2 +- src/lib/i18n/locales/el-GR/translation.json | 2 +- src/lib/i18n/locales/en-GB/translation.json | 2 +- src/lib/i18n/locales/en-US/translation.json | 2 +- src/lib/i18n/locales/es-ES/translation.json | 2 +- src/lib/i18n/locales/eu-ES/translation.json | 2 +- src/lib/i18n/locales/fa-IR/translation.json | 2 +- src/lib/i18n/locales/fi-FI/translation.json | 2 +- src/lib/i18n/locales/fr-CA/translation.json | 2 +- src/lib/i18n/locales/fr-FR/translation.json | 2 +- src/lib/i18n/locales/he-IL/translation.json | 2 +- src/lib/i18n/locales/hi-IN/translation.json | 2 +- src/lib/i18n/locales/hr-HR/translation.json | 2 +- src/lib/i18n/locales/hu-HU/translation.json | 2 +- src/lib/i18n/locales/id-ID/translation.json | 2 +- src/lib/i18n/locales/ie-GA/translation.json | 2 +- src/lib/i18n/locales/it-IT/translation.json | 2 +- src/lib/i18n/locales/ja-JP/translation.json | 2 +- src/lib/i18n/locales/ka-GE/translation.json | 2 +- src/lib/i18n/locales/ko-KR/translation.json | 2 +- src/lib/i18n/locales/lt-LT/translation.json | 2 +- src/lib/i18n/locales/ms-MY/translation.json | 2 +- src/lib/i18n/locales/nb-NO/translation.json | 2 +- src/lib/i18n/locales/nl-NL/translation.json | 2 +- src/lib/i18n/locales/pa-IN/translation.json | 2 +- src/lib/i18n/locales/pl-PL/translation.json | 2 +- src/lib/i18n/locales/pt-BR/translation.json | 2 +- src/lib/i18n/locales/pt-PT/translation.json | 2 +- src/lib/i18n/locales/ro-RO/translation.json | 2 +- src/lib/i18n/locales/ru-RU/translation.json | 2 +- src/lib/i18n/locales/sk-SK/translation.json | 2 +- src/lib/i18n/locales/sr-RS/translation.json | 2 +- src/lib/i18n/locales/sv-SE/translation.json | 2 +- src/lib/i18n/locales/th-TH/translation.json | 2 +- src/lib/i18n/locales/tk-TW/translation.json | 2 +- src/lib/i18n/locales/tr-TR/translation.json | 2 +- src/lib/i18n/locales/uk-UA/translation.json | 2 +- src/lib/i18n/locales/ur-PK/translation.json | 2 +- src/lib/i18n/locales/vi-VN/translation.json | 2 +- src/lib/i18n/locales/zh-CN/translation.json | 2 +- src/lib/i18n/locales/zh-TW/translation.json | 2 +- 52 files changed, 57 insertions(+), 54 deletions(-) diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 42559a4312..4eace24dc3 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -217,10 +217,10 @@ def openai_chat_chunk_message_template( def openai_chat_completion_message_template( - model: str, + model: str, message: Optional[str] = None, tool_calls: Optional[list[dict]] = None, - usage: Optional[dict] = None + usage: Optional[dict] = None, ) -> dict: template = openai_chat_message_template(model) template["object"] = "chat.completion" diff --git a/backend/open_webui/utils/response.py b/backend/open_webui/utils/response.py index 90e84fa81a..f9979b4a27 100644 --- a/backend/open_webui/utils/response.py +++ b/backend/open_webui/utils/response.py @@ -16,13 +16,14 @@ def convert_ollama_tool_call_to_openai(tool_calls: dict) -> dict: "function": { "name": tool_call.get("function", {}).get("name", ""), "arguments": json.dumps( - tool_call.get('function', {}).get('arguments', {}) + tool_call.get("function", {}).get("arguments", {}) ), }, } openai_tool_calls.append(openai_tool_call) return openai_tool_calls + def convert_response_ollama_to_openai(ollama_response: dict) -> dict: model = ollama_response.get("model", "ollama") message_content = ollama_response.get("message", {}).get("content", "") @@ -73,7 +74,9 @@ def convert_response_ollama_to_openai(ollama_response: dict) -> dict: ), } - response = openai_chat_completion_message_template(model, message_content, openai_tool_calls, usage) + response = openai_chat_completion_message_template( + model, message_content, openai_tool_calls, usage + ) return response diff --git a/src/lib/components/chat/Settings/Connections.svelte b/src/lib/components/chat/Settings/Connections.svelte index 051171d7f1..f1ffccabde 100644 --- a/src/lib/components/chat/Settings/Connections.svelte +++ b/src/lib/components/chat/Settings/Connections.svelte @@ -130,7 +130,7 @@ {$i18n.t('Connect to your own OpenAI compatible API endpoints.')}
{$i18n.t( - 'Ensure that CORS is properly configured to allow requests from Open WebUI.' + 'CORS must be properly configured by the provider to allow requests from Open WebUI.' )}
diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 358bb6eca0..e136e598e7 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -220,6 +220,7 @@ "Copy Link": "أنسخ الرابط", "Copy to clipboard": "", "Copying to clipboard was successful!": "تم النسخ إلى الحافظة بنجاح", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "إنشاء نموذج", @@ -345,7 +346,6 @@ "Enable Web Search": "تمكين بحث الويب", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.", "Enter {{role}} message here": "أدخل رسالة {{role}} هنا", "Enter a detail about yourself for your LLMs to recall": "ادخل معلومات عنك تريد أن يتذكرها الموديل", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 9c997e87ef..e688906fa5 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Копиране на връзка", "Copy to clipboard": "", "Copying to clipboard was successful!": "Копирането в клипборда беше успешно!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Създаване на модел", @@ -345,7 +346,6 @@ "Enable Web Search": "Разрешаване на търсене в уеб", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.", "Enter {{role}} message here": "Въведете съобщение за {{role}} тук", "Enter a detail about yourself for your LLMs to recall": "Въведете подробности за себе си, за да се herinnerат вашите LLMs", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index fd90ba7516..3482ea1be3 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -220,6 +220,7 @@ "Copy Link": "লিংক কপি করুন", "Copy to clipboard": "", "Copying to clipboard was successful!": "ক্লিপবোর্ডে কপি করা সফল হয়েছে", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "একটি মডেল তৈরি করুন", @@ -345,7 +346,6 @@ "Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.", "Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন", "Enter a detail about yourself for your LLMs to recall": "আপনার এলএলএমগুলি স্মরণ করার জন্য নিজের সম্পর্কে একটি বিশদ লিখুন", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index a6ab9320c1..549efdd1ba 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copiar l'enllaç", "Copy to clipboard": "Copiar al porta-retalls", "Copying to clipboard was successful!": "La còpia al porta-retalls s'ha realitzat correctament", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Crear", "Create a knowledge base": "Crear una base de coneixement", "Create a model": "Crear un model", @@ -345,7 +346,6 @@ "Enable Web Search": "Activar la cerca web", "Enabled": "Habilitat", "Engine": "Motor", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.", "Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}", "Enter a detail about yourself for your LLMs to recall": "Introdueix un detall sobre tu què els teus models de llenguatge puguin recordar", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index 5a1b7cf8b7..3a521996e2 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -220,6 +220,7 @@ "Copy Link": "", "Copy to clipboard": "", "Copying to clipboard was successful!": "Ang pagkopya sa clipboard malampuson!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "", @@ -345,7 +346,6 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi", "Enter a detail about yourself for your LLMs to recall": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 678977dc96..c21b566dca 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopírovat odkaz", "Copy to clipboard": "Kopírovat do schránky", "Copying to clipboard was successful!": "Kopírování do schránky bylo úspěšné!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Vytvořit", "Create a knowledge base": "Vytvořit knowledge base", "Create a model": "Vytvořte model", @@ -345,7 +346,6 @@ "Enable Web Search": "Povolit webové vyhledávání", "Enabled": "Povoleno", "Engine": "Engine", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ujistěte se, že váš CSV soubor obsahuje 4 sloupce v tomto pořadí: Name, Email, Password, Role.", "Enter {{role}} message here": "Zadejte zprávu {{role}} sem", "Enter a detail about yourself for your LLMs to recall": "Zadejte podrobnost o sobě, kterou si vaše LLM mají pamatovat.", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index a4d1176b23..5ca0dd059f 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopier link", "Copy to clipboard": "", "Copying to clipboard was successful!": "Kopieret til udklipsholder!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Lav en model", @@ -345,7 +346,6 @@ "Enable Web Search": "Aktiver websøgning", "Enabled": "Aktiveret", "Engine": "engine", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at din CSV-fil indeholder 4 kolonner in denne rækkefølge: Name, Email, Password, Role.", "Enter {{role}} message here": "Indtast {{role}} besked her", "Enter a detail about yourself for your LLMs to recall": "Indtast en detalje om dig selv, som dine LLMs kan huske", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index e795e3dcb3..baaed32f06 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Link kopieren", "Copy to clipboard": "In die Zwischenablage kopieren", "Copying to clipboard was successful!": "Das Kopieren in die Zwischenablage war erfolgreich!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Erstellen", "Create a knowledge base": "Wissensspeicher erstellen", "Create a model": "Modell erstellen", @@ -345,7 +346,6 @@ "Enable Web Search": "Websuche aktivieren", "Enabled": "Aktiviert", "Engine": "Engine", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.", "Enter {{role}} message here": "Geben Sie die {{role}}-Nachricht hier ein", "Enter a detail about yourself for your LLMs to recall": "Geben Sie ein Detail über sich selbst ein, das Ihre Sprachmodelle (LLMs) sich merken sollen", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 55bc9f8f4a..75c89f08b1 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -220,6 +220,7 @@ "Copy Link": "", "Copy to clipboard": "", "Copying to clipboard was successful!": "Copying to clipboard was success! Very success!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "", @@ -345,7 +346,6 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "Enter {{role}} bork here", "Enter a detail about yourself for your LLMs to recall": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index f220a77beb..d8b6c80d79 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Αντιγραφή Συνδέσμου", "Copy to clipboard": "Αντιγραφή στο πρόχειρο", "Copying to clipboard was successful!": "Η αντιγραφή στο πρόχειρο ήταν επιτυχής!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Δημιουργία", "Create a knowledge base": "Δημιουργία βάσης γνώσης", "Create a model": "Δημιουργία μοντέλου", @@ -345,7 +346,6 @@ "Enable Web Search": "Ενεργοποίηση Αναζήτησης στο Διαδίκτυο", "Enabled": "Ενεργοποιημένο", "Engine": "Μηχανή", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Βεβαιωθείτε ότι το αρχείο CSV σας περιλαμβάνει 4 στήλες με αυτή τη σειρά: Όνομα, Email, Κωδικός, Ρόλος.", "Enter {{role}} message here": "Εισάγετε το μήνυμα {{role}} εδώ", "Enter a detail about yourself for your LLMs to recall": "Εισάγετε μια λεπτομέρεια για τον εαυτό σας ώστε τα LLMs να την ανακαλούν", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 84c9ceba07..130c0946a6 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -220,6 +220,7 @@ "Copy Link": "", "Copy to clipboard": "", "Copying to clipboard was successful!": "", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "", @@ -345,7 +346,6 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "", "Enter a detail about yourself for your LLMs to recall": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 84c9ceba07..130c0946a6 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -220,6 +220,7 @@ "Copy Link": "", "Copy to clipboard": "", "Copying to clipboard was successful!": "", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "", @@ -345,7 +346,6 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "", "Enter a detail about yourself for your LLMs to recall": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index c7919b3824..6821c27d58 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copiar enlace", "Copy to clipboard": "Copiado a portapapeles", "Copying to clipboard was successful!": "¡La copia al portapapeles se ha realizado correctamente!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Crear", "Create a knowledge base": "Crear base de conocimiento", "Create a model": "Crear un modelo", @@ -345,7 +346,6 @@ "Enable Web Search": "Habilitar la búsqueda web", "Enabled": "Activado", "Engine": "Motor", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asegúrese de que su archivo CSV incluya 4 columnas en este orden: Nombre, Correo Electrónico, Contraseña, Rol.", "Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí", "Enter a detail about yourself for your LLMs to recall": "Ingrese un detalle sobre usted para que sus LLMs recuerden", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index d5c448f79e..433f11f383 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopiatu Esteka", "Copy to clipboard": "Kopiatu arbelera", "Copying to clipboard was successful!": "Arbelera kopiatzea arrakastatsua izan da!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Sortu", "Create a knowledge base": "Sortu ezagutza-base bat", "Create a model": "Sortu eredu bat", @@ -345,7 +346,6 @@ "Enable Web Search": "Gaitu Web Bilaketa", "Enabled": "Gaituta", "Engine": "Motorea", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ziurtatu zure CSV fitxategiak 4 zutabe dituela ordena honetan: Izena, Posta elektronikoa, Pasahitza, Rola.", "Enter {{role}} message here": "Sartu {{role}} mezua hemen", "Enter a detail about yourself for your LLMs to recall": "Sartu zure buruari buruzko xehetasun bat LLMek gogoratzeko", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index c2e726b0ee..d236815688 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -220,6 +220,7 @@ "Copy Link": "کپی لینک", "Copy to clipboard": "", "Copying to clipboard was successful!": "کپی کردن در کلیپ بورد با موفقیت انجام شد!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "ایجاد یک مدل", @@ -345,7 +346,6 @@ "Enable Web Search": "فعالسازی جستجوی وب", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "اطمینان حاصل کنید که فایل CSV شما شامل چهار ستون در این ترتیب است: نام، ایمیل، رمز عبور، نقش.", "Enter {{role}} message here": "پیام {{role}} را اینجا وارد کنید", "Enter a detail about yourself for your LLMs to recall": "برای ذخیره سازی اطلاعات خود، یک توضیح کوتاه درباره خود را وارد کنید", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 7c6a52d244..4d87610618 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopioi linkki", "Copy to clipboard": "Kopioi leikepöydälle", "Copying to clipboard was successful!": "Kopioiminen leikepöydälle onnistui!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Luo", "Create a knowledge base": "Luo tietokanta", "Create a model": "Luo malli", @@ -345,7 +346,6 @@ "Enable Web Search": "Ota verkkohaku käyttöön", "Enabled": "Käytössä", "Engine": "Moottori", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta tässä järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.", "Enter {{role}} message here": "Kirjoita {{role}}-viesti tähän", "Enter a detail about yourself for your LLMs to recall": "Kirjoita yksityiskohta itsestäsi, jonka LLM-ohjelmat voivat muistaa", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index 86b72982b5..5efdae54f1 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copier le lien", "Copy to clipboard": "", "Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Créer un modèle", @@ -345,7 +346,6 @@ "Enable Web Search": "Activer la recherche sur le Web", "Enabled": "", "Engine": "Moteur", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.", "Enter {{role}} message here": "Entrez le message {{role}} ici", "Enter a detail about yourself for your LLMs to recall": "Saisissez un détail sur vous-même que vos LLMs pourront se rappeler", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index 85de3954da..e047720182 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copier le lien", "Copy to clipboard": "Copier dans le presse-papiers", "Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Créer", "Create a knowledge base": "Créer une base de connaissances", "Create a model": "Créer un modèle", @@ -345,7 +346,6 @@ "Enable Web Search": "Activer la recherche Web", "Enabled": "Activé", "Engine": "Moteur", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.", "Enter {{role}} message here": "Entrez le message {{role}} ici", "Enter a detail about yourself for your LLMs to recall": "Saisissez un détail sur vous-même que vos LLMs pourront se rappeler", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index 5c48448504..ed0b29e5d8 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -220,6 +220,7 @@ "Copy Link": "העתק קישור", "Copy to clipboard": "", "Copying to clipboard was successful!": "ההעתקה ללוח הייתה מוצלחת!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "יצירת מודל", @@ -345,7 +346,6 @@ "Enable Web Search": "הפיכת חיפוש באינטרנט לזמין", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.", "Enter {{role}} message here": "הזן הודעת {{role}} כאן", "Enter a detail about yourself for your LLMs to recall": "הזן פרטים על עצמך כדי שLLMs יזכור", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index bf915fcbf9..da0fec65ad 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -220,6 +220,7 @@ "Copy Link": "लिंक को कॉपी करें", "Copy to clipboard": "", "Copying to clipboard was successful!": "क्लिपबोर्ड पर कॉपी बनाना सफल रहा!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "एक मॉडल बनाएं", @@ -345,7 +346,6 @@ "Enable Web Search": "वेब खोज सक्षम करें", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।", "Enter {{role}} message here": "यहां {{role}} संदेश दर्ज करें", "Enter a detail about yourself for your LLMs to recall": "अपने एलएलएम को याद करने के लिए अपने बारे में एक विवरण दर्ज करें", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index 34a0e587ca..0b67bd982a 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopiraj vezu", "Copy to clipboard": "", "Copying to clipboard was successful!": "Kopiranje u međuspremnik je uspješno!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Izradite model", @@ -345,7 +346,6 @@ "Enable Web Search": "Omogući pretraživanje weba", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.", "Enter {{role}} message here": "Unesite {{role}} poruku ovdje", "Enter a detail about yourself for your LLMs to recall": "Unesite pojedinosti o sebi da bi učitali memoriju u LLM", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 7c7599f978..4c1e65037a 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Link másolása", "Copy to clipboard": "Másolás a vágólapra", "Copying to clipboard was successful!": "Sikeres másolás a vágólapra!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Modell létrehozása", @@ -345,7 +346,6 @@ "Enable Web Search": "Webes keresés engedélyezése", "Enabled": "Engedélyezve", "Engine": "Motor", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Győződj meg róla, hogy a CSV fájl tartalmazza ezt a 4 oszlopot ebben a sorrendben: Név, Email, Jelszó, Szerep.", "Enter {{role}} message here": "Írd ide a {{role}} üzenetet", "Enter a detail about yourself for your LLMs to recall": "Adj meg egy részletet magadról, amit az LLM-ek megjegyezhetnek", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 817d116b48..ceb963070a 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Salin Tautan", "Copy to clipboard": "", "Copying to clipboard was successful!": "Penyalinan ke papan klip berhasil!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Buat model", @@ -345,7 +346,6 @@ "Enable Web Search": "Aktifkan Pencarian Web", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Pastikan file CSV Anda menyertakan 4 kolom dengan urutan sebagai berikut: Nama, Email, Kata Sandi, Peran.", "Enter {{role}} message here": "Masukkan pesan {{role}} di sini", "Enter a detail about yourself for your LLMs to recall": "Masukkan detail tentang diri Anda untuk diingat oleh LLM Anda", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index 5005927005..514b0d043f 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Cóipeáil Nasc", "Copy to clipboard": "Cóipeáil chuig an ngearrthaisce", "Copying to clipboard was successful!": "D'éirigh le cóipeáil chuig an ngearrthaisce!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Cruthaigh", "Create a knowledge base": "Cruthaigh bonn eolais", "Create a model": "Cruthaigh múnla", @@ -345,7 +346,6 @@ "Enable Web Search": "Cumasaigh Cuardach Gréasáin", "Enabled": "Cumasaithe", "Engine": "Inneall", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Déan cinnte go bhfuil 4 cholún san ord seo i do chomhad CSV: Ainm, Ríomhphost, Pasfhocal, Ról.", "Enter {{role}} message here": "Cuir isteach teachtaireacht {{role}} anseo", "Enter a detail about yourself for your LLMs to recall": "Cuir isteach mionsonraí fút féin chun do LLManna a mheabhrú", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 647d641e33..6b9e63a491 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copia link", "Copy to clipboard": "", "Copying to clipboard was successful!": "Copia negli appunti riuscita!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Creare un modello", @@ -345,7 +346,6 @@ "Enable Web Search": "Abilita ricerca Web", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.", "Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui", "Enter a detail about yourself for your LLMs to recall": "Inserisci un dettaglio su di te per che i LLM possano ricordare", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 9edb91bd0d..3df782f418 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -220,6 +220,7 @@ "Copy Link": "リンクをコピー", "Copy to clipboard": "", "Copying to clipboard was successful!": "クリップボードへのコピーが成功しました!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "モデルを作成する", @@ -345,7 +346,6 @@ "Enable Web Search": "ウェブ検索を有効にする", "Enabled": "有効", "Engine": "エンジン", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSVファイルに4つの列が含まれていることを確認してください: Name, Email, Password, Role.", "Enter {{role}} message here": "{{role}} メッセージをここに入力してください", "Enter a detail about yourself for your LLMs to recall": "LLM が記憶するために、自分についての詳細を入力してください", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 51f71afc69..229607a4c8 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -220,6 +220,7 @@ "Copy Link": "კოპირება", "Copy to clipboard": "", "Copying to clipboard was successful!": "კლავიატურაზე კოპირება წარმატებით დასრულდა", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "შექმენით მოდელი", @@ -345,7 +346,6 @@ "Enable Web Search": "ვებ ძიების ჩართვა", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "გთხოვთ, უზრუნველყოთ, რომთქვევის CSV-ფაილი შეიცავს 4 ველი, ჩაწერილი ორივე ველი უდრის პირველი ველით.", "Enter {{role}} message here": "შეიყვანე {{role}} შეტყობინება აქ", "Enter a detail about yourself for your LLMs to recall": "შეიყვანე დეტალი ჩემთათვის, რომ ჩვენი LLMs-ს შეიძლოს აღაქვს", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 2e8c62bb80..231e108c61 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -220,6 +220,7 @@ "Copy Link": "링크 복사", "Copy to clipboard": "클립보드에 복사", "Copying to clipboard was successful!": "성공적으로 클립보드에 복사되었습니다!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "생성", "Create a knowledge base": "지식 기반 생성", "Create a model": "모델 생성", @@ -345,7 +346,6 @@ "Enable Web Search": "웹 검색 활성화", "Enabled": "활성화됨", "Engine": "엔진", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV 파일에 이름, 이메일, 비밀번호, 역할 4개의 열이 순서대로 포함되어 있는지 확인하세요.", "Enter {{role}} message here": "여기에 {{role}} 메시지 입력", "Enter a detail about yourself for your LLMs to recall": "자신에 대한 세부사항을 입력하여 LLM들이 기억할 수 있도록 하세요.", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index a7fd51ef9c..4b4cc37bfd 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopijuoti nuorodą", "Copy to clipboard": "", "Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Sukurti modelį", @@ -345,7 +346,6 @@ "Enable Web Search": "Leisti paiešką internete", "Enabled": "Leisti", "Engine": "Variklis", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Įsitikinkite, kad CSV failas turi 4 kolonas šiuo eiliškumu: Name, Email, Password, Role.", "Enter {{role}} message here": "Įveskite {{role}} žinutę čia", "Enter a detail about yourself for your LLMs to recall": "Įveskite informaciją apie save jūsų modelio atminčiai", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 8a54f5be53..4cb3b68f1a 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Salin Pautan", "Copy to clipboard": "", "Copying to clipboard was successful!": "Menyalin ke papan klip berjaya!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Cipta model", @@ -345,7 +346,6 @@ "Enable Web Search": "Benarkan Carian Web", "Enabled": "Dibenarkan", "Engine": "Enjin", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "astikan fail CSV anda mengandungi 4 lajur dalam susunan ini: Nama, E-mel, Kata Laluan, Peranan.", "Enter {{role}} message here": "Masukkan mesej {{role}} di sini", "Enter a detail about yourself for your LLMs to recall": "Masukkan butiran tentang diri anda untuk diingati oleh LLM anda", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index 9ec6ba6615..55d5f06706 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopier lenke", "Copy to clipboard": "Kopier til utklippstavle", "Copying to clipboard was successful!": "Kopiert til utklippstavlen!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Opprett", "Create a knowledge base": "Opprett en kunnskapsbase", "Create a model": "Opprett en modell", @@ -345,7 +346,6 @@ "Enable Web Search": "Aktiver websøk", "Enabled": "Aktivert", "Engine": "Motor", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at CSV-filen din inkluderer fire kolonner i denne rekkefølgen: Navn, E-post, Passord, Rolle.", "Enter {{role}} message here": "Skriv inn {{role}} melding her", "Enter a detail about yourself for your LLMs to recall": "Skriv inn en detalj om deg selv som språkmodellene dine kan huske", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 12e2029e7a..9b45e529e9 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopieer link", "Copy to clipboard": "Kopier naar klembord", "Copying to clipboard was successful!": "Kopiëren naar klembord was succesvol!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Aanmaken", "Create a knowledge base": "Maak een kennisbasis aan", "Create a model": "Een model maken", @@ -345,7 +346,6 @@ "Enable Web Search": "Zoeken op het web inschakelen", "Enabled": "Ingeschakeld", "Engine": "Engine", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Zorg ervoor dat uw CSV-bestand de volgende vier kolommen in deze volgorde bevat: Naam, E-mail, Wachtwoord, Rol.", "Enter {{role}} message here": "Voeg {{role}} bericht hier toe", "Enter a detail about yourself for your LLMs to recall": "Voer een detail over jezelf in zodat LLM's het kunnen onthouden", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index 2475bcc4ad..d48c651596 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -220,6 +220,7 @@ "Copy Link": "ਲਿੰਕ ਕਾਪੀ ਕਰੋ", "Copy to clipboard": "", "Copying to clipboard was successful!": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰਨਾ ਸਫਲ ਰਿਹਾ!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "ਇੱਕ ਮਾਡਲ ਬਣਾਓ", @@ -345,7 +346,6 @@ "Enable Web Search": "ਵੈੱਬ ਖੋਜ ਨੂੰ ਸਮਰੱਥ ਕਰੋ", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਤੁਹਾਡੀ CSV ਫਾਈਲ ਵਿੱਚ ਇਸ ਕ੍ਰਮ ਵਿੱਚ 4 ਕਾਲਮ ਹਨ: ਨਾਮ, ਈਮੇਲ, ਪਾਸਵਰਡ, ਭੂਮਿਕਾ।", "Enter {{role}} message here": "{{role}} ਸੁਨੇਹਾ ਇੱਥੇ ਦਰਜ ਕਰੋ", "Enter a detail about yourself for your LLMs to recall": "ਤੁਹਾਡੇ LLMs ਨੂੰ ਸੁਨੇਹਾ ਕਰਨ ਲਈ ਸੁਨੇਹਾ ਇੱਥੇ ਦਰਜ ਕਰੋ", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index a06fd69e73..ba739999ec 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopiuj link", "Copy to clipboard": "", "Copying to clipboard was successful!": "Kopiowanie do schowka zakończone powodzeniem!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Tworzenie modelu", @@ -345,7 +346,6 @@ "Enable Web Search": "Włączanie wyszukiwania w Internecie", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Upewnij się, że twój plik CSV zawiera 4 kolumny w następującym porządku: Nazwa, Email, Hasło, Rola.", "Enter {{role}} message here": "Wprowadź wiadomość {{role}} tutaj", "Enter a detail about yourself for your LLMs to recall": "Wprowadź szczegóły o sobie, aby LLMs mogli pamiętać", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index d85e34d030..2053b08c45 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copiar Link", "Copy to clipboard": "Copiar para a área de transferência", "Copying to clipboard was successful!": "Cópia para a área de transferência bem-sucedida!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Criar", "Create a knowledge base": "Criar uma base de conhecimento", "Create a model": "Criar um modelo", @@ -345,7 +346,6 @@ "Enable Web Search": "Ativar Pesquisa na Web", "Enabled": "Ativado", "Engine": "Motor", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Certifique-se de que seu arquivo CSV inclua 4 colunas nesta ordem: Nome, Email, Senha, Função.", "Enter {{role}} message here": "Digite a mensagem de {{role}} aqui", "Enter a detail about yourself for your LLMs to recall": "Digite um detalhe sobre você para seus LLMs lembrarem", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index d323a70f5a..3d43a5296a 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copiar link", "Copy to clipboard": "", "Copying to clipboard was successful!": "Cópia para a área de transferência bem-sucedida!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Criar um modelo", @@ -345,7 +346,6 @@ "Enable Web Search": "Ativar pesquisa na Web", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Confirme que o seu ficheiro CSV inclui 4 colunas nesta ordem: Nome, E-mail, Senha, Função.", "Enter {{role}} message here": "Escreva a mensagem de {{role}} aqui", "Enter a detail about yourself for your LLMs to recall": "Escreva um detalhe sobre você para que os seus LLMs possam lembrar-se", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 5e01a94ef2..e5a60d99d8 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Copiază Link", "Copy to clipboard": "Copiază în clipboard", "Copying to clipboard was successful!": "Copierea în clipboard a fost realizată cu succes!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Creează un model", @@ -345,7 +346,6 @@ "Enable Web Search": "Activează Căutarea pe Web", "Enabled": "Activat", "Engine": "Motor", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asigurați-vă că fișierul CSV include 4 coloane în această ordine: Nume, Email, Parolă, Rol.", "Enter {{role}} message here": "Introduceți mesajul pentru {{role}} aici", "Enter a detail about yourself for your LLMs to recall": "Introduceți un detaliu despre dvs. pe care LLM-urile să-l rețină", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 251b8eb89f..20112bf52b 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Копировать ссылку", "Copy to clipboard": "Скопировать в буфер обмена", "Copying to clipboard was successful!": "Копирование в буфер обмена прошло успешно!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Создать", "Create a knowledge base": "Создайте базу знаний", "Create a model": "Создание модели", @@ -345,7 +346,6 @@ "Enable Web Search": "Включить поиск в Интернете", "Enabled": "Включено", "Engine": "Движок", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Убедитесь, что ваш CSV-файл включает в себя 4 столбца в следующем порядке: Имя, Электронная почта, Пароль, Роль.", "Enter {{role}} message here": "Введите сообщение {{role}} здесь", "Enter a detail about yourself for your LLMs to recall": "Введите детали о себе, чтобы LLMs могли запомнить", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 129417d7be..e2e0a73b9e 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopírovať odkaz", "Copy to clipboard": "Kopírovať do schránky", "Copying to clipboard was successful!": "Kopírovanie do schránky bolo úspešné!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Vytvoriť", "Create a knowledge base": "Vytvoriť knowledge base", "Create a model": "Vytvoriť model", @@ -345,7 +346,6 @@ "Enable Web Search": "Povoliť webové vyhľadávanie", "Enabled": "Povolené", "Engine": "Engine", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Uistite sa, že váš CSV súbor obsahuje 4 stĺpce v tomto poradí: Name, Email, Password, Role.", "Enter {{role}} message here": "Zadajte správu {{role}} sem", "Enter a detail about yourself for your LLMs to recall": "Zadajte podrobnosť o sebe, ktorú si vaše LLM majú zapamätať.", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 4a2b4d307e..6abcafc2a1 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Копирај везу", "Copy to clipboard": "Копирај у оставу", "Copying to clipboard was successful!": "Успешно копирање у оставу!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Направи", "Create a knowledge base": "Направи базу знања", "Create a model": "Креирање модела", @@ -345,7 +346,6 @@ "Enable Web Search": "Омогући Wеб претрагу", "Enabled": "Омогућено", "Engine": "Мотор", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверите се да ваша CSV датотека укључује 4 колоне у овом редоследу: Име, Е-пошта, Лозинка, Улога.", "Enter {{role}} message here": "Унесите {{role}} поруку овде", "Enter a detail about yourself for your LLMs to recall": "Унесите детаље за себе да ће LLMs преузимати", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 67e4967df5..54ee85cd41 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Kopiera länk", "Copy to clipboard": "", "Copying to clipboard was successful!": "Kopiering till urklipp lyckades!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Skapa en modell", @@ -345,7 +346,6 @@ "Enable Web Search": "Aktivera webbsökning", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Se till att din CSV-fil innehåller fyra kolumner i denna ordning: Name, Email, Password, Role.", "Enter {{role}} message here": "Skriv {{role}} meddelande här", "Enter a detail about yourself for your LLMs to recall": "Skriv en detalj om dig själv för att dina LLMs ska komma ihåg", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 1fbfc17959..8562aa9e2a 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -220,6 +220,7 @@ "Copy Link": "คัดลอกลิงก์", "Copy to clipboard": "", "Copying to clipboard was successful!": "คัดลอกไปยังคลิปบอร์ดสำเร็จแล้ว!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "สร้างโมเดล", @@ -345,7 +346,6 @@ "Enable Web Search": "เปิดใช้งานการค้นหาเว็บ", "Enabled": "เปิดใช้งาน", "Engine": "เครื่องยนต์", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ตรวจสอบว่าไฟล์ CSV ของคุณมี 4 คอลัมน์ในลำดับนี้: ชื่อ, อีเมล, รหัสผ่าน, บทบาท", "Enter {{role}} message here": "ใส่ข้อความ {{role}} ที่นี่", "Enter a detail about yourself for your LLMs to recall": "ใส่รายละเอียดเกี่ยวกับตัวคุณสำหรับ LLMs ของคุณให้จดจำ", diff --git a/src/lib/i18n/locales/tk-TW/translation.json b/src/lib/i18n/locales/tk-TW/translation.json index 84c9ceba07..130c0946a6 100644 --- a/src/lib/i18n/locales/tk-TW/translation.json +++ b/src/lib/i18n/locales/tk-TW/translation.json @@ -220,6 +220,7 @@ "Copy Link": "", "Copy to clipboard": "", "Copying to clipboard was successful!": "", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "", @@ -345,7 +346,6 @@ "Enable Web Search": "", "Enabled": "", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Enter {{role}} message here": "", "Enter a detail about yourself for your LLMs to recall": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 018ae5f2da..e99adf1fc6 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Bağlantıyı Kopyala", "Copy to clipboard": "Panoya kopyala", "Copying to clipboard was successful!": "Panoya kopyalama başarılı!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Oluştur", "Create a knowledge base": "Bir bilgi tabanı oluştur", "Create a model": "Bir model oluştur", @@ -345,7 +346,6 @@ "Enable Web Search": "Web Aramasını Etkinleştir", "Enabled": "Etkin", "Engine": "Motor", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV dosyanızın şu sırayla 4 sütun içerdiğinden emin olun: İsim, E-posta, Şifre, Rol.", "Enter {{role}} message here": "Buraya {{role}} mesajını girin", "Enter a detail about yourself for your LLMs to recall": "LLM'lerinizin hatırlaması için kendiniz hakkında bir bilgi girin", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 5e15373b5f..9c9644e3b1 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Копіювати посилання", "Copy to clipboard": "Копіювати в буфер обміну", "Copying to clipboard was successful!": "Копіювання в буфер обміну виконано успішно!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "Створити", "Create a knowledge base": "Створити базу знань", "Create a model": "Створити модель", @@ -345,7 +346,6 @@ "Enable Web Search": "Увімкнути веб-пошук", "Enabled": "Увімкнено", "Engine": "Рушій", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Переконайтеся, що ваш CSV-файл містить 4 колонки в такому порядку: Ім'я, Email, Пароль, Роль.", "Enter {{role}} message here": "Введіть повідомлення {{role}} тут", "Enter a detail about yourself for your LLMs to recall": "Введіть відомості про себе для запам'ятовування вашими LLM.", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index 79ce193609..92b0f8bcba 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -220,6 +220,7 @@ "Copy Link": "لنک کاپی کریں", "Copy to clipboard": "کلپ بورڈ پر کاپی کریں", "Copying to clipboard was successful!": "کلپ بورڈ میں کاپی کامیاب ہوئی!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "ماڈل بنائیں", @@ -345,7 +346,6 @@ "Enable Web Search": "ویب تلاش فعال کریں", "Enabled": "فعال کردیا گیا ہے", "Engine": "انجن", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "یقینی بنائیں کہ آپ کی CSV فائل میں 4 کالم اس ترتیب میں شامل ہوں: نام، ای میل، پاس ورڈ، کردار", "Enter {{role}} message here": "یہاں {{کردار}} پیغام درج کریں", "Enter a detail about yourself for your LLMs to recall": "اپنی ذات کے بارے میں کوئی تفصیل درج کریں تاکہ آپ کے LLMs اسے یاد رکھ سکیں", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index ee4bfe177b..f4134c9873 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -220,6 +220,7 @@ "Copy Link": "Sao chép link", "Copy to clipboard": "", "Copying to clipboard was successful!": "Sao chép vào clipboard thành công!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "", "Create a knowledge base": "", "Create a model": "Tạo model", @@ -345,7 +346,6 @@ "Enable Web Search": "Cho phép tìm kiếm Web", "Enabled": "Đã bật", "Engine": "", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Đảm bảo tệp CSV của bạn bao gồm 4 cột theo thứ tự sau: Name, Email, Password, Role.", "Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây", "Enter a detail about yourself for your LLMs to recall": "Nhập chi tiết về bản thân của bạn để LLMs có thể nhớ", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index e48499024b..815bf3a8d2 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -220,6 +220,7 @@ "Copy Link": "复制链接", "Copy to clipboard": "复制到剪贴板", "Copying to clipboard was successful!": "成功复制到剪贴板!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "创建", "Create a knowledge base": "创建知识库", "Create a model": "创建一个模型", @@ -345,7 +346,6 @@ "Enable Web Search": "启用联网搜索", "Enabled": "启用", "Engine": "引擎", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "确保您的 CSV 文件按以下顺序包含 4 列: 姓名、电子邮箱、密码、角色。", "Enter {{role}} message here": "在此处输入 {{role}} 的对话内容", "Enter a detail about yourself for your LLMs to recall": "输入一个关于你自己的详细信息,方便你的大语言模型记住这些内容", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index eb1c4c4b57..cd0835c450 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -220,6 +220,7 @@ "Copy Link": "複製連結", "Copy to clipboard": "複製到剪貼簿", "Copying to clipboard was successful!": "成功複製到剪貼簿!", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "", "Create": "建立", "Create a knowledge base": "建立知識", "Create a model": "建立模型", @@ -345,7 +346,6 @@ "Enable Web Search": "啟用網頁搜尋", "Enabled": "已啟用", "Engine": "引擎", - "Ensure that CORS is properly configured to allow requests from Open WebUI.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "請確認您的 CSV 檔案包含以下 4 個欄位,並按照此順序排列:姓名、電子郵件、密碼、角色。", "Enter {{role}} message here": "在此輸入 {{role}} 訊息", "Enter a detail about yourself for your LLMs to recall": "輸入有關您的詳細資訊,讓您的大型語言模型可以回想起來", From 6d899b80d050ac4388b42b4f4c242bec04fe3659 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 13 Feb 2025 00:34:45 -0800 Subject: [PATCH 113/117] refac: direct connections --- backend/open_webui/main.py | 1 + backend/open_webui/socket/main.py | 8 ++++---- backend/open_webui/utils/chat.py | 4 ++++ src/routes/+layout.svelte | 3 +-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 0311e82d84..88b5b3f692 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -947,6 +947,7 @@ async def chat_completion( else {} ), } + request.state.metadata = metadata form_data["metadata"] = metadata diff --git a/backend/open_webui/socket/main.py b/backend/open_webui/socket/main.py index 3788139eaa..6f59151227 100644 --- a/backend/open_webui/socket/main.py +++ b/backend/open_webui/socket/main.py @@ -279,8 +279,8 @@ def get_event_emitter(request_info): await sio.emit( "chat-events", { - "chat_id": request_info["chat_id"], - "message_id": request_info["message_id"], + "chat_id": request_info.get("chat_id", None), + "message_id": request_info.get("message_id", None), "data": event_data, }, to=session_id, @@ -329,8 +329,8 @@ def get_event_call(request_info): response = await sio.call( "chat-events", { - "chat_id": request_info["chat_id"], - "message_id": request_info["message_id"], + "chat_id": request_info.get("chat_id", None), + "message_id": request_info.get("message_id", None), "data": event_data, }, to=request_info["session_id"], diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index 6e21d8ddb6..253eaedfb9 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -164,10 +164,14 @@ async def generate_chat_completion( if BYPASS_MODEL_ACCESS_CONTROL: bypass_filter = True + if hasattr(request.state, "metadata"): + form_data["metadata"] = request.state.metadata + if getattr(request.state, "direct", False) and hasattr(request.state, "model"): models = { request.state.model["id"]: request.state.model, } + log.debug(f"direct connection to model: {models}") else: models = request.app.state.MODELS diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index ade3171442..2431309304 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -266,8 +266,6 @@ if (directConnections) { const urlIdx = model?.urlIdx; - console.log(model, directConnections); - const OPENAI_API_URL = directConnections.OPENAI_API_BASE_URLS[urlIdx]; const OPENAI_API_KEY = directConnections.OPENAI_API_KEYS[urlIdx]; const API_CONFIG = directConnections.OPENAI_API_CONFIGS[urlIdx]; @@ -315,6 +313,7 @@ const lines = chunk.split('\n').filter((line) => line.trim() !== ''); for (const line of lines) { + console.log(line); $socket?.emit(channel, line); } } From 6acda2e6eccd161f285735f280a3aacc8e95124a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 13 Feb 2025 00:40:04 -0800 Subject: [PATCH 114/117] refac: code interpreter --- backend/open_webui/utils/middleware.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 8294c21aa6..4d70ddd65f 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -1704,10 +1704,12 @@ async def process_chat_response( "stdout": "Code interpreter engine not configured." } + log.debug(f"Code interpreter output: {output}") + if isinstance(output, dict): stdout = output.get("stdout", "") - if stdout: + if isinstance(stdout, str): stdoutLines = stdout.split("\n") for idx, line in enumerate(stdoutLines): if "data:image/png;base64" in line: @@ -1739,7 +1741,7 @@ async def process_chat_response( result = output.get("result", "") - if result: + if isinstance(result, str): resultLines = result.split("\n") for idx, line in enumerate(resultLines): if "data:image/png;base64" in line: @@ -1789,6 +1791,8 @@ async def process_chat_response( } ) + print(content_blocks, serialize_content_blocks(content_blocks)) + try: res = await generate_chat_completion( request, From acb3eef6195e49326ffc219d75379db4c430ca3b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 13 Feb 2025 01:57:02 -0800 Subject: [PATCH 115/117] refac --- backend/open_webui/routers/tasks.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/open_webui/routers/tasks.py b/backend/open_webui/routers/tasks.py index 3fcca0e07b..91ec8e9723 100644 --- a/backend/open_webui/routers/tasks.py +++ b/backend/open_webui/routers/tasks.py @@ -203,7 +203,7 @@ async def generate_title( } ), "metadata": { - **(request.state.metadata if request.state.metadata else {}), + **(request.state.metadata if hasattr(request.state, "metadata") else {}), "task": str(TASKS.TITLE_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -272,7 +272,7 @@ async def generate_chat_tags( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { - **(request.state.metadata if request.state.metadata else {}), + **(request.state.metadata if hasattr(request.state, "metadata") else {}), "task": str(TASKS.TAGS_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -338,7 +338,7 @@ async def generate_image_prompt( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { - **(request.state.metadata if request.state.metadata else {}), + **(request.state.metadata if hasattr(request.state, "metadata") else {}), "task": str(TASKS.IMAGE_PROMPT_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -415,7 +415,7 @@ async def generate_queries( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { - **(request.state.metadata if request.state.metadata else {}), + **(request.state.metadata if hasattr(request.state, "metadata") else {}), "task": str(TASKS.QUERY_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -496,7 +496,7 @@ async def generate_autocompletion( "messages": [{"role": "user", "content": content}], "stream": False, "metadata": { - **(request.state.metadata if request.state.metadata else {}), + **(request.state.metadata if hasattr(request.state, "metadata") else {}), "task": str(TASKS.AUTOCOMPLETE_GENERATION), "task_body": form_data, "chat_id": form_data.get("chat_id", None), @@ -567,7 +567,7 @@ async def generate_emoji( ), "chat_id": form_data.get("chat_id", None), "metadata": { - **(request.state.metadata if request.state.metadata else {}), + **(request.state.metadata if hasattr(request.state, "metadata") else {}), "task": str(TASKS.EMOJI_GENERATION), "task_body": form_data, }, @@ -626,7 +626,7 @@ async def generate_moa_response( "messages": [{"role": "user", "content": content}], "stream": form_data.get("stream", False), "metadata": { - **(request.state.metadata if request.state.metadata else {}), + **(request.state.metadata if hasattr(request.state, "metadata") else {}), "chat_id": form_data.get("chat_id", None), "task": str(TASKS.MOA_RESPONSE_GENERATION), "task_body": form_data, From f8311047087110e6202fda67fc648f2d954df0ab Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 13 Feb 2025 02:03:13 -0800 Subject: [PATCH 116/117] doc: changelog --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bad83dc1ef..126f14e006 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,34 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.11] - 2025-02-13 + +### Added + +- **🎤 Kokoro-JS TTS Support**: A new on-device, high-quality text-to-speech engine has been integrated, vastly improving voice generation quality—everything runs directly in your browser. +- **🐍 Jupyter Notebook Support in Code Interpreter**: Now, you can configure Code Interpreter to run Python code not only via Pyodide but also through Jupyter, offering a more robust coding environment for AI-driven computations and analysis. +- **🔗 Direct API Connections for Private & Local Inference**: You can now connect Open WebUI to your private or localhost API inference endpoints. CORS must be enabled, but this unlocks direct, on-device AI infrastructure support. +- **🔍 Advanced Domain Filtering for Web Search**: You can now specify which domains should be included or excluded from web searches, refining results for more relevant information retrieval. +- **🚀 Improved Image Generation Metadata Handling**: Generated images now retain metadata for better organization and future retrieval. +- **📂 S3 Key Prefix Support**: Fine-grained control over S3 storage file structuring with configurable key prefixes. +- **📸 Support for Image-Only Messages**: Send messages containing only images, facilitating more visual-centric interactions. +- **🌍 Updated Translations**: German, Spanish, Traditional Chinese, and Catalan translations updated for better multilingual support. + +### Fixed + +- **🔧 OAuth Debug Logs & Username Claim Fixes**: Debug logs have been added for OAuth role and group management, with fixes ensuring proper OAuth username retrieval and claim handling. +- **📌 Citations Formatting & Toggle Fixes**: Inline citation toggles now function correctly, and citations with more than three sources are now fully visible when expanded. +- **📸 ComfyUI Maximum Seed Value Constraint Fixed**: The maximum allowed seed value for ComfyUI has been corrected, preventing unintended behavior. +- **🔑 Connection Settings Stability**: Addressed connection settings issues that were causing instability when saving configurations. +- **📂 GGUF Model Upload Stability**: Fixed upload inconsistencies for GGUF models, ensuring reliable local model handling. +- **🔧 Web Search Configuration Bug**: Fixed issues where web search filters and settings weren't correctly applied. +- **💾 User Settings Persistence Fix**: Ensured user-specific settings are correctly saved and applied across sessions. +- **🔄 OpenID Username Retrieval Enhancement**: Usernames are now correctly picked up and assigned for OpenID Connect (OIDC) logins. + +### Changed + +- **🔗 Improved Direct Connections Integration**: Simplified the configuration process for setting up direct API connections, making it easier to integrate custom inference endpoints. + ## [0.5.10] - 2025-02-05 ### Fixed From 57e256be3ee43c3158c49a7b6b7e54d35dcecc67 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 13 Feb 2025 02:05:26 -0800 Subject: [PATCH 117/117] chore: bump --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 30a0626d57..f4261ba82a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ dependencies = [ "chromadb==0.6.2", "pymilvus==2.5.0", "qdrant-client~=1.12.0", - "opensearch-py==2.7.1", + "opensearch-py==2.8.0", "transformers", "sentence-transformers==3.3.1",